12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- From 962015d18b8f8dcce75ec843b5a5224c813c3362 Mon Sep 17 00:00:00 2001
- From: Matthias Reichl <hias@horus.com>
- Date: Sun, 11 Oct 2015 15:21:16 +0200
- Subject: [PATCH] bcm2835-i2s: add 24bit support, update bclk_ratio to more
- correct values
- Code ported from bcm2708-i2s driver in Raspberry Pi tree.
- RPi commit 62c05a0b5328d9376d39c9e74da10b8a2465c234 ("ASoC: BCM2708:
- Add 24 bit support")
- This adds 24 bit support to the I2S driver of the BCM2708.
- Besides enabling the 24 bit flags, it includes two bug fixes:
- MMAP is not supported. Claiming this leads to strange issues
- when the format of driver and file do not match.
- The datasheet states that the width extension bit should be set
- for widths greater than 24, but greater or equal would be correct.
- This follows from the definition of the width field.
- Signed-off-by: Florian Meier <florian.meier@koalo.de>
- RPi commit 3e8c672bc4e92d457aa4654bbb4cfd79a18a2327 ("bcm2708-i2s:
- Update bclk_ratio to more correct values")
- Discussion about blck_ratio affecting sound quality:
- https://github.com/raspberrypi/linux/issues/681
- Signed-off-by: Matthias Reichl <hias@horus.com>
- ---
- sound/soc/bcm/bcm2835-i2s.c | 12 +++++++++---
- 1 file changed, 9 insertions(+), 3 deletions(-)
- --- a/sound/soc/bcm/bcm2835-i2s.c
- +++ b/sound/soc/bcm/bcm2835-i2s.c
- @@ -340,11 +340,15 @@ static int bcm2835_i2s_hw_params(struct
- switch (params_format(params)) {
- case SNDRV_PCM_FORMAT_S16_LE:
- data_length = 16;
- - bclk_ratio = 40;
- + bclk_ratio = 50;
- + break;
- + case SNDRV_PCM_FORMAT_S24_LE:
- + data_length = 24;
- + bclk_ratio = 50;
- break;
- case SNDRV_PCM_FORMAT_S32_LE:
- data_length = 32;
- - bclk_ratio = 80;
- + bclk_ratio = 100;
- break;
- default:
- return -EINVAL;
- @@ -420,7 +424,7 @@ static int bcm2835_i2s_hw_params(struct
- /* Setup the frame format */
- format = BCM2835_I2S_CHEN;
-
- - if (data_length > 24)
- + if (data_length >= 24)
- format |= BCM2835_I2S_CHWEX;
-
- format |= BCM2835_I2S_CHWID((data_length-8)&0xf);
- @@ -711,6 +715,7 @@ static struct snd_soc_dai_driver bcm2835
- .channels_max = 2,
- .rates = SNDRV_PCM_RATE_8000_192000,
- .formats = SNDRV_PCM_FMTBIT_S16_LE
- + | SNDRV_PCM_FMTBIT_S24_LE
- | SNDRV_PCM_FMTBIT_S32_LE
- },
- .capture = {
- @@ -718,6 +723,7 @@ static struct snd_soc_dai_driver bcm2835
- .channels_max = 2,
- .rates = SNDRV_PCM_RATE_8000_192000,
- .formats = SNDRV_PCM_FMTBIT_S16_LE
- + | SNDRV_PCM_FMTBIT_S24_LE
- | SNDRV_PCM_FMTBIT_S32_LE
- },
- .ops = &bcm2835_i2s_dai_ops,
|