Re: [PATCHv2 5/7] usb: phy: twl4030-usb: check if vbus is driven by twl itself

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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);

????

-- 
balbi

Attachment: signature.asc
Description: Digital signature


[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux