• Lv Zheng's avatar
    ACPI / EC: Add PM operations to improve event handling for resume process · c2b46d67
    Lv Zheng authored
    This patch makes 2 changes:
    
    1. Restore old behavior
    Originally, EC driver stops handling both events and transactions in
    acpi_ec_block_transactions(), and restarts to handle transactions in
    acpi_ec_unblock_transactions_early(), restarts to handle both events and
    transactions in acpi_ec_unblock_transactions().
    While currently, EC driver still stops handling both events and
    transactions in acpi_ec_block_transactions(), but restarts to handle both
    events and transactions in acpi_ec_unblock_transactions_early().
    This patch tries to restore the old behavior by dropping
    __acpi_ec_enable_event() from acpi_unblock_transactions_early().
    
    2. Improve old behavior
    However this still cannot fix the real issue as both of the
    acpi_ec_unblock_xxx() functions are invoked in the noirq stage. Since the
    EC driver actually doesn't implement the event handling in the polling
    mode, re-enabling the event handling too early in the noirq stage could
    result in the problem that if there is no triggering source causing
    advance_transaction() to be invoked, pending SCI_EVT cannot be detected by
    the EC driver and _Qxx cannot be triggered.
    It actually makes sense to restart the event handling in any point during
    resuming after the noirq stage. Just like the boot stage where the event
    handling is enabled in .add(), this patch further moves
    acpi_ec_enable_event() to .resume(). After doing that, the following 2
    functions can be combined:
    acpi_ec_unblock_transactions_early()/acpi_ec_unblock_transactions().
    
    The differences of the event handling availability between the old behavior
    (this patch isn't applied) and the new behavior (this patch is applied) are
    as follows:
                            !Applied        Applied
    before suspend          Y               Y
    suspend before EC       Y               Y
    suspend after EC        Y               Y
    suspend_late            Y               Y
    suspend_noirq           Y (actually N)  Y (actually N)
    resume_noirq            Y (actually N)  Y (actually N)
    resume_late             Y (actually N)  Y (actually N)
    resume before EC        Y (actually N)  Y (actually N)
    resume after EC         Y (actually N)  Y
    after resume            Y (actually N)  Y
    Where "actually N" means if there is no triggering source, the EC driver
    is actually not able to notice the pending SCI_EVT occurred in the noirq
    stage. So we can clearly see that this patch has improved the situation.
    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>
    c2b46d67
sleep.c 22.4 KB