From a133e2179a729036e7750b497c1c38f9f6a3a835 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Wed, 16 Dec 2020 21:20:30 -0700 Subject: [PATCH] dm: core: Update uclass_find_next_free_req_seq() for new scheme 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 --- drivers/core/device.c | 8 ++------ drivers/core/uclass.c | 21 ++++++++++++++------- drivers/pci/pci-uclass.c | 2 +- include/dm/uclass-internal.h | 17 ++++++++++------- 4 files changed, 27 insertions(+), 21 deletions(-) diff --git a/drivers/core/device.c b/drivers/core/device.c index b878a4d4b6..4abb5be56a 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 && !(uc->uc_drv->flags & DM_UC_FLAG_NO_AUTO_SEQ)) - dev->sqq = uclass_find_next_free_req_seq(uc); + dev->sqq = uclass_find_next_free_seq(uc); if (drv->plat_auto) { bool alloc = !plat; diff --git a/drivers/core/uclass.c b/drivers/core/uclass.c index 42c9ba5828..6409457fa9 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; - list_for_each_entry(dev, &uc->dev_head, uclass_node) { - if ((dev->req_seq != -1) && (dev->req_seq > max)) - max = dev->req_seq; - } + /* 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); - if (max == -1) - return 0; + /* Avoid conflict with existing devices */ + list_for_each_entry(dev, &uc->dev_head, uclass_node) { + if (dev->sqq > max) + max = dev->sqq; + } + /* + * At this point, max will be -1 if there are no existing aliases or + * devices + */ return max + 1; } diff --git a/drivers/pci/pci-uclass.c b/drivers/pci/pci-uclass.c index bff183eea2..914217d0c9 100644 --- a/drivers/pci/pci-uclass.c +++ b/drivers/pci/pci-uclass.c @@ -1019,7 +1019,7 @@ static int pci_uclass_pre_probe(struct udevice *bus) ret = uclass_get(UCLASS_PCI, &uc); if (ret) return ret; - bus->sqq = uclass_find_next_free_req_seq(uc); + bus->sqq = uclass_find_next_free_seq(uc); } /* For bridges, use the top-level PCI controller */ diff --git a/include/dm/uclass-internal.h b/include/dm/uclass-internal.h index 9c23d3f223..3e052f95d3 100644 --- a/include/dm/uclass-internal.h +++ b/include/dm/uclass-internal.h @@ -12,17 +12,20 @@ #include /** - * 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