Title: [4025] trunk: Fix bug [#3750], we do not need flush fifo in the musb_ep_program function
Revision
4025
Author
cooloney
Date
2007-12-11 04:36:28 -0600 (Tue, 11 Dec 2007)

Log Message

Fix bug [#3750], we do not need flush fifo in the musb_ep_program function

Also add TXCOUNT register operation correctly, so BF54x can support DMA mode 0
and PIO_ONLY.

Diffstat

 drivers/usb/musb/blackfin.c                 |   83 ++++------------------------
 drivers/usb/musb/musb_host.c                |    2 
 include/asm-blackfin/mach-bf527/musb-bfin.h |    1 
 include/asm-blackfin/mach-bf548/musb-bfin.h |    1 
 4 files changed, 16 insertions(+), 71 deletions(-)

Modified Paths

Diff

Modified: trunk/drivers/usb/musb/blackfin.c (4024 => 4025)


--- trunk/drivers/usb/musb/blackfin.c	2007-12-11 10:03:17 UTC (rev 4024)
+++ trunk/drivers/usb/musb/blackfin.c	2007-12-11 10:36:28 UTC (rev 4025)
@@ -107,6 +107,7 @@
 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;
 	int i;
 	u16 *data;
 	u8 epnum = hw_ep->epnum;
@@ -114,15 +115,17 @@
 
 	prefetch((u8 *)src);
 
-	bfin_write_USB_TXCOUNT(len);
-	SSYNC();
+	musb_writew(epio, MUSB_FIFOSIZE, len);
 
-	DBG(4, "TX ep%d fifo %p count %d buf %p\n",
-			hw_ep->epnum, fifo, len, src);
+	DBG(4, "TX ep%d fifo %p count %d buf %p, epio %p\n",
+			hw_ep->epnum, fifo, len, src, epio);
 
 	dump_fifo_data(src, len);
 
-#if defined(CONFIG_BF54x)
+#if defined(CONFIG_MUSB_PIO_ONLY)
+	BUG_ON((unsigned long)src & 0x01);
+	outsw(fifo, src, len & 0x01 ? (len >> 1) + 1 : len >> 1);
+#else
 	flush_dcache_range((unsigned int)src,
 		(unsigned int)(src + len));
 
@@ -156,44 +159,7 @@
 	/* Reset DMA */
 	bfin_write16(USB_DMA_REG(epnum, USB_DMAx_CTRL), 0);
 	SSYNC();
-#else
-#if (0)
-	/* we can't assume unaligned reads work */
-	if (likely((0x01 & (u16) src) == 0)) {
-		data = "" *) src;
-
-		if (len & 0x01) {
-			u8 last = 0;
-			for (i = 0; i < ((len - 1) >> 1); i++) {
-				bfin_write16(fifo, *data);
-				data++;
-			}
-			last = *(src + len - 2);
-			bfin_write16(fifo, last);
-		}
-		else {
-			for (i = 0; i < (len >> 1); i++) {
-				bfin_write16(fifo, *data);
-				data++;
-			}
-		}
-	} else  {
-		u16 first = *src;
-		data = "" *) (src + 1);
-		bfin_write16(fifo, first);
-
-		for (i = 0; i < ((len - 1) >> 1); i++) {
-			bfin_write16(fifo, *data);
-			data++;
-		}
-	}
-	SSYNC();
-#else
-	BUG_ON((unsigned long)src & 0x01);
-	outsw(fifo, src, len & 0x01 ? (len >> 1) + 1 : len >> 1);
 #endif
-
-#endif
 }
 
 /*
@@ -210,7 +176,10 @@
 	DBG(4, "%cX ep%d fifo %p count %d buf %p\n",
 			'R', hw_ep->epnum, fifo, len, dst);
 
-#if defined(CONFIG_BF54x)
+#if defined(CONFIG_MUSB_PIO_ONLY)
+	BUG_ON((unsigned long)dst & 0x01);
+	insw(fifo, dst, len & 0x01 ? (len >> 1) + 1 : len >> 1);
+#else
 	invalidate_dcache_range((unsigned int)dst,
 		(unsigned int)(dst + len));
 
@@ -244,36 +213,8 @@
 	/* Reset DMA */
 	bfin_write16(USB_DMA_REG(epnum, USB_DMAx_CTRL), 0);
 	SSYNC();
