aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaxman Dewangan <ldewangan@nvidia.com>2016-03-08 05:53:22 -0500
committerMark Brown <broonie@kernel.org>2016-03-12 01:07:13 -0500
commitf907a0a9498db29fb7c91b798d7af70add7dd86e (patch)
treeece05e36fc965449895699992b9eb10c31b8f17b
parent1aaab34878ac14efede3f0e737b99447745699d1 (diff)
regulator: pwm: Add support to have multiple instance of pwm regulator
Some of platforms like Nvidia's Tegra210 Jetson-TX1 platform has multiple PMW based regulators. Add support to have multiple instances of the driver by not changing any global data of pwm regulator and if required, making instance specific copy and then making changes. Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com> Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r--drivers/regulator/pwm-regulator.c27
1 files changed, 20 insertions, 7 deletions
diff --git a/drivers/regulator/pwm-regulator.c b/drivers/regulator/pwm-regulator.c
index 4d8eb3506dc8..4689d62f4841 100644
--- a/drivers/regulator/pwm-regulator.c
+++ b/drivers/regulator/pwm-regulator.c
@@ -27,6 +27,13 @@ struct pwm_regulator_data {
27 27
28 /* Voltage table */ 28 /* Voltage table */
29 struct pwm_voltages *duty_cycle_table; 29 struct pwm_voltages *duty_cycle_table;
30
31 /* regulator descriptor */
32 struct regulator_desc desc;
33
34 /* Regulator ops */
35 struct regulator_ops ops;
36
30 int state; 37 int state;
31 38
32 /* Continuous voltage */ 39 /* Continuous voltage */
@@ -212,8 +219,10 @@ static int pwm_regulator_init_table(struct platform_device *pdev,
212 } 219 }
213 220
214 drvdata->duty_cycle_table = duty_cycle_table; 221 drvdata->duty_cycle_table = duty_cycle_table;
215 pwm_regulator_desc.ops = &pwm_regulator_voltage_table_ops; 222 memcpy(&drvdata->ops, &pwm_regulator_voltage_table_ops,
216 pwm_regulator_desc.n_voltages = length / sizeof(*duty_cycle_table); 223 sizeof(drvdata->ops));
224 drvdata->desc.ops = &drvdata->ops;
225 drvdata->desc.n_voltages = length / sizeof(*duty_cycle_table);
217 226
218 return 0; 227 return 0;
219} 228}
@@ -221,8 +230,10 @@ static int pwm_regulator_init_table(struct platform_device *pdev,
221static int pwm_regulator_init_continuous(struct platform_device *pdev, 230static int pwm_regulator_init_continuous(struct platform_device *pdev,
222 struct pwm_regulator_data *drvdata) 231 struct pwm_regulator_data *drvdata)
223{ 232{
224 pwm_regulator_desc.ops = &pwm_regulator_voltage_continuous_ops; 233 memcpy(&drvdata->ops, &pwm_regulator_voltage_continuous_ops,
225 pwm_regulator_desc.continuous_voltage_range = true; 234 sizeof(drvdata->ops));
235 drvdata->desc.ops = &drvdata->ops;
236 drvdata->desc.continuous_voltage_range = true;
226 237
227 return 0; 238 return 0;
228} 239}
@@ -245,6 +256,8 @@ static int pwm_regulator_probe(struct platform_device *pdev)
245 if (!drvdata) 256 if (!drvdata)
246 return -ENOMEM; 257 return -ENOMEM;
247 258
259 memcpy(&drvdata->desc, &pwm_regulator_desc, sizeof(drvdata->desc));
260
248 if (of_find_property(np, "voltage-table", NULL)) 261 if (of_find_property(np, "voltage-table", NULL))
249 ret = pwm_regulator_init_table(pdev, drvdata); 262 ret = pwm_regulator_init_table(pdev, drvdata);
250 else 263 else
@@ -253,7 +266,7 @@ static int pwm_regulator_probe(struct platform_device *pdev)
253 return ret; 266 return ret;
254 267
255 init_data = of_get_regulator_init_data(&pdev->dev, np, 268 init_data = of_get_regulator_init_data(&pdev->dev, np,
256 &pwm_regulator_desc); 269 &drvdata->desc);
257 if (!init_data) 270 if (!init_data)
258 return -ENOMEM; 271 return -ENOMEM;
259 272
@@ -269,10 +282,10 @@ static int pwm_regulator_probe(struct platform_device *pdev)
269 } 282 }
270 283
271 regulator = devm_regulator_register(&pdev->dev, 284 regulator = devm_regulator_register(&pdev->dev,
272 &pwm_regulator_desc, &config); 285 &drvdata->desc, &config);
273 if (IS_ERR(regulator)) { 286 if (IS_ERR(regulator)) {
274 dev_err(&pdev->dev, "Failed to register regulator %s\n", 287 dev_err(&pdev->dev, "Failed to register regulator %s\n",
275 pwm_regulator_desc.name); 288 drvdata->desc.name);
276 return PTR_ERR(regulator); 289 return PTR_ERR(regulator);
277 } 290 }
278 291