Quoting Stephen Boyd (2021-10-07 11:40:07) > Quoting Saravana Kannan (2021-10-06 20:07:11) > > On Wed, Oct 6, 2021 at 12:38 PM Stephen Boyd <swboyd@xxxxxxxxxxxx> wrote: > > > diff --git a/drivers/base/component.c b/drivers/base/component.c > > > index 0a41bbe14981..d99e99cabb99 100644 > > > --- a/drivers/base/component.c > > > +++ b/drivers/base/component.c > [...] > > > + continue; > > > + > > > + /* Matches put in component_del() */ > > > + get_device(&adev->dev); > > > + c->link = device_link_add(&adev->dev, c->dev, > > > + DL_FLAG_STATELESS | DL_FLAG_PM_RUNTIME); > > > > Remove the STATELESS flag and you'll get a bunch of other stuff done for free: > > I tried that and it didn't work for me. The aggregate device never > probed and I was left with no display. Let me see if I can reproduce it > with logging to provide more details. This patch fixes it (whitespace damaged sorry). ----8<---- diff --git a/drivers/base/component.c b/drivers/base/component.c index 65042c9f8a42..43cac9ed70b7 100644 --- a/drivers/base/component.c +++ b/drivers/base/component.c @@ -202,7 +202,7 @@ static int find_components(struct aggregate_device *adev) /* Matches put in component_del() */ get_device(&adev->dev); c->link = device_link_add(&adev->dev, c->dev, - DL_FLAG_STATELESS | DL_FLAG_PM_RUNTIME); + DL_FLAG_PM_RUNTIME); c->adev = adev; } @@ -749,7 +749,9 @@ static int __component_add(struct device *dev, const struct component_ops *ops, mutex_unlock(&component_mutex); /* Try to bind */ - return bus_rescan_devices(&aggregate_bus_type); + bus_rescan_devices(&aggregate_bus_type); + + return 0; } /** The important part is ignoring the return value of bus_rescan_devices(). It's a cycle problem. The last component is probing and calling component_add() in its probe function. The call to component_add() is trying to probe the aggregate device now that all components are added. But when it tries to probe the aggregate device it sees that a supplier, which is this component calling compnent_add(), hasn't been probed yet, so it returns -EPROBE_DEFER. That is passed up to the component and it defers probe. I don't think the component device cares at all about the aggregate device being able to probe or not. We should be able to ignore the return value of bus_rescan_devices() in component_add(). I'll add a comment to the code here so it's more obvious.