soundwire: bus: Don't lose unattach notifications
Ensure that if sdw_handle_slave_status() sees a peripheral has dropped off the bus it reports it to the client driver. If there are any devices reporting on address 0 it bails out after programming the device IDs. So it never reaches the second loop that calls sdw_update_slave_status(). If the missing device is one that is now showing as unenumerated it has been given a device ID so will report as attached next time sdw_handle_slave_status() runs. With the previous code the client driver would only see another ATTACHED notification because the UNATTACHED state was lost when sdw_handle_slave_status() bailed out after programming the device ID. This shows up most when the peripheral has to be reset after downloading updated firmware and there are multiple of these peripherals on the bus. They will all return to unenumerated state after the reset, and then there is a mix of unattached, attached and unenumerated PING states from the peripherals, as each is reset and they reboot. Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com> Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> Link: https://lore.kernel.org/r/20220914160248.1047627-3-rf@opensource.cirrus.com Signed-off-by: Vinod Koul <vkoul@kernel.org>
This commit is contained in:
parent
fbbc73a20f
commit
f605f32e59
@ -1767,6 +1767,11 @@ int sdw_handle_slave_status(struct sdw_bus *bus,
|
||||
dev_warn(&slave->dev, "Slave %d state check1: UNATTACHED, status was %d\n",
|
||||
i, slave->status);
|
||||
sdw_modify_slave_status(slave, SDW_SLAVE_UNATTACHED);
|
||||
|
||||
/* Ensure driver knows that peripheral unattached */
|
||||
ret = sdw_update_slave_status(slave, status[i]);
|
||||
if (ret < 0)
|
||||
dev_warn(&slave->dev, "Update Slave status failed:%d\n", ret);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user