[PATCH 1/2] i2c: implement of_i2c_register_devices_by_node()

Sascha Hauer sha at pengutronix.de
Mon Sep 12 02:04:09 PDT 2022


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 at pengutronix.de>
> ---
>  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 |



More information about the barebox mailing list