From patchwork Sat Aug 19 06:39:04 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anish Kumar X-Patchwork-Id: 9910151 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 73DF0602A0 for ; Sat, 19 Aug 2017 06:39:22 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 577F128BAB for ; Sat, 19 Aug 2017 06:39:22 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 4A0F928DA5; Sat, 19 Aug 2017 06:39:22 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-1.3 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED,FREEMAIL_FROM,RCVD_IN_DNSWL_NONE,RCVD_IN_SORBS_SPAM, T_DKIM_INVALID autolearn=no version=3.3.1 Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D87AF28BAB for ; Sat, 19 Aug 2017 06:39:19 +0000 (UTC) Received: from alsa0.perex.cz (localhost [127.0.0.1]) by alsa0.perex.cz (Postfix) with ESMTP id 5EF84266C52; Sat, 19 Aug 2017 08:39:14 +0200 (CEST) X-Original-To: alsa-devel@alsa-project.org Delivered-To: alsa-devel@alsa-project.org Received: by alsa0.perex.cz (Postfix, from userid 1000) id 69D86266C5E; Sat, 19 Aug 2017 08:39:12 +0200 (CEST) Received: from mail-pg0-f66.google.com (mail-pg0-f66.google.com [74.125.83.66]) by alsa0.perex.cz (Postfix) with ESMTP id CC6A1266A74 for ; Sat, 19 Aug 2017 08:39:09 +0200 (CEST) Received: by mail-pg0-f66.google.com with SMTP id i12so2456531pgr.1 for ; Fri, 18 Aug 2017 23:39:09 -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; bh=lc4zVO9kIWTzj8pg+nEDexWKg0SsNciINftAbPiZ8Q0=; b=N5E0YuyOIE9kouZEt4lzV2WURLDAu9zexMl6UExkp/DZvnjiO/p9Q3oNvPaaCAurMH wtlVjl2v4tr1h0yUfwsztr4/LVMqx/gJcFX4miTYayaBoHgHseXg3Wktr6w4tL53vtr0 Td6VvlpPavqJjKdAh9f9C6xThQ9ENiJ/RV6GxjDYG1bw8aaa4SquN35XGCrZ4XhXM0US 8Culdc8E027JinQSSg6nge/vdplpihPH2lMkL02T2KRgzQt8XojqgQKEsHmhzCpg1gFD pCwDCTSeL5htxL4nleK7mAE52UNixOoMq0NN9dncnYpTFU4OuXBycxAt+eNZQHBgWig7 BZ2g== 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; bh=lc4zVO9kIWTzj8pg+nEDexWKg0SsNciINftAbPiZ8Q0=; b=MmhSVlg8t3zpH8M3oqiLZp2fIWgGDdH6A6VQNGuYg+UlGJhNFQNl2Fe1Wu6bhITIeP 84H19rYb5NB7G3nHn+6H9GX4688dYDjTX9QxasyjJ++FJv+bMkXRd0UjZHn72ia4vCZq akgjkMVDdirne2BPJT62lkGvAs9QJVjGcOnw0ZLeGMrVLVyP8eeZq4dq1mtK7azRr67D 9jjTcy+xx6BVlsrilIR+HyF0kVf8a+YllbEo1PkukM3MbFkU4NNrdDpfAs8k02XHPsl7 29M97/vepaFavpKHCHpm1mAlcjGup/EIdFcr8vkkYuEYOaQNgGPGi5m4tT742g/0Km81 n81w== X-Gm-Message-State: AHYfb5h2JlXRIV2T+ltjxJPXFjPs2jPYFAyufLCMkC74kLe2hU0AoHw+ KHbUqvdLdEMQjg== X-Received: by 10.84.214.2 with SMTP id h2mr12007727pli.436.1503124747936; Fri, 18 Aug 2017 23:39:07 -0700 (PDT) Received: from anishs-MacBook-Pro.local.net ([24.6.106.169]) by smtp.gmail.com with ESMTPSA id l16sm14506874pfk.173.2017.08.18.23.39.06 (version=TLS1 cipher=AES128-SHA bits=128/128); Fri, 18 Aug 2017 23:39:07 -0700 (PDT) From: yesanishhere@gmail.com To: broonie@kernel.org, lgirdwood@gmail.com, perex@perex.cz, alsa-devel@alsa-project.org, tiwai@suse.com Date: Fri, 18 Aug 2017 23:39:04 -0700 Message-Id: <1503124744-13547-1-git-send-email-yesanishhere@gmail.com> X-Mailer: git-send-email 2.5.4 (Apple Git-61) Cc: anish kumar Subject: [alsa-devel] [PATCH] ASoC: dapm: Avoid creating kcontrol for params X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.14 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: , MIME-Version: 1.0 Errors-To: alsa-devel-bounces@alsa-project.org Sender: alsa-devel-bounces@alsa-project.org X-Virus-Scanned: ClamAV using ClamSMTP From: anish kumar When num_params is defined as one in case of codec to codec dai link, there is no point in allocating memory for kcontrol. Signed-off-by: anish kumar --- include/sound/soc-dapm.h | 1 - sound/soc/soc-dapm.c | 147 ++++++++++++++++++++++++----------------------- 2 files changed, 76 insertions(+), 72 deletions(-) diff --git a/include/sound/soc-dapm.h b/include/sound/soc-dapm.h index 344b96c..dc5c336 100644 --- a/include/sound/soc-dapm.h +++ b/include/sound/soc-dapm.h @@ -582,7 +582,6 @@ struct snd_soc_dapm_widget { void *priv; /* widget specific data */ struct regulator *regulator; /* attached regulator */ const struct snd_soc_pcm_stream *params; /* params for dai links */ - unsigned int num_params; /* number of params for dai links */ unsigned int params_select; /* currently selected param for dai link */ /* dapm control */ diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c index dcef67a..0a26905 100644 --- a/sound/soc/soc-dapm.c +++ b/sound/soc/soc-dapm.c @@ -1032,10 +1032,6 @@ static int dapm_new_dai_link(struct snd_soc_dapm_widget *w) struct snd_soc_dapm_context *dapm = w->dapm; struct snd_card *card = dapm->card->snd_card; - /* create control for links with > 1 config */ - if (w->num_params <= 1) - return 0; - /* add kcontrol */ for (i = 0; i < w->num_kcontrols; i++) { kcontrol = snd_soc_cnew(&w->kcontrol_news[i], w, @@ -3770,108 +3766,125 @@ static int snd_soc_dapm_dai_link_put(struct snd_kcontrol *kcontrol, if (ucontrol->value.enumerated.item[0] == w->params_select) return 0; - if (ucontrol->value.enumerated.item[0] >= w->num_params) - return -EINVAL; - w->params_select = ucontrol->value.enumerated.item[0]; return 0; } -int snd_soc_dapm_new_pcm(struct snd_soc_card *card, - const struct snd_soc_pcm_stream *params, - unsigned int num_params, - struct snd_soc_dapm_widget *source, - struct snd_soc_dapm_widget *sink) +struct snd_kcontrol_new *snd_soc_dapm_new_kcontrol(struct snd_soc_card *card, + char *link_name, + const struct snd_soc_pcm_stream *params, + int num_params) { - struct snd_soc_dapm_widget template; - struct snd_soc_dapm_widget *w; - char *link_name; - int ret, count; - unsigned long private_value; const char **w_param_text; + int count; + unsigned long private_value; struct soc_enum w_param_enum[] = { SOC_ENUM_SINGLE(0, 0, 0, NULL), }; struct snd_kcontrol_new kcontrol_dai_link[] = { SOC_ENUM_EXT(NULL, w_param_enum[0], - snd_soc_dapm_dai_link_get, - snd_soc_dapm_dai_link_put), + snd_soc_dapm_dai_link_get, + snd_soc_dapm_dai_link_put), }; + struct snd_kcontrol_new *kcontrol_news = NULL; const struct snd_soc_pcm_stream *config = params; w_param_text = devm_kcalloc(card->dev, num_params, sizeof(char *), GFP_KERNEL); if (!w_param_text) - return -ENOMEM; - - link_name = devm_kasprintf(card->dev, GFP_KERNEL, "%s-%s", - source->name, sink->name); - if (!link_name) { - ret = -ENOMEM; - goto outfree_w_param; - } + return NULL; for (count = 0 ; count < num_params; count++) { if (!config->stream_name) { dev_warn(card->dapm.dev, - "ASoC: anonymous config %d for dai link %s\n", - count, link_name); + "ASoC: anonymous config %d for dai link %s\n", + count, link_name); w_param_text[count] = devm_kasprintf(card->dev, GFP_KERNEL, - "Anonymous Configuration %d", - count); - if (!w_param_text[count]) { - ret = -ENOMEM; - goto outfree_link_name; - } + "Anonymous Configuration %d", + count); } else { w_param_text[count] = devm_kmemdup(card->dev, - config->stream_name, - strlen(config->stream_name) + 1, - GFP_KERNEL); - if (!w_param_text[count]) { - ret = -ENOMEM; - goto outfree_link_name; - } + config->stream_name, + strlen(config->stream_name) + 1, + GFP_KERNEL); } + if (!w_param_text[count]) + goto outfree_w_param; config++; } + w_param_enum[0].items = num_params; w_param_enum[0].texts = w_param_text; - memset(&template, 0, sizeof(template)); - template.reg = SND_SOC_NOPM; - template.id = snd_soc_dapm_dai_link; - template.name = link_name; - template.event = snd_soc_dai_link_event; - template.event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD; - template.num_kcontrols = 1; - /* duplicate w_param_enum on heap so that memory persists */ private_value = (unsigned long) devm_kmemdup(card->dev, - (void *)(kcontrol_dai_link[0].private_value), - sizeof(struct soc_enum), GFP_KERNEL); + (void *)(kcontrol_dai_link[0].private_value), + sizeof(struct soc_enum), GFP_KERNEL); if (!private_value) { dev_err(card->dev, "ASoC: Failed to create control for %s widget\n", - link_name); - ret = -ENOMEM; - goto outfree_link_name; + link_name); + goto outfree_w_param; } kcontrol_dai_link[0].private_value = private_value; /* duplicate kcontrol_dai_link on heap so that memory persists */ - template.kcontrol_news = - devm_kmemdup(card->dev, &kcontrol_dai_link[0], - sizeof(struct snd_kcontrol_new), - GFP_KERNEL); - if (!template.kcontrol_news) { + kcontrol_news = + devm_kmemdup(card->dev, &kcontrol_dai_link[0], + sizeof(struct snd_kcontrol_new), + GFP_KERNEL); + if (!kcontrol_news) { dev_err(card->dev, "ASoC: Failed to create control for %s widget\n", - link_name); - ret = -ENOMEM; + link_name); goto outfree_private_value; } + return kcontrol_news; + +outfree_private_value: + devm_kfree(card->dev, (void *)private_value); +outfree_w_param: + for (count = 0 ; count < num_params; count++) + if (w_param_text[count] != NULL) + devm_kfree(card->dev, (void *)w_param_text[count]); + devm_kfree(card->dev, w_param_text); + return NULL; +} + +int snd_soc_dapm_new_pcm(struct snd_soc_card *card, + const struct snd_soc_pcm_stream *params, + unsigned int num_params, + struct snd_soc_dapm_widget *source, + struct snd_soc_dapm_widget *sink) +{ + struct snd_soc_dapm_widget template; + struct snd_soc_dapm_widget *w; + char *link_name; + int ret; + link_name = devm_kasprintf(card->dev, GFP_KERNEL, "%s-%s", + source->name, sink->name); + if (!link_name) + return -ENOMEM; + + memset(&template, 0, sizeof(template)); + template.reg = SND_SOC_NOPM; + template.id = snd_soc_dapm_dai_link; + template.name = link_name; + template.event = snd_soc_dai_link_event; + template.event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | + SND_SOC_DAPM_PRE_PMD; + template.kcontrol_news = NULL; + + /* allocate memory for control, only in case of multiple configs */ + if (num_params > 1) { + template.num_kcontrols = 1; + template.kcontrol_news = + snd_soc_dapm_new_kcontrol(card, link_name, params, num_params); + if (!template.kcontrol_news) { + ret = -ENOMEM; + goto outfree_link_name; + } + } dev_dbg(card->dev, "ASoC: adding %s widget\n", link_name); w = snd_soc_dapm_new_control_unlocked(&card->dapm, &template); @@ -3892,7 +3905,6 @@ int snd_soc_dapm_new_pcm(struct snd_soc_card *card, } w->params = params; - w->num_params = num_params; ret = snd_soc_dapm_add_path(&card->dapm, source, w, NULL, NULL); if (ret) @@ -3903,15 +3915,8 @@ int snd_soc_dapm_new_pcm(struct snd_soc_card *card, devm_kfree(card->dev, w); outfree_kcontrol_news: devm_kfree(card->dev, (void *)template.kcontrol_news); -outfree_private_value: - devm_kfree(card->dev, (void *)private_value); outfree_link_name: devm_kfree(card->dev, link_name); -outfree_w_param: - for (count = 0 ; count < num_params; count++) - devm_kfree(card->dev, (void *)w_param_text[count]); - devm_kfree(card->dev, w_param_text); - return ret; }