ARM: pxa: poodle: use platform data for poodle asoc driver
authorArnd Bergmann <arnd@arndb.de>
Wed, 11 Sep 2019 08:58:26 +0000 (10:58 +0200)
committerArnd Bergmann <arnd@arndb.de>
Sat, 7 May 2022 20:55:47 +0000 (22:55 +0200)
The poodle audio driver shows its age by using a custom
gpio api for the "locomo" support chip.

In a perfect world, this would get converted to use gpiolib
and a gpio lookup table.

As the world is not perfect, just pass all the required data
in a custom platform_data structure. to avoid the globally
visible mach/poodle.h header.

Acked-by: Mark Brown <broonie@kernel.org>
Acked-by: Robert Jarzmik <robert.jarzmik@free.fr>
Cc: alsa-devel@alsa-project.org
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
arch/arm/mach-pxa/include/mach/poodle.h [deleted file]
arch/arm/mach-pxa/poodle.c
arch/arm/mach-pxa/poodle.h [new file with mode: 0644]
include/linux/platform_data/asoc-poodle.h [new file with mode: 0644]
sound/soc/pxa/poodle.c

diff --git a/arch/arm/mach-pxa/include/mach/poodle.h b/arch/arm/mach-pxa/include/mach/poodle.h
deleted file mode 100644 (file)
index b56b193..0000000
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * arch/arm/mach-pxa/include/mach/poodle.h
- *
- * May be copied or modified under the terms of the GNU General Public
- * License.  See linux/COPYING for more information.
- *
- * Based on:
- *   arch/arm/mach-sa1100/include/mach/collie.h
- *
- * ChangeLog:
- *   04-06-2001 Lineo Japan, Inc.
- *   04-16-2001 SHARP Corporation
- *   Update to 2.6 John Lenz
- */
-#ifndef __ASM_ARCH_POODLE_H
-#define __ASM_ARCH_POODLE_H  1
-
-#include "irqs.h" /* PXA_GPIO_TO_IRQ */
-
-/*
- * GPIOs
- */
-/* PXA GPIOs */
-#define POODLE_GPIO_ON_KEY             (0)
-#define POODLE_GPIO_AC_IN              (1)
-#define POODLE_GPIO_CO                 16
-#define POODLE_GPIO_TP_INT             (5)
-#define POODLE_GPIO_TP_CS              (24)
-#define POODLE_GPIO_WAKEUP             (11)    /* change battery */
-#define POODLE_GPIO_GA_INT             (10)
-#define POODLE_GPIO_IR_ON              (22)
-#define POODLE_GPIO_HP_IN              (4)
-#define POODLE_GPIO_CF_IRQ             (17)
-#define POODLE_GPIO_CF_CD              (14)
-#define POODLE_GPIO_CF_STSCHG          (14)
-#define POODLE_GPIO_SD_PWR             (33)
-#define POODLE_GPIO_SD_PWR1            (3)
-#define POODLE_GPIO_nSD_CLK            (6)
-#define POODLE_GPIO_nSD_WP             (7)
-#define POODLE_GPIO_nSD_INT            (8)
-#define POODLE_GPIO_nSD_DETECT         (9)
-#define POODLE_GPIO_MAIN_BAT_LOW       (13)
-#define POODLE_GPIO_BAT_COVER          (13)
-#define POODLE_GPIO_USB_PULLUP         (20)
-#define POODLE_GPIO_ADC_TEMP_ON                (21)
-#define POODLE_GPIO_BYPASS_ON          (36)
-#define POODLE_GPIO_CHRG_ON            (38)
-#define POODLE_GPIO_CHRG_FULL          (16)
-#define POODLE_GPIO_DISCHARGE_ON        (42) /* Enable battery discharge */
-
-/* PXA GPIOs */
-#define POODLE_IRQ_GPIO_ON_KEY         PXA_GPIO_TO_IRQ(0)
-#define POODLE_IRQ_GPIO_AC_IN          PXA_GPIO_TO_IRQ(1)
-#define POODLE_IRQ_GPIO_HP_IN          PXA_GPIO_TO_IRQ(4)
-#define POODLE_IRQ_GPIO_CO             PXA_GPIO_TO_IRQ(16)
-#define POODLE_IRQ_GPIO_TP_INT         PXA_GPIO_TO_IRQ(5)
-#define POODLE_IRQ_GPIO_WAKEUP         PXA_GPIO_TO_IRQ(11)
-#define POODLE_IRQ_GPIO_GA_INT         PXA_GPIO_TO_IRQ(10)
-#define POODLE_IRQ_GPIO_CF_IRQ         PXA_GPIO_TO_IRQ(17)
-#define POODLE_IRQ_GPIO_CF_CD          PXA_GPIO_TO_IRQ(14)
-#define POODLE_IRQ_GPIO_nSD_INT                PXA_GPIO_TO_IRQ(8)
-#define POODLE_IRQ_GPIO_nSD_DETECT     PXA_GPIO_TO_IRQ(9)
-#define POODLE_IRQ_GPIO_MAIN_BAT_LOW   PXA_GPIO_TO_IRQ(13)
-
-/* SCOOP GPIOs */
-#define POODLE_SCOOP_CHARGE_ON SCOOP_GPCR_PA11
-#define POODLE_SCOOP_CP401     SCOOP_GPCR_PA13
-#define POODLE_SCOOP_VPEN      SCOOP_GPCR_PA18
-#define POODLE_SCOOP_L_PCLK    SCOOP_GPCR_PA20
-#define POODLE_SCOOP_L_LCLK    SCOOP_GPCR_PA21
-#define POODLE_SCOOP_HS_OUT    SCOOP_GPCR_PA22
-
-#define POODLE_SCOOP_IO_DIR    ( POODLE_SCOOP_VPEN | POODLE_SCOOP_HS_OUT )
-#define POODLE_SCOOP_IO_OUT    ( 0 )
-
-#define POODLE_SCOOP_GPIO_BASE (PXA_NR_BUILTIN_GPIO)
-#define POODLE_GPIO_CHARGE_ON  (POODLE_SCOOP_GPIO_BASE + 0)
-#define POODLE_GPIO_CP401      (POODLE_SCOOP_GPIO_BASE + 2)
-#define POODLE_GPIO_VPEN       (POODLE_SCOOP_GPIO_BASE + 7)
-#define POODLE_GPIO_L_PCLK     (POODLE_SCOOP_GPIO_BASE + 9)
-#define POODLE_GPIO_L_LCLK     (POODLE_SCOOP_GPIO_BASE + 10)
-#define POODLE_GPIO_HS_OUT     (POODLE_SCOOP_GPIO_BASE + 11)
-
-#define POODLE_LOCOMO_GPIO_AMP_ON      LOCOMO_GPIO(8)
-#define POODLE_LOCOMO_GPIO_MUTE_L      LOCOMO_GPIO(10)
-#define POODLE_LOCOMO_GPIO_MUTE_R      LOCOMO_GPIO(11)
-#define POODLE_LOCOMO_GPIO_232VCC_ON   LOCOMO_GPIO(12)
-#define POODLE_LOCOMO_GPIO_JK_B        LOCOMO_GPIO(13)
-
-#define POODLE_NR_IRQS         (IRQ_BOARD_START + 4)   /* 4 for LoCoMo */
-
-extern struct platform_device poodle_locomo_device;
-
-#endif /* __ASM_ARCH_POODLE_H  */
index ca52882433d4b16ab067561c9693f3f5111a5825..7772a39430ed1b03a3315dd1860b7aec5574e78b 100644 (file)
 #include <asm/mach/irq.h>
 
 #include "pxa25x.h"
