[PATCH] Revert "ASoC: amd: acp: Power on/off the speaker enable gpio pin based on DAPM callback."

Ajit Kumar Pandey AjitKumar.Pandey at amd.com
Mon Jan 31 13:25:32 CET 2022



On 1/29/2022 5:38 AM, Curtis Malainey wrote:
> [CAUTION: External Email]
> 
> This reverts commit 5c5f08f7fc0bee9a1bc3fbdcb7a21cfd0648ab14.
> 
> This commit hard codes GPIO for max98357a drivers at a board specific
> level in the machine driver in the kernel itself. When used with a
> board that properly defines the GPIO pins in ACPI there is a resource
> contention over the GPIO pin and the card fails to probe.
> 
> The amplifier driver has handled this pin lookup long before the
> this change landed and it the pin should continue to be owned by the
> amplifier as it is specific to that component. As a result this should
> be reverted.
> 
> Signed-off-by: Curtis Malainey <cujomalainey at chromium.org>
> Cc: Rob Barnes <robbarnes at google.com>
> Cc: Eric Peers <epeers at google.com>
> ---
>   sound/soc/amd/acp/Kconfig           |  6 +++---
>   sound/soc/amd/acp/acp-legacy-mach.c | 19 +++----------------
>   sound/soc/amd/acp/acp-mach-common.c | 25 -------------------------
>   sound/soc/amd/acp/acp-mach.h        | 10 +---------
>   sound/soc/amd/acp/acp-sof-mach.c    | 21 +++------------------
>   5 files changed, 10 insertions(+), 71 deletions(-)
> 
> diff --git a/sound/soc/amd/acp/Kconfig b/sound/soc/amd/acp/Kconfig
> index d5838df3064b..154be5e70821 100644
> --- a/sound/soc/amd/acp/Kconfig
> +++ b/sound/soc/amd/acp/Kconfig
> @@ -32,7 +32,7 @@ config SND_AMD_ASOC_RENOIR
> 
>   config SND_SOC_AMD_MACH_COMMON
>          tristate
> -       depends on X86 && PCI && I2C && GPIOLIB
> +       depends on X86 && PCI && I2C
>          select CLK_FIXED_FCH
>          select SND_SOC_RT5682_I2C
>          select SND_SOC_DMIC
> @@ -44,14 +44,14 @@ config SND_SOC_AMD_MACH_COMMON
> 
>   config SND_SOC_AMD_LEGACY_MACH
>          tristate "AMD Legacy Machine Driver Support"
> -       depends on X86 && PCI && I2C && GPIOLIB
> +       depends on X86 && PCI && I2C
>          select SND_SOC_AMD_MACH_COMMON
>          help
>            This option enables legacy sound card support for ACP audio.
> 
>   config SND_SOC_AMD_SOF_MACH
>          tristate "AMD SOF Machine Driver Support"
> -       depends on X86 && PCI && I2C && GPIOLIB
> +       depends on X86 && PCI && I2C
>          select SND_SOC_AMD_MACH_COMMON
>          help
>            This option enables SOF sound card support for ACP audio.
> diff --git a/sound/soc/amd/acp/acp-legacy-mach.c b/sound/soc/amd/acp/acp-legacy-mach.c
> index 0ad1cf41b308..de0f8024e2fb 100644
> --- a/sound/soc/amd/acp/acp-legacy-mach.c
> +++ b/sound/soc/amd/acp/acp-legacy-mach.c
> @@ -27,7 +27,6 @@ static struct acp_card_drvdata rt5682_rt1019_data = {
>          .hs_codec_id = RT5682,
>          .amp_codec_id = RT1019,
>          .dmic_codec_id = NONE,
> -       .gpio_spkr_en = EN_SPKR_GPIO_GB,
>   };
> 
>   static const struct snd_kcontrol_new acp_controls[] = {
> @@ -42,16 +41,15 @@ static const struct snd_kcontrol_new acp_controls[] = {
>   static const struct snd_soc_dapm_widget acp_widgets[] = {
>          SND_SOC_DAPM_HP("Headphone Jack", NULL),
>          SND_SOC_DAPM_MIC("Headset Mic", NULL),
> -       SND_SOC_DAPM_SPK("Spk", event_spkr_handler),
> -       SND_SOC_DAPM_SPK("Left Spk", event_spkr_handler),
> -       SND_SOC_DAPM_SPK("Right Spk", event_spkr_handler),
> +       SND_SOC_DAPM_SPK("Spk", NULL),
> +       SND_SOC_DAPM_SPK("Left Spk", NULL),
> +       SND_SOC_DAPM_SPK("Right Spk", NULL),
>   };
> 
>   static int acp_asoc_probe(struct platform_device *pdev)
>   {
>          struct snd_soc_card *card = NULL;
>          struct device *dev = &pdev->dev;
> -       unsigned int spkr_gpio;
>          int ret;
> 
>          if (!pdev->id_entry)
> @@ -69,20 +67,9 @@ static int acp_asoc_probe(struct platform_device *pdev)
>          card->controls = acp_controls;
>          card->num_controls = ARRAY_SIZE(acp_controls);
>          card->drvdata = (struct acp_card_drvdata *)pdev->id_entry->driver_data;
> -       spkr_gpio = ((struct acp_card_drvdata *)(card->drvdata))->gpio_spkr_en;
> 
>          acp_legacy_dai_links_create(card);
> 
> -       if (gpio_is_valid(spkr_gpio)) {
> -               ret = devm_gpio_request(dev, spkr_gpio, "spkren");
> -               if (ret) {
> -                       dev_err(dev, "(%s) gpio request failed: %d\n",
> -                               __func__, ret);
> -                       return ret;
> -               }
> -               gpio_direction_output(spkr_gpio, 0);
> -       }
> -
>          ret = devm_snd_soc_register_card(&pdev->dev, card);
>          if (ret) {
>                  dev_err(&pdev->dev,
> diff --git a/sound/soc/amd/acp/acp-mach-common.c b/sound/soc/amd/acp/acp-mach-common.c
> index c9caade5cb74..7386e5bb61b5 100644
> --- a/sound/soc/amd/acp/acp-mach-common.c
> +++ b/sound/soc/amd/acp/acp-mach-common.c
> @@ -71,31 +71,6 @@ static const struct snd_soc_dapm_route rt5682_map[] = {
>          { "IN1P", NULL, "Headset Mic" },
>   };
> 
> -int event_spkr_handler(struct snd_soc_dapm_widget *w,
> -                       struct snd_kcontrol *k, int event)
> -{
> -       struct snd_soc_dapm_context *dapm = w->dapm;
> -       struct snd_soc_card *card = dapm->card;
> -       struct acp_card_drvdata *drvdata = snd_soc_card_get_drvdata(card);
> -
> -       if (!gpio_is_valid(drvdata->gpio_spkr_en))
> -               return 0;
> -
> -       switch (event) {
> -       case SND_SOC_DAPM_POST_PMU:
> -               gpio_set_value(drvdata->gpio_spkr_en, 1);
> -               break;
> -       case SND_SOC_DAPM_PRE_PMD:
> -               gpio_set_value(drvdata->gpio_spkr_en, 0);
> -               break;
> -       default:
> -               dev_warn(card->dev, "%s invalid setting\n", __func__);
> -               break;
> -       }
> -       return 0;
> -}
> -EXPORT_SYMBOL_NS_GPL(event_spkr_handler, SND_SOC_AMD_MACH);
> -
>   /* Define card ops for RT5682 CODEC */
>   static int acp_card_rt5682_init(struct snd_soc_pcm_runtime *rtd)
>   {
> diff --git a/sound/soc/amd/acp/acp-mach.h b/sound/soc/amd/acp/acp-mach.h
> index fd6299844ebe..5dc47cfbff10 100644
> --- a/sound/soc/amd/acp/acp-mach.h
> +++ b/sound/soc/amd/acp/acp-mach.h
> @@ -17,12 +17,6 @@
>   #include <linux/input.h>
>   #include <linux/module.h>
>   #include <sound/soc.h>
> -#include <linux/gpio.h>
> -#include <linux/gpio/consumer.h>
> -
> -#define EN_SPKR_GPIO_GB                0x11F
> -#define EN_SPKR_GPIO_NK                0x146
> -#define EN_SPKR_GPIO_NONE      -EINVAL
> 
>   enum be_id {
>          HEADSET_BE_ID = 0,
> @@ -55,11 +49,9 @@ struct acp_card_drvdata {
>          unsigned int dai_fmt;
>          struct clk *wclk;
>          struct clk *bclk;
> -       unsigned int gpio_spkr_en;
>   };
> 
>   int acp_sofdsp_dai_links_create(struct snd_soc_card *card);
>   int acp_legacy_dai_links_create(struct snd_soc_card *card);
> -int event_spkr_handler(struct snd_soc_dapm_widget *w,
> -                       struct snd_kcontrol *k, int event);
> +
>   #endif
> diff --git a/sound/soc/amd/acp/acp-sof-mach.c b/sound/soc/amd/acp/acp-sof-mach.c
> index c1d9650fc222..dc2786cc81ef 100644
> --- a/sound/soc/amd/acp/acp-sof-mach.c
> +++ b/sound/soc/amd/acp/acp-sof-mach.c
> @@ -27,7 +27,6 @@ static struct acp_card_drvdata sof_rt5682_rt1019_data = {
>          .hs_codec_id = RT5682,
>          .amp_codec_id = RT1019,
>          .dmic_codec_id = DMIC,
> -       .gpio_spkr_en = EN_SPKR_GPIO_GB,
I guess we still need this for rt1019 codec case as rt1019 codec driver 
is i2c controlled so machine driver need to power off/on spk_en gpio.
>   };
> 
>   static struct acp_card_drvdata sof_rt5682_max_data = {
> @@ -37,7 +36,6 @@ static struct acp_card_drvdata sof_rt5682_max_data = {
>          .hs_codec_id = RT5682,
>          .amp_codec_id = MAX98360A,
>          .dmic_codec_id = DMIC,
> -       .gpio_spkr_en = EN_SPKR_GPIO_NK,
>   };
> 
>   static struct acp_card_drvdata sof_rt5682s_rt1019_data = {
> @@ -56,7 +54,6 @@ static struct acp_card_drvdata sof_rt5682s_max_data = {
>          .hs_codec_id = RT5682S,
>          .amp_codec_id = MAX98360A,
>          .dmic_codec_id = DMIC,
> -       .gpio_spkr_en = EN_SPKR_GPIO_NK,
>   };
> 
>   static const struct snd_kcontrol_new acp_controls[] = {
> @@ -70,16 +67,15 @@ static const struct snd_kcontrol_new acp_controls[] = {
>   static const struct snd_soc_dapm_widget acp_widgets[] = {
>          SND_SOC_DAPM_HP("Headphone Jack", NULL),
>          SND_SOC_DAPM_MIC("Headset Mic", NULL),
> -       SND_SOC_DAPM_SPK("Spk", event_spkr_handler),
> -       SND_SOC_DAPM_SPK("Left Spk", event_spkr_handler),
> -       SND_SOC_DAPM_SPK("Right Spk", event_spkr_handler),
> +       SND_SOC_DAPM_SPK("Spk", NULL),
> +       SND_SOC_DAPM_SPK("Left Spk", NULL),
> +       SND_SOC_DAPM_SPK("Right Spk", NULL),
>   };
> 
>   static int acp_sof_probe(struct platform_device *pdev)
>   {
>          struct snd_soc_card *card = NULL;
>          struct device *dev = &pdev->dev;
> -       unsigned int spkr_gpio;
>          int ret;
> 
>          if (!pdev->id_entry)
> @@ -97,20 +93,9 @@ static int acp_sof_probe(struct platform_device *pdev)
>          card->controls = acp_controls;
>          card->num_controls = ARRAY_SIZE(acp_controls);
>          card->drvdata = (struct acp_card_drvdata *)pdev->id_entry->driver_data;
> -       spkr_gpio = ((struct acp_card_drvdata *)(card->drvdata))->gpio_spkr_en;
> 
>          acp_sofdsp_dai_links_create(card);
> 
> -       if (gpio_is_valid(spkr_gpio)) {
> -               ret = devm_gpio_request(dev, spkr_gpio, "spkren");
> -               if (ret) {
> -                       dev_err(dev, "(%s) gpio request failed: %d\n",
> -                               __func__, ret);
> -                       return ret;
> -               }
> -               gpio_direction_output(spkr_gpio, 0);
> -       }
> -
>          ret = devm_snd_soc_register_card(&pdev->dev, card);
>          if (ret) {
>                  dev_err(&pdev->dev,
> --
> 2.32.0
> 
I feel instead of reverting this complete patch we can quickly submit a 
new patch set with "gpio_spk_en = NONE" for maxim codec case. As codec 
driver is anyhow controlling that gpio we don't need to do it from 
machine driver. We've already done that here 
https://patchwork.kernel.org/project/alsa-devel/patch/20220131203225.1418648-1-vsujithkumar.reddy@amd.com/


More information about the Alsa-devel mailing list