/* 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);
+       }
+}
 
                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
  *
        while (length--)
                *data++ = readb(&musbr->fifox[ep]);
 }
+#endif /* CONFIG_USB_AM35X */