OSDN Git Service

rtc: mxc: Use devm_add_action_or_reset() for calls to clk_disable_unprepare()
authorAnson Huang <Anson.Huang@nxp.com>
Mon, 16 Mar 2020 09:09:45 +0000 (17:09 +0800)
committerAlexandre Belloni <alexandre.belloni@bootlin.com>
Sun, 22 Mar 2020 21:10:41 +0000 (22:10 +0100)
Use devm_add_action_or_reset() for calls to clk_disable_unprepare(),
which can simplify the error handling, and .remove callback can be dropped.

Signed-off-by: Anson Huang <Anson.Huang@nxp.com>
Link: https://lore.kernel.org/r/1584349785-27042-1-git-send-email-Anson.Huang@nxp.com
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
drivers/rtc/rtc-mxc.c

index 902d57d..a8cfbde 100644 (file)
@@ -307,6 +307,14 @@ static const struct rtc_class_ops mxc_rtc_ops = {
        .alarm_irq_enable       = mxc_rtc_alarm_irq_enable,
 };
 
+static void mxc_rtc_action(void *p)
+{
+       struct rtc_plat_data *pdata = p;
+
+       clk_disable_unprepare(pdata->clk_ref);
+       clk_disable_unprepare(pdata->clk_ipg);
+}
+
 static int mxc_rtc_probe(struct platform_device *pdev)
 {
        struct rtc_device *rtc;
@@ -366,14 +374,20 @@ static int mxc_rtc_probe(struct platform_device *pdev)
 
        pdata->clk_ref = devm_clk_get(&pdev->dev, "ref");
        if (IS_ERR(pdata->clk_ref)) {
+               clk_disable_unprepare(pdata->clk_ipg);
                dev_err(&pdev->dev, "unable to get ref clock!\n");
-               ret = PTR_ERR(pdata->clk_ref);
-               goto exit_put_clk_ipg;
+               return PTR_ERR(pdata->clk_ref);
        }
 
        ret = clk_prepare_enable(pdata->clk_ref);
+       if (ret) {
+               clk_disable_unprepare(pdata->clk_ipg);
+               return ret;
+       }
+
+       ret = devm_add_action_or_reset(&pdev->dev, mxc_rtc_action, pdata);
        if (ret)
-               goto exit_put_clk_ipg;
+               return ret;
 
        rate = clk_get_rate(pdata->clk_ref);
 
@@ -385,16 +399,14 @@ static int mxc_rtc_probe(struct platform_device *pdev)
                reg = RTC_INPUT_CLK_38400HZ;
        else {
                dev_err(&pdev->dev, "rtc clock is not valid (%lu)\n", rate);
-               ret = -EINVAL;
-               goto exit_put_clk_ref;
+               return -EINVAL;
        }
 
        reg |= RTC_ENABLE_BIT;
        writew(reg, (pdata->ioaddr + RTC_RTCCTL));
        if (((readw(pdata->ioaddr + RTC_RTCCTL)) & RTC_ENABLE_BIT) == 0) {
                dev_err(&pdev->dev, "hardware module can't be enabled!\n");
-               ret = -EIO;
-               goto exit_put_clk_ref;
+               return -EIO;
        }
 
        platform_set_drvdata(pdev, pdata);
@@ -417,29 +429,10 @@ static int mxc_rtc_probe(struct platform_device *pdev)
        }
 
        ret = rtc_register_device(rtc);
-       if (ret)
-               goto exit_put_clk_ref;
-
-       return 0;
-
-exit_put_clk_ref:
-       clk_disable_unprepare(pdata->clk_ref);
-exit_put_clk_ipg:
-       clk_disable_unprepare(pdata->clk_ipg);
 
        return ret;
 }
 
-static int mxc_rtc_remove(struct platform_device *pdev)
-{
-       struct rtc_plat_data *pdata = platform_get_drvdata(pdev);
-
-       clk_disable_unprepare(pdata->clk_ref);
-       clk_disable_unprepare(pdata->clk_ipg);
-
-       return 0;
-}
-
 static struct platform_driver mxc_rtc_driver = {
        .driver = {
                   .name        = "mxc_rtc",
@@ -447,7 +440,6 @@ static struct platform_driver mxc_rtc_driver = {
        },
        .id_table = imx_rtc_devtype,
        .probe = mxc_rtc_probe,
-       .remove = mxc_rtc_remove,
 };
 
 module_platform_driver(mxc_rtc_driver)