SPDIFRX_CR_CUMSK | SPDIFRX_CR_PTMSK | SPDIFRX_CR_RXSTEO;
                cr_mask = cr;
 
+               cr |= SPDIFRX_CR_NBTRSET(SPDIFRX_NBTR_63);
+               cr_mask |= SPDIFRX_CR_NBTR_MASK;
                cr |= SPDIFRX_CR_SPDIFENSET(SPDIFRX_SPDIFEN_SYNC);
                cr_mask |= SPDIFRX_CR_SPDIFEN_MASK;
                ret = regmap_update_bits(spdifrx->regmap, STM32_SPDIFRX_CR,
        struct snd_pcm_substream *substream = spdifrx->substream;
        struct platform_device *pdev = spdifrx->pdev;
        unsigned int cr, mask, sr, imr;
-       unsigned int flags;
+       unsigned int flags, sync_state;
        int err = 0, err_xrun = 0;
 
        regmap_read(spdifrx->regmap, STM32_SPDIFRX_SR, &sr);
        }
 
        if (err) {
-               /* SPDIFRX in STATE_STOP. Disable SPDIFRX to clear errors */
+               regmap_read(spdifrx->regmap, STM32_SPDIFRX_CR, &cr);
+               sync_state = FIELD_GET(SPDIFRX_CR_SPDIFEN_MASK, cr) &&
+                            SPDIFRX_SPDIFEN_SYNC;
+
+               /* SPDIFRX is in STATE_STOP. Disable SPDIFRX to clear errors */
                cr = SPDIFRX_CR_SPDIFENSET(SPDIFRX_SPDIFEN_DISABLE);
                regmap_update_bits(spdifrx->regmap, STM32_SPDIFRX_CR,
                                   SPDIFRX_CR_SPDIFEN_MASK, cr);
 
+               /* If SPDIFRX was in STATE_SYNC, retry synchro */
+               if (sync_state) {
+                       cr = SPDIFRX_CR_SPDIFENSET(SPDIFRX_SPDIFEN_SYNC);
+                       regmap_update_bits(spdifrx->regmap, STM32_SPDIFRX_CR,
+                                          SPDIFRX_CR_SPDIFEN_MASK, cr);
+                       return IRQ_HANDLED;
+               }
+
                if (substream)
                        snd_pcm_stop(substream, SNDRV_PCM_STATE_DISCONNECTED);