[U-Boot] [PATCH] sunxi: musb: Power off OTG port VBUS when disabled

Hans de Goede hdegoede at redhat.com
Sat Sep 17 14:27:25 CEST 2016


Hi,

On 07-09-16 08:25, Chen-Yu Tsai wrote:
> The Linux kernel musb driver expects VBUS to be off while initializing
> musb. Having it on results in a repeating string of warnings, followed
> by an unusable peripheral. The peripheral is only usable after
> physically removing the OTG adapter, letting musb reset its state.
>
> This partially reverts commit c9f8947e6604 ("sunxi: usb-phy: Never
> power off the usb ports")
>
> Signed-off-by: Chen-Yu Tsai <wens at csie.org>

Thank you, LGTM:

Reviewed-by: Hans de Goede <hdegoede at redhat.com>

I've added this to my local queue and this will go out
with the pull-req I plan todo later today.

Regards,

Hans


> ---
>  arch/arm/include/asm/arch-sunxi/usb_phy.h |  1 -
>  arch/arm/mach-sunxi/usb_phy.c             |  7 -------
>  drivers/usb/musb-new/sunxi.c              | 28 ++++++++++++----------------
>  3 files changed, 12 insertions(+), 24 deletions(-)
>
> diff --git a/arch/arm/include/asm/arch-sunxi/usb_phy.h b/arch/arm/include/asm/arch-sunxi/usb_phy.h
> index 6a14cad3ff39..cef6c985bc8d 100644
> --- a/arch/arm/include/asm/arch-sunxi/usb_phy.h
> +++ b/arch/arm/include/asm/arch-sunxi/usb_phy.h
> @@ -16,7 +16,6 @@ void sunxi_usb_phy_init(int index);
>  void sunxi_usb_phy_exit(int index);
>  void sunxi_usb_phy_power_on(int index);
>  void sunxi_usb_phy_power_off(int index);
> -int sunxi_usb_phy_power_is_on(int index);
>  int sunxi_usb_phy_vbus_detect(int index);
>  int sunxi_usb_phy_id_detect(int index);
>  void sunxi_usb_phy_enable_squelch_detect(int index, int enable);
> diff --git a/arch/arm/mach-sunxi/usb_phy.c b/arch/arm/mach-sunxi/usb_phy.c
> index f9993d287551..bd1bbee410ba 100644
> --- a/arch/arm/mach-sunxi/usb_phy.c
> +++ b/arch/arm/mach-sunxi/usb_phy.c
> @@ -296,13 +296,6 @@ void sunxi_usb_phy_power_off(int index)
>  		gpio_set_value(phy->gpio_vbus, 0);
>  }
>
> -int sunxi_usb_phy_power_is_on(int index)
> -{
> -	struct sunxi_usb_phy *phy = &sunxi_usb_phy[index];
> -
> -	return phy->power_on_count > 0;
> -}
> -
>  int sunxi_usb_phy_vbus_detect(int index)
>  {
>  	struct sunxi_usb_phy *phy = &sunxi_usb_phy[index];
> diff --git a/drivers/usb/musb-new/sunxi.c b/drivers/usb/musb-new/sunxi.c
> index c016a0bb544d..dece7818dc3a 100644
> --- a/drivers/usb/musb-new/sunxi.c
> +++ b/drivers/usb/musb-new/sunxi.c
> @@ -205,6 +205,8 @@ static struct musb *sunxi_musb;
>
>  static int sunxi_musb_enable(struct musb *musb)
>  {
> +	int ret;
> +
>  	pr_debug("%s():\n", __func__);
>
>  	musb_ep_select(musb->mregs, 0);
> @@ -217,26 +219,17 @@ static int sunxi_musb_enable(struct musb *musb)
>  	musb_writeb(musb->mregs, USBC_REG_o_VEND0, 0);
>
>  	if (is_host_enabled(musb)) {
> -		int id = sunxi_usb_phy_id_detect(0);
> -
> -		if (id == 1 && sunxi_usb_phy_power_is_on(0))
> -			sunxi_usb_phy_power_off(0);
> -
> -		if (!sunxi_usb_phy_power_is_on(0)) {
> -			int vbus = sunxi_usb_phy_vbus_detect(0);
> -			if (vbus == 1) {
> -				printf("A charger is plugged into the OTG: ");
> -				return -ENODEV;
> -			}
> +		ret = sunxi_usb_phy_vbus_detect(0);
> +		if (ret == 1) {
> +			printf("A charger is plugged into the OTG: ");
> +			return -ENODEV;
>  		}
> -
> -		if (id == 1) {
> +		ret = sunxi_usb_phy_id_detect(0);
> +		if (ret == 1) {
>  			printf("No host cable detected: ");
>  			return -ENODEV;
>  		}
> -
> -		if (!sunxi_usb_phy_power_is_on(0))
> -			sunxi_usb_phy_power_on(0);
> +		sunxi_usb_phy_power_on(0); /* port power on */
>  	}
>
>  	USBC_ForceVbusValidToHigh(musb->mregs);
> @@ -252,6 +245,9 @@ static void sunxi_musb_disable(struct musb *musb)
>  	if (!enabled)
>  		return;
>
> +	if (is_host_enabled(musb))
> +		sunxi_usb_phy_power_off(0); /* port power off */
> +
>  	USBC_ForceVbusValidToLow(musb->mregs);
>  	mdelay(200); /* Wait for the current session to timeout */
>
>


More information about the U-Boot mailing list