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@chromium.org 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.