]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/usb/musb/musb_core.c
Merge remote-tracking branch 'usb/usb-next'
[karo-tx-linux.git] / drivers / usb / musb / musb_core.c
index 4a518ff123106b0931082bd51f0705c8e8ca0bb7..ba13529cbd52ff82658e88bdba30db82a8e99790 100644 (file)
@@ -1028,18 +1028,22 @@ void musb_start(struct musb *musb)
 {
        void __iomem    *regs = musb->mregs;
        u8              devctl = musb_readb(regs, MUSB_DEVCTL);
+       u8              power;
 
        dev_dbg(musb->controller, "<== devctl %02x\n", devctl);
 
        musb_enable_interrupts(musb);
        musb_writeb(regs, MUSB_TESTMODE, 0);
 
-       /* put into basic highspeed mode and start session */
-       musb_writeb(regs, MUSB_POWER, MUSB_POWER_ISOUPDATE
-                       | MUSB_POWER_HSENAB
-                       /* ENSUSPEND wedges tusb */
-                       /* | MUSB_POWER_ENSUSPEND */
-                  );
+       power = MUSB_POWER_ISOUPDATE;
+       /*
+        * treating UNKNOWN as unspecified maximum speed, in which case
+        * we will default to high-speed.
+        */
+       if (musb->config->maximum_speed == USB_SPEED_HIGH ||
+                       musb->config->maximum_speed == USB_SPEED_UNKNOWN)
+               power |= MUSB_POWER_HSENAB;
+       musb_writeb(regs, MUSB_POWER, power);
 
        musb->is_active = 0;
        devctl = musb_readb(regs, MUSB_DEVCTL);
@@ -1771,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",