mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 18:41:58 +09:00
Revert "i3c: master: Fix dynamic address leak when 'assigned-address' is present"
This reverts commit 8c77c55f45 which is
commit 851bd21cdb55e727ab29280bc9f6b678164f802a upstream.
It breaks the Android kernel abi and can be brought back in the future
in an abi-safe way if it is really needed.
Bug: 161946584
Change-Id: I1b3dbe3ece19354d604b386d3d99f5456f290d0b
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
@@ -1491,9 +1491,16 @@ static int i3c_master_reattach_i3c_dev(struct i3c_dev_desc *dev,
|
|||||||
u8 old_dyn_addr)
|
u8 old_dyn_addr)
|
||||||
{
|
{
|
||||||
struct i3c_master_controller *master = i3c_dev_get_master(dev);
|
struct i3c_master_controller *master = i3c_dev_get_master(dev);
|
||||||
|
enum i3c_addr_slot_status status;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (dev->info.dyn_addr != old_dyn_addr) {
|
if (dev->info.dyn_addr != old_dyn_addr &&
|
||||||
|
(!dev->boardinfo ||
|
||||||
|
dev->info.dyn_addr != dev->boardinfo->init_dyn_addr)) {
|
||||||
|
status = i3c_bus_get_addr_slot_status(&master->bus,
|
||||||
|
dev->info.dyn_addr);
|
||||||
|
if (status != I3C_ADDR_SLOT_FREE)
|
||||||
|
return -EBUSY;
|
||||||
i3c_bus_set_addr_slot_status(&master->bus,
|
i3c_bus_set_addr_slot_status(&master->bus,
|
||||||
dev->info.dyn_addr,
|
dev->info.dyn_addr,
|
||||||
I3C_ADDR_SLOT_I3C_DEV);
|
I3C_ADDR_SLOT_I3C_DEV);
|
||||||
@@ -1895,10 +1902,9 @@ static int i3c_master_bus_init(struct i3c_master_controller *master)
|
|||||||
goto err_rstdaa;
|
goto err_rstdaa;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Do not mark as occupied until real device exist in bus */
|
|
||||||
i3c_bus_set_addr_slot_status_mask(&master->bus,
|
i3c_bus_set_addr_slot_status_mask(&master->bus,
|
||||||
i3cboardinfo->init_dyn_addr,
|
i3cboardinfo->init_dyn_addr,
|
||||||
I3C_ADDR_SLOT_EXT_DESIRED,
|
I3C_ADDR_SLOT_I3C_DEV | I3C_ADDR_SLOT_EXT_DESIRED,
|
||||||
I3C_ADDR_SLOT_EXT_STATUS_MASK);
|
I3C_ADDR_SLOT_EXT_STATUS_MASK);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -2062,8 +2068,7 @@ int i3c_master_add_i3c_dev_locked(struct i3c_master_controller *master,
|
|||||||
else
|
else
|
||||||
expected_dyn_addr = newdev->info.dyn_addr;
|
expected_dyn_addr = newdev->info.dyn_addr;
|
||||||
|
|
||||||
if (newdev->info.dyn_addr != expected_dyn_addr &&
|
if (newdev->info.dyn_addr != expected_dyn_addr) {
|
||||||
i3c_bus_get_addr_slot_status(&master->bus, expected_dyn_addr) == I3C_ADDR_SLOT_FREE) {
|
|
||||||
/*
|
/*
|
||||||
* Try to apply the expected dynamic address. If it fails, keep
|
* Try to apply the expected dynamic address. If it fails, keep
|
||||||
* the address assigned by the master.
|
* the address assigned by the master.
|
||||||
|
|||||||
Reference in New Issue
Block a user