From 31c8b8ca6a99418b84ac052924223b29dc52fe57 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=E5=AE=8B=E7=A7=80=E6=9D=B0?= Date: Mon, 27 Aug 2012 14:51:16 +0800 Subject: [PATCH] phonepad: rt3261 add speaker depop code. --- sound/soc/codecs/rt3261.c | 31 ++++++++++++++++++++++++++- sound/soc/codecs/rt3261.h | 1 + sound/soc/codecs/rt5623.c | 45 ++++++++++++++++++++++++--------------- 3 files changed, 59 insertions(+), 18 deletions(-) diff --git a/sound/soc/codecs/rt3261.c b/sound/soc/codecs/rt3261.c index 0f38bf18a5a6..550ba33ed9d9 100644 --- a/sound/soc/codecs/rt3261.c +++ b/sound/soc/codecs/rt3261.c @@ -1256,10 +1256,15 @@ static const struct snd_kcontrol_new rt3261_out_r_mix[] = { }; static const struct snd_kcontrol_new rt3261_spo_l_mix[] = { +#if 0 //org SOC_DAPM_SINGLE("DAC R1 Switch", RT3261_SPO_L_MIXER, RT3261_M_DAC_R1_SPM_L_SFT, 1, 1), SOC_DAPM_SINGLE("DAC L1 Switch", RT3261_SPO_L_MIXER, RT3261_M_DAC_L1_SPM_L_SFT, 1, 1), +#else //bard 8-27 + SOC_DAPM_SINGLE("DAC Switch", RT3261_DUMMY_SPKMIXER, + RT3261_M_DAC_R1_SPM_L_SFT, 1, 1), +#endif SOC_DAPM_SINGLE("SPKVOL R Switch", RT3261_SPO_L_MIXER, RT3261_M_SV_R_SPM_L_SFT, 1, 1), SOC_DAPM_SINGLE("SPKVOL L Switch", RT3261_SPO_L_MIXER, @@ -1267,7 +1272,15 @@ static const struct snd_kcontrol_new rt3261_spo_l_mix[] = { SOC_DAPM_SINGLE("BST1 Switch", RT3261_SPO_L_MIXER, RT3261_M_BST1_SPM_L_SFT, 1, 1), }; +//bard 8-27 s +static const struct snd_kcontrol_new rt3261_spo_dac_mix[] = { + SOC_DAPM_SINGLE("DAC R1 Switch", RT3261_SPO_L_MIXER, + RT3261_M_DAC_R1_SPM_L_SFT, 1, 1), + SOC_DAPM_SINGLE("DAC L1 Switch", RT3261_SPO_L_MIXER, + RT3261_M_DAC_L1_SPM_L_SFT, 1, 1), +}; +//bard 8-27 e static const struct snd_kcontrol_new rt3261_spo_r_mix[] = { SOC_DAPM_SINGLE("DAC R1 Switch", RT3261_SPO_R_MIXER, RT3261_M_DAC_R1_SPM_R_SFT, 1, 1), @@ -1487,9 +1500,18 @@ static int rt3261_spk_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { struct snd_soc_codec *codec = w->codec; + unsigned int val; switch (event) { case SND_SOC_DAPM_POST_PMU: +//bard 8-26 s + val = snd_soc_read(codec, RT3261_PWR_DIG1); + if(val & (RT3261_PWR_DAC_L1 | RT3261_PWR_DAC_R1)) { + snd_soc_update_bits(codec, RT3261_PWR_DIG1, + RT3261_PWR_DAC_L1 | RT3261_PWR_DAC_R1, + RT3261_PWR_DAC_L1 | RT3261_PWR_DAC_R1); + } +//bard 8-26 e snd_soc_update_bits(codec, RT3261_PWR_DIG1, RT3261_PWR_CLS_D, RT3261_PWR_CLS_D); rt3261_index_update_bits(codec, @@ -2066,6 +2088,8 @@ static const struct snd_soc_dapm_widget rt3261_dapm_widgets[] = { 0, rt3261_spo_l_mix, ARRAY_SIZE(rt3261_spo_l_mix)), SND_SOC_DAPM_MIXER("SPOR MIX", SND_SOC_NOPM, 0, 0, rt3261_spo_r_mix, ARRAY_SIZE(rt3261_spo_r_mix)), + SND_SOC_DAPM_MIXER("DAC SPK", SND_SOC_NOPM, 0, + 0, rt3261_spo_dac_mix, ARRAY_SIZE(rt3261_spo_dac_mix)), //bard 8-27 SND_SOC_DAPM_MIXER("HPO MIX", SND_SOC_NOPM, 0, 0, rt3261_hpo_mix, ARRAY_SIZE(rt3261_hpo_mix)), SND_SOC_DAPM_MIXER("LOUT MIX", SND_SOC_NOPM, 0, 0, @@ -2375,9 +2399,14 @@ static const struct snd_soc_dapm_route rt3261_dapm_routes[] = { {"HPOVOL R", NULL, "OUT MIXR"}, {"OUTVOL L", NULL, "OUT MIXL"}, {"OUTVOL R", NULL, "OUT MIXR"}, - +#if 0//org {"SPOL MIX", "DAC R1 Switch", "DAC R1"}, {"SPOL MIX", "DAC L1 Switch", "DAC L1"}, +#else //bard 8-27 + {"SPOL MIX", "DAC Switch", "DAC SPK"}, + {"DAC SPK", "DAC L1 Switch", "DAC L1"}, + {"DAC SPK", "DAC R1 Switch", "DAC R1"}, +#endif {"SPOL MIX", "SPKVOL R Switch", "SPKVOL R"}, {"SPOL MIX", "SPKVOL L Switch", "SPKVOL L"}, {"SPOL MIX", "BST1 Switch", "BST1"}, diff --git a/sound/soc/codecs/rt3261.h b/sound/soc/codecs/rt3261.h index b72589f2f747..b6b6cc4c8a12 100644 --- a/sound/soc/codecs/rt3261.h +++ b/sound/soc/codecs/rt3261.h @@ -24,6 +24,7 @@ #define RT3261_MONO_OUT 0x04 /* Dummy */ #define RT3261_DUMMY_PR3F 0x05 +#define RT3261_DUMMY_SPKMIXER 0x06 /* I/O - Input */ #define RT3261_IN1_IN2 0x0d #define RT3261_IN3_IN4 0x0e diff --git a/sound/soc/codecs/rt5623.c b/sound/soc/codecs/rt5623.c index 602ad39870e4..93678ee0d6b9 100644 --- a/sound/soc/codecs/rt5623.c +++ b/sound/soc/codecs/rt5623.c @@ -34,7 +34,11 @@ #include #endif +#define MODEM_ON 1 +#define MODEM_OFF 0 + static struct i2c_client *i2c_client; +static int status; static int codec_write(struct i2c_client *client, unsigned int reg, unsigned int value) @@ -92,20 +96,20 @@ struct rt5623_reg { static struct rt5623_reg init_data[] = { {RT5623_PWR_MANAG_ADD3 , 0x8000}, {RT5623_PWR_MANAG_ADD2 , 0x2000}, - {RT5623_LINE_IN_VOL , 0xe808}, + {RT5623_LINE_IN_VOL , 0xe808}, {RT5623_STEREO_DAC_VOL , 0x6808}, {RT5623_OUTPUT_MIXER_CTRL , 0x1400}, {RT5623_ADC_REC_GAIN , 0xf58b}, {RT5623_ADC_REC_MIXER , 0x6f6f}, {RT5623_AUDIO_INTERFACE , 0x8083}, - {RT5623_STEREO_AD_DA_CLK_CTRL , 0x0a2d}, + {RT5623_STEREO_AD_DA_CLK_CTRL , 0x0a2d}, {RT5623_PWR_MANAG_ADD1 , 0x8000}, {RT5623_PWR_MANAG_ADD2 , 0xb7f3}, {RT5623_PWR_MANAG_ADD3 , 0x90c0}, - {RT5623_SPK_OUT_VOL , 0x0000}, - {RT5623_PLL_CTRL , 0x481f}, + {RT5623_SPK_OUT_VOL , 0x0000}, + {RT5623_PLL_CTRL , 0x481f}, {RT5623_GLOBAL_CLK_CTRL_REG , 0x8000}, - {RT5623_STEREO_AD_DA_CLK_CTRL , 0x3a2d}, + {RT5623_STEREO_AD_DA_CLK_CTRL , 0x3a2d}, }; #define RT5623_INIT_REG_NUM ARRAY_SIZE(init_data) @@ -127,20 +131,28 @@ static int rt5623_reset(struct i2c_client *client) void rt5623_on(void) { - printk("enter %s\n",__func__); - rt5623_reset(i2c_client); - rt5623_reg_init(i2c_client); + if(status == MODEM_OFF) + { + printk("enter %s\n",__func__); + rt5623_reset(i2c_client); + rt5623_reg_init(i2c_client); + status = MODEM_ON; + } } EXPORT_SYMBOL(rt5623_on); void rt5623_off(void) { - printk("enter %s\n",__func__); - codec_write(i2c_client, RT5623_SPK_OUT_VOL, 0x8080); - rt5623_reset(i2c_client); - codec_write(i2c_client, RT5623_PWR_MANAG_ADD3, 0x0000); - codec_write(i2c_client, RT5623_PWR_MANAG_ADD2, 0x0000); - codec_write(i2c_client, RT5623_PWR_MANAG_ADD1, 0x0000); + if(status == MODEM_ON) + { + printk("enter %s\n",__func__); + codec_write(i2c_client, RT5623_SPK_OUT_VOL, 0x8080); + rt5623_reset(i2c_client); + codec_write(i2c_client, RT5623_PWR_MANAG_ADD3, 0x0000); + codec_write(i2c_client, RT5623_PWR_MANAG_ADD2, 0x0000); + codec_write(i2c_client, RT5623_PWR_MANAG_ADD1, 0x0000); + status = MODEM_OFF; + } } EXPORT_SYMBOL(rt5623_off); @@ -163,9 +175,8 @@ static int __devinit rt5623_i2c_probe(struct i2c_client *i2c, i2c_client = i2c; rt5623_reset(i2c); - - rt5623_on( ); - + status = MODEM_ON; + rt5623_off( ); return 0; } -- 2.34.1