diff options
Diffstat (limited to 'drivers/watchdog/pnx4008_wdt.c')
-rw-r--r-- | drivers/watchdog/pnx4008_wdt.c | 69 |
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); | |||
84 | static unsigned long wdt_status; | 84 | static 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 | ||
90 | static unsigned long boot_status; | 88 | static unsigned long boot_status; |
91 | 89 | ||
92 | static struct resource *wdt_mem; | ||
93 | static void __iomem *wdt_base; | 90 | static void __iomem *wdt_base; |
94 | struct clk *wdt_clk; | 91 | struct clk *wdt_clk; |
95 | 92 | ||
@@ -253,61 +250,43 @@ static struct miscdevice pnx4008_wdt_miscdev = { | |||
253 | 250 | ||
254 | static int __devinit pnx4008_wdt_probe(struct platform_device *pdev) | 251 | static 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 | |||
310 | out: | 288 | out: |
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 | ||