diff options
Diffstat (limited to 'drivers/base/power')
| -rw-r--r-- | drivers/base/power/power.h | 11 | ||||
| -rw-r--r-- | drivers/base/power/resume.c | 11 | ||||
| -rw-r--r-- | drivers/base/power/shutdown.c | 23 | ||||
| -rw-r--r-- | drivers/base/power/suspend.c | 17 | 
4 files changed, 29 insertions, 33 deletions
diff --git a/drivers/base/power/power.h b/drivers/base/power/power.h index e5eda746f2a6..2e700d795cf1 100644 --- a/drivers/base/power/power.h +++ b/drivers/base/power/power.h  | |||
| @@ -1,18 +1,7 @@ | |||
| 1 | |||
| 2 | |||
| 3 | enum { | ||
| 4 | DEVICE_PM_ON, | ||
| 5 | DEVICE_PM1, | ||
| 6 | DEVICE_PM2, | ||
| 7 | DEVICE_PM3, | ||
| 8 | DEVICE_PM_OFF, | ||
| 9 | }; | ||
| 10 | |||
| 11 | /* | 1 | /* | 
| 12 | * shutdown.c | 2 | * shutdown.c | 
| 13 | */ | 3 | */ | 
| 14 | 4 | ||
| 15 | extern int device_detach_shutdown(struct device *); | ||
| 16 | extern void device_shutdown(void); | 5 | extern void device_shutdown(void); | 
| 17 | 6 | ||
| 18 | 7 | ||
diff --git a/drivers/base/power/resume.c b/drivers/base/power/resume.c index f8f5055754d6..26468971ef5a 100644 --- a/drivers/base/power/resume.c +++ b/drivers/base/power/resume.c  | |||
| @@ -22,8 +22,17 @@ extern int sysdev_resume(void); | |||
| 22 | 22 | ||
| 23 | int resume_device(struct device * dev) | 23 | int resume_device(struct device * dev) | 
| 24 | { | 24 | { | 
| 25 | if (dev->bus && dev->bus->resume) | 25 | if (dev->power.pm_parent | 
| 26 | && dev->power.pm_parent->power.power_state) { | ||
| 27 | dev_err(dev, "PM: resume from %d, parent %s still %d\n", | ||
| 28 | dev->power.power_state, | ||
| 29 | dev->power.pm_parent->bus_id, | ||
| 30 | dev->power.pm_parent->power.power_state); | ||
| 31 | } | ||
| 32 | if (dev->bus && dev->bus->resume) { | ||
| 33 | dev_dbg(dev,"resuming\n"); | ||
| 26 | return dev->bus->resume(dev); | 34 | return dev->bus->resume(dev); | 
| 35 | } | ||
| 27 | return 0; | 36 | return 0; | 
| 28 | } | 37 | } | 
| 29 | 38 | ||
diff --git a/drivers/base/power/shutdown.c b/drivers/base/power/shutdown.c index d1e023fbe169..f50a08be424b 100644 --- a/drivers/base/power/shutdown.c +++ b/drivers/base/power/shutdown.c  | |||
| @@ -19,20 +19,6 @@ | |||
| 19 | extern struct subsystem devices_subsys; | 19 | extern struct subsystem devices_subsys; | 
| 20 | 20 | ||
| 21 | 21 | ||
| 22 | int device_detach_shutdown(struct device * dev) | ||
| 23 | { | ||
| 24 | if (!dev->detach_state) | ||
| 25 | return 0; | ||
| 26 | |||
| 27 | if (dev->detach_state == DEVICE_PM_OFF) { | ||
| 28 | if (dev->driver && dev->driver->shutdown) | ||
| 29 | dev->driver->shutdown(dev); | ||
| 30 | return 0; | ||
| 31 | } | ||
| 32 | return dpm_runtime_suspend(dev, dev->detach_state); | ||
| 33 | } | ||
| 34 | |||
| 35 | |||
| 36 | /** | 22 | /** | 
| 37 | * We handle system devices differently - we suspend and shut them | 23 | * We handle system devices differently - we suspend and shut them | 
| 38 | * down last and resume them first. That way, we don't do anything stupid like | 24 | * down last and resume them first. That way, we don't do anything stupid like | 
| @@ -52,13 +38,12 @@ void device_shutdown(void) | |||
| 52 | struct device * dev; | 38 | struct device * dev; | 
| 53 | 39 | ||
| 54 | down_write(&devices_subsys.rwsem); | 40 | down_write(&devices_subsys.rwsem); | 
| 55 | list_for_each_entry_reverse(dev, &devices_subsys.kset.list, kobj.entry) { | 41 | list_for_each_entry_reverse(dev, &devices_subsys.kset.list, | 
| 56 | pr_debug("shutting down %s: ", dev->bus_id); | 42 | kobj.entry) { | 
| 57 | if (dev->driver && dev->driver->shutdown) { | 43 | if (dev->driver && dev->driver->shutdown) { | 
| 58 | pr_debug("Ok\n"); | 44 | dev_dbg(dev, "shutdown\n"); | 
| 59 | dev->driver->shutdown(dev); | 45 | dev->driver->shutdown(dev); | 
| 60 | } else | 46 | } | 
| 61 | pr_debug("Ignored.\n"); | ||
| 62 | } | 47 | } | 
| 63 | up_write(&devices_subsys.rwsem); | 48 | up_write(&devices_subsys.rwsem); | 
| 64 | 49 | ||
diff --git a/drivers/base/power/suspend.c b/drivers/base/power/suspend.c index a0b5cf689e63..0ec44ef840be 100644 --- a/drivers/base/power/suspend.c +++ b/drivers/base/power/suspend.c  | |||
| @@ -39,12 +39,25 @@ int suspend_device(struct device * dev, pm_message_t state) | |||
| 39 | { | 39 | { | 
| 40 | int error = 0; | 40 | int error = 0; | 
| 41 | 41 | ||
| 42 | dev_dbg(dev, "suspending\n"); | 42 | if (dev->power.power_state) { | 
| 43 | dev_dbg(dev, "PM: suspend %d-->%d\n", | ||
| 44 | dev->power.power_state, state); | ||
| 45 | } | ||
| 46 | if (dev->power.pm_parent | ||
| 47 | && dev->power.pm_parent->power.power_state) { | ||
| 48 | dev_err(dev, | ||
| 49 | "PM: suspend %d->%d, parent %s already %d\n", | ||
| 50 | dev->power.power_state, state, | ||
| 51 | dev->power.pm_parent->bus_id, | ||
| 52 | dev->power.pm_parent->power.power_state); | ||
| 53 | } | ||
| 43 | 54 | ||
| 44 | dev->power.prev_state = dev->power.power_state; | 55 | dev->power.prev_state = dev->power.power_state; | 
| 45 | 56 | ||
| 46 | if (dev->bus && dev->bus->suspend && !dev->power.power_state) | 57 | if (dev->bus && dev->bus->suspend && !dev->power.power_state) { | 
| 58 | dev_dbg(dev, "suspending\n"); | ||
| 47 | error = dev->bus->suspend(dev, state); | 59 | error = dev->bus->suspend(dev, state); | 
| 60 | } | ||
| 48 | 61 | ||
| 49 | return error; | 62 | return error; | 
| 50 | } | 63 | } | 
