|
@@ -354,6 +354,20 @@ static irqreturn_t mvsd_irq(int irq, void *dev)
|
|
|
intr_status, mvsd_read(MVSD_NOR_INTR_EN),
|
|
|
mvsd_read(MVSD_HW_STATE));
|
|
|
|
|
|
+ /*
|
|
|
+ * It looks like, SDIO IP can issue one late, spurious irq
|
|
|
+ * although all irqs should be disabled. To work around this,
|
|
|
+ * bail out early, if we didn't expect any irqs to occur.
|
|
|
+ */
|
|
|
+ if (!mvsd_read(MVSD_NOR_INTR_EN) && !mvsd_read(MVSD_ERR_INTR_EN)) {
|
|
|
+ dev_dbg(host->dev, "spurious irq detected intr 0x%04x intr_en 0x%04x erri 0x%04x erri_en 0x%04x\n",
|
|
|
+ mvsd_read(MVSD_NOR_INTR_STATUS),
|
|
|
+ mvsd_read(MVSD_NOR_INTR_EN),
|
|
|
+ mvsd_read(MVSD_ERR_INTR_STATUS),
|
|
|
+ mvsd_read(MVSD_ERR_INTR_EN));
|
|
|
+ return IRQ_HANDLED;
|
|
|
+ }
|
|
|
+
|
|
|
spin_lock(&host->lock);
|
|
|
|
|
|
/* PIO handling, if needed. Messy business... */
|