aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/watchdog/pnx4008_wdt.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/watchdog/pnx4008_wdt.c')
-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 dfae030a7ef2..55c5224bf194 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