@@ -689,6 +689,17 @@ static u32 configure_dma_errata(void)
if (cpu_is_omap34xx() && (omap_type() != OMAP2_DEVICE_TYPE_GP))
SET_DMA_ERRATA(DMA_ROMCODE_BUG);
+ /*
+ * Erratum i557 - DMA4 channel fails to continue with descriptor load
+ * when pause bit is cleared through config port access while in
+ * standby.
+ * Work around: Software should configure DMA in no standby mode or
+ * Force standby before clearing the pause bit(CDPi[7]).
+ * Applicable for all versions of OMAP3630 silicons.
+ */
+ if (cpu_is_omap3630())
+ SET_DMA_ERRATA(DMA_ERRATA_i557);
+
return errata;
}
@@ -1431,12 +1442,19 @@ int omap_resume_dma_sglist_transfers(int lch, int pauseafter)
*/
wmb();
+ if (IS_DMA_ERRATA(DMA_ERRATA_i557))
+ omap_device_require_no_mstandby(pd);
+
/* Clear pause bit in CDP */
l = dma_read(CDP, lch);
l &= ~(DMA_LIST_CDP_PAUSEMODE);
dma_write(l, CDP, lch);
omap_start_dma(lch);
+
+ if (IS_DMA_ERRATA(DMA_ERRATA_i88))
+ omap_device_release_no_mstandby(pd);
+
return 0;
}
EXPORT_SYMBOL(omap_resume_dma_sglist_transfers);
@@ -285,6 +285,7 @@
#define DMA_ERRATA_i88 BIT(0x4)
#define DMA_ERRATA_3_3 BIT(0x5)
#define DMA_ROMCODE_BUG BIT(0x6)
+#define DMA_ERRATA_i557 BIT(0x7)
/* Attributes for OMAP DMA Contrller */
#define DMA_LINKED_LCH BIT(0x0)