From 963f7290731ee136f0c47537d291d7ee77adec4b Mon Sep 17 00:00:00 2001 From: =?utf8?q?=E5=AE=8B=E7=A7=80=E6=9D=B0?= Date: Fri, 27 Jul 2012 15:06:42 +0800 Subject: [PATCH] rt3261: add headset detect and codec_en control pin. --- arch/arm/mach-rk30/board-rk30-phonepad.c | 57 ++++++++++++++++++++++++ arch/arm/mach-rk30/include/mach/board.h | 11 +++++ sound/soc/codecs/rt3261.c | 9 +++- sound/soc/codecs/rt3261.h | 3 ++ 4 files changed, 79 insertions(+), 1 deletion(-) diff --git a/arch/arm/mach-rk30/board-rk30-phonepad.c b/arch/arm/mach-rk30/board-rk30-phonepad.c index 460168f4620d..be6fdac56827 100755 --- a/arch/arm/mach-rk30/board-rk30-phonepad.c +++ b/arch/arm/mach-rk30/board-rk30-phonepad.c @@ -45,6 +45,7 @@ #include #include #include +#include "../../../drivers/headset_observe/rk_headset.h" #if defined(CONFIG_HDMI_RK30) #include "../../../drivers/video/rockchip/hdmi/rk_hdmi.h" @@ -597,6 +598,40 @@ static struct goodix_i2c_rmi_platform_data ts82x_pdata = { }; #endif +#if defined (CONFIG_RK_HEADSET_DET) || defined (CONFIG_RK_HEADSET_IRQ_HOOK_ADC_DET) + +static int rk_headset_io_init(int gpio, char *iomux_name, int iomux_mode) +{ + int ret; + ret = gpio_request(gpio, NULL); + if(ret) + return ret; + + rk30_mux_api_set(iomux_name, iomux_mode); + gpio_pull_updown(gpio, PullDisable); + gpio_direction_input(gpio); + return 0; +}; + +struct rk_headset_pdata rk_headset_info = { + .Headset_gpio = RK30_PIN0_PC7, + .headset_in_type = HEADSET_IN_HIGH, + .Hook_adc_chn = 2, + .hook_key_code = KEY_MEDIA, + .headset_gpio_info = {GPIO0C7_TRACECTL_SMCADDR3_NAME, GPIO0C_GPIO0C7}, + .headset_io_init = rk_headset_io_init, +}; + +struct platform_device rk_device_headset = { + .name = "rk_headsetdet", + .id = 0, + .dev = { + .platform_data = &rk_headset_info, + } +}; +#endif + + #if defined(CONFIG_TOUCHSCREEN_GT8XX) #define TOUCH_RESET_PIN RK30_PIN4_PD0 #define TOUCH_PWR_PIN INVALID_GPIO @@ -748,6 +783,24 @@ static struct platform_device rk29_device_backlight = { #endif +#ifdef CONFIG_SND_SOC_RT3261 + +static int rt3261_io_init(int gpio, char *iomux_name, int iomux_mode) +{ + gpio_request(gpio,NULL); + rk30_mux_api_set(iomux_name, iomux_mode); + gpio_direction_output(gpio,1); + +}; + +static struct rt3261_platform_data rt3261_info = { + .codec_en_gpio = RK30_PIN4_PD7, + .codec_en_gpio_info = {GPIO4D7_SMCDATA15_TRACEDATA15_NAME,GPIO4D_GPIO4D7}, + .io_init = rt3261_io_init, +}; + +#endif + #ifdef CONFIG_RK29_SUPPORT_MODEM #define RK30_MODEM_POWER RK30_PIN4_PD1 @@ -1574,6 +1627,9 @@ static struct platform_device *devices[] __initdata = { #if defined(CONFIG_SEW868) &rk30_device_sew868, #endif +#if defined (CONFIG_RK_HEADSET_DET) || defined (CONFIG_RK_HEADSET_IRQ_HOOK_ADC_DET) + &rk_device_headset, +#endif #ifdef CONFIG_BATTERY_RK30_ADC &rk30_device_adc_battery, #endif @@ -1653,6 +1709,7 @@ static struct i2c_board_info __initdata i2c0_info[] = { .type = "rt3261", .addr = 0x1c, .flags = 0, + .platform_data = &rt3261_info, }, #endif diff --git a/arch/arm/mach-rk30/include/mach/board.h b/arch/arm/mach-rk30/include/mach/board.h index f4f1c358352d..0db8c627c18a 100755 --- a/arch/arm/mach-rk30/include/mach/board.h +++ b/arch/arm/mach-rk30/include/mach/board.h @@ -62,6 +62,17 @@ struct ft5x0x_platform_data{ }; #endif +struct codec_io_info{ + char iomux_name[50]; + int iomux_mode; +}; + +struct rt3261_platform_data{ + unsigned int codec_en_gpio; + struct codec_io_info codec_en_gpio_info; + int (*io_init)(int, char *, int); +}; + extern struct rk29_sdmmc_platform_data default_sdmmc0_data; extern struct rk29_sdmmc_platform_data default_sdmmc1_data; diff --git a/sound/soc/codecs/rt3261.c b/sound/soc/codecs/rt3261.c index a172c67c1f68..ff82ae6380c7 100644 --- a/sound/soc/codecs/rt3261.c +++ b/sound/soc/codecs/rt3261.c @@ -24,7 +24,7 @@ #include #include #include - +#include #define RT3261_PROC #ifdef RT3261_PROC @@ -2932,11 +2932,18 @@ static int __devinit rt3261_i2c_probe(struct i2c_client *i2c, { struct rt3261_priv *rt3261; int ret; + struct rt3261_platform_data *pdata = pdata = i2c->dev.platform_data; rt3261 = kzalloc(sizeof(struct rt3261_priv), GFP_KERNEL); if (NULL == rt3261) return -ENOMEM; + rt3261->codec_en_gpio = pdata->codec_en_gpio; + rt3261->io_init = pdata->io_init; + + if(rt3261->io_init) + rt3261->io_init(pdata->codec_en_gpio, pdata->codec_en_gpio_info.iomux_name, pdata->codec_en_gpio_info.iomux_mode); + i2c_set_clientdata(i2c, rt3261); DBG("Enter::%s----%d\n",__FUNCTION__,__LINE__); ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_rt3261, diff --git a/sound/soc/codecs/rt3261.h b/sound/soc/codecs/rt3261.h index 06e9bad72260..8f9741869838 100644 --- a/sound/soc/codecs/rt3261.h +++ b/sound/soc/codecs/rt3261.h @@ -2140,6 +2140,9 @@ struct rt3261_priv { int dsp_sw; /* expected parameter setting */ bool dsp_play_pass; bool dsp_rec_pass; + + unsigned int codec_en_gpio; + int (*io_init)(int gpio, char *iomux_name, int iomux_mode); }; int rt3261_conn_mux_path(struct snd_soc_codec *codec, -- 2.34.1