lkml.org 
[lkml]   [2021]   [Sep]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.14 042/252] USB: EHCI: ehci-mv: improve error handling in mv_ehci_enable()
    Date
    From: Evgeny Novikov <novikov@ispras.ru>

    [ Upstream commit 61136a12cbed234374ec6f588af57c580b20b772 ]

    mv_ehci_enable() did not disable and unprepare clocks in case of
    failures of phy_init(). Besides, it did not take into account failures
    of ehci_clock_enable() (in effect, failures of clk_prepare_enable()).
    The patch fixes both issues and gets rid of redundant wrappers around
    clk_prepare_enable() and clk_disable_unprepare() to simplify this a bit.

    Found by Linux Driver Verification project (linuxtesting.org).

    Acked-by: Alan Stern <stern@rowland.harvard.edu>
    Signed-off-by: Evgeny Novikov <novikov@ispras.ru>
    Link: https://lore.kernel.org/r/20210708083056.21543-1-novikov@ispras.ru
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/usb/host/ehci-mv.c | 23 +++++++++++------------
    1 file changed, 11 insertions(+), 12 deletions(-)

    diff --git a/drivers/usb/host/ehci-mv.c b/drivers/usb/host/ehci-mv.c
    index cffdc8d01b2a..8fd27249ad25 100644
    --- a/drivers/usb/host/ehci-mv.c
    +++ b/drivers/usb/host/ehci-mv.c
    @@ -42,26 +42,25 @@ struct ehci_hcd_mv {
    int (*set_vbus)(unsigned int vbus);
    };

    -static void ehci_clock_enable(struct ehci_hcd_mv *ehci_mv)
    +static int mv_ehci_enable(struct ehci_hcd_mv *ehci_mv)
    {
    - clk_prepare_enable(ehci_mv->clk);
    -}
    + int retval;

    -static void ehci_clock_disable(struct ehci_hcd_mv *ehci_mv)
    -{
    - clk_disable_unprepare(ehci_mv->clk);
    -}
    + retval = clk_prepare_enable(ehci_mv->clk);
    + if (retval)
    + return retval;

    -static int mv_ehci_enable(struct ehci_hcd_mv *ehci_mv)
    -{
    - ehci_clock_enable(ehci_mv);
    - return phy_init(ehci_mv->phy);
    + retval = phy_init(ehci_mv->phy);
    + if (retval)
    + clk_disable_unprepare(ehci_mv->clk);
    +
    + return retval;
    }

    static void mv_ehci_disable(struct ehci_hcd_mv *ehci_mv)
    {
    phy_exit(ehci_mv->phy);
    - ehci_clock_disable(ehci_mv);
    + clk_disable_unprepare(ehci_mv->clk);
    }

    static int mv_ehci_reset(struct usb_hcd *hcd)
    --
    2.30.2
    \
     
     \ /
      Last update: 2021-09-09 13:47    [W:4.083 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site