]> git.sur5r.net Git - u-boot/blobdiff - drivers/core/device.c
e1000: fix no nvm build
[u-boot] / drivers / core / device.c
index 42d250f4a48200705ff246769cce69ecc03cdbef..32e80e82b59c99f9ac5734c8f3dadc7c3b0c5f28 100644 (file)
@@ -106,13 +106,18 @@ int device_bind(struct udevice *parent, struct driver *drv, const char *name,
         * a 'requested' sequence, and will be resolved (and ->seq updated)
         * when the device is probed.
         */
-       dev->req_seq = fdtdec_get_int(gd->fdt_blob, of_offset, "reg", -1);
        dev->seq = -1;
+#ifdef CONFIG_OF_CONTROL
+       dev->req_seq = fdtdec_get_int(gd->fdt_blob, of_offset, "reg", -1);
+       if (!IS_ERR_VALUE(dev->req_seq))
+               dev->req_seq &= INT_MAX;
        if (uc->uc_drv->name && of_offset != -1) {
                fdtdec_get_alias_seq(gd->fdt_blob, uc->uc_drv->name, of_offset,
                                     &dev->req_seq);
        }
-
+#else
+       dev->req_seq = -1;
+#endif
        if (!dev->platdata && drv->platdata_auto_alloc_size)
                dev->flags |= DM_FLAG_ALLOC_PDATA;
 
@@ -291,6 +296,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 +363,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 */