]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
i2c: core: Do not dereference fwnode in struct device
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Wed, 16 Apr 2025 07:01:35 +0000 (10:01 +0300)
committerWolfram Sang <wsa+renesas@sang-engineering.com>
Wed, 16 Apr 2025 16:08:32 +0000 (18:08 +0200)
In order to make the underneath API easier to change in the future,
prevent users from dereferencing fwnode from struct device.
Instead, use the specific device_set_node() API for that.

Tested-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
Reviewed-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Acked-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
drivers/i2c/i2c-core-base.c
drivers/i2c/i2c-core-of.c

index b186de31a9eefc13f02d4d297ba8d26ff2de50f5..dc3c60a7d3826dcff07c22112a16730bbba8381a 100644 (file)
@@ -961,6 +961,7 @@ static void i2c_unlock_addr(struct i2c_adapter *adap, unsigned short addr,
 struct i2c_client *
 i2c_new_client_device(struct i2c_adapter *adap, struct i2c_board_info const *info)
 {
+       struct fwnode_handle *fwnode;
        struct i2c_client *client;
        bool need_put = false;
        int status;
@@ -1001,18 +1002,19 @@ i2c_new_client_device(struct i2c_adapter *adap, struct i2c_board_info const *inf
        client->dev.parent = &client->adapter->dev;
        client->dev.bus = &i2c_bus_type;
        client->dev.type = &i2c_client_type;
-       client->dev.of_node = of_node_get(info->of_node);
-       client->dev.fwnode = info->fwnode;
 
        device_enable_async_suspend(&client->dev);
 
+       fwnode = info->fwnode ?: of_fwnode_handle(info->of_node);
+       device_set_node(&client->dev, fwnode_handle_get(fwnode));
+
        if (info->swnode) {
                status = device_add_software_node(&client->dev, info->swnode);
                if (status) {
                        dev_err(&adap->dev,
                                "Failed to add software node to client %s: %d\n",
                                client->name, status);
-                       goto out_err_put_of_node;
+                       goto out_err_put_fwnode;
                }
        }
 
@@ -1031,8 +1033,8 @@ i2c_new_client_device(struct i2c_adapter *adap, struct i2c_board_info const *inf
 out_remove_swnode:
        device_remove_software_node(&client->dev);
        need_put = true;
-out_err_put_of_node:
-       of_node_put(info->of_node);
+out_err_put_fwnode:
+       fwnode_handle_put(fwnode);
 out_err:
        dev_err(&adap->dev,
                "Failed to register i2c client %s at 0x%02x (%d)\n",
@@ -1060,12 +1062,11 @@ void i2c_unregister_device(struct i2c_client *client)
                return;
 
        fwnode = dev_fwnode(&client->dev);
-       if (is_of_node(fwnode)) {
+       if (is_of_node(fwnode))
                of_node_clear_flag(to_of_node(fwnode), OF_POPULATED);
-               of_node_put(client->dev.of_node);
-       } else if (is_acpi_device_node(fwnode)) {
+       else if (is_acpi_device_node(fwnode))
                acpi_device_clear_enumerated(to_acpi_device_node(fwnode));
-       }
+       fwnode_handle_put(fwnode);
 
        device_remove_software_node(&client->dev);
        device_unregister(&client->dev);
index 02feee6c9ba96d986cb2ede827babb5db6aa00f2..eb7fb202355f876420fa03ec4724ccd7ba6edeef 100644 (file)
@@ -49,7 +49,6 @@ int of_i2c_get_board_info(struct device *dev, struct device_node *node,
        }
 
        info->addr = addr;
-       info->of_node = node;
        info->fwnode = of_fwnode_handle(node);
 
        if (of_property_read_bool(node, "host-notify"))