summaryrefslogtreecommitdiffstats
path: root/sound
diff options
context:
space:
mode:
authorJohn Hsu <KCHSU0@nuvoton.com>2017-02-16 20:55:33 -0500
committerMark Brown <broonie@kernel.org>2017-02-17 05:42:53 -0500
commit1e561f6166bacb9c12d6fa1d23df07999674573e (patch)
treee0ef125cab7e74e8c8374376639f87cf72120d4f /sound
parent566cf877a1fcb6d6dc0126b076aad062054c2637 (diff)
ASoC: nau8825: automatic BCLK and LRC divde in master mode
configurable LRC and BCLK divide. The driver will make configurations of LRC and BCLK automatically according to BCLK and FS information in master mode. Signed-off-by: John Hsu <KCHSU0@nuvoton.com> Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to 'sound')
-rw-r--r--sound/soc/codecs/nau8825.c20
1 files changed, 19 insertions, 1 deletions
diff --git a/sound/soc/codecs/nau8825.c b/sound/soc/codecs/nau8825.c
index 4576f987a4a5..97fbeba9498f 100644
--- a/sound/soc/codecs/nau8825.c
+++ b/sound/soc/codecs/nau8825.c
@@ -1231,7 +1231,7 @@ static int nau8825_hw_params(struct snd_pcm_substream *substream,
1231{ 1231{
1232 struct snd_soc_codec *codec = dai->codec; 1232 struct snd_soc_codec *codec = dai->codec;
1233 struct nau8825 *nau8825 = snd_soc_codec_get_drvdata(codec); 1233 struct nau8825 *nau8825 = snd_soc_codec_get_drvdata(codec);
1234 unsigned int val_len = 0, osr; 1234 unsigned int val_len = 0, osr, ctrl_val, bclk_fs, bclk_div;
1235 1235
1236 nau8825_sema_acquire(nau8825, 3 * HZ); 1236 nau8825_sema_acquire(nau8825, 3 * HZ);
1237 1237
@@ -1261,6 +1261,24 @@ static int nau8825_hw_params(struct snd_pcm_substream *substream,
1261 osr_adc_sel[osr].clk_src << NAU8825_CLK_ADC_SRC_SFT); 1261 osr_adc_sel[osr].clk_src << NAU8825_CLK_ADC_SRC_SFT);
1262 } 1262 }
1263 1263
1264 /* make BCLK and LRC divde configuration if the codec as master. */
1265 regmap_read(nau8825->regmap, NAU8825_REG_I2S_PCM_CTRL2, &ctrl_val);
1266 if (ctrl_val & NAU8825_I2S_MS_MASTER) {
1267 /* get the bclk and fs ratio */
1268 bclk_fs = snd_soc_params_to_bclk(params) / params_rate(params);
1269 if (bclk_fs <= 32)
1270 bclk_div = 2;
1271 else if (bclk_fs <= 64)
1272 bclk_div = 1;
1273 else if (bclk_fs <= 128)
1274 bclk_div = 0;
1275 else
1276 return -EINVAL;
1277 regmap_update_bits(nau8825->regmap, NAU8825_REG_I2S_PCM_CTRL2,
1278 NAU8825_I2S_LRC_DIV_MASK | NAU8825_I2S_BLK_DIV_MASK,
1279 ((bclk_div + 1) << NAU8825_I2S_LRC_DIV_SFT) | bclk_div);
1280 }
1281
1264 switch (params_width(params)) { 1282 switch (params_width(params)) {
1265 case 16: 1283 case 16:
1266 val_len |= NAU8825_I2S_DL_16; 1284 val_len |= NAU8825_I2S_DL_16;