diff options
| author | Subbaraman Narayanamurthy <subbaram@codeaurora.org> | 2016-04-25 19:02:49 -0700 |
|---|---|---|
| committer | Jeevan Shriram <jshriram@codeaurora.org> | 2016-05-10 13:20:17 -0700 |
| commit | b2a7905fb6994535291d2da492dcde245e5e6f8a (patch) | |
| tree | 5c4dcbc004dec6d6935ae1fa13a762630463b104 | |
| parent | 93aea9eb5ca4157306f41471c46cd0a7454d7f6c (diff) | |
Revert "regulator: labibb: avail of simpler regulator registration api"
This reverts commit 0324b74b3953 ("regulator: labibb: avail of
simpler regulator registration api").
LABIBB regulator driver still needs to obtain init_data from
the device tree not just for the regulator name but it is for
a subsequent change which will pass the parent supply name via
init_data to register with the regulator framework. Hence bring
it back.
Since of_get_regulator_init_data() is brought back, we need to
pass rdesc to that function as the number of arguments got
changed.
CRs-Fixed: 1008400
Change-Id: I027a9ddbbbf6ff0ba7886151e5336d190ac3ce25
Signed-off-by: Subbaraman Narayanamurthy <subbaram@codeaurora.org>
| -rw-r--r-- | drivers/regulator/qpnp-labibb-regulator.c | 117 |
1 files changed, 83 insertions, 34 deletions
diff --git a/drivers/regulator/qpnp-labibb-regulator.c b/drivers/regulator/qpnp-labibb-regulator.c index 9bc42fc3f0a8..70d5c3377d24 100644 --- a/drivers/regulator/qpnp-labibb-regulator.c +++ b/drivers/regulator/qpnp-labibb-regulator.c @@ -1660,7 +1660,8 @@ static int register_qpnp_lab_regulator(struct qpnp_labibb *labibb, struct device_node *of_node) { int rc = 0; - struct regulator_desc *rdesc; + struct regulator_init_data *init_data; + struct regulator_desc *rdesc = &labibb->lab_vreg.rdesc; struct regulator_config cfg = {}; u8 val; const char *current_sense_str; @@ -1672,6 +1673,12 @@ static int register_qpnp_lab_regulator(struct qpnp_labibb *labibb, return -EINVAL; } + init_data = of_get_regulator_init_data(labibb->dev, of_node, rdesc); + if (!init_data) { + pr_err("unable to get regulator init data for qpnp lab regulator\n"); + return -ENOMEM; + } + rc = of_property_read_u32(of_node, "qcom,qpnp-lab-min-voltage", &(labibb->lab_vreg.min_volt)); if (rc < 0) { @@ -1891,25 +1898,33 @@ static int register_qpnp_lab_regulator(struct qpnp_labibb *labibb, } } - rdesc = &(labibb->lab_vreg.rdesc); - rdesc->owner = THIS_MODULE; - rdesc->type = REGULATOR_VOLTAGE; - rdesc->ops = &qpnp_lab_ops; - rdesc->name = of_node->name; - rdesc->of_match = of_node->name; + if (init_data->constraints.name) { + rdesc->owner = THIS_MODULE; + rdesc->type = REGULATOR_VOLTAGE; + rdesc->ops = &qpnp_lab_ops; + rdesc->name = init_data->constraints.name; - cfg.dev = labibb->dev; - cfg.driver_data = labibb; + cfg.dev = labibb->dev; + cfg.init_data = init_data; + cfg.driver_data = labibb; + cfg.of_node = of_node; - labibb->lab_vreg.rdev - = devm_regulator_register(labibb->dev, rdesc, &cfg); - if (IS_ERR(labibb->lab_vreg.rdev)) { - rc = PTR_ERR(labibb->lab_vreg.rdev); - labibb->lab_vreg.rdev = NULL; - pr_err("unable to get regulator init data for qpnp lab regulator, rc = %d\n", - rc); + init_data->constraints.valid_ops_mask + |= REGULATOR_CHANGE_VOLTAGE | + REGULATOR_CHANGE_STATUS; - return rc; + labibb->lab_vreg.rdev = regulator_register(rdesc, &cfg); + if (IS_ERR(labibb->lab_vreg.rdev)) { + rc = PTR_ERR(labibb->lab_vreg.rdev); + labibb->lab_vreg.rdev = NULL; + pr_err("unable to get regulator init data for qpnp lab regulator, rc = %d\n", + rc); + + return rc; + } + } else { + dev_err(labibb->dev, "qpnp lab regulator name missing\n"); + return -EINVAL; } mutex_init(&(labibb->lab_vreg.lab_mutex)); @@ -2339,7 +2354,8 @@ static int register_qpnp_ibb_regulator(struct qpnp_labibb *labibb, struct device_node *of_node) { int rc = 0; - struct regulator_desc *rdesc; + struct regulator_init_data *init_data; + struct regulator_desc *rdesc = &labibb->ibb_vreg.rdesc; struct regulator_config cfg = {}; u8 val, ibb_enable_ctl; u32 tmp; @@ -2349,6 +2365,12 @@ static int register_qpnp_ibb_regulator(struct qpnp_labibb *labibb, return -EINVAL; } + init_data = of_get_regulator_init_data(labibb->dev, of_node, rdesc); + if (!init_data) { + pr_err("unable to get regulator init data for qpnp ibb regulator\n"); + return -ENOMEM; + } + rc = of_property_read_u32(of_node, "qcom,qpnp-ibb-min-voltage", &(labibb->ibb_vreg.min_volt)); if (rc < 0) { @@ -2590,25 +2612,33 @@ static int register_qpnp_ibb_regulator(struct qpnp_labibb *labibb, } } - rdesc = &(labibb->ibb_vreg.rdesc); - rdesc->owner = THIS_MODULE; - rdesc->type = REGULATOR_VOLTAGE; - rdesc->ops = &qpnp_ibb_ops; - rdesc->name = of_node->name; - rdesc->of_match = of_node->name; + if (init_data->constraints.name) { + rdesc->owner = THIS_MODULE; + rdesc->type = REGULATOR_VOLTAGE; + rdesc->ops = &qpnp_ibb_ops; + rdesc->name = init_data->constraints.name; - cfg.dev = labibb->dev; - cfg.driver_data = labibb; + cfg.dev = labibb->dev; + cfg.init_data = init_data; + cfg.driver_data = labibb; + cfg.of_node = of_node; - labibb->ibb_vreg.rdev - = devm_regulator_register(labibb->dev, rdesc, &cfg); - if (IS_ERR(labibb->ibb_vreg.rdev)) { - rc = PTR_ERR(labibb->ibb_vreg.rdev); - labibb->ibb_vreg.rdev = NULL; - pr_err("unable to get regulator init data for qpnp ibb regulator, rc = %d\n", - rc); + init_data->constraints.valid_ops_mask + |= REGULATOR_CHANGE_VOLTAGE | + REGULATOR_CHANGE_STATUS; - return rc; + labibb->ibb_vreg.rdev = regulator_register(rdesc, &cfg); + if (IS_ERR(labibb->ibb_vreg.rdev)) { + rc = PTR_ERR(labibb->ibb_vreg.rdev); + labibb->ibb_vreg.rdev = NULL; + pr_err("unable to get regulator init data for qpnp ibb regulator, rc = %d\n", + rc); + + return rc; + } + } else { + dev_err(labibb->dev, "qpnp ibb regulator name missing\n"); + return -EINVAL; } mutex_init(&(labibb->ibb_vreg.ibb_mutex)); @@ -2813,9 +2843,27 @@ static int qpnp_labibb_regulator_probe(struct platform_device *pdev) return 0; fail_registration: + if (labibb->lab_vreg.rdev) + regulator_unregister(labibb->lab_vreg.rdev); + if (labibb->ibb_vreg.rdev) + regulator_unregister(labibb->ibb_vreg.rdev); + return rc; } +static int qpnp_labibb_regulator_remove(struct platform_device *pdev) +{ + struct qpnp_labibb *labibb = dev_get_drvdata(&pdev->dev); + + if (labibb) { + if (labibb->lab_vreg.rdev) + regulator_unregister(labibb->lab_vreg.rdev); + if (labibb->ibb_vreg.rdev) + regulator_unregister(labibb->ibb_vreg.rdev); + } + return 0; +} + static struct of_device_id spmi_match_table[] = { { .compatible = QPNP_LABIBB_REGULATOR_DRIVER_NAME, }, { }, @@ -2827,6 +2875,7 @@ static struct platform_driver qpnp_labibb_regulator_driver = { .of_match_table = spmi_match_table, }, .probe = qpnp_labibb_regulator_probe, + .remove = qpnp_labibb_regulator_remove, }; static int __init qpnp_labibb_regulator_init(void) |
