aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBard Liao <bardliao@realtek.com>2017-07-20 01:07:50 -0400
committerMark Brown <broonie@kernel.org>2017-07-20 08:21:28 -0400
commit01dfb1ec15ce6120055401953265c7b51e899292 (patch)
tree6593d04d8dd2c4c71ef97b0d912e73370720445d
parentfa05899c12d54d3a1befa742f62d3188e551a87c (diff)
ASoC: rt5665: add clcok control for master mode
Add i2s clock control for codec master mode. Signed-off-by: Bard Liao <bardliao@realtek.com> Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r--sound/soc/codecs/rt5665.c24
-rw-r--r--sound/soc/codecs/rt5665.h21
2 files changed, 44 insertions, 1 deletions
diff --git a/sound/soc/codecs/rt5665.c b/sound/soc/codecs/rt5665.c
index d3103efcb135..ef27561c4993 100644
--- a/sound/soc/codecs/rt5665.c
+++ b/sound/soc/codecs/rt5665.c
@@ -4186,6 +4186,15 @@ static int rt5665_hw_params(struct snd_pcm_substream *substream,
4186 break; 4186 break;
4187 } 4187 }
4188 4188
4189 if (rt5665->master[RT5665_AIF2_1] || rt5665->master[RT5665_AIF2_2]) {
4190 snd_soc_update_bits(codec, RT5665_I2S_M_CLK_CTRL_1,
4191 RT5665_I2S2_M_PD_MASK, pre_div << RT5665_I2S2_M_PD_SFT);
4192 }
4193 if (rt5665->master[RT5665_AIF3]) {
4194 snd_soc_update_bits(codec, RT5665_I2S_M_CLK_CTRL_1,
4195 RT5665_I2S3_M_PD_MASK, pre_div << RT5665_I2S3_M_PD_SFT);
4196 }
4197
4189 return 0; 4198 return 0;
4190} 4199}
4191 4200
@@ -4262,7 +4271,7 @@ static int rt5665_set_codec_sysclk(struct snd_soc_codec *codec, int clk_id,
4262 int source, unsigned int freq, int dir) 4271 int source, unsigned int freq, int dir)
4263{ 4272{
4264 struct rt5665_priv *rt5665 = snd_soc_codec_get_drvdata(codec); 4273 struct rt5665_priv *rt5665 = snd_soc_codec_get_drvdata(codec);
4265 unsigned int reg_val = 0; 4274 unsigned int reg_val = 0, src = 0;
4266 4275
4267 if (freq == rt5665->sysclk && clk_id == rt5665->sysclk_src) 4276 if (freq == rt5665->sysclk && clk_id == rt5665->sysclk_src)
4268 return 0; 4277 return 0;
@@ -4270,12 +4279,15 @@ static int rt5665_set_codec_sysclk(struct snd_soc_codec *codec, int clk_id,
4270 switch (clk_id) { 4279 switch (clk_id) {
4271 case RT5665_SCLK_S_MCLK: 4280 case RT5665_SCLK_S_MCLK:
4272 reg_val |= RT5665_SCLK_SRC_MCLK; 4281 reg_val |= RT5665_SCLK_SRC_MCLK;
4282 src = RT5665_CLK_SRC_MCLK;
4273 break; 4283 break;
4274 case RT5665_SCLK_S_PLL1: 4284 case RT5665_SCLK_S_PLL1:
4275 reg_val |= RT5665_SCLK_SRC_PLL1; 4285 reg_val |= RT5665_SCLK_SRC_PLL1;
4286 src = RT5665_CLK_SRC_PLL1;
4276 break; 4287 break;
4277 case RT5665_SCLK_S_RCCLK: 4288 case RT5665_SCLK_S_RCCLK:
4278 reg_val |= RT5665_SCLK_SRC_RCCLK; 4289 reg_val |= RT5665_SCLK_SRC_RCCLK;
4290 src = RT5665_CLK_SRC_RCCLK;
4279 break; 4291 break;
4280 default: 4292 default:
4281 dev_err(codec->dev, "Invalid clock id (%d)\n", clk_id); 4293 dev_err(codec->dev, "Invalid clock id (%d)\n", clk_id);
@@ -4283,6 +4295,16 @@ static int rt5665_set_codec_sysclk(struct snd_soc_codec *codec, int clk_id,
4283 } 4295 }
4284 snd_soc_update_bits(codec, RT5665_GLB_CLK, 4296 snd_soc_update_bits(codec, RT5665_GLB_CLK,
4285 RT5665_SCLK_SRC_MASK, reg_val); 4297 RT5665_SCLK_SRC_MASK, reg_val);
4298
4299 if (rt5665->master[RT5665_AIF2_1] || rt5665->master[RT5665_AIF2_2]) {
4300 snd_soc_update_bits(codec, RT5665_I2S_M_CLK_CTRL_1,
4301 RT5665_I2S2_SRC_MASK, src << RT5665_I2S2_SRC_SFT);
4302 }
4303 if (rt5665->master[RT5665_AIF3]) {
4304 snd_soc_update_bits(codec, RT5665_I2S_M_CLK_CTRL_1,
4305 RT5665_I2S3_SRC_MASK, src << RT5665_I2S3_SRC_SFT);
4306 }
4307
4286 rt5665->sysclk = freq; 4308 rt5665->sysclk = freq;
4287 rt5665->sysclk_src = clk_id; 4309 rt5665->sysclk_src = clk_id;
4288 4310
diff --git a/sound/soc/codecs/rt5665.h b/sound/soc/codecs/rt5665.h
index 1db5c6a62a8e..8f08acb9c446 100644
--- a/sound/soc/codecs/rt5665.h
+++ b/sound/soc/codecs/rt5665.h
@@ -1628,6 +1628,27 @@
1628#define RT5665_PWR_CLK1M_PD (0x0 << 8) 1628#define RT5665_PWR_CLK1M_PD (0x0 << 8)
1629#define RT5665_PWR_CLK1M_PU (0x1 << 8) 1629#define RT5665_PWR_CLK1M_PU (0x1 << 8)
1630 1630
1631/* I2S Master Mode Clock Control 1 (0x00a0) */
1632#define RT5665_CLK_SRC_MCLK (0x0)
1633#define RT5665_CLK_SRC_PLL1 (0x1)
1634#define RT5665_CLK_SRC_RCCLK (0x2)
1635#define RT5665_I2S_PD_1 (0x0)
1636#define RT5665_I2S_PD_2 (0x1)
1637#define RT5665_I2S_PD_3 (0x2)
1638#define RT5665_I2S_PD_4 (0x3)
1639#define RT5665_I2S_PD_6 (0x4)
1640#define RT5665_I2S_PD_8 (0x5)
1641#define RT5665_I2S_PD_12 (0x6)
1642#define RT5665_I2S_PD_16 (0x7)
1643#define RT5665_I2S2_SRC_MASK (0x3 << 12)
1644#define RT5665_I2S2_SRC_SFT 12
1645#define RT5665_I2S2_M_PD_MASK (0x7 << 8)
1646#define RT5665_I2S2_M_PD_SFT 8
1647#define RT5665_I2S3_SRC_MASK (0x3 << 4)
1648#define RT5665_I2S3_SRC_SFT 4
1649#define RT5665_I2S3_M_PD_MASK (0x7 << 0)
1650#define RT5665_I2S3_M_PD_SFT 0
1651
1631 1652
1632/* EQ Control 1 (0x00b0) */ 1653/* EQ Control 1 (0x00b0) */
1633#define RT5665_EQ_SRC_DAC (0x0 << 15) 1654#define RT5665_EQ_SRC_DAC (0x0 << 15)