summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSubbaraman Narayanamurthy <subbaram@codeaurora.org>2016-04-25 19:02:49 -0700
committerJeevan Shriram <jshriram@codeaurora.org>2016-05-10 13:20:17 -0700
commitb2a7905fb6994535291d2da492dcde245e5e6f8a (patch)
tree5c4dcbc004dec6d6935ae1fa13a762630463b104
parent93aea9eb5ca4157306f41471c46cd0a7454d7f6c (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.c117
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)