USB: twl4030-usb: fix minor reporting goofage
authorDavid Brownell <dbrownell@users.sourceforge.net>
Tue, 31 Mar 2009 19:26:10 +0000 (12:26 -0700)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 16 Jun 2009 04:44:40 +0000 (21:44 -0700)
Fix a reporting glitch in the twl4030 USB transceiver code.
It wasn't properly distinguishing the two types of active
USB link:  ID grounded, vs not.  In the current code that
distinction doesn't much matter; in the future this bugfix
should help support better USB controller communications.

Provide a comment sorting out some of the cryptic bits of
the manual:  different sections use different names for
key signals, and the register definitions don't help much
without the explanations and diagrams.

Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/usb/otg/twl4030-usb.c

index c34e63910acb5224650dcba146ecece2adf4c1c2..9e3e7a5c258bc32d78678e5b05bb877dcac46be6 100644 (file)
 
 /* In module TWL4030_MODULE_PM_MASTER */
 #define PROTECT_KEY                    0x0E
+#define STS_HW_CONDITIONS              0x0F
 
 /* In module TWL4030_MODULE_PM_RECEIVER */
 #define VUSB_DEDICATED1                        0x7D
@@ -351,15 +352,26 @@ static enum linkstat twl4030_usb_linkstat(struct twl4030_usb *twl)
        int     status;
        int     linkstat = USB_LINK_UNKNOWN;
 
-       /* STS_HW_CONDITIONS */
-       status = twl4030_readb(twl, TWL4030_MODULE_PM_MASTER, 0x0f);
+       /*
+        * For ID/VBUS sensing, see manual section 15.4.8 ...
+        * except when using only battery backup power, two
+        * comparators produce VBUS_PRES and ID_PRES signals,
+        * which don't match docs elsewhere.  But ... BIT(7)
+        * and BIT(2) of STS_HW_CONDITIONS, respectively, do
+        * seem to match up.  If either is true the USB_PRES
+        * signal is active, the OTG module is activated, and
+        * its interrupt may be raised (may wake the system).
+        */
+       status = twl4030_readb(twl, TWL4030_MODULE_PM_MASTER,
+                       STS_HW_CONDITIONS);
        if (status < 0)
                dev_err(twl->dev, "USB link status err %d\n", status);
-       else if (status & BIT(7))
-               linkstat = USB_LINK_VBUS;
-       else if (status & BIT(2))
-               linkstat = USB_LINK_ID;
-       else
+       else if (status & (BIT(7) | BIT(2))) {
+               if (status & BIT(2))
+                       linkstat = USB_LINK_ID;
+               else
+                       linkstat = USB_LINK_VBUS;
+       } else
                linkstat = USB_LINK_NONE;
 
        dev_dbg(twl->dev, "HW_CONDITIONS 0x%02x/%d; link %d\n",