On Wed, Mar 20, 2013 at 3:07 PM, Felipe Balbi <balbi@xxxxxx> wrote: > On Sun, Mar 17, 2013 at 08:23:25PM +0200, Grazvydas Ignotas wrote: >> At least on pandora, STS_VBUS gets set even when VBUS is driven by twl >> itself. Reporting VBUS in this case confuses OMAP musb glue and charger >> driver, so check if OTG VBUS charge pump is on before reporting VBUS >> event to avoid this problem. >> >> Signed-off-by: Grazvydas Ignotas <notasas@xxxxxxxxx> >> --- >> drivers/usb/phy/phy-twl4030-usb.c | 36 +++++++++++++++++++++++++++++++----- >> 1 file changed, 31 insertions(+), 5 deletions(-) >> >> diff --git a/drivers/usb/phy/phy-twl4030-usb.c b/drivers/usb/phy/phy-twl4030-usb.c >> index 425c18a..87bf11d 100644 >> --- a/drivers/usb/phy/phy-twl4030-usb.c >> +++ b/drivers/usb/phy/phy-twl4030-usb.c >> @@ -248,11 +248,31 @@ twl4030_usb_clear_bits(struct twl4030_usb *twl, u8 reg, u8 bits) >> >> /*-------------------------------------------------------------------------*/ >> >> +static bool twl4030_is_driving_vbus(struct twl4030_usb *twl) >> +{ >> + int ret; >> + >> + ret = twl4030_usb_read(twl, PHY_CLK_CTRL_STS); >> + if (ret < 0 || !(ret & PHY_DPLL_CLK)) >> + /* >> + * if clocks are off, registers are not updated, >> + * but we can assume we don't drive VBUS in this case >> + */ >> + return false; >> + >> + ret = twl4030_usb_read(twl, ULPI_OTG_CTRL); >> + if (ret < 0) >> + return false; >> + >> + return (ret & (ULPI_OTG_DRVVBUS | ULPI_OTG_CHRGVBUS)) ? true : false; >> +} >> + >> static enum omap_musb_vbus_id_status >> twl4030_usb_linkstat(struct twl4030_usb *twl) >> { >> int status; >> enum omap_musb_vbus_id_status linkstat = OMAP_MUSB_UNKNOWN; >> + bool driving_vbus = false; >> >> twl->vbus_supplied = false; >> >> @@ -270,20 +290,26 @@ static enum omap_musb_vbus_id_status >> if (status < 0) >> dev_err(twl->dev, "USB link status err %d\n", status); >> else if (status & (BIT(7) | BIT(2))) { >> - if (status & (BIT(7))) >> - twl->vbus_supplied = true; >> + if (status & BIT(7)) { >> + driving_vbus = twl4030_is_driving_vbus(twl); >> + if (driving_vbus) > > how about just: > > if (twl4030_is_driving_vbus(twl)) > status &= ~BIT(7); > > ???? I'm logging driving_vbus below with dev_dbg(), so that it's easier to see what going on.. > > -- > balbi -- Gražvydas -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html