]> git.ipfire.org Git - people/ms/linux.git/commitdiff
ARM: pxa: eseries: use gpio lookup for audio
authorArnd Bergmann <arnd@arndb.de>
Tue, 17 Sep 2019 12:25:44 +0000 (14:25 +0200)
committerArnd Bergmann <arnd@arndb.de>
Sat, 7 May 2022 20:55:48 +0000 (22:55 +0200)
The three eseries machines have very similar drivers for audio, all
using the mach/eseries-gpio.h header for finding the gpio numbers.

Change these to use gpio descriptors to avoid the header file
dependency.

I convert the _OFF gpio numbers into GPIO_ACTIVE_LOW ones for
consistency here.

Acked-by: Mark Brown <broonie@kernel.org>
Acked-by: Robert Jarzmik <robert.jarzmik@free.fr>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Cc: alsa-devel@alsa-project.org
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
arch/arm/mach-pxa/eseries.c
sound/soc/pxa/e740_wm9705.c
sound/soc/pxa/e750_wm9705.c
sound/soc/pxa/e800_wm9712.c

index 1e9d6bbf45555554c56ea89a92604e24098469be..0955c7b23014e1740d30df7b8c77bd612a3124a7 100644 (file)
@@ -24,6 +24,7 @@
 #include <linux/mtd/rawnand.h>
 #include <linux/mtd/partitions.h>
 #include <linux/memblock.h>
+#include <linux/gpio/machine.h>
 
 #include <video/w100fb.h>
 
@@ -520,6 +521,16 @@ static struct platform_device e740_audio_device = {
        .id             = -1,
 };
 
+static struct gpiod_lookup_table e740_audio_gpio_table = {
+       .dev_id = "e740-audio",
+       .table = {
+               GPIO_LOOKUP("gpio-pxa",  GPIO_E740_WM9705_nAVDD2, "Audio power",  GPIO_ACTIVE_HIGH),
+               GPIO_LOOKUP("gpio-pxa",  GPIO_E740_AMP_ON, "Output amp",  GPIO_ACTIVE_HIGH),
+               GPIO_LOOKUP("gpio-pxa",  GPIO_E740_MIC_ON, "Mic amp", GPIO_ACTIVE_HIGH),
+               { },
+       },
+};
+
 /* ----------------------------------------------------------------------- */
 
 static struct platform_device *e740_devices[] __initdata = {
@@ -540,6 +551,7 @@ static void __init e740_init(void)
                        "UDCCLK", &pxa25x_device_udc.dev),
        eseries_get_tmio_gpios();
        gpiod_add_lookup_table(&e7xx_gpio_vbus_gpiod_table);
+       gpiod_add_lookup_table(&e740_audio_gpio_table);
        platform_add_devices(ARRAY_AND_SIZE(e740_devices));
        pxa_set_ac97_info(NULL);
        pxa_set_ficp_info(&e7xx_ficp_platform_data);
@@ -715,6 +727,15 @@ static struct platform_device e750_tc6393xb_device = {
        .resource      = eseries_tmio_resources,
 };
 
+static struct gpiod_lookup_table e750_audio_gpio_table = {
+       .dev_id = "e750-audio",
+       .table = {
+               GPIO_LOOKUP("gpio-pxa",  GPIO_E750_HP_AMP_OFF, "Output amp",  GPIO_ACTIVE_LOW),
+               GPIO_LOOKUP("gpio-pxa",  GPIO_E750_SPK_AMP_OFF, "Mic amp", GPIO_ACTIVE_LOW),
+               { },
+       },
+};
+
 static struct platform_device e750_audio_device = {
        .name           = "e750-audio",
        .id             = -1,
@@ -739,6 +760,7 @@ static void __init e750_init(void)
                        "GPIO11_CLK", NULL),
        eseries_get_tmio_gpios();
        gpiod_add_lookup_table(&e7xx_gpio_vbus_gpiod_table);
+       gpiod_add_lookup_table(&e750_audio_gpio_table);
        platform_add_devices(ARRAY_AND_SIZE(e750_devices));
        pxa_set_ac97_info(NULL);
        pxa_set_ficp_info(&e7xx_ficp_platform_data);
