diff options
author | Bard Liao <bardliao@realtek.com> | 2017-07-20 01:07:50 -0400 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2017-07-20 08:21:28 -0400 |
commit | 01dfb1ec15ce6120055401953265c7b51e899292 (patch) | |
tree | 6593d04d8dd2c4c71ef97b0d912e73370720445d | |
parent | fa05899c12d54d3a1befa742f62d3188e551a87c (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.c | 24 | ||||
-rw-r--r-- | sound/soc/codecs/rt5665.h | 21 |
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) |