dm: Add a No-op uclass
authorJean-Jacques Hiblot <jjhiblot@ti.com>
Fri, 5 Jul 2019 07:33:57 +0000 (09:33 +0200)
committerMarek Vasut <marex@denx.de>
Fri, 5 Jul 2019 12:19:41 +0000 (14:19 +0200)
This uclass is intended for devices that do not need any features from the
uclass, including binding children.
This will typically be used by devices that are used to bind child devices
but do not use dm_scan_fdt_dev() to do it. That is for example the case of
several USB wrappers that have 2 child devices (1 for device and 1 for
host) but bind only one at a any given time.

Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
arch/sandbox/dts/test.dts
drivers/core/uclass.c
include/dm/uclass-id.h
test/dm/Makefile
test/dm/nop.c [new file with mode: 0644]

index 8b2d6451c64375cf7d10b509c54fda8e8216a931..c328258901a93b90517f56856e251e7ec4ec4f4e 100644 (file)
                sandbox,silent; /* Don't emit sounds while testing */
        };
 
+       nop-test_0 {
+               compatible = "sandbox,nop_sandbox1";
+               nop-test_1 {
+                       compatible = "sandbox,nop_sandbox2";
+                       bind = "True";
+               };
+               nop-test_2 {
+                       compatible = "sandbox,nop_sandbox2";
+                       bind = "False";
+               };
+       };
+
        misc-test {
                compatible = "sandbox,misc_sandbox";
        };
index fc3157de39c16ab5b7f5f584ef7e349410443739..dc9eb62893e0d2d84283aa39d8c6bffd4868b201 100644 (file)
@@ -757,3 +757,8 @@ int uclass_pre_remove_device(struct udevice *dev)
        return 0;
 }
 #endif
+
+UCLASS_DRIVER(nop) = {
+       .id             = UCLASS_NOP,
+       .name           = "nop",
+};
index 09e0ad5391b9771f97bbcc20b6e3fa989ff740c0..418392875cfd5619c1a24687d13278b944f74dc3 100644 (file)
@@ -62,6 +62,7 @@ enum uclass_id {
        UCLASS_MMC,             /* SD / MMC card or chip */
        UCLASS_MOD_EXP,         /* RSA Mod Exp device */
        UCLASS_MTD,             /* Memory Technology Device (MTD) device */
+       UCLASS_NOP,             /* No-op devices */
        UCLASS_NORTHBRIDGE,     /* Intel Northbridge / SDRAM controller */
        UCLASS_NVME,            /* NVM Express device */
        UCLASS_PANEL,           /* Display panel, such as an LCD */
index 49857c50929816773a4487f1e186108680064c0d..aeb3aa0ca7c0abe2a01f9392184e9d56fedd4405 100644 (file)
@@ -3,6 +3,7 @@
 # Copyright (c) 2013 Google, Inc
 
 obj-$(CONFIG_UT_DM) += bus.o
+obj-$(CONFIG_UT_DM) += nop.o
 obj-$(CONFIG_UT_DM) += test-driver.o
 obj-$(CONFIG_UT_DM) += test-fdt.o
 obj-$(CONFIG_UT_DM) += test-main.o
diff --git a/test/dm/nop.c b/test/dm/nop.c
new file mode 100644 (file)
index 0000000..2df29f3
--- /dev/null
@@ -0,0 +1,73 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Test for the NOP uclass
+ *
+ * (C) Copyright 2019 - Texas Instruments Incorporated - http://www.ti.com/
+ * Jean-Jacques Hiblot <jjhiblot@ti.com>
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <dm/ofnode.h>
+#include <dm/lists.h>
+#include <dm/device.h>
+#include <dm/test.h>
+#include <misc.h>
+#include <test/ut.h>
+
+static int noptest_bind(struct udevice *parent)
+{
+       ofnode ofnode = dev_read_first_subnode(parent);
+
+       while (ofnode_valid(ofnode)) {
+               struct udevice *dev;
+               const char *bind_flag = ofnode_read_string(ofnode, "bind");
+
+               if (bind_flag && (strcmp(bind_flag, "True") == 0))
+                       lists_bind_fdt(parent, ofnode, &dev, false);
+               ofnode = dev_read_next_subnode(ofnode);
+       }
+
+       return 0;
+}
+
+static const struct udevice_id noptest1_ids[] = {
+       {
+               .compatible = "sandbox,nop_sandbox1",
+       },
+       { }
+};
+
+U_BOOT_DRIVER(noptest_drv1) = {
+       .name   = "noptest1_drv",
+       .of_match       = noptest1_ids,
+       .id     = UCLASS_NOP,
+       .bind = noptest_bind,
+};
+
+static const struct udevice_id noptest2_ids[] = {
+       {
+               .compatible = "sandbox,nop_sandbox2",
+       },
+       { }
+};
+
+U_BOOT_DRIVER(noptest_drv2) = {
+       .name   = "noptest2_drv",
+       .of_match       = noptest2_ids,
+       .id     = UCLASS_NOP,
+};
+
+static int dm_test_nop(struct unit_test_state *uts)
+{
+       struct udevice *dev;
+
+       ut_assertok(uclass_get_device_by_name(UCLASS_NOP, "nop-test_0", &dev));
+       ut_assertok(uclass_get_device_by_name(UCLASS_NOP, "nop-test_1", &dev));
+       ut_asserteq(-ENODEV,
+                   uclass_get_device_by_name(UCLASS_NOP, "nop-test_2", &dev));
+
+       return 0;
+}
+
+DM_TEST(dm_test_nop, DM_TESTF_FLAT_TREE | DM_TESTF_SCAN_FDT);