usb: omap: ulpi: fix ulpi transceiver access
authorMichael Trimarchi <michael@amarulasolutions.com>
Mon, 10 Jun 2013 16:18:04 +0000 (18:18 +0200)
committerTom Rini <trini@ti.com>
Tue, 2 Jul 2013 13:21:15 +0000 (09:21 -0400)
This patch fix the omap access to the transceiver
configuration registers using the ulpi bus. As reported by
the documentation the bit31 is used only to check if the
transaction is done or still running and the reading and
writing operation have different offset and have different
values. What we need to do at the end of a transaction is
leave the bus in done state. Anyway an error using the ulpi
omap register is not recoverable so any error give out the
usage of this interface.

Tested on a custom OMAP5430 board with a TUSB1210 ULPI PHY
on USBB1.

Signed-off-by: Michael Trimarchi <michael@amarulasolutions.com>
Acked-by: Igor Grinberg <grinberg@compulab.co.il>
Tested-by: Lubomir Popov <lpopov@mm-sol.com>
Cc: Stefano Babic <sbabic@denx.de>
Cc: Marek Vasut <marex@denx.de>
Cc: Tom Rini <trini@ti.com>
drivers/usb/ulpi/omap-ulpi-viewport.c

index 3c1ea1a5240883efbdf4f82622f4b8c5e8eb5b4b..4db7fa43ce1436a13593e7610e2e7570eca3b339 100644 (file)
 #include <asm/io.h>
 #include <usb/ulpi.h>
 
-#define OMAP_ULPI_WR_OPSEL     (3 << 21)
-#define OMAP_ULPI_ACCESS       (1 << 31)
+#define OMAP_ULPI_WR_OPSEL     (2 << 22)
+#define OMAP_ULPI_RD_OPSEL     (3 << 22)
+#define OMAP_ULPI_START                (1 << 31)
 
 /*
- * Wait for the ULPI Access to complete
+ * Wait for having ulpi in done state
  */
 static int ulpi_wait(struct ulpi_viewport *ulpi_vp, u32 mask)
 {
        int timeout = CONFIG_USB_ULPI_TIMEOUT;
 
        while (--timeout) {
-               if ((readl(ulpi_vp->viewport_addr) & mask))
+               if (!(readl(ulpi_vp->viewport_addr) & mask))
                        return 0;
 
                udelay(1);
@@ -42,27 +43,6 @@ static int ulpi_wait(struct ulpi_viewport *ulpi_vp, u32 mask)
        return ULPI_ERROR;
 }
 
-/*
- * Wake the ULPI PHY up for communication
- *
- * returns 0 on success.
- */
-static int ulpi_wakeup(struct ulpi_viewport *ulpi_vp)
-{
-       int err;
-
-       if (readl(ulpi_vp->viewport_addr) & OMAP_ULPI_ACCESS)
-               return 0; /* already awake */
-
-       writel(OMAP_ULPI_ACCESS, ulpi_vp->viewport_addr);
-
-       err = ulpi_wait(ulpi_vp, OMAP_ULPI_ACCESS);
-       if (err)
-               debug("ULPI wakeup timed out\n");
-
-       return err;
-}
-
 /*
  * Issue a ULPI read/write request
  */
@@ -70,13 +50,9 @@ static int ulpi_request(struct ulpi_viewport *ulpi_vp, u32 value)
 {
        int err;
 
-       err = ulpi_wakeup(ulpi_vp);
-       if (err)
-               return err;
-
        writel(value, ulpi_vp->viewport_addr);
 
-       err = ulpi_wait(ulpi_vp, OMAP_ULPI_ACCESS);
+       err = ulpi_wait(ulpi_vp, OMAP_ULPI_START);
        if (err)
                debug("ULPI request timed out\n");
 
@@ -85,7 +61,7 @@ static int ulpi_request(struct ulpi_viewport *ulpi_vp, u32 value)
 
 int ulpi_write(struct ulpi_viewport *ulpi_vp, u8 *reg, u32 value)
 {
-       u32 val = ((ulpi_vp->port_num & 0xf) << 24) |
+       u32 val = OMAP_ULPI_START | (((ulpi_vp->port_num + 1) & 0xf) << 24) |
                        OMAP_ULPI_WR_OPSEL | ((u32)reg << 16) | (value & 0xff);
 
        return ulpi_request(ulpi_vp, val);
@@ -94,8 +70,8 @@ int ulpi_write(struct ulpi_viewport *ulpi_vp, u8 *reg, u32 value)
 u32 ulpi_read(struct ulpi_viewport *ulpi_vp, u8 *reg)
 {
        int err;
-       u32 val = ((ulpi_vp->port_num & 0xf) << 24) |
-                        OMAP_ULPI_WR_OPSEL | ((u32)reg << 16);
+       u32 val = OMAP_ULPI_START | (((ulpi_vp->port_num + 1) & 0xf) << 24) |
+                        OMAP_ULPI_RD_OPSEL | ((u32)reg << 16);
 
        err = ulpi_request(ulpi_vp, val);
        if (err)