UPSTREAM: dm: Add a No-op uclass

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.

Change-Id: Iad9ba5f368bd2de9940cf069baf9bec9d668920c
Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
Signed-off-by: Frank Wang <frank.wang@rock-chips.com>
(cherry picked from commit 07e33711fec4f1106f36805b5dc830da07c783c5)
This commit is contained in:
Jean-Jacques Hiblot 2019-07-05 09:33:57 +02:00 committed by Jianhong Chen
parent 9bc02da530
commit 94fbbf0f6d
5 changed files with 92 additions and 0 deletions

View File

@ -275,6 +275,18 @@
compatible = "sandbox,mmc";
};
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";
};
};
pci: pci-controller {
compatible = "sandbox,pci";
device_type = "pci";

View File

@ -686,3 +686,8 @@ int uclass_pre_remove_device(struct udevice *dev)
return 0;
}
#endif
UCLASS_DRIVER(nop) = {
.id = UCLASS_NOP,
.name = "nop",
};

View File

@ -55,6 +55,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 */

View File

@ -6,6 +6,7 @@
obj-$(CONFIG_CMD_DM) += cmd_dm.o
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

73
test/dm/nop.c Normal file
View File

@ -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);