usb: dwc2: gadget: force gadget initialization in dev mode
authorGregory Herrero <gregory.herrero@intel.com>
Fri, 9 Jan 2015 12:39:09 +0000 (13:39 +0100)
committerFelipe Balbi <balbi@ti.com>
Mon, 12 Jan 2015 21:34:54 +0000 (15:34 -0600)
When booting with id pin grounded, dwc2 default to host mode.
Thus, force device mode prior initializing gadget part.
Else fifo init will fail since fifo values are not correct
in host mode.

Tested-by: Robert Baldyga <r.baldyga@samsung.com>
Acked-by: Paul Zimmerman <paulz@synopsys.com>
Signed-off-by: Gregory Herrero <gregory.herrero@intel.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
drivers/usb/dwc2/gadget.c

index f47770940a7a2ad87a78acda720036a1d1febf6b..df9080d206064915452e1f44dc2d68480db92fd7 100644 (file)
@@ -3675,6 +3675,19 @@ int dwc2_gadget_init(struct dwc2_hsotg *hsotg, int irq)
        /* usb phy enable */
        s3c_hsotg_phy_enable(hsotg);
 
+       /*
+        * Force Device mode before initialization.
+        * This allows correctly configuring fifo for device mode.
+        */
+       __bic32(hsotg->regs + GUSBCFG, GUSBCFG_FORCEHOSTMODE);
+       __orr32(hsotg->regs + GUSBCFG, GUSBCFG_FORCEDEVMODE);
+
+       /*
+        * According to Synopsys databook, this sleep is needed for the force
+        * device mode to take effect.
+        */
+       msleep(25);
+
        s3c_hsotg_corereset(hsotg);
        ret = s3c_hsotg_hw_cfg(hsotg);
        if (ret) {
@@ -3684,6 +3697,9 @@ int dwc2_gadget_init(struct dwc2_hsotg *hsotg, int irq)
 
        s3c_hsotg_init(hsotg);
 
+       /* Switch back to default configuration */
+       __bic32(hsotg->regs + GUSBCFG, GUSBCFG_FORCEDEVMODE);
+
        hsotg->ctrl_buff = devm_kzalloc(hsotg->dev,
                        DWC2_CTRL_BUFF_SIZE, GFP_KERNEL);
        if (!hsotg->ctrl_buff) {