usb: musb: core: add common method of getting vbus status
authorRoman Alyautdin <ralyautdin@dev.rtsoft.ru>
Mon, 12 Oct 2015 14:14:32 +0000 (17:14 +0300)
committerFelipe Balbi <balbi@ti.com>
Fri, 16 Oct 2015 15:26:22 +0000 (10:26 -0500)
Fix musb_platform_get_vbus_status return value in case of platform
implementation is not defined, bringing expected behaviour of
musb_platform_get wrapper. Add musb_vbus_show default method to determine
VBUS status in case platform method is not defined.

Signed-off-by: Roman Alyautdin <ralyautdin@dev.rtsoft.ru>
Signed-off-by: Felipe Balbi <balbi@ti.com>
drivers/usb/musb/musb_core.c
drivers/usb/musb/musb_core.h

index e0e10dd424e0334b020e71dca376b37cfdab8773..ba13529cbd52ff82658e88bdba30db82a8e99790 100644 (file)
@@ -1775,13 +1775,20 @@ musb_vbus_show(struct device *dev, struct device_attribute *attr, char *buf)
        unsigned long   flags;
        unsigned long   val;
        int             vbus;
+       u8              devctl;
 
        spin_lock_irqsave(&musb->lock, flags);
        val = musb->a_wait_bcon;
-       /* FIXME get_vbus_status() is normally #defined as false...
-        * and is effectively TUSB-specific.
-        */
        vbus = musb_platform_get_vbus_status(musb);
+       if (vbus < 0) {
+               /* Use default MUSB method by means of DEVCTL register */
+               devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
+               if ((devctl & MUSB_DEVCTL_VBUS)
+                               == (3 << MUSB_DEVCTL_VBUS_SHIFT))
+                       vbus = 1;
+               else
+                       vbus = 0;
+       }
        spin_unlock_irqrestore(&musb->lock, flags);
 
        return sprintf(buf, "Vbus %s, timeout %lu msec\n",
index 4b886d0f6bdf1bcf10ca5477b9ea0820efc8d5b1..2337d7a7d62d66c75cfd2761b8e796352244d64a 100644 (file)
@@ -579,7 +579,7 @@ static inline int  musb_platform_recover(struct musb *musb)
 static inline int musb_platform_get_vbus_status(struct musb *musb)
 {
        if (!musb->ops->vbus_status)
-               return 0;
+               return -EINVAL;
 
        return musb->ops->vbus_status(musb);
 }