[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