| From af8db1508f2c9f3b6e633e2d2d906c6557c617f9 Mon Sep 17 00:00:00 2001 |
| From: Peter Chen <peter.chen@freescale.com> |
| Date: Tue, 15 Nov 2011 21:52:29 +0100 |
| Subject: PM / driver core: disable device's runtime PM during shutdown |
| |
| From: Peter Chen <peter.chen@freescale.com> |
| |
| commit af8db1508f2c9f3b6e633e2d2d906c6557c617f9 upstream. |
| |
| There may be an issue when the user issue "reboot/shutdown" command, then |
| the device has shut down its hardware, after that, this runtime-pm featured |
| device's driver will probably be scheduled to do its suspend routine, |
| and at its suspend routine, it may access hardware, but the device has |
| already shutdown physically, then the system hang may be occurred. |
| |
| I ran out this issue using an auto-suspend supported USB devices, like |
| 3G modem, keyboard. The usb runtime suspend routine may be scheduled |
| after the usb controller has been shut down, and the usb runtime suspend |
| routine will try to suspend its roothub(controller), it will access |
| register, then the system hang occurs as the controller is shutdown. |
| |
| Signed-off-by: Peter Chen <peter.chen@freescale.com> |
| Acked-by: Ming Lei <tom.leiming@gmail.com> |
| Acked-by: Greg Kroah-Hartman <gregkh@suse.de> |
| Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/base/core.c | 3 +++ |
| 1 file changed, 3 insertions(+) |
| |
| --- a/drivers/base/core.c |
| +++ b/drivers/base/core.c |
| @@ -22,6 +22,7 @@ |
| #include <linux/kallsyms.h> |
| #include <linux/mutex.h> |
| #include <linux/async.h> |
| +#include <linux/pm_runtime.h> |
| |
| #include "base.h" |
| #include "power/power.h" |
| @@ -1742,6 +1743,8 @@ void device_shutdown(void) |
| */ |
| list_del_init(&dev->kobj.entry); |
| spin_unlock(&devices_kset->list_lock); |
| + /* Disable all device's runtime power management */ |
| + pm_runtime_disable(dev); |
| |
| if (dev->bus && dev->bus->shutdown) { |
| dev_dbg(dev, "shutdown\n"); |