[PATCH 1/3] dm: core: Add DM_FLAG_PROBE_AFTER_BIND flag

Patrice CHOTARD patrice.chotard at foss.st.com
Fri Apr 22 15:43:46 CEST 2022


Hi Marek

On 4/22/22 15:15, Marek Vasut wrote:
> Introduce DM_FLAG_PROBE_AFTER_BIND flag, which can be set by driver or
> uclass in .bind(), to indicate such driver instance should be probe()d
> once binding of all devices is complete.
> 
> This is useful in case the driver determines that hardware initialization
> is mandatory on boot, and such initialization happens only in probe().
> This also solves the inability to call device_probe() from .bind().
> 
> Signed-off-by: Marek Vasut <marex at denx.de>
> Cc: Patrice Chotard <patrice.chotard at foss.st.com>
> Cc: Patrick Delaunay <patrick.delaunay at foss.st.com>
> Cc: Sean Anderson <seanga2 at gmail.com>
> Cc: Simon Glass <sjg at chromium.org>
> Cc: Steven Lawrance <steven.lawrance at softathome.com>
> ---
>  drivers/core/root.c | 24 +++++++++++++++++++++++-
>  include/dm/device.h |  3 +++
>  2 files changed, 26 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/core/root.c b/drivers/core/root.c
> index e09c12f4d6e..17dd1205a32 100644
> --- a/drivers/core/root.c
> +++ b/drivers/core/root.c
> @@ -361,6 +361,28 @@ void *dm_priv_to_rw(void *priv)
>  }
>  #endif
>  
> +static int dm_probe_devices(struct udevice *dev, bool pre_reloc_only)
> +{
> +	u32 mask = DM_FLAG_PROBE_AFTER_BIND;
> +	u32 flags = dev_get_flags(dev);
> +	struct udevice *child;
> +	int ret;
> +
> +	if (pre_reloc_only)
> +		mask |= DM_FLAG_PRE_RELOC;
> +
> +	if ((flags & mask) == mask) {
> +		ret = device_probe(dev);
> +		if (ret)
> +			return ret;
> +	}
> +
> +	list_for_each_entry(child, &dev->child_head, sibling_node)
> +		dm_probe_devices(child, pre_reloc_only);
> +
> +	return 0;
> +}
> +
>  /**
>   * dm_scan() - Scan tables to bind devices
>   *
> @@ -393,7 +415,7 @@ static int dm_scan(bool pre_reloc_only)
>  	if (ret)
>  		return ret;
>  
> -	return 0;
> +	return dm_probe_devices(gd->dm_root, pre_reloc_only);
>  }
>  
>  int dm_init_and_scan(bool pre_reloc_only)
> diff --git a/include/dm/device.h b/include/dm/device.h
> index e0f86f5df9f..e7dd90399f9 100644
> --- a/include/dm/device.h
> +++ b/include/dm/device.h
> @@ -80,6 +80,9 @@ struct driver_info;
>   */
>  #define DM_FLAG_VITAL			(1 << 14)
>  
> +/* Device must be probed after it was bound */
> +#define DM_FLAG_PROBE_AFTER_BIND	(1 << 15)
> +
>  /*
>   * One or multiple of these flags are passed to device_remove() so that
>   * a selective device removal as specified by the remove-stage and the


Reviewed-by: Patrice Chotard <patrice.chotard at foss.st.com>
Tested-by: Patrice Chotard <patrice.chotard at foss.st.com>

Tested on stm32mp157c-dk2 board
Thanks
Patrice


More information about the U-Boot mailing list