Skip to content

Commit 31b9887

Browse files
jamieilesalexandrebelloni
authored andcommitted
i3c: remove i2c board info from i2c_dev_desc
I2C board info is only required during adapter setup so there is no requirement to keeping a pointer to it once running. To support dynamic device addition we can't rely on board info - user-space creation through sysfs won't have a boardinfo. Cc: Alexandre Belloni <alexandre.belloni@bootlin.com> Signed-off-by: Jamie Iles <quic_jiles@quicinc.com> Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com> Link: https://lore.kernel.org/r/20220117174816.1963463-2-quic_jiles@quicinc.com
1 parent e783362 commit 31b9887

2 files changed

Lines changed: 10 additions & 9 deletions

File tree

drivers/i3c/master.c

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -609,7 +609,7 @@ static void i3c_master_free_i2c_dev(struct i2c_dev_desc *dev)
609609

610610
static struct i2c_dev_desc *
611611
i3c_master_alloc_i2c_dev(struct i3c_master_controller *master,
612-
const struct i2c_dev_boardinfo *boardinfo)
612+
u16 addr, u8 lvr)
613613
{
614614
struct i2c_dev_desc *dev;
615615

@@ -618,9 +618,8 @@ i3c_master_alloc_i2c_dev(struct i3c_master_controller *master,
618618
return ERR_PTR(-ENOMEM);
619619

620620
dev->common.master = master;
621-
dev->boardinfo = boardinfo;
622-
dev->addr = boardinfo->base.addr;
623-
dev->lvr = boardinfo->lvr;
621+
dev->addr = addr;
622+
dev->lvr = lvr;
624623

625624
return dev;
626625
}
@@ -694,7 +693,7 @@ i3c_master_find_i2c_dev_by_addr(const struct i3c_master_controller *master,
694693
struct i2c_dev_desc *dev;
695694

696695
i3c_bus_for_each_i2cdev(&master->bus, dev) {
697-
if (dev->boardinfo->base.addr == addr)
696+
if (dev->addr == addr)
698697
return dev;
699698
}
700699

@@ -1689,7 +1688,9 @@ static int i3c_master_bus_init(struct i3c_master_controller *master)
16891688
i2cboardinfo->base.addr,
16901689
I3C_ADDR_SLOT_I2C_DEV);
16911690

1692-
i2cdev = i3c_master_alloc_i2c_dev(master, i2cboardinfo);
1691+
i2cdev = i3c_master_alloc_i2c_dev(master,
1692+
i2cboardinfo->base.addr,
1693+
i2cboardinfo->lvr);
16931694
if (IS_ERR(i2cdev)) {
16941695
ret = PTR_ERR(i2cdev);
16951696
goto err_detach_devs;
@@ -2175,6 +2176,7 @@ static int i3c_master_i2c_adapter_init(struct i3c_master_controller *master)
21752176
{
21762177
struct i2c_adapter *adap = i3c_master_to_i2c_adapter(master);
21772178
struct i2c_dev_desc *i2cdev;
2179+
struct i2c_dev_boardinfo *i2cboardinfo;
21782180
int ret;
21792181

21802182
adap->dev.parent = master->dev.parent;
@@ -2194,8 +2196,8 @@ static int i3c_master_i2c_adapter_init(struct i3c_master_controller *master)
21942196
* We silently ignore failures here. The bus should keep working
21952197
* correctly even if one or more i2c devices are not registered.
21962198
*/
2197-
i3c_bus_for_each_i2cdev(&master->bus, i2cdev)
2198-
i2cdev->dev = i2c_new_client_device(adap, &i2cdev->boardinfo->base);
2199+
list_for_each_entry(i2cboardinfo, &master->boardinfo.i2c, node)
2200+
i2cdev->dev = i2c_new_client_device(adap, &i2cboardinfo->base);
21992201

22002202
return 0;
22012203
}

include/linux/i3c/master.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,6 @@ struct i2c_dev_boardinfo {
8585
*/
8686
struct i2c_dev_desc {
8787
struct i3c_i2c_dev_desc common;
88-
const struct i2c_dev_boardinfo *boardinfo;
8988
struct i2c_client *dev;
9089
u16 addr;
9190
u8 lvr;

0 commit comments

Comments
 (0)