brcm2708: update against latest rpi-3.10.y branch
[openwrt.git] / target / linux / brcm2708 / patches-3.10 / 0122-ASoC-BCM2708-Add-24-bit-support.patch
diff --git a/target/linux/brcm2708/patches-3.10/0122-ASoC-BCM2708-Add-24-bit-support.patch b/target/linux/brcm2708/patches-3.10/0122-ASoC-BCM2708-Add-24-bit-support.patch
new file mode 100644 (file)
index 0000000..d80fa34
--- /dev/null
@@ -0,0 +1,72 @@
+From d44c918e6f017acb488bf41c4ab91159ac423084 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 122/174] 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(-)
+
+--- 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
+               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
+       /* 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
+               .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
+               .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,