@@ -933,6 +955,15 @@ static struct platform_device e800_tc6393xb_device = {
        .resource      = eseries_tmio_resources,
 };
 
+static struct gpiod_lookup_table e800_audio_gpio_table = {
+       .dev_id = "e800-audio",
+       .table = {
+               GPIO_LOOKUP("gpio-pxa",  GPIO_E800_HP_AMP_OFF, "Output amp",  GPIO_ACTIVE_LOW),
+               GPIO_LOOKUP("gpio-pxa",  GPIO_E800_SPK_AMP_ON, "Mic amp", GPIO_ACTIVE_HIGH),
+               { },
+       },
+};
+
 static struct platform_device e800_audio_device = {
        .name           = "e800-audio",
        .id             = -1,
@@ -957,6 +988,7 @@ static void __init e800_init(void)
                        "GPIO11_CLK", NULL),
        eseries_get_tmio_gpios();
        gpiod_add_lookup_table(&e800_gpio_vbus_gpiod_table);
+       gpiod_add_lookup_table(&e800_audio_gpio_table);
        platform_add_devices(ARRAY_AND_SIZE(e800_devices));
        pxa_set_ac97_info(NULL);
 }
index f922be7e0016b28f9ecd567ec928859713c720f3..4e0e9b778d4c0a209f3a7655c014a2ec586ce761 100644 (file)
@@ -7,17 +7,19 @@
 
 #include <linux/module.h>
 #include <linux/moduleparam.h>
-#include <linux/gpio.h>
+#include <linux/gpio/consumer.h>
 
 #include <sound/core.h>
 #include <sound/pcm.h>
 #include <sound/soc.h>
 
 #include <linux/platform_data/asoc-pxa.h>
-#include <mach/eseries-gpio.h>
 
 #include <asm/mach-types.h>
 
+static struct gpio_desc *gpiod_output_amp, *gpiod_input_amp;
+static struct gpio_desc *gpiod_audio_power;
+
 #define E740_AUDIO_OUT 1
 #define E740_AUDIO_IN  2
 
@@ -25,9 +27,9 @@ static int e740_audio_power;
 
 static void e740_sync_audio_power(int status)
 {
-       gpio_set_value(GPIO_E740_WM9705_nAVDD2, !status);
-       gpio_set_value(GPIO_E740_AMP_ON, (status & E740_AUDIO_OUT) ? 1 : 0);
-       gpio_set_value(GPIO_E740_MIC_ON, (status & E740_AUDIO_IN) ? 1 : 0);
+       gpiod_set_value(gpiod_audio_power, !status);
+       gpiod_set_value(gpiod_output_amp, (status & E740_AUDIO_OUT) ? 1 : 0);
+       gpiod_set_value(gpiod_input_amp, (status & E740_AUDIO_IN) ? 1 : 0);
 }
 
 static int e740_mic_amp_event(struct snd_soc_dapm_widget *w,
@@ -116,36 +118,35 @@ static struct snd_soc_card e740 = {
        .fully_routed = true,
 };
 
-static struct gpio e740_audio_gpios[] = {
-       { GPIO_E740_MIC_ON, GPIOF_OUT_INIT_LOW, "Mic amp" },
-       { GPIO_E740_AMP_ON, GPIOF_OUT_INIT_LOW, "Output amp" },
-       { GPIO_E740_WM9705_nAVDD2, GPIOF_OUT_INIT_HIGH, "Audio power" },
-};
-
 static int e740_probe(struct platform_device *pdev)
 {
        struct snd_soc_card *card = &e740;
        int ret;
 
-       ret = gpio_request_array(e740_audio_gpios,
-                                ARRAY_SIZE(e740_audio_gpios));
+       gpiod_input_amp  = devm_gpiod_get(&pdev->dev, "Mic amp", GPIOD_OUT_LOW);
+       ret = PTR_ERR_OR_ZERO(gpiod_input_amp);
+       if (ret)
+               return ret;
+       gpiod_output_amp  = devm_gpiod_get(&pdev->dev, "Output amp", GPIOD_OUT_LOW);
+       ret = PTR_ERR_OR_ZERO(gpiod_output_amp);
+       if (ret)
+               return ret;
+       gpiod_audio_power = devm_gpiod_get(&pdev->dev, "Audio power", GPIOD_OUT_HIGH);
+       ret = PTR_ERR_OR_ZERO(gpiod_audio_power);
        if (ret)
                return ret;
 
        card->dev = &pdev->dev;
 
        ret = devm_snd_soc_register_card(&pdev->dev, card);
-       if (ret) {
+       if (ret)
                dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n",
                        ret);
-               gpio_free_array(e740_audio_gpios, ARRAY_SIZE(e740_audio_gpios));
-       }
        return ret;
 }
 
 static int e740_remove(struct platform_device *pdev)
 {
-       gpio_free_array(e740_audio_gpios, ARRAY_SIZE(e740_audio_gpios));
        return 0;
 }
 
