mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 18:41:58 +09:00
Revert "i3c: master: Extend address status bit to 4 and add I3C_ADDR_SLOT_EXT_DESIRED"
This reverts commit 432b688424 which is
commit 2f552fa280590e61bd3dbe66a7b54b99caa642a4 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: I81c1f29aa2ad7e5776c8c7dfd9257d866b943d54
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
@@ -341,7 +341,7 @@ struct bus_type i3c_bus_type = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static enum i3c_addr_slot_status
|
static enum i3c_addr_slot_status
|
||||||
i3c_bus_get_addr_slot_status_mask(struct i3c_bus *bus, u16 addr, u32 mask)
|
i3c_bus_get_addr_slot_status(struct i3c_bus *bus, u16 addr)
|
||||||
{
|
{
|
||||||
unsigned long status;
|
unsigned long status;
|
||||||
int bitpos = addr * I3C_ADDR_SLOT_STATUS_BITS;
|
int bitpos = addr * I3C_ADDR_SLOT_STATUS_BITS;
|
||||||
@@ -352,17 +352,11 @@ i3c_bus_get_addr_slot_status_mask(struct i3c_bus *bus, u16 addr, u32 mask)
|
|||||||
status = bus->addrslots[bitpos / BITS_PER_LONG];
|
status = bus->addrslots[bitpos / BITS_PER_LONG];
|
||||||
status >>= bitpos % BITS_PER_LONG;
|
status >>= bitpos % BITS_PER_LONG;
|
||||||
|
|
||||||
return status & mask;
|
return status & I3C_ADDR_SLOT_STATUS_MASK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static enum i3c_addr_slot_status
|
static void i3c_bus_set_addr_slot_status(struct i3c_bus *bus, u16 addr,
|
||||||
i3c_bus_get_addr_slot_status(struct i3c_bus *bus, u16 addr)
|
enum i3c_addr_slot_status status)
|
||||||
{
|
|
||||||
return i3c_bus_get_addr_slot_status_mask(bus, addr, I3C_ADDR_SLOT_STATUS_MASK);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void i3c_bus_set_addr_slot_status_mask(struct i3c_bus *bus, u16 addr,
|
|
||||||
enum i3c_addr_slot_status status, u32 mask)
|
|
||||||
{
|
{
|
||||||
int bitpos = addr * I3C_ADDR_SLOT_STATUS_BITS;
|
int bitpos = addr * I3C_ADDR_SLOT_STATUS_BITS;
|
||||||
unsigned long *ptr;
|
unsigned long *ptr;
|
||||||
@@ -371,14 +365,9 @@ static void i3c_bus_set_addr_slot_status_mask(struct i3c_bus *bus, u16 addr,
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
ptr = bus->addrslots + (bitpos / BITS_PER_LONG);
|
ptr = bus->addrslots + (bitpos / BITS_PER_LONG);
|
||||||
*ptr &= ~((unsigned long)mask << (bitpos % BITS_PER_LONG));
|
*ptr &= ~((unsigned long)I3C_ADDR_SLOT_STATUS_MASK <<
|
||||||
*ptr |= ((unsigned long)status & mask) << (bitpos % BITS_PER_LONG);
|
(bitpos % BITS_PER_LONG));
|
||||||
}
|
*ptr |= (unsigned long)status << (bitpos % BITS_PER_LONG);
|
||||||
|
|
||||||
static void i3c_bus_set_addr_slot_status(struct i3c_bus *bus, u16 addr,
|
|
||||||
enum i3c_addr_slot_status status)
|
|
||||||
{
|
|
||||||
i3c_bus_set_addr_slot_status_mask(bus, addr, status, I3C_ADDR_SLOT_STATUS_MASK);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool i3c_bus_dev_addr_is_avail(struct i3c_bus *bus, u8 addr)
|
static bool i3c_bus_dev_addr_is_avail(struct i3c_bus *bus, u8 addr)
|
||||||
@@ -390,44 +379,13 @@ static bool i3c_bus_dev_addr_is_avail(struct i3c_bus *bus, u8 addr)
|
|||||||
return status == I3C_ADDR_SLOT_FREE;
|
return status == I3C_ADDR_SLOT_FREE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* ┌────┬─────────────┬───┬─────────┬───┐
|
|
||||||
* │S/Sr│ 7'h7E RnW=0 │ACK│ ENTDAA │ T ├────┐
|
|
||||||
* └────┴─────────────┴───┴─────────┴───┘ │
|
|
||||||
* ┌─────────────────────────────────────────┘
|
|
||||||
* │ ┌──┬─────────────┬───┬─────────────────┬────────────────┬───┬─────────┐
|
|
||||||
* └─►│Sr│7'h7E RnW=1 │ACK│48bit UID BCR DCR│Assign 7bit Addr│PAR│ ACK/NACK│
|
|
||||||
* └──┴─────────────┴───┴─────────────────┴────────────────┴───┴─────────┘
|
|
||||||
* Some master controllers (such as HCI) need to prepare the entire above transaction before
|
|
||||||
* sending it out to the I3C bus. This means that a 7-bit dynamic address needs to be allocated
|
|
||||||
* before knowing the target device's UID information.
|
|
||||||
*
|
|
||||||
* However, some I3C targets may request specific addresses (called as "init_dyn_addr"), which is
|
|
||||||
* typically specified by the DT-'s assigned-address property. Lower addresses having higher IBI
|
|
||||||
* priority. If it is available, i3c_bus_get_free_addr() preferably return a free address that is
|
|
||||||
* not in the list of desired addresses (called as "init_dyn_addr"). This allows the device with
|
|
||||||
* the "init_dyn_addr" to switch to its "init_dyn_addr" when it hot-joins the I3C bus. Otherwise,
|
|
||||||
* if the "init_dyn_addr" is already in use by another I3C device, the target device will not be
|
|
||||||
* able to switch to its desired address.
|
|
||||||
*
|
|
||||||
* If the previous step fails, fallback returning one of the remaining unassigned address,
|
|
||||||
* regardless of its state in the desired list.
|
|
||||||
*/
|
|
||||||
static int i3c_bus_get_free_addr(struct i3c_bus *bus, u8 start_addr)
|
static int i3c_bus_get_free_addr(struct i3c_bus *bus, u8 start_addr)
|
||||||
{
|
{
|
||||||
enum i3c_addr_slot_status status;
|
enum i3c_addr_slot_status status;
|
||||||
u8 addr;
|
u8 addr;
|
||||||
|
|
||||||
for (addr = start_addr; addr < I3C_MAX_ADDR; addr++) {
|
for (addr = start_addr; addr < I3C_MAX_ADDR; addr++) {
|
||||||
status = i3c_bus_get_addr_slot_status_mask(bus, addr,
|
status = i3c_bus_get_addr_slot_status(bus, addr);
|
||||||
I3C_ADDR_SLOT_EXT_STATUS_MASK);
|
|
||||||
if (status == I3C_ADDR_SLOT_FREE)
|
|
||||||
return addr;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (addr = start_addr; addr < I3C_MAX_ADDR; addr++) {
|
|
||||||
status = i3c_bus_get_addr_slot_status_mask(bus, addr,
|
|
||||||
I3C_ADDR_SLOT_STATUS_MASK);
|
|
||||||
if (status == I3C_ADDR_SLOT_FREE)
|
if (status == I3C_ADDR_SLOT_FREE)
|
||||||
return addr;
|
return addr;
|
||||||
}
|
}
|
||||||
@@ -1902,10 +1860,9 @@ static int i3c_master_bus_init(struct i3c_master_controller *master)
|
|||||||
goto err_rstdaa;
|
goto err_rstdaa;
|
||||||
}
|
}
|
||||||
|
|
||||||
i3c_bus_set_addr_slot_status_mask(&master->bus,
|
i3c_bus_set_addr_slot_status(&master->bus,
|
||||||
i3cboardinfo->init_dyn_addr,
|
i3cboardinfo->init_dyn_addr,
|
||||||
I3C_ADDR_SLOT_I3C_DEV | I3C_ADDR_SLOT_EXT_DESIRED,
|
I3C_ADDR_SLOT_I3C_DEV);
|
||||||
I3C_ADDR_SLOT_EXT_STATUS_MASK);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Only try to create/attach devices that have a static
|
* Only try to create/attach devices that have a static
|
||||||
|
|||||||
@@ -289,8 +289,7 @@ enum i3c_open_drain_speed {
|
|||||||
* @I3C_ADDR_SLOT_I2C_DEV: address is assigned to an I2C device
|
* @I3C_ADDR_SLOT_I2C_DEV: address is assigned to an I2C device
|
||||||
* @I3C_ADDR_SLOT_I3C_DEV: address is assigned to an I3C device
|
* @I3C_ADDR_SLOT_I3C_DEV: address is assigned to an I3C device
|
||||||
* @I3C_ADDR_SLOT_STATUS_MASK: address slot mask
|
* @I3C_ADDR_SLOT_STATUS_MASK: address slot mask
|
||||||
* @I3C_ADDR_SLOT_EXT_DESIRED: the bitmask represents addresses that are preferred by some devices,
|
*
|
||||||
* such as the "assigned-address" property in a device tree source.
|
|
||||||
* On an I3C bus, addresses are assigned dynamically, and we need to know which
|
* On an I3C bus, addresses are assigned dynamically, and we need to know which
|
||||||
* addresses are free to use and which ones are already assigned.
|
* addresses are free to use and which ones are already assigned.
|
||||||
*
|
*
|
||||||
@@ -303,11 +302,9 @@ enum i3c_addr_slot_status {
|
|||||||
I3C_ADDR_SLOT_I2C_DEV,
|
I3C_ADDR_SLOT_I2C_DEV,
|
||||||
I3C_ADDR_SLOT_I3C_DEV,
|
I3C_ADDR_SLOT_I3C_DEV,
|
||||||
I3C_ADDR_SLOT_STATUS_MASK = 3,
|
I3C_ADDR_SLOT_STATUS_MASK = 3,
|
||||||
I3C_ADDR_SLOT_EXT_STATUS_MASK = 7,
|
|
||||||
I3C_ADDR_SLOT_EXT_DESIRED = BIT(2),
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#define I3C_ADDR_SLOT_STATUS_BITS 4
|
#define I3C_ADDR_SLOT_STATUS_BITS 2
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct i3c_bus - I3C bus object
|
* struct i3c_bus - I3C bus object
|
||||||
|
|||||||
Reference in New Issue
Block a user