-#else
-	/* we can't assume unaligned writes work */
-#if (0)
-	if (likely((0x01 & (unsigned long) dst) == 0)) {
-		data = "" *) dst;
-
-		if (len & 0x01) {
-			for (i = 0; i < ((len - 1) >> 1); i++) {
-				*data = ""
-				data++;
-			}
-			*((u8 *)data + 1) = (u8) bfin_read16(fifo);
-		}
-		else {
-			for (i = 0; i < (len >> 1); i++)
-				*data++ = bfin_read16(fifo);
-		}
-	} else  {
-		/* byte aligned */
-		BUG();
-		readsb(fifo, dst, len);
-	}
-	SSYNC();
-#else
-	BUG_ON((unsigned long)dst & 0x01);
-	insw(fifo, dst, len & 0x01 ? (len >> 1) + 1 : len >> 1);
 #endif
 
-#endif
-
 	dump_fifo_data(dst, len);
 }
 

Modified: trunk/drivers/usb/musb/musb_host.c (4024 => 4025)


--- trunk/drivers/usb/musb/musb_host.c	2007-12-11 10:03:17 UTC (rev 4024)
+++ trunk/drivers/usb/musb/musb_host.c	2007-12-11 10:36:28 UTC (rev 4025)
@@ -693,7 +693,9 @@
 			/* ASSERT:  TXCSR_DMAENAB was already cleared */
 
 			/* flush all old state, set default */
+#ifndef CONFIG_BLACKFIN
 			musb_h_tx_flush_fifo(hw_ep);
+#endif
 			csr &= ~(MUSB_TXCSR_H_NAKTIMEOUT
 					| MUSB_TXCSR_DMAMODE
 					| MUSB_TXCSR_FRCDATATOG

Modified: trunk/include/asm-blackfin/mach-bf527/musb-bfin.h (4024 => 4025)


--- trunk/include/asm-blackfin/mach-bf527/musb-bfin.h	2007-12-11 10:03:17 UTC (rev 4024)
+++ trunk/include/asm-blackfin/mach-bf527/musb-bfin.h	2007-12-11 10:36:28 UTC (rev 4025)
@@ -86,6 +86,7 @@
 #define MUSB_NAKLIMIT0		MUSB_TXINTERVAL	/* Re-used for EP0 */
 #define MUSB_RXTYPE		0x1C
 #define MUSB_RXINTERVAL		0x20
+#define MUSB_TXCOUNT		0x28
 #define MUSB_FIFOSIZE		0x28
 #define MUSB_CONFIGDATA		MUSB_FIFOSIZE	/* Re-used for EP0 */
 

Modified: trunk/include/asm-blackfin/mach-bf548/musb-bfin.h (4024 => 4025)


--- trunk/include/asm-blackfin/mach-bf548/musb-bfin.h	2007-12-11 10:03:17 UTC (rev 4024)
+++ trunk/include/asm-blackfin/mach-bf548/musb-bfin.h	2007-12-11 10:36:28 UTC (rev 4025)
@@ -86,6 +86,7 @@
 #define MUSB_NAKLIMIT0		MUSB_TXINTERVAL	/* Re-used for EP0 */
 #define MUSB_RXTYPE		0x1C
 #define MUSB_RXINTERVAL		0x20
+#define MUSB_TXCOUNT		0x28
 #define MUSB_FIFOSIZE		0x28
 #define MUSB_CONFIGDATA		MUSB_FIFOSIZE	/* Re-used for EP0 */
 
_______________________________________________
Linux-kernel-commits mailing list
[email protected]
http://blackfin.uclinux.org/mailman/listinfo/linux-kernel-commits

Reply via email to