diff options
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.patch | 77 |
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 + |