lkml.org 
[lkml]   [2019]   [Sep]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.2 003/124] phy: renesas: rcar-gen3-usb2: Disable clearing VBUS in over-current
    Date
    From: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>

    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 | 2 ++
    1 file changed, 2 insertions(+)

    --- a/drivers/phy/renesas/phy-rcar-gen3-usb2.c
    +++ b/drivers/phy/renesas/phy-rcar-gen3-usb2.c
    @@ -61,6 +61,7 @@
    USB2_OBINT_IDDIGCHG)

    /* VBCTRL */
    +#define USB2_VBCTRL_OCCLREN BIT(16)
    #define USB2_VBCTRL_DRVVBUSSEL BIT(8)

    /* LINECTRL1 */
    @@ -374,6 +375,7 @@ static void rcar_gen3_init_otg(struct rc
    writel(val, usb2_base + USB2_LINECTRL1);

    val = readl(usb2_base + USB2_VBCTRL);
    + val &= ~USB2_VBCTRL_OCCLREN;
    writel(val | USB2_VBCTRL_DRVVBUSSEL, usb2_base + USB2_VBCTRL);
    val = readl(usb2_base + USB2_ADPCTRL);
    writel(val | USB2_ADPCTRL_IDPULLUP, usb2_base + USB2_ADPCTRL);

    \
     
     \ /
      Last update: 2019-09-20 00:07    [W:4.039 / U:0.524 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site