diff options
author | codeworkx <daniel.hillenbrand@codeworkx.de> | 2012-06-02 13:09:29 +0200 |
---|---|---|
committer | codeworkx <daniel.hillenbrand@codeworkx.de> | 2012-06-02 13:09:29 +0200 |
commit | c6da2cfeb05178a11c6d062a06f8078150ee492f (patch) | |
tree | f3b4021d252c52d6463a9b3c1bb7245e399b009c /drivers/watchdog | |
parent | c6d7c4dbff353eac7919342ae6b3299a378160a6 (diff) | |
download | kernel_samsung_smdk4412-c6da2cfeb05178a11c6d062a06f8078150ee492f.zip kernel_samsung_smdk4412-c6da2cfeb05178a11c6d062a06f8078150ee492f.tar.gz kernel_samsung_smdk4412-c6da2cfeb05178a11c6d062a06f8078150ee492f.tar.bz2 |
samsung update 1
Diffstat (limited to 'drivers/watchdog')
-rw-r--r-- | drivers/watchdog/s3c2410_wdt.c | 35 |
1 files changed, 21 insertions, 14 deletions
diff --git a/drivers/watchdog/s3c2410_wdt.c b/drivers/watchdog/s3c2410_wdt.c index f7f5aa0..8ef8e1e 100644 --- a/drivers/watchdog/s3c2410_wdt.c +++ b/drivers/watchdog/s3c2410_wdt.c @@ -443,22 +443,24 @@ static int __devinit s3c2410wdt_probe(struct platform_device *pdev) goto err_map; } - ret = request_irq(wdt_irq->start, s3c2410wdt_irq, 0, pdev->name, pdev); - if (ret != 0) { - dev_err(dev, "failed to install irq (%d)\n", ret); - goto err_map; - } - wdt_clock = clk_get(&pdev->dev, "watchdog"); if (IS_ERR(wdt_clock)) { dev_err(dev, "failed to find watchdog clock source\n"); ret = PTR_ERR(wdt_clock); - goto err_irq; + goto err_map; } clk_enable(wdt_clock); - if (s3c2410wdt_cpufreq_register() < 0) { + /* + * Watchdog timer should be stopped + * before set prescaler to prevent unexpected expired watchdog timer + */ + if (!tmr_atboot) + s3c2410wdt_stop(); + + ret = s3c2410wdt_cpufreq_register(); + if (ret) { printk(KERN_ERR PFX "failed to register cpufreq\n"); goto err_clk; } @@ -497,6 +499,12 @@ static int __devinit s3c2410wdt_probe(struct platform_device *pdev) s3c2410wdt_stop(); } + ret = request_irq(wdt_irq->start, s3c2410wdt_irq, 0, pdev->name, pdev); + if (ret != 0) { + dev_err(dev, "failed to install irq (%d)\n", ret); + goto err_misc_reg; + } + /* print out a statement of readiness */ wtcon = readl(wdt_base + S3C2410_WTCON); @@ -508,6 +516,8 @@ static int __devinit s3c2410wdt_probe(struct platform_device *pdev) return 0; + err_misc_reg: + misc_deregister(&s3c2410wdt_miscdev); err_cpufreq: s3c2410wdt_cpufreq_deregister(); @@ -515,9 +525,6 @@ static int __devinit s3c2410wdt_probe(struct platform_device *pdev) clk_disable(wdt_clock); clk_put(wdt_clock); - err_irq: - free_irq(wdt_irq->start, pdev); - err_map: iounmap(wdt_base); @@ -530,6 +537,9 @@ static int __devinit s3c2410wdt_probe(struct platform_device *pdev) static int __devexit s3c2410wdt_remove(struct platform_device *dev) { + free_irq(wdt_irq->start, dev); + wdt_irq = NULL; + misc_deregister(&s3c2410wdt_miscdev); s3c2410wdt_cpufreq_deregister(); @@ -538,9 +548,6 @@ static int __devexit s3c2410wdt_remove(struct platform_device *dev) clk_put(wdt_clock); wdt_clock = NULL; - free_irq(wdt_irq->start, dev); - wdt_irq = NULL; - iounmap(wdt_base); release_mem_region(wdt_mem->start, resource_size(wdt_mem)); |