X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=test%2Fdm%2Fcmd_dm.c;h=79a674efcc5bc35559698cad5413723a7308d4dc;hb=8d6e18df605aaa85861f2efb4509362779e6101d;hp=96f10f3b1d45b9b19fb7a296be8394be9b1f78fb;hpb=4af5b1445c2c17b72f515134d510d37e05a344f1;p=u-boot diff --git a/test/dm/cmd_dm.c b/test/dm/cmd_dm.c index 96f10f3b1d..79a674efcc 100644 --- a/test/dm/cmd_dm.c +++ b/test/dm/cmd_dm.c @@ -16,44 +16,38 @@ #include #include -static int display_succ(struct udevice *in, char *buf) +static void show_devices(struct udevice *dev, int depth, int last_flag) { - int len; - int ip = 0; - char local[16]; - struct udevice *pos, *n, *prev = NULL; - - printf("%s- %c %s @ %08lx", buf, - in->flags & DM_FLAG_ACTIVATED ? '*' : ' ', - in->name, (ulong)map_to_sysmem(in)); - puts("\n"); - - if (list_empty(&in->child_head)) - return 0; - - len = strlen(buf); - strncpy(local, buf, sizeof(local)); - snprintf(local + len, 2, "|"); - if (len && local[len - 1] == '`') - local[len - 1] = ' '; - - list_for_each_entry_safe(pos, n, &in->child_head, sibling_node) { - if (ip++) - display_succ(prev, local); - prev = pos; + int i, is_last; + struct udevice *child; + char class_name[12]; + + /* print the first 11 characters to not break the tree-format. */ + strlcpy(class_name, dev->uclass->uc_drv->name, sizeof(class_name)); + printf(" %-11s [ %c ] ", class_name, + dev->flags & DM_FLAG_ACTIVATED ? '+' : ' '); + + for (i = depth; i >= 0; i--) { + is_last = (last_flag >> i) & 1; + if (i) { + if (is_last) + printf(" "); + else + printf("| "); + } else { + if (is_last) + printf("`-- "); + else + printf("|-- "); + } } - snprintf(local + len, 2, "`"); - display_succ(prev, local); + printf("%s\n", dev->name); - return 0; -} - -static int dm_dump(struct udevice *dev) -{ - if (!dev) - return -EINVAL; - return display_succ(dev, ""); + list_for_each_entry(child, &dev->child_head, sibling_node) { + is_last = list_is_last(&child->sibling_node, &dev->child_head); + show_devices(child, depth + 1, (last_flag << 1) | is_last); + } } static int do_dm_dump_all(cmd_tbl_t *cmdtp, int flag, int argc, @@ -62,8 +56,30 @@ static int do_dm_dump_all(cmd_tbl_t *cmdtp, int flag, int argc, struct udevice *root; root = dm_root(); - printf("ROOT %08lx\n", (ulong)map_to_sysmem(root)); - return dm_dump(root); + if (root) { + printf(" Class Probed Name\n"); + printf("----------------------------------------\n"); + show_devices(root, -1, 0); + } + + return 0; +} + +/** + * dm_display_line() - Display information about a single device + * + * Displays a single line of information with an option prefix + * + * @dev: Device to display + */ +static void dm_display_line(struct udevice *dev) +{ + printf("- %c %s @ %08lx", + dev->flags & DM_FLAG_ACTIVATED ? '*' : ' ', + dev->name, (ulong)map_to_sysmem(dev)); + if (dev->req_seq != -1) + printf(", %d", dev->req_seq); + puts("\n"); } static int do_dm_dump_uclass(cmd_tbl_t *cmdtp, int flag, int argc, @@ -81,12 +97,10 @@ static int do_dm_dump_uclass(cmd_tbl_t *cmdtp, int flag, int argc, continue; printf("uclass %d: %s\n", id, uc->uc_drv->name); - for (ret = uclass_first_device(id, &dev); - dev; - ret = uclass_next_device(&dev)) { - printf(" %c %s @ %08lx:\n", - dev->flags & DM_FLAG_ACTIVATED ? '*' : ' ', - dev->name, (ulong)map_to_sysmem(dev)); + if (list_empty(&uc->dev_head)) + continue; + list_for_each_entry(dev, &uc->dev_head, uclass_node) { + dm_display_line(dev); } puts("\n"); } @@ -135,7 +149,7 @@ static int do_dm(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) U_BOOT_CMD( dm, 2, 1, do_dm, "Driver model low level access", - "tree Dump driver model tree\n" + "tree Dump driver model tree ('*' = activated)\n" "dm uclass Dump list of instances for each uclass" TEST_HELP );