}
 EXPORT_SYMBOL(sdw_extract_slave_id);
 
-static int sdw_program_device_num(struct sdw_bus *bus)
+static int sdw_program_device_num(struct sdw_bus *bus, bool *programmed)
 {
        u8 buf[SDW_NUM_DEV_ID_REGISTERS] = {0};
        struct sdw_slave *slave, *_s;
        int count = 0, ret;
        u64 addr;
 
+       *programmed = false;
+
        /* No Slave, so use raw xfer api */
        ret = sdw_fill_msg(&msg, NULL, SDW_SCP_DEVID_0,
                           SDW_NUM_DEV_ID_REGISTERS, 0, SDW_MSG_FLAG_READ, buf);
                                        return ret;
                                }
 
+                               *programmed = true;
+
                                break;
                        }
                }
 {
        enum sdw_slave_status prev_status;
        struct sdw_slave *slave;
-       bool attached_initializing;
+       bool attached_initializing, id_programmed;
        int i, ret = 0;
 
        /* first check if any Slaves fell off the bus */
 
        if (status[0] == SDW_SLAVE_ATTACHED) {
                dev_dbg(bus->dev, "Slave attached, programming device number\n");
-               ret = sdw_program_device_num(bus);
-               if (ret < 0)
-                       dev_err(bus->dev, "Slave attach failed: %d\n", ret);
+
                /*
-                * programming a device number will have side effects,
-                * so we deal with other devices at a later time
+                * Programming a device number will have side effects,
+                * so we deal with other devices at a later time.
+                * This relies on those devices reporting ATTACHED, which will
+                * trigger another call to this function. This will only
+                * happen if at least one device ID was programmed.
+                * Error returns from sdw_program_device_num() are currently
+                * ignored because there's no useful recovery that can be done.
+                * Returning the error here could result in the current status
+                * of other devices not being handled, because if no device IDs
+                * were programmed there's nothing to guarantee a status change
+                * to trigger another call to this function.
                 */
-               return ret;
+               sdw_program_device_num(bus, &id_programmed);
+               if (id_programmed)
+                       return 0;
        }
 
        /* Continue to check other slave statuses */