usb: musb: set the controller speed based on the config setting
authorBin Liu <b-liu@ti.com>
Wed, 9 Sep 2015 18:17:23 +0000 (13:17 -0500)
committerFelipe Balbi <balbi@ti.com>
Sun, 27 Sep 2015 15:54:31 +0000 (10:54 -0500)
Set the Power register HSENAB bit based on musb->config->maximum_speed,
so that the glue layer can control MUSB to work in high- or full-speed.

Signed-off-by: Bin Liu <b-liu@ti.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
drivers/usb/musb/musb_core.c
include/linux/usb/musb.h

index 4a518ff123106b0931082bd51f0705c8e8ca0bb7..e0e10dd424e0334b020e71dca376b37cfdab8773 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);
index a4ee1b582183119557ccc2b59b3d188ad173d8e6..fa6dc132bd1b9b298ee2503871e245a4aa37de94 100644 (file)
@@ -95,7 +95,7 @@ struct musb_hdrc_config {
        /* musb CLKIN in Blackfin in MHZ */
        unsigned char   clkin;
 #endif
-
+       u32             maximum_speed;
 };
 
 struct musb_hdrc_platform_data {