Hi, [+cc Linus Walleij (I guess we should add a MAINTAINERS entry for the ab8500* power-supply drivers)] On Wed, Oct 06, 2021 at 12:38:13PM -0700, Stephen Boyd wrote: > Use an aggregate driver instead of component ops so that we can get > proper driver probe ordering of the aggregate device with respect to all > the component devices that make up the aggregate device. > > Cc: Sebastian Reichel > Cc: > Cc: Daniel Vetter > Cc: "Rafael J. Wysocki" > Cc: Rob Clark > Cc: Russell King > Cc: Saravana Kannan > Signed-off-by: Stephen Boyd > --- Acked-by: Sebastian Reichel -- Sebastian > drivers/power/supply/ab8500_charger.c | 22 +++++++++++++--------- > 1 file changed, 13 insertions(+), 9 deletions(-) > > diff --git a/drivers/power/supply/ab8500_charger.c b/drivers/power/supply/ab8500_charger.c > index 15eadaf46f14..52d4105e28f2 100644 > --- a/drivers/power/supply/ab8500_charger.c > +++ b/drivers/power/supply/ab8500_charger.c > @@ -3312,8 +3312,9 @@ static const struct power_supply_desc ab8500_usb_chg_desc = { > .get_property = ab8500_charger_usb_get_property, > }; > > -static int ab8500_charger_bind(struct device *dev) > +static int ab8500_charger_bind(struct aggregate_device *adev) > { > + struct device *dev = adev->parent; > struct ab8500_charger *di = dev_get_drvdata(dev); > int ch_stat; > int ret; > @@ -3354,8 +3355,9 @@ static int ab8500_charger_bind(struct device *dev) > return 0; > } > > -static void ab8500_charger_unbind(struct device *dev) > +static void ab8500_charger_unbind(struct aggregate_device *adev) > { > + struct device *dev = adev->parent; > struct ab8500_charger *di = dev_get_drvdata(dev); > int ret; > > @@ -3380,9 +3382,13 @@ static void ab8500_charger_unbind(struct device *dev) > component_unbind_all(dev, di); > } > > -static const struct component_master_ops ab8500_charger_comp_ops = { > - .bind = ab8500_charger_bind, > - .unbind = ab8500_charger_unbind, > +static struct aggregate_driver ab8500_charger_aggregate_driver = { > + .probe = ab8500_charger_bind, > + .remove = ab8500_charger_unbind, > + .driver = { > + .name = "ab8500_charger_agg", > + .owner = THIS_MODULE, > + }, > }; > > static struct platform_driver *const ab8500_charger_component_drivers[] = { > @@ -3663,9 +3669,7 @@ static int ab8500_charger_probe(struct platform_device *pdev) > } > > > - ret = component_master_add_with_match(&pdev->dev, > - &ab8500_charger_comp_ops, > - match); > + ret = component_aggregate_register(&pdev->dev, &ab8500_charger_aggregate_driver, match); > if (ret) { > dev_err(dev, "failed to add component master\n"); > goto free_notifier; > @@ -3688,7 +3692,7 @@ static int ab8500_charger_remove(struct platform_device *pdev) > { > struct ab8500_charger *di = platform_get_drvdata(pdev); > > - component_master_del(&pdev->dev, &ab8500_charger_comp_ops); > + component_aggregate_unregister(&pdev->dev, &ab8500_charger_aggregate_driver); > > usb_unregister_notifier(di->usb_phy, &di->nb); > usb_put_phy(di->usb_phy); > -- > https://chromeos.dev >