diff options
author | Simon Glass | 2020-12-16 21:20:30 -0700 |
---|---|---|
committer | Simon Glass | 2020-12-18 20:32:21 -0700 |
commit | a133e2179a729036e7750b497c1c38f9f6a3a835 (patch) | |
tree | e8701370910c0a3c2db692051baef3c39455e3fa /drivers | |
parent | 991759196faa74b2e7df1cb8e87820f4ec7285f8 (diff) |
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 <sjg@chromium.org>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/core/device.c | 8 | ||||
-rw-r--r-- | drivers/core/uclass.c | 19 | ||||
-rw-r--r-- | drivers/pci/pci-uclass.c | 2 |
3 files changed, 16 insertions, 13 deletions
diff --git a/drivers/core/device.c b/drivers/core/device.c index b878a4d4b69..4abb5be56a4 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 42c9ba58281..6409457fa96 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/drivers/pci/pci-uclass.c b/drivers/pci/pci-uclass.c index bff183eea23..914217d0c9a 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 */ |