regulator: ab3100: refactor probe to use IDs
This refactors the AB3100 regulator probe to use regulator IDs and pass this to a separate registration function. This works much smoother when migrating to device tree, as we can use a match table with this regulator ID encoded in the .driver_data. Signed-off-by: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
This commit is contained in:
parent
60d509fa6a
commit
9b31835341
@ -488,6 +488,58 @@ ab3100_regulator_desc[AB3100_NUM_REGULATORS] = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static int ab3100_regulator_register(struct platform_device *pdev,
|
||||||
|
struct ab3100_platform_data *plfdata,
|
||||||
|
int id)
|
||||||
|
{
|
||||||
|
struct regulator_desc *desc;
|
||||||
|
struct ab3100_regulator *reg;
|
||||||
|
struct regulator_dev *rdev;
|
||||||
|
struct regulator_config config = { };
|
||||||
|
int err, i;
|
||||||
|
|
||||||
|
for (i = 0; i < AB3100_NUM_REGULATORS; i++) {
|
||||||
|
desc = &ab3100_regulator_desc[i];
|
||||||
|
if (desc->id == id)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (desc->id != id)
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
|
/* Same index used for this array */
|
||||||
|
reg = &ab3100_regulators[i];
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Initialize per-regulator struct.
|
||||||
|
* Inherit platform data, this comes down from the
|
||||||
|
* i2c boarddata, from the machine. So if you want to
|
||||||
|
* see what it looks like for a certain machine, go
|
||||||
|
* into the machine I2C setup.
|
||||||
|
*/
|
||||||
|
reg->dev = &pdev->dev;
|
||||||
|
if (plfdata) {
|
||||||
|
/* This will be replaced by device tree data */
|
||||||
|
reg->plfdata = plfdata;
|
||||||
|
config.init_data = &plfdata->reg_constraints[i];
|
||||||
|
}
|
||||||
|
config.dev = &pdev->dev;
|
||||||
|
config.driver_data = reg;
|
||||||
|
|
||||||
|
rdev = regulator_register(desc, &config);
|
||||||
|
if (IS_ERR(rdev)) {
|
||||||
|
err = PTR_ERR(rdev);
|
||||||
|
dev_err(&pdev->dev,
|
||||||
|
"%s: failed to register regulator %s err %d\n",
|
||||||
|
__func__, desc->name,
|
||||||
|
err);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Then set a pointer back to the registered regulator */
|
||||||
|
reg->rdev = rdev;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* NOTE: the following functions are regulators pluralis - it is the
|
* NOTE: the following functions are regulators pluralis - it is the
|
||||||
* binding to the AB3100 core driver and the parent platform device
|
* binding to the AB3100 core driver and the parent platform device
|
||||||
@ -497,7 +549,6 @@ ab3100_regulator_desc[AB3100_NUM_REGULATORS] = {
|
|||||||
static int ab3100_regulators_probe(struct platform_device *pdev)
|
static int ab3100_regulators_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct ab3100_platform_data *plfdata = pdev->dev.platform_data;
|
struct ab3100_platform_data *plfdata = pdev->dev.platform_data;
|
||||||
struct regulator_config config = { };
|
|
||||||
int err = 0;
|
int err = 0;
|
||||||
u8 data;
|
u8 data;
|
||||||
int i;
|
int i;
|
||||||
@ -530,44 +581,13 @@ static int ab3100_regulators_probe(struct platform_device *pdev)
|
|||||||
|
|
||||||
/* Register the regulators */
|
/* Register the regulators */
|
||||||
for (i = 0; i < AB3100_NUM_REGULATORS; i++) {
|
for (i = 0; i < AB3100_NUM_REGULATORS; i++) {
|
||||||
struct ab3100_regulator *reg = &ab3100_regulators[i];
|
struct regulator_desc *desc = &ab3100_regulator_desc[i];
|
||||||
struct regulator_dev *rdev;
|
|
||||||
|
|
||||||
/*
|
err = ab3100_regulator_register(pdev, plfdata, desc->id);
|
||||||
* Initialize per-regulator struct.
|
if (err)
|
||||||
* Inherit platform data, this comes down from the
|
|
||||||
* i2c boarddata, from the machine. So if you want to
|
|
||||||
* see what it looks like for a certain machine, go
|
|
||||||
* into the machine I2C setup.
|
|
||||||
*/
|
|
||||||
reg->dev = &pdev->dev;
|
|
||||||
reg->plfdata = plfdata;
|
|
||||||
|
|
||||||
config.dev = &pdev->dev;
|
|
||||||
config.driver_data = reg;
|
|
||||||
config.init_data = &plfdata->reg_constraints[i];
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Register the regulator, pass around
|
|
||||||
* the ab3100_regulator struct
|
|
||||||
*/
|
|
||||||
rdev = regulator_register(&ab3100_regulator_desc[i], &config);
|
|
||||||
if (IS_ERR(rdev)) {
|
|
||||||
err = PTR_ERR(rdev);
|
|
||||||
dev_err(&pdev->dev,
|
|
||||||
"%s: failed to register regulator %s err %d\n",
|
|
||||||
__func__, ab3100_regulator_desc[i].name,
|
|
||||||
err);
|
|
||||||
/* remove the already registered regulators */
|
|
||||||
while (--i >= 0)
|
|
||||||
regulator_unregister(ab3100_regulators[i].rdev);
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Then set a pointer back to the registered regulator */
|
|
||||||
reg->rdev = rdev;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user