From patchwork Tue Jun 2 05:21:10 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vaibhav Agarwal X-Patchwork-Id: 192526 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.5 required=3.0 tests=DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED,DKIM_VALID,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH, MAILING_LIST_MULTI, SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 889C1C433E0 for ; Tue, 2 Jun 2020 13:13:20 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 11E8D20674 for ; Tue, 2 Jun 2020 13:13:20 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=alsa-project.org header.i=@alsa-project.org header.b="EOq72D3D"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="gpJmF9im" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 11E8D20674 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 8BE201672; Tue, 2 Jun 2020 15:12:28 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 8BE201672 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1591103598; bh=oNkKmQoRMafXyLXgfjIBEylkxzqM38zE5g7GYWKUE/w=; h=From:To:Subject:Date:In-Reply-To:References:Cc:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=EOq72D3DBuINEnIAvVGrQofKbelQfa0nUOf+bjlroxq+hLn06ZJqVYHe1w8FVSHD/ CICSLBFjsVH77d6hGjzzhX5j2RVBjcZ9iqN/HYAlvbY+SsGjRisILLuTyLzdaWDStS uqYoNf6X/hmTpRy0aLJlyEZ3CJcY1BGyj1KyrGyc= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id AB2E5F800BC; Tue, 2 Jun 2020 15:10:49 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id AB075F8026F; Tue, 2 Jun 2020 07:21:53 +0200 (CEST) Received: from mail-pl1-x643.google.com (mail-pl1-x643.google.com [IPv6:2607:f8b0:4864:20::643]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id A3D04F8013D for ; Tue, 2 Jun 2020 07:21:48 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz A3D04F8013D Authentication-Results: alsa1.perex.cz; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="gpJmF9im" Received: by mail-pl1-x643.google.com with SMTP id y18so881906plr.4 for ; Mon, 01 Jun 2020 22:21:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=HrE8jPu+eUk0rWTp09/AJ6eqmFiFFAxiAwX4LTYEZSI=; b=gpJmF9imy7EwPbtaigUBNEagjOGDTHD7fGkw4xKgjzwdrEDC95Xhb57T5uX5Cv2MYb EsIlOcMB0m4Sl/Y/j17qCRyftShvGybRddCKlD2EKGmKcig/PPIjsUbJBBHmfOgb/y14 aLp8xW4F4acHz4tcakZ98Jo6bh1vl22/wf0uBDJuL+3cSJfwezXm8oDsD3PeVIMhYn/U FJ6yTQJaB5SVCNWXe2aJQ8peooqMUZTIqZlOyv/c1j/lxVpFseme/3udPj/dwPKEDXPf QqsX8S8kYLK9v1SQXu8zvztocBOWKIPVDLksgkkUCYlcANLGjmGplT/D5QRxqgY2TXVY PUMg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=HrE8jPu+eUk0rWTp09/AJ6eqmFiFFAxiAwX4LTYEZSI=; b=l72/PoWBKxrdJ3FL+Pz0fscpA5O33ECqHQjjXsoLTur0LjK+UJzS5487Q/9rBqOi6T liM2xFmjqjJHlAYfVPVEq3TzrSc2OPnRNz+2RCDWeSRp48fGTe/iBP715RPl1uh/XU76 g6KVJDwafQTbKrfai74t+JR3EHBbZSlvIzudkQitxGCutfwmRJAfDYCYkyqzSsvirk1L AACIzW6LwBOCR5MNpNzX04Fjkd5+v+plCfk96IGOWVPkHdtJhpWAr8tuwZKkHMiO5TkM rvSKmS0Pu0+7uqbu1Atop6t2zh9bvsRQJ1AzSQexWpuNWG/8mnRf7fx+OFxt/q7I7WwK aCFA== X-Gm-Message-State: AOAM531PkgS56OlwlvavlDB/5lrsXksi0zUiT1Vhuoolb640ORru4Rih ccyMzjmnZeOzmQbABQbjhMc= X-Google-Smtp-Source: ABdhPJwliQkS5O5QAObRlb1MPyWfpR5B70bSXSCGtCR9PUV8lwzDthFzWXZlc9YWILqypdxgX7VFnQ== X-Received: by 2002:a17:90a:20a2:: with SMTP id f31mr318401pjg.34.1591075306770; Mon, 01 Jun 2020 22:21:46 -0700 (PDT) Received: from cvds-vagarw7.iind.intel.com ([192.55.55.41]) by smtp.googlemail.com with ESMTPSA id f18sm1004764pga.75.2020.06.01.22.21.36 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 01 Jun 2020 22:21:46 -0700 (PDT) From: Vaibhav Agarwal To: Greg Kroah-Hartman , Alex Elder , Johan Hovold , Mark Greer , Takashi Iwai , Jaroslav Kysela , Mark Brown , Liam Girdwood Subject: [RESEND PATCH v1 1/6] staging: greybus: audio: Update snd_jack FW usage as per new APIs Date: Tue, 2 Jun 2020 10:51:10 +0530 Message-Id: <1ee2783b64c68e49880f88457655648ac45bbcb8.1591040859.git.vaibhav.sr@gmail.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: References: MIME-Version: 1.0 X-Mailman-Approved-At: Tue, 02 Jun 2020 15:10:43 +0200 Cc: devel@driverdev.osuosl.org, alsa-devel@alsa-project.org, Alexandre Belloni , Vaibhav Agarwal , linux-kernel@vger.kernel.org, greybus-dev@lists.linaro.org X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: "Alsa-devel mailing list for ALSA developers - http://www.alsa-project.org" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" snd_soc_jack APIs are modified in recent kernel versions. This patch updates the codec driver to resolve the compilation errors related to jack framework. Signed-off-by: Vaibhav Agarwal --- drivers/staging/greybus/audio_codec.c | 59 +++++++++++++++++++++------ 1 file changed, 47 insertions(+), 12 deletions(-) diff --git a/drivers/staging/greybus/audio_codec.c b/drivers/staging/greybus/audio_codec.c index 08746c85dea6..ebf8484f0ae7 100644 --- a/drivers/staging/greybus/audio_codec.c +++ b/drivers/staging/greybus/audio_codec.c @@ -709,17 +709,29 @@ static struct snd_soc_dai_driver gbaudio_dai[] = { }; static int gbaudio_init_jack(struct gbaudio_module_info *module, - struct snd_soc_codec *codec) + struct snd_soc_card *card) { int ret; + struct snd_soc_jack *jack; + struct snd_soc_jack_pin *headset, *button; + if (!module->jack_mask) return 0; snprintf(module->jack_name, NAME_SIZE, "GB %d Headset Jack", module->dev_id); - ret = snd_soc_jack_new(codec, module->jack_name, module->jack_mask, - &module->headset_jack); + + headset = devm_kzalloc(module->dev, sizeof(*headset), GFP_KERNEL); + if (!headset) + return -ENOMEM; + + headset->pin = module->jack_name; + headset->mask = module->jack_mask; + jack = &module->headset_jack; + + ret = snd_soc_card_jack_new(card, module->jack_name, module->jack_mask, + jack, headset, 1); if (ret) { dev_err(module->dev, "Failed to create new jack\n"); return ret; @@ -730,11 +742,21 @@ static int gbaudio_init_jack(struct gbaudio_module_info *module, snprintf(module->button_name, NAME_SIZE, "GB %d Button Jack", module->dev_id); - ret = snd_soc_jack_new(codec, module->button_name, module->button_mask, - &module->button_jack); + button = devm_kzalloc(module->dev, sizeof(*headset), GFP_KERNEL); + if (!button) { + ret = -ENOMEM; + goto free_headset; + } + + button->pin = module->button_name; + button->mask = module->button_mask; + jack = &module->button_jack; + + ret = snd_soc_card_jack_new(card, module->button_name, + module->button_mask, jack, button, 1); if (ret) { dev_err(module->dev, "Failed to create button jack\n"); - return ret; + goto free_headset; } /* @@ -750,7 +772,7 @@ static int gbaudio_init_jack(struct gbaudio_module_info *module, KEY_MEDIA); if (ret) { dev_err(module->dev, "Failed to set BTN_0\n"); - return ret; + goto free_button; } } @@ -759,7 +781,7 @@ static int gbaudio_init_jack(struct gbaudio_module_info *module, KEY_VOICECOMMAND); if (ret) { dev_err(module->dev, "Failed to set BTN_1\n"); - return ret; + goto free_button; } } @@ -768,7 +790,7 @@ static int gbaudio_init_jack(struct gbaudio_module_info *module, KEY_VOLUMEUP); if (ret) { dev_err(module->dev, "Failed to set BTN_2\n"); - return ret; + goto free_button; } } @@ -777,7 +799,7 @@ static int gbaudio_init_jack(struct gbaudio_module_info *module, KEY_VOLUMEDOWN); if (ret) { dev_err(module->dev, "Failed to set BTN_0\n"); - return ret; + goto free_button; } } @@ -788,6 +810,18 @@ static int gbaudio_init_jack(struct gbaudio_module_info *module, */ return 0; + +free_button: + jack = &module->button_jack; + snd_device_free(card->snd_card, jack->jack); + list_del(&jack->list); + +free_headset: + jack = &module->headset_jack; + snd_device_free(card->snd_card, jack->jack); + list_del(&jack->list); + + return ret; } int gbaudio_register_module(struct gbaudio_module_info *module) @@ -815,7 +849,7 @@ int gbaudio_register_module(struct gbaudio_module_info *module) return -EINVAL; } - ret = gbaudio_init_jack(module, codec); + ret = gbaudio_init_jack(module, component->card); if (ret) { up_write(&card->controls_rwsem); return ret; @@ -942,7 +976,8 @@ void gbaudio_unregister_module(struct gbaudio_module_info *module) #ifdef CONFIG_SND_JACK /* free jack devices for this module from codec->jack_list */ - list_for_each_entry_safe(jack, next_j, &codec->jack_list, list) { + list_for_each_entry_safe(jack, next_j, &component->card->jack_list, + list) { if (jack == &module->headset_jack) mask = GBCODEC_JACK_MASK; else if (jack == &module->button_jack) From patchwork Tue Jun 2 05:21:12 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vaibhav Agarwal X-Patchwork-Id: 192525 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.7 required=3.0 tests=DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED,DKIM_VALID,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH, MAILING_LIST_MULTI, SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,UNWANTED_LANGUAGE_BODY,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4C712C433DF for ; Tue, 2 Jun 2020 13:14:13 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id CB84820772 for ; Tue, 2 Jun 2020 13:14:12 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=alsa-project.org header.i=@alsa-project.org header.b="o4wZgmiO"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="RDraMH30" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org CB84820772 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 55A05167D; Tue, 2 Jun 2020 15:13:21 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 55A05167D DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1591103651; bh=iK6Osqi8V523oW6+nrqGdiF7V5Xj/PNZDFIWSoON0Js=; h=From:To:Subject:Date:In-Reply-To:References:Cc:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=o4wZgmiOpO08uLYMs9giuNam9woNiIqRXnhCr11AwNuCrU+B1JBQkbJBX+yYP6wjo VT8jEwvxz40O5UBjTG+Zuu0sZlFSAMhpitNWV0V/efXQTvO03GVFd9IcuO5QMrFBXP nsDfBzxd/S4OrN4k4+50JYId32/DfEQPE3AHNvq8= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id CFB78F802A2; Tue, 2 Jun 2020 15:10:52 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 5E0EEF8026F; Tue, 2 Jun 2020 07:22:14 +0200 (CEST) Received: from mail-pf1-x444.google.com (mail-pf1-x444.google.com [IPv6:2607:f8b0:4864:20::444]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id E434CF8013D for ; Tue, 2 Jun 2020 07:22:10 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz E434CF8013D Authentication-Results: alsa1.perex.cz; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="RDraMH30" Received: by mail-pf1-x444.google.com with SMTP id g5so4521596pfm.10 for ; Mon, 01 Jun 2020 22:22:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=vNsKmmB6p1tfdU7zTWPdb8wo/2MffnecSlCatI5vkbg=; b=RDraMH30nC29+uT6hzsJ/0DwMSPkOi1rE+F4NWa1AFzMczSAPS+yhL7edExmccmROy HijBXSadgaazxQZfti2gSL8mRaRwCO0kccwvOpTGZ9J6Sxupa0QPrGQntl2XO5K1W6zQ ocx4nQt6d1k8W7Y/uby85xxki1rDc8YPEQEJpwrNg7R5t+zMq2bOSbFSLp1aS5mY4blH WVcwRf1eOaLJ8ztxJyLJbAQy1cPQM4NISeUV2W40R916FpXDh+uL76+zubratp3J9jlp 3z4up/uhpw+qzf2Ya31tN4oWev/xjhJ5IzzZv2PN6tjAA/1shKbc9+AjV/uATSnNx09c 5KLw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=vNsKmmB6p1tfdU7zTWPdb8wo/2MffnecSlCatI5vkbg=; b=PPYwK7p1EaQTmJeYttVsflvmOBPbIMLJoGQTXmMoVbsifeuM/10HNZlO1K7bjJPF7+ vd9z/Bj9LGd6L40MreCUCdShr//pSeJ+P7/i88S7YjzVv95tLuiYKIY/RrMwz62I2skr 4GX/PLVtWJP/XSVprT1wvu+Y+K5L3wakZitGioI+4I0U22wckn4ZBKZs3157eStaB7fd U6aC6HFoMX4NWev7wXyMbUPcL7bJupm0FLXit4AlWVqk6nv/ijAo9vvrLKKu+pBJfUPB u0jKzG2bnfQ2oe1GU1xZRIE5w2nMUtgWeCXgpXIem2319s0LLXeglX3rT01Zzc87tcdt t21w== X-Gm-Message-State: AOAM532YK9KOl4FxT8dZQZ6GQdpHePd0GZPgFj7d9Oyq8P3RW4v1d2nc 0wY9gQL2oPmfwUtdu0fCEmo= X-Google-Smtp-Source: ABdhPJxNcD8zIlq1x9AQWYJLXmUl8Hnv+aGzA7IRx/CMZ//Yq1kr8o7lNvk17ElQvyhm3elFIVX7hA== X-Received: by 2002:a62:79d2:: with SMTP id u201mr11903073pfc.324.1591075328731; Mon, 01 Jun 2020 22:22:08 -0700 (PDT) Received: from cvds-vagarw7.iind.intel.com ([192.55.55.41]) by smtp.googlemail.com with ESMTPSA id f18sm1004764pga.75.2020.06.01.22.21.58 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 01 Jun 2020 22:22:07 -0700 (PDT) From: Vaibhav Agarwal To: Greg Kroah-Hartman , Alex Elder , Johan Hovold , Mark Greer , Takashi Iwai , Jaroslav Kysela , Mark Brown , Liam Girdwood Subject: [RESEND PATCH v1 3/6] staging: greybus: audio: Resolve compilation errors for GB codec module Date: Tue, 2 Jun 2020 10:51:12 +0530 Message-Id: X-Mailer: git-send-email 2.26.2 In-Reply-To: References: MIME-Version: 1.0 X-Mailman-Approved-At: Tue, 02 Jun 2020 15:10:43 +0200 Cc: devel@driverdev.osuosl.org, alsa-devel@alsa-project.org, Alexandre Belloni , Vaibhav Agarwal , linux-kernel@vger.kernel.org, greybus-dev@lists.linaro.org X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: "Alsa-devel mailing list for ALSA developers - http://www.alsa-project.org" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" Due to dependencies on ASoC framework changes, GB dummy codec module compilation is currently disabled. This patch updates codec driver as per the latest ASoC APIs. Signed-off-by: Vaibhav Agarwal --- drivers/staging/greybus/audio_codec.c | 87 +++++++++++++-------------- drivers/staging/greybus/audio_codec.h | 2 +- 2 files changed, 44 insertions(+), 45 deletions(-) diff --git a/drivers/staging/greybus/audio_codec.c b/drivers/staging/greybus/audio_codec.c index a2ee587e5a79..bbd072acda5c 100644 --- a/drivers/staging/greybus/audio_codec.c +++ b/drivers/staging/greybus/audio_codec.c @@ -832,7 +832,7 @@ static int gbaudio_init_jack(struct gbaudio_module_info *module, int gbaudio_register_module(struct gbaudio_module_info *module) { int ret; - struct snd_soc_codec *codec; + struct snd_soc_component *component; struct snd_card *card; struct gbaudio_jack *gba_jack = NULL; struct snd_soc_jack *jack = NULL; @@ -842,8 +842,8 @@ int gbaudio_register_module(struct gbaudio_module_info *module) return -EAGAIN; } - codec = gbcodec->codec; - card = codec->card->snd_card; + component = gbcodec->component; + card = component->card->snd_card; down_write(&card->controls_rwsem); @@ -862,19 +862,20 @@ int gbaudio_register_module(struct gbaudio_module_info *module) } if (module->dapm_widgets) - snd_soc_dapm_new_controls(&codec->dapm, module->dapm_widgets, + snd_soc_dapm_new_controls(&component->dapm, + module->dapm_widgets, module->num_dapm_widgets); if (module->controls) - snd_soc_add_codec_controls(codec, module->controls, - module->num_controls); + snd_soc_add_component_controls(component, module->controls, + module->num_controls); if (module->dapm_routes) - snd_soc_dapm_add_routes(&codec->dapm, module->dapm_routes, + snd_soc_dapm_add_routes(&component->dapm, module->dapm_routes, module->num_dapm_routes); /* card already instantiated, create widgets here only */ - if (codec->card->instantiated) { - snd_soc_dapm_link_component_dai_widgets(codec->card, - &codec->dapm); + if (component->card->instantiated) { + snd_soc_dapm_link_component_dai_widgets(component->card, + &component->dapm); #ifdef CONFIG_SND_JACK /* * register jack devices for this module @@ -882,7 +883,7 @@ int gbaudio_register_module(struct gbaudio_module_info *module) */ list_for_each_entry(gba_jack, &module->jack_list, list) { jack = &gba_jack->jack; - snd_device_register(codec->card->snd_card, + snd_device_register(component->card->snd_card, jack->jack); } #endif @@ -892,9 +893,9 @@ int gbaudio_register_module(struct gbaudio_module_info *module) list_add(&module->list, &gbcodec->module_list); mutex_unlock(&gbcodec->lock); - if (codec->card->instantiated) - ret = snd_soc_dapm_new_widgets(&codec->dapm); - dev_dbg(codec->dev, "Registered %s module\n", module->name); + if (component->card->instantiated) + ret = snd_soc_dapm_new_widgets(component->card); + dev_dbg(component->dev, "Registered %s module\n", module->name); up_write(&card->controls_rwsem); return ret; @@ -965,19 +966,19 @@ static void gbaudio_codec_cleanup(struct gbaudio_module_info *module) void gbaudio_unregister_module(struct gbaudio_module_info *module) { - struct snd_soc_codec *codec = gbcodec->codec; - struct snd_card *card = codec->card->snd_card; + struct snd_soc_component *component = gbcodec->component; + struct snd_card *card = component->card->snd_card; struct gbaudio_jack *gba_jack, *n; struct snd_soc_jack *jack; int mask; - dev_dbg(codec->dev, "Unregister %s module\n", module->name); + dev_dbg(component->dev, "Unregister %s module\n", module->name); down_write(&card->controls_rwsem); mutex_lock(&gbcodec->lock); gbaudio_codec_cleanup(module); list_del(&module->list); - dev_dbg(codec->dev, "Process Unregister %s module\n", module->name); + dev_dbg(component->dev, "Process Unregister %s module\n", module->name); mutex_unlock(&gbcodec->lock); #ifdef CONFIG_SND_JACK @@ -994,99 +995,97 @@ void gbaudio_unregister_module(struct gbaudio_module_info *module) dev_dbg(module->dev, "Report %s removal\n", jack->jack->id); snd_soc_jack_report(jack, 0, mask); - snd_device_free(codec->card->snd_card, jack->jack); + snd_device_free(component->card->snd_card, jack->jack); list_del(&gba_jack->list); } } #endif if (module->dapm_routes) { - dev_dbg(codec->dev, "Removing %d routes\n", + dev_dbg(component->dev, "Removing %d routes\n", module->num_dapm_routes); - snd_soc_dapm_del_routes(&codec->dapm, module->dapm_routes, + snd_soc_dapm_del_routes(&component->dapm, module->dapm_routes, module->num_dapm_routes); } if (module->controls) { - dev_dbg(codec->dev, "Removing %d controls\n", + dev_dbg(component->dev, "Removing %d controls\n", module->num_controls); - snd_soc_remove_codec_controls(codec, module->controls, + snd_soc_remove_codec_controls(component, module->controls, module->num_controls); } if (module->dapm_widgets) { - dev_dbg(codec->dev, "Removing %d widgets\n", + dev_dbg(component->dev, "Removing %d widgets\n", module->num_dapm_widgets); - snd_soc_dapm_free_controls(&codec->dapm, module->dapm_widgets, + snd_soc_dapm_free_controls(&component->dapm, + module->dapm_widgets, module->num_dapm_widgets); } - dev_dbg(codec->dev, "Unregistered %s module\n", module->name); + dev_dbg(component->dev, "Unregistered %s module\n", module->name); up_write(&card->controls_rwsem); } EXPORT_SYMBOL(gbaudio_unregister_module); /* - * codec driver ops + * component driver ops */ -static int gbcodec_probe(struct snd_soc_codec *codec) +static int gbcodec_probe(struct snd_soc_component *component) { int i; struct gbaudio_codec_info *info; struct gbaudio_codec_dai *dai; - info = devm_kzalloc(codec->dev, sizeof(*info), GFP_KERNEL); + info = devm_kzalloc(component->dev, sizeof(*info), GFP_KERNEL); if (!info) return -ENOMEM; - info->dev = codec->dev; + info->dev = component->dev; INIT_LIST_HEAD(&info->module_list); mutex_init(&info->lock); INIT_LIST_HEAD(&info->dai_list); /* init dai_list used to maintain runtime stream info */ for (i = 0; i < ARRAY_SIZE(gbaudio_dai); i++) { - dai = devm_kzalloc(codec->dev, sizeof(*dai), GFP_KERNEL); + dai = devm_kzalloc(component->dev, sizeof(*dai), GFP_KERNEL); if (!dai) return -ENOMEM; dai->id = gbaudio_dai[i].id; list_add(&dai->list, &info->dai_list); } - info->codec = codec; - snd_soc_codec_set_drvdata(codec, info); + info->component = component; + snd_soc_component_set_drvdata(component, info); gbcodec = info; - device_init_wakeup(codec->dev, 1); + device_init_wakeup(component->dev, 1); return 0; } -static int gbcodec_remove(struct snd_soc_codec *codec) +static void gbcodec_remove(struct snd_soc_component *component) { /* Empty function for now */ - return 0; + return; } -static int gbcodec_write(struct snd_soc_codec *codec, unsigned int reg, +static int gbcodec_write(struct snd_soc_component *component, unsigned int reg, unsigned int value) { return 0; } -static unsigned int gbcodec_read(struct snd_soc_codec *codec, +static unsigned int gbcodec_read(struct snd_soc_component *component, unsigned int reg) { return 0; } -static struct snd_soc_codec_driver soc_codec_dev_gbaudio = { +static const struct snd_soc_component_driver soc_codec_dev_gbaudio = { .probe = gbcodec_probe, .remove = gbcodec_remove, .read = gbcodec_read, .write = gbcodec_write, - - .idle_bias_off = true, - .ignore_pmdown_time = 1, }; #ifdef CONFIG_PM @@ -1110,13 +1109,13 @@ static const struct dev_pm_ops gbaudio_codec_pm_ops = { static int gbaudio_codec_probe(struct platform_device *pdev) { - return snd_soc_register_codec(&pdev->dev, &soc_codec_dev_gbaudio, + return devm_snd_soc_register_component(&pdev->dev, + &soc_codec_dev_gbaudio, gbaudio_dai, ARRAY_SIZE(gbaudio_dai)); } static int gbaudio_codec_remove(struct platform_device *pdev) { - snd_soc_unregister_codec(&pdev->dev); return 0; } diff --git a/drivers/staging/greybus/audio_codec.h b/drivers/staging/greybus/audio_codec.h index af9195eceb3a..ce15e800e607 100644 --- a/drivers/staging/greybus/audio_codec.h +++ b/drivers/staging/greybus/audio_codec.h @@ -66,7 +66,7 @@ struct gbaudio_codec_dai { struct gbaudio_codec_info { struct device *dev; - struct snd_soc_codec *codec; + struct snd_soc_component *component; struct list_head module_list; /* to maintain runtime stream params for each DAI */ struct list_head dai_list; From patchwork Tue Jun 2 05:21:14 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vaibhav Agarwal X-Patchwork-Id: 192524 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.5 required=3.0 tests=DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED,DKIM_VALID,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH, MAILING_LIST_MULTI, SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E9682C433DF for ; Tue, 2 Jun 2020 13:15:29 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 742B720674 for ; Tue, 2 Jun 2020 13:15:29 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=alsa-project.org header.i=@alsa-project.org header.b="d7DJwAeV"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="RGaaFj0f" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 742B720674 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 15155168C; Tue, 2 Jun 2020 15:14:38 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 15155168C DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1591103728; bh=oo2IJU1fru3LygffV9oJzCKnV8pOUhCqcaRYO8068t8=; h=From:To:Subject:Date:In-Reply-To:References:Cc:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=d7DJwAeVENWZQ03XSVJtJI4BHK8fBB6rH7hZ2BPIyRg8i+2Zx7nMoKNY60YsDUGn3 L9KMG0lBat/T/hkEu/7H4f5A7eAJzfVCHLz63mtWYtebhYhNAefCVZ0ALEG41FKOEZ J8PP7puj9aZpb2QCsGMxjC+6BQBUcvyhqN97um4M= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id B9243F802C4; Tue, 2 Jun 2020 15:10:55 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 5BDE0F8026F; Tue, 2 Jun 2020 07:22:36 +0200 (CEST) Received: from mail-pl1-x643.google.com (mail-pl1-x643.google.com [IPv6:2607:f8b0:4864:20::643]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id C62ACF800B8 for ; Tue, 2 Jun 2020 07:22:32 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz C62ACF800B8 Authentication-Results: alsa1.perex.cz; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="RGaaFj0f" Received: by mail-pl1-x643.google.com with SMTP id n2so858610pld.13 for ; Mon, 01 Jun 2020 22:22:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=cdsTla5NmX/8P5iE6VvBk0hZd39sy9358Y1bN31hsbc=; b=RGaaFj0fzD7xatRLPSaerrxb8rb16z8awh9rlm6Wd6SUIQ4K3gQrCc65bVMeeiKhRO oakwF1sTZhKXTHp++xzRtoiEem7kxx7BtSkImKivL5ElEArCpp4n/IMinXnJyllGKlKH KxPdYX4WDF2zCRqFjrrRyH/98jyeE6j1DV3GP/Exfo4FGBL/kfAkqg6x87RCLv9smU1O YHQjrHtWT5xwyLAvYVeSTBJT5uKHLPC9jHPc7+8/9UQ/85TqiQK9inO0krRlpBagBc2T A9xp+3gQzDuty6iSi9jTQO4tWQBirWwkxfRyNvTAPyR4VatRsu3MNyjv3I+lbKvDfihE +uAg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=cdsTla5NmX/8P5iE6VvBk0hZd39sy9358Y1bN31hsbc=; b=m0ZSjCmcNxwm00f7/A+pgWwMvyhPWRxBDkMCNPmS+Foyh2R5WtVbGkQrz3jWzKcA9m zgc6jGnQpGRA3tTYU0Wmjd/9KK8Y4FuYRSyvXkwt9g39SEkuwAicgIS/273Et8RNZlE7 zSmKoqqAR0fwC844A001iMbnMg6bxv4MnJQcAuKa98aFfNvsBHh5xxM7DanYLPY7BUWF xJ6GfegPoKiLKtxmXwD0yFeY79j8lKs/W02ESKzs7UUn4n4yJme6jkXaAD7jnlCCqyYA 0pBnhwdNpKzbXeYzdqWD+++MdTT7dM1qsVqFPPuhIRNisQV/do3fCQuIt68m+2PYzi2z 62vw== X-Gm-Message-State: AOAM532/Nw+dXpZIJ34AvshCp4Iip0cZEi4gzhb/J9p1rMImDZj7Su8p PhPg77KnA8wtaflXajRYZ8CBulz22CRxrMj9 X-Google-Smtp-Source: ABdhPJwDE8d/ZRpzNecvDr7OlzeXWIYhuyu5j9uBxuT2r/WF7QSVxe+JeALsvaIRC4fTrhRDhra98A== X-Received: by 2002:a17:90b:f0e:: with SMTP id br14mr3283764pjb.78.1591075351126; Mon, 01 Jun 2020 22:22:31 -0700 (PDT) Received: from cvds-vagarw7.iind.intel.com ([192.55.55.41]) by smtp.googlemail.com with ESMTPSA id f18sm1004764pga.75.2020.06.01.22.22.20 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 01 Jun 2020 22:22:29 -0700 (PDT) From: Vaibhav Agarwal To: Greg Kroah-Hartman , Alex Elder , Johan Hovold , Mark Greer , Takashi Iwai , Jaroslav Kysela , Mark Brown , Liam Girdwood Subject: [RESEND PATCH v1 5/6] staging: greybus: audio: Add helper APIs for dynamic audio modules Date: Tue, 2 Jun 2020 10:51:14 +0530 Message-Id: X-Mailer: git-send-email 2.26.2 In-Reply-To: References: MIME-Version: 1.0 X-Mailman-Approved-At: Tue, 02 Jun 2020 15:10:44 +0200 Cc: devel@driverdev.osuosl.org, alsa-devel@alsa-project.org, Alexandre Belloni , Vaibhav Agarwal , linux-kernel@vger.kernel.org, greybus-dev@lists.linaro.org X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: "Alsa-devel mailing list for ALSA developers - http://www.alsa-project.org" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" Greybus Codec driver allows modules to be dynamically added and removed, which further requires updating the DAPM configurations as well. With current snd_soc architecture, dynamic audio modules is not yet supported. This patch provides helper APIs to update DAPM configurations in response to modules which are dynamically added or removed. The source is primarily based on snd_dapm.c Signed-off-by: Vaibhav Agarwal --- drivers/staging/greybus/Makefile | 2 +- drivers/staging/greybus/audio_codec.c | 13 +- drivers/staging/greybus/audio_helper.c | 197 +++++++++++++++++++++++++ drivers/staging/greybus/audio_helper.h | 17 +++ 4 files changed, 224 insertions(+), 5 deletions(-) create mode 100644 drivers/staging/greybus/audio_helper.c create mode 100644 drivers/staging/greybus/audio_helper.h diff --git a/drivers/staging/greybus/Makefile b/drivers/staging/greybus/Makefile index 627e44f2a983..3b4b6cabff19 100644 --- a/drivers/staging/greybus/Makefile +++ b/drivers/staging/greybus/Makefile @@ -28,7 +28,7 @@ obj-$(CONFIG_GREYBUS_VIBRATOR) += gb-vibrator.o # Greybus Audio is a bunch of modules gb-audio-module-y := audio_module.o audio_topology.o -gb-audio-codec-y := audio_codec.o +gb-audio-codec-y := audio_codec.o audio_helper.o gb-audio-gb-y := audio_gb.o gb-audio-apbridgea-y := audio_apbridgea.o gb-audio-manager-y := audio_manager.o audio_manager_module.o diff --git a/drivers/staging/greybus/audio_codec.c b/drivers/staging/greybus/audio_codec.c index bbd072acda5c..866b3342515f 100644 --- a/drivers/staging/greybus/audio_codec.c +++ b/drivers/staging/greybus/audio_codec.c @@ -14,6 +14,7 @@ #include "audio_codec.h" #include "audio_apbridgea.h" #include "audio_manager.h" +#include "audio_helper.h" static struct gbaudio_codec_info *gbcodec; @@ -874,7 +875,7 @@ int gbaudio_register_module(struct gbaudio_module_info *module) /* card already instantiated, create widgets here only */ if (component->card->instantiated) { - snd_soc_dapm_link_component_dai_widgets(component->card, + gbaudio_dapm_link_component_dai_widgets(component->card, &component->dapm); #ifdef CONFIG_SND_JACK /* @@ -1004,19 +1005,23 @@ void gbaudio_unregister_module(struct gbaudio_module_info *module) if (module->dapm_routes) { dev_dbg(component->dev, "Removing %d routes\n", module->num_dapm_routes); + /* verify routes with controls are removed */ snd_soc_dapm_del_routes(&component->dapm, module->dapm_routes, module->num_dapm_routes); } if (module->controls) { dev_dbg(component->dev, "Removing %d controls\n", module->num_controls); - snd_soc_remove_codec_controls(component, module->controls, - module->num_controls); + /* release control semaphore */ + up_write(&card->controls_rwsem); + gbaudio_remove_component_controls(component, module->controls, + module->num_controls); + down_write(&card->controls_rwsem); } if (module->dapm_widgets) { dev_dbg(component->dev, "Removing %d widgets\n", module->num_dapm_widgets); - snd_soc_dapm_free_controls(&component->dapm, + gbaudio_dapm_free_controls(&component->dapm, module->dapm_widgets, module->num_dapm_widgets); } diff --git a/drivers/staging/greybus/audio_helper.c b/drivers/staging/greybus/audio_helper.c new file mode 100644 index 000000000000..e2f113a811ee --- /dev/null +++ b/drivers/staging/greybus/audio_helper.c @@ -0,0 +1,197 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Greybus Audio Sound SoC helper APIs + */ + +#include +#include +#include +#include + +#define gbaudio_dapm_for_each_direction(dir) \ + for ((dir) = SND_SOC_DAPM_DIR_IN; (dir) <= SND_SOC_DAPM_DIR_OUT; \ + (dir)++) + +static void gbaudio_dapm_link_dai_widget(struct snd_soc_dapm_widget *dai_w, + struct snd_soc_card *card) +{ + struct snd_soc_dapm_widget *w; + struct snd_soc_dapm_widget *src, *sink; + struct snd_soc_dai *dai = dai_w->priv; + + /* ...find all widgets with the same stream and link them */ + list_for_each_entry(w, &card->widgets, list) { + if (w->dapm != dai_w->dapm) + continue; + + switch (w->id) { + case snd_soc_dapm_dai_in: + case snd_soc_dapm_dai_out: + continue; + default: + break; + } + + if (!w->sname || !strstr(w->sname, dai_w->sname)) + continue; + + /* + * check if widget is already linked, + * if (w->linked) + * return; + */ + + if (dai_w->id == snd_soc_dapm_dai_in) { + src = dai_w; + sink = w; + } else { + src = w; + sink = dai_w; + } + dev_dbg(dai->dev, "%s -> %s\n", src->name, sink->name); + /* Add the DAPM path and set widget's linked status + * snd_soc_dapm_add_path(w->dapm, src, sink, NULL, NULL); + * w->linked = 1; + */ + } +} + +int gbaudio_dapm_link_component_dai_widgets(struct snd_soc_card *card, + struct snd_soc_dapm_context *dapm) +{ + struct snd_soc_dapm_widget *dai_w; + + /* For each DAI widget... */ + list_for_each_entry(dai_w, &card->widgets, list) { + if (dai_w->dapm != dapm) + continue; + switch (dai_w->id) { + case snd_soc_dapm_dai_in: + case snd_soc_dapm_dai_out: + break; + default: + continue; + } + gbaudio_dapm_link_dai_widget(dai_w, card); + } + + return 0; +} + +static void gbaudio_dapm_free_path(struct snd_soc_dapm_path *path) +{ + list_del(&path->list_node[SND_SOC_DAPM_DIR_IN]); + list_del(&path->list_node[SND_SOC_DAPM_DIR_OUT]); + list_del(&path->list_kcontrol); + list_del(&path->list); + kfree(path); +} + +static void gbaudio_dapm_free_widget(struct snd_soc_dapm_widget *w) +{ + struct snd_soc_dapm_path *p, *next_p; + enum snd_soc_dapm_direction dir; + + list_del(&w->list); + /* + * remove source and sink paths associated to this widget. + * While removing the path, remove reference to it from both + * source and sink widgets so that path is removed only once. + */ + gbaudio_dapm_for_each_direction(dir) { + snd_soc_dapm_widget_for_each_path_safe(w, dir, p, next_p) + gbaudio_dapm_free_path(p); + } + + kfree(w->kcontrols); + kfree_const(w->name); + kfree_const(w->sname); + kfree(w); +} + +int gbaudio_dapm_free_controls(struct snd_soc_dapm_context *dapm, + const struct snd_soc_dapm_widget *widget, + int num) +{ + int i; + struct snd_soc_dapm_widget *w, *next_w; +#ifdef CONFIG_DEBUG_FS + struct dentry *parent = dapm->debugfs_dapm; + struct dentry *debugfs_w = NULL; +#endif + + mutex_lock(&dapm->card->dapm_mutex); + for (i = 0; i < num; i++) { + /* below logic can be optimized to identify widget pointer */ + list_for_each_entry_safe(w, next_w, &dapm->card->widgets, + list) { + if (w->dapm != dapm) + continue; + if (!strcmp(w->name, widget->name)) + break; + w = NULL; + } + if (!w) { + dev_err(dapm->dev, "%s: widget not found\n", + widget->name); + return -EINVAL; + } + widget++; +#ifdef CONFIG_DEBUG_FS + if (!parent) + debugfs_w = debugfs_lookup(w->name, parent); + debugfs_remove(debugfs_w); + debugfs_w = NULL; +#endif + gbaudio_dapm_free_widget(w); + } + mutex_unlock(&dapm->card->dapm_mutex); + return 0; +} + +static int gbaudio_remove_controls(struct snd_card *card, struct device *dev, + const struct snd_kcontrol_new *controls, + int num_controls, const char *prefix) +{ + int i, err; + + for (i = 0; i < num_controls; i++) { + const struct snd_kcontrol_new *control = &controls[i]; + struct snd_ctl_elem_id id; + struct snd_kcontrol *kctl; + + if (prefix) + snprintf(id.name, sizeof(id.name), "%s %s", prefix, + control->name); + else + strlcpy(id.name, control->name, sizeof(id.name)); + id.numid = 0; + id.iface = control->iface; + id.device = control->device; + id.subdevice = control->subdevice; + id.index = control->index; + kctl = snd_ctl_find_id(card, &id); + if (!kctl) { + dev_err(dev, "%d: Failed to find %s\n", err, + control->name); + return -ENOENT; + } + err = snd_ctl_remove(card, kctl); + if (err < 0) { + dev_err(dev, "%d: Failed to remove %s\n", err, + control->name); + return err; + } + } + return 0; +} + +int gbaudio_remove_component_controls(struct snd_soc_component *component, + const struct snd_kcontrol_new *controls, + unsigned int num_controls) +{ + struct snd_card *card = component->card->snd_card; + + return gbaudio_remove_controls(card, component->dev, controls, + num_controls, component->name_prefix); +} diff --git a/drivers/staging/greybus/audio_helper.h b/drivers/staging/greybus/audio_helper.h new file mode 100644 index 000000000000..5cf1c6d7d3ea --- /dev/null +++ b/drivers/staging/greybus/audio_helper.h @@ -0,0 +1,17 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Greybus Audio Sound SoC helper APIs + */ + +#ifndef __LINUX_GBAUDIO_HELPER_H +#define __LINUX_GBAUDIO_HELPER_H + +int gbaudio_dapm_link_component_dai_widgets(struct snd_soc_card *card, + struct snd_soc_dapm_context *dapm); +int gbaudio_dapm_free_controls(struct snd_soc_dapm_context *dapm, + const struct snd_soc_dapm_widget *widget, + int num); +int gbaudio_remove_component_controls(struct snd_soc_component *component, + const struct snd_kcontrol_new *controls, + unsigned int num_controls); +#endif