[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