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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 





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@xxxxxxxxxxxx>
Cc: Rob Barnes <robbarnes@xxxxxxxxxx>
Cc: Eric Peers <epeers@xxxxxxxxxx>
---
  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@xxxxxxx/



[Index of Archives]     [ALSA User]     [Linux Audio Users]     [Pulse Audio]     [Kernel Archive]     [Asterisk PBX]     [Photo Sharing]     [Linux Sound]     [Video 4 Linux]     [Gimp]     [Yosemite News]

  Powered by Linux