summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Rini <trini@konsulko.com>2020-11-22 11:00:11 -0500
committerTom Rini <trini@konsulko.com>2020-11-22 11:00:11 -0500
commitd361eafe82bfbf90ab0a592ae59daef99faee5ec (patch)
treefdb80a073e452840bc4586cfe1558c94d2fa5af2
parent6402887a9f05c98c207d29a316acb72231b65052 (diff)
parent05dac23261284578ff17952e11340f41127923ac (diff)
downloadu-boot-WIP/22Nov2020.tar.gz
Merge https://gitlab.denx.de/u-boot/custodians/u-boot-usbWIP/22Nov2020
- DWC2, DWC3 fixes
-rw-r--r--drivers/usb/dwc3/dwc3-generic.c2
-rw-r--r--drivers/usb/gadget/dwc2_udc_otg.c61
-rw-r--r--drivers/usb/gadget/dwc2_udc_otg_regs.h2
-rw-r--r--include/usb/dwc2_udc.h1
4 files changed, 43 insertions, 23 deletions
diff --git a/drivers/usb/dwc3/dwc3-generic.c b/drivers/usb/dwc3/dwc3-generic.c
index 36fa16ad4e..a936f71d2e 100644
--- a/drivers/usb/dwc3/dwc3-generic.c
+++ b/drivers/usb/dwc3/dwc3-generic.c
@@ -74,7 +74,7 @@ static int dwc3_generic_probe(struct udevice *dev,
}
rc = dwc3_setup_phy(dev, &priv->phys);
- if (rc)
+ if (rc && rc != -ENOTSUPP)
return rc;
if (device_is_compatible(dev->parent, "rockchip,rk3399-dwc3"))
diff --git a/drivers/usb/gadget/dwc2_udc_otg.c b/drivers/usb/gadget/dwc2_udc_otg.c
index eaa5dcb9b1..8a8e2179e4 100644
--- a/drivers/usb/gadget/dwc2_udc_otg.c
+++ b/drivers/usb/gadget/dwc2_udc_otg.c
@@ -1014,6 +1014,9 @@ static int dwc2_udc_otg_ofdata_to_platdata(struct udevice *dev)
platdata->force_b_session_valid =
dev_read_bool(dev, "u-boot,force-b-session-valid");
+ platdata->force_vbus_detection =
+ dev_read_bool(dev, "u-boot,force-vbus-detection");
+
/* force platdata according compatible */
drvdata = dev_get_driver_data(dev);
if (drvdata) {
@@ -1045,7 +1048,7 @@ static int dwc2_udc_otg_reset_init(struct udevice *dev,
int ret;
ret = reset_get_bulk(dev, resets);
- if (ret == -ENOTSUPP)
+ if (ret == -ENOTSUPP || ret == -ENOENT)
return 0;
if (ret)
@@ -1106,31 +1109,45 @@ static int dwc2_udc_otg_probe(struct udevice *dev)
if (ret)
return ret;
- if (CONFIG_IS_ENABLED(DM_REGULATOR) &&
- platdata->activate_stm_id_vb_detection &&
- !platdata->force_b_session_valid) {
- ret = device_get_supply_regulator(dev, "usb33d-supply",
- &priv->usb33d_supply);
- if (ret) {
- dev_err(dev, "can't get voltage level detector supply\n");
- return ret;
+ if (platdata->activate_stm_id_vb_detection) {
+ if (CONFIG_IS_ENABLED(DM_REGULATOR) &&
+ (!platdata->force_b_session_valid ||
+ platdata->force_vbus_detection)) {
+ ret = device_get_supply_regulator(dev, "usb33d-supply",
+ &priv->usb33d_supply);
+ if (ret) {
+ dev_err(dev, "can't get voltage level detector supply\n");
+ return ret;
+ }
+ ret = regulator_set_enable(priv->usb33d_supply, true);
+ if (ret) {
+ dev_err(dev, "can't enable voltage level detector supply\n");
+ return ret;
+ }
}
- ret = regulator_set_enable(priv->usb33d_supply, true);
- if (ret) {
- dev_err(dev, "can't enable voltage level detector supply\n");
- return ret;
+
+ if (platdata->force_b_session_valid &&
+ !platdata->force_vbus_detection) {
+ /* Override VBUS detection: enable then value*/
+ setbits_le32(&usbotg_reg->gotgctl, VB_VALOEN);
+ setbits_le32(&usbotg_reg->gotgctl, VB_VALOVAL);
+ } else {
+ /* Enable VBUS sensing */
+ setbits_le32(&usbotg_reg->ggpio,
+ GGPIO_STM32_OTG_GCCFG_VBDEN);
+ }
+ if (platdata->force_b_session_valid) {
+ /* Override B session bits: enable then value */
+ setbits_le32(&usbotg_reg->gotgctl, A_VALOEN | B_VALOEN);
+ setbits_le32(&usbotg_reg->gotgctl,
+ A_VALOVAL | B_VALOVAL);
+ } else {
+ /* Enable ID detection */
+ setbits_le32(&usbotg_reg->ggpio,
+ GGPIO_STM32_OTG_GCCFG_IDEN);
}
- /* Enable vbus sensing */
- setbits_le32(&usbotg_reg->ggpio,
- GGPIO_STM32_OTG_GCCFG_VBDEN |
- GGPIO_STM32_OTG_GCCFG_IDEN);
}
- if (platdata->force_b_session_valid)
- /* Override B session bits : value and enable */
- setbits_le32(&usbotg_reg->gotgctl,
- A_VALOEN | A_VALOVAL | B_VALOEN | B_VALOVAL);
-
ret = dwc2_udc_probe(platdata);
if (ret)
return ret;
diff --git a/drivers/usb/gadget/dwc2_udc_otg_regs.h b/drivers/usb/gadget/dwc2_udc_otg_regs.h
index 2eda5c3720..9ca6f42375 100644
--- a/drivers/usb/gadget/dwc2_udc_otg_regs.h
+++ b/drivers/usb/gadget/dwc2_udc_otg_regs.h
@@ -94,6 +94,8 @@ struct dwc2_usbotg_reg {
#define B_VALOEN BIT(6)
#define A_VALOVAL BIT(5)
#define A_VALOEN BIT(4)
+#define VB_VALOVAL BIT(3)
+#define VB_VALOEN BIT(2)
/* DWC2_UDC_OTG_GOTINT */
#define GOTGINT_SES_END_DET (1<<2)
diff --git a/include/usb/dwc2_udc.h b/include/usb/dwc2_udc.h
index a2af381a66..aa37e957b4 100644
--- a/include/usb/dwc2_udc.h
+++ b/include/usb/dwc2_udc.h
@@ -28,6 +28,7 @@ struct dwc2_plat_otg_data {
unsigned int tx_fifo_sz_array[DWC2_MAX_HW_ENDPOINTS];
unsigned char tx_fifo_sz_nb;
bool force_b_session_valid;
+ bool force_vbus_detection;
bool activate_stm_id_vb_detection;
};