Skip to content

Commit e2d4310

Browse files
jk-ozlabsalexandrebelloni
authored andcommitted
i3c: dw: Turn DAT array entry into a struct
In an upcoming change, we will want to store additional data about the devices we have in the data address table. Change the type of the DAT entries into a struct, which currently just has the address data. Signed-off-by: Jeremy Kerr <jk@codeconstruct.com.au> Reviewed-by: Joel Stanley <joel@jms.id.au> Link: https://lore.kernel.org/r/9dc0d9e2857e851a0cf04819df48e5d31921f83e.1680161823.git.jk@codeconstruct.com.au Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
1 parent 79f42b3 commit e2d4310

2 files changed

Lines changed: 21 additions & 12 deletions

File tree

drivers/i3c/master/dw-i3c-master.c

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,7 @@ static int dw_i3c_master_get_addr_pos(struct dw_i3c_master *master, u8 addr)
291291
int pos;
292292

293293
for (pos = 0; pos < master->maxdevs; pos++) {
294-
if (addr == master->addrs[pos])
294+
if (addr == master->devs[pos].addr)
295295
return pos;
296296
}
297297

@@ -769,7 +769,7 @@ static int dw_i3c_master_daa(struct i3c_master_controller *m)
769769
if (ret < 0)
770770
return -ENOSPC;
771771

772-
master->addrs[pos] = ret;
772+
master->devs[pos].addr = ret;
773773
p = even_parity(ret);
774774
last_addr = ret;
775775
ret |= (p << 7);
@@ -806,7 +806,7 @@ static int dw_i3c_master_daa(struct i3c_master_controller *m)
806806

807807
for (pos = 0; pos < master->maxdevs; pos++) {
808808
if (newdevs & BIT(pos))
809-
i3c_master_add_i3c_dev_locked(m, master->addrs[pos]);
809+
i3c_master_add_i3c_dev_locked(m, master->devs[pos].addr);
810810
}
811811

812812
dw_i3c_master_free_xfer(xfer);
@@ -905,19 +905,19 @@ static int dw_i3c_master_reattach_i3c_dev(struct i3c_dev_desc *dev,
905905
master->regs +
906906
DEV_ADDR_TABLE_LOC(master->datstartaddr, data->index));
907907

908-
master->addrs[data->index] = 0;
908+
master->devs[data->index].addr = 0;
909909
master->free_pos |= BIT(data->index);
910910

911911
data->index = pos;
912-
master->addrs[pos] = dev->info.dyn_addr;
912+
master->devs[pos].addr = dev->info.dyn_addr;
913913
master->free_pos &= ~BIT(pos);
914914
}
915915

916916
writel(DEV_ADDR_TABLE_DYNAMIC_ADDR(dev->info.dyn_addr),
917917
master->regs +
918918
DEV_ADDR_TABLE_LOC(master->datstartaddr, data->index));
919919

920-
master->addrs[data->index] = dev->info.dyn_addr;
920+
master->devs[data->index].addr = dev->info.dyn_addr;
921921

922922
return 0;
923923
}
@@ -938,11 +938,11 @@ static int dw_i3c_master_attach_i3c_dev(struct i3c_dev_desc *dev)
938938
return -ENOMEM;
939939

940940
data->index = pos;
941-
master->addrs[pos] = dev->info.dyn_addr ? : dev->info.static_addr;
941+
master->devs[pos].addr = dev->info.dyn_addr ? : dev->info.static_addr;
942942
master->free_pos &= ~BIT(pos);
943943
i3c_dev_set_master_data(dev, data);
944944

945-
writel(DEV_ADDR_TABLE_DYNAMIC_ADDR(master->addrs[pos]),
945+
writel(DEV_ADDR_TABLE_DYNAMIC_ADDR(master->devs[pos].addr),
946946
master->regs +
947947
DEV_ADDR_TABLE_LOC(master->datstartaddr, data->index));
948948

@@ -960,7 +960,7 @@ static void dw_i3c_master_detach_i3c_dev(struct i3c_dev_desc *dev)
960960
DEV_ADDR_TABLE_LOC(master->datstartaddr, data->index));
961961

962962
i3c_dev_set_master_data(dev, NULL);
963-
master->addrs[data->index] = 0;
963+
master->devs[data->index].addr = 0;
964964
master->free_pos |= BIT(data->index);
965965
kfree(data);
966966
}
@@ -1046,7 +1046,7 @@ static int dw_i3c_master_attach_i2c_dev(struct i2c_dev_desc *dev)
10461046
return -ENOMEM;
10471047

10481048
data->index = pos;
1049-
master->addrs[pos] = dev->addr;
1049+
master->devs[pos].addr = dev->addr;
10501050
master->free_pos &= ~BIT(pos);
10511051
i2c_dev_set_master_data(dev, data);
10521052

@@ -1069,7 +1069,7 @@ static void dw_i3c_master_detach_i2c_dev(struct i2c_dev_desc *dev)
10691069
DEV_ADDR_TABLE_LOC(master->datstartaddr, data->index));
10701070

10711071
i2c_dev_set_master_data(dev, NULL);
1072-
master->addrs[data->index] = 0;
1072+
master->devs[data->index].addr = 0;
10731073
master->free_pos |= BIT(data->index);
10741074
kfree(data);
10751075
}

drivers/i3c/master/dw-i3c-master.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ struct dw_i3c_master_caps {
1717
u8 datafifodepth;
1818
};
1919

20+
struct dw_i3c_dat_entry {
21+
u8 addr;
22+
};
23+
2024
struct dw_i3c_master {
2125
struct i3c_master_controller base;
2226
u16 maxdevs;
@@ -33,7 +37,12 @@ struct dw_i3c_master {
3337
struct clk *core_clk;
3438
char version[5];
3539
char type[5];
36-
u8 addrs[DW_I3C_MAX_DEVS];
40+
41+
/*
42+
* Per-device hardware data, used to manage the device address table
43+
* (DAT)
44+
*/
45+
struct dw_i3c_dat_entry devs[DW_I3C_MAX_DEVS];
3746

3847
/* platform-specific data */
3948
const struct dw_i3c_platform_ops *platform_ops;

0 commit comments

Comments
 (0)