diff options
Diffstat (limited to 'drivers/usb/musb/musb_gadget.c')
-rw-r--r-- | drivers/usb/musb/musb_gadget.c | 45 |
1 files changed, 23 insertions, 22 deletions
diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c index f79440cdfe7e..8b3c4e2ed7b8 100644 --- a/drivers/usb/musb/musb_gadget.c +++ b/drivers/usb/musb/musb_gadget.c | |||
@@ -310,7 +310,7 @@ static void txstate(struct musb *musb, struct musb_request *req) | |||
310 | /* setup DMA, then program endpoint CSR */ | 310 | /* setup DMA, then program endpoint CSR */ |
311 | request_size = min(request->length, | 311 | request_size = min(request->length, |
312 | musb_ep->dma->max_len); | 312 | musb_ep->dma->max_len); |
313 | if (request_size <= musb_ep->packet_sz) | 313 | if (request_size < musb_ep->packet_sz) |
314 | musb_ep->dma->desired_mode = 0; | 314 | musb_ep->dma->desired_mode = 0; |
315 | else | 315 | else |
316 | musb_ep->dma->desired_mode = 1; | 316 | musb_ep->dma->desired_mode = 1; |
@@ -349,7 +349,8 @@ static void txstate(struct musb *musb, struct musb_request *req) | |||
349 | #elif defined(CONFIG_USB_TI_CPPI_DMA) | 349 | #elif defined(CONFIG_USB_TI_CPPI_DMA) |
350 | /* program endpoint CSR first, then setup DMA */ | 350 | /* program endpoint CSR first, then setup DMA */ |
351 | csr &= ~(MUSB_TXCSR_P_UNDERRUN | MUSB_TXCSR_TXPKTRDY); | 351 | csr &= ~(MUSB_TXCSR_P_UNDERRUN | MUSB_TXCSR_TXPKTRDY); |
352 | csr |= MUSB_TXCSR_MODE | MUSB_TXCSR_DMAENAB; | 352 | csr |= MUSB_TXCSR_DMAENAB | MUSB_TXCSR_DMAMODE | |
353 | MUSB_TXCSR_MODE; | ||
353 | musb_writew(epio, MUSB_TXCSR, | 354 | musb_writew(epio, MUSB_TXCSR, |
354 | (MUSB_TXCSR_P_WZC_BITS & ~MUSB_TXCSR_P_UNDERRUN) | 355 | (MUSB_TXCSR_P_WZC_BITS & ~MUSB_TXCSR_P_UNDERRUN) |
355 | | csr); | 356 | | csr); |
@@ -1405,7 +1406,7 @@ static int musb_gadget_wakeup(struct usb_gadget *gadget) | |||
1405 | 1406 | ||
1406 | spin_lock_irqsave(&musb->lock, flags); | 1407 | spin_lock_irqsave(&musb->lock, flags); |
1407 | 1408 | ||
1408 | switch (musb->xceiv.state) { | 1409 | switch (musb->xceiv->state) { |
1409 | case OTG_STATE_B_PERIPHERAL: | 1410 | case OTG_STATE_B_PERIPHERAL: |
1410 | /* NOTE: OTG state machine doesn't include B_SUSPENDED; | 1411 | /* NOTE: OTG state machine doesn't include B_SUSPENDED; |
1411 | * that's part of the standard usb 1.1 state machine, and | 1412 | * that's part of the standard usb 1.1 state machine, and |
@@ -1507,9 +1508,9 @@ static int musb_gadget_vbus_draw(struct usb_gadget *gadget, unsigned mA) | |||
1507 | { | 1508 | { |
1508 | struct musb *musb = gadget_to_musb(gadget); | 1509 | struct musb *musb = gadget_to_musb(gadget); |
1509 | 1510 | ||
1510 | if (!musb->xceiv.set_power) | 1511 | if (!musb->xceiv->set_power) |
1511 | return -EOPNOTSUPP; | 1512 | return -EOPNOTSUPP; |
1512 | return otg_set_power(&musb->xceiv, mA); | 1513 | return otg_set_power(musb->xceiv, mA); |
1513 | } | 1514 | } |
1514 | 1515 | ||
1515 | static int musb_gadget_pullup(struct usb_gadget *gadget, int is_on) | 1516 | static int musb_gadget_pullup(struct usb_gadget *gadget, int is_on) |
@@ -1732,11 +1733,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver) | |||
1732 | 1733 | ||
1733 | spin_lock_irqsave(&musb->lock, flags); | 1734 | spin_lock_irqsave(&musb->lock, flags); |
1734 | 1735 | ||
1735 | /* REVISIT always use otg_set_peripheral(), handling | 1736 | otg_set_peripheral(musb->xceiv, &musb->g); |
1736 | * issues including the root hub one below ... | ||
1737 | */ | ||
1738 | musb->xceiv.gadget = &musb->g; | ||
1739 | musb->xceiv.state = OTG_STATE_B_IDLE; | ||
1740 | musb->is_active = 1; | 1737 | musb->is_active = 1; |
1741 | 1738 | ||
1742 | /* FIXME this ignores the softconnect flag. Drivers are | 1739 | /* FIXME this ignores the softconnect flag. Drivers are |
@@ -1748,6 +1745,8 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver) | |||
1748 | if (!is_otg_enabled(musb)) | 1745 | if (!is_otg_enabled(musb)) |
1749 | musb_start(musb); | 1746 | musb_start(musb); |
1750 | 1747 | ||
1748 | otg_set_peripheral(musb->xceiv, &musb->g); | ||
1749 | |||
1751 | spin_unlock_irqrestore(&musb->lock, flags); | 1750 | spin_unlock_irqrestore(&musb->lock, flags); |
1752 | 1751 | ||
1753 | if (is_otg_enabled(musb)) { | 1752 | if (is_otg_enabled(musb)) { |
@@ -1761,8 +1760,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver) | |||
1761 | if (retval < 0) { | 1760 | if (retval < 0) { |
1762 | DBG(1, "add_hcd failed, %d\n", retval); | 1761 | DBG(1, "add_hcd failed, %d\n", retval); |
1763 | spin_lock_irqsave(&musb->lock, flags); | 1762 | spin_lock_irqsave(&musb->lock, flags); |
1764 | musb->xceiv.gadget = NULL; | 1763 | otg_set_peripheral(musb->xceiv, NULL); |
1765 | musb->xceiv.state = OTG_STATE_UNDEFINED; | ||
1766 | musb->gadget_driver = NULL; | 1764 | musb->gadget_driver = NULL; |
1767 | musb->g.dev.driver = NULL; | 1765 | musb->g.dev.driver = NULL; |
1768 | spin_unlock_irqrestore(&musb->lock, flags); | 1766 | spin_unlock_irqrestore(&musb->lock, flags); |
@@ -1845,8 +1843,9 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver) | |||
1845 | 1843 | ||
1846 | (void) musb_gadget_vbus_draw(&musb->g, 0); | 1844 | (void) musb_gadget_vbus_draw(&musb->g, 0); |
1847 | 1845 | ||
1848 | musb->xceiv.state = OTG_STATE_UNDEFINED; | 1846 | musb->xceiv->state = OTG_STATE_UNDEFINED; |
1849 | stop_activity(musb, driver); | 1847 | stop_activity(musb, driver); |
1848 | otg_set_peripheral(musb->xceiv, NULL); | ||
1850 | 1849 | ||
1851 | DBG(3, "unregistering driver %s\n", driver->function); | 1850 | DBG(3, "unregistering driver %s\n", driver->function); |
1852 | spin_unlock_irqrestore(&musb->lock, flags); | 1851 | spin_unlock_irqrestore(&musb->lock, flags); |
@@ -1882,7 +1881,7 @@ EXPORT_SYMBOL(usb_gadget_unregister_driver); | |||
1882 | void musb_g_resume(struct musb *musb) | 1881 | void musb_g_resume(struct musb *musb) |
1883 | { | 1882 | { |
1884 | musb->is_suspended = 0; | 1883 | musb->is_suspended = 0; |
1885 | switch (musb->xceiv.state) { | 1884 | switch (musb->xceiv->state) { |
1886 | case OTG_STATE_B_IDLE: | 1885 | case OTG_STATE_B_IDLE: |
1887 | break; | 1886 | break; |
1888 | case OTG_STATE_B_WAIT_ACON: | 1887 | case OTG_STATE_B_WAIT_ACON: |
@@ -1908,10 +1907,10 @@ void musb_g_suspend(struct musb *musb) | |||
1908 | devctl = musb_readb(musb->mregs, MUSB_DEVCTL); | 1907 | devctl = musb_readb(musb->mregs, MUSB_DEVCTL); |
1909 | DBG(3, "devctl %02x\n", devctl); | 1908 | DBG(3, "devctl %02x\n", devctl); |
1910 | 1909 | ||
1911 | switch (musb->xceiv.state) { | 1910 | switch (musb->xceiv->state) { |
1912 | case OTG_STATE_B_IDLE: | 1911 | case OTG_STATE_B_IDLE: |
1913 | if ((devctl & MUSB_DEVCTL_VBUS) == MUSB_DEVCTL_VBUS) | 1912 | if ((devctl & MUSB_DEVCTL_VBUS) == MUSB_DEVCTL_VBUS) |
1914 | musb->xceiv.state = OTG_STATE_B_PERIPHERAL; | 1913 | musb->xceiv->state = OTG_STATE_B_PERIPHERAL; |
1915 | break; | 1914 | break; |
1916 | case OTG_STATE_B_PERIPHERAL: | 1915 | case OTG_STATE_B_PERIPHERAL: |
1917 | musb->is_suspended = 1; | 1916 | musb->is_suspended = 1; |
@@ -1957,22 +1956,24 @@ void musb_g_disconnect(struct musb *musb) | |||
1957 | spin_lock(&musb->lock); | 1956 | spin_lock(&musb->lock); |
1958 | } | 1957 | } |
1959 | 1958 | ||
1960 | switch (musb->xceiv.state) { | 1959 | switch (musb->xceiv->state) { |
1961 | default: | 1960 | default: |
1962 | #ifdef CONFIG_USB_MUSB_OTG | 1961 | #ifdef CONFIG_USB_MUSB_OTG |
1963 | DBG(2, "Unhandled disconnect %s, setting a_idle\n", | 1962 | DBG(2, "Unhandled disconnect %s, setting a_idle\n", |
1964 | otg_state_string(musb)); | 1963 | otg_state_string(musb)); |
1965 | musb->xceiv.state = OTG_STATE_A_IDLE; | 1964 | musb->xceiv->state = OTG_STATE_A_IDLE; |
1965 | MUSB_HST_MODE(musb); | ||
1966 | break; | 1966 | break; |
1967 | case OTG_STATE_A_PERIPHERAL: | 1967 | case OTG_STATE_A_PERIPHERAL: |
1968 | musb->xceiv.state = OTG_STATE_A_WAIT_VFALL; | 1968 | musb->xceiv->state = OTG_STATE_A_WAIT_BCON; |
1969 | MUSB_HST_MODE(musb); | ||
1969 | break; | 1970 | break; |
1970 | case OTG_STATE_B_WAIT_ACON: | 1971 | case OTG_STATE_B_WAIT_ACON: |
1971 | case OTG_STATE_B_HOST: | 1972 | case OTG_STATE_B_HOST: |
1972 | #endif | 1973 | #endif |
1973 | case OTG_STATE_B_PERIPHERAL: | 1974 | case OTG_STATE_B_PERIPHERAL: |
1974 | case OTG_STATE_B_IDLE: | 1975 | case OTG_STATE_B_IDLE: |
1975 | musb->xceiv.state = OTG_STATE_B_IDLE; | 1976 | musb->xceiv->state = OTG_STATE_B_IDLE; |
1976 | break; | 1977 | break; |
1977 | case OTG_STATE_B_SRP_INIT: | 1978 | case OTG_STATE_B_SRP_INIT: |
1978 | break; | 1979 | break; |
@@ -2028,10 +2029,10 @@ __acquires(musb->lock) | |||
2028 | * or else after HNP, as A-Device | 2029 | * or else after HNP, as A-Device |
2029 | */ | 2030 | */ |
2030 | if (devctl & MUSB_DEVCTL_BDEVICE) { | 2031 | if (devctl & MUSB_DEVCTL_BDEVICE) { |
2031 | musb->xceiv.state = OTG_STATE_B_PERIPHERAL; | 2032 | musb->xceiv->state = OTG_STATE_B_PERIPHERAL; |
2032 | musb->g.is_a_peripheral = 0; | 2033 | musb->g.is_a_peripheral = 0; |
2033 | } else if (is_otg_enabled(musb)) { | 2034 | } else if (is_otg_enabled(musb)) { |
2034 | musb->xceiv.state = OTG_STATE_A_PERIPHERAL; | 2035 | musb->xceiv->state = OTG_STATE_A_PERIPHERAL; |
2035 | musb->g.is_a_peripheral = 1; | 2036 | musb->g.is_a_peripheral = 1; |
2036 | } else | 2037 | } else |
2037 | WARN_ON(1); | 2038 | WARN_ON(1); |