aboutsummaryrefslogtreecommitdiffstats
path: root/Documentation/power
diff options
context:
space:
mode:
authorRafael J. Wysocki <rjw@sisk.pl>2011-02-16 15:53:17 -0500
committerRafael J. Wysocki <rjw@sisk.pl>2011-03-14 19:43:16 -0400
commit7538e3db6e015e890825fbd9f8659952896ddd5b (patch)
tree01a6d8c97599474d9c5fc1ed0eb6f0addaec5652 /Documentation/power
parent6831c6edc7b272a08dd2a6c71bb183a48fe98ae6 (diff)
PM: Add support for device power domains
The platform bus type is often used to handle Systems-on-a-Chip (SoC) where all devices are represented by objects of type struct platform_device. In those cases the same "platform" device driver may be used with multiple different system configurations, but the actions needed to put the devices it handles into a low-power state and back into the full-power state may depend on the design of the given SoC. The driver, however, cannot possibly include all the information necessary for the power management of its device on all the systems it is used with. Moreover, the device hierarchy in its current form also is not suitable for representing this kind of information. The patch below attempts to address this problem by introducing objects of type struct dev_power_domain that can be used for representing power domains within a SoC. Every struct dev_power_domain object provides a sets of device power management callbacks that can be used to perform what's needed for device power management in addition to the operations carried out by the device's driver and subsystem. Namely, if a struct dev_power_domain object is pointed to by the pwr_domain field in a struct device, the callbacks provided by its ops member will be executed in addition to the corresponding callbacks provided by the device's subsystem and driver during all power transitions. Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl> Tested-and-acked-by: Kevin Hilman <khilman@ti.com>
Diffstat (limited to 'Documentation/power')
-rw-r--r--Documentation/power/devices.txt45
1 files changed, 44 insertions, 1 deletions
diff --git a/Documentation/power/devices.txt b/Documentation/power/devices.txt
index dd9b49251db3..df1a5cb10c42 100644
--- a/Documentation/power/devices.txt
+++ b/Documentation/power/devices.txt
@@ -1,6 +1,6 @@
1Device Power Management 1Device Power Management
2 2
3Copyright (c) 2010 Rafael J. Wysocki <rjw@sisk.pl>, Novell Inc. 3Copyright (c) 2010-2011 Rafael J. Wysocki <rjw@sisk.pl>, Novell Inc.
4Copyright (c) 2010 Alan Stern <stern@rowland.harvard.edu> 4Copyright (c) 2010 Alan Stern <stern@rowland.harvard.edu>
5 5
6 6
@@ -507,6 +507,49 @@ routines. Nevertheless, different callback pointers are used in case there is a
507situation where it actually matters. 507situation where it actually matters.
508 508
509 509
510Device Power Domains
511--------------------
512Sometimes devices share reference clocks or other power resources. In those
513cases it generally is not possible to put devices into low-power states
514individually. Instead, a set of devices sharing a power resource can be put
515into a low-power state together at the same time by turning off the shared
516power resource. Of course, they also need to be put into the full-power state
517together, by turning the shared power resource on. A set of devices with this
518property is often referred to as a power domain.
519
520Support for power domains is provided through the pwr_domain field of struct
521device. This field is a pointer to an object of type struct dev_power_domain,
522defined in include/linux/pm.h, providing a set of power management callbacks
523analogous to the subsystem-level and device driver callbacks that are executed
524for the given device during all power transitions, in addition to the respective
525subsystem-level callbacks. Specifically, the power domain "suspend" callbacks
526(i.e. ->runtime_suspend(), ->suspend(), ->freeze(), ->poweroff(), etc.) are
527executed after the analogous subsystem-level callbacks, while the power domain
528"resume" callbacks (i.e. ->runtime_resume(), ->resume(), ->thaw(), ->restore,
529etc.) are executed before the analogous subsystem-level callbacks. Error codes
530returned by the "suspend" and "resume" power domain callbacks are ignored.
531
532Power domain ->runtime_idle() callback is executed before the subsystem-level
533->runtime_idle() callback and the result returned by it is not ignored. Namely,
534if it returns error code, the subsystem-level ->runtime_idle() callback will not
535be called and the helper function rpm_idle() executing it will return error
536code. This mechanism is intended to help platforms where saving device state
537is a time consuming operation and should only be carried out if all devices
538in the power domain are idle, before turning off the shared power resource(s).
539Namely, the power domain ->runtime_idle() callback may return error code until
540the pm_runtime_idle() helper (or its asychronous version) has been called for
541all devices in the power domain (it is recommended that the returned error code
542be -EBUSY in those cases), preventing the subsystem-level ->runtime_idle()
543callback from being run prematurely.
544
545The support for device power domains is only relevant to platforms needing to
546use the same subsystem-level (e.g. platform bus type) and device driver power
547management callbacks in many different power domain configurations and wanting
548to avoid incorporating the support for power domains into the subsystem-level
549callbacks. The other platforms need not implement it or take it into account
550in any way.
551
552
510System Devices 553System Devices
511-------------- 554--------------
512System devices (sysdevs) follow a slightly different API, which can be found in 555System devices (sysdevs) follow a slightly different API, which can be found in