diff options
author | Paul Mundt <lethal@linux-sh.org> | 2012-05-10 16:14:40 +0900 |
---|---|---|
committer | Paul Mundt <lethal@linux-sh.org> | 2012-05-10 16:14:40 +0900 |
commit | d42c97443da5a542201f6cbaf793606877115d05 (patch) | |
tree | 10c0f14559b714d78ccc508d46350f1bfd2d6172 /drivers/watchdog | |
parent | 8c013d964ac32c20afe2cdeadf59926d87012b37 (diff) | |
download | lwn-d42c97443da5a542201f6cbaf793606877115d05.tar.gz lwn-d42c97443da5a542201f6cbaf793606877115d05.zip |
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')
-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) u8 csr; pm_runtime_get_sync(wdt->dev); + clk_enable(wdt->clk); spin_lock_irqsave(&wdt->lock, flags); @@ -140,6 +141,7 @@ static int sh_wdt_stop(struct watchdog_device *wdt_dev) spin_unlock_irqrestore(&wdt->lock, flags); + clk_disable(wdt->clk); pm_runtime_put_sync(wdt->dev); return 0; @@ -247,12 +249,10 @@ static int __devinit sh_wdt_probe(struct platform_device *pdev) wdt->clk = NULL; } - clk_enable(wdt->clk); - wdt->base = devm_request_and_ioremap(wdt->dev, res); if (unlikely(!wdt->base)) { rc = -EADDRNOTAVAIL; - goto out_disable; + goto err; } watchdog_set_nowayout(&sh_wdt_dev, nowayout); @@ -276,7 +276,7 @@ static int __devinit sh_wdt_probe(struct platform_device *pdev) rc = watchdog_register_device(&sh_wdt_dev); if (unlikely(rc)) { dev_err(&pdev->dev, "Can't register watchdog (err=%d)\n", rc); - goto out_disable; + goto err; } init_timer(&wdt->timer); @@ -292,8 +292,7 @@ static int __devinit sh_wdt_probe(struct platform_device *pdev) return 0; -out_disable: - clk_disable(wdt->clk); +err: clk_put(wdt->clk); return rc; @@ -308,7 +307,6 @@ static int __devexit sh_wdt_remove(struct platform_device *pdev) watchdog_unregister_device(&sh_wdt_dev); pm_runtime_disable(&pdev->dev); - clk_disable(wdt->clk); clk_put(wdt->clk); return 0; |