soundwire: bus: check first if Slaves become UNATTACHED
authorPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Fri, 10 Jan 2020 21:57:31 +0000 (15:57 -0600)
committerVinod Koul <vkoul@kernel.org>
Tue, 14 Jan 2020 06:23:12 +0000 (11:53 +0530)
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 <pierre-louis.bossart@linux.intel.com>
Link: https://lore.kernel.org/r/20200110215731.30747-7-pierre-louis.bossart@linux.intel.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
drivers/soundwire/bus.c

index be5d437..66fd09e 100644 (file)
@@ -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);