spin_unlock_irqrestore(&dev->blockend_lock, flags);
 }
 
-/* called from atomic context only */
+/* called from atomic/non-atomic context */
 static void mchp_spdifrx_isr_blockend_dis(struct mchp_spdifrx_dev *dev)
 {
-       spin_lock(&dev->blockend_lock);
+       unsigned long flags;
+
+       spin_lock_irqsave(&dev->blockend_lock, flags);
        dev->blockend_refcount--;
        /* don't enable BLOCKEND interrupt if it's already enabled */
        if (dev->blockend_refcount == 0)
                regmap_write(dev->regmap, SPDIFRX_IDR, SPDIFRX_IR_BLOCKEND);
-       spin_unlock(&dev->blockend_lock);
+       spin_unlock_irqrestore(&dev->blockend_lock, flags);
 }
 
 static irqreturn_t mchp_spdif_interrupt(int irq, void *dev_id)
        if (ret <= 0) {
                dev_dbg(dev->dev, "user data for channel %d timeout\n",
                        channel);
+               mchp_spdifrx_isr_blockend_dis(dev);
                return ret;
        }