rk29: drivers: power: Add watchdog timer to catch drivers which lockup during resume.
author黄涛 <huangtao@rock-chips.com>
Mon, 22 Aug 2011 07:15:16 +0000 (15:15 +0800)
committer黄涛 <huangtao@rock-chips.com>
Mon, 22 Aug 2011 07:16:02 +0000 (15:16 +0800)
drivers/base/power/main.c

index 079024a40a9da7093cc8bdfafb4707245a6dd3e5..d2226210de414cabc7193ed3b219d3efcc3d1f66 100644 (file)
@@ -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)