]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
ENGR00172395-1 MX6Q_ARM2: add sgtl5000 audio driver
authorGary Zhang <b13634@freescale.com>
Fri, 20 Jan 2012 02:42:38 +0000 (10:42 +0800)
committerLothar Waßmann <LW@KARO-electronics.de>
Fri, 24 May 2013 06:33:53 +0000 (08:33 +0200)
add sgtl5000 platform data.
VPC board is used to extend sgtl5000 hardware.

Signed-off-by: Gary Zhang <b13634@freescale.com>
arch/arm/mach-mx6/Kconfig
arch/arm/mach-mx6/board-mx6q_arm2.c
arch/arm/plat-mxc/devices/platform-imx-ssi.c

index 6c3e7a09ce65e70791e8bf652895eacbe30fe7e2..83dfa5c3378359945caf93a167c76981d32a58d5 100644 (file)
@@ -37,6 +37,7 @@ config MACH_MX6Q_ARM2
        select IMX_HAVE_PLATFORM_IMX_VPU
        select IMX_HAVE_PLATFORM_IMX_DVFS
        select IMX_HAVE_PLATFORM_IMX_ESAI
+       select IMX_HAVE_PLATFORM_IMX_SSI
        select IMX_HAVE_PLATFORM_IMX_ANATOP_THERMAL
        select IMX_HAVE_PLATFORM_FSL_USB2_UDC
        select IMX_HAVE_PLATFORM_MXC_EHCI
index 26c5caa501a3cf5f74e4178ecc07548d23cdbc3a..497cc23db81974626450200037c4473abe83a9ac 100644 (file)
 void __init early_console_setup(unsigned long base, struct clk *clk);
 static struct clk *sata_clk;
 static int esai_record;
+static int sgtl5000_en;
 static int spdif_en;
 static int flexcan_en;
 
@@ -358,6 +359,15 @@ static iomux_v3_cfg_t mx6q_arm2_mipi_sensor_pads[] = {
        MX6Q_PAD_CSI0_MCLK__CCM_CLKO,
 };
 
+static iomux_v3_cfg_t mx6q_arm2_audmux_pads[] = {
+
+       /* AUDMUX */
+       MX6Q_PAD_CSI0_DAT4__AUDMUX_AUD3_TXC,
+       MX6Q_PAD_CSI0_DAT5__AUDMUX_AUD3_TXD,
+       MX6Q_PAD_CSI0_DAT6__AUDMUX_AUD3_TXFS,
+       MX6Q_PAD_CSI0_DAT7__AUDMUX_AUD3_RXD,
+};
+
 #define MX6Q_USDHC_PAD_SETTING(id, speed)      \
 mx6q_sd##id##_##speed##mhz[] = {               \
        MX6Q_PAD_SD##id##_CLK__USDHC##id##_CLK_##speed##MHZ,    \
