aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/brcm2708/patches-3.14/0040-ASoC-BCM2708-Add-24-bit-support.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/brcm2708/patches-3.14/0040-ASoC-BCM2708-Add-24-bit-support.patch')
-rw-r--r--target/linux/brcm2708/patches-3.14/0040-ASoC-BCM2708-Add-24-bit-support.patch77
1 files changed, 77 insertions, 0 deletions
diff --git a/target/linux/brcm2708/patches-3.14/0040-ASoC-BCM2708-Add-24-bit-support.patch b/target/linux/brcm2708/patches-3.14/0040-ASoC-BCM2708-Add-24-bit-support.patch
new file mode 100644
index 0000000000..bb0dada77b
--- /dev/null
+++ b/target/linux/brcm2708/patches-3.14/0040-ASoC-BCM2708-Add-24-bit-support.patch
@@ -0,0 +1,77 @@
+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
+