#define SUN8I_AIF1CLK_CTRL_AIF1_BCLK_DIV               9
 #define SUN8I_AIF1CLK_CTRL_AIF1_LRCK_DIV               6
 #define SUN8I_AIF1CLK_CTRL_AIF1_WORD_SIZ               4
-#define SUN8I_AIF1CLK_CTRL_AIF1_WORD_SIZ_16            (1 << 4)
 #define SUN8I_AIF1CLK_CTRL_AIF1_DATA_FMT               2
 #define SUN8I_AIF1_ADCDAT_CTRL                         0x044
 #define SUN8I_AIF1_ADCDAT_CTRL_AIF1_AD0L_ENA           15
                                 struct snd_soc_dai *dai)
 {
        struct sun8i_codec *scodec = snd_soc_dai_get_drvdata(dai);
-       int sample_rate, lrck_div;
+       int lrck_div, sample_rate, word_size;
        u8 bclk_div;
 
-       /*
-        * The CPU DAI handles only a sample of 16 bits. Configure the
-        * codec to handle this type of sample resolution.
-        */
+       /* word size */
+       switch (params_width(params)) {
+       case 8:
+               word_size = 0x0;
+               break;
+       case 16:
+               word_size = 0x1;
+               break;
+       case 20:
+               word_size = 0x2;
+               break;
+       case 24:
+               word_size = 0x3;
+               break;
+       default:
+               return -EINVAL;
+       }
+
        regmap_update_bits(scodec->regmap, SUN8I_AIF1CLK_CTRL,
                           SUN8I_AIF1CLK_CTRL_AIF1_WORD_SIZ_MASK,
-                          SUN8I_AIF1CLK_CTRL_AIF1_WORD_SIZ_16);
+                          word_size << SUN8I_AIF1CLK_CTRL_AIF1_WORD_SIZ);
 
        bclk_div = sun8i_codec_get_bclk_div(scodec, params_rate(params), 16);
        regmap_update_bits(scodec->regmap, SUN8I_AIF1CLK_CTRL,