lkml.org 
[lkml]   [2022]   [Jun]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.18 061/339] rtc: ftrtc010: Fix error handling in ftrtc010_rtc_probe
    Date
    From: Miaoqian Lin <linmq006@gmail.com>

    [ Upstream commit b520cbe5be37b1b9b401c0b6ecbdae32575273db ]

    In the error handling path, the clk_prepare_enable() function
    call should be balanced by a corresponding 'clk_disable_unprepare()'
    call , as already done in the remove function.

    clk_disable_unprepare calls clk_disable() and clk_unprepare().
    They will use IS_ERR_OR_NULL to check the argument.

    Fixes: ac05fba39cc5 ("rtc: gemini: Add optional clock handling")
    Signed-off-by: Miaoqian Lin <linmq006@gmail.com>
    Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
    Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
    Link: https://lore.kernel.org/r/20220403054912.31739-1-linmq006@gmail.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/rtc/rtc-ftrtc010.c | 34 ++++++++++++++++++++++++----------
    1 file changed, 24 insertions(+), 10 deletions(-)

    diff --git a/drivers/rtc/rtc-ftrtc010.c b/drivers/rtc/rtc-ftrtc010.c
    index 53bb08fe1cd4..25c6e7d9570f 100644
    --- a/drivers/rtc/rtc-ftrtc010.c
    +++ b/drivers/rtc/rtc-ftrtc010.c
    @@ -137,26 +137,34 @@ static int ftrtc010_rtc_probe(struct platform_device *pdev)
    ret = clk_prepare_enable(rtc->extclk);
    if (ret) {
    dev_err(dev, "failed to enable EXTCLK\n");
    - return ret;
    + goto err_disable_pclk;
    }
    }

    rtc->rtc_irq = platform_get_irq(pdev, 0);
    - if (rtc->rtc_irq < 0)
    - return rtc->rtc_irq;
    + if (rtc->rtc_irq < 0) {
    + ret = rtc->rtc_irq;
    + goto err_disable_extclk;
    + }

    res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
    - if (!res)
    - return -ENODEV;
    + if (!res) {
    + ret = -ENODEV;
    + goto err_disable_extclk;
    + }

    rtc->rtc_base = devm_ioremap(dev, res->start,
    resource_size(res));
    - if (!rtc->rtc_base)
    - return -ENOMEM;
    + if (!rtc->rtc_base) {
    + ret = -ENOMEM;
    + goto err_disable_extclk;
    + }

    rtc->rtc_dev = devm_rtc_allocate_device(dev);
    - if (IS_ERR(rtc->rtc_dev))
    - return PTR_ERR(rtc->rtc_dev);
    + if (IS_ERR(rtc->rtc_dev)) {
    + ret = PTR_ERR(rtc->rtc_dev);
    + goto err_disable_extclk;
    + }

    rtc->rtc_dev->ops = &ftrtc010_rtc_ops;

    @@ -172,9 +180,15 @@ static int ftrtc010_rtc_probe(struct platform_device *pdev)
    ret = devm_request_irq(dev, rtc->rtc_irq, ftrtc010_rtc_interrupt,
    IRQF_SHARED, pdev->name, dev);
    if (unlikely(ret))
    - return ret;
    + goto err_disable_extclk;

    return devm_rtc_register_device(rtc->rtc_dev);
    +
    +err_disable_extclk:
    + clk_disable_unprepare(rtc->extclk);
    +err_disable_pclk:
    + clk_disable_unprepare(rtc->pclk);
    + return ret;
    }

    static int ftrtc010_rtc_remove(struct platform_device *pdev)
    --
    2.35.1


    \
     
     \ /
      Last update: 2022-06-13 15:36    [W:4.304 / U:0.048 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site