€•Œsphinx.addnodes”Œdocument”“”)�”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)�”}”(hhh]”(hŒ pending_xref”“”)�”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…”�”}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ$/translations/zh_CN/power/runtime_pm”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)�”}”(hhh]”hŒChinese (Traditional)”…”�”}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ$/translations/zh_TW/power/runtime_pm”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒItalian”…”�”}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ$/translations/it_IT/power/runtime_pm”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒJapanese”…”�”}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ$/translations/ja_JP/power/runtime_pm”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒKorean”…”�”}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ$/translations/ko_KR/power/runtime_pm”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒPortuguese (Brazilian)”…”�”}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ$/translations/pt_BR/power/runtime_pm”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒSpanish”…”�”}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ$/translations/sp_SP/power/runtime_pm”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒsection”“”)�”}”(hhh]”(hŒtitle”“”)�”}”(hŒ2Runtime Power Management Framework for I/O Devices”h]”hŒ2Runtime Power Management Framework for I/O Devices”…”�”}”(hh¼h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhh·h²hh³Œ>/var/lib/git/docbuild/linux/Documentation/power/runtime_pm.rst”h´KubhŒenumerated_list”“”)�”}”(hhh]”hŒ list_item”“”)�”}”(hŒ72009-2011 Rafael J. Wysocki , Novell Inc. ”h]”hŒ paragraph”“”)�”}”(hŒ62009-2011 Rafael J. Wysocki , Novell Inc.”h]”(hŒ2009-2011 Rafael J. Wysocki <”…”�”}”(hhØh²hh³Nh´NubhŒ reference”“”)�”}”(hŒ rjw@sisk.pl”h]”hŒ rjw@sisk.pl”…”�”}”(hhâh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:rjw@sisk.pl”uh1hàhhØubhŒ>, Novell Inc.”…”�”}”(hhØh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´KhhÒubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhhÍh²hh³hÊh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œenumtype”Œ upperalpha”Œprefix”Œ(”Œsuffix”Œ)”Œstart”Kuh1hËhh·h²hh³hÊh´KubhÌ)�”}”(hhh]”hÑ)�”}”(hŒ,2010 Alan Stern ”h]”h×)�”}”(hŒ+2010 Alan Stern ”h]”(hŒ2010 Alan Stern <”…”�”}”(hjh²hh³Nh´Nubhá)�”}”(hŒstern@rowland.harvard.edu”h]”hŒstern@rowland.harvard.edu”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œ mailto:stern@rowland.harvard.edu”uh1hàhjubhŒ>”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´Khjubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhjh²hh³hÊh´Nubah}”(h]”h ]”h"]”h$]”h&]”jj j j j j jKuh1hËhh·h²hh³hÊh´KubhÌ)�”}”(hhh]”hÑ)�”}”(hŒA2014 Intel Corp., Rafael J. Wysocki ”h]”h×)�”}”(hŒ@2014 Intel Corp., Rafael J. Wysocki ”h]”(hŒ%2014 Intel Corp., Rafael J. Wysocki <”…”�”}”(hjKh²hh³Nh´Nubhá)�”}”(hŒrafael.j.wysocki@intel.com”h]”hŒrafael.j.wysocki@intel.com”…”�”}”(hjSh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œ!mailto:rafael.j.wysocki@intel.com”uh1hàhjKubhŒ>”…”�”}”(hjKh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´K hjGubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhjDh²hh³hÊh´Nubah}”(h]”h ]”h"]”h$]”h&]”jj j j j j jKuh1hËhh·h²hh³hÊh´K ubh¶)�”}”(hhh]”(h»)�”}”(hŒ1. Introduction”h]”hŒ1. Introduction”…”�”}”(hj|h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjyh²hh³hÊh´K ubh×)�”}”(hŒ†Support for runtime power management (runtime PM) of I/O devices is provided at the power management core (PM core) level by means of:”h]”hŒ†Support for runtime power management (runtime PM) of I/O devices is provided at the power management core (PM core) level by means of:”…”�”}”(hjŠh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´Khjyh²hubhŒ bullet_list”“”)�”}”(hhh]”(hÑ)�”}”(hX¸The power management workqueue pm_wq in which bus types and device drivers can put their PM-related work items. It is strongly recommended that pm_wq be used for queuing all work items related to runtime PM, because this allows them to be synchronized with system-wide power transitions (suspend to RAM, hibernation and resume from system sleep states). pm_wq is declared in include/linux/pm_runtime.h and defined in kernel/power/main.c. ”h]”h×)�”}”(hX·The power management workqueue pm_wq in which bus types and device drivers can put their PM-related work items. It is strongly recommended that pm_wq be used for queuing all work items related to runtime PM, because this allows them to be synchronized with system-wide power transitions (suspend to RAM, hibernation and resume from system sleep states). pm_wq is declared in include/linux/pm_runtime.h and defined in kernel/power/main.c.”h]”hX·The power management workqueue pm_wq in which bus types and device drivers can put their PM-related work items. It is strongly recommended that pm_wq be used for queuing all work items related to runtime PM, because this allows them to be synchronized with system-wide power transitions (suspend to RAM, hibernation and resume from system sleep states). pm_wq is declared in include/linux/pm_runtime.h and defined in kernel/power/main.c.”…”�”}”(hj¡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´Khj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhjšh²hh³hÊh´NubhÑ)�”}”(hŒÝA number of runtime PM fields in the 'power' member of 'struct device' (which is of the type 'struct dev_pm_info', defined in include/linux/pm.h) that can be used for synchronizing runtime PM operations with one another. ”h]”h×)�”}”(hŒÜA number of runtime PM fields in the 'power' member of 'struct device' (which is of the type 'struct dev_pm_info', defined in include/linux/pm.h) that can be used for synchronizing runtime PM operations with one another.”h]”hŒèA number of runtime PM fields in the ‘power’ member of ‘struct device’ (which is of the type ‘struct dev_pm_info’, defined in include/linux/pm.h) that can be used for synchronizing runtime PM operations with one another.”…”�”}”(hj¹h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´Khjµubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhjšh²hh³hÊh´NubhÑ)�”}”(hŒZThree device runtime PM callbacks in 'struct dev_pm_ops' (defined in include/linux/pm.h). ”h]”h×)�”}”(hŒYThree device runtime PM callbacks in 'struct dev_pm_ops' (defined in include/linux/pm.h).”h]”hŒ]Three device runtime PM callbacks in ‘struct dev_pm_ops’ (defined in include/linux/pm.h).”…”�”}”(hjÑh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´KhjÍubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhjšh²hh³hÊh´NubhÑ)�”}”(hXA set of helper functions defined in drivers/base/power/runtime.c that can be used for carrying out runtime PM operations in such a way that the synchronization between them is taken care of by the PM core. Bus types and device drivers are encouraged to use these functions. ”h]”h×)�”}”(hXA set of helper functions defined in drivers/base/power/runtime.c that can be used for carrying out runtime PM operations in such a way that the synchronization between them is taken care of by the PM core. Bus types and device drivers are encouraged to use these functions.”h]”hXA set of helper functions defined in drivers/base/power/runtime.c that can be used for carrying out runtime PM operations in such a way that the synchronization between them is taken care of by the PM core. Bus types and device drivers are encouraged to use these functions.”…”�”}”(hjéh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´Khjåubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhjšh²hh³hÊh´Nubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ*”uh1j˜h³hÊh´Khjyh²hubh×)�”}”(hŒ¸The runtime PM callbacks present in 'struct dev_pm_ops', the device runtime PM fields of 'struct dev_pm_info' and the core helper functions provided for runtime PM are described below.”h]”hŒÀThe runtime PM callbacks present in ‘struct dev_pm_ops’, the device runtime PM fields of ‘struct dev_pm_info’ and the core helper functions provided for runtime PM are described below.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´K$hjyh²hubeh}”(h]”Œ introduction”ah ]”h"]”Œ1. introduction”ah$]”h&]”uh1hµhh·h²hh³hÊh´K ubh¶)�”}”(hhh]”(h»)�”}”(hŒ2. Device Runtime PM Callbacks”h]”hŒ2. Device Runtime PM Callbacks”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjh²hh³hÊh´K)ubh×)�”}”(hŒLThere are three device runtime PM callbacks defined in 'struct dev_pm_ops'::”h]”hŒOThere are three device runtime PM callbacks defined in ‘struct dev_pm_ops’:”…”�”}”(hj,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´K+hjh²hubhŒ literal_block”“”)�”}”(hŒ¼struct dev_pm_ops { ... int (*runtime_suspend)(struct device *dev); int (*runtime_resume)(struct device *dev); int (*runtime_idle)(struct device *dev); ... };”h]”hŒ¼struct dev_pm_ops { ... int (*runtime_suspend)(struct device *dev); int (*runtime_resume)(struct device *dev); int (*runtime_idle)(struct device *dev); ... };”…”�”}”hj<sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1j:h³hÊh´K-hjh²hubh×)�”}”(hŒ¦The ->runtime_suspend(), ->runtime_resume() and ->runtime_idle() callbacks are executed by the PM core for the device's subsystem that may be either of the following:”h]”hŒ¨The ->runtime_suspend(), ->runtime_resume() and ->runtime_idle() callbacks are executed by the PM core for the device’s subsystem that may be either of the following:”…”�”}”(hjLh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´K5hjh²hubhŒ block_quote”“”)�”}”(hXN1. PM domain of the device, if the device's PM domain object, dev->pm_domain, is present. 2. Device type of the device, if both dev->type and dev->type->pm are present. 3. Device class of the device, if both dev->class and dev->class->pm are present. 4. Bus type of the device, if both dev->bus and dev->bus->pm are present. ”h]”hÌ)�”}”(hhh]”(hÑ)�”}”(hŒWPM domain of the device, if the device's PM domain object, dev->pm_domain, is present. ”h]”h×)�”}”(hŒVPM domain of the device, if the device's PM domain object, dev->pm_domain, is present.”h]”hŒXPM domain of the device, if the device’s PM domain object, dev->pm_domain, is present.”…”�”}”(hjgh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´K9hjcubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhj`ubhÑ)�”}”(hŒLDevice type of the device, if both dev->type and dev->type->pm are present. ”h]”h×)�”}”(hŒKDevice type of the device, if both dev->type and dev->type->pm are present.”h]”hŒKDevice type of the device, if both dev->type and dev->type->pm are present.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´Kclass and dev->class->pm are present. ”h]”h×)�”}”(hŒNDevice class of the device, if both dev->class and dev->class->pm are present.”h]”hŒNDevice class of the device, if both dev->class and dev->class->pm are present.”…”�”}”(hj—h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´K>hj“ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhj`ubhÑ)�”}”(hŒGBus type of the device, if both dev->bus and dev->bus->pm are present. ”h]”h×)�”}”(hŒFBus type of the device, if both dev->bus and dev->bus->pm are present.”h]”hŒFBus type of the device, if both dev->bus and dev->bus->pm are present.”…”�”}”(hj¯h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´KAhj«ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhj`ubeh}”(h]”h ]”h"]”h$]”h&]”jŒarabic”j hj Œ.”uh1hËhj\ubah}”(h]”h ]”h"]”h$]”h&]”uh1jZh³hÊh´K9hjh²hubh×)�”}”(hŒÅIf the subsystem chosen by applying the above rules doesn't provide the relevant callback, the PM core will invoke the corresponding driver callback stored in dev->driver->pm directly (if present).”h]”hŒÇIf the subsystem chosen by applying the above rules doesn’t provide the relevant callback, the PM core will invoke the corresponding driver callback stored in dev->driver->pm directly (if present).”…”�”}”(hjÑh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´KChjh²hubh×)�”}”(hX{The PM core always checks which callback to use in the order given above, so the priority order of callbacks from high to low is: PM domain, device type, class and bus type. Moreover, the high-priority one will always take precedence over a low-priority one. The PM domain, bus type, device type and class callbacks are referred to as subsystem-level callbacks in what follows.”h]”hX{The PM core always checks which callback to use in the order given above, so the priority order of callbacks from high to low is: PM domain, device type, class and bus type. Moreover, the high-priority one will always take precedence over a low-priority one. The PM domain, bus type, device type and class callbacks are referred to as subsystem-level callbacks in what follows.”…”�”}”(hjßh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´KGhjh²hubh×)�”}”(hXOBy default, the callbacks are always invoked in process context with interrupts enabled. However, the pm_runtime_irq_safe() helper function can be used to tell the PM core that it is safe to run the ->runtime_suspend(), ->runtime_resume() and ->runtime_idle() callbacks for the given device in atomic context with interrupts disabled. This implies that the callback routines in question must not block or sleep, but it also means that the synchronous helper functions listed at the end of Section 4 may be used for that device within an interrupt handler or generally in an atomic context.”h]”hXOBy default, the callbacks are always invoked in process context with interrupts enabled. However, the pm_runtime_irq_safe() helper function can be used to tell the PM core that it is safe to run the ->runtime_suspend(), ->runtime_resume() and ->runtime_idle() callbacks for the given device in atomic context with interrupts disabled. This implies that the callback routines in question must not block or sleep, but it also means that the synchronous helper functions listed at the end of Section 4 may be used for that device within an interrupt handler or generally in an atomic context.”…”�”}”(hjíh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´KMhjh²hubh×)�”}”(hX°The subsystem-level suspend callback, if present, is _entirely_ _responsible_ for handling the suspend of the device as appropriate, which may, but need not include executing the device driver's own ->runtime_suspend() callback (from the PM core's point of view it is not necessary to implement a ->runtime_suspend() callback in a device driver as long as the subsystem-level suspend callback knows what to do to handle the device).”h]”hX´The subsystem-level suspend callback, if present, is _entirely_ _responsible_ for handling the suspend of the device as appropriate, which may, but need not include executing the device driver’s own ->runtime_suspend() callback (from the PM core’s point of view it is not necessary to implement a ->runtime_suspend() callback in a device driver as long as the subsystem-level suspend callback knows what to do to handle the device).”…”�”}”(hjûh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´KVhjh²hubj[)�”}”(hX6* Once the subsystem-level suspend callback (or the driver suspend callback, if invoked directly) has completed successfully for the given device, the PM core regards the device as suspended, which need not mean that it has been put into a low power state. It is supposed to mean, however, that the device will not process data and will not communicate with the CPU(s) and RAM until the appropriate resume callback is executed for it. The runtime PM status of a device after successful execution of the suspend callback is 'suspended'. * If the suspend callback returns -EBUSY or -EAGAIN, the device's runtime PM status remains 'active', which means that the device _must_ be fully operational afterwards. * If the suspend callback returns an error code different from -EBUSY and -EAGAIN, the PM core regards this as a fatal error and will refuse to run the helper functions described in Section 4 for the device until its status is directly set to either 'active', or 'suspended' (the PM core provides special helper functions for this purpose). ”h]”j™)�”}”(hhh]”(hÑ)�”}”(hXOnce the subsystem-level suspend callback (or the driver suspend callback, if invoked directly) has completed successfully for the given device, the PM core regards the device as suspended, which need not mean that it has been put into a low power state. It is supposed to mean, however, that the device will not process data and will not communicate with the CPU(s) and RAM until the appropriate resume callback is executed for it. The runtime PM status of a device after successful execution of the suspend callback is 'suspended'. ”h]”h×)�”}”(hXOnce the subsystem-level suspend callback (or the driver suspend callback, if invoked directly) has completed successfully for the given device, the PM core regards the device as suspended, which need not mean that it has been put into a low power state. It is supposed to mean, however, that the device will not process data and will not communicate with the CPU(s) and RAM until the appropriate resume callback is executed for it. The runtime PM status of a device after successful execution of the suspend callback is 'suspended'.”h]”hXOnce the subsystem-level suspend callback (or the driver suspend callback, if invoked directly) has completed successfully for the given device, the PM core regards the device as suspended, which need not mean that it has been put into a low power state. It is supposed to mean, however, that the device will not process data and will not communicate with the CPU(s) and RAM until the appropriate resume callback is executed for it. The runtime PM status of a device after successful execution of the suspend callback is ‘suspended’.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´K]hjubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhj ubhÑ)�”}”(hŒ¨If the suspend callback returns -EBUSY or -EAGAIN, the device's runtime PM status remains 'active', which means that the device _must_ be fully operational afterwards. ”h]”h×)�”}”(hŒ§If the suspend callback returns -EBUSY or -EAGAIN, the device's runtime PM status remains 'active', which means that the device _must_ be fully operational afterwards.”h]”hŒ­If the suspend callback returns -EBUSY or -EAGAIN, the device’s runtime PM status remains ‘active’, which means that the device _must_ be fully operational afterwards.”…”�”}”(hj,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´Kfhj(ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhj ubhÑ)�”}”(hXTIf the suspend callback returns an error code different from -EBUSY and -EAGAIN, the PM core regards this as a fatal error and will refuse to run the helper functions described in Section 4 for the device until its status is directly set to either 'active', or 'suspended' (the PM core provides special helper functions for this purpose). ”h]”h×)�”}”(hXSIf the suspend callback returns an error code different from -EBUSY and -EAGAIN, the PM core regards this as a fatal error and will refuse to run the helper functions described in Section 4 for the device until its status is directly set to either 'active', or 'suspended' (the PM core provides special helper functions for this purpose).”h]”hX[If the suspend callback returns an error code different from -EBUSY and -EAGAIN, the PM core regards this as a fatal error and will refuse to run the helper functions described in Section 4 for the device until its status is directly set to either ‘active’, or ‘suspended’ (the PM core provides special helper functions for this purpose).”…”�”}”(hjDh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´Kjhj@ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhj ubeh}”(h]”h ]”h"]”h$]”h&]”jjuh1j˜h³hÊh´K]hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jZh³hÊh´K]hjh²hubh×)�”}”(hXqIn particular, if the driver requires remote wakeup capability (i.e. hardware mechanism allowing the device to request a change of its power state, such as PCI PME) for proper functioning and device_can_wakeup() returns 'false' for the device, then ->runtime_suspend() should return -EBUSY. On the other hand, if device_can_wakeup() returns 'true' for the device and the device is put into a low-power state during the execution of the suspend callback, it is expected that remote wakeup will be enabled for the device. Generally, remote wakeup should be enabled for all input devices put into low-power states at run time.”h]”hXyIn particular, if the driver requires remote wakeup capability (i.e. hardware mechanism allowing the device to request a change of its power state, such as PCI PME) for proper functioning and device_can_wakeup() returns ‘false’ for the device, then ->runtime_suspend() should return -EBUSY. On the other hand, if device_can_wakeup() returns ‘true’ for the device and the device is put into a low-power state during the execution of the suspend callback, it is expected that remote wakeup will be enabled for the device. Generally, remote wakeup should be enabled for all input devices put into low-power states at run time.”…”�”}”(hjdh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´Kphjh²hubh×)�”}”(hX«The subsystem-level resume callback, if present, is **entirely responsible** for handling the resume of the device as appropriate, which may, but need not include executing the device driver's own ->runtime_resume() callback (from the PM core's point of view it is not necessary to implement a ->runtime_resume() callback in a device driver as long as the subsystem-level resume callback knows what to do to handle the device).”h]”(hŒ4The subsystem-level resume callback, if present, is ”…”�”}”(hjrh²hh³Nh´NubhŒstrong”“”)�”}”(hŒ**entirely responsible**”h]”hŒentirely responsible”…”�”}”(hj|h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jzhjrubhXc for handling the resume of the device as appropriate, which may, but need not include executing the device driver’s own ->runtime_resume() callback (from the PM core’s point of view it is not necessary to implement a ->runtime_resume() callback in a device driver as long as the subsystem-level resume callback knows what to do to handle the device).”…”�”}”(hjrh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´Kyhjh²hubj[)�”}”(hXŒ* Once the subsystem-level resume callback (or the driver resume callback, if invoked directly) has completed successfully, the PM core regards the device as fully operational, which means that the device _must_ be able to complete I/O operations as needed. The runtime PM status of the device is then 'active'. * If the resume callback returns an error code, the PM core regards this as a fatal error and will refuse to run the helper functions described in Section 4 for the device, until its status is directly set to either 'active', or 'suspended' (by means of special helper functions provided by the PM core for this purpose). ”h]”j™)�”}”(hhh]”(hÑ)�”}”(hX7Once the subsystem-level resume callback (or the driver resume callback, if invoked directly) has completed successfully, the PM core regards the device as fully operational, which means that the device _must_ be able to complete I/O operations as needed. The runtime PM status of the device is then 'active'. ”h]”h×)�”}”(hX6Once the subsystem-level resume callback (or the driver resume callback, if invoked directly) has completed successfully, the PM core regards the device as fully operational, which means that the device _must_ be able to complete I/O operations as needed. The runtime PM status of the device is then 'active'.”h]”hX:Once the subsystem-level resume callback (or the driver resume callback, if invoked directly) has completed successfully, the PM core regards the device as fully operational, which means that the device _must_ be able to complete I/O operations as needed. The runtime PM status of the device is then ‘active’.”…”�”}”(hjŸh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´K€hj›ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhj˜ubhÑ)�”}”(hX@If the resume callback returns an error code, the PM core regards this as a fatal error and will refuse to run the helper functions described in Section 4 for the device, until its status is directly set to either 'active', or 'suspended' (by means of special helper functions provided by the PM core for this purpose). ”h]”h×)�”}”(hX?If the resume callback returns an error code, the PM core regards this as a fatal error and will refuse to run the helper functions described in Section 4 for the device, until its status is directly set to either 'active', or 'suspended' (by means of special helper functions provided by the PM core for this purpose).”h]”hXGIf the resume callback returns an error code, the PM core regards this as a fatal error and will refuse to run the helper functions described in Section 4 for the device, until its status is directly set to either ‘active’, or ‘suspended’ (by means of special helper functions provided by the PM core for this purpose).”…”�”}”(hj·h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´K†hj³ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhj˜ubeh}”(h]”h ]”h"]”h$]”h&]”jjuh1j˜h³hÊh´K€hj”ubah}”(h]”h ]”h"]”h$]”h&]”uh1jZh³hÊh´K€hjh²hubh×)�”}”(hX The idle callback (a subsystem-level one, if present, or the driver one) is executed by the PM core whenever the device appears to be idle, which is indicated to the PM core by two counters, the device's usage counter and the counter of 'active' children of the device.”h]”hXThe idle callback (a subsystem-level one, if present, or the driver one) is executed by the PM core whenever the device appears to be idle, which is indicated to the PM core by two counters, the device’s usage counter and the counter of ‘active’ children of the device.”…”�”}”(hj×h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´KŒhjh²hubj[)�”}”(hX* If any of these counters is decreased using a helper function provided by the PM core and it turns out to be equal to zero, the other counter is checked. If that counter also is equal to zero, the PM core executes the idle callback with the device as its argument. ”h]”j™)�”}”(hhh]”hÑ)�”}”(hX If any of these counters is decreased using a helper function provided by the PM core and it turns out to be equal to zero, the other counter is checked. If that counter also is equal to zero, the PM core executes the idle callback with the device as its argument. ”h]”h×)�”}”(hX If any of these counters is decreased using a helper function provided by the PM core and it turns out to be equal to zero, the other counter is checked. If that counter also is equal to zero, the PM core executes the idle callback with the device as its argument.”h]”hX If any of these counters is decreased using a helper function provided by the PM core and it turns out to be equal to zero, the other counter is checked. If that counter also is equal to zero, the PM core executes the idle callback with the device as its argument.”…”�”}”(hjðh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´K‘hjìubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhjéubah}”(h]”h ]”h"]”h$]”h&]”jjuh1j˜h³hÊh´K‘hjåubah}”(h]”h ]”h"]”h$]”h&]”uh1jZh³hÊh´K‘hjh²hubh×)�”}”(hXýThe action performed by the idle callback is totally dependent on the subsystem (or driver) in question, but the expected and recommended action is to check if the device can be suspended (i.e. if all of the conditions necessary for suspending the device are satisfied) and to queue up a suspend request for the device in that case. If there is no idle callback, or if the callback returns 0, then the PM core will attempt to carry out a runtime suspend of the device, also respecting devices configured for autosuspend. In essence this means a call to pm_runtime_autosuspend(). To prevent this (for example, if the callback routine has started a delayed suspend), the routine must return a non-zero value. Negative error return codes are ignored by the PM core.”h]”hXýThe action performed by the idle callback is totally dependent on the subsystem (or driver) in question, but the expected and recommended action is to check if the device can be suspended (i.e. if all of the conditions necessary for suspending the device are satisfied) and to queue up a suspend request for the device in that case. If there is no idle callback, or if the callback returns 0, then the PM core will attempt to carry out a runtime suspend of the device, also respecting devices configured for autosuspend. In essence this means a call to pm_runtime_autosuspend(). To prevent this (for example, if the callback routine has started a delayed suspend), the routine must return a non-zero value. Negative error return codes are ignored by the PM core.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´K–hjh²hubh×)�”}”(hŒ«The helper functions provided by the PM core, described in Section 4, guarantee that the following constraints are met with respect to runtime PM callbacks for one device:”h]”hŒ«The helper functions provided by the PM core, described in Section 4, guarantee that the following constraints are met with respect to runtime PM callbacks for one device:”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´K¡hjh²hubhÌ)�”}”(hhh]”(hÑ)�”}”(hX¯The callbacks are mutually exclusive (e.g. it is forbidden to execute ->runtime_suspend() in parallel with ->runtime_resume() or with another instance of ->runtime_suspend() for the same device) with the exception that ->runtime_suspend() or ->runtime_resume() can be executed in parallel with ->runtime_idle() (although ->runtime_idle() will not be started while any of the other callbacks is being executed for the same device). ”h]”h×)�”}”(hX®The callbacks are mutually exclusive (e.g. it is forbidden to execute ->runtime_suspend() in parallel with ->runtime_resume() or with another instance of ->runtime_suspend() for the same device) with the exception that ->runtime_suspend() or ->runtime_resume() can be executed in parallel with ->runtime_idle() (although ->runtime_idle() will not be started while any of the other callbacks is being executed for the same device).”h]”hX®The callbacks are mutually exclusive (e.g. it is forbidden to execute ->runtime_suspend() in parallel with ->runtime_resume() or with another instance of ->runtime_suspend() for the same device) with the exception that ->runtime_suspend() or ->runtime_resume() can be executed in parallel with ->runtime_idle() (although ->runtime_idle() will not be started while any of the other callbacks is being executed for the same device).”…”�”}”(hj3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´K¥hj/ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhj,h²hh³hÊh´NubhÑ)�”}”(hŒÜ->runtime_idle() and ->runtime_suspend() can only be executed for 'active' devices (i.e. the PM core will only execute ->runtime_idle() or ->runtime_suspend() for the devices the runtime PM status of which is 'active'). ”h]”h×)�”}”(hŒÛ->runtime_idle() and ->runtime_suspend() can only be executed for 'active' devices (i.e. the PM core will only execute ->runtime_idle() or ->runtime_suspend() for the devices the runtime PM status of which is 'active').”h]”hŒã->runtime_idle() and ->runtime_suspend() can only be executed for ‘active’ devices (i.e. the PM core will only execute ->runtime_idle() or ->runtime_suspend() for the devices the runtime PM status of which is ‘active’).”…”�”}”(hjKh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´K¬hjGubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhj,h²hh³hÊh´NubhÑ)�”}”(hŒõ->runtime_idle() and ->runtime_suspend() can only be executed for a device the usage counter of which is equal to zero _and_ either the counter of 'active' children of which is equal to zero, or the 'power.ignore_children' flag of which is set. ”h]”h×)�”}”(hŒô->runtime_idle() and ->runtime_suspend() can only be executed for a device the usage counter of which is equal to zero _and_ either the counter of 'active' children of which is equal to zero, or the 'power.ignore_children' flag of which is set.”h]”hŒü->runtime_idle() and ->runtime_suspend() can only be executed for a device the usage counter of which is equal to zero _and_ either the counter of ‘active’ children of which is equal to zero, or the ‘power.ignore_children’ flag of which is set.”…”�”}”(hjch²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´K±hj_ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhj,h²hh³hÊh´NubhÑ)�”}”(hŒ¸->runtime_resume() can only be executed for 'suspended' devices (i.e. the PM core will only execute ->runtime_resume() for the devices the runtime PM status of which is 'suspended'). ”h]”h×)�”}”(hŒ·->runtime_resume() can only be executed for 'suspended' devices (i.e. the PM core will only execute ->runtime_resume() for the devices the runtime PM status of which is 'suspended').”h]”hŒ¿->runtime_resume() can only be executed for ‘suspended’ devices (i.e. the PM core will only execute ->runtime_resume() for the devices the runtime PM status of which is ‘suspended’).”…”�”}”(hj{h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´K¶hjwubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhj,h²hh³hÊh´Nubeh}”(h]”h ]”h"]”h$]”h&]”jjÉj j j j uh1hËhjh²hh³hÊh´K¥ubh×)�”}”(hŒTAdditionally, the helper functions provided by the PM core obey the following rules:”h]”hŒTAdditionally, the helper functions provided by the PM core obey the following rules:”…”�”}”(hj•h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´Kºhjh²hubj[)�”}”(hX�* If ->runtime_suspend() is about to be executed or there's a pending request to execute it, ->runtime_idle() will not be executed for the same device. * A request to execute or to schedule the execution of ->runtime_suspend() will cancel any pending requests to execute ->runtime_idle() for the same device. * If ->runtime_resume() is about to be executed or there's a pending request to execute it, the other callbacks will not be executed for the same device. * A request to execute ->runtime_resume() will cancel any pending or scheduled requests to execute the other callbacks for the same device, except for scheduled autosuspends. ”h]”j™)�”}”(hhh]”(hÑ)�”}”(hŒ–If ->runtime_suspend() is about to be executed or there's a pending request to execute it, ->runtime_idle() will not be executed for the same device. ”h]”h×)�”}”(hŒ•If ->runtime_suspend() is about to be executed or there's a pending request to execute it, ->runtime_idle() will not be executed for the same device.”h]”hŒ—If ->runtime_suspend() is about to be executed or there’s a pending request to execute it, ->runtime_idle() will not be executed for the same device.”…”�”}”(hj®h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´K½hjªubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhj§ubhÑ)�”}”(hŒ›A request to execute or to schedule the execution of ->runtime_suspend() will cancel any pending requests to execute ->runtime_idle() for the same device. ”h]”h×)�”}”(hŒšA request to execute or to schedule the execution of ->runtime_suspend() will cancel any pending requests to execute ->runtime_idle() for the same device.”h]”hŒšA request to execute or to schedule the execution of ->runtime_suspend() will cancel any pending requests to execute ->runtime_idle() for the same device.”…”�”}”(hjÆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´KÀhjÂubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhj§ubhÑ)�”}”(hŒ˜If ->runtime_resume() is about to be executed or there's a pending request to execute it, the other callbacks will not be executed for the same device. ”h]”h×)�”}”(hŒ—If ->runtime_resume() is about to be executed or there's a pending request to execute it, the other callbacks will not be executed for the same device.”h]”hŒ™If ->runtime_resume() is about to be executed or there’s a pending request to execute it, the other callbacks will not be executed for the same device.”…”�”}”(hjÞh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´KÄhjÚubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhj§ubhÑ)�”}”(hŒ­A request to execute ->runtime_resume() will cancel any pending or scheduled requests to execute the other callbacks for the same device, except for scheduled autosuspends. ”h]”h×)�”}”(hŒ¬A request to execute ->runtime_resume() will cancel any pending or scheduled requests to execute the other callbacks for the same device, except for scheduled autosuspends.”h]”hŒ¬A request to execute ->runtime_resume() will cancel any pending or scheduled requests to execute the other callbacks for the same device, except for scheduled autosuspends.”…”�”}”(hjöh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´KÇhjòubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhj§ubeh}”(h]”h ]”h"]”h$]”h&]”jjuh1j˜h³hÊh´K½hj£ubah}”(h]”h ]”h"]”h$]”h&]”uh1jZh³hÊh´K½hjh²hubeh}”(h]”Œdevice-runtime-pm-callbacks”ah ]”h"]”Œ2. device runtime pm callbacks”ah$]”h&]”uh1hµhh·h²hh³hÊh´K)ubh¶)�”}”(hhh]”(h»)�”}”(hŒ3. Runtime PM Device Fields”h]”hŒ3. Runtime PM Device Fields”…”�”}”(hj!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjh²hh³hÊh´KÌubh×)�”}”(hŒmThe following device runtime PM fields are present in 'struct dev_pm_info', as defined in include/linux/pm.h:”h]”hŒqThe following device runtime PM fields are present in ‘struct dev_pm_info’, as defined in include/linux/pm.h:”…”�”}”(hj/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´KÎhjh²hubj[)�”}”(hX*`struct timer_list suspend_timer;` - timer used for scheduling (delayed) suspend and autosuspend requests `unsigned long timer_expires;` - timer expiration time, in jiffies (if this is different from zero, the timer is running and will expire at that time, otherwise the timer is not running) `struct work_struct work;` - work structure used for queuing up requests (i.e. work items in pm_wq) `wait_queue_head_t wait_queue;` - wait queue used if any of the helper functions needs to wait for another one to complete `spinlock_t lock;` - lock used for synchronization `atomic_t usage_count;` - the usage counter of the device `atomic_t child_count;` - the count of 'active' children of the device `unsigned int ignore_children;` - if set, the value of child_count is ignored (but still updated) `unsigned int disable_depth;` - used for disabling the helper functions (they work normally if this is equal to zero); the initial value of it is 1 (i.e. runtime PM is initially disabled for all devices) `int runtime_error;` - if set, there was a fatal error (one of the callbacks returned error code as described in Section 2), so the helper functions will not work until this flag is cleared; this is the error code returned by the failing callback `unsigned int idle_notification;` - if set, ->runtime_idle() is being executed `unsigned int request_pending;` - if set, there's a pending request (i.e. a work item queued up into pm_wq) `enum rpm_request request;` - type of request that's pending (valid if request_pending is set) `unsigned int deferred_resume;` - set if ->runtime_resume() is about to be run while ->runtime_suspend() is being executed for that device and it is not practical to wait for the suspend to complete; means "start a resume as soon as you've suspended" `enum rpm_status runtime_status;` - the runtime PM status of the device; this field's initial value is RPM_SUSPENDED, which means that each device is initially regarded by the PM core as 'suspended', regardless of its real hardware status `enum rpm_status last_status;` - the last runtime PM status of the device captured before disabling runtime PM for it (invalid initially and when disable_depth is 0) `unsigned int runtime_auto;` - if set, indicates that the user space has allowed the device driver to power manage the device at run time via the /sys/devices/.../power/control `interface;` it may only be modified with the help of the pm_runtime_allow() and pm_runtime_forbid() helper functions `unsigned int no_callbacks;` - indicates that the device does not use the runtime PM callbacks (see Section 8); it may be modified only by the pm_runtime_no_callbacks() helper function `unsigned int irq_safe;` - indicates that the ->runtime_suspend() and ->runtime_resume() callbacks will be invoked with the spinlock held and interrupts disabled `unsigned int use_autosuspend;` - indicates that the device's driver supports delayed autosuspend (see Section 9); it may be modified only by the pm_runtime{_dont}_use_autosuspend() helper functions `unsigned int timer_autosuspends;` - indicates that the PM core should attempt to carry out an autosuspend when the timer expires rather than a normal suspend `int autosuspend_delay;` - the delay time (in milliseconds) to be used for autosuspend `unsigned long last_busy;` - the time (in jiffies) when the pm_runtime_mark_last_busy() helper function was last called for this device; used in calculating inactivity periods for autosuspend ”h]”hŒdefinition_list”“”)�”}”(hhh]”(hŒdefinition_list_item”“”)�”}”(hŒj`struct timer_list suspend_timer;` - timer used for scheduling (delayed) suspend and autosuspend requests ”h]”(hŒterm”“”)�”}”(hŒ"`struct timer_list suspend_timer;`”h]”hŒtitle_reference”“”)�”}”(hjPh]”hŒ struct timer_list suspend_timer;”…”�”}”(hjTh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhjNubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´KÒhjHubhŒ definition”“”)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒEtimer used for scheduling (delayed) suspend and autosuspend requests ”h]”h×)�”}”(hŒDtimer used for scheduling (delayed) suspend and autosuspend requests”h]”hŒDtimer used for scheduling (delayed) suspend and autosuspend requests”…”�”}”(hjsh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´KÒhjoubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhjlubah}”(h]”h ]”h"]”h$]”h&]”jŒ-”uh1j˜h³hÊh´KÒhjiubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjHubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´KÒhjCubjG)�”}”(hŒ¿`unsigned long timer_expires;` - timer expiration time, in jiffies (if this is different from zero, the timer is running and will expire at that time, otherwise the timer is not running) ”h]”(jM)�”}”(hŒ`unsigned long timer_expires;`”h]”jS)�”}”(hj h]”hŒunsigned long timer_expires;”…”�”}”(hj¢h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhjžubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´K×hjšubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒštimer expiration time, in jiffies (if this is different from zero, the timer is running and will expire at that time, otherwise the timer is not running) ”h]”h×)�”}”(hŒ™timer expiration time, in jiffies (if this is different from zero, the timer is running and will expire at that time, otherwise the timer is not running)”h]”hŒ™timer expiration time, in jiffies (if this is different from zero, the timer is running and will expire at that time, otherwise the timer is not running)”…”�”}”(hj¿h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´KÕhj»ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhj¸ubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´KÕhjµubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjšubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´K×hjCubjG)�”}”(hŒd`struct work_struct work;` - work structure used for queuing up requests (i.e. work items in pm_wq) ”h]”(jM)�”}”(hŒ`struct work_struct work;`”h]”jS)�”}”(hjëh]”hŒstruct work_struct work;”…”�”}”(hjíh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhjéubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´KÚhjåubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒGwork structure used for queuing up requests (i.e. work items in pm_wq) ”h]”h×)�”}”(hŒFwork structure used for queuing up requests (i.e. work items in pm_wq)”h]”hŒFwork structure used for queuing up requests (i.e. work items in pm_wq)”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´KÚhjubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhjubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´KÚhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjåubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´KÚhjCubjG)�”}”(hŒ}`wait_queue_head_t wait_queue;` - wait queue used if any of the helper functions needs to wait for another one to complete ”h]”(jM)�”}”(hŒ`wait_queue_head_t wait_queue;`”h]”jS)�”}”(hj6h]”hŒwait_queue_head_t wait_queue;”…”�”}”(hj8h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhj4ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´KÞhj0ubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒYwait queue used if any of the helper functions needs to wait for another one to complete ”h]”h×)�”}”(hŒXwait queue used if any of the helper functions needs to wait for another one to complete”h]”hŒXwait queue used if any of the helper functions needs to wait for another one to complete”…”�”}”(hjUh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´KÝhjQubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhjNubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´KÝhjKubah}”(h]”h ]”h"]”h$]”h&]”uh1jghj0ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´KÞhjCubjG)�”}”(hŒ3`spinlock_t lock;` - lock used for synchronization ”h]”(jM)�”}”(hŒ`spinlock_t lock;`”h]”jS)�”}”(hj�h]”hŒspinlock_t lock;”…”�”}”(hjƒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´Káhj{ubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒlock used for synchronization ”h]”h×)�”}”(hŒlock used for synchronization”h]”hŒlock used for synchronization”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´Káhjœubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhj™ubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´Káhj–ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghj{ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´KáhjCubjG)�”}”(hŒ:`atomic_t usage_count;` - the usage counter of the device ”h]”(jM)�”}”(hŒ`atomic_t usage_count;`”h]”jS)�”}”(hjÌh]”hŒatomic_t usage_count;”…”�”}”(hjÎh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhjÊubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´KähjÆubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒ the usage counter of the device ”h]”h×)�”}”(hŒthe usage counter of the device”h]”hŒthe usage counter of the device”…”�”}”(hjëh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´Kähjçubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhjäubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´Kähjáubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjÆubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´KähjCubjG)�”}”(hŒG`atomic_t child_count;` - the count of 'active' children of the device ”h]”(jM)�”}”(hŒ`atomic_t child_count;`”h]”jS)�”}”(hjh]”hŒatomic_t child_count;”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´Kçhjubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒ-the count of 'active' children of the device ”h]”h×)�”}”(hŒ,the count of 'active' children of the device”h]”hŒ0the count of ‘active’ children of the device”…”�”}”(hj6h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´Kçhj2ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhj/ubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´Kçhj,ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´KçhjCubjG)�”}”(hŒb`unsigned int ignore_children;` - if set, the value of child_count is ignored (but still updated) ”h]”(jM)�”}”(hŒ`unsigned int ignore_children;`”h]”jS)�”}”(hjbh]”hŒunsigned int ignore_children;”…”�”}”(hjdh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhj`ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´Kêhj\ubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒ@if set, the value of child_count is ignored (but still updated) ”h]”h×)�”}”(hŒ?if set, the value of child_count is ignored (but still updated)”h]”hŒ?if set, the value of child_count is ignored (but still updated)”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´Kêhj}ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhjzubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´Kêhjwubah}”(h]”h ]”h"]”h$]”h&]”uh1jghj\ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´KêhjCubjG)�”}”(hŒÐ`unsigned int disable_depth;` - used for disabling the helper functions (they work normally if this is equal to zero); the initial value of it is 1 (i.e. runtime PM is initially disabled for all devices) ”h]”(jM)�”}”(hŒ`unsigned int disable_depth;`”h]”jS)�”}”(hj­h]”hŒunsigned int disable_depth;”…”�”}”(hj¯h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhj«ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´Kïhj§ubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒ¬used for disabling the helper functions (they work normally if this is equal to zero); the initial value of it is 1 (i.e. runtime PM is initially disabled for all devices) ”h]”h×)�”}”(hŒ«used for disabling the helper functions (they work normally if this is equal to zero); the initial value of it is 1 (i.e. runtime PM is initially disabled for all devices)”h]”hŒ«used for disabling the helper functions (they work normally if this is equal to zero); the initial value of it is 1 (i.e. runtime PM is initially disabled for all devices)”…”�”}”(hjÌh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´KíhjÈubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhjÅubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´KíhjÂubah}”(h]”h ]”h"]”h$]”h&]”uh1jghj§ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´KïhjCubjG)�”}”(hŒý`int runtime_error;` - if set, there was a fatal error (one of the callbacks returned error code as described in Section 2), so the helper functions will not work until this flag is cleared; this is the error code returned by the failing callback ”h]”(jM)�”}”(hŒ`int runtime_error;`”h]”jS)�”}”(hjøh]”hŒint runtime_error;”…”�”}”(hjúh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhjöubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´Kõhjòubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒàif set, there was a fatal error (one of the callbacks returned error code as described in Section 2), so the helper functions will not work until this flag is cleared; this is the error code returned by the failing callback ”h]”h×)�”}”(hŒßif set, there was a fatal error (one of the callbacks returned error code as described in Section 2), so the helper functions will not work until this flag is cleared; this is the error code returned by the failing callback”h]”hŒßif set, there was a fatal error (one of the callbacks returned error code as described in Section 2), so the helper functions will not work until this flag is cleared; this is the error code returned by the failing callback”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´Kòhjubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhjubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´Kòhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjòubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´KõhjCubjG)�”}”(hŒO`unsigned int idle_notification;` - if set, ->runtime_idle() is being executed ”h]”(jM)�”}”(hŒ!`unsigned int idle_notification;`”h]”jS)�”}”(hjCh]”hŒunsigned int idle_notification;”…”�”}”(hjEh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhjAubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´Køhj=ubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒ+if set, ->runtime_idle() is being executed ”h]”h×)�”}”(hŒ*if set, ->runtime_idle() is being executed”h]”hŒ*if set, ->runtime_idle() is being executed”…”�”}”(hjbh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´Køhj^ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhj[ubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´KøhjXubah}”(h]”h ]”h"]”h$]”h&]”uh1jghj=ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´KøhjCubjG)�”}”(hŒl`unsigned int request_pending;` - if set, there's a pending request (i.e. a work item queued up into pm_wq) ”h]”(jM)�”}”(hŒ`unsigned int request_pending;`”h]”jS)�”}”(hjŽh]”hŒunsigned int request_pending;”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhjŒubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´Kûhjˆubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒJif set, there's a pending request (i.e. a work item queued up into pm_wq) ”h]”h×)�”}”(hŒIif set, there's a pending request (i.e. a work item queued up into pm_wq)”h]”hŒKif set, there’s a pending request (i.e. a work item queued up into pm_wq)”…”�”}”(hj­h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´Kûhj©ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhj¦ubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´Kûhj£ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjˆubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´KûhjCubjG)�”}”(hŒ_`enum rpm_request request;` - type of request that's pending (valid if request_pending is set) ”h]”(jM)�”}”(hŒ`enum rpm_request request;`”h]”jS)�”}”(hjÙh]”hŒenum rpm_request request;”…”�”}”(hjÛh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhj×ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´KþhjÓubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒAtype of request that's pending (valid if request_pending is set) ”h]”h×)�”}”(hŒ@type of request that's pending (valid if request_pending is set)”h]”hŒBtype of request that’s pending (valid if request_pending is set)”…”�”}”(hjøh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´Kþhjôubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhjñubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´Kþhjîubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjÓubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´KþhjCubjG)�”}”(hŒÿ`unsigned int deferred_resume;` - set if ->runtime_resume() is about to be run while ->runtime_suspend() is being executed for that device and it is not practical to wait for the suspend to complete; means "start a resume as soon as you've suspended" ”h]”(jM)�”}”(hŒ`unsigned int deferred_resume;`”h]”jS)�”}”(hj$ h]”hŒunsigned int deferred_resume;”…”�”}”(hj& h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhj" ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´Mhj ubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒÙset if ->runtime_resume() is about to be run while ->runtime_suspend() is being executed for that device and it is not practical to wait for the suspend to complete; means "start a resume as soon as you've suspended" ”h]”h×)�”}”(hŒØset if ->runtime_resume() is about to be run while ->runtime_suspend() is being executed for that device and it is not practical to wait for the suspend to complete; means "start a resume as soon as you've suspended"”h]”hŒÞset if ->runtime_resume() is about to be run while ->runtime_suspend() is being executed for that device and it is not practical to wait for the suspend to complete; means “start a resume as soon as you’ve suspendedâ€�”…”�”}”(hjC h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´Mhj? ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhj< ubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´Mhj9 ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´MhjCubjG)�”}”(hŒó`enum rpm_status runtime_status;` - the runtime PM status of the device; this field's initial value is RPM_SUSPENDED, which means that each device is initially regarded by the PM core as 'suspended', regardless of its real hardware status ”h]”(jM)�”}”(hŒ!`enum rpm_status runtime_status;`”h]”jS)�”}”(hjo h]”hŒenum rpm_status runtime_status;”…”�”}”(hjq h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhjm ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´Mhji ubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒËthe runtime PM status of the device; this field's initial value is RPM_SUSPENDED, which means that each device is initially regarded by the PM core as 'suspended', regardless of its real hardware status ”h]”h×)�”}”(hŒÊthe runtime PM status of the device; this field's initial value is RPM_SUSPENDED, which means that each device is initially regarded by the PM core as 'suspended', regardless of its real hardware status”h]”hŒÐthe runtime PM status of the device; this field’s initial value is RPM_SUSPENDED, which means that each device is initially regarded by the PM core as ‘suspended’, regardless of its real hardware status”…”�”}”(hjŽ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´MhjŠ ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhj‡ ubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´Mhj„ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghji ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´MhjCubjG)�”}”(hŒ¨`enum rpm_status last_status;` - the last runtime PM status of the device captured before disabling runtime PM for it (invalid initially and when disable_depth is 0) ”h]”(jM)�”}”(hŒ`enum rpm_status last_status;`”h]”jS)�”}”(hjº h]”hŒenum rpm_status last_status;”…”�”}”(hj¼ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhj¸ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´M hj´ ubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒ…the last runtime PM status of the device captured before disabling runtime PM for it (invalid initially and when disable_depth is 0) ”h]”h×)�”}”(hŒ„the last runtime PM status of the device captured before disabling runtime PM for it (invalid initially and when disable_depth is 0)”h]”hŒ„the last runtime PM status of the device captured before disabling runtime PM for it (invalid initially and when disable_depth is 0)”…”�”}”(hjÙ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´M hjÕ ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhjÒ ubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´M hjÏ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghj´ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´M hjCubjG)�”}”(hX-`unsigned int runtime_auto;` - if set, indicates that the user space has allowed the device driver to power manage the device at run time via the /sys/devices/.../power/control `interface;` it may only be modified with the help of the pm_runtime_allow() and pm_runtime_forbid() helper functions ”h]”(jM)�”}”(hŒ`unsigned int runtime_auto;`”h]”jS)�”}”(hj h]”hŒunsigned int runtime_auto;”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´Mhjÿ ubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hXif set, indicates that the user space has allowed the device driver to power manage the device at run time via the /sys/devices/.../power/control `interface;` it may only be modified with the help of the pm_runtime_allow() and pm_runtime_forbid() helper functions ”h]”h×)�”}”(hXif set, indicates that the user space has allowed the device driver to power manage the device at run time via the /sys/devices/.../power/control `interface;` it may only be modified with the help of the pm_runtime_allow() and pm_runtime_forbid() helper functions”h]”(hŒ’if set, indicates that the user space has allowed the device driver to power manage the device at run time via the /sys/devices/.../power/control ”…”�”}”(hj$ h²hh³Nh´NubjS)�”}”(hŒ `interface;`”h]”hŒ interface;”…”�”}”(hj, h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhj$ ubhŒi it may only be modified with the help of the pm_runtime_allow() and pm_runtime_forbid() helper functions”…”�”}”(hj$ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´Mhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhj ubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´Mhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjÿ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´MhjCubjG)�”}”(hŒ½`unsigned int no_callbacks;` - indicates that the device does not use the runtime PM callbacks (see Section 8); it may be modified only by the pm_runtime_no_callbacks() helper function ”h]”(jM)�”}”(hŒ`unsigned int no_callbacks;`”h]”jS)�”}”(hjb h]”hŒunsigned int no_callbacks;”…”�”}”(hjd h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhj` ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´Mhj\ ubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒšindicates that the device does not use the runtime PM callbacks (see Section 8); it may be modified only by the pm_runtime_no_callbacks() helper function ”h]”h×)�”}”(hŒ™indicates that the device does not use the runtime PM callbacks (see Section 8); it may be modified only by the pm_runtime_no_callbacks() helper function”h]”hŒ™indicates that the device does not use the runtime PM callbacks (see Section 8); it may be modified only by the pm_runtime_no_callbacks() helper function”…”�”}”(hj� h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´Mhj} ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhjz ubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´Mhjw ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghj\ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´MhjCubjG)�”}”(hŒ¤`unsigned int irq_safe;` - indicates that the ->runtime_suspend() and ->runtime_resume() callbacks will be invoked with the spinlock held and interrupts disabled ”h]”(jM)�”}”(hŒ`unsigned int irq_safe;`”h]”jS)�”}”(hj­ h]”hŒunsigned int irq_safe;”…”�”}”(hj¯ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhj« ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´Mhj§ ubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒ‡indicates that the ->runtime_suspend() and ->runtime_resume() callbacks will be invoked with the spinlock held and interrupts disabled ”h]”h×)�”}”(hŒ†indicates that the ->runtime_suspend() and ->runtime_resume() callbacks will be invoked with the spinlock held and interrupts disabled”h]”hŒ†indicates that the ->runtime_suspend() and ->runtime_resume() callbacks will be invoked with the spinlock held and interrupts disabled”…”�”}”(hjÌ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´MhjÈ ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhjÅ ubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´Mhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghj§ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´MhjCubjG)�”}”(hŒË`unsigned int use_autosuspend;` - indicates that the device's driver supports delayed autosuspend (see Section 9); it may be modified only by the pm_runtime{_dont}_use_autosuspend() helper functions ”h]”(jM)�”}”(hŒ`unsigned int use_autosuspend;`”h]”jS)�”}”(hjø h]”hŒunsigned int use_autosuspend;”…”�”}”(hjú h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhjö ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´M hjò ubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒ¥indicates that the device's driver supports delayed autosuspend (see Section 9); it may be modified only by the pm_runtime{_dont}_use_autosuspend() helper functions ”h]”h×)�”}”(hŒ¤indicates that the device's driver supports delayed autosuspend (see Section 9); it may be modified only by the pm_runtime{_dont}_use_autosuspend() helper functions”h]”hŒ¦indicates that the device’s driver supports delayed autosuspend (see Section 9); it may be modified only by the pm_runtime{_dont}_use_autosuspend() helper functions”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´Mhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhj ubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´Mhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjò ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´M hjCubjG)�”}”(hŒ¡`unsigned int timer_autosuspends;` - indicates that the PM core should attempt to carry out an autosuspend when the timer expires rather than a normal suspend ”h]”(jM)�”}”(hŒ"`unsigned int timer_autosuspends;`”h]”jS)�”}”(hjC h]”hŒ unsigned int timer_autosuspends;”…”�”}”(hjE h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhjA ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´M$hj= ubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒzindicates that the PM core should attempt to carry out an autosuspend when the timer expires rather than a normal suspend ”h]”h×)�”}”(hŒyindicates that the PM core should attempt to carry out an autosuspend when the timer expires rather than a normal suspend”h]”hŒyindicates that the PM core should attempt to carry out an autosuspend when the timer expires rather than a normal suspend”…”�”}”(hjb h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´M#hj^ ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhj[ ubah}”(h]”h ]”h"]”h$]”h&]”jj�u•4h1j˜h³hÊh´M#hjX ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghj= ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´M$hjCubjG)�”}”(hŒW`int autosuspend_delay;` - the delay time (in milliseconds) to be used for autosuspend ”h]”(jM)�”}”(hŒ`int autosuspend_delay;`”h]”jS)�”}”(hjŽ h]”hŒint autosuspend_delay;”…”�”}”(hj� h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhjŒ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´M'hjˆ ubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒruntime_idle() is already being executed; if there is no callback or the callback returns 0 then run pm_runtime_autosuspend(dev) and return its result `int pm_runtime_suspend(struct device *dev);` - execute the subsystem-level suspend callback for the device; returns 0 on success, 1 if the device's runtime PM status was already 'suspended', or error code on failure, where -EAGAIN or -EBUSY means it is safe to attempt to suspend the device again in future and -EACCES means that 'power.disable_depth' is different from 0 `int pm_runtime_autosuspend(struct device *dev);` - same as pm_runtime_suspend() except that a call to pm_runtime_mark_last_busy() is made and an autosuspend is scheduled for the appropriate time and 0 is returned `int pm_runtime_resume(struct device *dev);` - execute the subsystem-level resume callback for the device; returns 0 on success, 1 if the device's runtime PM status is already 'active' (also if 'power.disable_depth' is nonzero, but the status was 'active' when it was changing from 0 to 1) or error code on failure, where -EAGAIN means it may be safe to attempt to resume the device again in future, but 'power.runtime_error' should be checked additionally, and -EACCES means that the callback could not be run, because 'power.disable_depth' was different from 0 `int pm_runtime_resume_and_get(struct device *dev);` - run pm_runtime_resume(dev) and if successful, increment the device's usage counter; returns 0 on success (whether or not the device's runtime PM status was already 'active') or the error code from pm_runtime_resume() on failure. `int pm_request_idle(struct device *dev);` - submit a request to execute the subsystem-level idle callback for the device (the request is represented by a work item in pm_wq); returns 0 on success or error code if the request has not been queued up `int pm_request_autosuspend(struct device *dev);` - Call pm_runtime_mark_last_busy() and schedule the execution of the subsystem-level suspend callback for the device when the autosuspend delay expires `int pm_schedule_suspend(struct device *dev, unsigned int delay);` - schedule the execution of the subsystem-level suspend callback for the device in future, where 'delay' is the time to wait before queuing up a suspend work item in pm_wq, in milliseconds (if 'delay' is zero, the work item is queued up immediately); returns 0 on success, 1 if the device's PM runtime status was already 'suspended', or error code if the request hasn't been scheduled (or queued up if 'delay' is 0); if the execution of ->runtime_suspend() is already scheduled and not yet expired, the new value of 'delay' will be used as the time to wait `int pm_request_resume(struct device *dev);` - submit a request to execute the subsystem-level resume callback for the device (the request is represented by a work item in pm_wq); returns 0 on success, 1 if the device's runtime PM status was already 'active', or error code if the request hasn't been queued up `void pm_runtime_get_noresume(struct device *dev);` - increment the device's usage counter `int pm_runtime_get(struct device *dev);` - increment the device's usage counter, run pm_request_resume(dev) and return its result `int pm_runtime_get_sync(struct device *dev);` - increment the device's usage counter, run pm_runtime_resume(dev) and return its result; note that it does not drop the device's usage counter on errors, so consider using pm_runtime_resume_and_get() instead of it, especially if its return value is checked by the caller, as this is likely to result in cleaner code. `int pm_runtime_get_if_in_use(struct device *dev);` - return -EINVAL if 'power.disable_depth' is nonzero; otherwise, if the runtime PM status is RPM_ACTIVE and the runtime PM usage counter is nonzero, increment the counter and return 1; otherwise return 0 without changing the counter `int pm_runtime_get_if_active(struct device *dev);` - return -EINVAL if 'power.disable_depth' is nonzero; otherwise, if the runtime PM status is RPM_ACTIVE, increment the counter and return 1; otherwise return 0 without changing the counter `void pm_runtime_put_noidle(struct device *dev);` - decrement the device's usage counter `int pm_runtime_put(struct device *dev);` - decrement the device's usage counter; if the result is 0 then run pm_request_idle(dev) and return its result `int pm_runtime_put_autosuspend(struct device *dev);` - set the power.last_busy field to the current time and decrement the device's usage counter; if the result is 0 then run pm_request_autosuspend(dev) and return its result `int __pm_runtime_put_autosuspend(struct device *dev);` - decrement the device's usage counter; if the result is 0 then run pm_request_autosuspend(dev) and return its result `int pm_runtime_put_sync(struct device *dev);` - decrement the device's usage counter; if the result is 0 then run pm_runtime_idle(dev) and return its result `int pm_runtime_put_sync_suspend(struct device *dev);` - decrement the device's usage counter; if the result is 0 then run pm_runtime_suspend(dev) and return its result `int pm_runtime_put_sync_autosuspend(struct device *dev);` - set the power.last_busy field to the current time and decrement the device's usage counter; if the result is 0 then run pm_runtime_autosuspend(dev) and return its result `void pm_runtime_enable(struct device *dev);` - decrement the device's 'power.disable_depth' field; if that field is equal to zero, the runtime PM helper functions can execute subsystem-level callbacks described in Section 2 for the device `int pm_runtime_disable(struct device *dev);` - increment the device's 'power.disable_depth' field (if the value of that field was previously zero, this prevents subsystem-level runtime PM callbacks from being run for the device), make sure that all of the pending runtime PM operations on the device are either completed or canceled; returns 1 if there was a resume request pending and it was necessary to execute the subsystem-level resume callback for the device to satisfy that request, otherwise 0 is returned `void pm_runtime_barrier(struct device *dev);` - check if there's a resume request pending for the device and resume it (synchronously) in that case, cancel any other pending runtime PM requests regarding it and wait for all runtime PM operations on it in progress to complete `void pm_suspend_ignore_children(struct device *dev, bool enable);` - set/unset the power.ignore_children flag of the device `int pm_runtime_set_active(struct device *dev);` - clear the device's 'power.runtime_error' flag, set the device's runtime PM status to 'active' and update its parent's counter of 'active' children as appropriate (it is only valid to use this function if 'power.runtime_error' is set or 'power.disable_depth' is greater than zero); it will fail and return error code if the device has a parent which is not active and the 'power.ignore_children' flag of which is unset `void pm_runtime_set_suspended(struct device *dev);` - clear the device's 'power.runtime_error' flag, set the device's runtime PM status to 'suspended' and update its parent's counter of 'active' children as appropriate (it is only valid to use this function if 'power.runtime_error' is set or 'power.disable_depth' is greater than zero) `bool pm_runtime_active(struct device *dev);` - return true if the device's runtime PM status is 'active' or its 'power.disable_depth' field is not equal to zero, or false otherwise `bool pm_runtime_suspended(struct device *dev);` - return true if the device's runtime PM status is 'suspended' and its 'power.disable_depth' field is equal to zero, or false otherwise `bool pm_runtime_status_suspended(struct device *dev);` - return true if the device's runtime PM status is 'suspended' `void pm_runtime_no_callbacks(struct device *dev);` - set the power.no_callbacks flag for the device and remove the runtime PM attributes from /sys/devices/.../power (or prevent them from being added when the device is registered) `void pm_runtime_irq_safe(struct device *dev);` - set the power.irq_safe flag for the device, causing the runtime-PM callbacks to be invoked with interrupts off `bool pm_runtime_is_irq_safe(struct device *dev);` - return true if power.irq_safe flag was set for the device, causing the runtime-PM callbacks to be invoked with interrupts off `void pm_runtime_mark_last_busy(struct device *dev);` - set the power.last_busy field to the current time `void pm_runtime_use_autosuspend(struct device *dev);` - set the power.use_autosuspend flag, enabling autosuspend delays; call pm_runtime_get_sync if the flag was previously cleared and power.autosuspend_delay is negative `void pm_runtime_dont_use_autosuspend(struct device *dev);` - clear the power.use_autosuspend flag, disabling autosuspend delays; decrement the device's usage counter if the flag was previously set and power.autosuspend_delay is negative; call pm_runtime_idle `void pm_runtime_set_autosuspend_delay(struct device *dev, int delay);` - set the power.autosuspend_delay value to 'delay' (expressed in milliseconds); if 'delay' is negative then runtime suspends are prevented; if power.use_autosuspend is set, pm_runtime_get_sync may be called or the device's usage counter may be decremented and pm_runtime_idle called depending on if power.autosuspend_delay is changed to or from a negative value; if power.use_autosuspend is clear, pm_runtime_idle is called `unsigned long pm_runtime_autosuspend_expiration(struct device *dev);` - calculate the time when the current autosuspend delay period will expire, based on power.last_busy and power.autosuspend_delay; if the delay time is 1000 ms or larger then the expiration time is rounded up to the nearest second; returns 0 if the delay period has already expired or power.use_autosuspend isn't set, otherwise returns the expiration time in jiffies ”h]”jB)�”}”(hhh]”(jG)�”}”(hŒn`void pm_runtime_init(struct device *dev);` - initialize the device runtime PM fields in 'struct dev_pm_info' ”h]”(jM)�”}”(hŒ+`void pm_runtime_init(struct device *dev);`”h]”jS)�”}”(hjl h]”hŒ)void pm_runtime_init(struct device *dev);”…”�”}”(hjn h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhjj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´M7hjf ubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒ@initialize the device runtime PM fields in 'struct dev_pm_info' ”h]”h×)�”}”(hŒ?initialize the device runtime PM fields in 'struct dev_pm_info'”h]”hŒCinitialize the device runtime PM fields in ‘struct dev_pm_info’”…”�”}”(hj‹ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´M7hj‡ ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhj„ ubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´M7hj� ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjf ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´M7hjc ubjG)�”}”(hŒŸ`void pm_runtime_remove(struct device *dev);` - make sure that the runtime PM of the device will be disabled after removing the device from device hierarchy ”h]”(jM)�”}”(hŒ-`void pm_runtime_remove(struct device *dev);`”h]”jS)�”}”(hj· h]”hŒ+void pm_runtime_remove(struct device *dev);”…”�”}”(hj¹ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhjµ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´M;hj± ubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒmmake sure that the runtime PM of the device will be disabled after removing the device from device hierarchy ”h]”h×)�”}”(hŒlmake sure that the runtime PM of the device will be disabled after removing the device from device hierarchy”h]”hŒlmake sure that the runtime PM of the device will be disabled after removing the device from device hierarchy”…”�”}”(hjÖ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´M:hjÒ ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhjÏ ubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´M:hjÌ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghj± ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´M;hjc ubjG)�”}”(hXF`int pm_runtime_idle(struct device *dev);` - execute the subsystem-level idle callback for the device; returns an error code on failure, where -EINPROGRESS means that ->runtime_idle() is already being executed; if there is no callback or the callback returns 0 then run pm_runtime_autosuspend(dev) and return its result ”h]”(jM)�”}”(hŒ*`int pm_runtime_idle(struct device *dev);`”h]”jS)�”}”(hj h]”hŒ(int pm_runtime_idle(struct device *dev);”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´MAhjü ubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hXexecute the subsystem-level idle callback for the device; returns an error code on failure, where -EINPROGRESS means that ->runtime_idle() is already being executed; if there is no callback or the callback returns 0 then run pm_runtime_autosuspend(dev) and return its result ”h]”h×)�”}”(hXexecute the subsystem-level idle callback for the device; returns an error code on failure, where -EINPROGRESS means that ->runtime_idle() is already being executed; if there is no callback or the callback returns 0 then run pm_runtime_autosuspend(dev) and return its result”h]”hXexecute the subsystem-level idle callback for the device; returns an error code on failure, where -EINPROGRESS means that ->runtime_idle() is already being executed; if there is no callback or the callback returns 0 then run pm_runtime_autosuspend(dev) and return its result”…”�”}”(hj! h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´M>hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhj ubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´M>hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjü ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´MAhjc ubjG)�”}”(hX}`int pm_runtime_suspend(struct device *dev);` - execute the subsystem-level suspend callback for the device; returns 0 on success, 1 if the device's runtime PM status was already 'suspended', or error code on failure, where -EAGAIN or -EBUSY means it is safe to attempt to suspend the device again in future and -EACCES means that 'power.disable_depth' is different from 0 ”h]”(jM)�”}”(hŒ-`int pm_runtime_suspend(struct device *dev);`”h]”jS)�”}”(hjM h]”hŒ+int pm_runtime_suspend(struct device *dev);”…”�”}”(hjO h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhjK ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´MHhjG ubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hXEexecute the subsystem-level suspend callback for the device; returns 0 on success, 1 if the device's runtime PM status was already 'suspended', or error code on failure, where -EAGAIN or -EBUSY means it is safe to attempt to suspend the device again in future and -EACCES means that 'power.disable_depth' is different from 0 ”h]”h×)�”}”(hXDexecute the subsystem-level suspend callback for the device; returns 0 on success, 1 if the device's runtime PM status was already 'suspended', or error code on failure, where -EAGAIN or -EBUSY means it is safe to attempt to suspend the device again in future and -EACCES means that 'power.disable_depth' is different from 0”h]”hXNexecute the subsystem-level suspend callback for the device; returns 0 on success, 1 if the device’s runtime PM status was already ‘suspended’, or error code on failure, where -EAGAIN or -EBUSY means it is safe to attempt to suspend the device again in future and -EACCES means that ‘power.disable_depth’ is different from 0”…”�”}”(hjl h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´MDhjh ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhje ubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´MDhjb ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjG ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´MHhjc ubjG)�”}”(hŒÚ`int pm_runtime_autosuspend(struct device *dev);` - same as pm_runtime_suspend() except that a call to pm_runtime_mark_last_busy() is made and an autosuspend is scheduled for the appropriate time and 0 is returned ”h]”(jM)�”}”(hŒ1`int pm_runtime_autosuspend(struct device *dev);`”h]”jS)�”}”(hj˜ h]”hŒ/int pm_runtime_autosuspend(struct device *dev);”…”�”}”(hjš h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhj– ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´MMhj’ ubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒ¢same as pm_runtime_suspend() except that a call to pm_runtime_mark_last_busy() is made and an autosuspend is scheduled for the appropriate time and 0 is returned ”h]”h×)�”}”(hŒ¡same as pm_runtime_suspend() except that a call to pm_runtime_mark_last_busy() is made and an autosuspend is scheduled for the appropriate time and 0 is returned”h]”hŒ¡same as pm_runtime_suspend() except that a call to pm_runtime_mark_last_busy() is made and an autosuspend is scheduled for the appropriate time and 0 is returned”…”�”}”(hj· h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´MKhj³ ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhj° ubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´MKhj­ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghj’ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´MMhjc ubjG)�”}”(hXA`int pm_runtime_resume(struct device *dev);` - execute the subsystem-level resume callback for the device; returns 0 on success, 1 if the device's runtime PM status is already 'active' (also if 'power.disable_depth' is nonzero, but the status was 'active' when it was changing from 0 to 1) or error code on failure, where -EAGAIN means it may be safe to attempt to resume the device again in future, but 'power.runtime_error' should be checked additionally, and -EACCES means that the callback could not be run, because 'power.disable_depth' was different from 0 ”h]”(jM)�”}”(hŒ,`int pm_runtime_resume(struct device *dev);`”h]”jS)�”}”(hjã h]”hŒ*int pm_runtime_resume(struct device *dev);”…”�”}”(hjå h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhjá ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´MWhjÝ ubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hXexecute the subsystem-level resume callback for the device; returns 0 on success, 1 if the device's runtime PM status is already 'active' (also if 'power.disable_depth' is nonzero, but the status was 'active' when it was changing from 0 to 1) or error code on failure, where -EAGAIN means it may be safe to attempt to resume the device again in future, but 'power.runtime_error' should be checked additionally, and -EACCES means that the callback could not be run, because 'power.disable_depth' was different from 0 ”h]”h×)�”}”(hXexecute the subsystem-level resume callback for the device; returns 0 on success, 1 if the device's runtime PM status is already 'active' (also if 'power.disable_depth' is nonzero, but the status was 'active' when it was changing from 0 to 1) or error code on failure, where -EAGAIN means it may be safe to attempt to resume the device again in future, but 'power.runtime_error' should be checked additionally, and -EACCES means that the callback could not be run, because 'power.disable_depth' was different from 0”h]”hXexecute the subsystem-level resume callback for the device; returns 0 on success, 1 if the device’s runtime PM status is already ‘active’ (also if ‘power.disable_depth’ is nonzero, but the status was ‘active’ when it was changing from 0 to 1) or error code on failure, where -EAGAIN means it may be safe to attempt to resume the device again in future, but ‘power.runtime_error’ should be checked additionally, and -EACCES means that the callback could not be run, because ‘power.disable_depth’ was different from 0”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´MPhjþ ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhjû ubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´MPhjø ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjÝ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´MWhjc ubjG)�”}”(hX"`int pm_runtime_resume_and_get(struct device *dev);` - run pm_runtime_resume(dev) and if successful, increment the device's usage counter; returns 0 on success (whether or not the device's runtime PM status was already 'active') or the error code from pm_runtime_resume() on failure. ”h]”(jM)�”}”(hŒ4`int pm_runtime_resume_and_get(struct device *dev);`”h]”jS)�”}”(hj.h]”hŒ2int pm_runtime_resume_and_get(struct device *dev);”…”�”}”(hj0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhj,ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´M]hj(ubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒårun pm_runtime_resume(dev) and if successful, increment the device's usage counter; returns 0 on success (whether or not the device's runtime PM status was already 'active') or the error code from pm_runtime_resume() on failure. ”h]”h×)�”}”(hŒärun pm_runtime_resume(dev) and if successful, increment the device's usage counter; returns 0 on success (whether or not the device's runtime PM status was already 'active') or the error code from pm_runtime_resume() on failure.”h]”hŒìrun pm_runtime_resume(dev) and if successful, increment the device’s usage counter; returns 0 on success (whether or not the device’s runtime PM status was already ‘active’) or the error code from pm_runtime_resume() on failure.”…”�”}”(hjMh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´MZhjIubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhjFubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´MZhjCubah}”(h]”h ]”h"]”h$]”h&]”uh1jghj(ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´M]hjc ubjG)�”}”(hŒý`int pm_request_idle(struct device *dev);` - submit a request to execute the subsystem-level idle callback for the device (the request is represented by a work item in pm_wq); returns 0 on success or error code if the request has not been queued up ”h]”(jM)�”}”(hŒ*`int pm_request_idle(struct device *dev);`”h]”jS)�”}”(hjyh]”hŒ(int pm_request_idle(struct device *dev);”…”�”}”(hj{h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhjwubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´Mbhjsubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒÌsubmit a request to execute the subsystem-level idle callback for the device (the request is represented by a work item in pm_wq); returns 0 on success or error code if the request has not been queued up ”h]”h×)�”}”(hŒËsubmit a request to execute the subsystem-level idle callback for the device (the request is represented by a work item in pm_wq); returns 0 on success or error code if the request has not been queued up”h]”hŒËsubmit a request to execute the subsystem-level idle callback for the device (the request is represented by a work item in pm_wq); returns 0 on success or error code if the request has not been queued up”…”�”}”(hj˜h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´M`hj”ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhj‘ubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´M`hjŽubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjsubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´Mbhjc ubjG)�”}”(hŒÎ`int pm_request_autosuspend(struct device *dev);` - Call pm_runtime_mark_last_busy() and schedule the execution of the subsystem-level suspend callback for the device when the autosuspend delay expires ”h]”(jM)�”}”(hŒ1`int pm_request_autosuspend(struct device *dev);`”h]”jS)�”}”(hjÄh]”hŒ/int pm_request_autosuspend(struct device *dev);”…”�”}”(hjÆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhjÂubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´Mghj¾ubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒ–Call pm_runtime_mark_last_busy() and schedule the execution of the subsystem-level suspend callback for the device when the autosuspend delay expires ”h]”h×)�”}”(hŒ•Call pm_runtime_mark_last_busy() and schedule the execution of the subsystem-level suspend callback for the device when the autosuspend delay expires”h]”hŒ•Call pm_runtime_mark_last_busy() and schedule the execution of the subsystem-level suspend callback for the device when the autosuspend delay expires”…”�”}”(hjãh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´Mehjßubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhjÜubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´MehjÙubah}”(h]”h ]”h"]”h$]”h&]”uh1jghj¾ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´Mghjc ubjG)�”}”(hX~`int pm_schedule_suspend(struct device *dev, unsigned int delay);` - schedule the execution of the subsystem-level suspend callback for the device in future, where 'delay' is the time to wait before queuing up a suspend work item in pm_wq, in milliseconds (if 'delay' is zero, the work item is queued up immediately); returns 0 on success, 1 if the device's PM runtime status was already 'suspended', or error code if the request hasn't been scheduled (or queued up if 'delay' is 0); if the execution of ->runtime_suspend() is already scheduled and not yet expired, the new value of 'delay' will be used as the time to wait ”h]”(jM)�”}”(hŒB`int pm_schedule_suspend(struct device *dev, unsigned int delay);`”h]”jS)�”}”(hjh]”hŒ@int pm_schedule_suspend(struct device *dev, unsigned int delay);”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´Mqhj ubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hX+schedule the execution of the subsystem-level suspend callback for the device in future, where 'delay' is the time to wait before queuing up a suspend work item in pm_wq, in milliseconds (if 'delay' is zero, the work item is queued up immediately); returns 0 on success, 1 if the device's PM runtime status was already 'suspended', or error code if the request hasn't been scheduled (or queued up if 'delay' is 0); if the execution of ->runtime_suspend() is already scheduled and not yet expired, the new value of 'delay' will be used as the time to wait ”h]”h×)�”}”(hX*schedule the execution of the subsystem-level suspend callback for the device in future, where 'delay' is the time to wait before queuing up a suspend work item in pm_wq, in milliseconds (if 'delay' is zero, the work item is queued up immediately); returns 0 on success, 1 if the device's PM runtime status was already 'suspended', or error code if the request hasn't been scheduled (or queued up if 'delay' is 0); if the execution of ->runtime_suspend() is already scheduled and not yet expired, the new value of 'delay' will be used as the time to wait”h]”hXBschedule the execution of the subsystem-level suspend callback for the device in future, where ‘delay’ is the time to wait before queuing up a suspend work item in pm_wq, in milliseconds (if ‘delay’ is zero, the work item is queued up immediately); returns 0 on success, 1 if the device’s PM runtime status was already ‘suspended’, or error code if the request hasn’t been scheduled (or queued up if ‘delay’ is 0); if the execution of ->runtime_suspend() is already scheduled and not yet expired, the new value of ‘delay’ will be used as the time to wait”…”�”}”(hj.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´Mjhj*ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhj'ubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´Mjhj$ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´Mqhjc ubjG)�”}”(hX=`int pm_request_resume(struct device *dev);` - submit a request to execute the subsystem-level resume callback for the device (the request is represented by a work item in pm_wq); returns 0 on success, 1 if the device's runtime PM status was already 'active', or error code if the request hasn't been queued up ”h]”(jM)�”}”(hŒ,`int pm_request_resume(struct device *dev);`”h]”jS)�”}”(hjZh]”hŒ*int pm_request_resume(struct device *dev);”…”�”}”(hj\h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhjXubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´MwhjTubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hXsubmit a request to execute the subsystem-level resume callback for the device (the request is represented by a work item in pm_wq); returns 0 on success, 1 if the device's runtime PM status was already 'active', or error code if the request hasn't been queued up ”h]”h×)�”}”(hXsubmit a request to execute the subsystem-level resume callback for the device (the request is represented by a work item in pm_wq); returns 0 on success, 1 if the device's runtime PM status was already 'active', or error code if the request hasn't been queued up”h]”hXsubmit a request to execute the subsystem-level resume callback for the device (the request is represented by a work item in pm_wq); returns 0 on success, 1 if the device’s runtime PM status was already ‘active’, or error code if the request hasn’t been queued up”…”�”}”(hjyh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´Mthjuubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhjrubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´Mthjoubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjTubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´Mwhjc ubjG)�”}”(hŒ[`void pm_runtime_get_noresume(struct device *dev);` - increment the device's usage counter ”h]”(jM)�”}”(hŒ3`void pm_runtime_get_noresume(struct device *dev);`”h]”jS)�”}”(hj¥h]”hŒ1void pm_runtime_get_noresume(struct device *dev);”…”�”}”(hj§h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhj£ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´MzhjŸubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒ%increment the device's usage counter ”h]”h×)�”}”(hŒ$increment the device's usage counter”h]”hŒ&increment the device’s usage counter”…”�”}”(hjÄh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´MzhjÀubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhj½ubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´Mzhjºubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjŸubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´Mzhjc ubjG)�”}”(hŒ…`int pm_runtime_get(struct device *dev);` - increment the device's usage counter, run pm_request_resume(dev) and return its result ”h]”(jM)�”}”(hŒ)`int pm_runtime_get(struct device *dev);`”h]”jS)�”}”(hjðh]”hŒ'int pm_runtime_get(struct device *dev);”…”�”}”(hjòh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhjîubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´M~hjêubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒWincrement the device's usage counter, run pm_request_resume(dev) and return its result ”h]”h×)�”}”(hŒVincrement the device's usage counter, run pm_request_resume(dev) and return its result”h]”hŒXincrement the device’s usage counter, run pm_request_resume(dev) and return its result”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´M}hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhjubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´M}hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjêubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´M~hjc ubjG)�”}”(hXw`int pm_runtime_get_sync(struct device *dev);` - increment the device's usage counter, run pm_runtime_resume(dev) and return its result; note that it does not drop the device's usage counter on errors, so consider using pm_runtime_resume_and_get() instead of it, especially if its return value is checked by the caller, as this is likely to result in cleaner code. ”h]”(jM)�”}”(hŒ.`int pm_runtime_get_sync(struct device *dev);`”h]”jS)�”}”(hj;h]”hŒ,int pm_runtime_get_sync(struct device *dev);”…”�”}”(hj=h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhj9ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´M†hj5ubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hX<increment the device's usage counter, run pm_runtime_resume(dev) and return its result; note that it does not drop the device's usage counter on errors, so consider using pm_runtime_resume_and_get() instead of it, especially if its return value is checked by the caller, as this is likely to result in cleaner code. ”h]”h×)�”}”(hX;increment the device's usage counter, run pm_runtime_resume(dev) and return its result; note that it does not drop the device's usage counter on errors, so consider using pm_runtime_resume_and_get() instead of it, especially if its return value is checked by the caller, as this is likely to result in cleaner code.”h]”hX?increment the device’s usage counter, run pm_runtime_resume(dev) and return its result; note that it does not drop the device’s usage counter on errors, so consider using pm_runtime_resume_and_get() instead of it, especially if its return value is checked by the caller, as this is likely to result in cleaner code.”…”�”}”(hjZh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´M�hjVubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhjSubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´M�hjPubah}”(h]”h ]”h"]”h$]”h&]”uh1jghj5ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´M†hjc ubjG)�”}”(hX#`int pm_runtime_get_if_in_use(struct device *dev);` - return -EINVAL if 'power.disable_depth' is nonzero; otherwise, if the runtime PM status is RPM_ACTIVE and the runtime PM usage counter is nonzero, increment the counter and return 1; otherwise return 0 without changing the counter ”h]”(jM)�”}”(hŒ3`int pm_runtime_get_if_in_use(struct device *dev);`”h]”jS)�”}”(hj†h]”hŒ1int pm_runtime_get_if_in_use(struct device *dev);”…”�”}”(hjˆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhj„ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´MŒhj€ubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒçreturn -EINVAL if 'power.disable_depth' is nonzero; otherwise, if the runtime PM status is RPM_ACTIVE and the runtime PM usage counter is nonzero, increment the counter and return 1; otherwise return 0 without changing the counter ”h]”h×)�”}”(hŒæreturn -EINVAL if 'power.disable_depth' is nonzero; otherwise, if the runtime PM status is RPM_ACTIVE and the runtime PM usage counter is nonzero, increment the counter and return 1; otherwise return 0 without changing the counter”h]”hŒêreturn -EINVAL if ‘power.disable_depth’ is nonzero; otherwise, if the runtime PM status is RPM_ACTIVE and the runtime PM usage counter is nonzero, increment the counter and return 1; otherwise return 0 without changing the counter”…”�”}”(hj¥h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´M‰hj¡ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhjžubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´M‰hj›ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghj€ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´MŒhjc ubjG)�”}”(hŒõ`int pm_runtime_get_if_active(struct device *dev);` - return -EINVAL if 'power.disable_depth' is nonzero; otherwise, if the runtime PM status is RPM_ACTIVE, increment the counter and return 1; otherwise return 0 without changing the counter ”h]”(jM)�”}”(hŒ3`int pm_runtime_get_if_active(struct device *dev);`”h]”jS)�”}”(hjÑh]”hŒ1int pm_runtime_get_if_active(struct device *dev);”…”�”}”(hjÓh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhjÏubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´M‘hjËubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒ»return -EINVAL if 'power.disable_depth' is nonzero; otherwise, if the runtime PM status is RPM_ACTIVE, increment the counter and return 1; otherwise return 0 without changing the counter ”h]”h×)�”}”(hŒºreturn -EINVAL if 'power.disable_depth' is nonzero; otherwise, if the runtime PM status is RPM_ACTIVE, increment the counter and return 1; otherwise return 0 without changing the counter”h]”hŒ¾return -EINVAL if ‘power.disable_depth’ is nonzero; otherwise, if the runtime PM status is RPM_ACTIVE, increment the counter and return 1; otherwise return 0 without changing the counter”…”�”}”(hjðh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´M�hjìubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhjéubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´M�hjæubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjËubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´M‘hjc ubjG)�”}”(hŒY`void pm_runtime_put_noidle(struct device *dev);` - decrement the device's usage counter ”h]”(jM)�”}”(hŒ1`void pm_runtime_put_noidle(struct device *dev);`”h]”jS)�”}”(hjh]”hŒ/void pm_runtime_put_noidle(struct device *dev);”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´M”hjubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒ%decrement the device's usage counter ”h]”h×)�”}”(hŒ$decrement the device's usage counter”h]”hŒ&decrement the device’s usage counter”…”�”}”(hj;h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´M”hj7ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhj4ubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´M”hj1ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´M”hjc ubjG)�”}”(hŒ›`int pm_runtime_put(struct device *dev);` - decrement the device's usage counter; if the result is 0 then run pm_request_idle(dev) and return its result ”h]”(jM)�”}”(hŒ)`int pm_runtime_put(struct device *dev);`”h]”jS)�”}”(hjgh]”hŒ'int pm_runtime_put(struct device *dev);”…”�”}”(hjih²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhjeubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´M˜hjaubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒmdecrement the device's usage counter; if the result is 0 then run pm_request_idle(dev) and return its result ”h]”h×)�”}”(hŒldecrement the device's usage counter; if the result is 0 then run pm_request_idle(dev) and return its result”h]”hŒndecrement the device’s usage counter; if the result is 0 then run pm_request_idle(dev) and return its result”…”�”}”(hj†h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´M—hj‚ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhjubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´M—hj|ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjaubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´M˜hjc ubjG)�”}”(hŒæ`int pm_runtime_put_autosuspend(struct device *dev);` - set the power.last_busy field to the current time and decrement the device's usage counter; if the result is 0 then run pm_request_autosuspend(dev) and return its result ”h]”(jM)�”}”(hŒ5`int pm_runtime_put_autosuspend(struct device *dev);`”h]”jS)�”}”(hj²h]”hŒ3int pm_runtime_put_autosuspend(struct device *dev);”…”�”}”(hj´h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhj°ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´M�hj¬ubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒªset the power.last_busy field to the current time and decrement the device's usage counter; if the result is 0 then run pm_request_autosuspend(dev) and return its result ”h]”h×)�”}”(hŒ©set the power.last_busy field to the current time and decrement the device's usage counter; if the result is 0 then run pm_request_autosuspend(dev) and return its result”h]”hŒ«set the power.last_busy field to the current time and decrement the device’s usage counter; if the result is 0 then run pm_request_autosuspend(dev) and return its result”…”�”}”(hjÑh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´M›hjÍubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhjÊubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´M›hjÇubah}”(h]”h ]”h"]”h$]”h&]”uh1jghj¬ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´M�hjc ubjG)�”}”(hŒ°`int __pm_runtime_put_autosuspend(struct device *dev);` - decrement the device's usage counter; if the result is 0 then run pm_request_autosuspend(dev) and return its result ”h]”(jM)�”}”(hŒ7`int __pm_runtime_put_autosuspend(struct device *dev);`”h]”jS)�”}”(hjýh]”hŒ5int __pm_runtime_put_autosuspend(struct device *dev);”…”�”}”(hjÿh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhjûubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´M¡hj÷ubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒtdecrement the device's usage counter; if the result is 0 then run pm_request_autosuspend(dev) and return its result ”h]”h×)�”}”(hŒsdecrement the device's usage counter; if the result is 0 then run pm_request_autosuspend(dev) and return its result”h]”hŒudecrement the device’s usage counter; if the result is 0 then run pm_request_autosuspend(dev) and return its result”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´M hjubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhjubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´M hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jghj÷ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´M¡hjc ubjG)�”}”(hŒ `int pm_runtime_put_sync(struct device *dev);` - decrement the device's usage counter; if the result is 0 then run pm_runtime_idle(dev) and return its result ”h]”(jM)�”}”(hŒ.`int pm_runtime_put_sync(struct device *dev);`”h]”jS)�”}”(hjHh]”hŒ,int pm_runtime_put_sync(struct device *dev);”…”�”}”(hjJh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhjFubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´M¥hjBubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒmdecrement the device's usage counter; if the result is 0 then run pm_runtime_idle(dev) and return its result ”h]”h×)�”}”(hŒldecrement the device's usage counter; if the result is 0 then run pm_runtime_idle(dev) and return its result”h]”hŒndecrement the device’s usage counter; if the result is 0 then run pm_runtime_idle(dev) and return its result”…”�”}”(hjgh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´M¤hjcubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhj`ubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´M¤hj]ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjBubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´M¥hjc ubjG)�”}”(hŒ«`int pm_runtime_put_sync_suspend(struct device *dev);` - decrement the device's usage counter; if the result is 0 then run pm_runtime_suspend(dev) and return its result ”h]”(jM)�”}”(hŒ6`int pm_runtime_put_sync_suspend(struct device *dev);`”h]”jS)�”}”(hj“h]”hŒ4int pm_runtime_put_sync_suspend(struct device *dev);”…”�”}”(hj•h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhj‘ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´M©hj�ubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒpdecrement the device's usage counter; if the result is 0 then run pm_runtime_suspend(dev) and return its result ”h]”h×)�”}”(hŒodecrement the device's usage counter; if the result is 0 then run pm_runtime_suspend(dev) and return its result”h]”hŒqdecrement the device’s usage counter; if the result is 0 then run pm_runtime_suspend(dev) and return its result”…”�”}”(hj²h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´M¨hj®ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhj«ubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´M¨hj¨ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghj�ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´M©hjc ubjG)�”}”(hŒë`int pm_runtime_put_sync_autosuspend(struct device *dev);` - set the power.last_busy field to the current time and decrement the device's usage counter; if the result is 0 then run pm_runtime_autosuspend(dev) and return its result ”h]”(jM)�”}”(hŒ:`int pm_runtime_put_sync_autosuspend(struct device *dev);`”h]”jS)�”}”(hjÞh]”hŒ8int pm_runtime_put_sync_autosuspend(struct device *dev);”…”�”}”(hjàh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhjÜubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´M®hjØubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒªset the power.last_busy field to the current time and decrement the device's usage counter; if the result is 0 then run pm_runtime_autosuspend(dev) and return its result ”h]”h×)�”}”(hŒ©set the power.last_busy field to the current time and decrement the device's usage counter; if the result is 0 then run pm_runtime_autosuspend(dev) and return its result”h]”hŒ«set the power.last_busy field to the current time and decrement the device’s usage counter; if the result is 0 then run pm_runtime_autosuspend(dev) and return its result”…”�”}”(hjýh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´M¬hjùubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhjöubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´M¬hjóubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjØubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´M®hjc ubjG)�”}”(hŒô`void pm_runtime_enable(struct device *dev);` - decrement the device's 'power.disable_depth' field; if that field is equal to zero, the runtime PM helper functions can execute subsystem-level callbacks described in Section 2 for the device ”h]”(jM)�”}”(hŒ-`void pm_runtime_enable(struct device *dev);`”h]”jS)�”}”(hj)h]”hŒ+void pm_runtime_enable(struct device *dev);”…”�”}”(hj+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhj'ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´M³hj#ubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒÀdecrement the device's 'power.disable_depth' field; if that field is equal to zero, the runtime PM helper functions can execute subsystem-level callbacks described in Section 2 for the device ”h]”h×)�”}”(hŒ¿decrement the device's 'power.disable_depth' field; if that field is equal to zero, the runtime PM helper functions can execute subsystem-level callbacks described in Section 2 for the device”h]”hŒÅdecrement the device’s ‘power.disable_depth’ field; if that field is equal to zero, the runtime PM helper functions can execute subsystem-level callbacks described in Section 2 for the device”…”�”}”(hjHh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´M±hjDubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhjAubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´M±hj>ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghj#ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´M³hjc ubjG)�”}”(hX`int pm_runtime_disable(struct device *dev);` - increment the device's 'power.disable_depth' field (if the value of that field was previously zero, this prevents subsystem-level runtime PM callbacks from being run for the device), make sure that all of the pending runtime PM operations on the device are either completed or canceled; returns 1 if there was a resume request pending and it was necessary to execute the subsystem-level resume callback for the device to satisfy that request, otherwise 0 is returned ”h]”(jM)�”}”(hŒ-`int pm_runtime_disable(struct device *dev);`”h]”jS)�”}”(hjth]”hŒ+int pm_runtime_disable(struct device *dev);”…”�”}”(hjvh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhjrubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´M¼hjnubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hXÓincrement the device's 'power.disable_depth' field (if the value of that field was previously zero, this prevents subsystem-level runtime PM callbacks from being run for the device), make sure that all of the pending runtime PM operations on the device are either completed or canceled; returns 1 if there was a resume request pending and it was necessary to execute the subsystem-level resume callback for the device to satisfy that request, otherwise 0 is returned ”h]”h×)�”}”(hXÒincrement the device's 'power.disable_depth' field (if the value of that field was previously zero, this prevents subsystem-level runtime PM callbacks from being run for the device), make sure that all of the pending runtime PM operations on the device are either completed or canceled; returns 1 if there was a resume request pending and it was necessary to execute the subsystem-level resume callback for the device to satisfy that request, otherwise 0 is returned”h]”hXØincrement the device’s ‘power.disable_depth’ field (if the value of that field was previously zero, this prevents subsystem-level runtime PM callbacks from being run for the device), make sure that all of the pending runtime PM operations on the device are either completed or canceled; returns 1 if there was a resume request pending and it was necessary to execute the subsystem-level resume callback for the device to satisfy that request, otherwise 0 is returned”…”�”}”(hj“h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´M¶hj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhjŒubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´M¶hj‰ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjnubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´M¼hjc ubjG)�”}”(hX`void pm_runtime_barrier(struct device *dev);` - check if there's a resume request pending for the device and resume it (synchronously) in that case, cancel any other pending runtime PM requests regarding it and wait for all runtime PM operations on it in progress to complete ”h]”(jM)�”}”(hŒ.`void pm_runtime_barrier(struct device *dev);`”h]”jS)�”}”(hj¿h]”hŒ,void pm_runtime_barrier(struct device *dev);”…”�”}”(hjÁh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhj½ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´MÂhj¹ubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒächeck if there's a resume request pending for the device and resume it (synchronously) in that case, cancel any other pending runtime PM requests regarding it and wait for all runtime PM operations on it in progress to complete ”h]”h×)�”}”(hŒãcheck if there's a resume request pending for the device and resume it (synchronously) in that case, cancel any other pending runtime PM requests regarding it and wait for all runtime PM operations on it in progress to complete”h]”hŒåcheck if there’s a resume request pending for the device and resume it (synchronously) in that case, cancel any other pending runtime PM requests regarding it and wait for all runtime PM operations on it in progress to complete”…”�”}”(hjÞh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´M¿hjÚubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhj×ubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´M¿hjÔubah}”(h]”h ]”h"]”h$]”h&]”uh1jghj¹ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´MÂhjc ubjG)�”}”(hŒ}`void pm_suspend_ignore_children(struct device *dev, bool enable);` - set/unset the power.ignore_children flag of the device ”h]”(jM)�”}”(hŒC`void pm_suspend_ignore_children(struct device *dev, bool enable);`”h]”jS)�”}”(hj h]”hŒAvoid pm_suspend_ignore_children(struct device *dev, bool enable);”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´MÅhjubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒ7set/unset the power.ignore_children flag of the device ”h]”h×)�”}”(hŒ6set/unset the power.ignore_children flag of the device”h]”hŒ6set/unset the power.ignore_children flag of the device”…”�”}”(hj)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´MÅhj%ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhj"ubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´MÅhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´MÅhjc ubjG)�”}”(hXß`int pm_runtime_set_active(struct device *dev);` - clear the device's 'power.runtime_error' flag, set the device's runtime PM status to 'active' and update its parent's counter of 'active' children as appropriate (it is only valid to use this function if 'power.runtime_error' is set or 'power.disable_depth' is greater than zero); it will fail and return error code if the device has a parent which is not active and the 'power.ignore_children' flag of which is unset ”h]”(jM)�”}”(hŒ0`int pm_runtime_set_active(struct device *dev);`”h]”jS)�”}”(hjUh]”hŒ.int pm_runtime_set_active(struct device *dev);”…”�”}”(hjWh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhjSubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´MÍhjOubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hX¢clear the device's 'power.runtime_error' flag, set the device's runtime PM status to 'active' and update its parent's counter of 'active' children as appropriate (it is only valid to use this function if 'power.runtime_error' is set or 'power.disable_depth' is greater than zero); it will fail and return error code if the device has a parent which is not active and the 'power.ignore_children' flag of which is unset ”h]”h×)�”}”(hX¡clear the device's 'power.runtime_error' flag, set the device's runtime PM status to 'active' and update its parent's counter of 'active' children as appropriate (it is only valid to use this function if 'power.runtime_error' is set or 'power.disable_depth' is greater than zero); it will fail and return error code if the device has a parent which is not active and the 'power.ignore_children' flag of which is unset”h]”hX¿clear the device’s ‘power.runtime_error’ flag, set the device’s runtime PM status to ‘active’ and update its parent’s counter of ‘active’ children as appropriate (it is only valid to use this function if ‘power.runtime_error’ is set or ‘power.disable_depth’ is greater than zero); it will fail and return error code if the device has a parent which is not active and the ‘power.ignore_children’ flag of which is unset”…”�”}”(hjth²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´MÈhjpubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhjmubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´MÈhjjubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjOubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´MÍhjc ubjG)�”}”(hXZ`void pm_runtime_set_suspended(struct device *dev);` - clear the device's 'power.runtime_error' flag, set the device's runtime PM status to 'suspended' and update its parent's counter of 'active' children as appropriate (it is only valid to use this function if 'power.runtime_error' is set or 'power.disable_depth' is greater than zero) ”h]”(jM)�”}”(hŒ4`void pm_runtime_set_suspended(struct device *dev);`”h]”jS)�”}”(hj h]”hŒ2void pm_runtime_set_suspended(struct device *dev);”…”�”}”(hj¢h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhjžubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´MÔhjšubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hXclear the device's 'power.runtime_error' flag, set the device's runtime PM status to 'suspended' and update its parent's counter of 'active' children as appropriate (it is only valid to use this function if 'power.runtime_error' is set or 'power.disable_depth' is greater than zero) ”h]”h×)�”}”(hXclear the device's 'power.runtime_error' flag, set the device's runtime PM status to 'suspended' and update its parent's counter of 'active' children as appropriate (it is only valid to use this function if 'power.runtime_error' is set or 'power.disable_depth' is greater than zero)”h]”hX4clear the device’s ‘power.runtime_error’ flag, set the device’s runtime PM status to ‘suspended’ and update its parent’s counter of ‘active’ children as appropriate (it is only valid to use this function if ‘power.runtime_error’ is set or ‘power.disable_depth’ is greater than zero)”…”�”}”(hj¿h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´MÐhj»ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhj¸ubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´MÐhjµubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjšubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´MÔhjc ubjG)�”}”(hŒ¸`bool pm_runtime_active(struct device *dev);` - return true if the device's runtime PM status is 'active' or its 'power.disable_depth' field is not equal to zero, or false otherwise ”h]”(jM)�”}”(hŒ-`bool pm_runtime_active(struct device *dev);`”h]”jS)�”}”(hjëh]”hŒ+bool pm_runtime_active(struct device *dev);”…”�”}”(hjíh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhjéubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´MØhjåubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒ†return true if the device's runtime PM status is 'active' or its 'power.disable_depth' field is not equal to zero, or false otherwise ”h]”h×)�”}”(hŒ…return true if the device's runtime PM status is 'active' or its 'power.disable_depth' field is not equal to zero, or false otherwise”h]”hŒ�return true if the device’s runtime PM status is ‘active’ or its ‘power.disable_depth’ field is not equal to zero, or false otherwise”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´M×hjubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhjubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´M×hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjåubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´MØhjc ubjG)�”}”(hŒ»`bool pm_runtime_suspended(struct device *dev);` - return true if the device's runtime PM status is 'suspended' and its 'power.disable_depth' field is equal to zero, or false otherwise ”h]”(jM)�”}”(hŒ0`bool pm_runtime_suspended(struct device *dev);`”h]”jS)�”}”(hj6h]”hŒ.bool pm_runtime_suspended(struct device *dev);”…”�”}”(hj8h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhj4ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´MÜhj0ubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒ†return true if the device's runtime PM status is 'suspended' and its 'power.disable_depth' field is equal to zero, or false otherwise ”h]”h×)�”}”(hŒ…return true if the device's runtime PM status is 'suspended' and its 'power.disable_depth' field is equal to zero, or false otherwise”h]”hŒ�return true if the device’s runtime PM status is ‘suspended’ and its ‘power.disable_depth’ field is equal to zero, or false otherwise”…”�”}”(hjUh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´MÛhjQubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhjNubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´MÛhjKubah}”(h]”h ]”h"]”h$]”h&]”uh1jghj0ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´MÜhjc ubjG)�”}”(hŒw`bool pm_runtime_status_suspended(struct device *dev);` - return true if the device's runtime PM status is 'suspended' ”h]”(jM)�”}”(hŒ7`bool pm_runtime_status_suspended(struct device *dev);`”h]”jS)�”}”(hj�h]”hŒ5bool pm_runtime_status_suspended(struct device *dev);”…”�”}”(hjƒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´Mßhj{ubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒ=return true if the device's runtime PM status is 'suspended' ”h]”h×)�”}”(hŒprobe() callback will likely need to wake it up using one of the PM core's helper functions described in Section 4. In that case, pm_runtime_resume() should be used. Of course, for this purpose the device's runtime PM has to be enabled earlier by calling pm_runtime_enable().”h]”hXµIf the default initial runtime PM status of the device (i.e. ‘suspended’) reflects the actual state of the device, its bus type’s or its driver’s ->probe() callback will likely need to wake it up using one of the PM core’s helper functions described in Section 4. In that case, pm_runtime_resume() should be used. Of course, for this purpose the device’s runtime PM has to be enabled earlier by calling pm_runtime_enable().”…”�”}”(hjÜh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´MEhj¡h²hubh×)�”}”(hXfNote, if the device may execute pm_runtime calls during the probe (such as if it is registered with a subsystem that may call back in) then the pm_runtime_get_sync() call paired with a pm_runtime_put() call will be appropriate to ensure that the device is not put back to sleep during the probe. This can happen with systems such as the network device layer.”h]”hXfNote, if the device may execute pm_runtime calls during the probe (such as if it is registered with a subsystem that may call back in) then the pm_runtime_get_sync() call paired with a pm_runtime_put() call will be appropriate to ensure that the device is not put back to sleep during the probe. This can happen with systems such as the network device layer.”…”�”}”(hjêh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´MLhj¡h²hubh×)�”}”(hXiIt may be desirable to suspend the device once ->probe() has finished. Therefore the driver core uses the asynchronous pm_request_idle() to submit a request to execute the subsystem-level idle callback for the device at that time. A driver that makes use of the runtime autosuspend feature may want to update the last busy mark before returning from ->probe().”h]”hXiIt may be desirable to suspend the device once ->probe() has finished. Therefore the driver core uses the asynchronous pm_request_idle() to submit a request to execute the subsystem-level idle callback for the device at that time. A driver that makes use of the runtime autosuspend feature may want to update the last busy mark before returning from ->probe().”…”�”}”(hjøh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´MRhj¡h²hubh×)�”}”(hX Moreover, the driver core prevents runtime PM callbacks from racing with the bus notifier callback in __device_release_driver(), which is necessary because the notifier is used by some subsystems to carry out operations affecting the runtime PM functionality. It does so by calling pm_runtime_get_sync() before driver_sysfs_remove() and the BUS_NOTIFY_UNBIND_DRIVER notifications. This resumes the device if it's in the suspended state and prevents it from being suspended again while those routines are being executed.”h]”hX Moreover, the driver core prevents runtime PM callbacks from racing with the bus notifier callback in __device_release_driver(), which is necessary because the notifier is used by some subsystems to carry out operations affecting the runtime PM functionality. It does so by calling pm_runtime_get_sync() before driver_sysfs_remove() and the BUS_NOTIFY_UNBIND_DRIVER notifications. This resumes the device if it’s in the suspended state and prevents it from being suspended again while those routines are being executed.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´MXhj¡h²hubh×)�”}”(hXÞTo allow bus types and drivers to put devices into the suspended state by calling pm_runtime_suspend() from their ->remove() routines, the driver core executes pm_runtime_put_sync() after running the BUS_NOTIFY_UNBIND_DRIVER notifications in __device_release_driver(). This requires bus types and drivers to make their ->remove() callbacks avoid races with runtime PM directly, but it also allows more flexibility in the handling of devices during the removal of their drivers.”h]”hXÞTo allow bus types and drivers to put devices into the suspended state by calling pm_runtime_suspend() from their ->remove() routines, the driver core executes pm_runtime_put_sync() after running the BUS_NOTIFY_UNBIND_DRIVER notifications in __device_release_driver(). This requires bus types and drivers to make their ->remove() callbacks avoid races with runtime PM directly, but it also allows more flexibility in the handling of devices during the removal of their drivers.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´M`hj¡h²hubh×)�”}”(hŒ¬Drivers in ->remove() callback should undo the runtime PM changes done in ->probe(). Usually this means calling pm_runtime_disable(), pm_runtime_dont_use_autosuspend() etc.”h]”hŒ¬Drivers in ->remove() callback should undo the runtime PM changes done in ->probe(). Usually this means calling pm_runtime_disable(), pm_runtime_dont_use_autosuspend() etc.”…”�”}”(hj"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´Mhhj¡h²hubh×)�”}”(hXThe user space can effectively disallow the driver of the device to power manage it at run time by changing the value of its /sys/devices/.../power/control attribute to "on", which causes pm_runtime_forbid() to be called. In principle, this mechanism may also be used by the driver to effectively turn off the runtime power management of the device until the user space turns it on. Namely, during the initialization the driver can make sure that the runtime PM status of the device is 'active' and call pm_runtime_forbid(). It should be noted, however, that if the user space has already intentionally changed the value of /sys/devices/.../power/control to "auto" to allow the driver to power manage the device at run time, the driver may confuse it by using pm_runtime_forbid() this way.”h]”hX#The user space can effectively disallow the driver of the device to power manage it at run time by changing the value of its /sys/devices/.../power/control attribute to “onâ€�, which causes pm_runtime_forbid() to be called. In principle, this mechanism may also be used by the driver to effectively turn off the runtime power management of the device until the user space turns it on. Namely, during the initialization the driver can make sure that the runtime PM status of the device is ‘active’ and call pm_runtime_forbid(). It should be noted, however, that if the user space has already intentionally changed the value of /sys/devices/.../power/control to “autoâ€� to allow the driver to power manage the device at run time, the driver may confuse it by using pm_runtime_forbid() this way.”…”�”}”(hj0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´Mlhj¡h²hubeh}”(h]”Œ4runtime-pm-initialization-device-probing-and-removal”ah ]”h"]”Œ85. runtime pm initialization, device probing and removal”ah$]”h&]”uh1hµhh·h²hh³hÊh´M-ubh¶)�”}”(hhh]”(h»)�”}”(hŒ6. Runtime PM and System Sleep”h]”hŒ6. Runtime PM and System Sleep”…”�”}”(hjIh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjFh²hh³hÊh´Myubh×)�”}”(hX0Runtime PM and system sleep (i.e., system suspend and hibernation, also known as suspend-to-RAM and suspend-to-disk) interact with each other in a couple of ways. If a device is active when a system sleep starts, everything is straightforward. But what should happen if the device is already suspended?”h]”hX0Runtime PM and system sleep (i.e., system suspend and hibernation, also known as suspend-to-RAM and suspend-to-disk) interact with each other in a couple of ways. If a device is active when a system sleep starts, everything is straightforward. But what should happen if the device is already suspended?”…”�”}”(hjWh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´M{hjFh²hubh×)�”}”(hXZThe device may have different wake-up settings for runtime PM and system sleep. For example, remote wake-up may be enabled for runtime suspend but disallowed for system sleep (device_may_wakeup(dev) returns 'false'). When this happens, the subsystem-level system suspend callback is responsible for changing the device's wake-up setting (it may leave that to the device driver's system suspend routine). It may be necessary to resume the device and suspend it again in order to do so. The same is true if the driver uses different power levels or other settings for runtime suspend and system sleep.”h]”hXbThe device may have different wake-up settings for runtime PM and system sleep. For example, remote wake-up may be enabled for runtime suspend but disallowed for system sleep (device_may_wakeup(dev) returns ‘false’). When this happens, the subsystem-level system suspend callback is responsible for changing the device’s wake-up setting (it may leave that to the device driver’s system suspend routine). It may be necessary to resume the device and suspend it again in order to do so. The same is true if the driver uses different power levels or other settings for runtime suspend and system sleep.”…”�”}”(hjeh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´M€hjFh²hubh×)�”}”(hŒÈDuring system resume, the simplest approach is to bring all devices back to full power, even if they had been suspended before the system suspend began. There are several reasons for this, including:”h]”hŒÈDuring system resume, the simplest approach is to bring all devices back to full power, even if they had been suspended before the system suspend began. There are several reasons for this, including:”…”�”}”(hjsh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´M‰hjFh²hubj[)�”}”(hX-* The device might need to switch power levels, wake-up settings, etc. * Remote wake-up events might have been lost by the firmware. * The device's children may need the device to be at full power in order to resume themselves. * The driver's idea of the device state may not agree with the device's physical state. This can happen during resume from hibernation. * The device might need to be reset. * Even though the device was suspended, if its usage counter was > 0 then most likely it would need a runtime resume in the near future anyway. ”h]”j™)�”}”(hhh]”(hÑ)�”}”(hŒEThe device might need to switch power levels, wake-up settings, etc. ”h]”h×)�”}”(hŒDThe device might need to switch power levels, wake-up settings, etc.”h]”hŒDThe device might need to switch power levels, wake-up settings, etc.”…”�”}”(hjŒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´M�hjˆubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhj…ubhÑ)�”}”(hŒ 0 then most likely it would need a runtime resume in the near future anyway. ”h]”h×)�”}”(hŒ�Even though the device was suspended, if its usage counter was > 0 then most likely it would need a runtime resume in the near future anyway.”h]”hŒ�Even though the device was suspended, if its usage counter was > 0 then most likely it would need a runtime resume in the near future anyway.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´M™hjubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhj…ubeh}”(h]”h ]”h"]”h$]”h&]”jjuh1j˜h³hÊh´M�hj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1jZh³hÊh´M�hjFh²hubh×)�”}”(hŒîIf the device had been suspended before the system suspend began and it's brought back to full power during resume, then its runtime PM status will have to be updated to reflect the actual post-system sleep status. The way to do this is:”h]”hŒðIf the device had been suspended before the system suspend began and it’s brought back to full power during resume, then its runtime PM status will have to be updated to reflect the actual post-system sleep status. The way to do this is:”…”�”}”(hj$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´MœhjFh²hubj[)�”}”(hŒS- pm_runtime_disable(dev); - pm_runtime_set_active(dev); - pm_runtime_enable(dev); ”h]”j™)�”}”(hhh]”(hÑ)�”}”(hŒpm_runtime_disable(dev);”h]”h×)�”}”(hj;h]”hŒpm_runtime_disable(dev);”…”�”}”(hj=h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´M¡hj9ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhj6ubhÑ)�”}”(hŒpm_runtime_set_active(dev);”h]”h×)�”}”(hjRh]”hŒpm_runtime_set_active(dev);”…”�”}”(hjTh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´M¢hjPubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhj6ubhÑ)�”}”(hŒpm_runtime_enable(dev); ”h]”h×)�”}”(hŒpm_runtime_enable(dev);”h]”hŒpm_runtime_enable(dev);”…”�”}”(hjkh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´M£hjgubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhj6ubeh}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´M¡hj2ubah}”(h]”h ]”h"]”h$]”h&]”uh1jZh³hÊh´M¡hjFh²hubh×)�”}”(hX—The PM core always increments the runtime usage counter before calling the ->suspend() callback and decrements it after calling the ->resume() callback. Hence disabling runtime PM temporarily like this will not cause any runtime suspend attempts to be permanently lost. If the usage count goes to zero following the return of the ->resume() callback, the ->runtime_idle() callback will be invoked as usual.”h]”hX—The PM core always increments the runtime usage counter before calling the ->suspend() callback and decrements it after calling the ->resume() callback. Hence disabling runtime PM temporarily like this will not cause any runtime suspend attempts to be permanently lost. If the usage count goes to zero following the return of the ->resume() callback, the ->runtime_idle() callback will be invoked as usual.”…”�”}”(hj‹h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´M¥hjFh²hubh×)�”}”(hX8On some systems, however, system sleep is not entered through a global firmware or hardware operation. Instead, all hardware components are put into low-power states directly by the kernel in a coordinated way. Then, the system sleep state effectively follows from the states the hardware components end up in and the system is woken up from that state by a hardware interrupt or a similar mechanism entirely under the kernel's control. As a result, the kernel never gives control away and the states of all devices during resume are precisely known to it. If that is the case and none of the situations listed above takes place (in particular, if the system is not waking up from hibernation), it may be more efficient to leave the devices that had been suspended before the system suspend began in the suspended state.”h]”hX:On some systems, however, system sleep is not entered through a global firmware or hardware operation. Instead, all hardware components are put into low-power states directly by the kernel in a coordinated way. Then, the system sleep state effectively follows from the states the hardware components end up in and the system is woken up from that state by a hardware interrupt or a similar mechanism entirely under the kernel’s control. As a result, the kernel never gives control away and the states of all devices during resume are precisely known to it. If that is the case and none of the situations listed above takes place (in particular, if the system is not waking up from hibernation), it may be more efficient to leave the devices that had been suspended before the system suspend began in the suspended state.”…”�”}”(hj™h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´M¬hjFh²hubh×)�”}”(hXTo this end, the PM core provides a mechanism allowing some coordination between different levels of device hierarchy. Namely, if a system suspend .prepare() callback returns a positive number for a device, that indicates to the PM core that the device appears to be runtime-suspended and its state is fine, so it may be left in runtime suspend provided that all of its descendants are also left in runtime suspend. If that happens, the PM core will not execute any system suspend and resume callbacks for all of those devices, except for the .complete() callback, which is then entirely responsible for handling the device as appropriate. This only applies to system suspend transitions that are not related to hibernation (see Documentation/driver-api/pm/devices.rst for more information).”h]”hXTo this end, the PM core provides a mechanism allowing some coordination between different levels of device hierarchy. Namely, if a system suspend .prepare() callback returns a positive number for a device, that indicates to the PM core that the device appears to be runtime-suspended and its state is fine, so it may be left in runtime suspend provided that all of its descendants are also left in runtime suspend. If that happens, the PM core will not execute any system suspend and resume callbacks for all of those devices, except for the .complete() callback, which is then entirely responsible for handling the device as appropriate. This only applies to system suspend transitions that are not related to hibernation (see Documentation/driver-api/pm/devices.rst for more information).”…”�”}”(hj§h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´M¸hjFh²hubh×)�”}”(hŒ½The PM core does its best to reduce the probability of race conditions between the runtime PM and system suspend/resume (and hibernation) callbacks by carrying out the following operations:”h]”hŒ½The PM core does its best to reduce the probability of race conditions between the runtime PM and system suspend/resume (and hibernation) callbacks by carrying out the following operations:”…”�”}”(hjµh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´MÄhjFh²hubj[)�”}”(hXª* During system suspend pm_runtime_get_noresume() is called for every device right before executing the subsystem-level .prepare() callback for it and pm_runtime_barrier() is called for every device right before executing the subsystem-level .suspend() callback for it. In addition to that, the PM core disables runtime PM for every device right before executing the subsystem-level .suspend_late() callback for it. * During system resume pm_runtime_enable() and pm_runtime_put() are called for every device right after executing the subsystem-level .resume_early() callback and right after executing the subsystem-level .complete() callback for it, respectively. ”h]”j™)�”}”(hhh]”(hÑ)�”}”(hXŸDuring system suspend pm_runtime_get_noresume() is called for every device right before executing the subsystem-level .prepare() callback for it and pm_runtime_barrier() is called for every device right before executing the subsystem-level .suspend() callback for it. In addition to that, the PM core disables runtime PM for every device right before executing the subsystem-level .suspend_late() callback for it. ”h]”h×)�”}”(hXžDuring system suspend pm_runtime_get_noresume() is called for every device right before executing the subsystem-level .prepare() callback for it and pm_runtime_barrier() is called for every device right before executing the subsystem-level .suspend() callback for it. In addition to that, the PM core disables runtime PM for every device right before executing the subsystem-level .suspend_late() callback for it.”h]”hXžDuring system suspend pm_runtime_get_noresume() is called for every device right before executing the subsystem-level .prepare() callback for it and pm_runtime_barrier() is called for every device right before executing the subsystem-level .suspend() callback for it. In addition to that, the PM core disables runtime PM for every device right before executing the subsystem-level .suspend_late() callback for it.”…”�”}”(hjÎh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´MÈhjÊubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhjÇubhÑ)�”}”(hŒöDuring system resume pm_runtime_enable() and pm_runtime_put() are called for every device right after executing the subsystem-level .resume_early() callback and right after executing the subsystem-level .complete() callback for it, respectively. ”h]”h×)�”}”(hŒõDuring system resume pm_runtime_enable() and pm_runtime_put() are called for every device right after executing the subsystem-level .resume_early() callback and right after executing the subsystem-level .complete() callback for it, respectively.”h]”hŒõDuring system resume pm_runtime_enable() and pm_runtime_put() are called for every device right after executing the subsystem-level .resume_early() callback and right after executing the subsystem-level .complete() callback for it, respectively.”…”�”}”(hjæh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´MÏhjâubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhjÇubeh}”(h]”h ]”h"]”h$]”h&]”jjuh1j˜h³hÊh´MÈhjÃubah}”(h]”h ]”h"]”h$]”h&]”uh1jZh³hÊh´MÈhjFh²hubeh}”(h]”Œruntime-pm-and-system-sleep”ah ]”h"]”Œ6. runtime pm and system sleep”ah$]”h&]”uh1hµhh·h²hh³hÊh´Myubh¶)�”}”(hhh]”(h»)�”}”(hŒ7. Generic subsystem callbacks”h]”hŒ7. Generic subsystem callbacks”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjh²hh³hÊh´MÕubh×)�”}”(hŒ¦Subsystems may wish to conserve code space by using the set of generic power management callbacks provided by the PM core, defined in driver/base/power/generic_ops.c:”h]”hŒ¦Subsystems may wish to conserve code space by using the set of generic power management callbacks provided by the PM core, defined in driver/base/power/generic_ops.c:”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´M×hjh²hubj[)�”}”(hXæ `int pm_generic_runtime_suspend(struct device *dev);` - invoke the ->runtime_suspend() callback provided by the driver of this device and return its result, or return 0 if not defined `int pm_generic_runtime_resume(struct device *dev);` - invoke the ->runtime_resume() callback provided by the driver of this device and return its result, or return 0 if not defined `int pm_generic_suspend(struct device *dev);` - if the device has not been suspended at run time, invoke the ->suspend() callback provided by its driver and return its result, or return 0 if not defined `int pm_generic_suspend_noirq(struct device *dev);` - if pm_runtime_suspended(dev) returns "false", invoke the ->suspend_noirq() callback provided by the device's driver and return its result, or return 0 if not defined `int pm_generic_resume(struct device *dev);` - invoke the ->resume() callback provided by the driver of this device and, if successful, change the device's runtime PM status to 'active' `int pm_generic_resume_noirq(struct device *dev);` - invoke the ->resume_noirq() callback provided by the driver of this device `int pm_generic_freeze(struct device *dev);` - if the device has not been suspended at run time, invoke the ->freeze() callback provided by its driver and return its result, or return 0 if not defined `int pm_generic_freeze_noirq(struct device *dev);` - if pm_runtime_suspended(dev) returns "false", invoke the ->freeze_noirq() callback provided by the device's driver and return its result, or return 0 if not defined `int pm_generic_thaw(struct device *dev);` - if the device has not been suspended at run time, invoke the ->thaw() callback provided by its driver and return its result, or return 0 if not defined `int pm_generic_thaw_noirq(struct device *dev);` - if pm_runtime_suspended(dev) returns "false", invoke the ->thaw_noirq() callback provided by the device's driver and return its result, or return 0 if not defined `int pm_generic_poweroff(struct device *dev);` - if the device has not been suspended at run time, invoke the ->poweroff() callback provided by its driver and return its result, or return 0 if not defined `int pm_generic_poweroff_noirq(struct device *dev);` - if pm_runtime_suspended(dev) returns "false", run the ->poweroff_noirq() callback provided by the device's driver and return its result, or return 0 if not defined `int pm_generic_restore(struct device *dev);` - invoke the ->restore() callback provided by the driver of this device and, if successful, change the device's runtime PM status to 'active' `int pm_generic_restore_noirq(struct device *dev);` - invoke the ->restore_noirq() callback provided by the device's driver ”h]”jB)�”}”(hhh]”(jG)�”}”(hŒº`int pm_generic_runtime_suspend(struct device *dev);` - invoke the ->runtime_suspend() callback provided by the driver of this device and return its result, or return 0 if not defined ”h]”(jM)�”}”(hŒ5`int pm_generic_runtime_suspend(struct device *dev);`”h]”jS)�”}”(hj:h]”hŒ3int pm_generic_runtime_suspend(struct device *dev);”…”�”}”(hj<h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhj8ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´MÝhj4ubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒ€invoke the ->runtime_suspend() callback provided by the driver of this device and return its result, or return 0 if not defined ”h]”h×)�”}”(hŒinvoke the ->runtime_suspend() callback provided by the driver of this device and return its result, or return 0 if not defined”h]”hŒinvoke the ->runtime_suspend() callback provided by the driver of this device and return its result, or return 0 if not defined”…”�”}”(hjYh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´MÜhjUubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhjRubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´MÜhjOubah}”(h]”h ]”h"]”h$]”h&]”uh1jghj4ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´MÝhj1ubjG)�”}”(hŒ¸`int pm_generic_runtime_resume(struct device *dev);` - invoke the ->runtime_resume() callback provided by the driver of this device and return its result, or return 0 if not defined ”h]”(jM)�”}”(hŒ4`int pm_generic_runtime_resume(struct device *dev);`”h]”jS)�”}”(hj…h]”hŒ2int pm_generic_runtime_resume(struct device *dev);”…”�”}”(hj‡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhjƒubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´Máhjubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒinvoke the ->runtime_resume() callback provided by the driver of this device and return its result, or return 0 if not defined ”h]”h×)�”}”(hŒ~invoke the ->runtime_resume() callback provided by the driver of this device and return its result, or return 0 if not defined”h]”hŒ~invoke the ->runtime_resume() callback provided by the driver of this device and return its result, or return 0 if not defined”…”�”}”(hj¤h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´Màhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhj�ubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´Màhjšubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´Máhj1ubjG)�”}”(hŒÏ`int pm_generic_suspend(struct device *dev);` - if the device has not been suspended at run time, invoke the ->suspend() callback provided by its driver and return its result, or return 0 if not defined ”h]”(jM)�”}”(hŒ-`int pm_generic_suspend(struct device *dev);`”h]”jS)�”}”(hjÐh]”hŒ+int pm_generic_suspend(struct device *dev);”…”�”}”(hjÒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhjÎubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´MæhjÊubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒ›if the device has not been suspended at run time, invoke the ->suspend() callback provided by its driver and return its result, or return 0 if not defined ”h]”h×)�”}”(hŒšif the device has not been suspended at run time, invoke the ->suspend() callback provided by its driver and return its result, or return 0 if not defined”h]”hŒšif the device has not been suspended at run time, invoke the ->suspend() callback provided by its driver and return its result, or return 0 if not defined”…”�”}”(hjïh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´Mähjëubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhjèubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´Mähjåubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjÊubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´Mæhj1ubjG)�”}”(hŒà`int pm_generic_suspend_noirq(struct device *dev);` - if pm_runtime_suspended(dev) returns "false", invoke the ->suspend_noirq() callback provided by the device's driver and return its result, or return 0 if not defined ”h]”(jM)�”}”(hŒ3`int pm_generic_suspend_noirq(struct device *dev);`”h]”jS)�”}”(hjh]”hŒ1int pm_generic_suspend_noirq(struct device *dev);”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´Mëhjubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒ¦if pm_runtime_suspended(dev) returns "false", invoke the ->suspend_noirq() callback provided by the device's driver and return its result, or return 0 if not defined ”h]”h×)�”}”(hŒ¥if pm_runtime_suspended(dev) returns "false", invoke the ->suspend_noirq() callback provided by the device's driver and return its result, or return 0 if not defined”h]”hŒ«if pm_runtime_suspended(dev) returns “falseâ€�, invoke the ->suspend_noirq() callback provided by the device’s driver and return its result, or return 0 if not defined”…”�”}”(hj:h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´Méhj6ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhj3ubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´Méhj0ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´Mëhj1ubjG)�”}”(hŒ¼`int pm_generic_resume(struct device *dev);` - invoke the ->resume() callback provided by the driver of this device and, if successful, change the device's runtime PM status to 'active' ”h]”(jM)�”}”(hŒ,`int pm_generic_resume(struct device *dev);`”h]”jS)�”}”(hjfh]”hŒ*int pm_generic_resume(struct device *dev);”…”�”}”(hjhh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhjdubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´Mïhj`ubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒ‹invoke the ->resume() callback provided by the driver of this device and, if successful, change the device's runtime PM status to 'active' ”h]”h×)�”}”(hŒŠinvoke the ->resume() callback provided by the driver of this device and, if successful, change the device's runtime PM status to 'active'”h]”hŒ�invoke the ->resume() callback provided by the driver of this device and, if successful, change the device’s runtime PM status to ‘active’”…”�”}”(hj…h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´Mîhj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhj~ubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´Mîhj{ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghj`ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´Mïhj1ubjG)�”}”(hŒ€`int pm_generic_resume_noirq(struct device *dev);` - invoke the ->resume_noirq() callback provided by the driver of this device ”h]”(jM)�”}”(hŒ2`int pm_generic_resume_noirq(struct device *dev);`”h]”jS)�”}”(hj±h]”hŒ0int pm_generic_resume_noirq(struct device *dev);”…”�”}”(hj³h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhj¯ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´Mòhj«ubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒKinvoke the ->resume_noirq() callback provided by the driver of this device ”h]”h×)�”}”(hŒJinvoke the ->resume_noirq() callback provided by the driver of this device”h]”hŒJinvoke the ->resume_noirq() callback provided by the driver of this device”…”�”}”(hjÐh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´MòhjÌubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhjÉubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´MòhjÆubah}”(h]”h ]”h"]”h$]”h&]”uh1jghj«ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´Mòhj1ubjG)�”}”(hŒÍ`int pm_generic_freeze(struct device *dev);` - if the device has not been suspended at run time, invoke the ->freeze() callback provided by its driver and return its result, or return 0 if not defined ”h]”(jM)�”}”(hŒ,`int pm_generic_freeze(struct device *dev);`”h]”jS)�”}”(hjüh]”hŒ*int pm_generic_freeze(struct device *dev);”…”�”}”(hjþh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhjúubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´M÷hjöubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒšif the device has not been suspended at run time, invoke the ->freeze() callback provided by its driver and return its result, or return 0 if not defined ”h]”h×)�”}”(hŒ™if the device has not been suspended at run time, invoke the ->freeze() callback provided by its driver and return its result, or return 0 if not defined”h]”hŒ™if the device has not been suspended at run time, invoke the ->freeze() callback provided by its driver and return its result, or return 0 if not defined”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´Mõhjubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhjubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´Mõhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjöubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´M÷hj1ubjG)�”}”(hŒÞ`int pm_generic_freeze_noirq(struct device *dev);` - if pm_runtime_suspended(dev) returns "false", invoke the ->freeze_noirq() callback provided by the device's driver and return its result, or return 0 if not defined ”h]”(jM)�”}”(hŒ2`int pm_generic_freeze_noirq(struct device *dev);`”h]”jS)�”}”(hjGh]”hŒ0int pm_generic_freeze_noirq(struct device *dev);”…”�”}”(hjIh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhjEubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´MühjAubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒ¥if pm_runtime_suspended(dev) returns "false", invoke the ->freeze_noirq() callback provided by the device's driver and return its result, or return 0 if not defined ”h]”h×)�”}”(hŒ¤if pm_runtime_suspended(dev) returns "false", invoke the ->freeze_noirq() callback provided by the device's driver and return its result, or return 0 if not defined”h]”hŒªif pm_runtime_suspended(dev) returns “falseâ€�, invoke the ->freeze_noirq() callback provided by the device’s driver and return its result, or return 0 if not defined”…”�”}”(hjfh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´Múhjbubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhj_ubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´Múhj\ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjAubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´Mühj1ubjG)�”}”(hŒÉ`int pm_generic_thaw(struct device *dev);` - if the device has not been suspended at run time, invoke the ->thaw() callback provided by its driver and return its result, or return 0 if not defined ”h]”(jM)�”}”(hŒ*`int pm_generic_thaw(struct device *dev);`”h]”jS)�”}”(hj’h]”hŒ(int pm_generic_thaw(struct device *dev);”…”�”}”(hj”h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´MhjŒubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒ˜if the device has not been suspended at run time, invoke the ->thaw() callback provided by its driver and return its result, or return 0 if not defined ”h]”h×)�”}”(hŒ—if the device has not been suspended at run time, invoke the ->thaw() callback provided by its driver and return its result, or return 0 if not defined”h]”hŒ—if the device has not been suspended at run time, invoke the ->thaw() callback provided by its driver and return its result, or return 0 if not defined”…”�”}”(hj±h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´Mÿhj­ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhjªubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´Mÿhj§ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjŒubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´Mhj1ubjG)�”}”(hŒÚ`int pm_generic_thaw_noirq(struct device *dev);` - if pm_runtime_suspended(dev) returns "false", invoke the ->thaw_noirq() callback provided by the device's driver and return its result, or return 0 if not defined ”h]”(jM)�”}”(hŒ0`int pm_generic_thaw_noirq(struct device *dev);`”h]”jS)�”}”(hjÝh]”hŒ.int pm_generic_thaw_noirq(struct device *dev);”…”�”}”(hjßh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhjÛubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´Mhj×ubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒ£if pm_runtime_suspended(dev) returns "false", invoke the ->thaw_noirq() callback provided by the device's driver and return its result, or return 0 if not defined ”h]”h×)�”}”(hŒ¢if pm_runtime_suspended(dev) returns "false", invoke the ->thaw_noirq() callback provided by the device's driver and return its result, or return 0 if not defined”h]”hŒ¨if pm_runtime_suspended(dev) returns “falseâ€�, invoke the ->thaw_noirq() callback provided by the device’s driver and return its result, or return 0 if not defined”…”�”}”(hjüh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´Mhjøubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhjõubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´Mhjòubah}”(h]”h ]”h"]”h$]”h&]”uh1jghj×ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´Mhj1ubjG)�”}”(hŒÑ`int pm_generic_poweroff(struct device *dev);` - if the device has not been suspended at run time, invoke the ->poweroff() callback provided by its driver and return its result, or return 0 if not defined ”h]”(jM)�”}”(hŒ.`int pm_generic_poweroff(struct device *dev);`”h]”jS)�”}”(hj( h]”hŒ,int pm_generic_poweroff(struct device *dev);”…”�”}”(hj* h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhj& ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´M hj" ubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒœif the device has not been suspended at run time, invoke the ->poweroff() callback provided by its driver and return its result, or return 0 if not defined ”h]”h×)�”}”(hŒ›if the device has not been suspended at run time, invoke the ->poweroff() callback provided by its driver and return its result, or return 0 if not defined”h]”hŒ›if the device has not been suspended at run time, invoke the ->poweroff() callback provided by its driver and return its result, or return 0 if not defined”…”�”}”(hjG h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´M hjC ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhj@ ubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´M hj= ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghj" ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´M hj1ubjG)�”}”(hŒß`int pm_generic_poweroff_noirq(struct device *dev);` - if pm_runtime_suspended(dev) returns "false", run the ->poweroff_noirq() callback provided by the device's driver and return its result, or return 0 if not defined ”h]”(jM)�”}”(hŒ4`int pm_generic_poweroff_noirq(struct device *dev);`”h]”jS)�”}”(hjs h]”hŒ2int pm_generic_poweroff_noirq(struct device *dev);”…”�”}”(hju h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhjq ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´Mhjm ubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒ¤if pm_runtime_suspended(dev) returns "false", run the ->poweroff_noirq() callback provided by the device's driver and return its result, or return 0 if not defined ”h]”h×)�”}”(hŒ£if pm_runtime_suspended(dev) returns "false", run the ->poweroff_noirq() callback provided by the device's driver and return its result, or return 0 if not defined”h]”hŒ©if pm_runtime_suspended(dev) returns “falseâ€�, run the ->poweroff_noirq() callback provided by the device’s driver and return its result, or return 0 if not defined”…”�”}”(hj’ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´MhjŽ ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhj‹ ubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´Mhjˆ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjm ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´Mhj1ubjG)�”}”(hŒ¾`int pm_generic_restore(struct device *dev);` - invoke the ->restore() callback provided by the driver of this device and, if successful, change the device's runtime PM status to 'active' ”h]”(jM)�”}”(hŒ-`int pm_generic_restore(struct device *dev);`”h]”jS)�”}”(hj¾ h]”hŒ+int pm_generic_restore(struct device *dev);”…”�”}”(hjÀ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhj¼ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´Mhj¸ ubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒŒinvoke the ->restore() callback provided by the driver of this device and, if successful, change the device's runtime PM status to 'active' ”h]”h×)�”}”(hŒ‹invoke the ->restore() callback provided by the driver of this device and, if successful, change the device's runtime PM status to 'active'”h]”hŒ‘invoke the ->restore() callback provided by the driver of this device and, if successful, change the device’s runtime PM status to ‘active’”…”�”}”(hjÝ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´MhjÙ ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhjÖ ubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´MhjÓ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghj¸ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´Mhj1ubjG)�”}”(hŒ|`int pm_generic_restore_noirq(struct device *dev);` - invoke the ->restore_noirq() callback provided by the device's driver ”h]”(jM)�”}”(hŒ3`int pm_generic_restore_noirq(struct device *dev);`”h]”jS)�”}”(hj !h]”hŒ1int pm_generic_restore_noirq(struct device *dev);”…”�”}”(hj !h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhj!ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÊh´Mhj!ubjh)�”}”(hhh]”j™)�”}”(hhh]”hÑ)�”}”(hŒFinvoke the ->restore_noirq() callback provided by the device's driver ”h]”h×)�”}”(hŒEinvoke the ->restore_noirq() callback provided by the device's driver”h]”hŒGinvoke the ->restore_noirq() callback provided by the device’s driver”…”�”}”(hj(!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´Mhj$!ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÐhj!!ubah}”(h]”h ]”h"]”h$]”h&]”jj�uh1j˜h³hÊh´Mhj!ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghj!ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jFh³hÊh´Mhj1ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jAhj-ubah}”(h]”h ]”h"]”h$]”h&]”uh1jZh³hÊh´MÛhjh²hubh×)�”}”(hXˆThese functions are the defaults used by the PM core if a subsystem doesn't provide its own callbacks for ->runtime_idle(), ->runtime_suspend(), ->runtime_resume(), ->suspend(), ->suspend_noirq(), ->resume(), ->resume_noirq(), ->freeze(), ->freeze_noirq(), ->thaw(), ->thaw_noirq(), ->poweroff(), ->poweroff_noirq(), ->restore(), ->restore_noirq() in the subsystem-level dev_pm_ops structure.”h]”hXŠThese functions are the defaults used by the PM core if a subsystem doesn’t provide its own callbacks for ->runtime_idle(), ->runtime_suspend(), ->runtime_resume(), ->suspend(), ->suspend_noirq(), ->resume(), ->resume_noirq(), ->freeze(), ->freeze_noirq(), ->thaw(), ->thaw_noirq(), ->poweroff(), ->poweroff_noirq(), ->restore(), ->restore_noirq() in the subsystem-level dev_pm_ops structure.”…”�”}”(hjZ!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´Mhjh²hubh×)�”}”(hX\Device drivers that wish to use the same function as a system suspend, freeze, poweroff and runtime suspend callback, and similarly for system resume, thaw, restore, and runtime resume, can achieve similar behaviour with the help of the DEFINE_RUNTIME_DEV_PM_OPS() defined in include/linux/pm_runtime.h (possibly setting its last argument to NULL).”h]”hX\Device drivers that wish to use the same function as a system suspend, freeze, poweroff and runtime suspend callback, and similarly for system resume, thaw, restore, and runtime resume, can achieve similar behaviour with the help of the DEFINE_RUNTIME_DEV_PM_OPS() defined in include/linux/pm_runtime.h (possibly setting its last argument to NULL).”…”�”}”(hjh!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´M hjh²hubeh}”(h]”Œgeneric-subsystem-callbacks”ah ]”h"]”Œ7. generic subsystem callbacks”ah$]”h&]”uh1hµhh·h²hh³hÊh´MÕubh¶)�”}”(hhh]”(h»)�”}”(hŒ8. "No-Callback" Devices”h]”hŒ8. “No-Callbackâ€� Devices”…”�”}”(hj�!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj~!h²hh³hÊh´M'ubh×)�”}”(hX Some "devices" are only logical sub-devices of their parent and cannot be power-managed on their own. (The prototype example is a USB interface. Entire USB devices can go into low-power mode or send wake-up requests, but neither is possible for individual interfaces.) The drivers for these devices have no need of runtime PM callbacks; if the callbacks did exist, ->runtime_suspend() and ->runtime_resume() would always return 0 without doing anything else and ->runtime_idle() would always call pm_runtime_suspend().”h]”hX Some “devicesâ€� are only logical sub-devices of their parent and cannot be power-managed on their own. (The prototype example is a USB interface. Entire USB devices can go into low-power mode or send wake-up requests, but neither is possible for individual interfaces.) The drivers for these devices have no need of runtime PM callbacks; if the callbacks did exist, ->runtime_suspend() and ->runtime_resume() would always return 0 without doing anything else and ->runtime_idle() would always call pm_runtime_suspend().”…”�”}”(hj�!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´M)hj~!h²hubh×)�”}”(hXpSubsystems can tell the PM core about these devices by calling pm_runtime_no_callbacks(). This should be done after the device structure is initialized and before it is registered (although after device registration is also okay). The routine will set the device's power.no_callbacks flag and prevent the non-debugging runtime PM sysfs attributes from being created.”•@Hh]”hXrSubsystems can tell the PM core about these devices by calling pm_runtime_no_callbacks(). This should be done after the device structure is initialized and before it is registered (although after device registration is also okay). The routine will set the device’s power.no_callbacks flag and prevent the non-debugging runtime PM sysfs attributes from being created.”…”�”}”(hj�!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´M1hj~!h²hubh×)�”}”(hŒòWhen power.no_callbacks is set, the PM core will not invoke the ->runtime_idle(), ->runtime_suspend(), or ->runtime_resume() callbacks. Instead it will assume that suspends and resumes always succeed and that idle devices should be suspended.”h]”hŒòWhen power.no_callbacks is set, the PM core will not invoke the ->runtime_idle(), ->runtime_suspend(), or ->runtime_resume() callbacks. Instead it will assume that suspends and resumes always succeed and that idle devices should be suspended.”…”�”}”(hj«!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´M7hj~!h²hubh×)�”}”(hXAs a consequence, the PM core will never directly inform the device's subsystem or driver about runtime power changes. Instead, the driver for the device's parent must take responsibility for telling the device's driver when the parent's power state changes.”h]”hX As a consequence, the PM core will never directly inform the device’s subsystem or driver about runtime power changes. Instead, the driver for the device’s parent must take responsibility for telling the device’s driver when the parent’s power state changes.”…”�”}”(hj¹!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´M<hj~!h²hubh×)�”}”(hXKNote that, in some cases it may not be desirable for subsystems/drivers to call pm_runtime_no_callbacks() for their devices. This could be because a subset of the runtime PM callbacks needs to be implemented, a platform dependent PM domain could get attached to the device or that the device is power managed through a supplier device link. For these reasons and to avoid boilerplate code in subsystems/drivers, the PM core allows runtime PM callbacks to be unassigned. More precisely, if a callback pointer is NULL, the PM core will act as though there was a callback and it returned 0.”h]”hXKNote that, in some cases it may not be desirable for subsystems/drivers to call pm_runtime_no_callbacks() for their devices. This could be because a subset of the runtime PM callbacks needs to be implemented, a platform dependent PM domain could get attached to the device or that the device is power managed through a supplier device link. For these reasons and to avoid boilerplate code in subsystems/drivers, the PM core allows runtime PM callbacks to be unassigned. More precisely, if a callback pointer is NULL, the PM core will act as though there was a callback and it returned 0.”…”�”}”(hjÇ!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´MAhj~!h²hubeh}”(h]”Œno-callback-devices”ah ]”h"]”Œ8. "no-callback" devices”ah$]”h&]”uh1hµhh·h²hh³hÊh´M'ubh¶)�”}”(hhh]”(h»)�”}”(hŒ19. Autosuspend, or automatically-delayed suspends”h]”hŒ19. Autosuspend, or automatically-delayed suspends”…”�”}”(hjà!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjÝ!h²hh³hÊh´MKubh×)�”}”(hX\Changing a device's power state isn't free; it requires both time and energy. A device should be put in a low-power state only when there's some reason to think it will remain in that state for a substantial time. A common heuristic says that a device which hasn't been used for a while is liable to remain unused; following this advice, drivers should not allow devices to be suspended at runtime until they have been inactive for some minimum period. Even when the heuristic ends up being non-optimal, it will still prevent devices from "bouncing" too rapidly between low-power and full-power states.”h]”hXhChanging a device’s power state isn’t free; it requires both time and energy. A device should be put in a low-power state only when there’s some reason to think it will remain in that state for a substantial time. A common heuristic says that a device which hasn’t been used for a while is liable to remain unused; following this advice, drivers should not allow devices to be suspended at runtime until they have been inactive for some minimum period. Even when the heuristic ends up being non-optimal, it will still prevent devices from “bouncingâ€� too rapidly between low-power and full-power states.”…”�”}”(hjî!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´MMhjÝ!h²hubh×)�”}”(hX-The term "autosuspend" is an historical remnant. It doesn't mean that the device is automatically suspended (the subsystem or driver still has to call the appropriate PM routines); rather it means that runtime suspends will automatically be delayed until the desired period of inactivity has elapsed.”h]”hX3The term “autosuspendâ€� is an historical remnant. It doesn’t mean that the device is automatically suspended (the subsystem or driver still has to call the appropriate PM routines); rather it means that runtime suspends will automatically be delayed until the desired period of inactivity has elapsed.”…”�”}”(hjü!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´MVhjÝ!h²hubh×)�”}”(hXfInactivity is determined based on the power.last_busy field. The desired length of the inactivity period is a matter of policy. Subsystems can set this length initially by calling pm_runtime_set_autosuspend_delay(), but after device registration the length should be controlled by user space, using the /sys/devices/.../power/autosuspend_delay_ms attribute.”h]”hXfInactivity is determined based on the power.last_busy field. The desired length of the inactivity period is a matter of policy. Subsystems can set this length initially by calling pm_runtime_set_autosuspend_delay(), but after device registration the length should be controlled by user space, using the /sys/devices/.../power/autosuspend_delay_ms attribute.”…”�”}”(hj "h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´M[hjÝ!h²hubh×)�”}”(hXIn order to use autosuspend, subsystems or drivers must call pm_runtime_use_autosuspend() (preferably before registering the device), and thereafter they should use the various `*_autosuspend()` helper functions instead of the non-autosuspend counterparts::”h]”(hŒ±In order to use autosuspend, subsystems or drivers must call pm_runtime_use_autosuspend() (preferably before registering the device), and thereafter they should use the various ”…”�”}”(hj"h²hh³Nh´NubjS)�”}”(hŒ`*_autosuspend()`”h]”hŒ*_autosuspend()”…”�”}”(hj "h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhj"ubhŒ> helper functions instead of the non-autosuspend counterparts:”…”�”}”(hj"h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´MahjÝ!h²hubj;)�”}”(hXInstead of: pm_runtime_suspend use: pm_runtime_autosuspend; Instead of: pm_schedule_suspend use: pm_request_autosuspend; Instead of: pm_runtime_put use: pm_runtime_put_autosuspend; Instead of: pm_runtime_put_sync use: pm_runtime_put_sync_autosuspend.”h]”hXInstead of: pm_runtime_suspend use: pm_runtime_autosuspend; Instead of: pm_schedule_suspend use: pm_request_autosuspend; Instead of: pm_runtime_put use: pm_runtime_put_autosuspend; Instead of: pm_runtime_put_sync use: pm_runtime_put_sync_autosuspend.”…”�”}”hj8"sbah}”(h]”h ]”h"]”h$]”h&]”jJjKuh1j:h³hÊh´MfhjÝ!h²hubh×)�”}”(hX Drivers may also continue to use the non-autosuspend helper functions; they will behave normally, which means sometimes taking the autosuspend delay into account (see pm_runtime_idle). The autosuspend variants of the functions also call pm_runtime_mark_last_busy().”h]”hX Drivers may also continue to use the non-autosuspend helper functions; they will behave normally, which means sometimes taking the autosuspend delay into account (see pm_runtime_idle). The autosuspend variants of the functions also call pm_runtime_mark_last_busy().”…”�”}”(hjF"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´MkhjÝ!h²hubh×)�”}”(hXŠUnder some circumstances a driver or subsystem may want to prevent a device from autosuspending immediately, even though the usage counter is zero and the autosuspend delay time has expired. If the ->runtime_suspend() callback returns -EAGAIN or -EBUSY, and if the next autosuspend delay expiration time is in the future (as it normally would be if the callback invoked pm_runtime_mark_last_busy()), the PM core will automatically reschedule the autosuspend. The ->runtime_suspend() callback can't do this rescheduling itself because no suspend requests of any kind are accepted while the device is suspending (i.e., while the callback is running).”h]”hXŒUnder some circumstances a driver or subsystem may want to prevent a device from autosuspending immediately, even though the usage counter is zero and the autosuspend delay time has expired. If the ->runtime_suspend() callback returns -EAGAIN or -EBUSY, and if the next autosuspend delay expiration time is in the future (as it normally would be if the callback invoked pm_runtime_mark_last_busy()), the PM core will automatically reschedule the autosuspend. The ->runtime_suspend() callback can’t do this rescheduling itself because no suspend requests of any kind are accepted while the device is suspending (i.e., while the callback is running).”…”�”}”(hjT"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´MphjÝ!h²hubh×)�”}”(hXUThe implementation is well suited for asynchronous use in interrupt contexts. However such use inevitably involves races, because the PM core can't synchronize ->runtime_suspend() callbacks with the arrival of I/O requests. This synchronization must be handled by the driver, using its private lock. Here is a schematic pseudo-code example::”h]”hXVThe implementation is well suited for asynchronous use in interrupt contexts. However such use inevitably involves races, because the PM core can’t synchronize ->runtime_suspend() callbacks with the arrival of I/O requests. This synchronization must be handled by the driver, using its private lock. Here is a schematic pseudo-code example:”…”�”}”(hjb"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´MzhjÝ!h²hubj;)�”}”(hXÆfoo_read_or_write(struct foo_priv *foo, void *data) { lock(&foo->private_lock); add_request_to_io_queue(foo, data); if (foo->num_pending_requests++ == 0) pm_runtime_get(&foo->dev); if (!foo->is_suspended) foo_process_next_request(foo); unlock(&foo->private_lock); } foo_io_completion(struct foo_priv *foo, void *req) { lock(&foo->private_lock); if (--foo->num_pending_requests == 0) pm_runtime_put_autosuspend(&foo->dev); else foo_process_next_request(foo); unlock(&foo->private_lock); /* Send req result back to the user ... */ } int foo_runtime_suspend(struct device *dev) { struct foo_priv foo = container_of(dev, ...); int ret = 0; lock(&foo->private_lock); if (foo->num_pending_requests > 0) { ret = -EBUSY; } else { /* ... suspend the device ... */ foo->is_suspended = 1; } unlock(&foo->private_lock); return ret; } int foo_runtime_resume(struct device *dev) { struct foo_priv foo = container_of(dev, ...); lock(&foo->private_lock); /* ... resume the device ... */ foo->is_suspended = 0; pm_runtime_mark_last_busy(&foo->dev); if (foo->num_pending_requests > 0) foo_process_next_request(foo); unlock(&foo->private_lock); return 0; }”h]”hXÆfoo_read_or_write(struct foo_priv *foo, void *data) { lock(&foo->private_lock); add_request_to_io_queue(foo, data); if (foo->num_pending_requests++ == 0) pm_runtime_get(&foo->dev); if (!foo->is_suspended) foo_process_next_request(foo); unlock(&foo->private_lock); } foo_io_completion(struct foo_priv *foo, void *req) { lock(&foo->private_lock); if (--foo->num_pending_requests == 0) pm_runtime_put_autosuspend(&foo->dev); else foo_process_next_request(foo); unlock(&foo->private_lock); /* Send req result back to the user ... */ } int foo_runtime_suspend(struct device *dev) { struct foo_priv foo = container_of(dev, ...); int ret = 0; lock(&foo->private_lock); if (foo->num_pending_requests > 0) { ret = -EBUSY; } else { /* ... suspend the device ... */ foo->is_suspended = 1; } unlock(&foo->private_lock); return ret; } int foo_runtime_resume(struct device *dev) { struct foo_priv foo = container_of(dev, ...); lock(&foo->private_lock); /* ... resume the device ... */ foo->is_suspended = 0; pm_runtime_mark_last_busy(&foo->dev); if (foo->num_pending_requests > 0) foo_process_next_request(foo); unlock(&foo->private_lock); return 0; }”…”�”}”hjp"sbah}”(h]”h ]”h"]”h$]”h&]”jJjKuh1j:h³hÊh´M€hjÝ!h²hubh×)�”}”(hX5The important point is that after foo_io_completion() asks for an autosuspend, the foo_runtime_suspend() callback may race with foo_read_or_write(). Therefore foo_runtime_suspend() has to check whether there are any pending I/O requests (while holding the private lock) before allowing the suspend to proceed.”h]”hX5The important point is that after foo_io_completion() asks for an autosuspend, the foo_runtime_suspend() callback may race with foo_read_or_write(). Therefore foo_runtime_suspend() has to check whether there are any pending I/O requests (while holding the private lock) before allowing the suspend to proceed.”…”�”}”(hj~"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´M´hjÝ!h²hubh×)�”}”(hXhIn addition, the power.autosuspend_delay field can be changed by user space at any time. If a driver cares about this, it can call pm_runtime_autosuspend_expiration() from within the ->runtime_suspend() callback while holding its private lock. If the function returns a nonzero value then the delay has not yet expired and the callback should return -EAGAIN.”h]”hXhIn addition, the power.autosuspend_delay field can be changed by user space at any time. If a driver cares about this, it can call pm_runtime_autosuspend_expiration() from within the ->runtime_suspend() callback while holding its private lock. If the function returns a nonzero value then the delay has not yet expired and the callback should return -EAGAIN.”…”�”}”(hjŒ"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´MºhjÝ!h²hubeh}”(h]”Œ-autosuspend-or-automatically-delayed-suspends”ah ]”h"]”Œ19. autosuspend, or automatically-delayed suspends”ah$]”h&]”uh1hµhh·h²hh³hÊh´MKubeh}”(h]”Œ2runtime-power-management-framework-for-i-o-devices”ah ]”h"]”Œ2runtime power management framework for i/o devices”ah$]”h&]”uh1hµhhh²hh³hÊh´Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÊuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)�”}”(hºNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”jÍ"Œerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÊŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”Œnameids”}”(j§"j¤"jjjjj= j: jžj›jCj@j jj{!jx!jÚ!j×!jŸ"jœ"uŒ nametypes”}”(j§"‰j‰j‰j= ‰jž‰jC‰j ‰j{!‰jÚ!‰jŸ"‰uh}”(j¤"h·jjyjjj: jj›j@ j@j¡jjFjx!jj×!j~!jœ"jÝ!uŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”(hŒsystem_message”“”)�”}”(hhh]”h×)�”}”(hŒ:Enumerated list start value not ordinal-1: "C" (ordinal 3)”h]”hŒ>Enumerated list start value not ordinal-1: “Câ€� (ordinal 3)”…”�”}”(hj4#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖhj1#ubah}”(h]”h ]”h"]”h$]”h&]”Œlevel”KŒtype”ŒINFO”Œsource”hÊŒline”Kuh1j/#hh·h²hh³hÊh´Kubj0#)�”}”(hhh]”h×)�”}”(hŒ:Enumerated list start value not ordinal-1: "C" (ordinal 3)”h]”hŒ>Enumerated list start value not ordinal-1: “Câ€� (ordinal 3)”…”�”}”(hjP#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖhjM#ubah}”(h]”h ]”h"]”h$]”h&]”Œlevel”KŒtype”jJ#Œsource”hÊŒline”Kuh1j/#hh·h²hh³hÊh´Kubj0#)�”}”(hhh]”h×)�”}”(hŒ:Enumerated list start value not ordinal-1: "C" (ordinal 3)”h]”hŒ>Enumerated list start value not ordinal-1: “Câ€� (ordinal 3)”…”�”}”(hjk#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖhjh#ubah}”(h]”h ]”h"]”h$]”h&]”Œlevel”KŒtype”jJ#Œsource”hÊŒline”Kuh1j/#hh·h²hh³hÊh´K ubeŒtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nh²hub.