summaryrefslogtreecommitdiff
path: root/drivers/core
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/core')
-rw-r--r--drivers/core/device.c34
-rw-r--r--drivers/core/dump.c8
-rw-r--r--drivers/core/ofnode.c17
-rw-r--r--drivers/core/uclass.c6
4 files changed, 50 insertions, 15 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/dump.c b/drivers/core/dump.c
index 90680844043..04217cbde87 100644
--- a/drivers/core/dump.c
+++ b/drivers/core/dump.c
@@ -15,8 +15,8 @@ static void show_devices(struct udevice *dev, int depth, int last_flag)
int i, is_last;
struct udevice *child;
- /* print the first 11 characters to not break the tree-format. */
- printf(" %-10.10s %d [ %c ] %-10.10s ", dev->uclass->uc_drv->name,
+ /* print the first 20 characters to not break the tree-format. */
+ printf(" %-10.10s %d [ %c ] %-20.20s ", dev->uclass->uc_drv->name,
dev_get_uclass_index(dev, NULL),
dev->flags & DM_FLAG_ACTIVATED ? '+' : ' ', dev->driver->name);
@@ -49,8 +49,8 @@ void dm_dump_all(void)
root = dm_root();
if (root) {
- printf(" Class index Probed Driver Name\n");
- printf("-----------------------------------------\n");
+ printf(" Class index Probed Driver Name\n");
+ printf("-----------------------------------------------------------\n");
show_devices(root, -1, 0);
}
}
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;