Quoting Greg Kroah-Hartman (2019-10-04 08:37:50) > On Wed, Sep 11, 2019 at 03:29:25AM -0700, Stephen Boyd wrote: > > Quoting Saravana Kannan (2019-09-04 14:11:22) > > > + int ret = 0; > > > + struct device_node *tmp_np = sup_np; > > > + > > > + of_node_get(sup_np); > > > + /* > > > + * Find the device node that contains the supplier phandle. It > > > may be > > > + * @sup_np or it may be an ancestor of @sup_np. > > > + */ > > > + while (sup_np && !of_find_property(sup_np, "compatible", NULL)) > > > + sup_np = of_get_next_parent(sup_np); > > > > I don't get this. This is assuming that drivers are only probed for > > device nodes that have a compatible string? What about drivers that make > > sub-devices for clk support that have drivers in drivers/clk/ that then > > attach at runtime later? This happens sometimes for MFDs that want to > > split the functionality across the driver tree to the respective > > subsystems. > > For that, the link would not be there, correct?
The parent device (MFD) would have the links because that is the device node with the provider property like '#clock-cells'. The child clk device that's populated by the MFD would be the one actually providing the clk via a driver that may probe any time later, or never, depending on if the clk driver is configured as a module or not. I fail to see how this will work for these cases. Is this logic there to find the parent of a regulator phandle and match that to some driver? It looks like it. > > > > +static int of_link_property(struct device *dev, struct device_node > > > *con_np, > > > + const char *prop_name) > > > +{ > > > + struct device_node *phandle; > > > + const struct supplier_bindings *s = bindings; > > > + unsigned int i = 0; > > > + bool matched = false; > > > + int ret = 0; > > > + > > > + /* Do not stop at first failed link, link all available > > > suppliers. */ > > > + while (!matched && s->parse_prop) { > > > + while ((phandle = s->parse_prop(con_np, prop_name, i))) { > > > + matched = true; > > > + i++; > > > + if (of_link_to_phandle(dev, phandle) == -EAGAIN) > > > + ret = -EAGAIN; > > > > And don't break? > > There was comments before about how this is not needed. Frank asked > that the comment be removed. And now you point it out again :) > > Look at the comment a few lines up, we have to go through all of the > suppliers. > Ok. The comment tells me what is happening but it misses the essential part which is _why_ we must make links to each supplier and return -EAGAIN.