On 9/22/22 16:13, Quentin Schulz wrote:

[...]

@@ -1503,9 +1480,26 @@ static int gpio_post_bind(struct udevice *dev)
                                                                 &child);
                                if (ret)
                                        return ret;
+
+                               /*
+                                * Make sure gpio-hogs are probed after bind
+                                * since hogs can be essential to the hardware
+                                * system.
+                                */
+                               dev_or_flags(child, DM_FLAG_PROBE_AFTER_BIND);
+
+                               /*
+                                * Since gpio-hog is a U_BOOT_DRIVER and not
+                                * a U_BOOT_CLASS, the DM core does not bind
+                                * it and therefore it's up to this driver to
+                                * set the DM_FLAG_PRE_RELOC appropriately.
+                                */
+                               if (ofnode_pre_reloc(node))
+                                       dev_or_flags(child, DM_FLAG_PRE_RELOC);


This second part should be handled by the DM, or you need dm-pre-reloc in your GPIO controller in DT. This would fail e.g. in case your GPIO controller has higher depth of hog subnodes, like:

gpio-controller {
  something {
    gpio-hog {
      u-boot,dm-pre-reloc;
    };
  };
};

Should really be:

gpio-controller {
  u-boot,dm-pre-reloc;
  something {
    u-boot,dm-pre-reloc;
    gpio-hog {
      u-boot,dm-pre-reloc;
    };
  };
};

At some point, I had the idea to instead of littering the DT with u-boot,dm-pre-reloc , we could use phandles instead and do something like:

/ {
 config {
  u-boot,dm-pre-reloc = <&node1 &node2 ... &gpio_hog ...>;
 };
}
...
gpio-controller {
  something {
    gpio_hog: gpio-hog {
    };
  };
};

Reply via email to