Skip to content

Commit 919a4a9

Browse files
alpernebbibroonie
authored andcommitted
ASoC: amd: acp: Add kcontrols and widgets per-codec in common code
Commit 7ac3404 ("ASoC: amd: acp: Map missing jack kcontrols") adds card kcontrols and DAPM widgets corresponding to jacks for Headphone and Headset Mic. But these were already being added in acp-legacy-mach.c and acp-sof-mach.c, so this causes a probe error: sof_mach rt5682s-hs-rt1019: control 2:0:0:Headphone Jack Switch:0 is already present sof_mach rt5682s-hs-rt1019: ASoC: Failed to add Headphone Jack Switch: -16 sof_mach rt5682s-hs-rt1019: devm_snd_soc_register_card(sof-rt5682s-hs-rt1019) failed: -16 sof_mach: probe of rt5682s-hs-rt1019 failed with error -16 Removing the new duplicates from the common code might be enough to fix the issue. But some of the codecs use different kcontrols and widgets. NAU8821 alone has an "Int Mic". MAX98360A has a single "Spk", while RT1019 has "Left Spk" and "Right Spk" (and two codec instances with name prefixes). Since there are per-codec differences, add the kcontrols and widgets in the common code as each dai-link is being initialized, instead of in the two machine drivers' probe(). Also, MAX98388 has Left and Right instances, but uses a single "SPK" widget. That seems weird, so normalize it to use two widgets (one per each instance like RT1019) while we're adding controls. Fixes: 7ac3404 ("ASoC: amd: acp: Map missing jack kcontrols") Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com> Link: https://lore.kernel.org/r/20230818080314.32991-1-alpernebiyasak@gmail.com Signed-off-by: Mark Brown <broonie@kernel.org>
1 parent aa98697 commit 919a4a9

3 files changed

Lines changed: 67 additions & 44 deletions

File tree

sound/soc/amd/acp/acp-legacy-mach.c

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -75,23 +75,6 @@ static struct acp_card_drvdata rt5682s_rt1019_rmb_data = {
7575
.tdm_mode = false,
7676
};
7777

