aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb')
-rw-r--r--drivers/usb/dwc3/gadget.c32
1 files changed, 22 insertions, 10 deletions
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index 7d00738b4b60..87b09bd6266e 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -433,7 +433,7 @@ static int dwc3_gadget_start_config(struct dwc3 *dwc, struct dwc3_ep *dep)
433static int dwc3_gadget_set_ep_config(struct dwc3 *dwc, struct dwc3_ep *dep, 433static int dwc3_gadget_set_ep_config(struct dwc3 *dwc, struct dwc3_ep *dep,
434 const struct usb_endpoint_descriptor *desc, 434 const struct usb_endpoint_descriptor *desc,
435 const struct usb_ss_ep_comp_descriptor *comp_desc, 435 const struct usb_ss_ep_comp_descriptor *comp_desc,
436 bool ignore) 436 bool ignore, bool restore)
437{ 437{
438 struct dwc3_gadget_ep_cmd_params params; 438 struct dwc3_gadget_ep_cmd_params params;
439 439
@@ -452,6 +452,11 @@ static int dwc3_gadget_set_ep_config(struct dwc3 *dwc, struct dwc3_ep *dep,
452 if (ignore) 452 if (ignore)
453 params.param0 |= DWC3_DEPCFG_IGN_SEQ_NUM; 453 params.param0 |= DWC3_DEPCFG_IGN_SEQ_NUM;
454 454
455 if (restore) {
456 params.param0 |= DWC3_DEPCFG_ACTION_RESTORE;
457 params.param2 |= dep->saved_state;
458 }
459
455 params.param1 = DWC3_DEPCFG_XFER_COMPLETE_EN 460 params.param1 = DWC3_DEPCFG_XFER_COMPLETE_EN
456 | DWC3_DEPCFG_XFER_NOT_READY_EN; 461 | DWC3_DEPCFG_XFER_NOT_READY_EN;
457 462
@@ -510,7 +515,7 @@ static int dwc3_gadget_set_xfer_resource(struct dwc3 *dwc, struct dwc3_ep *dep)
510static int __dwc3_gadget_ep_enable(struct dwc3_ep *dep, 515static int __dwc3_gadget_ep_enable(struct dwc3_ep *dep,
511 const struct usb_endpoint_descriptor *desc, 516 const struct usb_endpoint_descriptor *desc,
512 const struct usb_ss_ep_comp_descriptor *comp_desc, 517 const struct usb_ss_ep_comp_descriptor *comp_desc,
513 bool ignore) 518 bool ignore, bool restore)
514{ 519{
515 struct dwc3 *dwc = dep->dwc; 520 struct dwc3 *dwc = dep->dwc;
516 u32 reg; 521 u32 reg;
@@ -524,7 +529,8 @@ static int __dwc3_gadget_ep_enable(struct dwc3_ep *dep,
524 return ret; 529 return ret;
525 } 530 }
526 531
527 ret = dwc3_gadget_set_ep_config(dwc, dep, desc, comp_desc, ignore); 532 ret = dwc3_gadget_set_ep_config(dwc, dep, desc, comp_desc, ignore,
533 restore);
528 if (ret) 534 if (ret)
529 return ret; 535 return ret;
530 536
@@ -675,7 +681,7 @@ static int dwc3_gadget_ep_enable(struct usb_ep *ep,
675 } 681 }
676 682
677 spin_lock_irqsave(&dwc->lock, flags); 683 spin_lock_irqsave(&dwc->lock, flags);
678 ret = __dwc3_gadget_ep_enable(dep, desc, ep->comp_desc, false); 684 ret = __dwc3_gadget_ep_enable(dep, desc, ep->comp_desc, false, false);
679 spin_unlock_irqrestore(&dwc->lock, flags); 685 spin_unlock_irqrestore(&dwc->lock, flags);
680 686
681 return ret; 687 return ret;
@@ -1565,14 +1571,16 @@ static int dwc3_gadget_start(struct usb_gadget *g,
1565 dwc3_gadget_ep0_desc.wMaxPacketSize = cpu_to_le16(512); 1571 dwc3_gadget_ep0_desc.wMaxPacketSize = cpu_to_le16(512);
1566 1572
1567 dep = dwc->eps[0]; 1573 dep = dwc->eps[0];
1568 ret = __dwc3_gadget_ep_enable(dep, &dwc3_gadget_ep0_desc, NULL, false); 1574 ret = __dwc3_gadget_ep_enable(dep, &dwc3_gadget_ep0_desc, NULL, false,
1575 false);
1569 if (ret) { 1576 if (ret) {
1570 dev_err(dwc->dev, "failed to enable %s\n", dep->name); 1577 dev_err(dwc->dev, "failed to enable %s\n", dep->name);
1571 goto err2; 1578 goto err2;
1572 } 1579 }
1573 1580
1574 dep = dwc->eps[1]; 1581 dep = dwc->eps[1];
1575 ret = __dwc3_gadget_ep_enable(dep, &dwc3_gadget_ep0_desc, NULL, false); 1582 ret = __dwc3_gadget_ep_enable(dep, &dwc3_gadget_ep0_desc, NULL, false,
1583 false);
1576 if (ret) { 1584 if (ret) {
1577 dev_err(dwc->dev, "failed to enable %s\n", dep->name); 1585 dev_err(dwc->dev, "failed to enable %s\n", dep->name);
1578 goto err3; 1586 goto err3;
@@ -2276,14 +2284,16 @@ static void dwc3_gadget_conndone_interrupt(struct dwc3 *dwc)
2276 } 2284 }
2277 2285
2278 dep = dwc->eps[0]; 2286 dep = dwc->eps[0];
2279 ret = __dwc3_gadget_ep_enable(dep, &dwc3_gadget_ep0_desc, NULL, true); 2287 ret = __dwc3_gadget_ep_enable(dep, &dwc3_gadget_ep0_desc, NULL, true,
2288 false);
2280 if (ret) { 2289 if (ret) {
2281 dev_err(dwc->dev, "failed to enable %s\n", dep->name); 2290 dev_err(dwc->dev, "failed to enable %s\n", dep->name);
2282 return; 2291 return;
2283 } 2292 }
2284 2293
2285 dep = dwc->eps[1]; 2294 dep = dwc->eps[1];
2286 ret = __dwc3_gadget_ep_enable(dep, &dwc3_gadget_ep0_desc, NULL, true); 2295 ret = __dwc3_gadget_ep_enable(dep, &dwc3_gadget_ep0_desc, NULL, true,
2296 false);
2287 if (ret) { 2297 if (ret) {
2288 dev_err(dwc->dev, "failed to enable %s\n", dep->name); 2298 dev_err(dwc->dev, "failed to enable %s\n", dep->name);
2289 return; 2299 return;
@@ -2738,12 +2748,14 @@ int dwc3_gadget_resume(struct dwc3 *dwc)
2738 dwc3_gadget_ep0_desc.wMaxPacketSize = cpu_to_le16(512); 2748 dwc3_gadget_ep0_desc.wMaxPacketSize = cpu_to_le16(512);
2739 2749
2740 dep = dwc->eps[0]; 2750 dep = dwc->eps[0];
2741 ret = __dwc3_gadget_ep_enable(dep, &dwc3_gadget_ep0_desc, NULL, false); 2751 ret = __dwc3_gadget_ep_enable(dep, &dwc3_gadget_ep0_desc, NULL, false,
2752 false);
2742 if (ret) 2753 if (ret)
2743 goto err0; 2754 goto err0;
2744 2755
2745 dep = dwc->eps[1]; 2756 dep = dwc->eps[1];
2746 ret = __dwc3_gadget_ep_enable(dep, &dwc3_gadget_ep0_desc, NULL, false); 2757 ret = __dwc3_gadget_ep_enable(dep, &dwc3_gadget_ep0_desc, NULL, false,
2758 false);
2747 if (ret) 2759 if (ret)
2748 goto err1; 2760 goto err1;
2749 2761