usb: dwc2: add "u-boot,force-vbus-detection" for stm32
authorPatrick Delaunay <patrick.delaunay@st.com>
Thu, 15 Oct 2020 12:49:37 +0000 (14:49 +0200)
committerMarek Vasut <marex@denx.de>
Sun, 22 Nov 2020 12:18:20 +0000 (13:18 +0100)
On some board, the ID pin is not connected so the B session must be
overridden with "u-boot,force_b_session_valid" but the VBus sensing
must continue to be handle.

To managed it, this patch adds a new DT field
"u-boot,force-vbus-detection" to use with "u-boot,force_b_session_valid"

Signed-off-by: Patrick Delaunay <patrick.delaunay@st.com>
drivers/usb/gadget/dwc2_udc_otg.c
drivers/usb/gadget/dwc2_udc_otg_regs.h
include/usb/dwc2_udc.h

index eaa5dcb..d20ce61 100644 (file)
@@ -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) {
@@ -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;
index 2eda5c3..9ca6f42 100644 (file)
@@ -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)
index a2af381..aa37e95 100644 (file)
@@ -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;
 };