diff options
Diffstat (limited to 'drivers/usb')
-rw-r--r-- | drivers/usb/dwc3/gadget.c | 32 |
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) | |||
433 | static int dwc3_gadget_set_ep_config(struct dwc3 *dwc, struct dwc3_ep *dep, | 433 | static 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) | |||
510 | static int __dwc3_gadget_ep_enable(struct dwc3_ep *dep, | 515 | static 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 | ||