diff options
author | Rafael J. Wysocki <rjw@sisk.pl> | 2011-11-23 15:18:39 -0500 |
---|---|---|
committer | Rafael J. Wysocki <rjw@sisk.pl> | 2011-11-28 16:14:19 -0500 |
commit | 5841eb6402707a387b216373e65c9c28e8136663 (patch) | |
tree | 1841f84c931e6e55ab510f4d44c505e802eae4eb /Documentation/power | |
parent | bb58dd5d1ffad6c2d21c69698ba766dad4ae54e6 (diff) |
PM / Domains: Document how PM domains are used by the PM core
The current power management documentation in Documentation/power/
either doesn't cover PM domains at all, or gives inaccurate
information about them, so update the relevant files in there to
follow the code.
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Diffstat (limited to 'Documentation/power')
-rw-r--r-- | Documentation/power/devices.txt | 42 | ||||
-rw-r--r-- | Documentation/power/runtime_pm.txt | 29 |
2 files changed, 45 insertions, 26 deletions
diff --git a/Documentation/power/devices.txt b/Documentation/power/devices.txt index 646a89e0c07d..4342acbeee10 100644 --- a/Documentation/power/devices.txt +++ b/Documentation/power/devices.txt | |||
@@ -123,9 +123,10 @@ please refer directly to the source code for more information about it. | |||
123 | Subsystem-Level Methods | 123 | Subsystem-Level Methods |
124 | ----------------------- | 124 | ----------------------- |
125 | The core methods to suspend and resume devices reside in struct dev_pm_ops | 125 | The core methods to suspend and resume devices reside in struct dev_pm_ops |
126 | pointed to by the pm member of struct bus_type, struct device_type and | 126 | pointed to by the ops member of struct dev_pm_domain, or by the pm member of |
127 | struct class. They are mostly of interest to the people writing infrastructure | 127 | struct bus_type, struct device_type and struct class. They are mostly of |
128 | for buses, like PCI or USB, or device type and device class drivers. | 128 | interest to the people writing infrastructure for platforms and buses, like PCI |
129 | or USB, or device type and device class drivers. | ||
129 | 130 | ||
130 | Bus drivers implement these methods as appropriate for the hardware and the | 131 | Bus drivers implement these methods as appropriate for the hardware and the |
131 | drivers using it; PCI works differently from USB, and so on. Not many people | 132 | drivers using it; PCI works differently from USB, and so on. Not many people |
@@ -251,18 +252,29 @@ various phases always run after tasks have been frozen and before they are | |||
251 | unfrozen. Furthermore, the *_noirq phases run at a time when IRQ handlers have | 252 | unfrozen. Furthermore, the *_noirq phases run at a time when IRQ handlers have |
252 | been disabled (except for those marked with the IRQ_WAKEUP flag). | 253 | been disabled (except for those marked with the IRQ_WAKEUP flag). |
253 | 254 | ||
254 | All phases use bus, type, or class callbacks (that is, methods defined in | 255 | All phases use PM domain, bus, type, or class callbacks (that is, methods |
255 | dev->bus->pm, dev->type->pm, or dev->class->pm). These callbacks are mutually | 256 | defined in dev->pm_domain->ops, dev->bus->pm, dev->type->pm, or dev->class->pm). |
256 | exclusive, so if the device type provides a struct dev_pm_ops object pointed to | 257 | These callbacks are regarded by the PM core as mutually exclusive. Moreover, |
257 | by its pm field (i.e. both dev->type and dev->type->pm are defined), the | 258 | PM domain callbacks always take precedence over bus, type and class callbacks, |
258 | callbacks included in that object (i.e. dev->type->pm) will be used. Otherwise, | 259 | while type callbacks take precedence over bus and class callbacks, and class |
259 | if the class provides a struct dev_pm_ops object pointed to by its pm field | 260 | callbacks take precedence over bus callbacks. To be precise, the following |
260 | (i.e. both dev->class and dev->class->pm are defined), the PM core will use the | 261 | rules are used to determine which callback to execute in the given phase: |
261 | callbacks from that object (i.e. dev->class->pm). Finally, if the pm fields of | 262 | |
262 | both the device type and class objects are NULL (or those objects do not exist), | 263 | 1. If dev->pm_domain is present, the PM core will attempt to execute the |
263 | the callbacks provided by the bus (that is, the callbacks from dev->bus->pm) | 264 | callback included in dev->pm_domain->ops. If that callback is not |
264 | will be used (this allows device types to override callbacks provided by bus | 265 | present, no action will be carried out for the given device. |
265 | types or classes if necessary). | 266 | |
267 | 2. Otherwise, if both dev->type and dev->type->pm are present, the callback | ||
268 | included in dev->type->pm will be executed. | ||
269 | |||
270 | 3. Otherwise, if both dev->class and dev->class->pm are present, the | ||
271 | callback included in dev->class->pm will be executed. | ||
272 | |||
273 | 4. Otherwise, if both dev->bus and dev->bus->pm are present, the callback | ||
274 | included in dev->bus->pm will be executed. | ||
275 | |||
276 | This allows PM domains and device types to override callbacks provided by bus | ||
277 | types or device classes if necessary. | ||
266 | 278 | ||
267 | These callbacks may in turn invoke device- or driver-specific methods stored in | 279 | These callbacks may in turn invoke device- or driver-specific methods stored in |
268 | dev->driver->pm, but they don't have to. | 280 | dev->driver->pm, but they don't have to. |
diff --git a/Documentation/power/runtime_pm.txt b/Documentation/power/runtime_pm.txt index 5336149f831b..79b10a090c9f 100644 --- a/Documentation/power/runtime_pm.txt +++ b/Documentation/power/runtime_pm.txt | |||
@@ -44,17 +44,24 @@ struct dev_pm_ops { | |||
44 | }; | 44 | }; |
45 | 45 | ||
46 | The ->runtime_suspend(), ->runtime_resume() and ->runtime_idle() callbacks | 46 | The ->runtime_suspend(), ->runtime_resume() and ->runtime_idle() callbacks |
47 | are executed by the PM core for either the power domain, or the device type | 47 | are executed by the PM core for the device's subsystem that may be either of |
48 | (if the device power domain's struct dev_pm_ops does not exist), or the class | 48 | the following: |
49 | (if the device power domain's and type's struct dev_pm_ops object does not | 49 | |
50 | exist), or the bus type (if the device power domain's, type's and class' | 50 | 1. PM domain of the device, if the device's PM domain object, dev->pm_domain, |
51 | struct dev_pm_ops objects do not exist) of the given device, so the priority | 51 | is present. |
52 | order of callbacks from high to low is that power domain callbacks, device | 52 | |
53 | type callbacks, class callbacks and bus type callbacks, and the high priority | 53 | 2. Device type of the device, if both dev->type and dev->type->pm are present. |
54 | one will take precedence over low priority one. The bus type, device type and | 54 | |
55 | class callbacks are referred to as subsystem-level callbacks in what follows, | 55 | 3. Device class of the device, if both dev->class and dev->class->pm are |
56 | and generally speaking, the power domain callbacks are used for representing | 56 | present. |
57 | power domains within a SoC. | 57 | |
58 | 4. Bus type of the device, if both dev->bus and dev->bus->pm are present. | ||
59 | |||
60 | The PM core always checks which callback to use in the order given above, so the | ||
61 | priority order of callbacks from high to low is: PM domain, device type, class | ||
62 | and bus type. Moreover, the high-priority one will always take precedence over | ||
63 | a low-priority one. The PM domain, bus type, device type and class callbacks | ||
64 | are referred to as subsystem-level callbacks in what follows. | ||
58 | 65 | ||
59 | By default, the callbacks are always invoked in process context with interrupts | 66 | By default, the callbacks are always invoked in process context with interrupts |
60 | enabled. However, subsystems can use the pm_runtime_irq_safe() helper function | 67 | enabled. However, subsystems can use the pm_runtime_irq_safe() helper function |