patch "phy: rcar-gen3-usb2: fix unexpected repeat interrupts of VBUS change" added to usb-linus
This is a note to let you know that I've just added the patch titled
phy: rcar-gen3-usb2: fix unexpected repeat interrupts of VBUS change
to my usb git tree which can be found at
git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git
in the usb-linus branch.
The patch will show up in the next release of the linux-next tree (usually sometime within the next 24 hours during the week.)
The patch will hopefully also be merged in Linus's tree for the next -rc kernel release.
If you have any questions about this process, please let me know.
Quoted 1 line
From
6762925df4642aec5629f7971ba477d6930f53f7Mon Sep 17 00:00:00 2001
From: Yoshihiro Shimoda <[email protected]>
Date: Tue, 31 May 2016 21:47:17 +0900
Subject: 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.
--- drivers/phy/phy-rcar-gen3-usb2.c | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-)
drivers/phy/phy-rcar-gen3-usb2.c +1 -13
@@ -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);
Signature · 1 line
2.9.0