• Lv Zheng's avatar
    ACPI / EC: Add PM operations to improve event handling for suspend process · 39a2a2aa
    Lv Zheng authored
    In the original EC driver, though the event handling is not explicitly
    stopped, the EC driver is actually not able to handle events during the
    noirq stage as the EC driver is not prepared to handle the EC events in the
    polling mode. So if there is no advance_transaction() triggered, the EC
    driver couldn't notice the EC events.
    However, do we actually need to handle EC events during suspend/resume
    stage? EC events are mostly useless for the suspend/resume period (key
    strokes and battery/thermal updates, etc.,), and the useful ones (lid
    close, power/sleep button press) should have already been delivered to the
    OSPM to trigger the power saving operations.
    Thus this patch implements acpi_ec_disable_event() to be a reverse call of
    acpi_ec_enable_event(), with which, the EC driver is able to stop handling
    the EC events in a position before entering the noirq stage.
    
    Since there are actually 2 choices for us:
    1. implement event handling in polling mode;
    2. stop event handling before entering noirq stage.
    And this patch only implements the second choice using .suspend() callback.
    Thus this is experimental (first choice is better? or different hook
    position is better?). This patch finally keeps the old behavior by default
    and prepares a boot parameter to enable this feature.
    
    The differences of the event handling availability between the old behavior
    (this patch is not applied) and the new behavior (this patch is applied)
    are as follows:
                            !FreezeEvents   FreezeEvents
    before suspend          Y               Y
    suspend before EC       Y               Y
    suspend after EC        Y               N
    suspend_late            Y               N
    suspend_noirq           Y (actually N)  N
    resume_noirq            Y (actually N)  N
    resume_late             Y (actually N)  N
    resume before EC        Y (actually N)  N
    resume after EC         Y               Y
    after resume            Y               Y
    Where "actually N" means if there is no EC transactions, the EC driver
    is actually not able to notice the pending events.
    
    We can see that FreezeEvents is the only approach now can actually flush
    the EC event handling with both query commands and _Qxx evaluations
    flushed, other modes can only flush the EC event handling with only query
    commands flushed, _Qxx evaluations occurred after stopping the EC driver
    may end up failure due to the failure of the EC transaction carried out in
    the _Qxx control methods.
    
    We also can see that this feature should be able to trigger some platform
    notifications later than resuming other drivers.
    Signed-off-by: default avatarLv Zheng <lv.zheng@intel.com>
    Tested-by: default avatarTodd E Brandt <todd.e.brandt@linux.intel.com>
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    39a2a2aa
ec.c 49.7 KB