• M
    PM / Suspend: Add .suspend_again() callback to suspend_ops · 3b5fe852
    MyungJoo Ham 提交于
    A system or a device may need to control suspend/wakeup events. It may
    want to wakeup the system after a predefined amount of time or at a
    predefined event decided while entering suspend for polling or delayed
    work. Then, it may want to enter suspend again if its predefined wakeup
    condition is the only wakeup reason and there is no outstanding events;
    thus, it does not wakeup the userspace unnecessary or unnecessary
    devices and keeps suspended as long as possible (saving the power).
    
    Enabling a system to wakeup after a specified time can be easily
    achieved by using RTC. However, to enter suspend again immediately
    without invoking userland and unrelated devices, we need additional
    features in the suspend framework.
    
    Such need comes from:
    
     1. Monitoring a critical device status without interrupts that can
    wakeup the system. (in-suspend polling)
     An example is ambient temperature monitoring that needs to shut down
    the system or a specific device function if it is too hot or cold. The
    temperature of a specific device may be needed to be monitored as well;
    e.g., a charger monitors battery temperature in order to stop charging
    if overheated.
    
     2. Execute critical "delayed work" at suspend.
     A driver or a system/board may have a delayed work (or any similar
    things) that it wants to execute at the requested time.
     For example, some chargers want to check the battery voltage some
    time (e.g., 30 seconds) after the battery is fully charged and the
    charger has stopped. Then, the charger restarts charging if the voltage
    has dropped more than a threshold, which is smaller than "restart-charger"
    voltage, which is a threshold to restart charging regardless of the
    time passed.
    
    This patch allows to add "suspend_again" callback at struct
    platform_suspend_ops and let the "suspend_again" callback return true if
    the system is required to enter suspend again after the current instance
    of wakeup. Device-wise suspend_again implemented at dev_pm_ops or
    syscore is not done because: a) suspend_again feature is usually under
    platform-wise decision and controls the behavior of the whole platform
    and b) There are very limited devices related to the usage cases of
    suspend_again; chargers and temperature sensors are mentioned so far.
    
    With suspend_again callback registered at struct platform_suspend_ops
    suspend_ops in kernel/power/suspend.c with suspend_set_ops by the
    platform, the suspend framework tries to enter suspend again by
    looping suspend_enter() if suspend_again has returned true and there has
    been no errors in the suspending sequence or pending wakeups (by
    pm_wakeup_pending).
    
    Tested at Exynos4-NURI.
    
    [rjw: Fixed up kerneldoc comment for suspend_enter().]
    Signed-off-by: NMyungJoo Ham <myungjoo.ham@samsung.com>
    Signed-off-by: NKyungmin Park <kyungmin.park@samsung.com>
    Acked-by: NPavel Machek <pavel@ucw.cz>
    Signed-off-by: NRafael J. Wysocki <rjw@sisk.pl>
    3b5fe852
suspend.h 12.1 KB