78-
static const struct snd_kcontrol_new acp_controls[] = {
79-
SOC_DAPM_PIN_SWITCH("Headphone Jack"),
80-
SOC_DAPM_PIN_SWITCH("Headset Mic"),
81-
SOC_DAPM_PIN_SWITCH("Spk"),
82-
SOC_DAPM_PIN_SWITCH("Left Spk"),
83-
SOC_DAPM_PIN_SWITCH("Right Spk"),
84-
85-
};
86-
87-
static const struct snd_soc_dapm_widget acp_widgets[] = {
88-
SND_SOC_DAPM_HP("Headphone Jack", NULL),
89-
SND_SOC_DAPM_MIC("Headset Mic", NULL),
90-
SND_SOC_DAPM_SPK("Spk", NULL),
91-
SND_SOC_DAPM_SPK("Left Spk", NULL),
92-
SND_SOC_DAPM_SPK("Right Spk", NULL),
93-
};
94-
9578
static int acp_asoc_probe(struct platform_device *pdev)
9679
{
9780
struct snd_soc_card *card = NULL;
@@ -110,11 +93,8 @@ static int acp_asoc_probe(struct platform_device *pdev)
11093
card->dev = dev;
11194
card->owner = THIS_MODULE;
11295
card->name = pdev->id_entry->name;
113-
card->dapm_widgets = acp_widgets;
114-
card->num_dapm_widgets = ARRAY_SIZE(acp_widgets);
115-
card->controls = acp_controls;
116-
card->num_controls = ARRAY_SIZE(acp_controls);
11796
card->drvdata = (struct acp_card_drvdata *)pdev->id_entry->driver_data;
97+
/* Widgets and controls added per-codec in acp-mach-common.c */
11898

11999
acp_card_drvdata = card->drvdata;
120100
dmi_id = dmi_first_match(acp_quirk_table);

sound/soc/amd/acp/acp-mach-common.c

Lines changed: 65 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -513,6 +513,16 @@ SND_SOC_DAILINK_DEF(rt1019,
513513
DAILINK_COMP_ARRAY(COMP_CODEC("i2c-10EC1019:00", "rt1019-aif"),
514514
COMP_CODEC("i2c-10EC1019:01", "rt1019-aif")));
515515

516+
static const struct snd_kcontrol_new rt1019_controls[] = {
517+
SOC_DAPM_PIN_SWITCH("Left Spk"),
518+
SOC_DAPM_PIN_SWITCH("Right Spk"),
519+
};
520+
521+
static const struct snd_soc_dapm_widget rt1019_widgets[] = {
522+
SND_SOC_DAPM_SPK("Left Spk", NULL),
523+
SND_SOC_DAPM_SPK("Right Spk", NULL),
524+
};
525+
516526
static const struct snd_soc_dapm_route rt1019_map_lr[] = {
517527
{ "Left Spk", NULL, "Left SPO" },
518528
{ "Right Spk", NULL, "Right SPO" },
@@ -533,10 +543,25 @@ static int acp_card_rt1019_init(struct snd_soc_pcm_runtime *rtd)
533543
{
534544
struct snd_soc_card *card = rtd->card;
535545
struct acp_card_drvdata *drvdata = card->drvdata;
546+
int ret;
536547

537548
if (drvdata->amp_codec_id != RT1019)
538549
return -EINVAL;
539550

551+
ret = snd_soc_dapm_new_controls(&card->dapm, rt1019_widgets,
552+
ARRAY_SIZE(rt1019_widgets));
553+
if (ret) {
554+
dev_err(rtd->dev, "unable to add widget dapm controls, ret %d\n", ret);
555+
return ret;
556+
}
557+
558+
ret = snd_soc_add_card_controls(card, rt1019_controls,
559+
ARRAY_SIZE(rt1019_controls));
560+
if (ret) {
561+
dev_err(rtd->dev, "unable to add card controls, ret %d\n", ret);
562+
return ret;
563+
}
564+
540565
return snd_soc_dapm_add_routes(&rtd->card->dapm, rt1019_map_lr,
541566
ARRAY_SIZE(rt1019_map_lr));
542567
}
@@ -667,6 +692,14 @@ static const struct snd_soc_ops acp_card_rt1019_ops = {
667692
SND_SOC_DAILINK_DEF(max98360a,
668693
DAILINK_COMP_ARRAY(COMP_CODEC("MX98360A:00", "HiFi")));
669694

695+
static const struct snd_kcontrol_new max98360a_controls[] = {
696+
SOC_DAPM_PIN_SWITCH("Spk"),
697+
};
698+
699+
static const struct snd_soc_dapm_widget max98360a_widgets[] = {
700+
SND_SOC_DAPM_SPK("Spk", NULL),
701+
};
702+
670703
static const struct snd_soc_dapm_route max98360a_map[] = {
671704
{"Spk", NULL, "Speaker"},
672705
};
@@ -675,10 +708,25 @@ static int acp_card_maxim_init(struct snd_soc_pcm_runtime *rtd)
675708
{
676709
struct snd_soc_card *card = rtd->card;
677710
struct acp_card_drvdata *drvdata = card->drvdata;
711+
int ret;
678712

679713
if (drvdata->amp_codec_id != MAX98360A)
680714
return -EINVAL;
681715

716+
ret = snd_soc_dapm_new_controls(&card->dapm, max98360a_widgets,
717+
ARRAY_SIZE(max98360a_widgets));
718+
if (ret) {
719+
dev_err(rtd->dev, "unable to add widget dapm controls, ret %d\n", ret);
720+
return ret;
721+
}
722+
723+
ret = snd_soc_add_card_controls(card, max98360a_controls,
724+
ARRAY_SIZE(max98360a_controls));
725+
if (ret) {
726+
dev_err(rtd->dev, "unable to add card controls, ret %d\n", ret);
727+
return ret;
728+
}
729+
682730
return snd_soc_dapm_add_routes(&rtd->card->dapm, max98360a_map,
683731
ARRAY_SIZE(max98360a_map));
684732
}
@@ -744,13 +792,19 @@ SND_SOC_DAILINK_DEF(max98388,
744792
DAILINK_COMP_ARRAY(COMP_CODEC("i2c-ADS8388:00", "max98388-aif1"),
745793
COMP_CODEC("i2c-ADS8388:01", "max98388-aif1")));
746794

795+
static const struct snd_kcontrol_new max98388_controls[] = {
796+
SOC_DAPM_PIN_SWITCH("Left Spk"),
797+
SOC_DAPM_PIN_SWITCH("Right Spk"),
798+
};
799+
747800
static const struct snd_soc_dapm_widget max98388_widgets[] = {
748-
SND_SOC_DAPM_SPK("SPK", NULL),
801+
SND_SOC_DAPM_SPK("Left Spk", NULL),
802+
SND_SOC_DAPM_SPK("Right Spk", NULL),
749803
};
750804

751805
static const struct snd_soc_dapm_route max98388_map[] = {
752-
{ "SPK", NULL, "Left BE_OUT" },
753-
{ "SPK", NULL, "Right BE_OUT" },
806+
{ "Left Spk", NULL, "Left BE_OUT" },
807+
{ "Right Spk", NULL, "Right BE_OUT" },
754808
};
755809

756810
static struct snd_soc_codec_conf max98388_conf[] = {
@@ -803,6 +857,14 @@ static int acp_card_max98388_init(struct snd_soc_pcm_runtime *rtd)
803857
/* Don't need to add routes if widget addition failed */
804858
return ret;
805859
}
860+
861+
ret = snd_soc_add_card_controls(card, max98388_controls,
862+
ARRAY_SIZE(max98388_controls));
863+
if (ret) {
864+
dev_err(rtd->dev, "unable to add card controls, ret %d\n", ret);
865+
return ret;
866+
}
867+
806868
return snd_soc_dapm_add_routes(&rtd->card->dapm, max98388_map,
807869
ARRAY_SIZE(max98388_map));
808870
}

sound/soc/amd/acp/acp-sof-mach.c

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -94,22 +94,6 @@ static struct acp_card_drvdata sof_nau8821_max98388_data = {
9494
.tdm_mode = false,
9595
};
9696

97-
static const struct snd_kcontrol_new acp_controls[] = {
98-
SOC_DAPM_PIN_SWITCH("Headphone Jack"),
99-
SOC_DAPM_PIN_SWITCH("Headset Mic"),
100-
SOC_DAPM_PIN_SWITCH("Spk"),
101-
SOC_DAPM_PIN_SWITCH("Left Spk"),
102-
SOC_DAPM_PIN_SWITCH("Right Spk"),
103-
};
104-
105-
static const struct snd_soc_dapm_widget acp_widgets[] = {
106-
SND_SOC_DAPM_HP("Headphone Jack", NULL),
107-
SND_SOC_DAPM_MIC("Headset Mic", NULL),
108-
SND_SOC_DAPM_SPK("Spk", NULL),
109-
SND_SOC_DAPM_SPK("Left Spk", NULL),
110-
SND_SOC_DAPM_SPK("Right Spk", NULL),
111-
};
112-
11397
static int acp_sof_probe(struct platform_device *pdev)
11498
{
11599
struct snd_soc_card *card = NULL;
@@ -128,11 +112,8 @@ static int acp_sof_probe(struct platform_device *pdev)
128112
card->dev = dev;
129113
card->owner = THIS_MODULE;
130114
card->name = pdev->id_entry->name;
131-
card->dapm_widgets = acp_widgets;
132-
card->num_dapm_widgets = ARRAY_SIZE(acp_widgets);
133-
card->controls = acp_controls;
134-
card->num_controls = ARRAY_SIZE(acp_controls);
135115
card->drvdata = (struct acp_card_drvdata *)pdev->id_entry->driver_data;
116+
/* Widgets and controls added per-codec in acp-mach-common.c */
136117

137118
acp_card_drvdata = card->drvdata;
138119
dmi_id = dmi_first_match(acp_quirk_table);

0 commit comments

Comments
 (0)