This patch changes Efika USB support code to use generic ULPI implementation
instead of driver's own.

Signed-off-by: Jana Rapava <[email protected]>
Cc: Marek Vasut <[email protected]>
Cc: Remy Bohmer <[email protected]>
Cc: Stefano Babic <[email protected]>
Cc: Igor Grinberg <[email protected]>
---
 board/efikamx/efikamx-usb.c |  105 +++++--------------------------------------
 include/configs/efikamx.h   |    1 +
 2 files changed, 13 insertions(+), 93 deletions(-)

diff --git a/board/efikamx/efikamx-usb.c b/board/efikamx/efikamx-usb.c
index 3b42256..2a0341f 100644
--- a/board/efikamx/efikamx-usb.c
+++ b/board/efikamx/efikamx-usb.c
@@ -205,104 +205,21 @@ void control_regs_setup(struct mx5_usb_control_regs 
*control)
        udelay(10000);
 }
 
-#define ULPI_ADDR_SHIFT                16
-#define ulpi_write_mask(value) ((value) & 0xff)
-#define ulpi_read_mask(value)  (((value) >> 8) & 0xff)
-
-int ulpi_wait(struct usb_ehci *ehci, u32 ulpi_value, u32 ulpi_mask)
+void ulpi_set_flags(struct usb_ehci *ehci, struct ulpi_regs *ulpi)
 {
-       int timeout = ULPI_TIMEOUT;
-       u32 tmp;
-
-       writel(ulpi_value, &ehci->ulpi_viewpoint);
-
-       /* Wait for the bits in ulpi_mask to become zero. */
-       while (--timeout) {
-               tmp = readl(&ehci->ulpi_viewpoint);
-               if (!(tmp & ulpi_mask))
-                       break;
-               WATCHDOG_RESET();
-       }
-
-       return !timeout;
-}
-
-int ulpi_wakeup(struct usb_ehci *ehci)
-{
-       if (readl(&ehci->ulpi_viewpoint) & ULPI_SS)
-               return 0; /* already awake */
-       return ulpi_wait(ehci, ULPI_WU, ULPI_WU);
-}
-
-void ulpi_write(struct usb_ehci *ehci, u32 reg, u32 value)
-{
-       u32 tmp;
-       if (ulpi_wakeup(ehci)) {
-               printf("ULPI wakeup timed out\n");
-               return;
-       }
-
-       tmp = ulpi_wait(ehci, ULPI_RWRUN | ULPI_RWCTRL |
-               reg << ULPI_ADDR_SHIFT | ulpi_write_mask(value), ULPI_RWRUN);
-       if (tmp)
-               printf("ULPI write timed out\n");
-}
-
-u32 ulpi_read(struct usb_ehci *ehci, u32 reg)
-{
-       if (ulpi_wakeup(ehci)) {
-               printf("ULPI wakeup timed out\n");
-               return 0;
-       }
-
-       if (ulpi_wait(ehci, ULPI_RWRUN | reg << ULPI_ADDR_SHIFT, ULPI_RWRUN)) {
-               printf("ULPI read timed out\n");
-               return 0;
-       }
-
-       return ulpi_read_mask(readl(&ehci->ulpi_viewpoint));
-}
-
-void ulpi_init(struct usb_ehci *ehci, struct ulpi_regs *ulpi)
-{
-       u32 tmp = 0;
-       int reg, i;
-
-       /* Assemble ID from four ULPI ID registers (8 bits each). */
-       for (reg = ULPI_ID_REGS_COUNT - 1; reg >= 0; reg--)
-               tmp |= ulpi_read(ehci, reg) << (reg * 8);
-
-       /* Split ID into vendor and product ID. */
-       debug("Found ULPI TX, ID %04x:%04x\n", tmp >> 16, tmp & 0xffff);
-
-       /* ULPI integrity check */
-       for (i = 0; i < 2; i++) {
-               ulpi_write(ehci, (u32)&ulpi->scratch_write,
-                       ULPI_TEST_VALUE << i);
-               tmp = ulpi_read(ehci, (u32)&ulpi->scratch_write);
-
-               if (tmp != (ULPI_TEST_VALUE << i)) {
-                       printf("ULPI integrity check failed\n");
-                       return;
-               }
-       }
-
-       /* Set ULPI flags. */
-       ulpi_write(ehci, (u32)&ulpi->otg_ctrl_write,
-               ULPI_OTG_EXTVBUSIND |
+       ulpi_otg_ctrl_flags(ehci, ulpi, WRITE, ULPI_OTG_EXTVBUSIND |
                ULPI_OTG_DM_PULLDOWN | ULPI_OTG_DP_PULLDOWN);
-       ulpi_write(ehci, (u32)&ulpi->function_ctrl_write,
-               ULPI_FC_XCVRSEL | ULPI_FC_OPMODE_NORMAL |
-               ULPI_FC_SUSPENDM);
-       ulpi_write(ehci, (u32)&ulpi->iface_ctrl_write, 0);
-       ulpi_write(ehci, (u32)&ulpi->otg_ctrl_set,
-               ULPI_OTG_DRVVBUS | ULPI_OTG_DRVVBUS_EXT);
+       ulpi_function_ctrl_flags(ehci, ulpi, WRITE, ULPI_FC_XCVRSEL |
+               ULPI_FC_OPMODE_NORMAL | ULPI_FC_SUSPENDM);
+       ulpi_iface_ctrl_flags(ehci, ulpi, WRITE, 0);
 
        /*
-        * NOTE: This violates USB specification, but otherwise, USB on Efika
-        * doesn't charge VBUS and as a result, USB doesn't work.
+        * NOTE: Setting ULPI_OTG_CHRGVBUS violates USB specification,
+        * but otherwise, USB on Efika doesn't charge VBUS
+        * and as a result, USB doesn't work.
         */
-       ulpi_write(ehci, (u32)&ulpi->otg_ctrl_set, ULPI_OTG_CHRGVBUS);
+       ulpi_otg_ctrl_flags(ehci, ulpi, SET, ULPI_OTG_DRVVBUS |
+               ULPI_OTG_DRVVBUS_EXT | ULPI_OTG_CHRGVBUS);
 }
 
 /*
@@ -353,6 +270,7 @@ void ehci1_init(struct usb_ehci *ehci, struct ulpi_regs 
*ulpi)
        udelay(10000);
 
        ulpi_init(ehci, ulpi);
+       ulpi_set_flags(ehci, ulpi);
 }
 
 void ehci2_init(struct usb_ehci *ehci, struct ulpi_regs *ulpi)
@@ -372,6 +290,7 @@ void ehci2_init(struct usb_ehci *ehci, struct ulpi_regs 
*ulpi)
        udelay(10000);
 
        ulpi_init(ehci, ulpi);
+       ulpi_set_flags(ehci, ulpi);
 }
 
 int ehci_hcd_init(void)
diff --git a/include/configs/efikamx.h b/include/configs/efikamx.h
index 537a1e4..988236b 100644
--- a/include/configs/efikamx.h
+++ b/include/configs/efikamx.h
@@ -188,6 +188,7 @@
 #define CONFIG_EHCI_IS_TDI
 #define CONFIG_USB_STORAGE
 #define CONFIG_USB_KEYBOARD
+#define CONFIG_USB_ULPI
 #endif /* CONFIG_CMD_USB */
 
 /*
-- 
1.7.6.3

_______________________________________________
U-Boot mailing list
[email protected]
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to