• Rafael J. Wysocki's avatar
    ACPI: EC: Make the event work state machine visible · c33676aa
    Rafael J. Wysocki authored
    The EC driver uses a relatively simple state machine for the event
    work handling, but it is not really straightforward to figure out.
    
    The states are as follows:
    
     "Ready": The event handling work can be submitted.
    
      In this state, the EC_FLAGS_QUERY_PENDING flag is clear.
    
     "In progress": The event handling work is pending or is being
                    processed.  It cannot be submitted again.
    
      In ths state, the EC_FLAGS_QUERY_PENDING flag is set and both the
      events_to_process count is nonzero and the EC_FLAGS_QUERY_GUARDING
      flag is clear.
    
     "Complete": The event handling work has been completed, but it still
                 cannot be submitted again.
    
      In ths state, the EC_FLAGS_QUERY_PENDING flag is set and the
      events_to_process count is zero or the EC_FLAGS_QUERY_GUARDING
      flag is set.
    
    The state changes from "Ready" to "In progress" when new event is
    detected by advance_transaction() and acpi_ec_submit_event() is
    called by it.
    
    Next, the state can change from "In progress" directly to "Ready" in
    the following situations:
    
     * ec_event_clearing is ACPI_EC_EVT_TIMING_STATUS and the state of
       an ACPI_EC_COMMAND_QUERY transaction becomes ACPI_EC_COMMAND_POLL.
    
     * ec_event_clearing is ACPI_EC_EVT_TIMING_QUERY and the state of
       an ACPI_EC_COMMAND_QUERY transaction becomes
       ACPI_EC_COMMAND_COMPLETE.
    
     * ec_event_clearing is either ACPI_EC_EVT_TIMING_STATUS or
       ACPI_EC_EVT_TIMING_QUERY and there are no more events to
       process (ie. ec->events_to_process becomes 0).
    
    If ec_event_clearing is ACPI_EC_EVT_TIMING_EVENT, however, the
    state must change from "In progress" to "Complete" before it
    can change to "Ready".  The changes from "In progress" to
    "Complete" in that case occur in the following situations:
    
     * The state of an ACPI_EC_COMMAND_QUERY transaction becomes
       ACPI_EC_COMMAND_COMPLETE.
    
     * There are no more events to process (ie. ec->events_to_process
       becomes 0).
    
    Finally, the state changes from "Complete" to "Ready" when
    advance_transaction() is invoked when the state is "Complete" and
    the state of the current transaction is not ACPI_EC_COMMAND_POLL.
    
    To make this state machine visible in the code, add a new
    event_state field to struct acpi_ec and modify the code to use
    it istead the EC_FLAGS_QUERY_PENDING and EC_FLAGS_QUERY_GUARDING
    flags.
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    c33676aa
internal.h 9.58 KB