RE: [PATCH] phy: rcar-gen3-usb2: fix unexpected repeat interrupts of VBUS change

From: Yoshihiro Shimoda
Date: Thu Jun 16 2016 - 05:05:10 EST


Hi Kishon,

Would you review this patch?

Best regards,
Yoshihiro Shimoda

> -----Original Message-----
> From: Yoshihiro Shimoda
> Sent: Tuesday, May 31, 2016 9:47 PM
> To: kishon@xxxxxx
> Cc: linux-kernel@xxxxxxxxxxxxxxx; linux-renesas-soc@xxxxxxxxxxxxxxx; stable@xxxxxxxxxxxxxxx; Yoshihiro Shimoda
> <yoshihiro.shimoda.uh@xxxxxxxxxxx>
> Subject: [PATCH] phy: rcar-gen3-usb2: fix unexpected repeat interrupts of VBUS change
>
> This patch fixes an issue that the driver is possible to cause
> unexpected repeat interrupts if a board condition is wrong
> (e.g. even if the ID pin is as function, a board supplies the VBUS.)
>
> The reason why unexpected repeat interrupts happen is:
> 1) The driver changed the mode to function if it detected the ID pin
> is high and the VBUS is high.
> 2) After the driver changed function mode, it disabled the "VBUS control"
> feature. Then, the VBUS signal will be low.
> 3) Since the VBUS change interruption happened, the driver checked
> the ID pin and VBUS.
> 4) Since VBUS was low, the driver changed the mode to host and enabled
> the "VBUS control" feature. Then the VBUS signal will be high.
> 5) Since the VBUS change interruption happened, the driver did 1) above.
>
> So, this patch modified the condition in rcar_gen3_device_recognition()
> to check the ID pin only.
>
> Fixes: 1114e2d (phy: rcar-gen3-usb2: change the mode to OTG on the combined channel)
> Cc: <stable@xxxxxxxxxxxxxxx> # v4.5+
> Reported-by: Simon Horman <horms@xxxxxxxxxxxx>
> Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@xxxxxxxxxxx>
> ---
> drivers/phy/phy-rcar-gen3-usb2.c | 14 +-------------
> 1 file changed, 1 insertion(+), 13 deletions(-)
>
> diff --git a/drivers/phy/phy-rcar-gen3-usb2.c b/drivers/phy/phy-rcar-gen3-usb2.c
> index 76bb88f..4be3f5d 100644
> --- a/drivers/phy/phy-rcar-gen3-usb2.c
> +++ b/drivers/phy/phy-rcar-gen3-usb2.c
> @@ -144,12 +144,6 @@ static void rcar_gen3_init_for_peri(struct rcar_gen3_chan *ch)
> extcon_set_cable_state_(ch->extcon, EXTCON_USB, true);
> }
>
> -static bool rcar_gen3_check_vbus(struct rcar_gen3_chan *ch)
> -{
> - return !!(readl(ch->base + USB2_ADPCTRL) &
> - USB2_ADPCTRL_OTGSESSVLD);
> -}
> -
> static bool rcar_gen3_check_id(struct rcar_gen3_chan *ch)
> {
> return !!(readl(ch->base + USB2_ADPCTRL) & USB2_ADPCTRL_IDDIG);
> @@ -157,13 +151,7 @@ static bool rcar_gen3_check_id(struct rcar_gen3_chan *ch)
>
> static void rcar_gen3_device_recognition(struct rcar_gen3_chan *ch)
> {
> - bool is_host = true;
> -
> - /* B-device? */
> - if (rcar_gen3_check_id(ch) && rcar_gen3_check_vbus(ch))
> - is_host = false;
> -
> - if (is_host)
> + if (!rcar_gen3_check_id(ch))
> rcar_gen3_init_for_host(ch);
> else
> rcar_gen3_init_for_peri(ch);
> --
> 1.9.1