summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilipp Tomsich <philipp.tomsich@theobroma-systems.com>2017-02-22 13:09:40 +0100
committerPhilipp Tomsich <philipp.tomsich@theobroma-systems.com>2017-03-09 01:40:19 +0100
commit9b001190edfeb4d8e456b612a06d3a2a0ff104b4 (patch)
tree3876c25649bc665dd11dd7d7f9d0251f2854dbb5
parentb74fc67d97a514e47090d28110746eee1c867cfd (diff)
dm: core: Allow multiple drivers to bind for a single node
Currently, driver binding stops once it encounters the first compatible driver that doesn't refuse to bind. However, there are cases where a single node will need to be handled by multiple driver classes. For those cases we provide a configurable option to continue to bind after the first driver has been found. The first use cases for this are from the DM conversion of the sunxi (Allwinner) architecture: * pinctrl (UCLASS_PINCTRL) and gpio (UCLASS_GPIO) drivers need to bind against a single node * clock (UCLASS_CLK) and reset (UCLASS_RESET) drivers also need to bind against a single node Signed-off-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
-rw-r--r--drivers/core/Kconfig14
-rw-r--r--drivers/core/lists.c12
2 files changed, 25 insertions, 1 deletions
diff --git a/drivers/core/Kconfig b/drivers/core/Kconfig
index 87495614c2..913101ce87 100644
--- a/drivers/core/Kconfig
+++ b/drivers/core/Kconfig
@@ -31,6 +31,20 @@ config DM_WARN
This will cause dm_warn() to be compiled out - it will do nothing
when called.
+config DM_ALLOW_MULTIPLE_DRIVERS
+ bool "Allow multiple drivers to bind for one node"
+ depends on DM
+ default n
+ help
+ The driver model in U-Boot originally did not allow multiple
+ drivers to bind for a single device node.
+
+ If enabled, multiple drivers can now bind for a single node
+ by using the same compatible string for matching: lists_bind_fdt()
+ will assume that binding multiple drivers is desirable, if the
+ caller does not request the pointer to the udevice structure to
+ be returned (i.e. if devp is NULL).
+
config DM_DEVICE_REMOVE
bool "Support device removal"
depends on DM
diff --git a/drivers/core/lists.c b/drivers/core/lists.c
index 23b6ba78d3..912469381b 100644
--- a/drivers/core/lists.c
+++ b/drivers/core/lists.c
@@ -166,7 +166,11 @@ int lists_bind_fdt(struct udevice *parent, const void *blob, int offset,
dm_dbg(" - attempt to match compatible string '%s'\n",
compat);
- for (entry = driver; entry != driver + n_ents; entry++) {
+ entry = driver;
+#if defined(CONFIG_DM_ALLOW_MULTIPLE_DRIVERS)
+allow_more_matches:
+#endif
+ for (; entry != driver + n_ents; entry++) {
ret = driver_check_compatible(entry->of_match, &id,
compat);
if (!ret)
@@ -190,6 +194,12 @@ int lists_bind_fdt(struct udevice *parent, const void *blob, int offset,
found = true;
if (devp)
*devp = dev;
+#if defined(CONFIG_DM_ALLOW_MULTIPLE_DRIVERS)
+ else {
+ entry++;
+ goto allow_more_matches;
+ }
+#endif
}
break;
}