summaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorGary Zhang <b13634@freescale.com>2012-01-20 10:42:38 +0800
committerGary Zhang <b13634@freescale.com>2012-02-01 15:35:19 +0800
commite5fafa3fa3f1bac1cfd09a2a469f4ccd7abcf79e (patch)
treeddda9085cf202f363e9d6355284a6f0db31fd255 /arch
parent4effe7417862b96bfd189889f9c3fb18ae796fee (diff)
ENGR00172395-1 MX6Q_ARM2: add sgtl5000 audio driver
add sgtl5000 platform data. VPC board is used to extend sgtl5000 hardware. Signed-off-by: Gary Zhang <b13634@freescale.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/arm/mach-mx6/Kconfig1
-rw-r--r--arch/arm/mach-mx6/board-mx6q_arm2.c86
-rwxr-xr-xarch/arm/plat-mxc/devices/platform-imx-ssi.c4
3 files changed, 76 insertions, 15 deletions
diff --git a/arch/arm/mach-mx6/Kconfig b/arch/arm/mach-mx6/Kconfig
index 6c3e7a09ce65..83dfa5c33783 100644
--- a/arch/arm/mach-mx6/Kconfig
+++ b/arch/arm/mach-mx6/Kconfig
@@ -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
diff --git a/arch/arm/mach-mx6/board-mx6q_arm2.c b/arch/arm/mach-mx6/board-mx6q_arm2.c
index 26c5caa501a3..497cc23db819 100644
--- a/arch/arm/mach-mx6/board-mx6q_arm2.c
+++ b/arch/arm/mach-mx6/board-mx6q_arm2.c
@@ -109,6 +109,7 @@
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;
diff --git a/arch/arm/plat-mxc/devices/platform-imx-ssi.c b/arch/arm/plat-mxc/devices/platform-imx-ssi.c
index 2ce504fed8bf..6e62967ccabb 100755
--- a/arch/arm/plat-mxc/devices/platform-imx-ssi.c
+++ b/arch/arm/plat-mxc/devices/platform-imx-ssi.c
@@ -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,