"sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget+/translations/zh_CN/driver-api/pm/notifiersmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget+/translations/zh_TW/driver-api/pm/notifiersmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget+/translations/it_IT/driver-api/pm/notifiersmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget+/translations/ja_JP/driver-api/pm/notifiersmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget+/translations/ko_KR/driver-api/pm/notifiersmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget+/translations/sp_SP/driver-api/pm/notifiersmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhcomment)}(h SPDX-License-Identifier: GPL-2.0h]h SPDX-License-Identifier: GPL-2.0}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhhE/var/lib/git/docbuild/linux/Documentation/driver-api/pm/notifiers.rsthKubh)}(h4This data file has been placed in the public domain.h]h4This data file has been placed in the public domain.}hhsbah}(h]h ]h"]h$]h&]hhuh1hhhhhho/srv/docbuild/lib/venvs/build-kernel-docs/lib64/python3.9/site-packages/docutils/parsers/rst/include/isonum.txthKubh)}(hDerived from the Unicode character mappings available from . Processed by unicode2rstsubs.py, part of Docutils: .h]hDerived from the Unicode character mappings available from . Processed by unicode2rstsubs.py, part of Docutils: .}hhsbah}(h]h ]h"]h$]h&]hhuh1hhhhhhhhKubhsubstitution_definition)}(h*.. |amp| unicode:: U+00026 .. AMPERSANDh]h&}hhsbah}(h]h ]h"]ampah$]h&]uh1hhhhKhhhhubh)}(h+.. |apos| unicode:: U+00027 .. APOSTROPHEh]h'}hhsbah}(h]h ]h"]aposah$]h&]uh1hhhhKhhhhubh)}(h).. |ast| unicode:: U+0002A .. ASTERISKh]h*}hhsbah}(h]h ]h"]astah$]h&]uh1hhhhK hhhhubh)}(h+.. |brvbar| unicode:: U+000A6 .. BROKEN BARh]h¦}hjsbah}(h]h ]h"]brvbarah$]h&]uh1hhhhK hhhhubh)}(h0.. |bsol| unicode:: U+0005C .. REVERSE SOLIDUSh]h\}hjsbah}(h]h ]h"]bsolah$]h&]uh1hhhhK hhhhubh)}(h*.. |cent| unicode:: U+000A2 .. CENT SIGNh]h¢}hjsbah}(h]h ]h"]centah$]h&]uh1hhhhK hhhhubh)}(h&.. |colon| unicode:: U+0003A .. COLONh]h:}hj-sbah}(h]h ]h"]colonah$]h&]uh1hhhhK hhhhubh)}(h&.. |comma| unicode:: U+0002C .. COMMAh]h,}hj<sbah}(h]h ]h"]commaah$]h&]uh1hhhhKhhhhubh)}(h... |commat| unicode:: U+00040 .. COMMERCIAL ATh]h@}hjKsbah}(h]h ]h"]commatah$]h&]uh1hhhhKhhhhubh)}(h/.. |copy| unicode:: U+000A9 .. COPYRIGHT SIGNh]h©}hjZsbah}(h]h ]h"]copyah$]h&]uh1hhhhKhhhhubh)}(h... |curren| unicode:: U+000A4 .. CURRENCY SIGNh]h¤}hjisbah}(h]h ]h"]currenah$]h&]uh1hhhhKhhhhubh)}(h0.. |darr| unicode:: U+02193 .. DOWNWARDS ARROWh]h↓}hjxsbah}(h]h ]h"]darrah$]h&]uh1hhhhKhhhhubh)}(h,.. |deg| unicode:: U+000B0 .. DEGREE SIGNh]h°}hjsbah}(h]h ]h"]degah$]h&]uh1hhhhKhhhhubh)}(h... |divide| unicode:: U+000F7 .. DIVISION SIGNh]h÷}hjsbah}(h]h ]h"]divideah$]h&]uh1hhhhKhhhhubh)}(h,.. |dollar| unicode:: U+00024 .. DOLLAR SIGNh]h$}hjsbah}(h]h ]h"]dollarah$]h&]uh1hhhhKhhhhubh)}(h,.. |equals| unicode:: U+0003D .. EQUALS SIGNh]h=}hjsbah}(h]h ]h"]equalsah$]h&]uh1hhhhKhhhhubh)}(h1.. |excl| unicode:: U+00021 .. EXCLAMATION MARKh]h!}hjsbah}(h]h ]h"]exclah$]h&]uh1hhhhKhhhhubh)}(h9.. |frac12| unicode:: U+000BD .. VULGAR FRACTION ONE HALFh]h½}hjsbah}(h]h ]h"]frac12ah$]h&]uh1hhhhKhhhhubh)}(h<.. |frac14| unicode:: U+000BC .. VULGAR FRACTION ONE QUARTERh]h¼}hjsbah}(h]h ]h"]frac14ah$]h&]uh1hhhhKhhhhubh)}(h;.. |frac18| unicode:: U+0215B .. VULGAR FRACTION ONE EIGHTHh]h⅛}hjsbah}(h]h ]h"]frac18ah$]h&]uh1hhhhKhhhhubh)}(h?.. |frac34| unicode:: U+000BE .. VULGAR FRACTION THREE QUARTERSh]h¾}hjsbah}(h]h ]h"]frac34ah$]h&]uh1hhhhKhhhhubh)}(h>.. |frac38| unicode:: U+0215C .. VULGAR FRACTION THREE EIGHTHSh]h⅜}hjsbah}(h]h ]h"]frac38ah$]h&]uh1hhhhKhhhhubh)}(h=.. |frac58| unicode:: U+0215D .. VULGAR FRACTION FIVE EIGHTHSh]h⅝}hjsbah}(h]h ]h"]frac58ah$]h&]uh1hhhhKhhhhubh)}(h>.. |frac78| unicode:: U+0215E .. VULGAR FRACTION SEVEN EIGHTHSh]h⅞}hj,sbah}(h]h ]h"]frac78ah$]h&]uh1hhhhKhhhhubh)}(h2.. |gt| unicode:: U+0003E .. GREATER-THAN SIGNh]h>}hj;sbah}(h]h ]h"]gtah$]h&]uh1hhhhKhhhhubh)}(h9.. |half| unicode:: U+000BD .. VULGAR FRACTION ONE HALFh]h½}hjJsbah}(h]h ]h"]halfah$]h&]uh1hhhhK hhhhubh)}(h/.. |horbar| unicode:: U+02015 .. HORIZONTAL BARh]h―}hjYsbah}(h]h ]h"]horbarah$]h&]uh1hhhhK!hhhhubh)}(h'.. |hyphen| unicode:: U+02010 .. HYPHENh]h‐}hjhsbah}(h]h ]h"]hyphenah$]h&]uh1hhhhK"hhhhubh)}(h:.. |iexcl| unicode:: U+000A1 .. INVERTED EXCLAMATION MARKh]h¡}hjwsbah}(h]h ]h"]iexclah$]h&]uh1hhhhK#hhhhubh)}(h7.. |iquest| unicode:: U+000BF .. INVERTED QUESTION MARKh]h¿}hjsbah}(h]h ]h"]iquestah$]h&]uh1hhhhK$hhhhubh)}(hJ.. |laquo| unicode:: U+000AB .. LEFT-POINTING DOUBLE ANGLE QUOTATION MARKh]h«}hjsbah}(h]h ]h"]laquoah$]h&]uh1hhhhK%hhhhubh)}(h0.. |larr| unicode:: U+02190 .. LEFTWARDS ARROWh]h←}hjsbah}(h]h ]h"]larrah$]h&]uh1hhhhK&hhhhubh)}(h3.. |lcub| unicode:: U+0007B .. LEFT CURLY BRACKETh]h{}hjsbah}(h]h ]h"]lcubah$]h&]uh1hhhhK'hhhhubh)}(h;.. |ldquo| unicode:: U+0201C .. LEFT DOUBLE QUOTATION MARKh]h“}hjsbah}(h]h ]h"]ldquoah$]h&]uh1hhhhK(hhhhubh)}(h).. |lowbar| unicode:: U+0005F .. LOW LINEh]h_}hjsbah}(h]h ]h"]lowbarah$]h&]uh1hhhhK)hhhhubh)}(h1.. |lpar| unicode:: U+00028 .. LEFT PARENTHESISh]h(}hjsbah}(h]h ]h"]lparah$]h&]uh1hhhhK*hhhhubh)}(h4.. |lsqb| unicode:: U+0005B .. LEFT SQUARE BRACKETh]h[}hjsbah}(h]h ]h"]lsqbah$]h&]uh1hhhhK+hhhhubh)}(h;.. |lsquo| unicode:: U+02018 .. LEFT SINGLE QUOTATION MARKh]h‘}hjsbah}(h]h ]h"]lsquoah$]h&]uh1hhhhK,hhhhubh)}(h/.. |lt| unicode:: U+0003C .. LESS-THAN SIGNh]h<}hj sbah}(h]h ]h"]ltah$]h&]uh1hhhhK-hhhhubh)}(h+.. |micro| unicode:: U+000B5 .. MICRO SIGNh]hµ}hjsbah}(h]h ]h"]microah$]h&]uh1hhhhK.hhhhubh)}(h+.. |middot| unicode:: U+000B7 .. MIDDLE DOTh]h·}hj+sbah}(h]h ]h"]middotah$]h&]uh1hhhhK/hhhhubh)}(h/.. |nbsp| unicode:: U+000A0 .. NO-BREAK SPACEh]h }hj:sbah}(h]h ]h"]nbspah$]h&]uh1hhhhK0hhhhubh)}(h).. |not| unicode:: U+000AC .. NOT SIGNh]h¬}hjIsbah}(h]h ]h"]notah$]h&]uh1hhhhK1hhhhubh)}(h,.. |num| unicode:: U+00023 .. NUMBER SIGNh]h#}hjXsbah}(h]h ]h"]numah$]h&]uh1hhhhK2hhhhubh)}(h).. |ohm| unicode:: U+02126 .. OHM SIGNh]hΩ}hjgsbah}(h]h ]h"]ohmah$]h&]uh1hhhhK3hhhhubh)}(h;.. |ordf| unicode:: U+000AA .. FEMININE ORDINAL INDICATORh]hª}hjvsbah}(h]h ]h"]ordfah$]h&]uh1hhhhK4hhhhubh)}(h<.. |ordm| unicode:: U+000BA .. MASCULINE ORDINAL INDICATORh]hº}hjsbah}(h]h ]h"]ordmah$]h&]uh1hhhhK5hhhhubh)}(h-.. |para| unicode:: U+000B6 .. PILCROW SIGNh]h¶}hjsbah}(h]h ]h"]paraah$]h&]uh1hhhhK6hhhhubh)}(h-.. |percnt| unicode:: U+00025 .. PERCENT SIGNh]h%}hjsbah}(h]h ]h"]percntah$]h&]uh1hhhhK7hhhhubh)}(h*.. |period| unicode:: U+0002E .. FULL STOPh]h.}hjsbah}(h]h ]h"]periodah$]h&]uh1hhhhK8hhhhubh)}(h*.. |plus| unicode:: U+0002B .. PLUS SIGNh]h+}hjsbah}(h]h ]h"]plusah$]h&]uh1hhhhK9hhhhubh)}(h0.. |plusmn| unicode:: U+000B1 .. PLUS-MINUS SIGNh]h±}hjsbah}(h]h ]h"]plusmnah$]h&]uh1hhhhK:hhhhubh)}(h+.. |pound| unicode:: U+000A3 .. POUND SIGNh]h£}hjsbah}(h]h ]h"]poundah$]h&]uh1hhhhK;hhhhubh)}(h... |quest| unicode:: U+0003F .. QUESTION MARKh]h?}hjsbah}(h]h ]h"]questah$]h&]uh1hhhhKhhhhubh)}(h1.. |rarr| unicode:: U+02192 .. RIGHTWARDS ARROWh]h→}hjsbah}(h]h ]h"]rarrah$]h&]uh1hhhhK?hhhhubh)}(h4.. |rcub| unicode:: U+0007D .. RIGHT CURLY BRACKETh]h}}hj*sbah}(h]h ]h"]rcubah$]h&]uh1hhhhK@hhhhubh)}(h<.. |rdquo| unicode:: U+0201D .. RIGHT DOUBLE QUOTATION MARKh]h”}hj9sbah}(h]h ]h"]rdquoah$]h&]uh1hhhhKAhhhhubh)}(h0.. |reg| unicode:: U+000AE .. REGISTERED SIGNh]h®}hjHsbah}(h]h ]h"]regah$]h&]uh1hhhhKBhhhhubh)}(h2.. |rpar| unicode:: U+00029 .. RIGHT PARENTHESISh]h)}hjWsbah}(h]h ]h"]rparah$]h&]uh1hhhhKChhhhubh)}(h5.. |rsqb| unicode:: U+0005D .. RIGHT SQUARE BRACKETh]h]}hjfsbah}(h]h ]h"]rsqbah$]h&]uh1hhhhKDhhhhubh)}(h<.. |rsquo| unicode:: U+02019 .. RIGHT SINGLE QUOTATION MARKh]h’}hjusbah}(h]h ]h"]rsquoah$]h&]uh1hhhhKEhhhhubh)}(h-.. |sect| unicode:: U+000A7 .. SECTION SIGNh]h§}hjsbah}(h]h ]h"]sectah$]h&]uh1hhhhKFhhhhubh)}(h*.. |semi| unicode:: U+0003B .. SEMICOLONh]h;}hjsbah}(h]h ]h"]semiah$]h&]uh1hhhhKGhhhhubh)}(h,.. |shy| unicode:: U+000AD .. SOFT HYPHENh]h­}hjsbah}(h]h ]h"]shyah$]h&]uh1hhhhKHhhhhubh)}(h(.. |sol| unicode:: U+0002F .. SOLIDUSh]h/}hjsbah}(h]h ]h"]solah$]h&]uh1hhhhKIhhhhubh)}(h,.. |sung| unicode:: U+0266A .. EIGHTH NOTEh]h♪}hjsbah}(h]h ]h"]sungah$]h&]uh1hhhhKJhhhhubh)}(h0.. |sup1| unicode:: U+000B9 .. SUPERSCRIPT ONEh]h¹}hjsbah}(h]h ]h"]sup1ah$]h&]uh1hhhhKKhhhhubh)}(h0.. |sup2| unicode:: U+000B2 .. SUPERSCRIPT TWOh]h²}hjsbah}(h]h ]h"]sup2ah$]h&]uh1hhhhKLhhhhubh)}(h2.. |sup3| unicode:: U+000B3 .. SUPERSCRIPT THREEh]h³}hjsbah}(h]h ]h"]sup3ah$]h&]uh1hhhhKMhhhhubh)}(h4.. |times| unicode:: U+000D7 .. MULTIPLICATION SIGNh]h×}hjsbah}(h]h ]h"]timesah$]h&]uh1hhhhKNhhhhubh)}(h0.. |trade| unicode:: U+02122 .. TRADE MARK SIGNh]h™}hj sbah}(h]h ]h"]tradeah$]h&]uh1hhhhKOhhhhubh)}(h... |uarr| unicode:: U+02191 .. UPWARDS ARROWh]h↑}hjsbah}(h]h ]h"]uarrah$]h&]uh1hhhhKPhhhhubh)}(h... |verbar| unicode:: U+0007C .. VERTICAL LINEh]h|}hj)sbah}(h]h ]h"]verbarah$]h&]uh1hhhhKQhhhhubh)}(h*.. |yen| unicode:: U+000A5 .. YEN SIGN h]h¥}hj8sbah}(h]h ]h"]yenah$]h&]uh1hhhhKRhhhhubhsection)}(hhh](htitle)}(hSuspend/Hibernation Notifiersh]hSuspend/Hibernation Notifiers}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjIhhhhhKubh field_list)}(hhh](hfield)}(hhh](h field_name)}(h Copyrighth]h Copyright}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjchhhKubh field_body)}(h|copy| 2016 Intel Corporation h]h paragraph)}(h|copy| 2016 Intel Corporationh](h©}(hj~hhhNhNubh 2016 Intel Corporation}(hj~hhhNhNubeh}(h]h ]h"]h$]h&]uh1j|hhhKhjxubah}(h]h ]h"]h$]h&]uh1jvhjcubeh}(h]h ]h"]h$]h&]uh1jahhhKhj^hhubjb)}(hhh](jg)}(hAuthorh]hAuthor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjhhhKubjw)}(h0Rafael J. Wysocki h]j})}(h.Rafael J. Wysocki h](hRafael J. Wysocki <}(hjhhhNhNubh reference)}(hrafael.j.wysocki@intel.comh]hrafael.j.wysocki@intel.com}(hjhhhNhNubah}(h]h ]h"]h$]h&]refuri!mailto:rafael.j.wysocki@intel.comuh1jhjubh>}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j|hhhK hjubah}(h]h ]h"]h$]h&]uh1jvhjubeh}(h]h ]h"]h$]h&]uh1jahhhK hj^hhubeh}(h]h ]h"]h$]h&]uh1j\hjIhhhhhKubj})}(hXOThere are some operations that subsystems or drivers may want to carry out before hibernation/suspend or after restore/resume, but they require the system to be fully functional, so the drivers' and subsystems' ``->suspend()`` and ``->resume()`` or even ``->prepare()`` and ``->complete()`` callbacks are not suitable for this purpose.h](hThere are some operations that subsystems or drivers may want to carry out before hibernation/suspend or after restore/resume, but they require the system to be fully functional, so the drivers’ and subsystems’ }(hjhhhNhNubhliteral)}(h``->suspend()``h]h ->suspend()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh and }(hjhhhNhNubj)}(h``->resume()``h]h ->resume()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh or even }(hjhhhNhNubj)}(h``->prepare()``h]h ->prepare()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh and }(hjhhhNhNubj)}(h``->complete()``h]h ->complete()}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh- callbacks are not suitable for this purpose.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j|hhhK hjIhhubj})}(hXFor example, device drivers may want to upload firmware to their devices after resume/restore, but they cannot do it by calling :c:func:`request_firmware()` from their ``->resume()`` or ``->complete()`` callback routines (user land processes are frozen at these points). The solution may be to load the firmware into memory before processes are frozen and upload it from there in the ``->resume()`` routine. A suspend/hibernation notifier may be used for that.h](hFor example, device drivers may want to upload firmware to their devices after resume/restore, but they cannot do it by calling }(hj?hhhNhNubh)}(h:c:func:`request_firmware()`h]j)}(hjIh]hrequest_firmware()}(hjKhhhNhNubah}(h]h ](xrefcc-funceh"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]refdocdriver-api/pm/notifiers refdomainjVreftypefunc refexplicitrefwarn reftargetrequest_firmwareuh1hhhhKhj?ubh from their }(hj?hhhNhNubj)}(h``->resume()``h]h ->resume()}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubh or }(hj?hhhNhNubj)}(h``->complete()``h]h ->complete()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubh callback routines (user land processes are frozen at these points). The solution may be to load the firmware into memory before processes are frozen and upload it from there in the }(hj?hhhNhNubj)}(h``->resume()``h]h ->resume()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubh? routine. A suspend/hibernation notifier may be used for that.}(hj?hhhNhNubeh}(h]h ]h"]h$]h&]uh1j|hhhKhjIhhubj})}(hSubsystems or drivers having such needs can register suspend notifiers that will be called upon the following events by the PM core:h]hSubsystems or drivers having such needs can register suspend notifiers that will be called upon the following events by the PM core:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhKhjIhhubhdefinition_list)}(hhh](hdefinition_list_item)}(hX``PM_HIBERNATION_PREPARE`` The system is going to hibernate, tasks will be frozen immediately. This is different from ``PM_SUSPEND_PREPARE`` below, because in this case additional work is done between the notifiers and the invocation of PM callbacks for the "freeze" transition. h](hterm)}(h``PM_HIBERNATION_PREPARE``h]j)}(hjh]hPM_HIBERNATION_PREPARE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhhhK!hjubh definition)}(hhh]j})}(hThe system is going to hibernate, tasks will be frozen immediately. This is different from ``PM_SUSPEND_PREPARE`` below, because in this case additional work is done between the notifiers and the invocation of PM callbacks for the "freeze" transition.h](h[The system is going to hibernate, tasks will be frozen immediately. This is different from }(hjhhhNhNubj)}(h``PM_SUSPEND_PREPARE``h]hPM_SUSPEND_PREPARE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh below, because in this case additional work is done between the notifiers and the invocation of PM callbacks for the “freeze” transition.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j|hhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhhK!hjubj)}(h``PM_POST_HIBERNATION`` The system memory state has been restored from a hibernation image or an error occurred during hibernation. Device restore callbacks have been executed and tasks have been thawed. h](j)}(h``PM_POST_HIBERNATION``h]j)}(hjh]hPM_POST_HIBERNATION}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhhhK&hj ubj)}(hhh]j})}(hThe system memory state has been restored from a hibernation image or an error occurred during hibernation. Device restore callbacks have been executed and tasks have been thawed.h]hThe system memory state has been restored from a hibernation image or an error occurred during hibernation. Device restore callbacks have been executed and tasks have been thawed.}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhK$hj(ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhhhK&hjhhubj)}(h``PM_RESTORE_PREPARE`` The system is going to restore a hibernation image. If all goes well, the restored image kernel will issue a ``PM_POST_HIBERNATION`` notification. h](j)}(h``PM_RESTORE_PREPARE``h]j)}(hjKh]hPM_RESTORE_PREPARE}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&]uh1jhhhK+hjEubj)}(hhh]j})}(hThe system is going to restore a hibernation image. If all goes well, the restored image kernel will issue a ``PM_POST_HIBERNATION`` notification.h](hnThe system is going to restore a hibernation image. If all goes well, the restored image kernel will issue a }(hjchhhNhNubj)}(h``PM_POST_HIBERNATION``h]hPM_POST_HIBERNATION}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubh notification.}(hjchhhNhNubeh}(h]h ]h"]h$]h&]uh1j|hhhK)hj`ubah}(h]h ]h"]h$]h&]uh1jhjEubeh}(h]h ]h"]h$]h&]uh1jhhhK+hjhhubj)}(h``PM_POST_RESTORE`` An error occurred during restore from hibernation. Device restore callbacks have been executed and tasks have been thawed. h](j)}(h``PM_POST_RESTORE``h]j)}(hjh]hPM_POST_RESTORE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhhhK/hjubj)}(hhh]j})}(h{An error occurred during restore from hibernation. Device restore callbacks have been executed and tasks have been thawed.h]h{An error occurred during restore from hibernation. Device restore callbacks have been executed and tasks have been thawed.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhK.hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhhK/hjhhubj)}(h<``PM_SUSPEND_PREPARE`` The system is preparing for suspend. h](j)}(h``PM_SUSPEND_PREPARE``h]j)}(hjh]hPM_SUSPEND_PREPARE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhhhK2hjubj)}(hhh]j})}(h$The system is preparing for suspend.h]h$The system is preparing for suspend.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhK2hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhhK2hjhhubj)}(h``PM_POST_SUSPEND`` The system has just resumed or an error occurred during suspend. Device resume callbacks have been executed and tasks have been thawed. h](j)}(h``PM_POST_SUSPEND``h]j)}(hjh]hPM_POST_SUSPEND}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhhhK6hjubj)}(hhh]j})}(hThe system has just resumed or an error occurred during suspend. Device resume callbacks have been executed and tasks have been thawed.h]hThe system has just resumed or an error occurred during suspend. Device resume callbacks have been executed and tasks have been thawed.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhK5hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhhK6hjhhubeh}(h]h ]h"]h$]h&]uh1jhjIhhhhhNubj})}(hIt is generally assumed that whatever the notifiers do for ``PM_HIBERNATION_PREPARE``, should be undone for ``PM_POST_HIBERNATION``. Analogously, operations carried out for ``PM_SUSPEND_PREPARE`` should be reversed for ``PM_POST_SUSPEND``.h](h;It is generally assumed that whatever the notifiers do for }(hj=hhhNhNubj)}(h``PM_HIBERNATION_PREPARE``h]hPM_HIBERNATION_PREPARE}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubh, should be undone for }(hj=hhhNhNubj)}(h``PM_POST_HIBERNATION``h]hPM_POST_HIBERNATION}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubh*. Analogously, operations carried out for }(hj=hhhNhNubj)}(h``PM_SUSPEND_PREPARE``h]hPM_SUSPEND_PREPARE}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubh should be reversed for }(hj=hhhNhNubj)}(h``PM_POST_SUSPEND``h]hPM_POST_SUSPEND}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubh.}(hj=hhhNhNubeh}(h]h ]h"]h$]h&]uh1j|hhhK8hjIhhubj})}(hMoreover, if one of the notifiers fails for the ``PM_HIBERNATION_PREPARE`` or ``PM_SUSPEND_PREPARE`` event, the notifiers that have already succeeded for that event will be called for ``PM_POST_HIBERNATION`` or ``PM_POST_SUSPEND``, respectively.h](h0Moreover, if one of the notifiers fails for the }(hjhhhNhNubj)}(h``PM_HIBERNATION_PREPARE``h]hPM_HIBERNATION_PREPARE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh or }(hjhhhNhNubj)}(h``PM_SUSPEND_PREPARE``h]hPM_SUSPEND_PREPARE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhT event, the notifiers that have already succeeded for that event will be called for }(hjhhhNhNubj)}(h``PM_POST_HIBERNATION``h]hPM_POST_HIBERNATION}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh or }(hjhhhNhNubj)}(h``PM_POST_SUSPEND``h]hPM_POST_SUSPEND}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh, respectively.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j|hhhK=hjIhhubj})}(hThe hibernation and suspend notifiers are called with :c:data:`pm_mutex` held. They are defined in the usual way, but their last argument is meaningless (it is always NULL).h](h6The hibernation and suspend notifiers are called with }(hjhhhNhNubh)}(h:c:data:`pm_mutex`h]j)}(hjh]hpm_mutex}(hjhhhNhNubah}(h]h ](jUjVc-dataeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocjb refdomainjVreftypedata refexplicitrefwarnjhpm_mutexuh1hhhhKBhjubhe held. They are defined in the usual way, but their last argument is meaningless (it is always NULL).}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j|hhhKBhjIhhubj})}(hXKTo register and/or unregister a suspend notifier use :c:func:`register_pm_notifier()` and :c:func:`unregister_pm_notifier()`, respectively (both defined in :file:`include/linux/suspend.h`). If you don't need to unregister the notifier, you can also use the :c:func:`pm_notifier()` macro defined in :file:`include/linux/suspend.h`.h](h5To register and/or unregister a suspend notifier use }(hj hhhNhNubh)}(h :c:func:`register_pm_notifier()`h]j)}(hj$ h]hregister_pm_notifier()}(hj& hhhNhNubah}(h]h ](jUjVc-funceh"]h$]h&]uh1jhj" ubah}(h]h ]h"]h$]h&]refdocjb refdomainjVreftypefunc refexplicitrefwarnjhregister_pm_notifieruh1hhhhKFhj ubh and }(hj hhhNhNubh)}(h":c:func:`unregister_pm_notifier()`h]j)}(hjG h]hunregister_pm_notifier()}(hjI hhhNhNubah}(h]h ](jUjVc-funceh"]h$]h&]uh1jhjE ubah}(h]h ]h"]h$]h&]refdocjb refdomainjVreftypefunc refexplicitrefwarnjhunregister_pm_notifieruh1hhhhKFhj ubh , respectively (both defined in }(hj hhhNhNubj)}(h:file:`include/linux/suspend.h`h]hinclude/linux/suspend.h}(hjh hhhNhNubah}(h]h ]fileah"]h$]h&]rolefileuh1jhj ubhI). If you don’t need to unregister the notifier, you can also use the }(hj hhhNhNubh)}(h:c:func:`pm_notifier()`h]j)}(hj h]h pm_notifier()}(hj hhhNhNubah}(h]h ](jUjVc-funceh"]h$]h&]uh1jhj} ubah}(h]h ]h"]h$]h&]refdocjb refdomainjVreftypefunc refexplicitrefwarnjh pm_notifieruh1hhhhKFhj ubh macro defined in }(hj hhhNhNubj)}(h:file:`include/linux/suspend.h`h]hinclude/linux/suspend.h}(hj hhhNhNubah}(h]h ]fileah"]h$]h&]rolefileuh1jhj ubh.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1j|hhhKFhjIhhubeh}(h]suspend-hibernation-notifiersah ]h"]suspend/hibernation notifiersah$]h&]uh1jGhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(jLN generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerj error_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}(hhhhhhj jjjj*jj9j-jHj<jWjKjfjZjujijjxjjjjjjjjjjjjjjjjj jjjj)jj8j,jGj;jVjJjejYjtjhjjwjjjjjjjjjjjjjjjjj jjj j(jj7j+jFj:jUjIjdjXjsjgjjvjjjjjjjjjjjjjjjjj jjj j'jj6j*jEj9jTjHjcjWjrjfjjujjjjjjjjjjjjjjjjjjjj j&jj5j)jDj8usubstitution_names}(amphߌaposhasthbrvbarj bsoljcentj*colonj9commajHcommatjWcopyjfcurrenjudarrjdegjdividejdollarjequalsjexcljfrac12jfrac14jfrac18jfrac34j frac38jfrac58j)frac78j8gtjGhalfjVhorbarjehyphenjtiexcljiquestjlaquojlarrjlcubjldquojlowbarjlparjlsqbjlsquoj ltjmicroj(middotj7nbspjFnotjUnumjdohmjsordfjordmjparajpercntjperiodjplusjplusmnjpoundjquestjquotj raquojrarrj'rcubj6rdquojEregjTrparjcrsqbjrrsquojsectjsemijshyjsoljsungjsup1jsup2jsup3jtimesjtradejuarrj&verbarj5yenjDurefnames}refids}nameids}j j s nametypes}j sh}j jIs footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}Rparse_messages]transform_messages] transformerN include_log])Documentation/driver-api/pm/notifiers.rst(NNNNta decorationNhhub.