Commit d3e1b617 authored by Dmitry Torokhov's avatar Dmitry Torokhov Committed by Rafael J. Wysocki

i2c: allow specify device properties in i2c_board_info

With many drivers converting to using generic device properties, it is
useful to provide array of device properties when instantiating new i2c
client via i2c_board_info and have them automatically added to the device
in question.
Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
Reviewed-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Acked-by: default avatarWolfram Sang <wsa@the-dreams.de>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent 2d479e1f
...@@ -1335,15 +1335,29 @@ i2c_new_device(struct i2c_adapter *adap, struct i2c_board_info const *info) ...@@ -1335,15 +1335,29 @@ i2c_new_device(struct i2c_adapter *adap, struct i2c_board_info const *info)
client->dev.fwnode = info->fwnode; client->dev.fwnode = info->fwnode;
i2c_dev_set_name(adap, client); i2c_dev_set_name(adap, client);
if (info->properties) {
status = device_add_properties(&client->dev, info->properties);
if (status) {
dev_err(&adap->dev,
"Failed to add properties to client %s: %d\n",
client->name, status);
goto out_err;
}
}
status = device_register(&client->dev); status = device_register(&client->dev);
if (status) if (status)
goto out_err; goto out_free_props;
dev_dbg(&adap->dev, "client [%s] registered with bus id %s\n", dev_dbg(&adap->dev, "client [%s] registered with bus id %s\n",
client->name, dev_name(&client->dev)); client->name, dev_name(&client->dev));
return client; return client;
out_free_props:
if (info->properties)
device_remove_properties(&client->dev);
out_err: out_err:
dev_err(&adap->dev, dev_err(&adap->dev,
"Failed to register i2c client %s at 0x%02x (%d)\n", "Failed to register i2c client %s at 0x%02x (%d)\n",
......
...@@ -51,6 +51,7 @@ enum i2c_slave_event; ...@@ -51,6 +51,7 @@ enum i2c_slave_event;
typedef int (*i2c_slave_cb_t)(struct i2c_client *, enum i2c_slave_event, u8 *); typedef int (*i2c_slave_cb_t)(struct i2c_client *, enum i2c_slave_event, u8 *);
struct module; struct module;
struct property_entry;
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
/* /*
...@@ -299,6 +300,7 @@ static inline int i2c_slave_event(struct i2c_client *client, ...@@ -299,6 +300,7 @@ static inline int i2c_slave_event(struct i2c_client *client,
* @archdata: copied into i2c_client.dev.archdata * @archdata: copied into i2c_client.dev.archdata
* @of_node: pointer to OpenFirmware device node * @of_node: pointer to OpenFirmware device node
* @fwnode: device node supplied by the platform firmware * @fwnode: device node supplied by the platform firmware
* @properties: additional device properties for the device
* @irq: stored in i2c_client.irq * @irq: stored in i2c_client.irq
* *
* I2C doesn't actually support hardware probing, although controllers and * I2C doesn't actually support hardware probing, although controllers and
...@@ -320,6 +322,7 @@ struct i2c_board_info { ...@@ -320,6 +322,7 @@ struct i2c_board_info {
struct dev_archdata *archdata; struct dev_archdata *archdata;
struct device_node *of_node; struct device_node *of_node;
struct fwnode_handle *fwnode; struct fwnode_handle *fwnode;
const struct property_entry *properties;
int irq; int irq;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment