watchdog: davinci_wdt: fix error handling in davinci_wdt_probe()
authorAlexey Khoroshilov <khoroshilov@ispras.ru>
Fri, 23 Mar 2018 21:36:46 +0000 (00:36 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 30 May 2018 05:52:29 +0000 (07:52 +0200)
[ Upstream commit d66e53649c18377edc08d48901e658e4fd491d46 ]

clk_disable_unprepare() was added to one error path,
but there is another one. The patch makes sure clk is
disabled at the both of them.

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

Signed-off-by: Alexey Khoroshilov <khoroshilov@ispras.ru>
Reviewed-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Wim Van Sebroeck <wim@iguana.be>
Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/watchdog/davinci_wdt.c

index 2f46487af86d05a72216030e188feb74777b546e..6d9a5d8c3c8dbafc0cffaedf85a48553d7fb6a99 100644 (file)
@@ -198,15 +198,22 @@ static int davinci_wdt_probe(struct platform_device *pdev)
 
        wdt_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        davinci_wdt->base = devm_ioremap_resource(dev, wdt_mem);
-       if (IS_ERR(davinci_wdt->base))
-               return PTR_ERR(davinci_wdt->base);
+       if (IS_ERR(davinci_wdt->base)) {
+               ret = PTR_ERR(davinci_wdt->base);
+               goto err_clk_disable;
+       }
 
        ret = watchdog_register_device(wdd);
-       if (ret < 0) {
-               clk_disable_unprepare(davinci_wdt->clk);
+       if (ret) {
                dev_err(dev, "cannot register watchdog device\n");
+               goto err_clk_disable;
        }
 
+       return 0;
+
+err_clk_disable:
+       clk_disable_unprepare(davinci_wdt->clk);
+
        return ret;
 }