Hi Wolfram, On 29.06.2015 11:17, Wolfram Sang wrote: > On Mon, Jun 29, 2015 at 03:36:19PM +0900, Frkuska, Joshua wrote: >> This adds of_get_i2c_adapter_by_node which both finds and properly >> increments the adapter reference count. >> >> This is different from of_find_i2c_device_by_node which does not >> increment the adapter reference counter. >> >> Signed-off-by: Vladimir Zapolskiy <vladimir_zapolskiy@xxxxxxxxxx> >> Signed-off-by: Joshua Frkuska <joshua_frkuska@xxxxxxxxxx> > > What is your use case? the usecase is to avoid double getting of a pointer to the wanted struct i2c_adapter with incrementing its user counter at once, now it is done in two stages, namely find adapter and get adapter: ------8<------ struct i2c_adapter *ddc; int id; ... - ddc = of_find_i2c_adapter_by_node(ddc_node); - if (ddc) { - id = i2c_adapter_id(dcc); - dcc = i2c_get_adapter(id); + dcc = of_get_i2c_adapter_by_node(ddc); + if (dcc) + put_device(&ddc->dev); put_device(&ddc->dev); - } ... i2c_put_adapter(ddc); ------8<------ Since i2c adapted is locked by client, it might have sense to add put_device() hidden inside of_get_i2c_adapter_by_node(). > Which code will be using this function? > At the moment there is an intention to add clients in drivers/gpu/drm/*, who should lock i2c bus driver to sustain DDC lines. By the way to the current version the correspondent change in include/linux/i2c.h is missing: ------8<------ diff --git a/include/linux/i2c.h b/include/linux/i2c.h index e83a738..555ad9c 100644 --- a/include/linux/i2c.h +++ b/include/linux/i2c.h @@ -638,6 +638,9 @@ extern struct i2c_client *of_find_i2c_device_by_node(struct device_node *node); /* must call put_device() when done with returned i2c_adapter device */ extern struct i2c_adapter *of_find_i2c_adapter_by_node(struct device_node *node); +/* must call put_device() when done with returned i2c_adapter device */ +extern struct i2c_adapter *of_get_i2c_adapter_by_node(struct device_node *node); + #else static inline struct i2c_client *of_find_i2c_device_by_node(struct device_node *node) @@ -649,6 +652,11 @@ static inline struct i2c_adapter *of_find_i2c_adapter_by_node(struct device_node { return NULL; } + +static inline struct i2c_adapter *of_get_i2c_adapter_by_node(struct device_node *node) +{ + return NULL; +} #endif /* CONFIG_OF */ #endif /* _LINUX_I2C_H */ ------8<------ -- With best wishes, Vladimir -- To unsubscribe from this list: send the line "unsubscribe linux-i2c" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html