summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMattijs Korpershoek <mkorpershoek@baylibre.com>2023-01-11 09:19:27 +0100
committerMarek Vasut <marex@denx.de>2023-01-14 14:10:30 +0100
commit2383e8f4aec7a5087526d501478c4ba8235da2b4 (patch)
treef1746b715fc024bbc76d9197c89bc9a3e0dab193
parent66b5847b30a94487b6a540736dc4b10422d71294 (diff)
downloadu-boot-2383e8f4aec7a5087526d501478c4ba8235da2b4.tar.gz
usb: gadget: dwc2_udc_otg: implement pullup()
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>
-rw-r--r--drivers/usb/gadget/dwc2_udc_otg.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/drivers/usb/gadget/dwc2_udc_otg.c b/drivers/usb/gadget/dwc2_udc_otg.c
index 77988f78ab..2bf7ed8d60 100644
--- a/drivers/usb/gadget/dwc2_udc_otg.c
+++ b/drivers/usb/gadget/dwc2_udc_otg.c
@@ -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,