diff options
author | Bard Liao <bardliao@realtek.com> | 2017-03-19 22:20:54 -0400 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2017-03-20 07:25:23 -0400 |
commit | 17febfa6071bc673892edda6b1998ccfc7456c4e (patch) | |
tree | 2b18dc6d7edb287ea9a39c441c342628b58356ec | |
parent | 9b5d3865b3b410d21213807642b47e84a3fc081b (diff) |
ASoC: rt5665: fix wrong pre div reg of IF2 and IF3
The pre divider control register of IF1 and IF2/3 are different.
The driver used the same register for all interfaces which was a
mistake.
Signed-off-by: Bard Liao <bardliao@realtek.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r-- | sound/soc/codecs/rt5665.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/sound/soc/codecs/rt5665.c b/sound/soc/codecs/rt5665.c index 5545d084b0b6..285ec7495379 100644 --- a/sound/soc/codecs/rt5665.c +++ b/sound/soc/codecs/rt5665.c | |||
@@ -4080,7 +4080,7 @@ static int rt5665_hw_params(struct snd_pcm_substream *substream, | |||
4080 | { | 4080 | { |
4081 | struct snd_soc_codec *codec = dai->codec; | 4081 | struct snd_soc_codec *codec = dai->codec; |
4082 | struct rt5665_priv *rt5665 = snd_soc_codec_get_drvdata(codec); | 4082 | struct rt5665_priv *rt5665 = snd_soc_codec_get_drvdata(codec); |
4083 | unsigned int val_len = 0, val_clk, mask_clk, val_bits = 0x0100; | 4083 | unsigned int val_len = 0, val_clk, reg_clk, mask_clk, val_bits = 0x0100; |
4084 | int pre_div, frame_size; | 4084 | int pre_div, frame_size; |
4085 | 4085 | ||
4086 | rt5665->lrck[dai->id] = params_rate(params); | 4086 | rt5665->lrck[dai->id] = params_rate(params); |
@@ -4124,6 +4124,7 @@ static int rt5665_hw_params(struct snd_pcm_substream *substream, | |||
4124 | if (params_channels(params) > 2) | 4124 | if (params_channels(params) > 2) |
4125 | rt5665_set_tdm_slot(dai, 0xf, 0xf, | 4125 | rt5665_set_tdm_slot(dai, 0xf, 0xf, |
4126 | params_channels(params), params_width(params)); | 4126 | params_channels(params), params_width(params)); |
4127 | reg_clk = RT5665_ADDA_CLK_1; | ||
4127 | mask_clk = RT5665_I2S_PD1_MASK; | 4128 | mask_clk = RT5665_I2S_PD1_MASK; |
4128 | val_clk = pre_div << RT5665_I2S_PD1_SFT; | 4129 | val_clk = pre_div << RT5665_I2S_PD1_SFT; |
4129 | snd_soc_update_bits(codec, RT5665_I2S1_SDP, | 4130 | snd_soc_update_bits(codec, RT5665_I2S1_SDP, |
@@ -4131,12 +4132,14 @@ static int rt5665_hw_params(struct snd_pcm_substream *substream, | |||
4131 | break; | 4132 | break; |
4132 | case RT5665_AIF2_1: | 4133 | case RT5665_AIF2_1: |
4133 | case RT5665_AIF2_2: | 4134 | case RT5665_AIF2_2: |
4135 | reg_clk = RT5665_ADDA_CLK_2; | ||
4134 | mask_clk = RT5665_I2S_PD2_MASK; | 4136 | mask_clk = RT5665_I2S_PD2_MASK; |
4135 | val_clk = pre_div << RT5665_I2S_PD2_SFT; | 4137 | val_clk = pre_div << RT5665_I2S_PD2_SFT; |
4136 | snd_soc_update_bits(codec, RT5665_I2S2_SDP, | 4138 | snd_soc_update_bits(codec, RT5665_I2S2_SDP, |
4137 | RT5665_I2S_DL_MASK, val_len); | 4139 | RT5665_I2S_DL_MASK, val_len); |
4138 | break; | 4140 | break; |
4139 | case RT5665_AIF3: | 4141 | case RT5665_AIF3: |
4142 | reg_clk = RT5665_ADDA_CLK_2; | ||
4140 | mask_clk = RT5665_I2S_PD3_MASK; | 4143 | mask_clk = RT5665_I2S_PD3_MASK; |
4141 | val_clk = pre_div << RT5665_I2S_PD3_SFT; | 4144 | val_clk = pre_div << RT5665_I2S_PD3_SFT; |
4142 | snd_soc_update_bits(codec, RT5665_I2S3_SDP, | 4145 | snd_soc_update_bits(codec, RT5665_I2S3_SDP, |
@@ -4147,7 +4150,7 @@ static int rt5665_hw_params(struct snd_pcm_substream *substream, | |||
4147 | return -EINVAL; | 4150 | return -EINVAL; |
4148 | } | 4151 | } |
4149 | 4152 | ||
4150 | snd_soc_update_bits(codec, RT5665_ADDA_CLK_1, mask_clk, val_clk); | 4153 | snd_soc_update_bits(codec, reg_clk, mask_clk, val_clk); |
4151 | snd_soc_update_bits(codec, RT5665_STO1_DAC_SIL_DET, 0x3700, val_bits); | 4154 | snd_soc_update_bits(codec, RT5665_STO1_DAC_SIL_DET, 0x3700, val_bits); |
4152 | 4155 | ||
4153 | switch (rt5665->lrck[dai->id]) { | 4156 | switch (rt5665->lrck[dai->id]) { |