aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWolfram Sang <wsa+renesas@sang-engineering.com>2016-03-03 03:24:12 -0500
committerWim Van Sebroeck <wim@iguana.be>2016-03-16 16:09:16 -0400
commit84b84bcf4f718b7b9f5296d4068025fea801a0e1 (patch)
treee6f039e2e02679d26a63c4757245cf8aa4281c8f
parentccc8208d0855a5b02a4fc49c141b6f1dbf282304 (diff)
watchdog: tangox_wdt: test clock rate to avoid division by 0
The clk API may return 0 on clk_get_rate, so we should check the result before using it as a divisor. For this, refactor the code to use a central error path. Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com> Signed-off-by: Guenter Roeck <linux@roeck-us.net> Signed-off-by: Wim Van Sebroeck <wim@iguana.be>
-rw-r--r--drivers/watchdog/tangox_wdt.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/drivers/watchdog/tangox_wdt.c b/drivers/watchdog/tangox_wdt.c
index 709c1ed6fd79..cfbed7e051b6 100644
--- a/drivers/watchdog/tangox_wdt.c
+++ b/drivers/watchdog/tangox_wdt.c
@@ -139,6 +139,10 @@ static int tangox_wdt_probe(struct platform_device *pdev)
139 return err; 139 return err;
140 140
141 dev->clk_rate = clk_get_rate(dev->clk); 141 dev->clk_rate = clk_get_rate(dev->clk);
142 if (!dev->clk_rate) {
143 err = -EINVAL;
144 goto err;
145 }
142 146
143 dev->wdt.parent = &pdev->dev; 147 dev->wdt.parent = &pdev->dev;
144 dev->wdt.info = &tangox_wdt_info; 148 dev->wdt.info = &tangox_wdt_info;
@@ -171,10 +175,8 @@ static int tangox_wdt_probe(struct platform_device *pdev)
171 } 175 }
172 176
173 err = watchdog_register_device(&dev->wdt); 177 err = watchdog_register_device(&dev->wdt);
174 if (err) { 178 if (err)
175 clk_disable_unprepare(dev->clk); 179 goto err;
176 return err;
177 }
178 180
179 platform_set_drvdata(pdev, dev); 181 platform_set_drvdata(pdev, dev);
180 182
@@ -187,6 +189,10 @@ static int tangox_wdt_probe(struct platform_device *pdev)
187 dev_info(&pdev->dev, "SMP86xx/SMP87xx watchdog registered\n"); 189 dev_info(&pdev->dev, "SMP86xx/SMP87xx watchdog registered\n");
188 190
189 return 0; 191 return 0;
192
193 err:
194 clk_disable_unprepare(dev->clk);
195 return err;
190} 196}
191 197
192static int tangox_wdt_remove(struct platform_device *pdev) 198static int tangox_wdt_remove(struct platform_device *pdev)