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)