From mboxrd@z Thu Jan 1 00:00:00 1970 From: Simon Glass Date: Thu, 27 Sep 2018 06:41:59 -0700 Subject: [U-Boot] [PATCH 01/27] dm: core: Allow uclass to set up a device's child after it is probed In-Reply-To: <1537710145-1888-2-git-send-email-bmeng.cn@gmail.com> References: <1537710145-1888-1-git-send-email-bmeng.cn@gmail.com> <1537710145-1888-2-git-send-email-bmeng.cn@gmail.com> Message-ID: List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Hi Bin, On 23 September 2018 at 06:41, Bin Meng wrote: > Some buses need to set up their child devices after they are probed. > Support a common child_post_probe() method for the uclass. > > With this change, the two APIs uclass_pre_probe_device() and > uclass_post_probe_device() become symmetric. > > Signed-off-by: Bin Meng > --- > > drivers/core/uclass.c | 13 ++++++++++++- > include/dm/uclass.h | 4 +++- > 2 files changed, 15 insertions(+), 2 deletions(-) Another option, perhaps not quite as elegant, is for the driver to call into the uclass in its probe() method. We need to balance elegance with the cost of adding a new field to the uclass which is rarely used. What do you think? Also, this does need some sort of use in sandbox, so can you update the test driver to use it? > > diff --git a/drivers/core/uclass.c b/drivers/core/uclass.c > index 3113d6a..3c7b9cf 100644 > --- a/drivers/core/uclass.c > +++ b/drivers/core/uclass.c > @@ -687,8 +687,19 @@ int uclass_pre_probe_device(struct udevice *dev) > > int uclass_post_probe_device(struct udevice *dev) > { > - struct uclass_driver *uc_drv = dev->uclass->uc_drv; > + struct uclass_driver *uc_drv; > + int ret; > + > + if (dev->parent) { > + uc_drv = dev->parent->uclass->uc_drv; > + if (uc_drv->child_post_probe) { > + ret = uc_drv->child_post_probe(dev); > + if (ret) > + return ret; > + } > + } > > + uc_drv = dev->uclass->uc_drv; > if (uc_drv->post_probe) > return uc_drv->post_probe(dev); > > diff --git a/include/dm/uclass.h b/include/dm/uclass.h > index 6e7c1cd..610c68d 100644 > --- a/include/dm/uclass.h > +++ b/include/dm/uclass.h > @@ -58,7 +58,8 @@ struct udevice; > * @post_probe: Called after a new device is probed > * @pre_remove: Called before a device is removed > * @child_post_bind: Called after a child is bound to a device in this uclass > - * @child_pre_probe: Called before a child is probed in this uclass > + * @child_pre_probe: Called before a child in this uclass is probed > + * @child_post_probe: Called after a child in this uclass is probed > * @init: Called to set up the uclass > * @destroy: Called to destroy the uclass > * @priv_auto_alloc_size: If non-zero this is the size of the private data > @@ -91,6 +92,7 @@ struct uclass_driver { > int (*pre_remove)(struct udevice *dev); > int (*child_post_bind)(struct udevice *dev); > int (*child_pre_probe)(struct udevice *dev); > + int (*child_post_probe)(struct udevice *dev); > int (*init)(struct uclass *class); > int (*destroy)(struct uclass *class); > int priv_auto_alloc_size; > -- > 2.7.4 > Regards, Simon