summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGary Zhang <b13634@freescale.com>2012-02-28 14:50:07 +0800
committerXinyu Chen <b03824@freescale.com>2012-02-29 11:19:59 +0800
commit5fc826be8a63235d83013f8f7e7527be82778ff7 (patch)
treed0ade73e94d27abae12ace4a68f58d4b8f10a05d
parente590d1db41f7d2e74d0bfca8dd21fedb3adbab47 (diff)
ENGR00175219-2 MX6Q_SABRESD: add wm8958 support
add wm8958 codec support Signed-off-by: Gary Zhang <b13634@freescale.com>
-rw-r--r--arch/arm/mach-mx6/board-mx6q_sabresd.c181
1 files changed, 63 insertions, 118 deletions
diff --git a/arch/arm/mach-mx6/board-mx6q_sabresd.c b/arch/arm/mach-mx6/board-mx6q_sabresd.c
index 3fb01004a8ce..5909568f7840 100644
--- a/arch/arm/mach-mx6/board-mx6q_sabresd.c
+++ b/arch/arm/mach-mx6/board-mx6q_sabresd.c
@@ -52,6 +52,8 @@
#include <linux/regulator/machine.h>
#include <linux/regulator/fixed.h>
#include <linux/android_pmem.h>
+#include <linux/mfd/wm8994/pdata.h>
+#include <linux/mfd/wm8994/gpio.h>
#include <mach/common.h>
#include <mach/hardware.h>
@@ -108,6 +110,8 @@
#define MX6Q_SABRESD_CHARGE_CHG_2_B IMX_GPIO_NR(3, 13)
#define MX6Q_SABRESD_CHARGE_UOK_B IMX_GPIO_NR(1, 27)
#define MX6Q_SABRESD_CHARGE_DOK_B IMX_GPIO_NR(2, 24)
+#define MX6Q_SABRESD_WM8958_4V2_EN IMX_GPIO_NR(4, 10)
+#define MX6Q_SABRESD_WM8958_HP_DET IMX_GPIO_NR(7, 8)
#define MX6Q_SABRESD_GPS_EN IMX_GPIO_NR(3, 0)
#define MX6Q_SABRESD_AUX_3V15_EN IMX_GPIO_NR(6, 9)
@@ -125,14 +129,14 @@ extern int __init mx6q_sabresd_init_pfuze100(u32 int_gpio);
static iomux_v3_cfg_t mx6q_sabresd_pads[] = {
/* AUDMUX */
- MX6Q_PAD_SD2_DAT0__AUDMUX_AUD4_RXD,
- MX6Q_PAD_SD2_DAT3__AUDMUX_AUD4_TXC,
- MX6Q_PAD_SD2_DAT2__AUDMUX_AUD4_TXD,
- MX6Q_PAD_SD2_DAT1__AUDMUX_AUD4_TXFS,
+ 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,
/* CAN1 */
MX6Q_PAD_KEY_ROW2__CAN1_RXCAN,
- MX6Q_PAD_KEY_COL2__CAN1_TXCAN,
+ /* MX6Q_PAD_KEY_COL2__CAN1_TXCAN, */
MX6Q_PAD_GPIO_2__GPIO_1_2, /* STNDBY */
MX6Q_PAD_GPIO_7__GPIO_1_7, /* NERR */
@@ -224,7 +228,7 @@ static iomux_v3_cfg_t mx6q_sabresd_pads[] = {
/* GPIO7 */
MX6Q_PAD_GPIO_17__GPIO_7_12, /* USB Hub Reset */
- /* I2C1, SGTL5000 */
+ /* I2C1, WM8958 */
MX6Q_PAD_CSI0_DAT8__I2C1_SDA,
MX6Q_PAD_CSI0_DAT9__I2C1_SCL,
@@ -342,8 +346,13 @@ static iomux_v3_cfg_t mx6q_sabresd_pads[] = {
MX6Q_PAD_EIM_CS1__GPIO_2_24, /* DOK_B */
/* MPCIE_3V3 Enable */
MX6Q_PAD_GPIO_6__GPIO_1_6,
+
+ /* WM8958 */
+ MX6Q_PAD_KEY_COL2__GPIO_4_10, /* CODEC_PWR_EN */
+ MX6Q_PAD_SD3_RST__GPIO_7_8, /* HEADPHONE_DET */
+
/*GPS AUX_3V15_EN*/
- MX6Q_PAD_NANDF_WP_B__GPIO_6_9
+ MX6Q_PAD_NANDF_WP_B__GPIO_6_9,
};
static iomux_v3_cfg_t mx6q_sabresd_csi0_sensor_pads[] = {
@@ -479,11 +488,38 @@ static void spi_device_init(void)
ARRAY_SIZE(imx6_sabresd_spi_nor_device));
}
-static struct mxc_audio_platform_data mx6_sabresd_audio_data;
+static struct imx_ssi_platform_data mx6_sabresd_ssi_pdata = {
+ .flags = IMX_SSI_DMA | IMX_SSI_SYN,
+};
+
+static struct platform_device mx6_sabresd_audio_device = {
+ .name = "imx-wm8958",
+};
-static int mx6_sabresd_sgtl5000_init(void)
+static struct mxc_audio_platform_data wm8958_data = {
+ .ssi_num = 1,
+ .src_port = 2,
+ .ext_port = 3,
+ .hp_gpio = -1,
+};
+
+static struct wm8994_pdata wm8958_pdata = {
+ .gpio_defaults = {
+ [0] = WM8994_GP_FN_GPIO | WM8994_GPN_DB,
+ [1] = WM8994_GP_FN_GPIO | WM8994_GPN_DB | WM8994_GPN_PD,
+ [2] = WM8994_GP_FN_GPIO | WM8994_GPN_DB | WM8994_GPN_PD,
+ [3] = WM8994_GP_FN_GPIO | WM8994_GPN_DB | WM8994_GPN_PD,
+ [4] = WM8994_GP_FN_GPIO | WM8994_GPN_DB | WM8994_GPN_PD,
+ [5] = WM8994_GP_FN_GPIO | WM8994_GPN_DB | WM8994_GPN_PD,
+ [7] = WM8994_GP_FN_GPIO | WM8994_GPN_DB | WM8994_GPN_PD,
+ [8] = WM8994_GP_FN_GPIO | WM8994_GPN_DB | WM8994_GPN_PD,
+ [9] = WM8994_GP_FN_GPIO | WM8994_GPN_DB | WM8994_GPN_PD,
+ [10] = WM8994_GP_FN_GPIO | WM8994_GPN_DB | WM8994_GPN_PD,
+ },
+};
+
+static int mxc_wm8958_init(void)
{
-/*
struct clk *clko;
struct clk *new_parent;
int rate;
@@ -493,40 +529,30 @@ static int mx6_sabresd_sgtl5000_init(void)
pr_err("can't get CLKO clock.\n");
return PTR_ERR(clko);
}
- new_parent = clk_get(NULL, "ahb");
+ new_parent = clk_get(NULL, "ipg_perclk");
if (!IS_ERR(new_parent)) {
clk_set_parent(clko, new_parent);
clk_put(new_parent);
}
- rate = clk_round_rate(clko, 16000000);
- if (rate < 8000000 || rate > 27000000) {
- pr_err("Error:SGTL5000 mclk freq %d out of range!\n", rate);
+ rate = clk_round_rate(clko, 8250000);
+ if (rate < 4000000 || rate > 12500000) {
+ pr_err("Error:WM8958 mclk1 freq %d out of range!\n", rate);
clk_put(clko);
return -1;
}
- mx6_sabresd_audio_data.sysclk = rate;
+ wm8958_data.sysclk = rate;
clk_set_rate(clko, rate);
clk_enable(clko);
-*/
- return 0;
-}
-static struct imx_ssi_platform_data mx6_sabresd_ssi_pdata = {
- .flags = IMX_SSI_DMA | IMX_SSI_SYN,
-};
-
-static struct mxc_audio_platform_data mx6_sabresd_audio_data = {
- .ssi_num = 1,
- .src_port = 2,
- .ext_port = 4,
- .init = mx6_sabresd_sgtl5000_init,
- .hp_gpio = -1,
-};
+ /* enable wm8958 4.2v power supply */
+ gpio_request(MX6Q_SABRESD_WM8958_4V2_EN, "aud_4v2");
+ gpio_direction_output(MX6Q_SABRESD_WM8958_4V2_EN, 1);
+ msleep(1);
+ gpio_set_value(MX6Q_SABRESD_WM8958_4V2_EN, 1);
-static struct platform_device mx6_sabresd_audio_device = {
- .name = "imx-sgtl5000",
-};
+ return 0;
+}
static void mx6q_csi0_cam_powerdown(int powerdown)
{
@@ -616,7 +642,8 @@ static struct fsl_mxc_lightsensor_platform_data ls_data = {
static struct i2c_board_info mxc_i2c0_board_info[] __initdata = {
{
- I2C_BOARD_INFO("sgtl5000", 0x0a),
+ I2C_BOARD_INFO("wm8958", 0x1a),
+ .platform_data = &wm8958_pdata,
},
{
I2C_BOARD_INFO("ov5642", 0x3c),
@@ -951,95 +978,13 @@ static struct platform_device sabresd_vmmc_reg_devices = {
},
};
-#ifdef CONFIG_SND_SOC_SGTL5000
-
-static struct regulator_consumer_supply sgtl5000_sabresd_consumer_vdda = {
- .supply = "VDDA",
- .dev_name = "0-000a",
-};
-
-static struct regulator_consumer_supply sgtl5000_sabresd_consumer_vddio = {
- .supply = "VDDIO",
- .dev_name = "0-000a",
-};
-
-static struct regulator_consumer_supply sgtl5000_sabresd_consumer_vddd = {
- .supply = "VDDD",
- .dev_name = "0-000a",
-};
-
-static struct regulator_init_data sgtl5000_sabresd_vdda_reg_initdata = {
- .num_consumer_supplies = 1,
- .consumer_supplies = &sgtl5000_sabresd_consumer_vdda,
-};
-
-static struct regulator_init_data sgtl5000_sabresd_vddio_reg_initdata = {
- .num_consumer_supplies = 1,
- .consumer_supplies = &sgtl5000_sabresd_consumer_vddio,
-};
-
-static struct regulator_init_data sgtl5000_sabresd_vddd_reg_initdata = {
- .num_consumer_supplies = 1,
- .consumer_supplies = &sgtl5000_sabresd_consumer_vddd,
-};
-
-static struct fixed_voltage_config sgtl5000_sabresd_vdda_reg_config = {
- .supply_name = "VDDA",
- .microvolts = 2500000,
- .gpio = -1,
- .init_data = &sgtl5000_sabresd_vdda_reg_initdata,
-};
-
-static struct fixed_voltage_config sgtl5000_sabresd_vddio_reg_config = {
- .supply_name = "VDDIO",
- .microvolts = 3300000,
- .gpio = -1,
- .init_data = &sgtl5000_sabresd_vddio_reg_initdata,
-};
-
-static struct fixed_voltage_config sgtl5000_sabresd_vddd_reg_config = {
- .supply_name = "VDDD",
- .microvolts = 0,
- .gpio = -1,
- .init_data = &sgtl5000_sabresd_vddd_reg_initdata,
-};
-
-static struct platform_device sgtl5000_sabresd_vdda_reg_devices = {
- .name = "reg-fixed-voltage",
- .id = 0,
- .dev = {
- .platform_data = &sgtl5000_sabresd_vdda_reg_config,
- },
-};
-
-static struct platform_device sgtl5000_sabresd_vddio_reg_devices = {
- .name = "reg-fixed-voltage",
- .id = 1,
- .dev = {
- .platform_data = &sgtl5000_sabresd_vddio_reg_config,
- },
-};
-
-static struct platform_device sgtl5000_sabresd_vddd_reg_devices = {
- .name = "reg-fixed-voltage",
- .id = 2,
- .dev = {
- .platform_data = &sgtl5000_sabresd_vddd_reg_config,
- },
-};
-
-#endif /* CONFIG_SND_SOC_SGTL5000 */
-
static int imx6q_init_audio(void)
{
mxc_register_device(&mx6_sabresd_audio_device,
- &mx6_sabresd_audio_data);
+ &wm8958_data);
imx6q_add_imx_ssi(1, &mx6_sabresd_ssi_pdata);
-#ifdef CONFIG_SND_SOC_SGTL5000
- platform_device_register(&sgtl5000_sabresd_vdda_reg_devices);
- platform_device_register(&sgtl5000_sabresd_vddio_reg_devices);
- platform_device_register(&sgtl5000_sabresd_vddd_reg_devices);
-#endif
+
+ mxc_wm8958_init();
return 0;
}
static void mpcie_3v3_power(bool on)