PM: Add flag for devices capable of generating run-time wake-up events
authorRafael J. Wysocki <rjw@sisk.pl>
Thu, 3 Dec 2009 20:19:18 +0000 (21:19 +0100)
committerRafael J. Wysocki <rjw@sisk.pl>
Sun, 6 Dec 2009 15:17:57 +0000 (16:17 +0100)
Apparently, there are devices that can wake up the system from sleep
states and yet are incapable of generating wake-up events at run
time.  Thus, introduce a flag indicating if given device is capable
of generating run-time wake-up events.

Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Documentation/power/runtime_pm.txt
include/linux/pm.h
include/linux/pm_runtime.h

index 6bb25cb..4a3109b 100644 (file)
@@ -71,9 +71,9 @@ what to do to handle the device).
     purpose).
 
 In particular, if the driver requires remote wakeup capability for proper
     purpose).
 
 In particular, if the driver requires remote wakeup capability for proper
-functioning and device_may_wakeup() returns 'false' for the device, then
+functioning and device_run_wake() returns 'false' for the device, then
 ->runtime_suspend() should return -EBUSY.  On the other hand, if
 ->runtime_suspend() should return -EBUSY.  On the other hand, if
-device_may_wakeup() returns 'true' for the device and the device is put
+device_run_wake() returns 'true' for the device and the device is put
 into a low power state during the execution of its bus type's
 ->runtime_suspend(), it is expected that remote wake-up (i.e. hardware mechanism
 allowing the device to request a change of its power state, such as PCI PME)
 into a low power state during the execution of its bus type's
 ->runtime_suspend(), it is expected that remote wake-up (i.e. hardware mechanism
 allowing the device to request a change of its power state, such as PCI PME)
@@ -215,6 +215,9 @@ defined in include/linux/pm.h:
       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"
 
       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"
 
+  unsigned int run_wake;
+    - set if the device is capable of generating run-time wake-up events
+
   enum rpm_status runtime_status;
     - the run-time PM status of the device; this field's initial value is
       RPM_SUSPENDED, which means that each device is initially regarded by the
   enum rpm_status runtime_status;
     - the run-time PM status of the device; this field's initial value is
       RPM_SUSPENDED, which means that each device is initially regarded by the
index 3b7e04b..0d65934 100644 (file)
@@ -178,9 +178,10 @@ typedef struct pm_message {
  *     This need not mean that the device should be put into a low power state.
  *     For example, if the device is behind a link which is about to be turned
  *     off, the device may remain at full power.  If the device does go to low
  *     This need not mean that the device should be put into a low power state.
  *     For example, if the device is behind a link which is about to be turned
  *     off, the device may remain at full power.  If the device does go to low
- *     power and if device_may_wakeup(dev) is true, remote wake-up (i.e., a
- *     hardware mechanism allowing the device to request a change of its power
- *     state, such as PCI PME) should be enabled for it.
+ *     power and is capable of generating run-time wake-up events, remote
+ *     wake-up (i.e., a hardware mechanism allowing the device to request a
+ *     change of its power state via a wake-up event, such as PCI PME) should
+ *     be enabled for it.
  *
  * @runtime_resume: Put the device into the fully active state in response to a
  *     wake-up event generated by hardware or at the request of software.  If
  *
  * @runtime_resume: Put the device into the fully active state in response to a
  *     wake-up event generated by hardware or at the request of software.  If
@@ -428,6 +429,7 @@ struct dev_pm_info {
        unsigned int            idle_notification:1;
        unsigned int            request_pending:1;
        unsigned int            deferred_resume:1;
        unsigned int            idle_notification:1;
        unsigned int            request_pending:1;
        unsigned int            deferred_resume:1;
+       unsigned int            run_wake:1;
        enum rpm_request        request;
        enum rpm_status         runtime_status;
        int                     runtime_error;
        enum rpm_request        request;
        enum rpm_status         runtime_status;
        int                     runtime_error;
index 4408704..370ce0a 100644 (file)
@@ -50,6 +50,16 @@ static inline void pm_runtime_put_noidle(struct device *dev)
        atomic_add_unless(&dev->power.usage_count, -1, 0);
 }
 
        atomic_add_unless(&dev->power.usage_count, -1, 0);
 }
 
+static inline bool device_run_wake(struct device *dev)
+{
+       return dev->power.run_wake;
+}
+
+static inline void device_set_run_wake(struct device *dev, bool enable)
+{
+       dev->power.run_wake = enable;
+}
+
 #else /* !CONFIG_PM_RUNTIME */
 
 static inline int pm_runtime_idle(struct device *dev) { return -ENOSYS; }
 #else /* !CONFIG_PM_RUNTIME */
 
 static inline int pm_runtime_idle(struct device *dev) { return -ENOSYS; }
@@ -73,6 +83,8 @@ static inline bool pm_children_suspended(struct device *dev) { return false; }
 static inline void pm_suspend_ignore_children(struct device *dev, bool en) {}
 static inline void pm_runtime_get_noresume(struct device *dev) {}
 static inline void pm_runtime_put_noidle(struct device *dev) {}
 static inline void pm_suspend_ignore_children(struct device *dev, bool en) {}
 static inline void pm_runtime_get_noresume(struct device *dev) {}
 static inline void pm_runtime_put_noidle(struct device *dev) {}
+static inline bool device_run_wake(struct device *dev) { return false; }
+static inline void device_set_run_wake(struct device *dev, bool enable) {}
 
 #endif /* !CONFIG_PM_RUNTIME */
 
 
 #endif /* !CONFIG_PM_RUNTIME */