Skip to contentSkip to conversation

ASoC: sun4i-codec: fixed 32bit audio capture support for H3/H2+

PATCH New Andrea Bondavalli 2 participants 4 messages Oct 29, 2017 – Oct 31, 2017

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 ASoC: sun4i-codec: fixed 32bit audio capture support for H3/H2+

Fixed support for 32bit audio capture for Allwinner H3/H2+ SoC

---
 sound/soc/sunxi/sun4i-codec.c | 29 ++++++++++++++++++++++++-----
 1 file changed, 24 insertions(+), 5 deletions(-)
sound/soc/sunxi/sun4i-codec.c +24 -5
index baa9007..f40fa34 100644
@@ -346,11 +346,6 @@ static int sun4i_codec_prepare_capture(struct snd_pcm_substream *substream,
 				   0x3 << 8,
 				   0x1 << 8);
 
-	/* Fill most significant bits with valid data MSB */
-	regmap_field_update_bits(scodec->reg_adc_fifoc,
-				 BIT(SUN4I_CODEC_ADC_FIFOC_RX_FIFO_MODE),
-				 BIT(SUN4I_CODEC_ADC_FIFOC_RX_FIFO_MODE));
-
 	return 0;
 }
 
@@ -490,6 +485,30 @@ static int sun4i_codec_hw_params_capture(struct sun4i_codec *scodec,
 					 BIT(SUN4I_CODEC_ADC_FIFOC_MONO_EN),
 					 0);
 
+	/* Set the number of sample bits to either 16 or 24 bits */
+	if (hw_param_interval(params, SNDRV_PCM_HW_PARAM_SAMPLE_BITS)->min == 32) {
+		regmap_field_update_bits(scodec->reg_adc_fifoc,
+				   BIT(SUN4I_CODEC_ADC_FIFOC_RX_SAMPLE_BITS),
+				   BIT(SUN4I_CODEC_ADC_FIFOC_RX_SAMPLE_BITS));
+
+		regmap_field_update_bits(scodec->reg_adc_fifoc,
+				   BIT(SUN4I_CODEC_ADC_FIFOC_RX_FIFO_MODE),
+				   0);
+
+		scodec->capture_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
+	} else {
+		regmap_field_update_bits(scodec->reg_adc_fifoc,
+				   BIT(SUN4I_CODEC_ADC_FIFOC_RX_SAMPLE_BITS),
+				   0);
+
+		/* Fill most significant bits with valid data MSB */
+		regmap_field_update_bits(scodec->reg_adc_fifoc,
+				   BIT(SUN4I_CODEC_ADC_FIFOC_RX_FIFO_MODE),
+				   BIT(SUN4I_CODEC_ADC_FIFOC_RX_FIFO_MODE));
+
+		scodec->capture_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES;
+	}
+
 	return 0;
 }
 
Signature · 6 lines
2.5.0


---
Questa e-mail ? stata controllata per individuare virus con Avast antivirus.
https://www.avast.com/antivirus
#1 lore raw

PATCH 1/1 ASoC: sun4i-codec: fixed 32bit audio capture support for H3/H2+

Quoted 3 lines · Andrea Bondavalli

Fixed support for 32bit audio capture for Allwinner H3/H2+ SoC

A more detailed commit log would be welcome.

What are the issues involved would be the more valuable information, and then how you'ring fixing it and why would be great.

Quoted 36 lines
---
 sound/soc/sunxi/sun4i-codec.c | 29 ++++++++++++++++++++++++-----
 1 file changed, 24 insertions(+), 5 deletions(-)
sound/soc/sunxi/sun4i-codec.c +12 -5
index baa9007..f40fa34 100644
@@ -346,11 +346,6 @@ static int sun4i_codec_prepare_capture(struct snd_pcm_substream *substream,
 				   0x3 << 8,
 				   0x1 << 8);
 
-	/* Fill most significant bits with valid data MSB */
-	regmap_field_update_bits(scodec->reg_adc_fifoc,
-				 BIT(SUN4I_CODEC_ADC_FIFOC_RX_FIFO_MODE),
-				 BIT(SUN4I_CODEC_ADC_FIFOC_RX_FIFO_MODE));
-
 	return 0;
 }
 
