Explorar el Código

musb: am35x: Workaround for fifo read issue

AM35x supports only 32bit read operations so we need to have
workaround for 8bit and 16bit read operations.

Signed-off-by: Ajay Kumar Gupta <ajay.gupta@ti.com>
Ajay Kumar Gupta hace 15 años
padre
commit
5689f4b5b4
Se han modificado 2 ficheros con 38 adiciones y 0 borrados
  1. 32 0
      drivers/usb/musb/am35x.c
  2. 6 0
      drivers/usb/musb/musb_core.c

+ 32 - 0
drivers/usb/musb/am35x.c

@@ -116,3 +116,35 @@ void musb_platform_deinit(void)
 	/* Turn off the phy */
 	phy_off();
 }
+
+/*
+ * This function reads data from endpoint fifo for AM35x
+ * which supports only 32bit read operation.
+ *
+ * ep           - endpoint number
+ * length       - number of bytes to read from FIFO
+ * fifo_data    - pointer to data buffer into which data is read
+ */
+__attribute__((weak))
+void read_fifo(u8 ep, u32 length, void *fifo_data)
+{
+	u8  *data = (u8 *)fifo_data;
+	u32 val;
+	int i;
+
+	/* select the endpoint index */
+	writeb(ep, &musbr->index);
+
+	if (length > 4) {
+		for (i = 0; i < (length >> 2); i++) {
+			val = readl(&musbr->fifox[ep]);
+			memcpy(data, &val, 4);
+			data += 4;
+		}
+		length %= 4;
+	}
+	if (length > 0) {
+		val = readl(&musbr->fifox[ep]);
+		memcpy(data, &val, length);
+	}
+}

+ 6 - 0
drivers/usb/musb/musb_core.c

@@ -141,6 +141,11 @@ void write_fifo(u8 ep, u32 length, void *fifo_data)
 		writeb(*data++, &musbr->fifox[ep]);
 }
 
+/*
+ * AM35x supports only 32bit read operations so
+ * use seperate read_fifo() function for it.
+ */
+#ifndef CONFIG_USB_AM35X
 /*
  * This function reads data from endpoint fifo
  *
@@ -160,3 +165,4 @@ void read_fifo(u8 ep, u32 length, void *fifo_data)
 	while (length--)
 		*data++ = readb(&musbr->fifox[ep]);
 }
+#endif /* CONFIG_USB_AM35X */