• R
    PM / wakeup: Integrate mechanism to abort transitions in progress · 8a537ece
    Rafael J. Wysocki 提交于
    The system wakeup framework is not very consistent with respect to
    the way it handles suspend-to-idle and generally wakeup events
    occurring during transitions to system low-power states.
    
    First off, system transitions in progress are aborted by the event
    reporting helpers like pm_wakeup_event() only if the wakeup_count
    sysfs attribute is in use (as documented), but there are cases in
    which system-wide transitions should be aborted even if that is
    not the case.  For example, a wakeup signal from a designated
    wakeup device during system-wide PM transition, it should cause
    the transition to be aborted right away.
    
    Moreover, there is a freeze_wake() call in wakeup_source_activate(),
    but that really is only effective after suspend_freeze_state has
    been set to FREEZE_STATE_ENTER by freeze_enter().  However, it
    is very unlikely that wakeup_source_activate() will ever be called
    at that time, as it could only be triggered by a IRQF_NO_SUSPEND
    interrupt handler, so wakeups from suspend-to-idle don't really
    occur in wakeup_source_activate().
    
    At the same time there is a way to abort a system suspend in
    progress (or wake up the system from suspend-to-idle), which is by
    calling pm_system_wakeup(), but in turn that doesn't cause any
    wakeup source objects to be activated, so it will not be covered
    by wakeup source statistics and will not prevent the system from
    suspending again immediately (in case autosleep is used, for
    example).  Consequently, if anyone wants to abort system transitions
    in progress and allow the wakeup_count mechanism to work, they need
    to use both pm_system_wakeup() and pm_wakeup_event(), say, at the
    same time which is awkward.
    
    For the above reasons, make it possible to trigger
    pm_system_wakeup() from within wakeup_source_activate() and
    provide a new pm_wakeup_hard_event() helper to do so within the
    wakeup framework.
    Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
    8a537ece
wakeup.c 28.2 KB