[PATCH v4 2/6] i3c: master: pre-reserve boardinfo->init_dyn_addr when available

Przemysław Gaj
2019-12-10T10:15:42Z

It may be the case that SETDASA fails for some reason. Reserve
->init_dyn_addr when it's defined to prevent assigning this address
to another slave device. This way when device shows up we don't
have to re-assign addresses.

Signed-off-by: Przemysław Gaj <pgaj@cadence.com>
---
drivers/i3c/master.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/drivers/i3c/master.c b/drivers/i3c/master.c
index 5c06c41e6660..fab6e0609fca 100755
--- a/drivers/i3c/master.c
+++ b/drivers/i3c/master.c
@@ -1263,7 +1263,8 @@ static void i3c_master_put_i3c_addrs(struct i3c_dev_desc *dev)
I3C_ADDR_SLOT_FREE);

if (dev->boardinfo && dev->boardinfo->init_dyn_addr)
- i3c_bus_set_addr_slot_status(&master->bus, dev->info.dyn_addr,
+ i3c_bus_set_addr_slot_status(&master->bus,
+ dev->boardinfo->init_dyn_addr,
I3C_ADDR_SLOT_FREE);
}

@@ -1675,6 +1676,11 @@ static int i3c_master_bus_init(struct i3c_master_controller *master)
ret = -EBUSY;
goto err_detach_devs;
}
+
+ /* Reserve the slot. */
+ i3c_bus_set_addr_slot_status(&master->bus,
+ i3cboardinfo->init_dyn_addr,
+ I3C_ADDR_SLOT_I3C_DEV);
}

i3cdev = i3c_master_alloc_i3c_dev(master, &info);