case 16:
                width = DMA_SLAVE_BUSWIDTH_2_BYTES;
                break;
+       case 32:
+               width = DMA_SLAVE_BUSWIDTH_4_BYTES;
+               break;
        default:
                dev_err(dai->dev, "Unsupported physical sample width: %d\n",
                        params_physical_width(params));
        return 0;
 }
 
+#define SUN4I_FORMATS  (SNDRV_PCM_FMTBIT_S16_LE | \
+                        SNDRV_PCM_FMTBIT_S20_LE | \
+                        SNDRV_PCM_FMTBIT_S24_LE)
+
 static struct snd_soc_dai_driver sun4i_i2s_dai = {
        .probe = sun4i_i2s_dai_probe,
        .capture = {
                .channels_min = 1,
                .channels_max = 8,
                .rates = SNDRV_PCM_RATE_8000_192000,
-               .formats = SNDRV_PCM_FMTBIT_S16_LE,
+               .formats = SUN4I_FORMATS,
        },
        .playback = {
                .stream_name = "Playback",
                .channels_min = 1,
                .channels_max = 8,
                .rates = SNDRV_PCM_RATE_8000_192000,
-               .formats = SNDRV_PCM_FMTBIT_S16_LE,
+               .formats = SUN4I_FORMATS,
        },
        .ops = &sun4i_i2s_dai_ops,
        .symmetric_rates = 1,