break;
        }
 
-       ret = regmap_update_bits(xcvr->regmap, FSL_XCVR_EXT_IER0,
-                                FSL_XCVR_IRQ_EARC_ALL, FSL_XCVR_IRQ_EARC_ALL);
-       if (ret < 0) {
-               dev_err(dai->dev, "Error while setting IER0: %d\n", ret);
-               return ret;
-       }
-
-       /* set DPATH RESET */
-       m_ctl |= FSL_XCVR_EXT_CTRL_DPTH_RESET(tx);
-       v_ctl |= FSL_XCVR_EXT_CTRL_DPTH_RESET(tx);
        ret = regmap_update_bits(xcvr->regmap, FSL_XCVR_EXT_CTRL, m_ctl, v_ctl);
        if (ret < 0) {
                dev_err(dai->dev, "Error while setting EXT_CTRL: %d\n", ret);
        case SNDRV_PCM_TRIGGER_START:
        case SNDRV_PCM_TRIGGER_RESUME:
        case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
+               /* set DPATH RESET */
+               ret = regmap_update_bits(xcvr->regmap, FSL_XCVR_EXT_CTRL,
+                                        FSL_XCVR_EXT_CTRL_DPTH_RESET(tx),
+                                        FSL_XCVR_EXT_CTRL_DPTH_RESET(tx));
+               if (ret < 0) {
+                       dev_err(dai->dev, "Failed to set DPATH RESET: %d\n", ret);
+                       return ret;
+               }
+
                if (tx) {
                        switch (xcvr->mode) {
                        case FSL_XCVR_MODE_EARC:
                        return ret;
                }
 
+               ret = regmap_update_bits(xcvr->regmap, FSL_XCVR_EXT_IER0,
+                                        FSL_XCVR_IRQ_EARC_ALL, FSL_XCVR_IRQ_EARC_ALL);
+               if (ret < 0) {
+                       dev_err(dai->dev, "Error while setting IER0: %d\n", ret);
+                       return ret;
+               }
+
                /* clear DPATH RESET */
                ret = regmap_update_bits(xcvr->regmap, FSL_XCVR_EXT_CTRL,
                                         FSL_XCVR_EXT_CTRL_DPTH_RESET(tx),
                        return ret;
                }
 
+               ret = regmap_update_bits(xcvr->regmap, FSL_XCVR_EXT_IER0,
+                                        FSL_XCVR_IRQ_EARC_ALL, 0);
+               if (ret < 0) {
+                       dev_err(dai->dev, "Failed to clear IER0: %d\n", ret);
+                       return ret;
+               }
+
                if (tx) {
                        switch (xcvr->mode) {
                        case FSL_XCVR_MODE_SPDIF:
        struct fsl_xcvr *xcvr = dev_get_drvdata(dev);
        int ret;
 
-       /*
-        * Clear interrupts, when streams starts or resumes after
-        * suspend, interrupts are enabled in prepare(), so no need
-        * to enable interrupts in resume().
-        */
-       ret = regmap_update_bits(xcvr->regmap, FSL_XCVR_EXT_IER0,
-                                FSL_XCVR_IRQ_EARC_ALL, 0);
-       if (ret < 0)
-               dev_err(dev, "Failed to clear IER0: %d\n", ret);
-
        if (!xcvr->soc_data->spdif_only) {
                /* Assert M0+ reset */
                ret = regmap_update_bits(xcvr->regmap, FSL_XCVR_EXT_CTRL,