@@ -490,6 +485,30 @@ static int sun4i_codec_hw_params_capture(struct sun4i_codec *scodec,
 					 BIT(SUN4I_CODEC_ADC_FIFOC_MONO_EN),
 					 0);
 
+	/* Set the number of sample bits to either 16 or 24 bits */
+	if (hw_param_interval(params, SNDRV_PCM_HW_PARAM_SAMPLE_BITS)->min == 32) {
+		regmap_field_update_bits(scodec->reg_adc_fifoc,
+				   BIT(SUN4I_CODEC_ADC_FIFOC_RX_SAMPLE_BITS),
+				   BIT(SUN4I_CODEC_ADC_FIFOC_RX_SAMPLE_BITS));
+
+		regmap_field_update_bits(scodec->reg_adc_fifoc,
+				   BIT(SUN4I_CODEC_ADC_FIFOC_RX_FIFO_MODE),
+				   0);
+
+		scodec->capture_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
+	} else {

sound/soc/sunxi/sun4i-codec.c static int sun4i_codec_hw_params_capture(struct sun4i_codec *scodec, · line 509

Quoted 10 lines
sound/soc/sunxi/sun4i-codec.c +10 -0
+		regmap_field_update_bits(scodec->reg_adc_fifoc,
+				   BIT(SUN4I_CODEC_ADC_FIFOC_RX_SAMPLE_BITS),
+				   0);
+
+		/* Fill most significant bits with valid data MSB */
+		regmap_field_update_bits(scodec->reg_adc_fifoc,
+				   BIT(SUN4I_CODEC_ADC_FIFOC_RX_FIFO_MODE),
+				   BIT(SUN4I_CODEC_ADC_FIFOC_RX_FIFO_MODE));
+
+		scodec->capture_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES;

Doesn't that break 24 bits?

Maxime

Signature · 10 lines
Maxime Ripard, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 801 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20171030/5f213c2b/attachment.sig>
#2 lore raw

PATCH 1/1 ASoC: sun4i-codec: fixed 32bit audio capture support for H3/H2+

Hello Maxime, everyone,

see comments inline.

Quoted 10 lines · Maxime Ripard
Quoted 3 lines · Andrea Bondavalli

Fixed support for 32bit audio capture for Allwinner H3/H2+ SoC

A more detailed commit log would be welcome.

What are the issues involved would be the more valuable information, and then how you'ring fixing it and why would be great.

H3 audio codec supports 16 and 24 bits capture formats (same for the playback). Switching between these two modes can be achieved by using the RX_SAMPLE_BITS (bit 6) of the AC_ADC_FIFOC register (offset 0x10) of the audio codec.
The RX_FIFO_MODE (bit 24) register must also be set accordingly to have the desired RX FIFO output mode.

The current implementation declares support for 16bit and 32bit (with a resolution of 24bit) capture formats but the 32bit implementation is broken because the RX_SAMPLE_BITS and the RX_FIFO_MODE bits are not set correctly and in addition to this the DMA bus transfer width is left to 2 bytes instead of 4 bytes causing invalid captures whose durating is double than the expected period.

The following patch sets the H3 audio codec registers properly when a 24/32bit capture is requested.
Similar approach was already implemented for the audio playback part.

Quoted 40 lines
Quoted 40 lines
---
 sound/soc/sunxi/sun4i-codec.c | 29 ++++++++++++++++++++++++-----
 1 file changed, 24 insertions(+), 5 deletions(-)
sound/soc/sunxi/sun4i-codec.c +16 -5
index baa9007..f40fa34 100644
@@ -346,11 +346,6 @@ static int sun4i_codec_prepare_capture(struct snd_pcm_substream *substream,
 				   0x3 << 8,
 				   0x1 << 8);
 
-	/* Fill most significant bits with valid data MSB */
-	regmap_field_update_bits(scodec->reg_adc_fifoc,
-				 BIT(SUN4I_CODEC_ADC_FIFOC_RX_FIFO_MODE),
-				 BIT(SUN4I_CODEC_ADC_FIFOC_RX_FIFO_MODE));
-
 	return 0;
 }
 
@@ -490,6 +485,30 @@ static int sun4i_codec_hw_params_capture(struct sun4i_codec *scodec,
 					 BIT(SUN4I_CODEC_ADC_FIFOC_MONO_EN),
 					 0);
 
+	/* Set the number of sample bits to either 16 or 24 bits */
+	if (hw_param_interval(params, SNDRV_PCM_HW_PARAM_SAMPLE_BITS)->min == 32) {
+		regmap_field_update_bits(scodec->reg_adc_fifoc,
+				   BIT(SUN4I_CODEC_ADC_FIFOC_RX_SAMPLE_BITS),
+				   BIT(SUN4I_CODEC_ADC_FIFOC_RX_SAMPLE_BITS));
+
+		regmap_field_update_bits(scodec->reg_adc_fifoc,
+				   BIT(SUN4I_CODEC_ADC_FIFOC_RX_FIFO_MODE),
+				   0);
+
+		scodec->capture_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
+	} else {
+		regmap_field_update_bits(scodec->reg_adc_fifoc,
+				   BIT(SUN4I_CODEC_ADC_FIFOC_RX_SAMPLE_BITS),
+				   0);
+
Quoted 8 lines

sound/soc/sunxi/sun4i-codec.c static int sun4i_codec_hw_params_capture(struct sun4i_codec *scodec, · line 509

Quoted 6 lines
sound/soc/sunxi/sun4i-codec.c +6 -0
+		/* Fill most significant bits with valid data MSB */
+		regmap_field_update_bits(scodec->reg_adc_fifoc,
+				   BIT(SUN4I_CODEC_ADC_FIFOC_RX_FIFO_MODE),
+				   BIT(SUN4I_CODEC_ADC_FIFOC_RX_FIFO_MODE));
+
+		scodec->capture_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES;

Doesn't that break 24 bits?

No. I did tests with 16/24/32bit captures and all seem to work properly now:

arecord -vv -r 48000 -c 2 -f S32_LE /home/root/s32_le.wav  -d 10
arecord -vv -r 48000 -c 2 -f S24_LE /home/root/s24_le.wav  -d 10
arecord -vv -r 48000 -c 2 -f S16_LE /home/root/s16_le.wav  -d 10

For the reasons explained above 24bit and 32bit captures were previously broken.

Quoted 7 lines

Maxime

Signature · 3 lines
Maxime Ripard, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com

Kind regards,
Andrea Bondavalli

#3 lore raw

PATCH 1/1 ASoC: sun4i-codec: fixed 32bit audio capture support for H3/H2+

Quoted 28 lines · Andrea Bondavalli

Hello Maxime, everyone,

see comments inline.

Quoted 10 lines · Maxime Ripard
Quoted 3 lines · Andrea Bondavalli

Fixed support for 32bit audio capture for Allwinner H3/H2+ SoC

A more detailed commit log would be welcome.

What are the issues involved would be the more valuable information, and then how you'ring fixing it and why would be great.

H3 audio codec supports 16 and 24 bits capture formats (same for the playback). Switching between these two modes can be achieved by using the RX_SAMPLE_BITS (bit 6) of the AC_ADC_FIFOC register (offset 0x10) of the audio codec.
The RX_FIFO_MODE (bit 24) register must also be set accordingly to have the desired RX FIFO output mode.

The current implementation declares support for 16bit and 32bit (with a resolution of 24bit) capture formats but the 32bit implementation is broken because the RX_SAMPLE_BITS and the RX_FIFO_MODE bits are not set correctly and in addition to this the DMA bus transfer width is left to 2 bytes instead of 4 bytes causing invalid captures whose durating is double than the expected period.

Quoted 3 lines

The following patch sets the H3 audio codec registers properly when a 24/32bit capture is requested.
Similar approach was already implemented for the audio playback part.

Thanks.

Can you put that in your commit log and resend the patch?

Maxime

Signature · 10 lines
Maxime Ripard, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 801 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20171031/9e6cb033/attachment.sig>