]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
usb: gadget: dwc2_udc_otg: implement pullup()
authorMattijs Korpershoek <mkorpershoek@baylibre.com>
Wed, 11 Jan 2023 08:19:27 +0000 (09:19 +0100)
committerMarek Vasut <marex@denx.de>
Sat, 14 Jan 2023 13:10:30 +0000 (14:10 +0100)
Pullup is used by the usb framework in order to do software-controlled
usb_gadget_connect() and usb_gadget_disconnect().

Implement pullup() for dwc2 using the SOFT_DISCONNECT bit in the dctl
register:
* when pullup is on, clear SOFT_DISCONNECT
* when pullup is off, set SOFT_DISCONNECT

This is especially useful when a gadget disconnection is initiated but
no board_usb_cleanup() is called.

Signed-off-by: Mattijs Korpershoek <mkorpershoek@baylibre.com>
drivers/usb/gadget/dwc2_udc_otg.c

index 77988f78ab3095270a28dfd9b7600ddfcbad71b5..2bf7ed8d60468f0c179eef8ba61e0046a7269e85 100644 (file)
@@ -236,6 +236,14 @@ static int udc_enable(struct dwc2_udc *dev)
        return 0;
 }
 
+static int dwc2_gadget_pullup(struct usb_gadget *g, int is_on)
+{
+       clrsetbits_le32(&reg->dctl, SOFT_DISCONNECT,
+                       is_on ? 0 : SOFT_DISCONNECT);
+
+       return 0;
+}
+
 #if !CONFIG_IS_ENABLED(DM_USB_GADGET)
 /*
   Register entry point for the peripheral controller driver.
@@ -805,6 +813,7 @@ static void dwc2_fifo_flush(struct usb_ep *_ep)
 }
 
 static const struct usb_gadget_ops dwc2_udc_ops = {
+       .pullup = dwc2_gadget_pullup,
        /* current versions must always be self-powered */
 #if CONFIG_IS_ENABLED(DM_USB_GADGET)
        .udc_start              = dwc2_gadget_start,