From: Pierre-Louis Bossart Date: Fri, 10 Jan 2020 21:57:31 +0000 (-0600) Subject: soundwire: bus: check first if Slaves become UNATTACHED X-Git-Tag: v5.10.7~3368^2~7^2~9 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=6106190158d6b6a064c907a2ba3e063d06f89eaa;p=platform%2Fkernel%2Flinux-rpi.git soundwire: bus: check first if Slaves become UNATTACHED Before checking for the presence of Device0, we first need to clean-up the internal state of Slaves that are no longer attached. Signed-off-by: Pierre-Louis Bossart Link: https://lore.kernel.org/r/20200110215731.30747-7-pierre-louis.bossart@linux.intel.com Signed-off-by: Vinod Koul --- diff --git a/drivers/soundwire/bus.c b/drivers/soundwire/bus.c index be5d437..66fd09e 100644 --- a/drivers/soundwire/bus.c +++ b/drivers/soundwire/bus.c @@ -979,6 +979,24 @@ int sdw_handle_slave_status(struct sdw_bus *bus, struct sdw_slave *slave; int i, ret = 0; + /* first check if any Slaves fell off the bus */ + for (i = 1; i <= SDW_MAX_DEVICES; i++) { + mutex_lock(&bus->bus_lock); + if (test_bit(i, bus->assigned) == false) { + mutex_unlock(&bus->bus_lock); + continue; + } + mutex_unlock(&bus->bus_lock); + + slave = sdw_get_slave(bus, i); + if (!slave) + continue; + + if (status[i] == SDW_SLAVE_UNATTACHED && + slave->status != SDW_SLAVE_UNATTACHED) + sdw_modify_slave_status(slave, SDW_SLAVE_UNATTACHED); + } + if (status[0] == SDW_SLAVE_ATTACHED) { dev_dbg(bus->dev, "Slave attached, programming device number\n"); ret = sdw_program_device_num(bus);