summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2014-07-23 06:55:21 -0600
committerSimon Glass <sjg@chromium.org>2014-07-23 14:08:37 +0100
commita327dee0f40bcdebaba1a3e47f2b9f1ceb970d2a (patch)
tree20ba09ee61b51416bc86808abf7315fe6266e1ed /drivers
parente59f458de6999b8a786da857e653db6777f675ca (diff)
downloadu-boot-imx-a327dee0f40bcdebaba1a3e47f2b9f1ceb970d2a.zip
u-boot-imx-a327dee0f40bcdebaba1a3e47f2b9f1ceb970d2a.tar.gz
u-boot-imx-a327dee0f40bcdebaba1a3e47f2b9f1ceb970d2a.tar.bz2
dm: Add child_pre_probe() and child_post_remove() methods
Some devices (particularly bus devices) must track their children, knowing when a new child is added so that it can be set up for communication on the bus. Add a child_pre_probe() method to provide this feature, and a corresponding child_post_remove() method. Signed-off-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/core/device.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/drivers/core/device.c b/drivers/core/device.c
index 42d250f..166b073 100644
--- a/drivers/core/device.c
+++ b/drivers/core/device.c
@@ -291,6 +291,12 @@ int device_probe(struct udevice *dev)
}
dev->seq = seq;
+ if (dev->parent && dev->parent->driver->child_pre_probe) {
+ ret = dev->parent->driver->child_pre_probe(dev);
+ if (ret)
+ goto fail;
+ }
+
if (drv->ofdata_to_platdata && dev->of_offset >= 0) {
ret = drv->ofdata_to_platdata(dev);
if (ret)
@@ -352,12 +358,20 @@ int device_remove(struct udevice *dev)
goto err_remove;
}
+ if (dev->parent && dev->parent->driver->child_post_remove) {
+ ret = dev->parent->driver->child_post_remove(dev);
+ if (ret) {
+ dm_warn("%s: Device '%s' failed child_post_remove()",
+ __func__, dev->name);
+ }
+ }
+
device_free(dev);
dev->seq = -1;
dev->flags &= ~DM_FLAG_ACTIVATED;
- return 0;
+ return ret;
err_remove:
/* We can't put the children back */