lkml.org 
[lkml]   [2022]   [Oct]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 6.0 797/862] usb: host: xhci-plat: suspend and resume clocks
    Date
    From: Justin Chen <justinpopo6@gmail.com>

    [ Upstream commit 8bd954c56197caf5e3a804d989094bc3fe6329aa ]

    Introduce XHCI_SUSPEND_RESUME_CLKS quirk as a means to suspend and resume
    clocks if the hardware is capable of doing so. We assume that clocks will
    be needed if the device may wake.

    Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
    Signed-off-by: Justin Chen <justinpopo6@gmail.com>
    Link: https://lore.kernel.org/r/1660170455-15781-2-git-send-email-justinpopo6@gmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/usb/host/xhci-plat.c | 16 +++++++++++++++-
    drivers/usb/host/xhci.h | 1 +
    2 files changed, 16 insertions(+), 1 deletion(-)

    diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c
    index a8641b6536ee..ef10982ad482 100644
    --- a/drivers/usb/host/xhci-plat.c
    +++ b/drivers/usb/host/xhci-plat.c
    @@ -437,7 +437,16 @@ static int __maybe_unused xhci_plat_suspend(struct device *dev)
    * xhci_suspend() needs `do_wakeup` to know whether host is allowed
    * to do wakeup during suspend.
    */
    - return xhci_suspend(xhci, device_may_wakeup(dev));
    + ret = xhci_suspend(xhci, device_may_wakeup(dev));
    + if (ret)
    + return ret;
    +
    + if (!device_may_wakeup(dev) && (xhci->quirks & XHCI_SUSPEND_RESUME_CLKS)) {
    + clk_disable_unprepare(xhci->clk);
    + clk_disable_unprepare(xhci->reg_clk);
    + }
    +
    + return 0;
    }

    static int __maybe_unused xhci_plat_resume(struct device *dev)
    @@ -446,6 +455,11 @@ static int __maybe_unused xhci_plat_resume(struct device *dev)
    struct xhci_hcd *xhci = hcd_to_xhci(hcd);
    int ret;

    + if (!device_may_wakeup(dev) && (xhci->quirks & XHCI_SUSPEND_RESUME_CLKS)) {
    + clk_prepare_enable(xhci->clk);
    + clk_prepare_enable(xhci->reg_clk);
    + }
    +
    ret = xhci_priv_resume_quirk(hcd);
    if (ret)
    return ret;
    diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h
    index 7caa0db5e826..6dfbf73ee840 100644
    --- a/drivers/usb/host/xhci.h
    +++ b/drivers/usb/host/xhci.h
    @@ -1899,6 +1899,7 @@ struct xhci_hcd {
    #define XHCI_NO_SOFT_RETRY BIT_ULL(40)
    #define XHCI_BROKEN_D3COLD BIT_ULL(41)
    #define XHCI_EP_CTX_BROKEN_DCS BIT_ULL(42)
    +#define XHCI_SUSPEND_RESUME_CLKS BIT_ULL(43)

    unsigned int num_active_eps;
    unsigned int limit_active_eps;
    --
    2.35.1


    \
     
     \ /
      Last update: 2022-10-19 11:37    [W:2.870 / U:1.848 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site