diff options
author | Justin Waters <justin.waters@timesys.com> | 2013-04-24 17:41:45 -0400 |
---|---|---|
committer | Justin Waters <justin.waters@timesys.com> | 2013-04-24 17:41:45 -0400 |
commit | 18282017b14c0b32b4aa6fd05df58ba5cff0b472 (patch) | |
tree | 24344ef4d64f38baee4f5b56a9b44cc775ab4b62 /drivers/usb/musb/musb_udc.c | |
parent | 75c641ece39c136001340df61f0ad57028ce4ffc (diff) |
LogicPD Support for OMAP3/DM3/AM3 boards 2.2 Update
Diffstat (limited to 'drivers/usb/musb/musb_udc.c')
-rw-r--r-- | drivers/usb/musb/musb_udc.c | 30 |
1 files changed, 26 insertions, 4 deletions
diff --git a/drivers/usb/musb/musb_udc.c b/drivers/usb/musb/musb_udc.c index 6f6ed61d08..3ebdcf1daf 100644 --- a/drivers/usb/musb/musb_udc.c +++ b/drivers/usb/musb/musb_udc.c @@ -180,11 +180,15 @@ static void musb_peri_softconnect(void) /* Power on MUSB */ power = readb(&musbr->power); power |= MUSB_POWER_SOFTCONN; +#if USB_BCD_VERSION == 0x0200 + power |= MUSB_POWER_HSENAB; +#else /* * The usb device interface is usb 1.1 * Disable 2.0 high speed by clearring the hsenable bit. */ power &= ~MUSB_POWER_HSENAB; +#endif writeb(power, &musbr->power); /* Check if device is in b-peripheral mode */ @@ -786,6 +790,9 @@ void udc_irq(void) if (intrtx) musb_peri_tx(intrtx); } else { + udc_device->speed = + (readb(&musbr->power) & MUSB_POWER_HSMODE) ? + USB_SPEED_HIGH : USB_SPEED_FULL; if (MUSB_INTR_SOF & intrusb) { u8 faddr; faddr = readb(&musbr->faddr); @@ -881,10 +888,10 @@ void udc_setup_ep(struct usb_device_instance *device, unsigned int id, ep_addr = endpoint->endpoint_address; if (USB_DIR_IN == (ep_addr & USB_ENDPOINT_DIR_MASK)) { /* IN */ - epinfo[(id * 2) + 1].epsize = endpoint->tx_packetSize; + epinfo[((id - 1) * 2) + 1].epsize = endpoint->tx_packetSize; } else { /* OUT */ - epinfo[id * 2].epsize = endpoint->rcv_packetSize; + epinfo[(id - 1) * 2].epsize = endpoint->rcv_packetSize; } musb_configure_ep(&epinfo[0], @@ -899,12 +906,27 @@ void udc_setup_ep(struct usb_device_instance *device, unsigned int id, void udc_connect(void) { - /* noop */ + musb_peri_softconnect(); } void udc_disconnect(void) { - /* noop */ + u8 power, intrusb; + u16 intrrx, intrtx; + + /* If musbr Null, never initialized MUSB! */ + if (!musbr) + return; + + /* Power off MUSB */ + power = readb(&musbr->power); + power &= ~MUSB_POWER_SOFTCONN; + writeb(power, &musbr->power); + + /* Read intr to clear */ + intrusb = readb(&musbr->intrusb); + intrrx = readw(&musbr->intrrx); + intrtx = readw(&musbr->intrtx); } void udc_enable(struct usb_device_instance *device) |