mirror of
https://github.com/u-boot/u-boot.git
synced 2025-05-08 19:11:53 +00:00
dm: core: Allow iterating devices without uclass_get()
At present we have uclass_foreach_dev() which requires that uclass_get() be called beforehand to find the uclass. This is good if we suspect that that function might fail, but often we know that the uclass is available. Add a new helper which does this uclass_get() automatically, so that only the uclass ID is needed. Signed-off-by: Simon Glass <sjg@chromium.org> Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
This commit is contained in:
parent
2999846c11
commit
3cf0fba4ff
2 changed files with 38 additions and 0 deletions
|
@ -365,6 +365,23 @@ int uclass_next_device_check(struct udevice **devp);
|
||||||
*/
|
*/
|
||||||
int uclass_resolve_seq(struct udevice *dev);
|
int uclass_resolve_seq(struct udevice *dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* uclass_id_foreach_dev() - Helper function to iteration through devices
|
||||||
|
*
|
||||||
|
* This creates a for() loop which works through the available devices in
|
||||||
|
* a uclass ID in order from start to end.
|
||||||
|
*
|
||||||
|
* If for some reason the uclass cannot be found, this does nothing.
|
||||||
|
*
|
||||||
|
* @id: enum uclass_id ID to use
|
||||||
|
* @pos: struct udevice * to hold the current device. Set to NULL when there
|
||||||
|
* are no more devices.
|
||||||
|
* @uc: temporary uclass variable (struct udevice *)
|
||||||
|
*/
|
||||||
|
#define uclass_id_foreach_dev(id, pos, uc) \
|
||||||
|
if (!uclass_get(id, &uc)) \
|
||||||
|
list_for_each_entry(pos, &uc->dev_head, uclass_node)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* uclass_foreach_dev() - Helper function to iteration through devices
|
* uclass_foreach_dev() - Helper function to iteration through devices
|
||||||
*
|
*
|
||||||
|
|
|
@ -448,6 +448,27 @@ static int dm_test_first_next_device(struct unit_test_state *uts)
|
||||||
}
|
}
|
||||||
DM_TEST(dm_test_first_next_device, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
|
DM_TEST(dm_test_first_next_device, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
|
||||||
|
|
||||||
|
/* Test iteration through devices in a uclass */
|
||||||
|
static int dm_test_uclass_foreach(struct unit_test_state *uts)
|
||||||
|
{
|
||||||
|
struct udevice *dev;
|
||||||
|
struct uclass *uc;
|
||||||
|
int count;
|
||||||
|
|
||||||
|
count = 0;
|
||||||
|
uclass_id_foreach_dev(UCLASS_TEST_FDT, dev, uc)
|
||||||
|
count++;
|
||||||
|
ut_asserteq(8, count);
|
||||||
|
|
||||||
|
count = 0;
|
||||||
|
uclass_foreach_dev(dev, uc)
|
||||||
|
count++;
|
||||||
|
ut_asserteq(8, count);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
DM_TEST(dm_test_uclass_foreach, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* check_devices() - Check return values and pointers
|
* check_devices() - Check return values and pointers
|
||||||
*
|
*
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue