diff --git a/sound/soc/bcm/bcm2708-i2s.c b/sound/soc/bcm/bcm2708-i2s.c index ebaf3d63317cbe..a17921641878a7 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,