index 308828cd736bfd56b9418ca0c7c705bc7aab85cb..7a1e0d8bfd1138f3c612339407913426c76c3517 100644 (file)
@@ -7,24 +7,25 @@
 
 #include <linux/module.h>
 #include <linux/moduleparam.h>
-#include <linux/gpio.h>
+#include <linux/gpio/consumer.h>
 
 #include <sound/core.h>
 #include <sound/pcm.h>
 #include <sound/soc.h>
 
 #include <linux/platform_data/asoc-pxa.h>
-#include <mach/eseries-gpio.h>
 
 #include <asm/mach-types.h>
 
+static struct gpio_desc *gpiod_spk_amp, *gpiod_hp_amp;
+
 static int e750_spk_amp_event(struct snd_soc_dapm_widget *w,
                                struct snd_kcontrol *kcontrol, int event)
 {
        if (event & SND_SOC_DAPM_PRE_PMU)
-               gpio_set_value(GPIO_E750_SPK_AMP_OFF, 0);
+               gpiod_set_value(gpiod_spk_amp, 1);
        else if (event & SND_SOC_DAPM_POST_PMD)
-               gpio_set_value(GPIO_E750_SPK_AMP_OFF, 1);
+               gpiod_set_value(gpiod_spk_amp, 0);
 
        return 0;
 }
@@ -33,9 +34,9 @@ static int e750_hp_amp_event(struct snd_soc_dapm_widget *w,
                                struct snd_kcontrol *kcontrol, int event)
 {
        if (event & SND_SOC_DAPM_PRE_PMU)
-               gpio_set_value(GPIO_E750_HP_AMP_OFF, 0);
+               gpiod_set_value(gpiod_hp_amp, 1);
        else if (event & SND_SOC_DAPM_POST_PMD)
-               gpio_set_value(GPIO_E750_HP_AMP_OFF, 1);
+               gpiod_set_value(gpiod_hp_amp, 0);
 
        return 0;
 }
@@ -100,35 +101,31 @@ static struct snd_soc_card e750 = {
        .fully_routed = true,
 };
 
-static struct gpio e750_audio_gpios[] = {
-       { GPIO_E750_HP_AMP_OFF, GPIOF_OUT_INIT_HIGH, "Headphone amp" },
-       { GPIO_E750_SPK_AMP_OFF, GPIOF_OUT_INIT_HIGH, "Speaker amp" },
-};
-
 static int e750_probe(struct platform_device *pdev)
 {
        struct snd_soc_card *card = &e750;
        int ret;
 
-       ret = gpio_request_array(e750_audio_gpios,
-                                ARRAY_SIZE(e750_audio_gpios));
+       gpiod_hp_amp  = devm_gpiod_get(&pdev->dev, "Headphone amp", GPIOD_OUT_LOW);
+       ret = PTR_ERR_OR_ZERO(gpiod_hp_amp);
+       if (ret)
+               return ret;
+       gpiod_spk_amp  = devm_gpiod_get(&pdev->dev, "Speaker amp", GPIOD_OUT_LOW);
+       ret = PTR_ERR_OR_ZERO(gpiod_spk_amp);
        if (ret)
                return ret;
 
        card->dev = &pdev->dev;
 
        ret = devm_snd_soc_register_card(&pdev->dev, card);
-       if (ret) {
+       if (ret)
                dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n",
                        ret);
-               gpio_free_array(e750_audio_gpios, ARRAY_SIZE(e750_audio_gpios));
-       }
        return ret;
 }
 
 static int e750_remove(struct platform_device *pdev)
 {
-       gpio_free_array(e750_audio_gpios, ARRAY_SIZE(e750_audio_gpios));
        return 0;
 }
 
