PM/Suspend: Introduce two new platform callbacks to avoid breakage
[safe/jmp/linux-2.6] / include / linux / suspend.h
index 3e3a436..795032e 100644 (file)
@@ -58,10 +58,17 @@ typedef int __bitwise suspend_state_t;
  *     by @begin().
  *     @prepare() is called right after devices have been suspended (ie. the
  *     appropriate .suspend() method has been executed for each device) and
- *     before the nonboot CPUs are disabled (it is executed with IRQs enabled).
- *     This callback is optional.  It returns 0 on success or a negative
- *     error code otherwise, in which case the system cannot enter the desired
- *     sleep state (@enter() and @finish() will not be called in that case).
+ *     before device drivers' late suspend callbacks are executed.  It returns
+ *     0 on success or a negative error code otherwise, in which case the
+ *     system cannot enter the desired sleep state (@prepare_late(), @enter(),
+ *     @wake(), and @finish() will not be called in that case).
+ *
+ * @prepare_late: Finish preparing the platform for entering the system sleep
+ *     state indicated by @begin().
+ *     @prepare_late is called before disabling nonboot CPUs and after
+ *     device drivers' late suspend callbacks have been executed.  It returns
+ *     0 on success or a negative error code otherwise, in which case the
+ *     system cannot enter the desired sleep state (@enter() and @wake()).
  *
  * @enter: Enter the system sleep state indicated by @begin() or represented by
  *     the argument if @begin() is not implemented.
@@ -69,19 +76,26 @@ typedef int __bitwise suspend_state_t;
  *     error code otherwise, in which case the system cannot enter the desired
  *     sleep state.
  *
- * @finish: Called when the system has just left a sleep state, right after
- *     the nonboot CPUs have been enabled and before devices are resumed (it is
- *     executed with IRQs enabled).
+ * @wake: Called when the system has just left a sleep state, right after
+ *     the nonboot CPUs have been enabled and before device drivers' early
+ *     resume callbacks are executed.
+ *     This callback is optional, but should be implemented by the platforms
+ *     that implement @prepare_late().  If implemented, it is always called
+ *     after @enter(), even if @enter() fails.
+ *
+ * @finish: Finish wake-up of the platform.
+ *     @finish is called right prior to calling device drivers' regular suspend
+ *     callbacks.
  *     This callback is optional, but should be implemented by the platforms
  *     that implement @prepare().  If implemented, it is always called after
- *     @enter() (even if @enter() fails).
+ *     @enter() and @wake(), if implemented, even if any of them fails.
  *
  * @end: Called by the PM core right after resuming devices, to indicate to
  *     the platform that the system has returned to the working state or
  *     the transition to the sleep state has been aborted.
  *     This callback is optional, but should be implemented by the platforms
- *     that implement @begin(), but platforms implementing @begin() should
- *     also provide a @end() which cleans up transitions aborted before
+ *     that implement @begin().  Accordingly, platforms implementing @begin()
+ *     should also provide a @end() which cleans up transitions aborted before
  *     @enter().
  *
  * @recover: Recover the platform from a suspend failure.
@@ -93,7 +107,9 @@ struct platform_suspend_ops {
        int (*valid)(suspend_state_t state);
        int (*begin)(suspend_state_t state);
        int (*prepare)(void);
+       int (*prepare_late)(void);
        int (*enter)(suspend_state_t state);
+       void (*wake)(void);
        void (*finish)(void);
        void (*end)(void);
        void (*recover)(void);