• Pierre-Louis Bossart's avatar
    soundwire: sdw_slave: add enumeration_complete structure · fbbff363
    Pierre-Louis Bossart authored
    
    
    When the Master starts the bus (be it during the initial boot or
    system resume), it usually performs a HardReset to make sure
    electrical levels are correct, then enables the control channel.
    
    While the PM framework guarantees that the Slave devices will only
    become 'active' once the Master completes the bus initialization,
    there is still a risk of a race condition: the Slave enumeration is
    handled in a separate interrupt thread triggered by hardware status
    changes, so the Slave device may not be ready to accept commands when
    the Slave driver tries to access the registers and restore settings in
    its resume or pm_runtime_resume callbacks. In those cases, any
    read/write commands from/to the Slave device will result in a timeout.
    
    This patch adds an enumeration_complete structure. When the bus is
    goes through a HardReset sequence and restarted, the Slave will be
    marked as UNATTACHED, which will result in a call to
    init_completion().
    
    When the Slave reports its presence during PING frames as a non-zero
    Device, the Master hardware will issue an interrupt and the bus driver
    will invoke complete(). The order between init_completion()/complete()
    is predictable since this is a Master-initiated transition.
    
    The Slave driver may use wait_for_completion() in its resume callback.
    When regmap is used, the Slave driver will typically set its regmap in
    cache-only mode on suspend, then on resume block on
    wait_for_completion(&enumeration_complete) to guarantee it is safe to
    start read/write transactions. It may then exit the cache-only mode
    and use a regmap_sync to restore settings. All these steps are
    optional, their use completely depends on the Slave device
    capabilities and how the Slave driver is implemented.
    Signed-off-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
    Link: https://lore.kernel.org/r/20191212014507.28050-3-pierre-louis.bossart@linux.intel.com
    
    Signed-off-by: default avatarVinod Koul <vkoul@kernel.org>
    fbbff363
sdw.h 25.5 KB