]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
i3c: master: Improve initialization of numbered I2C adapters
authorDefa Li <defa.li@mediatek.com>
Thu, 12 Dec 2024 09:17:53 +0000 (17:17 +0800)
committerAlexandre Belloni <alexandre.belloni@bootlin.com>
Sun, 12 Jan 2025 23:01:42 +0000 (00:01 +0100)
Add logic to initialize I2C adapters with a specific ID if available,
improving device identification and configuration.

For mixed buses, in addition to the i3c alias, an i2c alias can be added to
assign a fixed bus number to the i2c adapter.

This allows an alias node such as:
    aliases {
        i2c2 = &mixed_bus_a,
        i3c2 = &mixed_bus_a,
        i3c4 = &mixed_bus_b,
    };

    /* assigned "i3c-2" and "i2c-2" */
    mixed_bus_a: i3c-master {
    };

If there is no i2c alias for a mixed bus, the i2c adapter numbers will
remain as is and will be assigned starting after the highest fixed bus
number.

    /* assigned "i3c-4" and likely assigned "i2c-3" */
    mixed_bus_b: i3c-master {
    };

Signed-off-by: Defa Li <defa.li@mediatek.com>
Reviewed-by: Frank Li <Frank.Li@nxp.com>
Link: https://lore.kernel.org/r/20241212091818.8591-1-defa.li@mediatek.com
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
drivers/i3c/master.c

index 53ab814b676ffd1c90de5095f8a1b2f5b9a79a46..d5dc4180afbcfc6d0936c674b3ab4089363f66a3 100644 (file)
@@ -2486,7 +2486,7 @@ static int i3c_master_i2c_adapter_init(struct i3c_master_controller *master)
        struct i2c_adapter *adap = i3c_master_to_i2c_adapter(master);
        struct i2c_dev_desc *i2cdev;
        struct i2c_dev_boardinfo *i2cboardinfo;
-       int ret;
+       int ret, id = -ENODEV;
 
        adap->dev.parent = master->dev.parent;
        adap->owner = master->dev.parent->driver->owner;
@@ -2497,7 +2497,15 @@ static int i3c_master_i2c_adapter_init(struct i3c_master_controller *master)
        adap->timeout = 1000;
        adap->retries = 3;
 
-       ret = i2c_add_adapter(adap);
+       if (master->dev.of_node)
+               id = of_alias_get_id(master->dev.of_node, "i2c");
+
+       if (id >= 0) {
+               adap->nr = id;
+               ret = i2c_add_numbered_adapter(adap);
+       } else {
+               ret = i2c_add_adapter(adap);
+       }
        if (ret)
                return ret;