aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sound/soc/jz4740/jz4740-i2s.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/sound/soc/jz4740/jz4740-i2s.c b/sound/soc/jz4740/jz4740-i2s.c
index d3d45c6f064f..b7a7e8295d3c 100644
--- a/sound/soc/jz4740/jz4740-i2s.c
+++ b/sound/soc/jz4740/jz4740-i2s.c
@@ -83,6 +83,8 @@
83#define JZ_AIC_I2S_STATUS_BUSY BIT(2) 83#define JZ_AIC_I2S_STATUS_BUSY BIT(2)
84 84
85#define JZ_AIC_CLK_DIV_MASK 0xf 85#define JZ_AIC_CLK_DIV_MASK 0xf
86#define I2SDIV_DV_SHIFT 8
87#define I2SDIV_DV_MASK (0xf << I2SDIV_DV_SHIFT)
86 88
87struct jz4740_i2s { 89struct jz4740_i2s {
88 struct resource *mem; 90 struct resource *mem;
@@ -237,10 +239,14 @@ static int jz4740_i2s_hw_params(struct snd_pcm_substream *substream,
237{ 239{
238 struct jz4740_i2s *i2s = snd_soc_dai_get_drvdata(dai); 240 struct jz4740_i2s *i2s = snd_soc_dai_get_drvdata(dai);
239 unsigned int sample_size; 241 unsigned int sample_size;
240 uint32_t ctrl; 242 uint32_t ctrl, div_reg;
243 int div;
241 244
242 ctrl = jz4740_i2s_read(i2s, JZ_REG_AIC_CTRL); 245 ctrl = jz4740_i2s_read(i2s, JZ_REG_AIC_CTRL);
243 246
247 div_reg = jz4740_i2s_read(i2s, JZ_REG_AIC_CLK_DIV);
248 div = clk_get_rate(i2s->clk_i2s) / (64 * params_rate(params));
249
244 switch (params_format(params)) { 250 switch (params_format(params)) {
245 case SNDRV_PCM_FORMAT_S8: 251 case SNDRV_PCM_FORMAT_S8:
246 sample_size = 0; 252 sample_size = 0;
@@ -264,7 +270,10 @@ static int jz4740_i2s_hw_params(struct snd_pcm_substream *substream,
264 ctrl |= sample_size << JZ_AIC_CTRL_INPUT_SAMPLE_SIZE_OFFSET; 270 ctrl |= sample_size << JZ_AIC_CTRL_INPUT_SAMPLE_SIZE_OFFSET;
265 } 271 }
266 272
273 div_reg &= ~I2SDIV_DV_MASK;
274 div_reg |= (div - 1) << I2SDIV_DV_SHIFT;
267 jz4740_i2s_write(i2s, JZ_REG_AIC_CTRL, ctrl); 275 jz4740_i2s_write(i2s, JZ_REG_AIC_CTRL, ctrl);
276 jz4740_i2s_write(i2s, JZ_REG_AIC_CLK_DIV, div_reg);
268 277
269 return 0; 278 return 0;
270} 279}