Hello.
Mike Frysinger wrote:
From: Bryan Wu <cooloney@xxxxxxxxxx>
- MUSB_POLL_DMA option use DMA polling method to do FIFO read/write
when we usb PIO mode. Adding this because pure PIO mode is no very
s/usb/use/, s/no/not/?
stable during the USB testing
Maybe you just should always enable DMA instead of this #ifdef ugliness?
- Add ANOMALY_05000380 handling for BF527 (< 0.2 silicon)
Signed-off-by: Bryan Wu <cooloney@xxxxxxxxxx>
Signed-off-by: Mike Frysinger <vapier@xxxxxxxxxx>
---
drivers/usb/musb/Kconfig | 8 ++++++++
drivers/usb/musb/blackfin.c | 42 +++++++++++++++++++++++++++++++++++++++++-
drivers/usb/musb/blackfin.h | 2 +-
3 files changed, 50 insertions(+), 2 deletions(-)
diff --git a/drivers/usb/musb/Kconfig b/drivers/usb/musb/Kconfig
index b66e854..afd8289 100644
--- a/drivers/usb/musb/Kconfig
+++ b/drivers/usb/musb/Kconfig
@@ -148,6 +148,14 @@ config MUSB_PIO_ONLY
you can still disable it at run time using the "use_dma=n" module
parameter.
+config MUSB_DMA_POLL
+ bool 'Using DMA polling in MUSB PIO mode'
+ depends on MUSB_PIO_ONLY && BLACKFIN
+ default y if BLACKFIN
+ help
+ Using DMA busy loop polling to copy to/from FIFO. Because pure
+ PIO mode sometimes is also unstable in our testing.
+
config USB_INVENTRA_DMA
bool
depends on USB_MUSB_HDRC && !MUSB_PIO_ONLY
diff --git a/drivers/usb/musb/blackfin.c b/drivers/usb/musb/blackfin.c
index 817afc5..2b42864 100644
--- a/drivers/usb/musb/blackfin.c
+++ b/drivers/usb/musb/blackfin.c
@@ -30,6 +30,10 @@ void musb_write_fifo(struct musb_hw_ep *hw_ep, u16 len, const u8 *src)
{
void __iomem *fifo = hw_ep->fifo;
void __iomem *epio = hw_ep->regs;
+#if defined(CONFIG_MUSB_DMA_POLL) && (!ANOMALY_05000380)
+ u8 epnum = hw_ep->epnum;
+ u16 dma_reg = 0;
+#endif
prefetch((u8 *)src);
@@ -40,12 +44,48 @@ void musb_write_fifo(struct musb_hw_ep *hw_ep, u16 len, const u8 *src)
dump_fifo_data(src, len);
+#if defined(CONFIG_MUSB_DMA_POLL) && (!ANOMALY_05000380)
+ flush_dcache_range((unsigned int)src,
+ (unsigned int)(src + len));
+
+ /* Setup DMA address register */
+ dma_reg = (u16) ((u32) src & 0xFFFF);
+ bfin_write16(USB_DMA_REG(epnum, USB_DMAx_ADDR_LOW), dma_reg);
+ SSYNC();
+
+ dma_reg = (u16) (((u32) src >> 16) & 0xFFFF);
+ bfin_write16(USB_DMA_REG(epnum, USB_DMAx_ADDR_HIGH), dma_reg);
+ SSYNC();
+
+ /* Setup DMA count register */
+ bfin_write16(USB_DMA_REG(epnum, USB_DMAx_COUNT_LOW), len);
+ bfin_write16(USB_DMA_REG(epnum, USB_DMAx_COUNT_HIGH), 0);
+ SSYNC();
+
+ /* Enable the DMA */
+ dma_reg = (epnum << 4) | DMA_ENA | INT_ENA | DIRECTION;
+ bfin_write16(USB_DMA_REG(epnum, USB_DMAx_CTRL), dma_reg);
+ SSYNC();
+
+ /* Wait for compelete */
+ while (!(bfin_read_USB_DMA_INTERRUPT() & (1 << epnum)))
+ cpu_relax();
+
+ /* acknowledge dma interrupt */
+ bfin_write_USB_DMA_INTERRUPT(1 << epnum);
+ SSYNC();
+
+ /* Reset DMA */
+ bfin_write16(USB_DMA_REG(epnum, USB_DMAx_CTRL), 0);
+ SSYNC();
+#else
Oh horror...
WBR, Sergei
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html