@@ -697,9 +707,10 @@ static struct fsl_mxc_dvi_platform_data sabr_ddc_dvi_data = {
 
 static void mx6q_csi0_io_init(void)
 {
-       mxc_iomux_v3_setup_multiple_pads(mx6q_arm2_csi0_sensor_pads,
+       if (0 == sgtl5000_en) {
+               mxc_iomux_v3_setup_multiple_pads(mx6q_arm2_csi0_sensor_pads,
                        ARRAY_SIZE(mx6q_arm2_csi0_sensor_pads));
-
+       }
        /* Camera reset */
        gpio_request(MX6Q_ARM2_CSI0_RST, "cam-reset");
        gpio_direction_output(MX6Q_ARM2_CSI0_RST, 1);
@@ -735,9 +746,10 @@ static struct fsl_mxc_camera_platform_data camera_data = {
 
 static void mx6q_csi0_tvin_io_init(void)
 {
-       mxc_iomux_v3_setup_multiple_pads(mx6q_arm2_csi0_tvin_pads,
+       if (0 == sgtl5000_en) {
+               mxc_iomux_v3_setup_multiple_pads(mx6q_arm2_csi0_tvin_pads,
                        ARRAY_SIZE(mx6q_arm2_csi0_tvin_pads));
-
+       }
        /* Tvin reset */
        gpio_request(MX6Q_ARM2_CSI0_RST_TVIN, "tvin-reset");
        gpio_direction_output(MX6Q_ARM2_CSI0_RST_TVIN, 1);
@@ -829,6 +841,9 @@ static struct i2c_board_info mxc_i2c1_board_info[] __initdata = {
                I2C_BOARD_INFO("ov5640_mipi", 0x3c),
                .platform_data = (void *)&ov5640_mipi_data,
        },
+       {
+               I2C_BOARD_INFO("sgtl5000", 0x0a),
+       },
 };
 
 static void imx6q_arm2_usbotg_vbus(bool on)
@@ -1280,17 +1295,17 @@ static struct platform_device cs42888_arm2_vlc_reg_devices = {
 
 static struct regulator_consumer_supply sgtl5000_arm2_consumer_vdda = {
        .supply = "VDDA",
-       .dev_name = "0-000a",
+       .dev_name = "1-000a",
 };
 
 static struct regulator_consumer_supply sgtl5000_arm2_consumer_vddio = {
        .supply = "VDDIO",
-       .dev_name = "0-000a",
+       .dev_name = "1-000a",
 };
 
 static struct regulator_consumer_supply sgtl5000_arm2_consumer_vddd = {
        .supply = "VDDD",
-       .dev_name = "0-000a",
+       .dev_name = "1-000a",
 };
 
 static struct regulator_init_data sgtl5000_arm2_vdda_reg_initdata = {
@@ -1355,6 +1370,32 @@ static struct platform_device sgtl5000_arm2_vddd_reg_devices = {
 
 #endif /* CONFIG_SND_SOC_SGTL5000 */
 
+static struct mxc_audio_platform_data mx6_arm2_audio_data;
+
+static int mx6_arm2_sgtl5000_init(void)
+{
+
+       mx6_arm2_audio_data.sysclk = 12000000;
+
+       return 0;
+}
+
+static struct imx_ssi_platform_data mx6_arm2_ssi_pdata = {
+       .flags = IMX_SSI_DMA | IMX_SSI_SYN,
+};
+
+static struct mxc_audio_platform_data mx6_arm2_audio_data = {
+       .ssi_num = 1,
+       .src_port = 2,
+       .ext_port = 3,
+       .init = mx6_arm2_sgtl5000_init,
+       .hp_gpio = -1,
+};
+
+static struct platform_device mx6_arm2_audio_device = {
+       .name = "imx-sgtl5000",
+};
+
 static int __init imx6q_init_audio(void)
 {
        struct clk *pll3_pfd, *esai_clk;
@@ -1372,18 +1413,29 @@ static int __init imx6q_init_audio(void)
        clk_set_parent(esai_clk, pll3_pfd);
        clk_set_rate(esai_clk, 101647058);
 
+#ifdef CONFIG_SND_SOC_CS42888
+               platform_device_register(&cs42888_arm2_va_reg_devices);
+               platform_device_register(&cs42888_arm2_vd_reg_devices);
+               platform_device_register(&cs42888_arm2_vls_reg_devices);
+               platform_device_register(&cs42888_arm2_vlc_reg_devices);
+#endif
+
+       if (sgtl5000_en) {
+               /* SSI audio init part */
+               mxc_register_device(&mx6_arm2_audio_device,
+                               &mx6_arm2_audio_data);
+               imx6q_add_imx_ssi(1, &mx6_arm2_ssi_pdata);
+
+               mxc_iomux_v3_setup_multiple_pads(mx6q_arm2_audmux_pads,
+                       ARRAY_SIZE(mx6q_arm2_audmux_pads));
+
 #ifdef CONFIG_SND_SOC_SGTL5000
        platform_device_register(&sgtl5000_arm2_vdda_reg_devices);
        platform_device_register(&sgtl5000_arm2_vddio_reg_devices);
        platform_device_register(&sgtl5000_arm2_vddd_reg_devices);
 #endif
+       }
 
-#ifdef CONFIG_SND_SOC_CS42888
-       platform_device_register(&cs42888_arm2_va_reg_devices);
-       platform_device_register(&cs42888_arm2_vd_reg_devices);
-       platform_device_register(&cs42888_arm2_vls_reg_devices);
-       platform_device_register(&cs42888_arm2_vlc_reg_devices);
-#endif
        return 0;
 }
 
@@ -1429,6 +1481,14 @@ static void __init fixup_mxc_board(struct machine_desc *desc, struct tag *tags,
 {
 }
 
+static int __init early_enable_sgtl5000(char *p)
+{
+       sgtl5000_en = 1;
+       return 0;
+}
+
+early_param("sgtl5000", early_enable_sgtl5000);
+
 static int __init early_enable_spdif(char *p)
 {
        spdif_en = 1;
index 2ce504fed8bf1897803e99aafdb988c159e4663d..6e62967ccabb56f7e4b78a1b9e346792838a3007 100755 (executable)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Pengutronix
+ * Copyright (C) 2010-2012 Pengutronix
  * Uwe Kleine-Koenig <u.kleine-koenig@pengutronix.de>
  *
  * This program is free software; you can redistribute it and/or modify it under
@@ -94,7 +94,7 @@ const struct imx_imx_ssi_data imx6_imx_ssi_data[] __initconst = {
        imx6q_imx_ssi_data_entry(1, 2),
        imx6q_imx_ssi_data_entry(2, 3),
 };
-#endif /* ifdef CONFIG_SOC_IMX53 */
+#endif /* ifdef CONFIG_SOC_IMX6Q */
 
 struct platform_device *__init imx_add_imx_ssi(
                const struct imx_imx_ssi_data *data,