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