};
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,
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),
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,
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,
{"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"},
#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)
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)
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);
i2c_client = i2c;
rt5623_reset(i2c);
-
- rt5623_on( );
-
+ status = MODEM_ON;
+ rt5623_off( );
return 0;
}