index d74fcceef68796ed16fe06f1ac4823ace94234d0..a39c494127cf74a05148f7f281625f47eeee303e 100644 (file)
@@ -7,7 +7,7 @@
 
 #include <linux/module.h>
 #include <linux/moduleparam.h>
-#include <linux/gpio.h>
+#include <linux/gpio/consumer.h>
 
 #include <sound/core.h>
 #include <sound/pcm.h>
 
 #include <asm/mach-types.h>
 #include <linux/platform_data/asoc-pxa.h>
-#include <mach/eseries-gpio.h>
+
+static struct gpio_desc *gpiod_spk_amp, *gpiod_hp_amp;
 
 static int e800_spk_amp_event(struct snd_soc_dapm_widget *w,
                                struct snd_kcontrol *kcontrol, int event)
 {
        if (event & SND_SOC_DAPM_PRE_PMU)
-               gpio_set_value(GPIO_E800_SPK_AMP_ON, 1);
+               gpiod_set_value(gpiod_spk_amp, 1);
        else if (event & SND_SOC_DAPM_POST_PMD)
-               gpio_set_value(GPIO_E800_SPK_AMP_ON, 0);
+               gpiod_set_value(gpiod_spk_amp, 0);
 
        return 0;
 }
@@ -32,9 +33,9 @@ static int e800_hp_amp_event(struct snd_soc_dapm_widget *w,
                                struct snd_kcontrol *kcontrol, int event)
 {
        if (event & SND_SOC_DAPM_PRE_PMU)
-               gpio_set_value(GPIO_E800_HP_AMP_OFF, 0);
+               gpiod_set_value(gpiod_hp_amp, 1);
        else if (event & SND_SOC_DAPM_POST_PMD)
-               gpio_set_value(GPIO_E800_HP_AMP_OFF, 1);
+               gpiod_set_value(gpiod_hp_amp, 0);
 
        return 0;
 }
@@ -100,35 +101,31 @@ static struct snd_soc_card e800 = {
        .num_dapm_routes = ARRAY_SIZE(audio_map),
 };
 
-static struct gpio e800_audio_gpios[] = {
-       { GPIO_E800_SPK_AMP_ON, GPIOF_OUT_INIT_HIGH, "Headphone amp" },
-       { GPIO_E800_HP_AMP_OFF, GPIOF_OUT_INIT_HIGH, "Speaker amp" },
-};
-
 static int e800_probe(struct platform_device *pdev)
 {
        struct snd_soc_card *card = &e800;
        int ret;
 
-       ret = gpio_request_array(e800_audio_gpios,
-                                ARRAY_SIZE(e800_audio_gpios));
+       gpiod_hp_amp  = devm_gpiod_get(&pdev->dev, "Headphone amp", GPIOD_OUT_LOW);
+       ret = PTR_ERR_OR_ZERO(gpiod_hp_amp);
+       if (ret)
+               return ret;
+       gpiod_spk_amp  = devm_gpiod_get(&pdev->dev, "Speaker amp", GPIOD_OUT_LOW);
+       ret = PTR_ERR_OR_ZERO(gpiod_spk_amp);
        if (ret)
                return ret;
 
        card->dev = &pdev->dev;
 
        ret = devm_snd_soc_register_card(&pdev->dev, card);
-       if (ret) {
+       if (ret)
                dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n",
                        ret);
-               gpio_free_array(e800_audio_gpios, ARRAY_SIZE(e800_audio_gpios));
-       }
        return ret;
 }
 
 static int e800_remove(struct platform_device *pdev)
 {
-       gpio_free_array(e800_audio_gpios, ARRAY_SIZE(e800_audio_gpios));
        return 0;
 }