return IRQ_HANDLED;
 }
 
+static int fsl_sai_set_dai_tdm_slot(struct snd_soc_dai *cpu_dai, u32 tx_mask,
+                               u32 rx_mask, int slots, int slot_width)
+{
+       struct fsl_sai *sai = snd_soc_dai_get_drvdata(cpu_dai);
+
+       sai->slots = slots;
+       sai->slot_width = slot_width;
+
+       return 0;
+}
+
 static int fsl_sai_set_dai_sysclk_tr(struct snd_soc_dai *cpu_dai,
                int clk_id, unsigned int freq, int fsl_dir)
 {
        unsigned int channels = params_channels(params);
        u32 word_width = snd_pcm_format_width(params_format(params));
        u32 val_cr4 = 0, val_cr5 = 0;
+       u32 slots = (channels == 1) ? 2 : channels;
+       u32 slot_width = word_width;
        int ret;
 
+       if (sai->slots)
+               slots = sai->slots;
+
+       if (sai->slot_width)
+               slot_width = sai->slot_width;
+
        if (!sai->is_slave_mode) {
                ret = fsl_sai_set_bclk(cpu_dai, tx,
-                       2 * word_width * params_rate(params));
+                               slots * slot_width * params_rate(params));
                if (ret)
                        return ret;
 
 
                        sai->mclk_streams |= BIT(substream->stream);
                }
-
        }
 
        if (!sai->is_dsp_mode)
-               val_cr4 |= FSL_SAI_CR4_SYWD(word_width);
+               val_cr4 |= FSL_SAI_CR4_SYWD(slot_width);
 
-       val_cr5 |= FSL_SAI_CR5_WNW(word_width);
-       val_cr5 |= FSL_SAI_CR5_W0W(word_width);
+       val_cr5 |= FSL_SAI_CR5_WNW(slot_width);
+       val_cr5 |= FSL_SAI_CR5_W0W(slot_width);
 
        if (sai->is_lsb_first)
                val_cr5 |= FSL_SAI_CR5_FBT(0);
        else
                val_cr5 |= FSL_SAI_CR5_FBT(word_width - 1);
 
-       val_cr4 |= FSL_SAI_CR4_FRSZ(channels);
+       val_cr4 |= FSL_SAI_CR4_FRSZ(slots);
 
        /*
         * For SAI master mode, when Tx(Rx) sync with Rx(Tx) clock, Rx(Tx) will
 static const struct snd_soc_dai_ops fsl_sai_pcm_dai_ops = {
        .set_sysclk     = fsl_sai_set_dai_sysclk,
        .set_fmt        = fsl_sai_set_dai_fmt,
+       .set_tdm_slot   = fsl_sai_set_dai_tdm_slot,
        .hw_params      = fsl_sai_hw_params,
        .hw_free        = fsl_sai_hw_free,
        .trigger        = fsl_sai_trigger,