usb: dwc2: add "u-boot,force-vbus-detection" for stm32

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>
This commit is contained in:
Patrick Delaunay 2020-10-15 14:49:37 +02:00 committed by Marek Vasut
parent 12e396303c
commit 5739ef2bcb
3 changed files with 42 additions and 22 deletions

View File

@ -1014,6 +1014,9 @@ static int dwc2_udc_otg_ofdata_to_platdata(struct udevice *dev)
platdata->force_b_session_valid = platdata->force_b_session_valid =
dev_read_bool(dev, "u-boot,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 */ /* force platdata according compatible */
drvdata = dev_get_driver_data(dev); drvdata = dev_get_driver_data(dev);
if (drvdata) { if (drvdata) {
@ -1106,30 +1109,44 @@ static int dwc2_udc_otg_probe(struct udevice *dev)
if (ret) if (ret)
return ret; return ret;
if (CONFIG_IS_ENABLED(DM_REGULATOR) && if (platdata->activate_stm_id_vb_detection) {
platdata->activate_stm_id_vb_detection && if (CONFIG_IS_ENABLED(DM_REGULATOR) &&
!platdata->force_b_session_valid) { (!platdata->force_b_session_valid ||
ret = device_get_supply_regulator(dev, "usb33d-supply", platdata->force_vbus_detection)) {
&priv->usb33d_supply); ret = device_get_supply_regulator(dev, "usb33d-supply",
if (ret) { &priv->usb33d_supply);
dev_err(dev, "can't get voltage level detector supply\n"); if (ret) {
return 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;
}
/* Enable vbus sensing */
setbits_le32(&usbotg_reg->ggpio,
GGPIO_STM32_OTG_GCCFG_VBDEN |
GGPIO_STM32_OTG_GCCFG_IDEN);
}
if (platdata->force_b_session_valid) if (platdata->force_b_session_valid &&
/* Override B session bits : value and enable */ !platdata->force_vbus_detection) {
setbits_le32(&usbotg_reg->gotgctl, /* Override VBUS detection: enable then value*/
A_VALOEN | A_VALOVAL | B_VALOEN | B_VALOVAL); 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);
}
}
ret = dwc2_udc_probe(platdata); ret = dwc2_udc_probe(platdata);
if (ret) if (ret)

View File

@ -94,6 +94,8 @@ struct dwc2_usbotg_reg {
#define B_VALOEN BIT(6) #define B_VALOEN BIT(6)
#define A_VALOVAL BIT(5) #define A_VALOVAL BIT(5)
#define A_VALOEN BIT(4) #define A_VALOEN BIT(4)
#define VB_VALOVAL BIT(3)
#define VB_VALOEN BIT(2)
/* DWC2_UDC_OTG_GOTINT */ /* DWC2_UDC_OTG_GOTINT */
#define GOTGINT_SES_END_DET (1<<2) #define GOTGINT_SES_END_DET (1<<2)

View File

@ -28,6 +28,7 @@ struct dwc2_plat_otg_data {
unsigned int tx_fifo_sz_array[DWC2_MAX_HW_ENDPOINTS]; unsigned int tx_fifo_sz_array[DWC2_MAX_HW_ENDPOINTS];
unsigned char tx_fifo_sz_nb; unsigned char tx_fifo_sz_nb;
bool force_b_session_valid; bool force_b_session_valid;
bool force_vbus_detection;
bool activate_stm_id_vb_detection; bool activate_stm_id_vb_detection;
}; };