diff options
Diffstat (limited to 'drivers/usb/dwc3/gadget.c')
-rw-r--r-- | drivers/usb/dwc3/gadget.c | 59 |
1 files changed, 54 insertions, 5 deletions
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 6990601f290..f90fa6e11f7 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c | |||
@@ -53,6 +53,8 @@ | |||
53 | #include "core.h" | 53 | #include "core.h" |
54 | #include "gadget.h" | 54 | #include "gadget.h" |
55 | #include "io.h" | 55 | #include "io.h" |
56 | #include <linux/usb/dwc3-omap.h> | ||
57 | #include <linux/platform_data/dwc3-omap.h> | ||
56 | 58 | ||
57 | /** | 59 | /** |
58 | * dwc3_gadget_set_test_mode - Enables USB2 Test Modes | 60 | * dwc3_gadget_set_test_mode - Enables USB2 Test Modes |
@@ -1048,6 +1050,13 @@ static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, struct dwc3_request *req) | |||
1048 | req->direction = dep->direction; | 1050 | req->direction = dep->direction; |
1049 | req->epnum = dep->number; | 1051 | req->epnum = dep->number; |
1050 | 1052 | ||
1053 | /* For a "read" direction aka OUT endpoints */ | ||
1054 | if (req->direction == 0) { | ||
1055 | if (req->request.length % dep->endpoint.desc->wMaxPacketSize) { | ||
1056 | req->request.length += ( dep->endpoint.desc->wMaxPacketSize - req->request.length); | ||
1057 | } | ||
1058 | } | ||
1059 | |||
1051 | /* | 1060 | /* |
1052 | * We only add to our list of requests now and | 1061 | * We only add to our list of requests now and |
1053 | * start consuming the list once we get XferNotReady | 1062 | * start consuming the list once we get XferNotReady |
@@ -1452,6 +1461,12 @@ static int dwc3_gadget_pullup(struct usb_gadget *g, int is_on) | |||
1452 | 1461 | ||
1453 | is_on = !!is_on; | 1462 | is_on = !!is_on; |
1454 | 1463 | ||
1464 | #if defined(CONFIG_SOC_DRA7XX) | ||
1465 | if (is_on) { | ||
1466 | if (dwc3_omap_mailbox(dwc->dev->parent, OMAP_DWC3_VBUS_VALID)) | ||
1467 | dev_err(dwc->dev, "Error wrapper may not be initilized\n"); | ||
1468 | } | ||
1469 | #endif | ||
1455 | spin_lock_irqsave(&dwc->lock, flags); | 1470 | spin_lock_irqsave(&dwc->lock, flags); |
1456 | ret = dwc3_gadget_run_stop(dwc, is_on); | 1471 | ret = dwc3_gadget_run_stop(dwc, is_on); |
1457 | spin_unlock_irqrestore(&dwc->lock, flags); | 1472 | spin_unlock_irqrestore(&dwc->lock, flags); |
@@ -1497,10 +1512,25 @@ static int dwc3_gadget_start(struct usb_gadget *g, | |||
1497 | * STAR#9000525659: Clock Domain Crossing on DCTL in | 1512 | * STAR#9000525659: Clock Domain Crossing on DCTL in |
1498 | * USB 2.0 Mode | 1513 | * USB 2.0 Mode |
1499 | */ | 1514 | */ |
1500 | if (dwc->revision < DWC3_REVISION_220A) | 1515 | if (dwc->revision < DWC3_REVISION_220A) { |
1501 | reg |= DWC3_DCFG_SUPERSPEED; | 1516 | reg |= DWC3_DCFG_SUPERSPEED; |
1502 | else | 1517 | } else { |
1503 | reg |= dwc->maximum_speed; | 1518 | switch (dwc->maximum_speed) { |
1519 | case USB_SPEED_LOW: | ||
1520 | reg |= DWC3_DSTS_LOWSPEED; | ||
1521 | break; | ||
1522 | case USB_SPEED_FULL: | ||
1523 | reg |= DWC3_DSTS_FULLSPEED1; | ||
1524 | break; | ||
1525 | case USB_SPEED_HIGH: | ||
1526 | reg |= DWC3_DSTS_HIGHSPEED; | ||
1527 | break; | ||
1528 | case USB_SPEED_SUPER: /* FALLTHROUGH */ | ||
1529 | case USB_SPEED_UNKNOWN: /* FALTHROUGH */ | ||
1530 | default: | ||
1531 | reg |= DWC3_DSTS_SUPERSPEED; | ||
1532 | } | ||
1533 | } | ||
1504 | dwc3_writel(dwc->regs, DWC3_DCFG, reg); | 1534 | dwc3_writel(dwc->regs, DWC3_DCFG, reg); |
1505 | 1535 | ||
1506 | dwc->start_config_issued = false; | 1536 | dwc->start_config_issued = false; |
@@ -1569,6 +1599,25 @@ static const struct usb_gadget_ops dwc3_gadget_ops = { | |||
1569 | 1599 | ||
1570 | /* -------------------------------------------------------------------------- */ | 1600 | /* -------------------------------------------------------------------------- */ |
1571 | 1601 | ||
1602 | static int dwc3_gadget_get_maxpacket_ep0(struct dwc3 *dwc) | ||
1603 | { | ||
1604 | switch (dwc->maximum_speed) { | ||
1605 | case USB_SPEED_HIGH: | ||
1606 | case USB_SPEED_FULL: | ||
1607 | return 64; | ||
1608 | case USB_SPEED_LOW: | ||
1609 | return 8; | ||
1610 | case USB_SPEED_SUPER: | ||
1611 | default: | ||
1612 | return 512; | ||
1613 | } | ||
1614 | } | ||
1615 | |||
1616 | static int dwc3_gadget_get_maxpacket(struct dwc3 *dwc) | ||
1617 | { | ||
1618 | return 1024; | ||
1619 | } | ||
1620 | |||
1572 | static int dwc3_gadget_init_endpoints(struct dwc3 *dwc) | 1621 | static int dwc3_gadget_init_endpoints(struct dwc3 *dwc) |
1573 | { | 1622 | { |
1574 | struct dwc3_ep *dep; | 1623 | struct dwc3_ep *dep; |
@@ -1594,7 +1643,7 @@ static int dwc3_gadget_init_endpoints(struct dwc3 *dwc) | |||
1594 | dep->direction = (epnum & 1); | 1643 | dep->direction = (epnum & 1); |
1595 | 1644 | ||
1596 | if (epnum == 0 || epnum == 1) { | 1645 | if (epnum == 0 || epnum == 1) { |
1597 | dep->endpoint.maxpacket = 512; | 1646 | dep->endpoint.maxpacket = dwc3_gadget_get_maxpacket_ep0(dwc); |
1598 | dep->endpoint.maxburst = 1; | 1647 | dep->endpoint.maxburst = 1; |
1599 | dep->endpoint.ops = &dwc3_gadget_ep0_ops; | 1648 | dep->endpoint.ops = &dwc3_gadget_ep0_ops; |
1600 | if (!epnum) | 1649 | if (!epnum) |
@@ -1602,7 +1651,7 @@ static int dwc3_gadget_init_endpoints(struct dwc3 *dwc) | |||
1602 | } else { | 1651 | } else { |
1603 | int ret; | 1652 | int ret; |
1604 | 1653 | ||
1605 | dep->endpoint.maxpacket = 1024; | 1654 | dep->endpoint.maxpacket = dwc3_gadget_get_maxpacket(dwc); |
1606 | dep->endpoint.max_streams = 15; | 1655 | dep->endpoint.max_streams = 15; |
1607 | dep->endpoint.ops = &dwc3_gadget_ep_ops; | 1656 | dep->endpoint.ops = &dwc3_gadget_ep_ops; |
1608 | list_add_tail(&dep->endpoint.ep_list, | 1657 | list_add_tail(&dep->endpoint.ep_list, |