]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
dm: core: Add a new sequence number for devices
authorSimon Glass <sjg@chromium.org>
Thu, 17 Dec 2020 04:20:09 +0000 (21:20 -0700)
committerSimon Glass <sjg@chromium.org>
Sat, 19 Dec 2020 03:32:21 +0000 (20:32 -0700)
At present each device has two sequence numbers, with 'req_seq' being
set up at bind time and 'seq' at probe time. The idea is that devices
can 'request' a sequence number and then the conflicts are resolved when
the device is probed.

This makes things complicated in a few cases, since we don't really know
what the sequence number will end up being. We want to honour the
bind-time requests if at all possible, but in fact the only source of
these at present is the devicetree aliases. Since we have the devicetree
available at bind time, we may as well just use it, in the hope that the
required processing will turn out to be useful later (i.e. the device
actually gets used).

Add a new 'sqq' member, the bind-time sequence number. It operates in
parallel to the old values for now. All devices get a valid sqq value,
i.e. it is never -1.

Drop an #ifdef while we are here.

Signed-off-by: Simon Glass <sjg@chromium.org>
drivers/core/device.c
drivers/core/root.c
include/dm/device.h

index 22d80694cd8e81f9cd40279247a3c3e8d9c041ed..8d1287f9a196a9e1b0a3bedd166d39c426f9a164 100644 (file)
@@ -41,6 +41,7 @@ static int device_bind_common(struct udevice *parent, const struct driver *drv,
        struct udevice *dev;
        struct uclass *uc;
        int size, ret = 0;
+       bool auto_seq = true;
 
        if (devp)
                *devp = NULL;
@@ -73,6 +74,7 @@ static int device_bind_common(struct udevice *parent, const struct driver *drv,
 
        dev->seq = -1;
        dev->req_seq = -1;
+       dev->sqq = -1;
        if (CONFIG_IS_ENABLED(DM_SEQ_ALIAS) &&
            (uc->uc_drv->flags & DM_UC_FLAG_SEQ_ALIAS)) {
                /*
@@ -84,17 +86,25 @@ static int device_bind_common(struct udevice *parent, const struct driver *drv,
                 */
                if (CONFIG_IS_ENABLED(OF_CONTROL) &&
                    !CONFIG_IS_ENABLED(OF_PLATDATA)) {
-                       if (uc->uc_drv->name && ofnode_valid(node))
+                       if (uc->uc_drv->name && ofnode_valid(node)) {
+                               dev_read_alias_seq(dev, &dev->sqq);
                                dev_read_alias_seq(dev, &dev->req_seq);
-#if CONFIG_IS_ENABLED(OF_PRIOR_STAGE)
-                       if (dev->req_seq == -1)
-                               dev->req_seq =
-                                       uclass_find_next_free_req_seq(uc);
-#endif
+                               auto_seq = false;
+                       }
+                       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);
+                               }
+                       }
                } else {
                        dev->req_seq = uclass_find_next_free_req_seq(uc);
                }
        }
+       if (auto_seq)
+               dev->sqq = uclass_find_next_free_req_seq(uc);
 
        if (drv->plat_auto) {
                bool alloc = !plat;
index 672aa7cea72dd832dfc07630f75d7848966a65ea..f2fba5883aae1f2de6e768743f5608203fce2e04 100644 (file)
@@ -311,22 +311,24 @@ int dm_init_and_scan(bool pre_reloc_only)
        ret = dm_scan_plat(pre_reloc_only);
        if (ret) {
                debug("dm_scan_plat() failed: %d\n", ret);
-               return ret;
+               goto fail;
        }
 
        if (CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)) {
                ret = dm_extended_scan(pre_reloc_only);
                if (ret) {
                        debug("dm_extended_scan() failed: %d\n", ret);
-                       return ret;
+                       goto fail;
                }
        }
 
        ret = dm_scan_other(pre_reloc_only);
        if (ret)
-               return ret;
+               goto fail;
 
        return 0;
+fail:
+       return ret;
 }
 
 #ifdef CONFIG_ACPIGEN
index 7ada7200e3d4871b7a6c54d4a90ef0f73b244308..725e313eacd637991226eaed07e0a6bf02d14949 100644 (file)
@@ -131,6 +131,13 @@ enum {
  * @child_head: List of children of this device
  * @sibling_node: Next device in list of all devices
  * @flags: Flags for this device DM_FLAG_...
+ * @sqq: Allocated sequence number for this device (-1 = none). This is set up
+ * when the device is bound and is unique within the device's uclass. If the
+ * device has an alias in the devicetree then that is used to set the sequence
+ * number. Otherwise, the next available number is used. Sequence numbers are
+ * used by certain commands that need device to be numbered (e.g. 'mmc dev')
+ *
+ * The following two fields are deprecated:
  * @req_seq: Requested sequence number for this device (-1 = any)
  * @seq: Allocated sequence number for this device (-1 = none). This is set up
  * when the device is probed and will be unique within the device's uclass.
@@ -156,6 +163,7 @@ struct udevice {
        struct list_head child_head;
        struct list_head sibling_node;
        uint32_t flags;
+       int sqq;
        int req_seq;
        int seq;
 #ifdef CONFIG_DEVRES