aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/dwc2/gadget.c
diff options
context:
space:
mode:
authorGregory Herrero <gregory.herrero@intel.com>2015-01-30 03:09:32 -0500
committerFelipe Balbi <balbi@ti.com>2015-01-30 11:32:41 -0500
commit643cc4dee1ee804b46f8d288babca046cca7e099 (patch)
tree7e421c8125090e712400f06887a613ad68cf27a2 /drivers/usb/dwc2/gadget.c
parent7d24c1b5a77c71d885fca047d1f25721f6b366e7 (diff)
usb: dwc2: gadget: add reset flag in init function
Add a flag to request physical reset of the controller when s3c_hsotg_core_init_disconnected is called. During the usb reset, controller must not be fully reconfigured and resetted. Else this leads to shorter chirp-k duration during enumeration. Tested-by: Robert Baldyga <r.baldyga@samsung.com> Acked-by: John Youn <johnyoun@synopsys.com> Signed-off-by: Gregory Herrero <gregory.herrero@intel.com> Signed-off-by: Mian Yousaf Kaukab <yousaf.kaukab@intel.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
Diffstat (limited to 'drivers/usb/dwc2/gadget.c')
-rw-r--r--drivers/usb/dwc2/gadget.c33
1 files changed, 21 insertions, 12 deletions
diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c
index 5e91cf154bba..3cf9c6a5e2c7 100644
--- a/drivers/usb/dwc2/gadget.c
+++ b/drivers/usb/dwc2/gadget.c
@@ -2271,9 +2271,13 @@ static int s3c_hsotg_corereset(struct dwc2_hsotg *hsotg)
2271 * 2271 *
2272 * Issue a soft reset to the core, and await the core finishing it. 2272 * Issue a soft reset to the core, and await the core finishing it.
2273 */ 2273 */
2274void s3c_hsotg_core_init_disconnected(struct dwc2_hsotg *hsotg) 2274void s3c_hsotg_core_init_disconnected(struct dwc2_hsotg *hsotg,
2275 bool is_usb_reset)
2275{ 2276{
2276 s3c_hsotg_corereset(hsotg); 2277 u32 val;
2278
2279 if (!is_usb_reset)
2280 s3c_hsotg_corereset(hsotg);
2277 2281
2278 /* 2282 /*
2279 * we must now enable ep0 ready for host detection and then 2283 * we must now enable ep0 ready for host detection and then
@@ -2286,7 +2290,8 @@ void s3c_hsotg_core_init_disconnected(struct dwc2_hsotg *hsotg)
2286 2290
2287 s3c_hsotg_init_fifo(hsotg); 2291 s3c_hsotg_init_fifo(hsotg);
2288 2292
2289 __orr32(hsotg->regs + DCTL, DCTL_SFTDISCON); 2293 if (!is_usb_reset)
2294 __orr32(hsotg->regs + DCTL, DCTL_SFTDISCON);
2290 2295
2291 writel(1 << 18 | DCFG_DEVSPD_HS, hsotg->regs + DCFG); 2296 writel(1 << 18 | DCFG_DEVSPD_HS, hsotg->regs + DCFG);
2292 2297
@@ -2357,9 +2362,11 @@ void s3c_hsotg_core_init_disconnected(struct dwc2_hsotg *hsotg)
2357 s3c_hsotg_ctrl_epint(hsotg, 0, 0, 1); 2362 s3c_hsotg_ctrl_epint(hsotg, 0, 0, 1);
2358 s3c_hsotg_ctrl_epint(hsotg, 0, 1, 1); 2363 s3c_hsotg_ctrl_epint(hsotg, 0, 1, 1);
2359 2364
2360 __orr32(hsotg->regs + DCTL, DCTL_PWRONPRGDONE); 2365 if (!is_usb_reset) {
2361 udelay(10); /* see openiboot */ 2366 __orr32(hsotg->regs + DCTL, DCTL_PWRONPRGDONE);
2362 __bic32(hsotg->regs + DCTL, DCTL_PWRONPRGDONE); 2367 udelay(10); /* see openiboot */
2368 __bic32(hsotg->regs + DCTL, DCTL_PWRONPRGDONE);
2369 }
2363 2370
2364 dev_dbg(hsotg->dev, "DCTL=0x%08x\n", readl(hsotg->regs + DCTL)); 2371 dev_dbg(hsotg->dev, "DCTL=0x%08x\n", readl(hsotg->regs + DCTL));
2365 2372
@@ -2388,8 +2395,10 @@ void s3c_hsotg_core_init_disconnected(struct dwc2_hsotg *hsotg)
2388 readl(hsotg->regs + DOEPCTL0)); 2395 readl(hsotg->regs + DOEPCTL0));
2389 2396
2390 /* clear global NAKs */ 2397 /* clear global NAKs */
2391 writel(DCTL_CGOUTNAK | DCTL_CGNPINNAK | DCTL_SFTDISCON, 2398 val = DCTL_CGOUTNAK | DCTL_CGNPINNAK;
2392 hsotg->regs + DCTL); 2399 if (!is_usb_reset)
2400 val |= DCTL_SFTDISCON;
2401 __orr32(hsotg->regs + DCTL, val);
2393 2402
2394 /* must be at-least 3ms to allow bus to see disconnect */ 2403 /* must be at-least 3ms to allow bus to see disconnect */
2395 mdelay(3); 2404 mdelay(3);
@@ -2482,7 +2491,7 @@ irq_retry:
2482 kill_all_requests(hsotg, hsotg->eps_out[0], 2491 kill_all_requests(hsotg, hsotg->eps_out[0],
2483 -ECONNRESET); 2492 -ECONNRESET);
2484 2493
2485 s3c_hsotg_core_init_disconnected(hsotg); 2494 s3c_hsotg_core_init_disconnected(hsotg, true);
2486 s3c_hsotg_core_connect(hsotg); 2495 s3c_hsotg_core_connect(hsotg);
2487 } 2496 }
2488 } 2497 }
@@ -3052,7 +3061,7 @@ static int s3c_hsotg_udc_start(struct usb_gadget *gadget,
3052 3061
3053 spin_lock_irqsave(&hsotg->lock, flags); 3062 spin_lock_irqsave(&hsotg->lock, flags);
3054 s3c_hsotg_init(hsotg); 3063 s3c_hsotg_init(hsotg);
3055 s3c_hsotg_core_init_disconnected(hsotg); 3064 s3c_hsotg_core_init_disconnected(hsotg, false);
3056 hsotg->enabled = 0; 3065 hsotg->enabled = 0;
3057 spin_unlock_irqrestore(&hsotg->lock, flags); 3066 spin_unlock_irqrestore(&hsotg->lock, flags);
3058 3067
@@ -3171,7 +3180,7 @@ static int s3c_hsotg_vbus_session(struct usb_gadget *gadget, int is_active)
3171 if (is_active) { 3180 if (is_active) {
3172 /* Kill any ep0 requests as controller will be reinitialized */ 3181 /* Kill any ep0 requests as controller will be reinitialized */
3173 kill_all_requests(hsotg, hsotg->eps_out[0], -ECONNRESET); 3182 kill_all_requests(hsotg, hsotg->eps_out[0], -ECONNRESET);
3174 s3c_hsotg_core_init_disconnected(hsotg); 3183 s3c_hsotg_core_init_disconnected(hsotg, false);
3175 if (hsotg->enabled) 3184 if (hsotg->enabled)
3176 s3c_hsotg_core_connect(hsotg); 3185 s3c_hsotg_core_connect(hsotg);
3177 } else { 3186 } else {
@@ -4097,7 +4106,7 @@ int s3c_hsotg_resume(struct dwc2_hsotg *hsotg)
4097 s3c_hsotg_phy_enable(hsotg); 4106 s3c_hsotg_phy_enable(hsotg);
4098 4107
4099 spin_lock_irqsave(&hsotg->lock, flags); 4108 spin_lock_irqsave(&hsotg->lock, flags);
4100 s3c_hsotg_core_init_disconnected(hsotg); 4109 s3c_hsotg_core_init_disconnected(hsotg, false);
4101 if (hsotg->enabled) 4110 if (hsotg->enabled)
4102 s3c_hsotg_core_connect(hsotg); 4111 s3c_hsotg_core_connect(hsotg);
4103 spin_unlock_irqrestore(&hsotg->lock, flags); 4112 spin_unlock_irqrestore(&hsotg->lock, flags);