]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
usb: chipidea: udc: add pullup fuction, needed by the uvc gadget
authorMichael Grzeschik <m.grzeschik@pengutronix.de>
Wed, 12 Sep 2012 11:58:01 +0000 (14:58 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 2 Oct 2012 17:39:09 +0000 (10:39 -0700)
commit c0a48e6c75f2ac190d812bea5fc339696e434c2e upstream.

Add function to physicaly enable or disable of pullup connection on the USB-D+
line. The uvc gaget will fail, if this function is not implemented.

Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
Acked-by: Felipe Balbi <balbi@ti.com>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/chipidea/udc.c

index 51f96942dc5ef109319429464d267acc43d09600..eaecfc41e7b0b818ca40ed109aca26a7bdce120b 100644 (file)
@@ -77,8 +77,7 @@ static inline int ep_to_bit(struct ci13xxx *udc, int n)
 }
 
 /**
- * hw_device_state: enables/disables interrupts & starts/stops device (execute
- *                  without interruption)
+ * hw_device_state: enables/disables interrupts (execute without interruption)
  * @dma: 0 => disable, !0 => enable and set dma engine
  *
  * This function returns an error code
@@ -92,7 +91,6 @@ static int hw_device_state(struct ci13xxx *udc, u32 dma)
                             USBi_UI|USBi_UEI|USBi_PCI|USBi_URI|USBi_SLI);
                hw_write(udc, OP_USBCMD, USBCMD_RS, USBCMD_RS);
        } else {
-               hw_write(udc, OP_USBCMD, USBCMD_RS, 0);
                hw_write(udc, OP_USBINTR, ~0, 0);
        }
        return 0;
@@ -1419,6 +1417,21 @@ static int ci13xxx_vbus_draw(struct usb_gadget *_gadget, unsigned mA)
        return -ENOTSUPP;
 }
 
+/* Change Data+ pullup status
+ * this func is used by usb_gadget_connect/disconnet
+ */
+static int ci13xxx_pullup(struct usb_gadget *_gadget, int is_on)
+{
+       struct ci13xxx *ci = container_of(_gadget, struct ci13xxx, gadget);
+
+       if (is_on)
+               hw_write(ci, OP_USBCMD, USBCMD_RS, USBCMD_RS);
+       else
+               hw_write(ci, OP_USBCMD, USBCMD_RS, 0);
+
+       return 0;
+}
+
 static int ci13xxx_start(struct usb_gadget *gadget,
                         struct usb_gadget_driver *driver);
 static int ci13xxx_stop(struct usb_gadget *gadget,
@@ -1431,6 +1444,7 @@ static int ci13xxx_stop(struct usb_gadget *gadget,
 static const struct usb_gadget_ops usb_gadget_ops = {
        .vbus_session   = ci13xxx_vbus_session,
        .wakeup         = ci13xxx_wakeup,
+       .pullup         = ci13xxx_pullup,
        .vbus_draw      = ci13xxx_vbus_draw,
        .udc_start      = ci13xxx_start,
        .udc_stop       = ci13xxx_stop,