Message ID | 20221031122224.1846221-3-ajye_huang@compal.corp-partner.google.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Modify documentation and machine driver for mt8186_rt1019_rt5682s sound card | expand |
Il 31/10/22 13:22, Ajye Huang ha scritto: > Having two DMICs, a front DMIC and a Rear DMIC, > but only host audio input AUX port0 is used for these two Dmics. > A "dmic-gpios" property is used for a mixer control to switch > the dmic signal source between the Front and Rear Dmic. > > Refer to this one as an example, > commit 3cfbf07c6d27 > ("ASoC: qcom: sc7180: Modify machine driver for 2mic") > > Signed-off-by: Ajye Huang <ajye_huang@compal.corp-partner.google.com> > --- > .../mt8186/mt8186-mt6366-rt1019-rt5682s.c | 102 +++++++++++++++++- > 1 file changed, 101 insertions(+), 1 deletion(-) > > diff --git a/sound/soc/mediatek/mt8186/mt8186-mt6366-rt1019-rt5682s.c b/sound/soc/mediatek/mt8186/mt8186-mt6366-rt1019-rt5682s.c > index 2414c5b77233..75351734464c 100644 > --- a/sound/soc/mediatek/mt8186/mt8186-mt6366-rt1019-rt5682s.c > +++ b/sound/soc/mediatek/mt8186/mt8186-mt6366-rt1019-rt5682s.c > @@ -7,6 +7,8 @@ > // Author: Jiaxin Yu <jiaxin.yu@mediatek.com> > // > > +#include <linux/gpio.h> > +#include <linux/gpio/consumer.h> > #include <linux/input.h> > #include <linux/module.h> > #include <linux/of_device.h> > @@ -39,6 +41,8 @@ > > struct mt8186_mt6366_rt1019_rt5682s_priv { > struct snd_soc_jack headset_jack, hdmi_jack; > + struct gpio_desc *dmic_sel; > + int dmic_switch; > }; > > /* Headset jack detection DAPM pins */ > @@ -68,6 +72,94 @@ static struct snd_soc_codec_conf mt8186_mt6366_rt1019_rt5682s_codec_conf[] = { > }, > }; > > +static int dmic_get(struct snd_kcontrol *kcontrol, > + struct snd_ctl_elem_value *ucontrol) > +{ > + struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kcontrol); > + struct mtk_soc_card_data *soc_card_data = > + snd_soc_card_get_drvdata(dapm->card); > + struct mt8186_mt6366_rt1019_rt5682s_priv *priv = soc_card_data->mach_priv; > + > + ucontrol->value.integer.value[0] = priv->dmic_switch; > + return 0; > +} > + > +static int dmic_set(struct snd_kcontrol *kcontrol, > + struct snd_ctl_elem_value *ucontrol) > +{ > + struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kcontrol); > + struct mtk_soc_card_data *soc_card_data = > + snd_soc_card_get_drvdata(dapm->card); > + struct mt8186_mt6366_rt1019_rt5682s_priv *priv = soc_card_data->mach_priv; > + > + priv->dmic_switch = ucontrol->value.integer.value[0]; > + if (priv->dmic_sel) { > + gpiod_set_value(priv->dmic_sel, priv->dmic_switch); > + dev_info(dapm->card->dev, "dmic_set_value %d\n", > + priv->dmic_switch); > + } > + return 0; > +} > + > +static const char * const dmic_mux_text[] = { > + "FrontMic", > + "RearMic", Why are the two words joined? s/FrontMic/Front Mic/g s/RearMic/Rear Mic/g Like that, we keep it consistent with the naming that was given in the commit that you mentioned in the commit description. Regards, Angelo
Hi AngeloGioacchino, On Wed, Nov 2, 2022 at 6:44 PM AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com> wrote: > > > A "dmic-gpios" property is used for a mixer control to switch > > the dmic signal source between the Front and Rear Dmic. > > > > Refer to this one as an example, > > commit 3cfbf07c6d27 > > ("ASoC: qcom: sc7180: Modify machine driver for 2mic") > > > > +static const char * const dmic_mux_text[] = { > > + "FrontMic", > > + "RearMic", > > Why are the two words joined? > s/FrontMic/Front Mic/g > s/RearMic/Rear Mic/g > > Like that, we keep it consistent with the naming that was given in the commit > that you mentioned in the commit description. > > Regards, > Angelo Thank you for your review. Yes, you are correct, I should keep the string format consistent with the commit I mentioned in descriptions to avoid confusion. I will submit the next. Thanks. Regards.
diff --git a/sound/soc/mediatek/mt8186/mt8186-mt6366-rt1019-rt5682s.c b/sound/soc/mediatek/mt8186/mt8186-mt6366-rt1019-rt5682s.c index 2414c5b77233..75351734464c 100644 --- a/sound/soc/mediatek/mt8186/mt8186-mt6366-rt1019-rt5682s.c +++ b/sound/soc/mediatek/mt8186/mt8186-mt6366-rt1019-rt5682s.c @@ -7,6 +7,8 @@ // Author: Jiaxin Yu <jiaxin.yu@mediatek.com> // +#include <linux/gpio.h> +#include <linux/gpio/consumer.h> #include <linux/input.h> #include <linux/module.h> #include <linux/of_device.h> @@ -39,6 +41,8 @@ struct mt8186_mt6366_rt1019_rt5682s_priv { struct snd_soc_jack headset_jack, hdmi_jack; + struct gpio_desc *dmic_sel; + int dmic_switch; }; /* Headset jack detection DAPM pins */ @@ -68,6 +72,94 @@ static struct snd_soc_codec_conf mt8186_mt6366_rt1019_rt5682s_codec_conf[] = { }, }; +static int dmic_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kcontrol); + struct mtk_soc_card_data *soc_card_data = + snd_soc_card_get_drvdata(dapm->card); + struct mt8186_mt6366_rt1019_rt5682s_priv *priv = soc_card_data->mach_priv; + + ucontrol->value.integer.value[0] = priv->dmic_switch; + return 0; +} + +static int dmic_set(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kcontrol); + struct mtk_soc_card_data *soc_card_data = + snd_soc_card_get_drvdata(dapm->card); + struct mt8186_mt6366_rt1019_rt5682s_priv *priv = soc_card_data->mach_priv; + + priv->dmic_switch = ucontrol->value.integer.value[0]; + if (priv->dmic_sel) { + gpiod_set_value(priv->dmic_sel, priv->dmic_switch); + dev_info(dapm->card->dev, "dmic_set_value %d\n", + priv->dmic_switch); + } + return 0; +} + +static const char * const dmic_mux_text[] = { + "FrontMic", + "RearMic", +}; + +static SOC_ENUM_SINGLE_DECL(mt8186_dmic_enum, + SND_SOC_NOPM, 0, dmic_mux_text); + +static const struct snd_kcontrol_new mt8186_dmic_mux_control = + SOC_DAPM_ENUM_EXT("DMIC Select Mux", mt8186_dmic_enum, + dmic_get, dmic_set); + +static const struct snd_soc_dapm_widget dmic_widgets[] = { + SND_SOC_DAPM_MIC("DMIC", NULL), + SND_SOC_DAPM_MUX("Dmic Mux", SND_SOC_NOPM, 0, 0, &mt8186_dmic_mux_control), +}; + +static const struct snd_soc_dapm_route dmic_map[] = { + /* digital mics */ + {"Dmic Mux", "FrontMic", "DMIC"}, + {"Dmic Mux", "RearMic", "DMIC"}, +}; + +static int primary_codec_init(struct snd_soc_pcm_runtime *rtd) +{ + struct snd_soc_card *card = rtd->card; + struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(card); + struct mt8186_mt6366_rt1019_rt5682s_priv *priv = soc_card_data->mach_priv; + int ret; + + ret = mt8186_mt6366_init(rtd); + + if (ret) { + dev_err(card->dev, "mt8186_mt6366_init failed: %d\n", ret); + return ret; + } + + if (!priv->dmic_sel) { + dev_info(card->dev, "dmic_sel is null\n"); + return ret; + } + + ret = snd_soc_dapm_new_controls(&card->dapm, dmic_widgets, + ARRAY_SIZE(dmic_widgets)); + if (ret) { + dev_err(card->dev, "DMic widget addition failed: %d\n", ret); + /* Don't need to add routes if widget addition failed */ + return ret; + } + + ret = snd_soc_dapm_add_routes(&card->dapm, dmic_map, + ARRAY_SIZE(dmic_map)); + + if (ret) + dev_err(card->dev, "DMic map addition failed: %d\n", ret); + + return ret; +} + static int mt8186_rt5682s_init(struct snd_soc_pcm_runtime *rtd) { struct snd_soc_component *cmpnt_afe = @@ -775,7 +867,7 @@ static struct snd_soc_dai_link mt8186_mt6366_rt1019_rt5682s_dai_links[] = { .dpcm_playback = 1, .dpcm_capture = 1, .ignore_suspend = 1, - .init = mt8186_mt6366_init, + .init = primary_codec_init, SND_SOC_DAILINK_REG(adda), }, { @@ -1015,6 +1107,14 @@ static int mt8186_mt6366_rt1019_rt5682s_dev_probe(struct platform_device *pdev) soc_card_data->mach_priv = mach_priv; + mach_priv->dmic_sel = devm_gpiod_get_optional(&pdev->dev, + "dmic", GPIOD_OUT_LOW); + if (IS_ERR(mach_priv->dmic_sel)) { + dev_err(&pdev->dev, "DMIC gpio failed err=%ld\n", + PTR_ERR(mach_priv->dmic_sel)); + return PTR_ERR(mach_priv->dmic_sel); + } + adsp_node = of_parse_phandle(pdev->dev.of_node, "mediatek,adsp", 0); if (adsp_node) { struct mtk_sof_priv *sof_priv;
Having two DMICs, a front DMIC and a Rear DMIC, but only host audio input AUX port0 is used for these two Dmics. A "dmic-gpios" property is used for a mixer control to switch the dmic signal source between the Front and Rear Dmic. Refer to this one as an example, commit 3cfbf07c6d27 ("ASoC: qcom: sc7180: Modify machine driver for 2mic") Signed-off-by: Ajye Huang <ajye_huang@compal.corp-partner.google.com> --- .../mt8186/mt8186-mt6366-rt1019-rt5682s.c | 102 +++++++++++++++++- 1 file changed, 101 insertions(+), 1 deletion(-)