dm: core: Allow iterating devices without uclass_get()
authorSimon Glass <sjg@chromium.org>
Thu, 6 Feb 2020 16:54:49 +0000 (09:54 -0700)
committerBin Meng <bmeng.cn@gmail.com>
Fri, 7 Feb 2020 14:41:24 +0000 (22:41 +0800)
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>
include/dm/uclass.h
test/dm/test-fdt.c

index 484d166013501016a64ef08079316bd7b455954b..74b8e2ecb5e57c0de3028cf72e6dc5d7b1b838f7 100644 (file)
@@ -365,6 +365,23 @@ int uclass_next_device_check(struct udevice **devp);
  */
 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
  *
index d59c449ce0cdd8159e731dfdf7a11851c11cb31e..8ea536c309337ea970743e7cd2dbaa730d059098 100644 (file)
@@ -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);
 
+/* 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
  *