On Tue, Jun 17, 2014 at 09:38:42AM +0200, Boris BREZILLON wrote: > Make use of the devm_regulator_set_register instead of registering each > regulator provided by the PMIC. > > This also solves a self dependency issue where one regulator of the PMIC > is used as a supply for anoher regulator provided by the same PMIC. > > Signed-off-by: Boris BREZILLON <boris.brezillon@xxxxxxxxxxxxxxxxxx> > --- > drivers/regulator/axp20x-regulator.c | 59 ++++++++++++++---------------------- > 1 file changed, 23 insertions(+), 36 deletions(-) > > diff --git a/drivers/regulator/axp20x-regulator.c b/drivers/regulator/axp20x-regulator.c > index d42bf6d..e8f0df7 100644 > --- a/drivers/regulator/axp20x-regulator.c > +++ b/drivers/regulator/axp20x-regulator.c > @@ -301,66 +301,53 @@ static int axp20x_set_dcdc_workmode(struct regulator_dev *rdev, int id, u32 work > > static int axp20x_regulator_probe(struct platform_device *pdev) > { > - struct regulator_dev *rdev; > + struct regulator_set *rset; > struct axp20x_dev *axp20x = dev_get_drvdata(pdev->dev.parent); > - struct regulator_config config = { }; > - struct regulator_init_data *init_data; > + struct regulator_set_config config; > struct of_regulator_match *matches; > - int nmatches; > - const struct regulator_desc *regulators; > - int nregulators; > int ret, i; > u32 workmode; > > + memset(&config, 0, sizeof(config)); > + config.dev = &pdev->dev; > + config.regmap = axp20x->regmap; > if (axp20x->variant == AXP221_ID) { > matches = axp22x_matches; > - nmatches = ARRAY_SIZE(axp22x_matches); > - regulators = axp22x_regulators; > - nregulators = AXP22X_REG_ID_MAX; > + config.descs = axp22x_regulators; > + config.nregulators = AXP22X_REG_ID_MAX; > } else { > matches = axp20x_matches; > - nmatches = ARRAY_SIZE(axp20x_matches); > - regulators = axp20x_regulators; > - nregulators = AXP20X_REG_ID_MAX; > + config.descs = axp20x_regulators; > + config.nregulators = AXP20X_REG_ID_MAX; > } > + config.matches = matches; > > /* > * Reset matches table (this table might have been modified by a > * previous AXP2xx device probe). > */ > - for (i = 0; i < nmatches; i++) { > + for (i = 0; i < config.nregulators; i++) { > matches[i].init_data = NULL; > matches[i].of_node = NULL; > } > > - ret = axp20x_regulator_parse_dt(pdev, matches, nmatches); > + ret = axp20x_regulator_parse_dt(pdev, matches, > + config.nregulators); > if (ret) > return ret; > > - for (i = 0; i < AXP20X_REG_ID_MAX; i++) { > - init_data = matches[i].init_data; > + rset = devm_regulator_set_register(&pdev->dev, &config); > + if (IS_ERR(rset)) > + return PTR_ERR(rset); > > - config.dev = &pdev->dev; > - config.init_data = init_data; > - config.regmap = axp20x->regmap; > - config.of_node = matches[i].of_node; > - > - rdev = devm_regulator_register(&pdev->dev, ®ulators[i], > - &config); > - if (IS_ERR(rdev)) { > - dev_err(&pdev->dev, "Failed to register %s\n", > - regulators[i].name); > - > - return PTR_ERR(rdev); > - } > - > - ret = of_property_read_u32(matches[i].of_node, "x-powers,dcdc-workmode", > + for (i = 0; i < rset->nregulators; i++) { > + ret = of_property_read_u32(config.matches[i].of_node, > + "x-powers,dcdc-workmode", > &workmode); > - if (!ret) { > - if (axp20x_set_dcdc_workmode(rdev, i, workmode)) > - dev_err(&pdev->dev, "Failed to set workmode on %s\n", > - regulators[i].name); > - } > + if (!ret && > + axp20x_set_dcdc_workmode(rset->regulators[i], i, workmode)) > + dev_err(&pdev->dev, "Failed to set workmode on %s\n", > + config.descs[i].name); > } > > return 0; > -- > 1.8.3.2 > It looks like you're modifying code you just introduced. You should probably move this patch earlier on, so that you don't have to patch your patch. Maxime -- Maxime Ripard, Free Electrons Embedded Linux, Kernel and Android engineering http://free-electrons.com
Attachment:
signature.asc
Description: Digital signature