From 0c7bb453d3258e8e3bcfb3711f652920dd855113 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=E9=BB=84=E6=B6=9B?= Date: Mon, 22 Aug 2011 15:15:16 +0800 Subject: [PATCH] rk29: drivers: power: Add watchdog timer to catch drivers which lockup during resume. --- drivers/base/power/main.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) 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 #include #include +#ifdef CONFIG_ARCH_RK29 +#include +#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 - 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) -- 2.34.1