On Mon, Sep 05, 2022 at 12:36:12PM +0200, Ahmad Fatoum wrote: > i2c controllers probe the devices on their bus themselves, so in the > case the i2c controller was already probed, we currently have no way to > have it reread the device tree after fixing it up or applying an > overlay. Add a new helper that retriggers the device creation. > > Signed-off-by: Ahmad Fatoum <a.fatoum@xxxxxxxxxxxxxx> > --- > drivers/i2c/i2c.c | 20 ++++++++++++++++++++ > include/i2c/i2c.h | 1 + > 2 files changed, 21 insertions(+) Applied, thanks Sascha > > diff --git a/drivers/i2c/i2c.c b/drivers/i2c/i2c.c > index b24fd88f5b39..e70e51618850 100644 > --- a/drivers/i2c/i2c.c > +++ b/drivers/i2c/i2c.c > @@ -427,6 +427,12 @@ static void of_i2c_register_devices(struct i2c_adapter *adap) > const __be32 *addr; > int len; > > + if (n->dev) { > + dev_dbg(&adap->dev, "of_i2c: skipping already registered %s\n", > + dev_name(n->dev)); > + continue; > + } > + > of_modalias_node(n, info.type, I2C_NAME_SIZE); > > info.of_node = n; > @@ -452,6 +458,20 @@ static void of_i2c_register_devices(struct i2c_adapter *adap) > } > } > > +int of_i2c_register_devices_by_node(struct device_node *node) > +{ > + struct i2c_adapter *adap; > + > + adap = of_find_i2c_adapter_by_node(node); > + if (!adap) > + return -ENODEV; > + if (IS_ERR(adap)) > + return PTR_ERR(adap); > + > + of_i2c_register_devices(adap); > + return 0; > +} > + > /** > * i2c_new_dummy - return a new i2c device bound to a dummy driver > * @adapter: the adapter managing the device > diff --git a/include/i2c/i2c.h b/include/i2c/i2c.h > index 7207b1180e1d..f5e2dc511ed1 100644 > --- a/include/i2c/i2c.h > +++ b/include/i2c/i2c.h > @@ -295,6 +295,7 @@ static inline int i2c_register_board_info(int busnum, > extern int i2c_add_numbered_adapter(struct i2c_adapter *adapter); > struct i2c_adapter *i2c_get_adapter(int busnum); > struct i2c_adapter *of_find_i2c_adapter_by_node(struct device_node *node); > +int of_i2c_register_devices_by_node(struct device_node *node); > struct i2c_client *of_find_i2c_device_by_node(struct device_node *node); > > void i2c_parse_fw_timings(struct device_d *dev, struct i2c_timings *t, bool use_defaults); > -- > 2.30.2 > > > -- Pengutronix e.K. | | Steuerwalder Str. 21 | http://www.pengutronix.de/ | 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |