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;
 }