diff options
author | Paul Mundt <lethal@linux-sh.org> | 2012-05-10 03:14:40 -0400 |
---|---|---|
committer | Paul Mundt <lethal@linux-sh.org> | 2012-05-10 03:14:40 -0400 |
commit | d42c97443da5a542201f6cbaf793606877115d05 (patch) | |
tree | 10c0f14559b714d78ccc508d46350f1bfd2d6172 /drivers/watchdog/shwdt.c | |
parent | 8c013d964ac32c20afe2cdeadf59926d87012b37 (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.c | 12 |
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 | ||
295 | out_disable: | 295 | err: |
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; |