2016-12-02 10:50:26 +00:00
|
|
|
From 962015d18b8f8dcce75ec843b5a5224c813c3362 Mon Sep 17 00:00:00 2001
|
2016-01-17 10:42:23 +00:00
|
|
|
From: Matthias Reichl <hias@horus.com>
|
|
|
|
Date: Sun, 11 Oct 2015 15:21:16 +0200
|
2016-09-10 12:54:26 +00:00
|
|
|
Subject: [PATCH] bcm2835-i2s: add 24bit support, update bclk_ratio to more
|
|
|
|
correct values
|
2016-01-17 10:42:23 +00:00
|
|
|
|
|
|
|
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,
|