From: 黄涛 <huangtao@rock-chips.com>
Date: Mon, 22 Aug 2011 07:15:16 +0000 (+0800)
Subject: rk29: drivers: power: Add watchdog timer to catch drivers which lockup during resume.
X-Git-Tag: firefly_0821_release~9772^2~2
X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=0c7bb453d3258e8e3bcfb3711f652920dd855113;p=firefly-linux-kernel-4.4.55.git

rk29: drivers: power: Add watchdog timer to catch drivers which lockup during resume.
---

diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c
index 079024a40a9d..d2226210de41 100644
--- a/drivers/base/power/main.c
+++ b/drivers/base/power/main.c
@@ -26,6 +26,9 @@
 #include <linux/rwsem.h>
 #include <linux/interrupt.h>
 #include <linux/timer.h>
+#ifdef CONFIG_ARCH_RK29
+#include <linux/console.h>
+#endif
 
 #include "../base.h"
 #include "power.h"
@@ -453,14 +456,15 @@ static void dpm_drv_timeout(unsigned long data)
 	struct device *dev = dpm_drv_wd_data.dev;
 	struct task_struct *tsk = dpm_drv_wd_data.tsk;
 
-#ifdef CONFIG_ARCH_RK29
-#include <linux/console.h>
-	resume_console();
-#endif
-
 	printk(KERN_EMERG "**** DPM device timeout: %s (%s)\n", dev_name(dev),
 	       (dev->driver ? dev->driver->name : "no driver"));
 
+#ifdef CONFIG_ARCH_RK29
+	resume_console();
+	if (dev->power.status == DPM_RESUMING)
+		printk(KERN_EMERG "dpm resume stack:\n");
+	else
+#endif
 	printk(KERN_EMERG "dpm suspend stack:\n");
 	show_stack(tsk, NULL);
 
@@ -513,7 +517,13 @@ static void dpm_resume(pm_message_t state)
 			dev->power.status = DPM_RESUMING;
 			mutex_unlock(&dpm_list_mtx);
 
+#ifdef CONFIG_ARCH_RK29
+			dpm_drv_wdset(dev);
+#endif
 			error = device_resume(dev, state);
+#ifdef CONFIG_ARCH_RK29
+			dpm_drv_wdclr(dev);
+#endif
 
 			mutex_lock(&dpm_list_mtx);
 			if (error)