]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
phy: renesas: rcar-gen3-usb2: Disable clearing VBUS in over-current
authorYoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Tue, 6 Aug 2019 08:51:19 +0000 (17:51 +0900)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 21 Sep 2019 05:15:27 +0000 (07:15 +0200)
commit e6839c31a608e79f2057fab987dd814f5d3477e6 upstream.

The hardware manual should be revised, but the initial value of
VBCTRL.OCCLREN is set to 1 actually. If the bit is set, the hardware
clears VBCTRL.VBOUT and ADPCTRL.DRVVBUS registers automatically
when the hardware detects over-current signal from a USB power switch.
However, since the hardware doesn't have any registers which
indicates over-current, the driver cannot handle it at all. So, if
"is_otg_channel" hardware detects over-current, since ADPCTRL.DRVVBUS
register is cleared automatically, the channel cannot be used after
that.

To resolve this behavior, this patch sets the VBCTRL.OCCLREN to 0
to keep ADPCTRL.DRVVBUS even if the "is_otg_channel" hardware
detects over-current. (We assume a USB power switch itself protects
over-current and turns the VBUS off.)

This patch is inspired by a BSP patch from Kazuya Mizuguchi.

Fixes: 1114e2d31731 ("phy: rcar-gen3-usb2: change the mode to OTG on the combined channel")
Cc: <stable@vger.kernel.org> # v4.5+
Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/phy/renesas/phy-rcar-gen3-usb2.c

index 54c34298a0006fd1e896773e73b3c23859ab6faa..e8fe80312820d7f0f9f1d5376393836a9a5f74a1 100644 (file)
@@ -64,6 +64,7 @@
                                         USB2_OBINT_IDDIGCHG)
 
 /* VBCTRL */
+#define USB2_VBCTRL_OCCLREN            BIT(16)
 #define USB2_VBCTRL_DRVVBUSSEL         BIT(8)
 
 /* LINECTRL1 */
@@ -278,6 +279,7 @@ static void rcar_gen3_init_otg(struct rcar_gen3_chan *ch)
        u32 val;
 
        val = readl(usb2_base + USB2_VBCTRL);
+       val &= ~USB2_VBCTRL_OCCLREN;
        writel(val | USB2_VBCTRL_DRVVBUSSEL, usb2_base + USB2_VBCTRL);
        writel(USB2_OBINT_BITS, usb2_base + USB2_OBINTSTA);
        val = readl(usb2_base + USB2_OBINTEN);