-#include <linux/platform_data/mmc-pxamci.h>
 #include "udc.h"
+#include "poodle.h"
+
+#include <linux/platform_data/mmc-pxamci.h>
 #include <linux/platform_data/irda-pxaficp.h>
-#include <mach/poodle.h>
 #include <linux/platform_data/video-pxafb.h>
+#include <linux/platform_data/asoc-poodle.h>
 
 #include <asm/hardware/scoop.h>
 #include <asm/hardware/locomo.h>
@@ -155,12 +157,6 @@ static struct scoop_pcmcia_config poodle_pcmcia_config = {
 
 EXPORT_SYMBOL(poodle_scoop_device);
 
-
-static struct platform_device poodle_audio_device = {
-       .name   = "poodle-audio",
-       .id     = -1,
-};
-
 /* LoCoMo device */
 static struct resource locomo_resources[] = {
        [0] = {
@@ -179,7 +175,7 @@ static struct locomo_platform_data locomo_info = {
        .irq_base       = IRQ_BOARD_START,
 };
 
-struct platform_device poodle_locomo_device = {
+static struct platform_device poodle_locomo_device = {
        .name           = "locomo",
        .id             = 0,
        .num_resources  = ARRAY_SIZE(locomo_resources),
@@ -189,7 +185,21 @@ struct platform_device poodle_locomo_device = {
        },
 };
 
-EXPORT_SYMBOL(poodle_locomo_device);
+static struct poodle_audio_platform_data poodle_audio_pdata = {
+       .locomo_dev     = &poodle_locomo_device.dev,
+
+       .gpio_amp_on    = POODLE_LOCOMO_GPIO_AMP_ON,
+       .gpio_mute_l    = POODLE_LOCOMO_GPIO_MUTE_L,
+       .gpio_mute_r    = POODLE_LOCOMO_GPIO_MUTE_R,
+       .gpio_232vcc_on = POODLE_LOCOMO_GPIO_232VCC_ON,
+       .gpio_jk_b      = POODLE_LOCOMO_GPIO_JK_B,
+};
+
+static struct platform_device poodle_audio_device = {
+       .name   = "poodle-audio",
+       .id     = -1,
+       .dev.platform_data = &poodle_audio_pdata,
+};
 
 #if defined(CONFIG_SPI_PXA2XX) || defined(CONFIG_SPI_PXA2XX_MODULE)
 static struct pxa2xx_spi_controller poodle_spi_info = {
diff --git a/arch/arm/mach-pxa/poodle.h b/arch/arm/mach-pxa/poodle.h
new file mode 100644 (file)
index 0000000..e675a3d
--- /dev/null
@@ -0,0 +1,92 @@
+/*
+ * arch/arm/mach-pxa/include/mach/poodle.h
+ *
+ * May be copied or modified under the terms of the GNU General Public
+ * License.  See linux/COPYING for more information.
+ *
+ * Based on:
+ *   arch/arm/mach-sa1100/include/mach/collie.h
+ *
+ * ChangeLog:
+ *   04-06-2001 Lineo Japan, Inc.
+ *   04-16-2001 SHARP Corporation
+ *   Update to 2.6 John Lenz
+ */
+#ifndef __ASM_ARCH_POODLE_H
+#define __ASM_ARCH_POODLE_H  1
+
+#include <mach/irqs.h> /* PXA_GPIO_TO_IRQ */
+
+/*
+ * GPIOs
+ */
+/* PXA GPIOs */
+#define POODLE_GPIO_ON_KEY             (0)
+#define POODLE_GPIO_AC_IN              (1)
+#define POODLE_GPIO_CO                 16
+#define POODLE_GPIO_TP_INT             (5)
+#define POODLE_GPIO_TP_CS              (24)
+#define POODLE_GPIO_WAKEUP             (11)    /* change battery */
+#define POODLE_GPIO_GA_INT             (10)
+#define POODLE_GPIO_IR_ON              (22)
+#define POODLE_GPIO_HP_IN              (4)
+#define POODLE_GPIO_CF_IRQ             (17)
+#define POODLE_GPIO_CF_CD              (14)
+#define POODLE_GPIO_CF_STSCHG          (14)
+#define POODLE_GPIO_SD_PWR             (33)
+#define POODLE_GPIO_SD_PWR1            (3)
+#define POODLE_GPIO_nSD_CLK            (6)
+#define POODLE_GPIO_nSD_WP             (7)
+#define POODLE_GPIO_nSD_INT            (8)
+#define POODLE_GPIO_nSD_DETECT         (9)
+#define POODLE_GPIO_MAIN_BAT_LOW       (13)
+#define POODLE_GPIO_BAT_COVER          (13)
+#define POODLE_GPIO_USB_PULLUP         (20)
+#define POODLE_GPIO_ADC_TEMP_ON                (21)
+#define POODLE_GPIO_BYPASS_ON          (36)
+#define POODLE_GPIO_CHRG_ON            (38)
+#define POODLE_GPIO_CHRG_FULL          (16)
+#define POODLE_GPIO_DISCHARGE_ON        (42) /* Enable battery discharge */
+
+/* PXA GPIOs */
+#define POODLE_IRQ_GPIO_ON_KEY         PXA_GPIO_TO_IRQ(0)
+#define POODLE_IRQ_GPIO_AC_IN          PXA_GPIO_TO_IRQ(1)
+#define POODLE_IRQ_GPIO_HP_IN          PXA_GPIO_TO_IRQ(4)
+#define POODLE_IRQ_GPIO_CO             PXA_GPIO_TO_IRQ(16)
+#define POODLE_IRQ_GPIO_TP_INT         PXA_GPIO_TO_IRQ(5)
+#define POODLE_IRQ_GPIO_WAKEUP         PXA_GPIO_TO_IRQ(11)
+#define POODLE_IRQ_GPIO_GA_INT         PXA_GPIO_TO_IRQ(10)
+#define POODLE_IRQ_GPIO_CF_IRQ         PXA_GPIO_TO_IRQ(17)
+#define POODLE_IRQ_GPIO_CF_CD          PXA_GPIO_TO_IRQ(14)
+#define POODLE_IRQ_GPIO_nSD_INT                PXA_GPIO_TO_IRQ(8)
+#define POODLE_IRQ_GPIO_nSD_DETECT     PXA_GPIO_TO_IRQ(9)
+#define POODLE_IRQ_GPIO_MAIN_BAT_LOW   PXA_GPIO_TO_IRQ(13)
+
+/* SCOOP GPIOs */
+#define POODLE_SCOOP_CHARGE_ON SCOOP_GPCR_PA11
+#define POODLE_SCOOP_CP401     SCOOP_GPCR_PA13
+#define POODLE_SCOOP_VPEN      SCOOP_GPCR_PA18
+#define POODLE_SCOOP_L_PCLK    SCOOP_GPCR_PA20
+#define POODLE_SCOOP_L_LCLK    SCOOP_GPCR_PA21
+#define POODLE_SCOOP_HS_OUT    SCOOP_GPCR_PA22
+
+#define POODLE_SCOOP_IO_DIR    ( POODLE_SCOOP_VPEN | POODLE_SCOOP_HS_OUT )
+#define POODLE_SCOOP_IO_OUT    ( 0 )
+
+#define POODLE_SCOOP_GPIO_BASE (PXA_NR_BUILTIN_GPIO)
+#define POODLE_GPIO_CHARGE_ON  (POODLE_SCOOP_GPIO_BASE + 0)
+#define POODLE_GPIO_CP401      (POODLE_SCOOP_GPIO_BASE + 2)
+#define POODLE_GPIO_VPEN       (POODLE_SCOOP_GPIO_BASE + 7)
+#define POODLE_GPIO_L_PCLK     (POODLE_SCOOP_GPIO_BASE + 9)
+#define POODLE_GPIO_L_LCLK     (POODLE_SCOOP_GPIO_BASE + 10)
+#define POODLE_GPIO_HS_OUT     (POODLE_SCOOP_GPIO_BASE + 11)
+
+#define POODLE_LOCOMO_GPIO_AMP_ON      LOCOMO_GPIO(8)
+#define POODLE_LOCOMO_GPIO_MUTE_L      LOCOMO_GPIO(10)
+#define POODLE_LOCOMO_GPIO_MUTE_R      LOCOMO_GPIO(11)
+#define POODLE_LOCOMO_GPIO_232VCC_ON   LOCOMO_GPIO(12)
+#define POODLE_LOCOMO_GPIO_JK_B        LOCOMO_GPIO(13)
+
+#define POODLE_NR_IRQS         (IRQ_BOARD_START + 4)   /* 4 for LoCoMo */
+
+#endif /* __ASM_ARCH_POODLE_H  */
diff --git a/include/linux/platform_data/asoc-poodle.h b/include/linux/platform_data/asoc-poodle.h
new file mode 100644 (file)
index 0000000..2052fad
--- /dev/null
@@ -0,0 +1,16 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef __LINUX_PLATFORM_DATA_POODLE_AUDIO
+#define __LINUX_PLATFORM_DATA_POODLE_AUDIO
+
+/* locomo is not a proper gpio driver, and uses its own api */
+struct poodle_audio_platform_data {
+       struct device   *locomo_dev;
+
+       int             gpio_amp_on;
+       int             gpio_mute_l;
+       int             gpio_mute_r;
+       int             gpio_232vcc_on;
+       int             gpio_jk_b;
+};
+
+#endif
index 176a0441235a101b3458b21632f4ce68d59c4db0..5fdaa477e85d27b0e75dc58c157f69ea6f0ec4ac 100644 (file)
@@ -21,8 +21,8 @@
 
 #include <asm/mach-types.h>
 #include <asm/hardware/locomo.h>
-#include <mach/poodle.h>
 #include <linux/platform_data/asoc-pxa.h>
+#include <linux/platform_data/asoc-poodle.h>
 
 #include "../codecs/wm8731.h"
 #include "pxa2xx-i2s.h"
 static int poodle_jack_func;
 static int poodle_spk_func;
 
+static struct poodle_audio_platform_data *poodle_pdata;
+
 static void poodle_ext_control(struct snd_soc_dapm_context *dapm)
 {
        /* set up jack connection */
        if (poodle_jack_func == POODLE_HP) {
                /* set = unmute headphone */
-               locomo_gpio_write(&poodle_locomo_device.dev,
-                       POODLE_LOCOMO_GPIO_MUTE_L, 1);
-               locomo_gpio_write(&poodle_locomo_device.dev,
-                       POODLE_LOCOMO_GPIO_MUTE_R, 1);
+               locomo_gpio_write(poodle_pdata->locomo_dev,
+                       poodle_pdata->gpio_mute_l, 1);
+               locomo_gpio_write(poodle_pdata->locomo_dev,
+                       poodle_pdata->gpio_mute_r, 1);
                snd_soc_dapm_enable_pin(dapm, "Headphone Jack");
        } else {
-               locomo_gpio_write(&poodle_locomo_device.dev,
-                       POODLE_LOCOMO_GPIO_MUTE_L, 0);
-               locomo_gpio_write(&poodle_locomo_device.dev,
-                       POODLE_LOCOMO_GPIO_MUTE_R, 0);
+               locomo_gpio_write(poodle_pdata->locomo_dev,
+                       poodle_pdata->gpio_mute_l, 0);
+               locomo_gpio_write(poodle_pdata->locomo_dev,
+                       poodle_pdata->gpio_mute_r, 0);
                snd_soc_dapm_disable_pin(dapm, "Headphone Jack");
        }
 
@@ -80,10 +82,10 @@ static int poodle_startup(struct snd_pcm_substream *substream)
 static void poodle_shutdown(struct snd_pcm_substream *substream)
 {
        /* set = unmute headphone */
-       locomo_gpio_write(&poodle_locomo_device.dev,
-               POODLE_LOCOMO_GPIO_MUTE_L, 1);
-       locomo_gpio_write(&poodle_locomo_device.dev,
-               POODLE_LOCOMO_GPIO_MUTE_R, 1);
+       locomo_gpio_write(poodle_pdata->locomo_dev,
+               poodle_pdata->gpio_mute_l, 1);
+       locomo_gpio_write(poodle_pdata->locomo_dev,
+               poodle_pdata->gpio_mute_r, 1);
 }
 
 static int poodle_hw_params(struct snd_pcm_substream *substream,
@@ -174,11 +176,11 @@ static int poodle_amp_event(struct snd_soc_dapm_widget *w,
        struct snd_kcontrol *k, int event)
 {
        if (SND_SOC_DAPM_EVENT_ON(event))
-               locomo_gpio_write(&poodle_locomo_device.dev,
-                       POODLE_LOCOMO_GPIO_AMP_ON, 0);
+               locomo_gpio_write(poodle_pdata->locomo_dev,
+                       poodle_pdata->gpio_amp_on, 0);
        else
-               locomo_gpio_write(&poodle_locomo_device.dev,
-                       POODLE_LOCOMO_GPIO_AMP_ON, 1);
+               locomo_gpio_write(poodle_pdata->locomo_dev,
+                       poodle_pdata->gpio_amp_on, 1);
 
        return 0;
 }
@@ -254,13 +256,14 @@ static int poodle_probe(struct platform_device *pdev)
        struct snd_soc_card *card = &poodle;
        int ret;
 
-       locomo_gpio_set_dir(&poodle_locomo_device.dev,
-               POODLE_LOCOMO_GPIO_AMP_ON, 0);
+       poodle_pdata = pdev->dev.platform_data;
+       locomo_gpio_set_dir(poodle_pdata->locomo_dev,
+               poodle_pdata->gpio_amp_on, 0);
        /* should we mute HP at startup - burning power ?*/
-       locomo_gpio_set_dir(&poodle_locomo_device.dev,
-               POODLE_LOCOMO_GPIO_MUTE_L, 0);
-       locomo_gpio_set_dir(&poodle_locomo_device.dev,
-               POODLE_LOCOMO_GPIO_MUTE_R, 0);
+       locomo_gpio_set_dir(poodle_pdata->locomo_dev,
+               poodle_pdata->gpio_mute_l, 0);
+       locomo_gpio_set_dir(poodle_pdata->locomo_dev,
+               poodle_pdata->gpio_mute_r, 0);
 
        card->dev = &pdev->dev;