]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/usb/gadget/omap_udc.c
h63xx: usb gadget driver support for allowing network over usb.
[linux-2.6-omap-h63xx.git] / drivers / usb / gadget / omap_udc.c
index 2b5afd7297a0e7f07d2ca89097cecde8b6788f09..975a54fb0dc475ff1ad3a1a71801490b53981fa1 100644 (file)
 #undef USB_TRACE
 
 /* bulk DMA seems to be behaving for both IN and OUT */
+#ifdef CONFIG_MACH_OMAP_H6300
+#undef USE_DMA
+#else
 #define        USE_DMA
+#endif
 
 /* ISO too */
 #define        USE_ISO
@@ -1905,7 +1909,7 @@ static void pio_out_timer(unsigned long _ep)
 
        spin_lock_irqsave(&ep->udc->lock, flags);
        if (!list_empty(&ep->queue) && ep->ackwait) {
-               use_ep(ep, 0);
+               use_ep(ep, UDC_EP_SEL);
                stat_flg = UDC_STAT_FLG_REG;
 
                if ((stat_flg & UDC_ACK) && (!(stat_flg & UDC_FIFO_EN)
@@ -1915,12 +1919,14 @@ static void pio_out_timer(unsigned long _ep)
                        VDBG("%s: lose, %04x\n", ep->ep.name, stat_flg);
                        req = container_of(ep->queue.next,
                                        struct omap_req, queue);
-                       UDC_EP_NUM_REG = ep->bEndpointAddress | UDC_EP_SEL;
                        (void) read_fifo(ep, req);
                        UDC_EP_NUM_REG = ep->bEndpointAddress;
                        UDC_CTRL_REG = UDC_SET_FIFO_EN;
                        ep->ackwait = 1 + ep->double_buf;
                }
+               else {
+                   deselect_ep();
+               }
        }
        mod_timer(&ep->timer, PIO_OUT_TIMEOUT);
        spin_unlock_irqrestore(&ep->udc->lock, flags);
@@ -2145,7 +2151,7 @@ int usb_gadget_register_driver (struct usb_gadget_driver *driver)
        /* boards that don't have VBUS sensing can't autogate 48MHz;
         * can't enter deep sleep while a gadget driver is active.
         */
-       if (machine_is_omap_innovator() || machine_is_omap_osk())
+       if (machine_is_omap_innovator() || machine_is_omap_osk() || machine_is_omap_h6300())
                omap_vbus_session(&udc->gadget, 1);
 
 done:
@@ -2168,7 +2174,7 @@ int usb_gadget_unregister_driver (struct usb_gadget_driver *driver)
        if (udc->dc_clk != NULL)
                omap_udc_enable_clock(1);
 
-       if (machine_is_omap_innovator() || machine_is_omap_osk())
+       if (machine_is_omap_innovator() || machine_is_omap_osk() || machine_is_omap_h6300())
                omap_vbus_session(&udc->gadget, 0);
 
        if (udc->transceiver)
@@ -2789,7 +2795,7 @@ static int __init omap_udc_probe(struct platform_device *pdev)
                hmc = HMC_1510;
                type = "(unknown)";
 
-               if (machine_is_omap_innovator()) {
+               if (machine_is_omap_innovator() || machine_is_omap_h6300()) {
                        /* just set up software VBUS detect, and then
                         * later rig it so we always report VBUS.
                         * FIXME without really sensing VBUS, we can't