From: hhb <hhb@rock-chips.com> Date: Tue, 29 Jan 2013 07:17:45 +0000 (+0800) Subject: watch dog: fix bug that wdt still work after disable it and delete wdt_lock X-Git-Tag: firefly_0821_release~7711 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=bfdcc0593035be2ebbab2f8a73d134aaa28883f5;p=firefly-linux-kernel-4.4.55.git watch dog: fix bug that wdt still work after disable it and delete wdt_lock --- diff --git a/drivers/watchdog/rk29_wdt.c b/drivers/watchdog/rk29_wdt.c index c155bdb1dad7..ce367ee16d68 100644 --- a/drivers/watchdog/rk29_wdt.c +++ b/drivers/watchdog/rk29_wdt.c @@ -112,10 +112,8 @@ static struct resource *wdt_mem; static struct resource *wdt_irq; static struct clk *wdt_clock; static void __iomem *wdt_base; -static unsigned int wdt_count; static char expect_close; -static DEFINE_SPINLOCK(wdt_lock); /* watchdog control routines */ @@ -126,39 +124,23 @@ static DEFINE_SPINLOCK(wdt_lock); /* functions */ -static void rk29_wdt_keepalive(void) +void rk29_wdt_keepalive(void) { - spin_lock(&wdt_lock); writel(0x76, wdt_base + RK29_WDT_CRR); - spin_unlock(&wdt_lock); } static void __rk29_wdt_stop(void) { - unsigned long wtcon = 0; - - wtcon = readl(wdt_base + RK29_WDT_CR); - wtcon &= 0xfffffffe; - writel(wtcon, wdt_base + RK29_WDT_CR); + rk29_wdt_keepalive(); //feed dog + writel(0x0a, wdt_base + RK29_WDT_CR); } -static void rk29_wdt_stop(void) +void rk29_wdt_stop(void) { - spin_lock(&wdt_lock); __rk29_wdt_stop(); - spin_unlock(&wdt_lock); + clk_disable(wdt_clock); } -static void rk29_wdt_start(void) -{ - unsigned long wtcon = 0; - - spin_lock(&wdt_lock); - __rk29_wdt_stop(); - wtcon |= (RK29_WDT_EN << 0) | (RK29_RESPONSE_MODE << 1) | (RK29_RESET_PULSE << 2); - writel(wtcon, wdt_base + RK29_WDT_CR); - spin_unlock(&wdt_lock); -} /* timeout unit us */ static int rk29_wdt_set_heartbeat(int timeout) { @@ -186,6 +168,15 @@ static int rk29_wdt_set_heartbeat(int timeout) return 0; } +void rk29_wdt_start(void) +{ + unsigned long wtcon = 0; + clk_enable(wdt_clock); + rk29_wdt_set_heartbeat(tmr_margin); + wtcon |= (RK29_WDT_EN << 0) | (RK29_RESPONSE_MODE << 1) | (RK29_RESET_PULSE << 2); + writel(wtcon, wdt_base + RK29_WDT_CR); +} + /* * /dev/watchdog handling */ @@ -387,10 +378,6 @@ static int __devinit rk29_wdt_probe(struct platform_device *pdev) goto err_irq; } - clk_enable(wdt_clock); - - rk29_wdt_set_heartbeat(tmr_margin); - ret = misc_register(&rk29_wdt_miscdev); if (ret) { dev_err(dev, "cannot register miscdev on minor=%d (%d)\n", @@ -462,7 +449,6 @@ static int rk29_wdt_suspend(struct platform_device *dev, pm_message_t state) static int rk29_wdt_resume(struct platform_device *dev) { - rk29_wdt_set_heartbeat(tmr_margin); rk29_wdt_start(); return 0; }