mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 22:21:40 +00:00
soundwire: bus: fix race condition with enumeration_complete signaling
This patch adds the signaling needed for Slave drivers to wait until the enumeration completes so that race conditions when issuing read/write commands are avoided. The calls for wait_for_completion() will be added in codec drivers in follow-up patches. The order between init_completion() and complete() is deterministic, the Slave is marked as UNATTACHED either during a Master-initiated HardReset, or when the hardware detects the Slave no longer reports as ATTACHED. Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> Link: https://lore.kernel.org/r/20200115000844.14695-3-pierre-louis.bossart@linux.intel.com Signed-off-by: Vinod Koul <vkoul@kernel.org>
This commit is contained in:
parent
2140b66b5d
commit
fb9469e54f
@ -610,6 +610,26 @@ static void sdw_modify_slave_status(struct sdw_slave *slave,
|
||||
enum sdw_slave_status status)
|
||||
{
|
||||
mutex_lock(&slave->bus->bus_lock);
|
||||
|
||||
dev_vdbg(&slave->dev,
|
||||
"%s: changing status slave %d status %d new status %d\n",
|
||||
__func__, slave->dev_num, slave->status, status);
|
||||
|
||||
if (status == SDW_SLAVE_UNATTACHED) {
|
||||
dev_dbg(&slave->dev,
|
||||
"%s: initializing completion for Slave %d\n",
|
||||
__func__, slave->dev_num);
|
||||
|
||||
init_completion(&slave->enumeration_complete);
|
||||
|
||||
} else if ((status == SDW_SLAVE_ATTACHED) &&
|
||||
(slave->status == SDW_SLAVE_UNATTACHED)) {
|
||||
dev_dbg(&slave->dev,
|
||||
"%s: signaling completion for Slave %d\n",
|
||||
__func__, slave->dev_num);
|
||||
|
||||
complete(&slave->enumeration_complete);
|
||||
}
|
||||
slave->status = status;
|
||||
mutex_unlock(&slave->bus->bus_lock);
|
||||
}
|
||||
|
@ -46,6 +46,7 @@ static int sdw_slave_add(struct sdw_bus *bus,
|
||||
slave->dev.of_node = of_node_get(to_of_node(fwnode));
|
||||
slave->bus = bus;
|
||||
slave->status = SDW_SLAVE_UNATTACHED;
|
||||
init_completion(&slave->enumeration_complete);
|
||||
slave->dev_num = 0;
|
||||
init_completion(&slave->probe_complete);
|
||||
slave->probed = false;
|
||||
|
Loading…
Reference in New Issue
Block a user