]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
i3c: add addr and lvr to i2c_dev_desc structure
authorPrzemyslaw Gaj <pgaj@cadence.com>
Sat, 22 Jun 2019 20:54:59 +0000 (21:54 +0100)
committerBoris Brezillon <boris.brezillon@collabora.com>
Sun, 11 Aug 2019 08:48:28 +0000 (10:48 +0200)
I need to store address and lvr value for I2C devices without static definition
in DT. This allows secondary master to transmit DEFSLVS command properly.

Main changes between v4 and v5:
- Change in defslvs to use addr and lvr from i2c_dev_desc structure
- Change in CDNS and DW drivers to use addr and lvr from i2c_dev_desc structure

Signed-off-by: Przemyslaw Gaj <pgaj@cadence.com>
Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
drivers/i3c/master.c
drivers/i3c/master/dw-i3c-master.c
drivers/i3c/master/i3c-master-cdns.c
include/linux/i3c/master.h

index 87d0f349dd37ad36a199486748d391fbe8e22ba5..a38fdf325d30f6d5b66c7a3a10fe43d65459ecdb 100644 (file)
@@ -600,6 +600,8 @@ i3c_master_alloc_i2c_dev(struct i3c_master_controller *master,
 
        dev->common.master = master;
        dev->boardinfo = boardinfo;
+       dev->addr = boardinfo->base.addr;
+       dev->lvr = boardinfo->lvr;
 
        return dev;
 }
@@ -918,8 +920,8 @@ int i3c_master_defslvs_locked(struct i3c_master_controller *master)
 
        desc = defslvs->slaves;
        i3c_bus_for_each_i2cdev(bus, i2cdev) {
-               desc->lvr = i2cdev->boardinfo->lvr;
-               desc->static_addr = i2cdev->boardinfo->base.addr << 1;
+               desc->lvr = i2cdev->lvr;
+               desc->static_addr = i2cdev->addr << 1;
                desc++;
        }
 
@@ -1586,8 +1588,8 @@ static void i3c_master_detach_free_devs(struct i3c_master_controller *master)
                                 common.node) {
                i3c_master_detach_i2c_dev(i2cdev);
                i3c_bus_set_addr_slot_status(&master->bus,
-                                       i2cdev->boardinfo->base.addr,
-                                       I3C_ADDR_SLOT_FREE);
+                                            i2cdev->addr,
+                                            I3C_ADDR_SLOT_FREE);
                i3c_master_free_i2c_dev(i2cdev);
        }
 }
index 09912d75c6d5398e63ebd5148a6cc5441721d595..b0ff0e12d84ca0faa8a5a5f2ebfcc7b53cdbb1e2 100644 (file)
@@ -1033,12 +1033,12 @@ static int dw_i3c_master_attach_i2c_dev(struct i2c_dev_desc *dev)
                return -ENOMEM;
 
        data->index = pos;
-       master->addrs[pos] = dev->boardinfo->base.addr;
+       master->addrs[pos] = dev->addr;
        master->free_pos &= ~BIT(pos);
        i2c_dev_set_master_data(dev, data);
 
        writel(DEV_ADDR_TABLE_LEGACY_I2C_DEV |
-              DEV_ADDR_TABLE_STATIC_ADDR(dev->boardinfo->base.addr),
+              DEV_ADDR_TABLE_STATIC_ADDR(dev->addr),
               master->regs +
               DEV_ADDR_TABLE_LOC(master->datstartaddr, data->index));
 
index c8adf1eb7e1ebf1fa70fc981c0670efe3dad2213..10db0bf0655a9f71938f146f802857eac4c9c329 100644 (file)
@@ -1003,9 +1003,9 @@ static int cdns_i3c_master_attach_i2c_dev(struct i2c_dev_desc *dev)
        master->free_rr_slots &= ~BIT(slot);
        i2c_dev_set_master_data(dev, data);
 
-       writel(prepare_rr0_dev_address(dev->boardinfo->base.addr),
+       writel(prepare_rr0_dev_address(dev->addr),
               master->regs + DEV_ID_RR0(data->id));
-       writel(dev->boardinfo->lvr, master->regs + DEV_ID_RR2(data->id));
+       writel(dev->lvr, master->regs + DEV_ID_RR2(data->id));
        writel(readl(master->regs + DEVS_CTRL) |
               DEVS_CTRL_DEV_ACTIVE(data->id),
               master->regs + DEVS_CTRL);
index 1f08fa8d69d2725e204f761260692b610b89b31e..9cb39d901cd5f95070adc82609f50134ff9d8937 100644 (file)
@@ -71,6 +71,9 @@ struct i2c_dev_boardinfo {
  * @common: common part of the I2C device descriptor
  * @boardinfo: pointer to the boardinfo attached to this I2C device
  * @dev: I2C device object registered to the I2C framework
+ * @addr: I2C device address
+ * @lvr: LVR (Legacy Virtual Register) needed by the I3C core to know about
+ *      the I2C device limitations
  *
  * Each I2C device connected on the bus will have an i2c_dev_desc.
  * This object is created by the core and later attached to the controller
@@ -84,6 +87,8 @@ struct i2c_dev_desc {
        struct i3c_i2c_dev_desc common;
        const struct i2c_dev_boardinfo *boardinfo;
        struct i2c_client *dev;
+       u16 addr;
+       u8 lvr;
 };
 
 /**