aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWolfram Sang <w.sang@pengutronix.de>2012-02-02 12:48:08 -0500
committerWim Van Sebroeck <wim@iguana.be>2012-03-27 13:59:03 -0400
commit19f505f09c60d637c695a8e8c4768570e2309631 (patch)
tree88304a11bbc66990f30ae2fb97c15828bab6b229
parent16ac4abe0d0ea0a8d42d6a2a7de2a4a00bbf5b40 (diff)
watchdog: pnx4008: cleanup resource handling using managed devices
The resource handling in this driver was flaky: IO_ADDRESS instead of ioremap (and no unmapping), an unneeded static resource, no central exit path for error cases. Fix this by converting the driver to use managed resources. Also use dev_*-messages instead of pr_* while we are here. Signed-off-by: Wolfram Sang <w.sang@pengutronix.de> Signed-off-by: Wim Van Sebroeck <wim@iguana.be>
-rw-r--r--drivers/watchdog/pnx4008_wdt.c69
1 files changed, 22 insertions, 47 deletions
diff --git a/drivers/watchdog/pnx4008_wdt.c b/drivers/watchdog/pnx4008_wdt.c
index dfae030a7ef..55c5224bf19 100644
--- a/drivers/watchdog/pnx4008_wdt.c
+++ b/drivers/watchdog/pnx4008_wdt.c
@@ -84,12 +84,9 @@ static DEFINE_SPINLOCK(io_lock);
84static unsigned long wdt_status; 84static unsigned long wdt_status;
85#define WDT_IN_USE 0 85#define WDT_IN_USE 0
86#define WDT_OK_TO_CLOSE 1 86#define WDT_OK_TO_CLOSE 1
87#define WDT_REGION_INITED 2
88#define WDT_DEVICE_INITED 3
89 87
90static unsigned long boot_status; 88static unsigned long boot_status;
91 89
92static struct resource *wdt_mem;
93static void __iomem *wdt_base; 90static void __iomem *wdt_base;
94struct clk *wdt_clk; 91struct clk *wdt_clk;
95 92
@@ -253,61 +250,43 @@ static struct miscdevice pnx4008_wdt_miscdev = {
253 250
254static int __devinit pnx4008_wdt_probe(struct platform_device *pdev) 251static int __devinit pnx4008_wdt_probe(struct platform_device *pdev)
255{ 252{
256 int ret = 0, size; 253 struct resource *r;
254 int ret = 0;
257 255
258 if (heartbeat < 1 || heartbeat > MAX_HEARTBEAT) 256 if (heartbeat < 1 || heartbeat > MAX_HEARTBEAT)
259 heartbeat = DEFAULT_HEARTBEAT; 257 heartbeat = DEFAULT_HEARTBEAT;
260 258
261 printk(KERN_INFO MODULE_NAME 259 r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
262 "PNX4008 Watchdog Timer: heartbeat %d sec\n", heartbeat); 260 wdt_base = devm_request_and_ioremap(&pdev->dev, r);
263 261 if (!wdt_base)
264 wdt_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); 262 return -EADDRINUSE;
265 if (wdt_mem == NULL) {
266 printk(KERN_INFO MODULE_NAME
267 "failed to get memory region resource\n");
268 return -ENOENT;
269 }
270
271 size = resource_size(wdt_mem);
272
273 if (!request_mem_region(wdt_mem->start, size, pdev->name)) {
274 printk(KERN_INFO MODULE_NAME "failed to get memory region\n");
275 return -ENOENT;
276 }
277 wdt_base = (void __iomem *)IO_ADDRESS(wdt_mem->start);
278 263
279 wdt_clk = clk_get(&pdev->dev, NULL); 264 wdt_clk = clk_get(&pdev->dev, NULL);
280 if (IS_ERR(wdt_clk)) { 265 if (IS_ERR(wdt_clk))
281 ret = PTR_ERR(wdt_clk); 266 return PTR_ERR(wdt_clk);
282 release_mem_region(wdt_mem->start, size);
283 wdt_mem = NULL;
284 goto out;
285 }
286 267
287 ret = clk_enable(wdt_clk); 268 ret = clk_enable(wdt_clk);
288 if (ret) { 269 if (ret)
289 release_mem_region(wdt_mem->start, size);
290 wdt_mem = NULL;
291 clk_put(wdt_clk);
292 goto out; 270 goto out;
293 } 271
272 boot_status = (__raw_readl(WDTIM_RES(wdt_base)) &
273 WDOG_RESET) ? WDIOF_CARDRESET : 0;
274 wdt_disable(); /*disable for now */
275 clk_disable(wdt_clk);
294 276
295 ret = misc_register(&pnx4008_wdt_miscdev); 277 ret = misc_register(&pnx4008_wdt_miscdev);
296 if (ret < 0) { 278 if (ret < 0) {
297 printk(KERN_ERR MODULE_NAME "cannot register misc device\n"); 279 dev_err(&pdev->dev, "cannot register misc device\n");
298 release_mem_region(wdt_mem->start, size); 280 goto out;
299 wdt_mem = NULL;
300 clk_disable(wdt_clk);
301 clk_put(wdt_clk);
302 } else {
303 boot_status = (__raw_readl(WDTIM_RES(wdt_base)) & WDOG_RESET) ?
304 WDIOF_CARDRESET : 0;
305 wdt_disable(); /*disable for now */
306 clk_disable(wdt_clk);
307 set_bit(WDT_DEVICE_INITED, &wdt_status);
308 } 281 }
309 282
283 dev_info(&pdev->dev, "PNX4008 Watchdog Timer: heartbeat %d sec\n",
284 heartbeat);
285
286 return 0;
287
310out: 288out:
289 clk_put(wdt_clk);
311 return ret; 290 return ret;
312} 291}
313 292
@@ -318,10 +297,6 @@ static int __devexit pnx4008_wdt_remove(struct platform_device *pdev)
318 clk_disable(wdt_clk); 297 clk_disable(wdt_clk);
319 clk_put(wdt_clk); 298 clk_put(wdt_clk);
320 299
321 if (wdt_mem) {
322 release_mem_region(wdt_mem->start, resource_size(wdt_mem));
323 wdt_mem = NULL;
324 }
325 return 0; 300 return 0;
326} 301}
327 302