cmd: List all uclass devices regardless of probe error

There are a few commands that iterate uclass with
uclass_first_device/uclass_next_device or the _err variant.

Use the _check class iterator variant to get devices that fail to probe
as well, and print the status.

Signed-off-by: Michal Suchanek <msuchanek@suse.de>
Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Michal Suchanek 2022-10-12 21:57:58 +02:00 committed by Simon Glass
parent 9244645f92
commit 8676ae36ae
5 changed files with 45 additions and 37 deletions

View File

@ -12,23 +12,19 @@ static int do_adc_list(struct cmd_tbl *cmdtp, int flag, int argc,
char *const argv[])
{
struct udevice *dev;
int ret;
int ret, err;
ret = uclass_first_device_err(UCLASS_ADC, &dev);
if (ret) {
printf("No available ADC device\n");
return CMD_RET_FAILURE;
ret = err = uclass_first_device_check(UCLASS_ADC, &dev);
while (dev) {
printf("- %s status: %i\n", dev->name, ret);
ret = uclass_next_device_check(&dev);
if (ret)
err = ret;
}
do {
printf("- %s\n", dev->name);
ret = uclass_next_device(&dev);
if (ret)
return CMD_RET_FAILURE;
} while (dev);
return CMD_RET_SUCCESS;
return err ? CMD_RET_FAILURE : CMD_RET_SUCCESS;
}
static int do_adc_info(struct cmd_tbl *cmdtp, int flag, int argc,

View File

@ -64,20 +64,23 @@ static int do_demo_light(struct cmd_tbl *cmdtp, int flag, int argc,
int do_demo_list(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
{
struct udevice *dev;
int i, ret;
int i, ret, err = 0;
puts("Demo uclass entries:\n");
for (i = 0, ret = uclass_first_device(UCLASS_DEMO, &dev);
for (i = 0, ret = uclass_first_device_check(UCLASS_DEMO, &dev);
dev;
ret = uclass_next_device(&dev)) {
printf("entry %d - instance %08x, ops %08x, plat %08x\n",
ret = uclass_next_device_check(&dev)) {
printf("entry %d - instance %08x, ops %08x, plat %08x, status %i\n",
i++, (uint)map_to_sysmem(dev),
(uint)map_to_sysmem(dev->driver->ops),
(uint)map_to_sysmem(dev_get_plat(dev)));
(uint)map_to_sysmem(dev_get_plat(dev)),
ret);
if (ret)
err = ret;
}
return cmd_process_error(cmdtp, ret);
return cmd_process_error(cmdtp, err);
}
static struct cmd_tbl demo_commands[] = {

View File

@ -77,17 +77,24 @@ static int do_gpio_status(bool all, const char *gpio_name)
struct udevice *dev;
int banklen;
int flags;
int ret;
int ret, err = 0;
flags = 0;
if (gpio_name && !*gpio_name)
gpio_name = NULL;
for (ret = uclass_first_device(UCLASS_GPIO, &dev);
for (ret = uclass_first_device_check(UCLASS_GPIO, &dev);
dev;
ret = uclass_next_device(&dev)) {
ret = uclass_next_device_check(&dev)) {
const char *bank_name;
int num_bits;
if (ret) {
printf("GPIO device %s probe error %i\n",
dev->name, ret);
err = ret;
continue;
}
flags |= FLAG_SHOW_BANK;
if (all)
flags |= FLAG_SHOW_ALL;
@ -120,7 +127,7 @@ static int do_gpio_status(bool all, const char *gpio_name)
flags |= FLAG_SHOW_NEWLINE;
}
return ret;
return err;
}
#endif

View File

@ -51,25 +51,26 @@ static int do_list(struct cmd_tbl *cmdtp, int flag, int argc,
char *const argv[])
{
struct udevice *dev;
int ret;
int ret, err = 0;
printf("| %-*.*s| %-*.*s| %s @ %s\n",
LIMIT_DEV, LIMIT_DEV, "Name",
LIMIT_PARENT, LIMIT_PARENT, "Parent name",
"Parent uclass", "seq");
for (ret = uclass_first_device(UCLASS_PMIC, &dev); dev;
ret = uclass_next_device(&dev)) {
for (ret = uclass_first_device_check(UCLASS_PMIC, &dev); dev;
ret = uclass_next_device_check(&dev)) {
if (ret)
continue;
err = ret;
printf("| %-*.*s| %-*.*s| %s @ %d\n",
printf("| %-*.*s| %-*.*s| %s @ %d | status: %i\n",
LIMIT_DEV, LIMIT_DEV, dev->name,
LIMIT_PARENT, LIMIT_PARENT, dev->parent->name,
dev_get_uclass_name(dev->parent), dev_seq(dev->parent));
dev_get_uclass_name(dev->parent), dev_seq(dev->parent),
ret);
}
if (ret)
if (err)
return CMD_RET_FAILURE;
return CMD_RET_SUCCESS;

View File

@ -205,7 +205,7 @@ static void do_status_detail(struct udevice *dev,
constraint(" * mode id:", mode, mode_name);
}
static void do_status_line(struct udevice *dev)
static void do_status_line(struct udevice *dev, int status)
{
struct dm_regulator_uclass_plat *pdata;
int current, value, mode;
@ -231,6 +231,7 @@ static void do_status_line(struct udevice *dev)
printf("%-10s", mode_name);
else
printf("%-10s", "-");
printf(" %i", status);
printf("\n");
}
@ -250,11 +251,11 @@ static int do_status(struct cmd_tbl *cmdtp, int flag, int argc,
}
/* Show all of them in a list, probing them as needed */
printf("%-20s %-10s %10s %10s %-10s\n", "Name", "Enabled", "uV", "mA",
"Mode");
for (ret = uclass_first_device(UCLASS_REGULATOR, &dev); dev;
ret = uclass_next_device(&dev))
do_status_line(dev);
printf("%-20s %-10s %10s %10s %-10s %s\n", "Name", "Enabled", "uV", "mA",
"Mode", "Status");
for (ret = uclass_first_device_check(UCLASS_REGULATOR, &dev); dev;
ret = uclass_next_device_check(&dev))
do_status_line(dev, ret);
return CMD_RET_SUCCESS;
}