From 8c69ec31715771d7411996321f6cbbe0b266d366 Mon Sep 17 00:00:00 2001 From: Paul Cercueil Date: Fri, 10 Jul 2015 00:20:21 +0200 Subject: [PATCH 1/2] sound: soc: JZ4740: Fix divider written at incorrect offset in register The 4-bit divider value was written at offset 8, while the jz4740 programming manual locates it at offset 0. This fixes a bug in commit 26b0aad80a86d39b8c3a3189fbaf477ef92a64ff Signed-off-by: Paul Cercueil --- sound/soc/jz4740/jz4740-i2s.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sound/soc/jz4740/jz4740-i2s.c b/sound/soc/jz4740/jz4740-i2s.c index b05fb1c1a8483e..23f98744069009 100644 --- a/sound/soc/jz4740/jz4740-i2s.c +++ b/sound/soc/jz4740/jz4740-i2s.c @@ -92,7 +92,7 @@ #define JZ_AIC_I2S_STATUS_BUSY BIT(2) #define JZ_AIC_CLK_DIV_MASK 0xf -#define I2SDIV_DV_SHIFT 8 +#define I2SDIV_DV_SHIFT 0 #define I2SDIV_DV_MASK (0xf << I2SDIV_DV_SHIFT) #define I2SDIV_IDV_SHIFT 8 #define I2SDIV_IDV_MASK (0xf << I2SDIV_IDV_SHIFT) From ab035815984ae607aa7169f13fe5762fed406d75 Mon Sep 17 00:00:00 2001 From: Paul Cercueil Date: Fri, 10 Jul 2015 00:27:15 +0200 Subject: [PATCH 2/2] sound: soc: jz4740: Fix broken audio for !mono sound The jz4780 SoC offers the possibility to configure the number of channels used for playback. Right now, the corresponding bits in the configuration register are always zero, which means that the hardware is only configured for monaural sound. With this commit, the hardware is now correctly configured for the number of channels requested by the ALSA core are. Signed-off-by: Paul Cercueil --- sound/soc/jz4740/jz4740-i2s.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/sound/soc/jz4740/jz4740-i2s.c b/sound/soc/jz4740/jz4740-i2s.c index 23f98744069009..d519022023acea 100644 --- a/sound/soc/jz4740/jz4740-i2s.c +++ b/sound/soc/jz4740/jz4740-i2s.c @@ -65,6 +65,7 @@ #define JZ4780_AIC_CONF_FIFO_TX_THRESHOLD_MASK \ (0x1f << JZ4780_AIC_CONF_FIFO_TX_THRESHOLD_OFFSET) +#define JZ_AIC_CTRL_CHANNELS_MASK (0x7 << 24) #define JZ_AIC_CTRL_OUTPUT_SAMPLE_SIZE_MASK (0x7 << 19) #define JZ_AIC_CTRL_INPUT_SAMPLE_SIZE_MASK (0x7 << 16) #define JZ_AIC_CTRL_ENABLE_RX_DMA BIT(15) @@ -81,6 +82,7 @@ #define JZ_AIC_CTRL_ENABLE_PLAYBACK BIT(1) #define JZ_AIC_CTRL_ENABLE_CAPTURE BIT(0) +#define JZ_AIC_CTRL_CHANNELS_OFFSET 24 #define JZ_AIC_CTRL_OUTPUT_SAMPLE_SIZE_OFFSET 19 #define JZ_AIC_CTRL_INPUT_SAMPLE_SIZE_OFFSET 16 @@ -284,6 +286,12 @@ static int jz4740_i2s_hw_params(struct snd_pcm_substream *substream, else ctrl &= ~JZ_AIC_CTRL_MONO_TO_STEREO; + if (i2s->version >= JZ_I2S_JZ4780) { + ctrl &= ~JZ_AIC_CTRL_CHANNELS_MASK; + ctrl |= (params_channels(params) - 1) << + JZ_AIC_CTRL_CHANNELS_OFFSET; + } + div_reg &= ~I2SDIV_DV_MASK; div_reg |= (div - 1) << I2SDIV_DV_SHIFT; } else {