[PATCH v2 23/26] dm: core: Update uclass_find_next_free_req_seq() for new scheme
Simon Glass
sjg at chromium.org
Fri Dec 11 02:31:48 CET 2020
This function current deals with req_seq which is deprecated. Update it to
use the new sequence numbers, putting them above existing aliases. Rename
the function to make this clear.
Signed-off-by: Simon Glass <sjg at chromium.org>
---
Changes in v2:
- Update for new logic
- Adjust commit message
- Drop pointless check for max == -1
drivers/core/device.c | 8 ++------
drivers/core/uclass.c | 19 +++++++++++++------
include/dm/uclass-internal.h | 17 ++++++++++-------
3 files changed, 25 insertions(+), 19 deletions(-)
diff --git a/drivers/core/device.c b/drivers/core/device.c
index fe4a08d1eb6..11ae89cf4ad 100644
--- a/drivers/core/device.c
+++ b/drivers/core/device.c
@@ -93,18 +93,14 @@ static int device_bind_common(struct udevice *parent, const struct driver *drv,
}
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);
+ uclass_find_next_free_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);
+ dev->sqq = uclass_find_next_free_seq(uc);
if (drv->platdata_auto_alloc_size) {
bool alloc = !platdata;
diff --git a/drivers/core/uclass.c b/drivers/core/uclass.c
index b981042f7e6..92edac55ca6 100644
--- a/drivers/core/uclass.c
+++ b/drivers/core/uclass.c
@@ -272,18 +272,25 @@ int uclass_find_device_by_name(enum uclass_id id, const char *name,
return -ENODEV;
}
-int uclass_find_next_free_req_seq(struct uclass *uc)
+int uclass_find_next_free_seq(struct uclass *uc)
{
struct udevice *dev;
int max = -1;
+ /* If using aliases, start with the highest alias value */
+ if (CONFIG_IS_ENABLED(DM_SEQ_ALIAS) &&
+ (uc->uc_drv->flags & DM_UC_FLAG_SEQ_ALIAS))
+ max = dev_read_alias_highest_id(uc->uc_drv->name);
+
+ /* Avoid conflict with existing devices */
list_for_each_entry(dev, &uc->dev_head, uclass_node) {
- if ((dev->req_seq != -1) && (dev->req_seq > max))
- max = dev->req_seq;
+ if (dev->sqq > max)
+ max = dev->sqq;
}
-
- if (max == -1)
- return 0;
+ /*
+ * At this point, max will be -1 if there are no existing aliases or
+ * devices
+ */
return max + 1;
}
diff --git a/include/dm/uclass-internal.h b/include/dm/uclass-internal.h
index 9c23d3f223e..3e052f95d32 100644
--- a/include/dm/uclass-internal.h
+++ b/include/dm/uclass-internal.h
@@ -12,17 +12,20 @@
#include <dm/ofnode.h>
/**
- * uclass_find_next_free_req_seq() - Get the next free req_seq number
+ * uclass_find_next_free_seq() - Get the next free sequence number
*
- * This returns the next free req_seq number. This is useful only if
- * OF_CONTROL is not used. The next free req_seq number is simply the
- * maximum req_seq of the uclass + 1.
- * This allows assiging req_seq number in the binding order.
+ * This returns the next free sequence number. This is useful only if
+ * OF_CONTROL is not used. The next free sequence number is simply the
+ * maximum sequence number used by all devices in the uclass + 1. The value
+ * returned is always greater than the largest alias, if DM_SEQ_ALIAS is enabled
+ * and the uclass has the DM_UC_FLAG_SEQ_ALIAS flag.
+ *
+ * This allows assigning the sequence number in the binding order.
*
* @uc: uclass to check
- * @return The next free req_seq number
+ * @return The next free sequence number
*/
-int uclass_find_next_free_req_seq(struct uclass *uc);
+int uclass_find_next_free_seq(struct uclass *uc);
/**
* uclass_get_device_tail() - handle the end of a get_device call
--
2.29.2.576.ga3fc446d84-goog
More information about the U-Boot
mailing list