case SNDRV_PCM_FORMAT_S16_LE:
                data_length = 16;
                break;
+       case SNDRV_PCM_FORMAT_S24_LE:
+               data_length = 24;
+               break;
        case SNDRV_PCM_FORMAT_S32_LE:
                data_length = 32;
                break;
        /* Setup the frame format */
        format = BCM2835_I2S_CHEN;
 
-       if (data_length > 24)
+       if (data_length >= 24)
                format |= BCM2835_I2S_CHWEX;
 
        format |= BCM2835_I2S_CHWID((data_length-8)&0xf);
                .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 = {
                .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 = &bcm2835_i2s_dai_ops,