diff options
author | Richard Fitzgerald <rf@opensource.wolfsonmicro.com> | 2017-04-18 06:43:54 -0400 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2017-04-25 11:36:57 -0400 |
commit | af367afafb5ba7ae26defd35e4ba42cfe157ef72 (patch) | |
tree | 4d985aca444caae40644186ce044e648bc0593a8 | |
parent | 80a55f41aef4ee808f53f1a356491d7eaeefdd3c (diff) |
regulator: arizona-ldo1: Factor out generic initialization
In preparation for sharing this driver with Madera codecs, factor out
the parts of initialization that aren't dependent on struct arizona.
Signed-off-by: Richard Fitzgerald <rf@opensource.wolfsonmicro.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r-- | drivers/regulator/arizona-ldo1.c | 114 |
1 files changed, 66 insertions, 48 deletions
diff --git a/drivers/regulator/arizona-ldo1.c b/drivers/regulator/arizona-ldo1.c index 678f81fda22a..96fddfff5dc4 100644 --- a/drivers/regulator/arizona-ldo1.c +++ b/drivers/regulator/arizona-ldo1.c | |||
@@ -234,67 +234,40 @@ static int arizona_ldo1_of_get_pdata(struct arizona_ldo1_pdata *pdata, | |||
234 | return 0; | 234 | return 0; |
235 | } | 235 | } |
236 | 236 | ||
237 | static int arizona_ldo1_probe(struct platform_device *pdev) | 237 | static int arizona_ldo1_common_init(struct platform_device *pdev, |
238 | struct arizona_ldo1 *ldo1, | ||
239 | const struct regulator_desc *desc, | ||
240 | struct arizona_ldo1_pdata *pdata, | ||
241 | bool *external_dcvdd) | ||
238 | { | 242 | { |
239 | struct arizona *arizona = dev_get_drvdata(pdev->dev.parent); | 243 | struct device *parent_dev = pdev->dev.parent; |
240 | const struct regulator_desc *desc; | ||
241 | struct regulator_config config = { }; | 244 | struct regulator_config config = { }; |
242 | struct arizona_ldo1 *ldo1; | ||
243 | bool external_dcvdd = false; | ||
244 | int ret; | 245 | int ret; |
245 | 246 | ||
246 | ldo1 = devm_kzalloc(&pdev->dev, sizeof(*ldo1), GFP_KERNEL); | 247 | *external_dcvdd = false; |
247 | if (!ldo1) | ||
248 | return -ENOMEM; | ||
249 | |||
250 | ldo1->regmap = arizona->regmap; | ||
251 | |||
252 | /* | ||
253 | * Since the chip usually supplies itself we provide some | ||
254 | * default init_data for it. This will be overridden with | ||
255 | * platform data if provided. | ||
256 | */ | ||
257 | switch (arizona->type) { | ||
258 | case WM5102: | ||
259 | case WM8997: | ||
260 | case WM8998: | ||
261 | case WM1814: | ||
262 | desc = &arizona_ldo1_hc; | ||
263 | ldo1->init_data = arizona_ldo1_dvfs; | ||
264 | break; | ||
265 | case WM5110: | ||
266 | case WM8280: | ||
267 | desc = &arizona_ldo1; | ||
268 | ldo1->init_data = arizona_ldo1_wm5110; | ||
269 | break; | ||
270 | default: | ||
271 | desc = &arizona_ldo1; | ||
272 | ldo1->init_data = arizona_ldo1_default; | ||
273 | break; | ||
274 | } | ||
275 | 248 | ||
276 | ldo1->init_data.consumer_supplies = &ldo1->supply; | ||
277 | ldo1->supply.supply = "DCVDD"; | 249 | ldo1->supply.supply = "DCVDD"; |
278 | ldo1->supply.dev_name = dev_name(arizona->dev); | 250 | ldo1->init_data.consumer_supplies = &ldo1->supply; |
251 | ldo1->supply.dev_name = dev_name(parent_dev); | ||
279 | 252 | ||
280 | config.dev = arizona->dev; | 253 | config.dev = parent_dev; |
281 | config.driver_data = ldo1; | 254 | config.driver_data = ldo1; |
282 | config.regmap = arizona->regmap; | 255 | config.regmap = ldo1->regmap; |
283 | 256 | ||
284 | if (IS_ENABLED(CONFIG_OF)) { | 257 | if (IS_ENABLED(CONFIG_OF)) { |
285 | if (!dev_get_platdata(arizona->dev)) { | 258 | if (!dev_get_platdata(parent_dev)) { |
286 | ret = arizona_ldo1_of_get_pdata(&arizona->pdata.ldo1, | 259 | ret = arizona_ldo1_of_get_pdata(pdata, |
287 | &config, desc, | 260 | &config, desc, |
288 | &external_dcvdd); | 261 | external_dcvdd); |
289 | if (ret < 0) | 262 | if (ret < 0) |
290 | return ret; | 263 | return ret; |
291 | } | 264 | } |
292 | } | 265 | } |
293 | 266 | ||
294 | config.ena_gpio = arizona->pdata.ldo1.ldoena; | 267 | config.ena_gpio = pdata->ldoena; |
295 | 268 | ||
296 | if (arizona->pdata.ldo1.init_data) | 269 | if (pdata->init_data) |
297 | config.init_data = arizona->pdata.ldo1.init_data; | 270 | config.init_data = pdata->init_data; |
298 | else | 271 | else |
299 | config.init_data = &ldo1->init_data; | 272 | config.init_data = &ldo1->init_data; |
300 | 273 | ||
@@ -303,9 +276,7 @@ static int arizona_ldo1_probe(struct platform_device *pdev) | |||
303 | * consumers then DCVDD is supplied externally. | 276 | * consumers then DCVDD is supplied externally. |
304 | */ | 277 | */ |
305 | if (config.init_data->num_consumer_supplies == 0) | 278 | if (config.init_data->num_consumer_supplies == 0) |
306 | arizona->external_dcvdd = true; | 279 | *external_dcvdd = true; |
307 | else | ||
308 | arizona->external_dcvdd = external_dcvdd; | ||
309 | 280 | ||
310 | ldo1->regulator = devm_regulator_register(&pdev->dev, desc, &config); | 281 | ldo1->regulator = devm_regulator_register(&pdev->dev, desc, &config); |
311 | 282 | ||
@@ -313,7 +284,7 @@ static int arizona_ldo1_probe(struct platform_device *pdev) | |||
313 | 284 | ||
314 | if (IS_ERR(ldo1->regulator)) { | 285 | if (IS_ERR(ldo1->regulator)) { |
315 | ret = PTR_ERR(ldo1->regulator); | 286 | ret = PTR_ERR(ldo1->regulator); |
316 | dev_err(arizona->dev, "Failed to register LDO1 supply: %d\n", | 287 | dev_err(&pdev->dev, "Failed to register LDO1 supply: %d\n", |
317 | ret); | 288 | ret); |
318 | return ret; | 289 | return ret; |
319 | } | 290 | } |
@@ -323,6 +294,53 @@ static int arizona_ldo1_probe(struct platform_device *pdev) | |||
323 | return 0; | 294 | return 0; |
324 | } | 295 | } |
325 | 296 | ||
297 | static int arizona_ldo1_probe(struct platform_device *pdev) | ||
298 | { | ||
299 | struct arizona *arizona = dev_get_drvdata(pdev->dev.parent); | ||
300 | struct arizona_ldo1 *ldo1; | ||
301 | const struct regulator_desc *desc; | ||
302 | bool external_dcvdd; | ||
303 | int ret; | ||
304 | |||
305 | ldo1 = devm_kzalloc(&pdev->dev, sizeof(*ldo1), GFP_KERNEL); | ||
306 | if (!ldo1) | ||
307 | return -ENOMEM; | ||
308 | |||
309 | ldo1->regmap = arizona->regmap; | ||
310 | |||
311 | /* | ||
312 | * Since the chip usually supplies itself we provide some | ||
313 | * default init_data for it. This will be overridden with | ||
314 | * platform data if provided. | ||
315 | */ | ||
316 | switch (arizona->type) { | ||
317 | case WM5102: | ||
318 | case WM8997: | ||
319 | case WM8998: | ||
320 | case WM1814: | ||
321 | desc = &arizona_ldo1_hc; | ||
322 | ldo1->init_data = arizona_ldo1_dvfs; | ||
323 | break; | ||
324 | case WM5110: | ||
325 | case WM8280: | ||
326 | desc = &arizona_ldo1; | ||
327 | ldo1->init_data = arizona_ldo1_wm5110; | ||
328 | break; | ||
329 | default: | ||
330 | desc = &arizona_ldo1; | ||
331 | ldo1->init_data = arizona_ldo1_default; | ||
332 | break; | ||
333 | } | ||
334 | |||
335 | ret = arizona_ldo1_common_init(pdev, ldo1, desc, | ||
336 | &arizona->pdata.ldo1, | ||
337 | &external_dcvdd); | ||
338 | if (ret == 0) | ||
339 | arizona->external_dcvdd = external_dcvdd; | ||
340 | |||
341 | return ret; | ||
342 | } | ||
343 | |||
326 | static struct platform_driver arizona_ldo1_driver = { | 344 | static struct platform_driver arizona_ldo1_driver = { |
327 | .probe = arizona_ldo1_probe, | 345 | .probe = arizona_ldo1_probe, |
328 | .driver = { | 346 | .driver = { |