dm: core: Update uclass_find_next_free_req_seq() for new scheme
authorSimon Glass <sjg@chromium.org>
Thu, 17 Dec 2020 04:20:30 +0000 (21:20 -0700)
committerSimon Glass <sjg@chromium.org>
Sat, 19 Dec 2020 03:32:21 +0000 (20:32 -0700)
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>
drivers/core/device.c
drivers/core/uclass.c
drivers/pci/pci-uclass.c
include/dm/uclass-internal.h

index b878a4d..4abb5be 100644 (file)
@@ -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;
index 42c9ba5..6409457 100644 (file)
@@ -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;
 }
index bff183e..914217d 100644 (file)
@@ -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 */
index 9c23d3f..3e052f9 100644 (file)
 #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