aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/watchdog/shwdt.c
diff options
context:
space:
mode:
authorPaul Mundt <lethal@linux-sh.org>2012-05-10 03:14:40 -0400
committerPaul Mundt <lethal@linux-sh.org>2012-05-10 03:14:40 -0400
commitd42c97443da5a542201f6cbaf793606877115d05 (patch)
tree10c0f14559b714d78ccc508d46350f1bfd2d6172 /drivers/watchdog/shwdt.c
parent8c013d964ac32c20afe2cdeadf59926d87012b37 (diff)
watchdog: shwdt: Use finer grained clock control.
The clk enable/disable pairs can be pushed down to start/stop rather than probe/remove, along with the runtime PM callsites. This will allow us to keep the block powered off until userspace comes along and decides to do something with it. Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Diffstat (limited to 'drivers/watchdog/shwdt.c')
-rw-r--r--drivers/watchdog/shwdt.c12
1 files changed, 5 insertions, 7 deletions
diff --git a/drivers/watchdog/shwdt.c b/drivers/watchdog/shwdt.c
index b11104702d23..e5b59bebcdb1 100644
--- a/drivers/watchdog/shwdt.c
+++ b/drivers/watchdog/shwdt.c
@@ -89,6 +89,7 @@ static int sh_wdt_start(struct watchdog_device *wdt_dev)
89 u8 csr; 89 u8 csr;
90 90
91 pm_runtime_get_sync(wdt->dev); 91 pm_runtime_get_sync(wdt->dev);
92 clk_enable(wdt->clk);
92 93
93 spin_lock_irqsave(&wdt->lock, flags); 94 spin_lock_irqsave(&wdt->lock, flags);
94 95
@@ -140,6 +141,7 @@ static int sh_wdt_stop(struct watchdog_device *wdt_dev)
140 141
141 spin_unlock_irqrestore(&wdt->lock, flags); 142 spin_unlock_irqrestore(&wdt->lock, flags);
142 143
144 clk_disable(wdt->clk);
143 pm_runtime_put_sync(wdt->dev); 145 pm_runtime_put_sync(wdt->dev);
144 146
145 return 0; 147 return 0;
@@ -247,12 +249,10 @@ static int __devinit sh_wdt_probe(struct platform_device *pdev)
247 wdt->clk = NULL; 249 wdt->clk = NULL;
248 } 250 }
249 251
250 clk_enable(wdt->clk);
251
252 wdt->base = devm_request_and_ioremap(wdt->dev, res); 252 wdt->base = devm_request_and_ioremap(wdt->dev, res);
253 if (unlikely(!wdt->base)) { 253 if (unlikely(!wdt->base)) {
254 rc = -EADDRNOTAVAIL; 254 rc = -EADDRNOTAVAIL;
255 goto out_disable; 255 goto err;
256 } 256 }
257 257
258 watchdog_set_nowayout(&sh_wdt_dev, nowayout); 258 watchdog_set_nowayout(&sh_wdt_dev, nowayout);
@@ -276,7 +276,7 @@ static int __devinit sh_wdt_probe(struct platform_device *pdev)
276 rc = watchdog_register_device(&sh_wdt_dev); 276 rc = watchdog_register_device(&sh_wdt_dev);
277 if (unlikely(rc)) { 277 if (unlikely(rc)) {
278 dev_err(&pdev->dev, "Can't register watchdog (err=%d)\n", rc); 278 dev_err(&pdev->dev, "Can't register watchdog (err=%d)\n", rc);
279 goto out_disable; 279 goto err;
280 } 280 }
281 281
282 init_timer(&wdt->timer); 282 init_timer(&wdt->timer);
@@ -292,8 +292,7 @@ static int __devinit sh_wdt_probe(struct platform_device *pdev)
292 292
293 return 0; 293 return 0;
294 294
295out_disable: 295err:
296 clk_disable(wdt->clk);
297 clk_put(wdt->clk); 296 clk_put(wdt->clk);
298 297
299 return rc; 298 return rc;
@@ -308,7 +307,6 @@ static int __devexit sh_wdt_remove(struct platform_device *pdev)
308 watchdog_unregister_device(&sh_wdt_dev); 307 watchdog_unregister_device(&sh_wdt_dev);
309 308
310 pm_runtime_disable(&pdev->dev); 309 pm_runtime_disable(&pdev->dev);
311 clk_disable(wdt->clk);
312 clk_put(wdt->clk); 310 clk_put(wdt->clk);
313 311
314 return 0; 312 return 0;