78 lines
2.5 KiB
Diff
78 lines
2.5 KiB
Diff
|
From 5b06b2affe65b243dd828aeac9f48854902b1823 Mon Sep 17 00:00:00 2001
|
||
|
From: Florian Meier <florian.meier@koalo.de>
|
||
|
Date: Fri, 6 Dec 2013 18:55:53 +0100
|
||
|
Subject: [PATCH 40/54] 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>
|
||
|
---
|
||
|
sound/soc/bcm/bcm2708-i2s.c | 13 +++++++++----
|
||
|
1 file changed, 9 insertions(+), 4 deletions(-)
|
||
|
|
||
|
diff --git a/sound/soc/bcm/bcm2708-i2s.c b/sound/soc/bcm/bcm2708-i2s.c
|
||
|
index ebaf3d6..a179216 100644
|
||
|
--- a/sound/soc/bcm/bcm2708-i2s.c
|
||
|
+++ b/sound/soc/bcm/bcm2708-i2s.c
|
||
|
@@ -346,6 +346,10 @@ static int bcm2708_i2s_hw_params(struct snd_pcm_substream *substream,
|
||
|
data_length = 16;
|
||
|
bclk_ratio = 40;
|
||
|
break;
|
||
|
+ case SNDRV_PCM_FORMAT_S24_LE:
|
||
|
+ data_length = 24;
|
||
|
+ bclk_ratio = 40;
|
||
|
+ break;
|
||
|
case SNDRV_PCM_FORMAT_S32_LE:
|
||
|
data_length = 32;
|
||
|
bclk_ratio = 80;
|
||
|
@@ -424,7 +428,7 @@ static int bcm2708_i2s_hw_params(struct snd_pcm_substream *substream,
|
||
|
/* Setup the frame format */
|
||
|
format = BCM2708_I2S_CHEN;
|
||
|
|
||
|
- if (data_length > 24)
|
||
|
+ if (data_length >= 24)
|
||
|
format |= BCM2708_I2S_CHWEX;
|
||
|
|
||
|
format |= BCM2708_I2S_CHWID((data_length-8)&0xf);
|
||
|
@@ -714,6 +718,7 @@ static struct snd_soc_dai_driver bcm2708_i2s_dai = {
|
||
|
.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 = {
|
||
|
@@ -721,6 +726,7 @@ static struct snd_soc_dai_driver bcm2708_i2s_dai = {
|
||
|
.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 = &bcm2708_i2s_dai_ops,
|
||
|
@@ -810,11 +816,10 @@ static void bcm2708_i2s_setup_gpio(void)
|
||
|
}
|
||
|
|
||
|
static const struct snd_pcm_hardware bcm2708_pcm_hardware = {
|
||
|
- .info = SNDRV_PCM_INFO_MMAP |
|
||
|
- SNDRV_PCM_INFO_MMAP_VALID |
|
||
|
- SNDRV_PCM_INFO_INTERLEAVED |
|
||
|
+ .info = SNDRV_PCM_INFO_INTERLEAVED |
|
||
|
SNDRV_PCM_INFO_JOINT_DUPLEX,
|
||
|
.formats = SNDRV_PCM_FMTBIT_S16_LE |
|
||
|
+ SNDRV_PCM_FMTBIT_S24_LE |
|
||
|
SNDRV_PCM_FMTBIT_S32_LE,
|
||
|
.period_bytes_min = 32,
|
||
|
.period_bytes_max = 64 * PAGE_SIZE,
|
||
|
--
|
||
|
1.9.1
|
||
|
|