static void dpm_drv_timeout(unsigned long data);
static DEFINE_TIMER(dpm_drv_wd, dpm_drv_timeout, 0, 0);
+static struct {
+ struct device *dev;
+ struct task_struct *tsk;
+} dpm_drv_wd_data;
/*
* Set once the preparation of devices for a PM transition has started, reset
*/
static void dpm_drv_timeout(unsigned long data)
{
- struct device *dev = (struct device *) data;
+ struct device *dev = dpm_drv_wd_data.dev;
+ struct task_struct *tsk = dpm_drv_wd_data.tsk;
printk(KERN_EMERG "**** DPM device timeout: %s (%s)\n", dev_name(dev),
(dev->driver ? dev->driver->name : "no driver"));
+
+ printk(KERN_EMERG "dpm suspend stack:\n");
+ show_stack(tsk, NULL);
+
BUG();
}
*/
static void dpm_drv_wdset(struct device *dev)
{
- dpm_drv_wd.data = (unsigned long) dev;
+ dpm_drv_wd_data.dev = dev;
+ dpm_drv_wd_data.tsk = get_current();
+ dpm_drv_wd.data = (unsigned long) &dpm_drv_wd_data;
mod_timer(&dpm_drv_wd, jiffies + (HZ * 3));
}