diff options
Diffstat (limited to 'drivers/core')
-rw-r--r-- | drivers/core/device.c | 34 | ||||
-rw-r--r-- | drivers/core/ofnode.c | 17 | ||||
-rw-r--r-- | drivers/core/uclass.c | 6 |
3 files changed, 46 insertions, 11 deletions
diff --git a/drivers/core/device.c b/drivers/core/device.c index 47a697f3e5c..836bcadced5 100644 --- a/drivers/core/device.c +++ b/drivers/core/device.c @@ -699,6 +699,40 @@ int device_find_first_inactive_child(struct udevice *parent, return -ENODEV; } +int device_find_first_child_by_uclass(struct udevice *parent, + enum uclass_id uclass_id, + struct udevice **devp) +{ + struct udevice *dev; + + *devp = NULL; + list_for_each_entry(dev, &parent->child_head, sibling_node) { + if (device_get_uclass_id(dev) == uclass_id) { + *devp = dev; + return 0; + } + } + + return -ENODEV; +} + +int device_find_child_by_name(struct udevice *parent, const char *name, + struct udevice **devp) +{ + struct udevice *dev; + + *devp = NULL; + + list_for_each_entry(dev, &parent->child_head, sibling_node) { + if (!strcmp(dev->name, name)) { + *devp = dev; + return 0; + } + } + + return -ENODEV; +} + struct udevice *dev_get_parent(const struct udevice *child) { return child->parent; diff --git a/drivers/core/ofnode.c b/drivers/core/ofnode.c index d9b5280b2d4..0e584c12dc8 100644 --- a/drivers/core/ofnode.c +++ b/drivers/core/ofnode.c @@ -253,15 +253,15 @@ int ofnode_read_size(ofnode node, const char *propname) fdt_addr_t ofnode_get_addr_index(ofnode node, int index) { + int na, ns; + fdt_size_t size; + if (ofnode_is_np(node)) { const __be32 *prop_val; uint flags; - u64 size; - int na; - int ns; - prop_val = of_get_address(ofnode_to_np(node), index, &size, - &flags); + prop_val = of_get_address(ofnode_to_np(node), index, + (u64 *)&size, &flags); if (!prop_val) return FDT_ADDR_T_NONE; @@ -274,8 +274,11 @@ fdt_addr_t ofnode_get_addr_index(ofnode node, int index) return of_read_number(prop_val, na); } } else { - return fdt_get_base_address(gd->fdt_blob, - ofnode_to_offset(node)); + na = ofnode_read_simple_addr_cells(ofnode_get_parent(node)); + ns = ofnode_read_simple_size_cells(ofnode_get_parent(node)); + return fdtdec_get_addr_size_fixed(gd->fdt_blob, + ofnode_to_offset(node), "reg", + index, na, ns, &size, true); } return FDT_ADDR_T_NONE; diff --git a/drivers/core/uclass.c b/drivers/core/uclass.c index d9c5719a878..9766aeabd19 100644 --- a/drivers/core/uclass.c +++ b/drivers/core/uclass.c @@ -354,10 +354,8 @@ done: } #if CONFIG_IS_ENABLED(OF_CONTROL) -static int uclass_find_device_by_phandle(enum uclass_id id, - struct udevice *parent, - const char *name, - struct udevice **devp) +int uclass_find_device_by_phandle(enum uclass_id id, struct udevice *parent, + const char *name, struct udevice **devp) { struct udevice *dev; struct uclass *uc; |