summaryrefslogtreecommitdiff
path: root/drivers/regulator
diff options
context:
space:
mode:
authorLaxman Dewangan <ldewangan@nvidia.com>2012-08-02 13:34:01 +0530
committerSimone Willett <swillett@nvidia.com>2012-08-02 18:03:10 -0700
commitd88c5cce18adf50d472508e38fced959b845e7d8 (patch)
treebf34a12f2731e1b861cb20e9fade09cbd8296cf6 /drivers/regulator
parent5f436b65eb7d71b85e1dd1ffd58410ebbda01a74 (diff)
regulator: tps80031: register regulators as mfd sub device
Converting tps80031 regulator driver to be register as mfd sub device of the tps65910 and register all its regulators from single probe calls. Add separate platform data for the regulator to be supply from board as part of tps80031 platform data. Change-Id: Ie65b25f3058202070f7f917e64a4a660dd941210 Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com> Reviewed-on: http://git-master/r/119976
Diffstat (limited to 'drivers/regulator')
-rw-r--r--drivers/regulator/tps80031-regulator.c132
1 files changed, 87 insertions, 45 deletions
diff --git a/drivers/regulator/tps80031-regulator.c b/drivers/regulator/tps80031-regulator.c
index 570a178bbfaf..6995ea2884e5 100644
--- a/drivers/regulator/tps80031-regulator.c
+++ b/drivers/regulator/tps80031-regulator.c
@@ -1026,78 +1026,120 @@ static inline int tps80031_cache_regulator_register(struct device *parent,
static int __devinit tps80031_regulator_probe(struct platform_device *pdev)
{
+ struct tps80031_platform_data *pdata = dev_get_platdata(pdev->dev.parent);
+ struct tps80031_regulator_platform_data *tps_pdata;
struct tps80031_regulator_info *rinfo;
- struct tps80031_regulator *ri = NULL;
+ struct tps80031_regulator *ri;
+ struct tps80031_regulator *pmic;
struct regulator_dev *rdev;
- struct tps80031_regulator_platform_data *tps_pdata;
- int id = pdev->id;
- int err;
-
- dev_dbg(&pdev->dev, "Probing reulator %d\n", id);
+ int id;
+ int ret;
+ int num;
- rinfo = find_regulator_info(id);
- if (!rinfo) {
- dev_err(&pdev->dev, "invalid regulator ID specified\n");
+ if (!pdata || !pdata->num_regulator_pdata) {
+ dev_err(&pdev->dev, "Number of regulator is 0\n");
return -EINVAL;
}
- ri = devm_kzalloc(&pdev->dev, sizeof(*ri), GFP_KERNEL);
- if (!ri) {
- dev_err(&pdev->dev, "mem alloc for ri failed\n");
+ pmic = devm_kzalloc(&pdev->dev,
+ pdata->num_regulator_pdata * sizeof(*pmic), GFP_KERNEL);
+ if (!pmic) {
+ dev_err(&pdev->dev, "mem alloc for pmic failed\n");
return -ENOMEM;
}
- ri->rinfo = rinfo;
- tps_pdata = pdev->dev.platform_data;
- ri->dev = &pdev->dev;
- if (tps_pdata->delay_us > 0)
- ri->delay = tps_pdata->delay_us;
- else
- ri->delay = rinfo->delay;
- ri->tolerance_uv = tps_pdata->tolerance_uv;
+ for (num = 0; num < pdata->num_regulator_pdata; ++num) {
+ tps_pdata = pdata->regulator_pdata[num];
+ if (!tps_pdata->reg_init_data) {
+ dev_err(&pdev->dev,
+ "No regulator init data for index %d\n", num);
+ ret = -EINVAL;
+ goto fail;
+ }
- check_smps_mode_mult(pdev->dev.parent, ri);
- ri->platform_flags = tps_pdata->flags;
- ri->ext_ctrl_flag = tps_pdata->ext_ctrl_flag;
+ id = tps_pdata->regulator_id;
+ rinfo = find_regulator_info(id);
+ if (!rinfo) {
+ dev_err(&pdev->dev, "invalid regulator ID specified\n");
+ ret = -EINVAL;
+ goto fail;
+ }
- err = tps80031_cache_regulator_register(pdev->dev.parent, ri);
- if (err) {
- dev_err(&pdev->dev, "Register access for caching is failed\n");
- return err;
- }
- err = tps80031_regulator_preinit(pdev->dev.parent, ri, tps_pdata);
- if (err)
- return err;
+ ri = &pmic[num];
+ ri->rinfo = rinfo;
+ ri->dev = &pdev->dev;
+ if (tps_pdata->delay_us)
+ ri->delay = tps_pdata->delay_us;
+ else
+ ri->delay = rinfo->delay;
+ ri->tolerance_uv = tps_pdata->tolerance_uv;
+
+ check_smps_mode_mult(pdev->dev.parent, ri);
+ ri->platform_flags = tps_pdata->flags;
+ ri->ext_ctrl_flag = tps_pdata->ext_ctrl_flag;
+
+ ret = tps80031_cache_regulator_register(pdev->dev.parent, ri);
+ if (ret < 0) {
+ dev_err(&pdev->dev,
+ "Register cache failed, err %d\n", ret);
+ goto fail;
+ }
+ ret = tps80031_regulator_preinit(pdev->dev.parent, ri, tps_pdata);
+ if (ret < 0) {
+ dev_err(&pdev->dev,
+ "regulator preinit failed, err %d\n", ret);
+ goto fail;
+ }
- err = tps80031_power_req_config(pdev->dev.parent, ri, tps_pdata);
- if (err)
- return err;
+ ret = tps80031_power_req_config(pdev->dev.parent, ri, tps_pdata);
+ if (ret < 0) {
+ dev_err(&pdev->dev,
+ "power req config failed, err %d\n", ret);
+ goto fail;
+ }
- rdev = regulator_register(&ri->rinfo->desc, &pdev->dev,
+ rdev = regulator_register(&ri->rinfo->desc, &pdev->dev,
tps_pdata->reg_init_data, ri);
- if (IS_ERR_OR_NULL(rdev)) {
- dev_err(&pdev->dev, "failed to register regulator %s\n",
- ri->rinfo->desc.name);
- return PTR_ERR(rdev);
+ if (IS_ERR_OR_NULL(rdev)) {
+ dev_err(&pdev->dev,
+ "register regulator failed %s\n",
+ ri->rinfo->desc.name);
+ ret = PTR_ERR(rdev);
+ goto fail;
+ }
+ ri->rdev = rdev;
}
- ri->rdev = rdev;
-
- platform_set_drvdata(pdev, ri);
+ platform_set_drvdata(pdev, pmic);
return 0;
+fail:
+ while(--num >= 0) {
+ ri = &pmic[num];
+ regulator_unregister(ri->rdev);
+ }
+ return ret;
}
static int __devexit tps80031_regulator_remove(struct platform_device *pdev)
{
- struct tps80031_regulator *ri = platform_get_drvdata(pdev);
+ struct tps80031_platform_data *pdata = pdev->dev.parent->platform_data;
+ struct tps80031_regulator *pmic = platform_get_drvdata(pdev);
+ struct tps80031_regulator *ri = NULL;
+ int num;
- regulator_unregister(ri->rdev);
+ if (!pdata || !pdata->num_regulator_pdata)
+ return 0;
+
+ for (num = 0; num < pdata->num_regulator_pdata; ++num) {
+ ri = &pmic[num];
+ regulator_unregister(ri->rdev);
+ }
return 0;
}
static struct platform_driver tps80031_regulator_driver = {
.driver = {
- .name = "tps80031-regulator",
+ .name = "tps80031-regulators",
.owner = THIS_MODULE,
},
.probe = tps80031_regulator_probe,