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 <[email protected]> > Cc: Patrice Chotard <[email protected]> > Cc: Patrick Delaunay <[email protected]> > Cc: Sean Anderson <[email protected]> > Cc: Simon Glass <[email protected]> > Cc: Steven Lawrance <[email protected]> > --- > 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 <[email protected]> Tested-by: Patrice Chotard <[email protected]> Tested on stm32mp157c-dk2 board Thanks Patrice

