Skip to content

Commit 1007da0

Browse files
nvswarrenbroonie
authored andcommitted
ASoC: Fix dapm_is_shared_kcontrol so everything isn't shared
Commit af46800 ("ASoC: Implement mux control sharing") introduced function dapm_is_shared_kcontrol. When this function returns true, the naming of DAPM controls is derived from the kcontrol_new. Otherwise, the name comes from the widget (and possibly a widget's naming prefix). A bug in the implementation of dapm_is_shared_kcontrol made it return 1 in all cases. Hence, that commit caused a change in control naming for all controls instead of just shared controls. Specifically, a control is always considered shared because it is always compared against itself. Solve this by never comparing against the widget containing the control being created. Equally, controls should never be shared between DAPM contexts; when the same codec is instantiated multiple times, the same kcontrol_new will be used. However, the control should no be shared between the multiple instances. I tested that with the Tegra WM8903 driver: * Shared is now mostly 0 as expected, and sometimes 1. * The expected controls are still generated after this change. However, I don't have any systems that have a widget/control naming prefix, so I can't test that aspect. Thanks for Jarkko Nikula for pointing out how to fix this. Reported-by: Liam Girdwood <lrg@ti.com> Tested-by: Jarkko Nikula <jhnikula@gmail.com> Signed-off-by: Stephen Warren <swarren@nvidia.com> Acked-by: Liam Girdwood <lrg@ti.com> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
1 parent ea77b94 commit 1007da0

File tree

1 file changed

+4
-1
lines changed

1 file changed

+4
-1
lines changed

sound/soc/soc-dapm.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,7 @@ static int dapm_connect_mixer(struct snd_soc_dapm_context *dapm,
325325
}
326326

327327
static int dapm_is_shared_kcontrol(struct snd_soc_dapm_context *dapm,
328+
struct snd_soc_dapm_widget *kcontrolw,
328329
const struct snd_kcontrol_new *kcontrol_new,
329330
struct snd_kcontrol **kcontrol)
330331
{
@@ -334,6 +335,8 @@ static int dapm_is_shared_kcontrol(struct snd_soc_dapm_context *dapm,
334335
*kcontrol = NULL;
335336

336337
list_for_each_entry(w, &dapm->card->widgets, list) {
338+
if (w == kcontrolw || w->dapm != kcontrolw->dapm)
339+
continue;
337340
for (i = 0; i < w->num_kcontrols; i++) {
338341
if (&w->kcontrol_news[i] == kcontrol_new) {
339342
if (w->kcontrols)
@@ -468,7 +471,7 @@ static int dapm_new_mux(struct snd_soc_dapm_context *dapm,
468471
return -EINVAL;
469472
}
470473

471-
shared = dapm_is_shared_kcontrol(dapm, &w->kcontrol_news[0],
474+
shared = dapm_is_shared_kcontrol(dapm, w, &w->kcontrol_news[0],
472475
&kcontrol);
473476
if (kcontrol) {
474477
wlist = kcontrol->private_data;

0 commit comments

Comments
 (0)