From eb51dfda4539393bb6c1417baec7fff373a88905 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=E5=AE=8B=E7=A7=80=E6=9D=B0?= Date: Fri, 2 Nov 2012 13:31:11 +0800 Subject: [PATCH] phonepad: update rt3261 to V1.3, you must set some mode in your board. --- arch/arm/mach-rk30/board-rk30-phonepad.c | 8 +++ arch/arm/mach-rk30/include/mach/board.h | 3 + sound/soc/codecs/rt3261.c | 75 +++++++++++++++++++++--- sound/soc/codecs/rt3261.h | 4 ++ 4 files changed, 83 insertions(+), 7 deletions(-) mode change 100644 => 100755 sound/soc/codecs/rt3261.c mode change 100644 => 100755 sound/soc/codecs/rt3261.h diff --git a/arch/arm/mach-rk30/board-rk30-phonepad.c b/arch/arm/mach-rk30/board-rk30-phonepad.c index 7d637f8ba3db..e0e21caf6812 100755 --- a/arch/arm/mach-rk30/board-rk30-phonepad.c +++ b/arch/arm/mach-rk30/board-rk30-phonepad.c @@ -1156,6 +1156,11 @@ static struct platform_device rk29_device_backlight = { #if defined (CONFIG_SND_SOC_RT3224) || defined (CONFIG_SND_SOC_RT3261) +#define DIFFERENTIAL 1 +#define SINGLE_END 0 +#define TWO_SPK 2 +#define ONE_SPK 1 + static int rt3261_io_init(int gpio, char *iomux_name, int iomux_mode) { gpio_request(gpio,NULL); @@ -1168,6 +1173,9 @@ 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, + .spk_num = TWO_SPK, + .modem_input_mode = DIFFERENTIAL, + .lout_to_modem_mode = DIFFERENTIAL, }; #endif diff --git a/arch/arm/mach-rk30/include/mach/board.h b/arch/arm/mach-rk30/include/mach/board.h index 510ebca6b84c..9b070b853f6a 100644 --- a/arch/arm/mach-rk30/include/mach/board.h +++ b/arch/arm/mach-rk30/include/mach/board.h @@ -111,6 +111,9 @@ struct rt3261_platform_data{ unsigned int codec_en_gpio; struct codec_io_info codec_en_gpio_info; int (*io_init)(int, char *, int); + unsigned int spk_num; + unsigned int modem_input_mode; + unsigned int lout_to_modem_mode; }; extern struct rk29_sdmmc_platform_data default_sdmmc0_data; diff --git a/sound/soc/codecs/rt3261.c b/sound/soc/codecs/rt3261.c old mode 100644 new mode 100755 index 393cf3932695..c06020b0d2fa --- a/sound/soc/codecs/rt3261.c +++ b/sound/soc/codecs/rt3261.c @@ -36,6 +36,10 @@ #endif //#define USE_INT_CLK +#define DIFFERENTIAL 1 +#define SINGLE_END 0 +#define TWO_SPK 2 +#define ONE_SPK 1 static struct snd_soc_codec *rt3261_codec; @@ -61,7 +65,7 @@ static struct snd_soc_codec *rt3261_codec; #define RT3261_REG_RW 1 /* for debug */ #define RT3261_DET_EXT_MIC 0 -#define VERSION "RT3261_V1.2.0" +#define VERSION "RT3261_V1.3.0" #if defined (CONFIG_SND_SOC_RT5623) extern void rt5623_on(void); @@ -109,6 +113,51 @@ static int rt3261_reg_init(struct snd_soc_codec *codec) return 0; } +static int rt3261_customer_redefine(struct snd_soc_codec *codec, struct rt3261_priv *rt3261) +{ + if(rt3261->spk_num==TWO_SPK) + { + snd_soc_update_bits(codec, RT3261_SPO_L_MIXER, + RT3261_M_SV_R_SPM_L | RT3261_M_SV_L_SPM_L, + 1 << RT3261_M_SV_R_SPM_L_SFT | 0 << RT3261_M_SV_L_SPM_L_SFT); + snd_soc_update_bits(codec, RT3261_SPO_R_MIXER, + RT3261_M_SV_R_SPM_R, 0 << RT3261_M_SV_R_SPM_R_SFT); + } + else + { + snd_soc_update_bits(codec, RT3261_SPO_L_MIXER, + RT3261_M_SV_R_SPM_L | RT3261_M_SV_L_SPM_L, + 0 << RT3261_M_SV_R_SPM_L_SFT | 0 << RT3261_M_SV_L_SPM_L_SFT); + snd_soc_update_bits(codec, RT3261_SPO_R_MIXER, + RT3261_M_SV_R_SPM_R, 1 << RT3261_M_SV_R_SPM_R_SFT); + } + + if(rt3261->modem_input_mode==DIFFERENTIAL) + { + snd_soc_update_bits(codec, RT3261_IN3_IN4, + RT3261_IN_DF2, 1 << RT3261_IN_SFT2); + } + else + { + snd_soc_update_bits(codec, RT3261_IN3_IN4, + RT3261_IN_DF2, 0 << RT3261_IN_SFT2); + } + + if(rt3261->lout_to_modem_mode==DIFFERENTIAL) + { + snd_soc_update_bits(codec, RT3261_GEN_CTRL1, + RT3261_LOUT_DF_MASK, 1 << RT3261_LOUT_DF); + } + else + { + snd_soc_update_bits(codec, RT3261_GEN_CTRL1, + RT3261_LOUT_DF_MASK, 0 << RT3261_LOUT_DF); + } + + return 0; +} + + static int rt3261_index_sync(struct snd_soc_codec *codec) { int i; @@ -894,6 +943,18 @@ static int rt3261_modem_input_switch_put(struct snd_kcontrol *kcontrol, return 0; } +#else +static int rt3261_modem_input_switch_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + return 0; +} + +static int rt3261_modem_input_switch_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + return 0; +} #endif static int rt3261_dacr_sel_get(struct snd_kcontrol *kcontrol, @@ -1054,11 +1115,9 @@ static const char *rt3261_hp_mute_mode[] = {"off", "on",}; static const SOC_ENUM_SINGLE_DECL(rt3261_hp_mute_enum, 0, 0, rt3261_hp_mute_mode); -#if defined (CONFIG_SND_SOC_RT5623) static const char *rt3261_modem_input_switch_mode[] = {"off", "on",}; static const SOC_ENUM_SINGLE_DECL(rt3261_modem_input_switch_enum, 0, 0, rt3261_modem_input_switch_mode); -#endif #ifdef RT3261_REG_RW #define REGVAL_MAX 0xffff @@ -1227,10 +1286,8 @@ static const struct snd_kcontrol_new rt3261_snd_controls[] = { SOC_ENUM_EXT("HP mute Switch", rt3261_hp_mute_enum, rt3261_hp_mute_get, rt3261_hp_mute_put), - #if defined (CONFIG_SND_SOC_RT5623) SOC_ENUM_EXT("Modem Input Switch", rt3261_modem_input_switch_enum, rt3261_modem_input_switch_get, rt3261_modem_input_switch_put), - #endif SOC_ENUM("ADC IF1 Data Switch", rt3261_if1_adc_enum), SOC_ENUM("DAC IF1 Data Switch", rt3261_if1_dac_enum), @@ -3147,10 +3204,10 @@ static int rt3261_probe(struct snd_soc_codec *codec) //for rt5623 MCLK use iis_clk = clk_get_sys("rk29_i2s.2", "i2s"); if (IS_ERR(iis_clk)) { - printk("failed to get i2s clk\n"); + DBG("failed to get i2s clk\n"); ret = PTR_ERR(iis_clk); }else{ - printk("I2S2 got i2s clk ok!\n"); + DBG("I2S2 got i2s clk ok!\n"); clk_enable(iis_clk); clk_set_rate(iis_clk, 11289600); rk30_mux_api_set(GPIO0D0_I2S22CHCLK_SMCCSN0_NAME, GPIO0D_I2S2_2CH_CLK); @@ -3198,6 +3255,7 @@ static int rt3261_probe(struct snd_soc_codec *codec) RT3261_PWR_HP_L | RT3261_PWR_HP_R, 0<<7 | 0<<6 ); rt3261_reg_init(codec); + rt3261_customer_redefine(codec, rt3261); codec->dapm.bias_level = SND_SOC_BIAS_STANDBY; rt3261->codec = codec; @@ -3360,6 +3418,9 @@ static int __devinit rt3261_i2c_probe(struct i2c_client *i2c, rt3261->codec_en_gpio = pdata->codec_en_gpio; rt3261->io_init = pdata->io_init; + rt3261->spk_num = pdata->spk_num; + rt3261->modem_input_mode = pdata->modem_input_mode; + rt3261->lout_to_modem_mode = pdata->lout_to_modem_mode; 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); diff --git a/sound/soc/codecs/rt3261.h b/sound/soc/codecs/rt3261.h old mode 100644 new mode 100755 index 2efcf0eea722..b1f90a557ae3 --- a/sound/soc/codecs/rt3261.h +++ b/sound/soc/codecs/rt3261.h @@ -2040,6 +2040,7 @@ enum { #define RT3261_EQ_PST_VOL_SFT 0 /* General Control1 (0xfa) */ +#define RT3261_LOUT_DF_MASK (0x1 << 14) #define RT3261_LOUT_DF 14 #define RT3261_M_MAMIX_L (0x1 << 13) #define RT3261_M_MAMIX_R (0x1 << 12) @@ -2150,6 +2151,9 @@ struct rt3261_priv { int (*io_init)(int gpio, char *iomux_name, int iomux_mode); unsigned int modem_is_open; + unsigned int spk_num; + unsigned int modem_input_mode; + unsigned int lout_to_modem_mode; }; int rt3261_conn_mux_path(struct snd_soc_codec *codec, -- 2.34.1