phonepad: rt3261 add speaker depop code.
author宋秀杰 <sxj@rock-chips.com>
Mon, 27 Aug 2012 06:51:16 +0000 (14:51 +0800)
committer宋秀杰 <sxj@rock-chips.com>
Mon, 27 Aug 2012 06:51:16 +0000 (14:51 +0800)
sound/soc/codecs/rt3261.c
sound/soc/codecs/rt3261.h
sound/soc/codecs/rt5623.c

index 0f38bf18a5a672614ecea81c6a7499033ecc1b6d..550ba33ed9d9dac84c74cdec0e5fdcae77f64b4c 100644 (file)
@@ -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"},
index b72589f2f7479bf27815eb2c555c6f2bd26ed8df..b6b6cc4c8a12d776cf3379cc6cfa47b123e02623 100644 (file)
@@ -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
index 602ad39870e4a58fd30508ff142bda02b12b4d2b..93678ee0d6b9da8dc346d3b01997b5e22a6af324 100644 (file)
 #include <linux/vmalloc.h>
 #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;
 }