mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
i2c: core: Do not dereference fwnode in struct device
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>
This commit is contained in:
parent
3435b7f0fd
commit
df6d7277e5
2 changed files with 10 additions and 10 deletions
|
@ -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);
|
||||
|
|
|
@ -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"))
|
||||
|
|
Loading…
Add table
Reference in a new issue