The parameter can be used by init scripts to detect a plugged usb cable. Upon a plugged usb cable the barebox behaviour can be changed which can be useful e.g. during production to apply a special production environment. Signed-off-by: Marco Felsch <m.felsch@xxxxxxxxxxxxxx> --- drivers/usb/imx/imx-usb-phy.c | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/drivers/usb/imx/imx-usb-phy.c b/drivers/usb/imx/imx-usb-phy.c index 32098ef248..9420c8c109 100644 --- a/drivers/usb/imx/imx-usb-phy.c +++ b/drivers/usb/imx/imx-usb-phy.c @@ -37,9 +37,12 @@ #define BM_USBPHY_CTRL_ENHOSTDISCONDETECT BIT(1) #define ANADIG_USB1_CHRG_DETECT_SET 0x1b4 -#define ANADIG_USB2_CHRG_DETECT_SET 0x214 #define ANADIG_USB1_CHRG_DETECT_EN_B BIT(20) #define ANADIG_USB1_CHRG_DETECT_CHK_CHRG_B BIT(19) +#define ANADIG_USB1_VBUS_DETECT_STAT 0x1c0 +#define ANADIG_USB1_VBUS_DETECT_STAT_VBUS_VALID BIT(3) +#define ANADIG_USB2_CHRG_DETECT_SET 0x214 +#define ANADIG_USB2_VBUS_DETECT_STAT 0x220 struct imx_usbphy { struct usb_phy usb_phy; @@ -132,6 +135,27 @@ static const struct phy_ops imx_phy_ops = { .to_usbphy = imx_usbphy_to_usbphy, }; +/* Albeit the access can only happen serial use two variables */ +unsigned int vbus_valid_usb1; +unsigned int vbus_valid_usb2; + +static int imx_usbphy_get_vbus_state(struct param_d *p, void *priv) +{ + struct imx_usbphy *imxphy = priv; + unsigned int *vbus_valid; + unsigned int reg, val; + + reg = imxphy->port_id ? + ANADIG_USB1_VBUS_DETECT_STAT : + ANADIG_USB2_VBUS_DETECT_STAT; + val = readl(imxphy->anatop + reg); + + vbus_valid = imxphy->port_id ? &vbus_valid_usb1 : &vbus_valid_usb2; + *vbus_valid = !!(val & ANADIG_USB1_VBUS_DETECT_STAT_VBUS_VALID); + + return 0; +} + static int imx_usbphy_probe(struct device_d *dev) { struct resource *iores; @@ -149,11 +173,19 @@ static int imx_usbphy_probe(struct device_d *dev) imxphy->port_id = ret; if (of_get_property(np, "fsl,anatop", NULL)) { + unsigned int *vbus_valid = imxphy->port_id ? + &vbus_valid_usb1 : + &vbus_valid_usb2; + imxphy->anatop = syscon_base_lookup_by_phandle(np, "fsl,anatop"); ret = PTR_ERR_OR_ZERO(imxphy->anatop); if (ret) goto err_free; + + dev_add_param_bool(dev, "vbus_valid", param_set_readonly, + imx_usbphy_get_vbus_state, vbus_valid, + imxphy); } iores = dev_request_mem_resource(dev, 0); -- 2.30.2 _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox