aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/watchdog
diff options
context:
space:
mode:
authorcodeworkx <daniel.hillenbrand@codeworkx.de>2012-06-02 13:09:29 +0200
committercodeworkx <daniel.hillenbrand@codeworkx.de>2012-06-02 13:09:29 +0200
commitc6da2cfeb05178a11c6d062a06f8078150ee492f (patch)
treef3b4021d252c52d6463a9b3c1bb7245e399b009c /drivers/watchdog
parentc6d7c4dbff353eac7919342ae6b3299a378160a6 (diff)
downloadkernel_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.c35
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));