]> git.dujemihanovic.xyz Git - linux.git/commitdiff
i3c: dw: Turn DAT array entry into a struct
authorJeremy Kerr <jk@codeconstruct.com.au>
Thu, 30 Mar 2023 07:50:33 +0000 (15:50 +0800)
committerAlexandre Belloni <alexandre.belloni@bootlin.com>
Fri, 28 Apr 2023 06:20:07 +0000 (08:20 +0200)
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>
drivers/i3c/master/dw-i3c-master.c
drivers/i3c/master/dw-i3c-master.h

index c2011447f757452861d8fdb1716e9eadb96bffaf..0552a82c694f290fd646beaf3e73785fcf370c50 100644 (file)
@@ -291,7 +291,7 @@ static int dw_i3c_master_get_addr_pos(struct dw_i3c_master *master, u8 addr)
        int pos;
 
        for (pos = 0; pos < master->maxdevs; pos++) {
-               if (addr == master->addrs[pos])
+               if (addr == master->devs[pos].addr)
                        return pos;
        }
 
@@ -769,7 +769,7 @@ static int dw_i3c_master_daa(struct i3c_master_controller *m)
                if (ret < 0)
                        return -ENOSPC;
 
-               master->addrs[pos] = ret;
+               master->devs[pos].addr = ret;
                p = even_parity(ret);
                last_addr = ret;
                ret |= (p << 7);
@@ -806,7 +806,7 @@ static int dw_i3c_master_daa(struct i3c_master_controller *m)
 
        for (pos = 0; pos < master->maxdevs; pos++) {
                if (newdevs & BIT(pos))
-                       i3c_master_add_i3c_dev_locked(m, master->addrs[pos]);
+                       i3c_master_add_i3c_dev_locked(m, master->devs[pos].addr);
        }
 
        dw_i3c_master_free_xfer(xfer);
@@ -905,11 +905,11 @@ static int dw_i3c_master_reattach_i3c_dev(struct i3c_dev_desc *dev,
                       master->regs +
                       DEV_ADDR_TABLE_LOC(master->datstartaddr, data->index));
 
-               master->addrs[data->index] = 0;
+               master->devs[data->index].addr = 0;
                master->free_pos |= BIT(data->index);
 
                data->index = pos;
-               master->addrs[pos] = dev->info.dyn_addr;
+               master->devs[pos].addr = dev->info.dyn_addr;
                master->free_pos &= ~BIT(pos);
        }
 
@@ -917,7 +917,7 @@ static int dw_i3c_master_reattach_i3c_dev(struct i3c_dev_desc *dev,
               master->regs +
               DEV_ADDR_TABLE_LOC(master->datstartaddr, data->index));
 
-       master->addrs[data->index] = dev->info.dyn_addr;
+       master->devs[data->index].addr = dev->info.dyn_addr;
 
        return 0;
 }
@@ -938,11 +938,11 @@ static int dw_i3c_master_attach_i3c_dev(struct i3c_dev_desc *dev)
                return -ENOMEM;
 
        data->index = pos;
-       master->addrs[pos] = dev->info.dyn_addr ? : dev->info.static_addr;
+       master->devs[pos].addr = dev->info.dyn_addr ? : dev->info.static_addr;
        master->free_pos &= ~BIT(pos);
        i3c_dev_set_master_data(dev, data);
 
-       writel(DEV_ADDR_TABLE_DYNAMIC_ADDR(master->addrs[pos]),
+       writel(DEV_ADDR_TABLE_DYNAMIC_ADDR(master->devs[pos].addr),
               master->regs +
               DEV_ADDR_TABLE_LOC(master->datstartaddr, data->index));
 
@@ -960,7 +960,7 @@ static void dw_i3c_master_detach_i3c_dev(struct i3c_dev_desc *dev)
               DEV_ADDR_TABLE_LOC(master->datstartaddr, data->index));
 
        i3c_dev_set_master_data(dev, NULL);
-       master->addrs[data->index] = 0;
+       master->devs[data->index].addr = 0;
        master->free_pos |= BIT(data->index);
        kfree(data);
 }
@@ -1046,7 +1046,7 @@ static int dw_i3c_master_attach_i2c_dev(struct i2c_dev_desc *dev)
                return -ENOMEM;
 
        data->index = pos;
-       master->addrs[pos] = dev->addr;
+       master->devs[pos].addr = dev->addr;
        master->free_pos &= ~BIT(pos);
        i2c_dev_set_master_data(dev, data);
 
@@ -1069,7 +1069,7 @@ static void dw_i3c_master_detach_i2c_dev(struct i2c_dev_desc *dev)
               DEV_ADDR_TABLE_LOC(master->datstartaddr, data->index));
 
        i2c_dev_set_master_data(dev, NULL);
-       master->addrs[data->index] = 0;
+       master->devs[data->index].addr = 0;
        master->free_pos |= BIT(data->index);
        kfree(data);
 }
index 915dd0f2c0699912b8c6940167486bc61058e29c..5fb62072763929911001b526560df86e6e9670be 100644 (file)
@@ -17,6 +17,10 @@ struct dw_i3c_master_caps {
        u8 datafifodepth;
 };
 
+struct dw_i3c_dat_entry {
+       u8 addr;
+};
+
 struct dw_i3c_master {
        struct i3c_master_controller base;
        u16 maxdevs;
@@ -33,7 +37,12 @@ struct dw_i3c_master {
        struct clk *core_clk;
        char version[5];
        char type[5];
-       u8 addrs[DW_I3C_MAX_DEVS];
+
+       /*
+        * Per-device hardware data, used to manage the device address table
+        * (DAT)
+        */
+       struct dw_i3c_dat_entry devs[DW_I3C_MAX_DEVS];
 
        /* platform-specific data */
        const struct dw_i3c_platform_ops *platform_ops;