From: Simon Glass Date: Fri, 19 May 2017 02:09:05 +0000 (-0600) Subject: dm: core: Allow binding a device from a live tree X-Git-Tag: v2017.07-rc1~153 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=396e343b3d03e3773edf4a39f49c7918d4b8ff91;p=u-boot dm: core: Allow binding a device from a live tree When a live tree is being used we need to record the node that was used to create the device. Update device_bind_with_driver_data() to support this. Signed-off-by: Simon Glass --- diff --git a/drivers/core/device.c b/drivers/core/device.c index f5e85413f7..5463d1ffa5 100644 --- a/drivers/core/device.c +++ b/drivers/core/device.c @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -77,10 +78,7 @@ static int device_bind_common(struct udevice *parent, const struct driver *drv, */ if (uc->uc_drv->flags & DM_UC_FLAG_SEQ_ALIAS) { if (uc->uc_drv->name && ofnode_valid(node)) { - fdtdec_get_alias_seq(gd->fdt_blob, - uc->uc_drv->name, - ofnode_to_offset(node), - &dev->req_seq); + dev_read_alias_seq(dev, &dev->req_seq); } } } @@ -216,11 +214,11 @@ fail_alloc1: int device_bind_with_driver_data(struct udevice *parent, const struct driver *drv, const char *name, - ulong driver_data, int of_offset, + ulong driver_data, ofnode node, struct udevice **devp) { - return device_bind_common(parent, drv, name, NULL, driver_data, - offset_to_ofnode(of_offset), 0, devp); + return device_bind_common(parent, drv, name, NULL, driver_data, node, + 0, devp); } int device_bind(struct udevice *parent, const struct driver *drv, @@ -247,8 +245,8 @@ int device_bind_by_name(struct udevice *parent, bool pre_reloc_only, platdata_size = info->platdata_size; #endif return device_bind_common(parent, drv, info->name, - (void *)info->platdata, 0, offset_to_ofnode(-1), - platdata_size, devp); + (void *)info->platdata, 0, ofnode_null(), platdata_size, + devp); } static void *alloc_priv(int size, uint flags) @@ -385,7 +383,7 @@ int device_probe(struct udevice *dev) goto fail; } - if (drv->ofdata_to_platdata && dev_of_offset(dev) >= 0) { + if (drv->ofdata_to_platdata && dev_has_of_node(dev)) { ret = drv->ofdata_to_platdata(dev); if (ret) goto fail; diff --git a/drivers/core/lists.c b/drivers/core/lists.c index 72c55e205f..9adfa758bc 100644 --- a/drivers/core/lists.c +++ b/drivers/core/lists.c @@ -177,7 +177,7 @@ int lists_bind_fdt(struct udevice *parent, const void *blob, int offset, dm_dbg(" - found match at '%s'\n", entry->name); ret = device_bind_with_driver_data(parent, entry, name, - id->data, offset, &dev); + id->data, offset_to_ofnode(offset), &dev); if (ret == -ENODEV) { dm_dbg("Driver '%s' refuses to bind\n", entry->name); continue; diff --git a/include/dm/device-internal.h b/include/dm/device-internal.h index 2cabc87338..81ab893b60 100644 --- a/include/dm/device-internal.h +++ b/include/dm/device-internal.h @@ -11,6 +11,9 @@ #ifndef _DM_DEVICE_INTERNAL_H #define _DM_DEVICE_INTERNAL_H +#include + +struct device_node; struct udevice; /** @@ -52,16 +55,15 @@ int device_bind(struct udevice *parent, const struct driver *drv, * @drv: Device's driver * @name: Name of device (e.g. device tree node name) * @driver_data: The driver_data field from the driver's match table. - * @of_offset: Offset of device tree node for this device. This is -1 for - * devices which don't use device tree. + * @node: Device tree node for this device. This is invalid for devices which + * don't use device tree. * @devp: if non-NULL, returns a pointer to the bound device * @return 0 if OK, -ve on error */ int device_bind_with_driver_data(struct udevice *parent, const struct driver *drv, const char *name, - ulong driver_data, int of_offset, + ulong driver_data, ofnode node, struct udevice **devp); - /** * device_bind_by_name: Create a device and bind it to a driver *