diff options
| -rw-r--r-- | sound/soc/jz4740/jz4740-i2s.c | 11 |
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 | ||
| 87 | struct jz4740_i2s { | 89 | struct 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 | } |
