struct snd_soc_component *component = codec_dai->component;
        struct max98090_priv *max98090 = snd_soc_component_get_drvdata(component);
        struct max98090_cdata *cdata;
-       u8 regval;
+       u8 regval, tdm_regval;
 
        max98090->dai_fmt = fmt;
        cdata = &max98090->dai[0];
                cdata->fmt = fmt;
 
                regval = 0;
+               tdm_regval = 0;
                switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) {
                case SND_SOC_DAIFMT_CBC_CFC:
                        /* Set to consumer mode PLL - MAS mode off */
                        regval |= M98090_RJ_MASK;
                        break;
                case SND_SOC_DAIFMT_DSP_A:
-                       /* Not supported mode */
+                       tdm_regval |= M98090_TDM_MASK;
+                       break;
                default:
                        dev_err(component->dev, "DAI format unsupported");
                        return -EINVAL;
                 * seen for the case of TDM mode. The remaining cases have
                 * normal logic.
                 */
-               if (max98090->tdm_slots > 1)
+               if (tdm_regval)
                        regval ^= M98090_BCI_MASK;
 
                snd_soc_component_write(component,
                        M98090_REG_INTERFACE_FORMAT, regval);
+
+               regval = 0;
+               if (tdm_regval)
+                       regval = max98090->tdm_lslot << M98090_TDM_SLOTL_SHIFT |
+                                max98090->tdm_rslot << M98090_TDM_SLOTR_SHIFT |
+                                0 << M98090_TDM_SLOTDLY_SHIFT;
+
+               snd_soc_component_write(component, M98090_REG_TDM_FORMAT, regval);
+               snd_soc_component_write(component, M98090_REG_TDM_CONTROL, tdm_regval);
        }
 
        return 0;
 {
        struct snd_soc_component *component = codec_dai->component;
        struct max98090_priv *max98090 = snd_soc_component_get_drvdata(component);
-       struct max98090_cdata *cdata;
-       cdata = &max98090->dai[0];
 
        if (slots < 0 || slots > 4)
                return -EINVAL;
 
-       max98090->tdm_slots = slots;
-       max98090->tdm_width = slot_width;
-
-       if (max98090->tdm_slots > 1) {
-               /* SLOTL SLOTR SLOTDLY */
-               snd_soc_component_write(component, M98090_REG_TDM_FORMAT,
-                       0 << M98090_TDM_SLOTL_SHIFT |
-                       1 << M98090_TDM_SLOTR_SHIFT |
-                       0 << M98090_TDM_SLOTDLY_SHIFT);
-
-               /* FSW TDM */
-               snd_soc_component_update_bits(component, M98090_REG_TDM_CONTROL,
-                       M98090_TDM_MASK,
-                       M98090_TDM_MASK);
-       }
+       if (slot_width != 16)
+               return -EINVAL;
 
-       /*
-        * Normally advisable to set TDM first, but this permits either order
-        */
-       cdata->fmt = 0;
-       max98090_dai_set_fmt(codec_dai, max98090->dai_fmt);
+       if (rx_mask != tx_mask)
+               return -EINVAL;
+
+       if (!rx_mask)
+               return -EINVAL;
+
+       max98090->tdm_slots = slots;
+       max98090->tdm_lslot = ffs(rx_mask) - 1;
+       max98090->tdm_rslot = fls(rx_mask) - 1;
 
        return 0;
 }
        max98090->pa1en = 0;
        max98090->pa2en = 0;
 
+       max98090->tdm_lslot = 0;
+       max98090->tdm_rslot = 1;
+
        ret = snd_soc_component_read(component, M98090_REG_REVISION_ID);
        if (ret < 0) {
                dev_err(component->dev, "Failed to read device revision: %d\n",