ASoC: RT286: Fix silent at the beginning of stream
authorBard Liao <bardliao@realtek.com>
Mon, 7 Jul 2014 11:15:30 +0000 (19:15 +0800)
committerMark Brown <broonie@linaro.org>
Mon, 7 Jul 2014 14:38:44 +0000 (16:38 +0200)
This patch fix the issue that the output is almost silent at the
beginning of starting a playback.

Signed-off-by: Bard Liao <bardliao@realtek.com>
Signed-off-by: Mark Brown <broonie@linaro.org>
sound/soc/codecs/rt286.c
sound/soc/codecs/rt286.h

index e6f33ab78954a9df24120637db992a0859818b88..81033154a412eebfd4ff5a421e6b89aca2915dfa 100644 (file)
@@ -54,6 +54,7 @@ static struct reg_default rt286_index_def[] = {
        { 0x09, 0xd810 },
        { 0x0a, 0x0060 },
        { 0x0b, 0x0000 },
+       { 0x0d, 0x2800 },
        { 0x0f, 0x0000 },
        { 0x19, 0x0a17 },
        { 0x20, 0x0020 },
@@ -62,6 +63,9 @@ static struct reg_default rt286_index_def[] = {
        { 0x4f, 0x50e9 },
        { 0x50, 0x2c00 },
        { 0x63, 0x2902 },
+       { 0x67, 0x1111 },
+       { 0x68, 0x1016 },
+       { 0x69, 0x273f },
 };
 #define INDEX_CACHE_SIZE ARRAY_SIZE(rt286_index_def)
 
@@ -902,14 +906,23 @@ static int rt286_set_bias_level(struct snd_soc_codec *codec,
 {
        switch (level) {
        case SND_SOC_BIAS_PREPARE:
-               if (SND_SOC_BIAS_STANDBY == codec->dapm.bias_level)
+               if (SND_SOC_BIAS_STANDBY == codec->dapm.bias_level) {
                        snd_soc_write(codec,
                                RT286_SET_AUDIO_POWER, AC_PWRST_D0);
+                       snd_soc_update_bits(codec,
+                               RT286_DC_GAIN, 0x200, 0x200);
+               }
+               break;
+
+       case SND_SOC_BIAS_ON:
+               mdelay(10);
                break;
 
        case SND_SOC_BIAS_STANDBY:
                snd_soc_write(codec,
                        RT286_SET_AUDIO_POWER, AC_PWRST_D3);
+               snd_soc_update_bits(codec,
+                       RT286_DC_GAIN, 0x200, 0x0);
                break;
 
        default:
@@ -1152,6 +1165,11 @@ static int rt286_i2c_probe(struct i2c_client *i2c,
        /*Power down LDO2*/
        regmap_update_bits(rt286->regmap, RT286_POWER_CTRL2, 0x8, 0x0);
 
+       /*Set depop parameter*/
+       regmap_update_bits(rt286->regmap, RT286_DEPOP_CTRL2, 0x403a, 0x401a);
+       regmap_update_bits(rt286->regmap, RT286_DEPOP_CTRL3, 0xf777, 0x4737);
+       regmap_update_bits(rt286->regmap, RT286_DEPOP_CTRL4, 0x00ff, 0x003f);
+
        if (rt286->i2c->irq) {
                regmap_update_bits(rt286->regmap,
                                        RT286_IRQ_CTRL, 0x2, 0x2);
index 21c570f88e9b80c1f7346805e0d259e29ab875f7..b539b7320a79074605fb51b42a3e0a2507dcfc53 100644 (file)
 #define RT286_I2S_CTRL1                0x09
 #define RT286_I2S_CTRL2                0x0a
 #define RT286_CLK_DIV          0x0b
+#define RT286_DC_GAIN          0x0d
 #define RT286_POWER_CTRL3      0x0f
 #define RT286_MIC1_DET_CTRL    0x19
 #define RT286_MISC_CTRL1       0x20
 #define RT286_CBJ_CTRL1                0x4f
 #define RT286_CBJ_CTRL2                0x50
 #define RT286_PLL_CTRL         0x63
+#define RT286_DEPOP_CTRL1      0x66
+#define RT286_DEPOP_CTRL2      0x67
+#define RT286_DEPOP_CTRL3      0x68
+#define RT286_DEPOP_CTRL4      0x69
 
 /* SPDIF (0x06) */
 #define RT286_SPDIF_SEL_SFT    0