lkml.org 
[lkml]   [2019]   [Dec]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 101/434] usb: renesas_usbhs: add suspend event support in gadget mode
    Date
    From: Veeraiyan Chidambaram <veeraiyan.chidambaram@in.bosch.com>

    [ Upstream commit 39abcc84846bbc0538f13c190b6a9c7e36890cd2 ]

    When R-Car Gen3 USB 2.0 is in Gadget mode, if host is detached an interrupt
    will be generated and Suspended state bit is set in interrupt status
    register. Interrupt handler will call driver->suspend(composite_suspend)
    if suspended state bit is set. composite_suspend will call
    ffs_func_suspend which will post FUNCTIONFS_SUSPEND and will be consumed
    by user space application via /dev/ep0.

    To be able to detect host detach, extend the DVSQ_MASK to cover the
    Suspended bit of the DVSQ[2:0] bitfield from the Interrupt Status
    Register 0 (INTSTS0) register and perform appropriate action in the
    DVST interrupt handler (usbhsg_irq_dev_state).

    Without this commit, disconnection of the phone from R-Car-H3 ES2.0
    Salvator-X CN9 port is not recognized and reverse role switch does
    not happen. If phone is connected again it does not enumerate.

    With this commit, disconnection will be recognized and reverse role
    switch will happen by a user space application. If phone is connected
    again it will enumerate properly and will become visible in the output
    of 'lsusb'.

    Signed-off-by: Veeraiyan Chidambaram <veeraiyan.chidambaram@in.bosch.com>
    Signed-off-by: Eugeniu Rosca <erosca@de.adit-jv.com>
    Reviewed-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
    Tested-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
    Link: https://lore.kernel.org/r/1568207756-22325-3-git-send-email-external.veeraiyan.c@de.adit-jv.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/usb/renesas_usbhs/common.h | 3 ++-
    drivers/usb/renesas_usbhs/mod_gadget.c | 12 +++++++++---
    2 files changed, 11 insertions(+), 4 deletions(-)

    diff --git a/drivers/usb/renesas_usbhs/common.h b/drivers/usb/renesas_usbhs/common.h
    index 0824099b905e..ef1735d014da 100644
    --- a/drivers/usb/renesas_usbhs/common.h
    +++ b/drivers/usb/renesas_usbhs/common.h
    @@ -161,11 +161,12 @@ struct usbhs_priv;
    #define VBSTS (1 << 7) /* VBUS_0 and VBUSIN_0 Input Status */
    #define VALID (1 << 3) /* USB Request Receive */

    -#define DVSQ_MASK (0x3 << 4) /* Device State */
    +#define DVSQ_MASK (0x7 << 4) /* Device State */
    #define POWER_STATE (0 << 4)
    #define DEFAULT_STATE (1 << 4)
    #define ADDRESS_STATE (2 << 4)
    #define CONFIGURATION_STATE (3 << 4)
    +#define SUSPENDED_STATE (4 << 4)

    #define CTSQ_MASK (0x7) /* Control Transfer Stage */
    #define IDLE_SETUP_STAGE 0 /* Idle stage or setup stage */
    diff --git a/drivers/usb/renesas_usbhs/mod_gadget.c b/drivers/usb/renesas_usbhs/mod_gadget.c
    index cd38d74b3223..53489cafecc1 100644
    --- a/drivers/usb/renesas_usbhs/mod_gadget.c
    +++ b/drivers/usb/renesas_usbhs/mod_gadget.c
    @@ -457,12 +457,18 @@ static int usbhsg_irq_dev_state(struct usbhs_priv *priv,
    {
    struct usbhsg_gpriv *gpriv = usbhsg_priv_to_gpriv(priv);
    struct device *dev = usbhsg_gpriv_to_dev(gpriv);
    + int state = usbhs_status_get_device_state(irq_state);

    gpriv->gadget.speed = usbhs_bus_get_speed(priv);

    - dev_dbg(dev, "state = %x : speed : %d\n",
    - usbhs_status_get_device_state(irq_state),
    - gpriv->gadget.speed);
    + dev_dbg(dev, "state = %x : speed : %d\n", state, gpriv->gadget.speed);
    +
    + if (gpriv->gadget.speed != USB_SPEED_UNKNOWN &&
    + (state & SUSPENDED_STATE)) {
    + if (gpriv->driver && gpriv->driver->suspend)
    + gpriv->driver->suspend(&gpriv->gadget);
    + usb_gadget_set_state(&gpriv->gadget, USB_STATE_SUSPENDED);
    + }

    return 0;
    }
    --
    2.20.1


    \
     
     \ /
      Last update: 2022-09-17 16:07    [W:3.270 / U:0.480 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site