aboutsummaryrefslogtreecommitdiff
path: root/drivers/core
diff options
context:
space:
mode:
authorSimon Glass2020-12-16 21:20:09 -0700
committerSimon Glass2020-12-18 20:32:21 -0700
commitcd53e5bf4bba421d98eb42ec71af31b521a90c2a (patch)
tree128329e66c8f8b2e0ea84763be364a1b86871f58 /drivers/core
parentd03adb4a78d18b5506350b3ac72ab2f18f1ed160 (diff)
dm: core: Add a new sequence number for devices
At present each device has two sequence numbers, with 'req_seq' being set up at bind time and 'seq' at probe time. The idea is that devices can 'request' a sequence number and then the conflicts are resolved when the device is probed. This makes things complicated in a few cases, since we don't really know what the sequence number will end up being. We want to honour the bind-time requests if at all possible, but in fact the only source of these at present is the devicetree aliases. Since we have the devicetree available at bind time, we may as well just use it, in the hope that the required processing will turn out to be useful later (i.e. the device actually gets used). Add a new 'sqq' member, the bind-time sequence number. It operates in parallel to the old values for now. All devices get a valid sqq value, i.e. it is never -1. Drop an #ifdef while we are here. Signed-off-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'drivers/core')
-rw-r--r--drivers/core/device.c22
-rw-r--r--drivers/core/root.c8
2 files changed, 21 insertions, 9 deletions
diff --git a/drivers/core/device.c b/drivers/core/device.c
index 22d80694cd8..8d1287f9a19 100644
--- a/drivers/core/device.c
+++ b/drivers/core/device.c
@@ -41,6 +41,7 @@ static int device_bind_common(struct udevice *parent, const struct driver *drv,
struct udevice *dev;
struct uclass *uc;
int size, ret = 0;
+ bool auto_seq = true;
if (devp)
*devp = NULL;
@@ -73,6 +74,7 @@ static int device_bind_common(struct udevice *parent, const struct driver *drv,
dev->seq = -1;
dev->req_seq = -1;
+ dev->sqq = -1;
if (CONFIG_IS_ENABLED(DM_SEQ_ALIAS) &&
(uc->uc_drv->flags & DM_UC_FLAG_SEQ_ALIAS)) {
/*
@@ -84,17 +86,25 @@ static int device_bind_common(struct udevice *parent, const struct driver *drv,
*/
if (CONFIG_IS_ENABLED(OF_CONTROL) &&
!CONFIG_IS_ENABLED(OF_PLATDATA)) {
- if (uc->uc_drv->name && ofnode_valid(node))
+ if (uc->uc_drv->name && ofnode_valid(node)) {
+ dev_read_alias_seq(dev, &dev->sqq);
dev_read_alias_seq(dev, &dev->req_seq);
-#if CONFIG_IS_ENABLED(OF_PRIOR_STAGE)
- if (dev->req_seq == -1)
- dev->req_seq =
- uclass_find_next_free_req_seq(uc);
-#endif
+ auto_seq = false;
+ }
+ if (CONFIG_IS_ENABLED(OF_PRIOR_STAGE)) {
+ if (dev->req_seq == -1) {
+ auto_seq = true;
+ dev->req_seq =
+ uclass_find_next_free_req_seq(
+ uc);
+ }
+ }
} else {
dev->req_seq = uclass_find_next_free_req_seq(uc);
}
}
+ if (auto_seq)
+ dev->sqq = uclass_find_next_free_req_seq(uc);
if (drv->plat_auto) {
bool alloc = !plat;
diff --git a/drivers/core/root.c b/drivers/core/root.c
index 672aa7cea72..f2fba5883aa 100644
--- a/drivers/core/root.c
+++ b/drivers/core/root.c
@@ -311,22 +311,24 @@ int dm_init_and_scan(bool pre_reloc_only)
ret = dm_scan_plat(pre_reloc_only);
if (ret) {
debug("dm_scan_plat() failed: %d\n", ret);
- return ret;
+ goto fail;
}
if (CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)) {
ret = dm_extended_scan(pre_reloc_only);
if (ret) {
debug("dm_extended_scan() failed: %d\n", ret);
- return ret;
+ goto fail;
}
}
ret = dm_scan_other(pre_reloc_only);
if (ret)
- return ret;
+ goto fail;
return 0;
+fail:
+ return ret;
}
#ifdef CONFIG_ACPIGEN