2 * Copyright (C) ST-Ericsson SA 2010
4 * License Terms: GNU General Public License v2
5 * Authors: Sundar Iyer <sundar.iyer@stericsson.com> for ST-Ericsson
6 * Bengt Jonsson <bengt.g.jonsson@stericsson.com> for ST-Ericsson
8 * Power domain regulators on DB8500
11 #include <linux/kernel.h>
12 #include <linux/init.h>
13 #include <linux/err.h>
14 #include <linux/spinlock.h>
15 #include <linux/platform_device.h>
16 #include <linux/mfd/dbx500-prcmu.h>
17 #include <linux/regulator/driver.h>
18 #include <linux/regulator/machine.h>
19 #include <linux/regulator/db8500-prcmu.h>
20 #include <linux/regulator/of_regulator.h>
22 #include <linux/module.h>
23 #include "dbx500-prcmu.h"
25 static int db8500_regulator_enable(struct regulator_dev
*rdev
)
27 struct dbx500_regulator_info
*info
= rdev_get_drvdata(rdev
);
32 dev_vdbg(rdev_get_dev(rdev
), "regulator-%s-enable\n",
35 if (!info
->is_enabled
) {
36 info
->is_enabled
= true;
37 if (!info
->exclude_from_power_state
)
38 power_state_active_enable();
44 static int db8500_regulator_disable(struct regulator_dev
*rdev
)
46 struct dbx500_regulator_info
*info
= rdev_get_drvdata(rdev
);
52 dev_vdbg(rdev_get_dev(rdev
), "regulator-%s-disable\n",
55 if (info
->is_enabled
) {
56 info
->is_enabled
= false;
57 if (!info
->exclude_from_power_state
)
58 ret
= power_state_active_disable();
64 static int db8500_regulator_is_enabled(struct regulator_dev
*rdev
)
66 struct dbx500_regulator_info
*info
= rdev_get_drvdata(rdev
);
71 dev_vdbg(rdev_get_dev(rdev
), "regulator-%s-is_enabled (is_enabled):"
72 " %i\n", info
->desc
.name
, info
->is_enabled
);
74 return info
->is_enabled
;
77 /* db8500 regulator operations */
78 static struct regulator_ops db8500_regulator_ops
= {
79 .enable
= db8500_regulator_enable
,
80 .disable
= db8500_regulator_disable
,
81 .is_enabled
= db8500_regulator_is_enabled
,
87 static bool epod_on
[NUM_EPOD_ID
];
88 static bool epod_ramret
[NUM_EPOD_ID
];
90 static int enable_epod(u16 epod_id
, bool ramret
)
95 if (!epod_on
[epod_id
]) {
96 ret
= prcmu_set_epod(epod_id
, EPOD_STATE_RAMRET
);
100 epod_ramret
[epod_id
] = true;
102 ret
= prcmu_set_epod(epod_id
, EPOD_STATE_ON
);
105 epod_on
[epod_id
] = true;
111 static int disable_epod(u16 epod_id
, bool ramret
)
116 if (!epod_on
[epod_id
]) {
117 ret
= prcmu_set_epod(epod_id
, EPOD_STATE_OFF
);
121 epod_ramret
[epod_id
] = false;
123 if (epod_ramret
[epod_id
]) {
124 ret
= prcmu_set_epod(epod_id
, EPOD_STATE_RAMRET
);
128 ret
= prcmu_set_epod(epod_id
, EPOD_STATE_OFF
);
132 epod_on
[epod_id
] = false;
141 static int db8500_regulator_switch_enable(struct regulator_dev
*rdev
)
143 struct dbx500_regulator_info
*info
= rdev_get_drvdata(rdev
);
149 dev_vdbg(rdev_get_dev(rdev
), "regulator-switch-%s-enable\n",
152 ret
= enable_epod(info
->epod_id
, info
->is_ramret
);
154 dev_err(rdev_get_dev(rdev
),
155 "regulator-switch-%s-enable: prcmu call failed\n",
160 info
->is_enabled
= true;
165 static int db8500_regulator_switch_disable(struct regulator_dev
*rdev
)
167 struct dbx500_regulator_info
*info
= rdev_get_drvdata(rdev
);
173 dev_vdbg(rdev_get_dev(rdev
), "regulator-switch-%s-disable\n",
176 ret
= disable_epod(info
->epod_id
, info
->is_ramret
);
178 dev_err(rdev_get_dev(rdev
),
179 "regulator_switch-%s-disable: prcmu call failed\n",
184 info
->is_enabled
= 0;
189 static int db8500_regulator_switch_is_enabled(struct regulator_dev
*rdev
)
191 struct dbx500_regulator_info
*info
= rdev_get_drvdata(rdev
);
196 dev_vdbg(rdev_get_dev(rdev
),
197 "regulator-switch-%s-is_enabled (is_enabled): %i\n",
198 info
->desc
.name
, info
->is_enabled
);
200 return info
->is_enabled
;
203 static struct regulator_ops db8500_regulator_switch_ops
= {
204 .enable
= db8500_regulator_switch_enable
,
205 .disable
= db8500_regulator_switch_disable
,
206 .is_enabled
= db8500_regulator_switch_is_enabled
,
210 * Regulator information
212 static struct dbx500_regulator_info
213 dbx500_regulator_info
[DB8500_NUM_REGULATORS
] = {
214 [DB8500_REGULATOR_VAPE
] = {
216 .name
= "db8500-vape",
217 .id
= DB8500_REGULATOR_VAPE
,
218 .ops
= &db8500_regulator_ops
,
219 .type
= REGULATOR_VOLTAGE
,
220 .owner
= THIS_MODULE
,
223 [DB8500_REGULATOR_VARM
] = {
225 .name
= "db8500-varm",
226 .id
= DB8500_REGULATOR_VARM
,
227 .ops
= &db8500_regulator_ops
,
228 .type
= REGULATOR_VOLTAGE
,
229 .owner
= THIS_MODULE
,
232 [DB8500_REGULATOR_VMODEM
] = {
234 .name
= "db8500-vmodem",
235 .id
= DB8500_REGULATOR_VMODEM
,
236 .ops
= &db8500_regulator_ops
,
237 .type
= REGULATOR_VOLTAGE
,
238 .owner
= THIS_MODULE
,
241 [DB8500_REGULATOR_VPLL
] = {
243 .name
= "db8500-vpll",
244 .id
= DB8500_REGULATOR_VPLL
,
245 .ops
= &db8500_regulator_ops
,
246 .type
= REGULATOR_VOLTAGE
,
247 .owner
= THIS_MODULE
,
250 [DB8500_REGULATOR_VSMPS1
] = {
252 .name
= "db8500-vsmps1",
253 .id
= DB8500_REGULATOR_VSMPS1
,
254 .ops
= &db8500_regulator_ops
,
255 .type
= REGULATOR_VOLTAGE
,
256 .owner
= THIS_MODULE
,
259 [DB8500_REGULATOR_VSMPS2
] = {
261 .name
= "db8500-vsmps2",
262 .id
= DB8500_REGULATOR_VSMPS2
,
263 .ops
= &db8500_regulator_ops
,
264 .type
= REGULATOR_VOLTAGE
,
265 .owner
= THIS_MODULE
,
269 .exclude_from_power_state
= true,
271 [DB8500_REGULATOR_VSMPS3
] = {
273 .name
= "db8500-vsmps3",
274 .id
= DB8500_REGULATOR_VSMPS3
,
275 .ops
= &db8500_regulator_ops
,
276 .type
= REGULATOR_VOLTAGE
,
277 .owner
= THIS_MODULE
,
280 [DB8500_REGULATOR_VRF1
] = {
282 .name
= "db8500-vrf1",
283 .id
= DB8500_REGULATOR_VRF1
,
284 .ops
= &db8500_regulator_ops
,
285 .type
= REGULATOR_VOLTAGE
,
286 .owner
= THIS_MODULE
,
289 [DB8500_REGULATOR_SWITCH_SVAMMDSP
] = {
291 .name
= "db8500-sva-mmdsp",
292 .id
= DB8500_REGULATOR_SWITCH_SVAMMDSP
,
293 .ops
= &db8500_regulator_switch_ops
,
294 .type
= REGULATOR_VOLTAGE
,
295 .owner
= THIS_MODULE
,
297 .epod_id
= EPOD_ID_SVAMMDSP
,
299 [DB8500_REGULATOR_SWITCH_SVAMMDSPRET
] = {
301 .name
= "db8500-sva-mmdsp-ret",
302 .id
= DB8500_REGULATOR_SWITCH_SVAMMDSPRET
,
303 .ops
= &db8500_regulator_switch_ops
,
304 .type
= REGULATOR_VOLTAGE
,
305 .owner
= THIS_MODULE
,
307 .epod_id
= EPOD_ID_SVAMMDSP
,
310 [DB8500_REGULATOR_SWITCH_SVAPIPE
] = {
312 .name
= "db8500-sva-pipe",
313 .id
= DB8500_REGULATOR_SWITCH_SVAPIPE
,
314 .ops
= &db8500_regulator_switch_ops
,
315 .type
= REGULATOR_VOLTAGE
,
316 .owner
= THIS_MODULE
,
318 .epod_id
= EPOD_ID_SVAPIPE
,
320 [DB8500_REGULATOR_SWITCH_SIAMMDSP
] = {
322 .name
= "db8500-sia-mmdsp",
323 .id
= DB8500_REGULATOR_SWITCH_SIAMMDSP
,
324 .ops
= &db8500_regulator_switch_ops
,
325 .type
= REGULATOR_VOLTAGE
,
326 .owner
= THIS_MODULE
,
328 .epod_id
= EPOD_ID_SIAMMDSP
,
330 [DB8500_REGULATOR_SWITCH_SIAMMDSPRET
] = {
332 .name
= "db8500-sia-mmdsp-ret",
333 .id
= DB8500_REGULATOR_SWITCH_SIAMMDSPRET
,
334 .ops
= &db8500_regulator_switch_ops
,
335 .type
= REGULATOR_VOLTAGE
,
336 .owner
= THIS_MODULE
,
338 .epod_id
= EPOD_ID_SIAMMDSP
,
341 [DB8500_REGULATOR_SWITCH_SIAPIPE
] = {
343 .name
= "db8500-sia-pipe",
344 .id
= DB8500_REGULATOR_SWITCH_SIAPIPE
,
345 .ops
= &db8500_regulator_switch_ops
,
346 .type
= REGULATOR_VOLTAGE
,
347 .owner
= THIS_MODULE
,
349 .epod_id
= EPOD_ID_SIAPIPE
,
351 [DB8500_REGULATOR_SWITCH_SGA
] = {
353 .name
= "db8500-sga",
354 .id
= DB8500_REGULATOR_SWITCH_SGA
,
355 .ops
= &db8500_regulator_switch_ops
,
356 .type
= REGULATOR_VOLTAGE
,
357 .owner
= THIS_MODULE
,
359 .epod_id
= EPOD_ID_SGA
,
361 [DB8500_REGULATOR_SWITCH_B2R2_MCDE
] = {
363 .name
= "db8500-b2r2-mcde",
364 .id
= DB8500_REGULATOR_SWITCH_B2R2_MCDE
,
365 .ops
= &db8500_regulator_switch_ops
,
366 .type
= REGULATOR_VOLTAGE
,
367 .owner
= THIS_MODULE
,
369 .epod_id
= EPOD_ID_B2R2_MCDE
,
371 [DB8500_REGULATOR_SWITCH_ESRAM12
] = {
373 .name
= "db8500-esram12",
374 .id
= DB8500_REGULATOR_SWITCH_ESRAM12
,
375 .ops
= &db8500_regulator_switch_ops
,
376 .type
= REGULATOR_VOLTAGE
,
377 .owner
= THIS_MODULE
,
379 .epod_id
= EPOD_ID_ESRAM12
,
382 [DB8500_REGULATOR_SWITCH_ESRAM12RET
] = {
384 .name
= "db8500-esram12-ret",
385 .id
= DB8500_REGULATOR_SWITCH_ESRAM12RET
,
386 .ops
= &db8500_regulator_switch_ops
,
387 .type
= REGULATOR_VOLTAGE
,
388 .owner
= THIS_MODULE
,
390 .epod_id
= EPOD_ID_ESRAM12
,
393 [DB8500_REGULATOR_SWITCH_ESRAM34
] = {
395 .name
= "db8500-esram34",
396 .id
= DB8500_REGULATOR_SWITCH_ESRAM34
,
397 .ops
= &db8500_regulator_switch_ops
,
398 .type
= REGULATOR_VOLTAGE
,
399 .owner
= THIS_MODULE
,
401 .epod_id
= EPOD_ID_ESRAM34
,
404 [DB8500_REGULATOR_SWITCH_ESRAM34RET
] = {
406 .name
= "db8500-esram34-ret",
407 .id
= DB8500_REGULATOR_SWITCH_ESRAM34RET
,
408 .ops
= &db8500_regulator_switch_ops
,
409 .type
= REGULATOR_VOLTAGE
,
410 .owner
= THIS_MODULE
,
412 .epod_id
= EPOD_ID_ESRAM34
,
417 static int db8500_regulator_register(struct platform_device
*pdev
,
418 struct regulator_init_data
*init_data
,
420 struct device_node
*np
)
422 struct dbx500_regulator_info
*info
;
423 struct regulator_config config
= { };
426 /* assign per-regulator data */
427 info
= &dbx500_regulator_info
[id
];
428 info
->dev
= &pdev
->dev
;
430 config
.dev
= &pdev
->dev
;
431 config
.init_data
= init_data
;
432 config
.driver_data
= info
;
435 /* register with the regulator framework */
436 info
->rdev
= devm_regulator_register(&pdev
->dev
, &info
->desc
, &config
);
437 if (IS_ERR(info
->rdev
)) {
438 err
= PTR_ERR(info
->rdev
);
439 dev_err(&pdev
->dev
, "failed to register %s: err %i\n",
440 info
->desc
.name
, err
);
444 dev_dbg(rdev_get_dev(info
->rdev
),
445 "regulator-%s-probed\n", info
->desc
.name
);
450 static struct of_regulator_match db8500_regulator_matches
[] = {
451 { .name
= "db8500_vape", .driver_data
= (void *) DB8500_REGULATOR_VAPE
, },
452 { .name
= "db8500_varm", .driver_data
= (void *) DB8500_REGULATOR_VARM
, },
453 { .name
= "db8500_vmodem", .driver_data
= (void *) DB8500_REGULATOR_VMODEM
, },
454 { .name
= "db8500_vpll", .driver_data
= (void *) DB8500_REGULATOR_VPLL
, },
455 { .name
= "db8500_vsmps1", .driver_data
= (void *) DB8500_REGULATOR_VSMPS1
, },
456 { .name
= "db8500_vsmps2", .driver_data
= (void *) DB8500_REGULATOR_VSMPS2
, },
457 { .name
= "db8500_vsmps3", .driver_data
= (void *) DB8500_REGULATOR_VSMPS3
, },
458 { .name
= "db8500_vrf1", .driver_data
= (void *) DB8500_REGULATOR_VRF1
, },
459 { .name
= "db8500_sva_mmdsp", .driver_data
= (void *) DB8500_REGULATOR_SWITCH_SVAMMDSP
, },
460 { .name
= "db8500_sva_mmdsp_ret", .driver_data
= (void *) DB8500_REGULATOR_SWITCH_SVAMMDSPRET
, },
461 { .name
= "db8500_sva_pipe", .driver_data
= (void *) DB8500_REGULATOR_SWITCH_SVAPIPE
, },
462 { .name
= "db8500_sia_mmdsp", .driver_data
= (void *) DB8500_REGULATOR_SWITCH_SIAMMDSP
, },
463 { .name
= "db8500_sia_mmdsp_ret", .driver_data
= (void *) DB8500_REGULATOR_SWITCH_SIAMMDSPRET
, },
464 { .name
= "db8500_sia_pipe", .driver_data
= (void *) DB8500_REGULATOR_SWITCH_SIAPIPE
, },
465 { .name
= "db8500_sga", .driver_data
= (void *) DB8500_REGULATOR_SWITCH_SGA
, },
466 { .name
= "db8500_b2r2_mcde", .driver_data
= (void *) DB8500_REGULATOR_SWITCH_B2R2_MCDE
, },
467 { .name
= "db8500_esram12", .driver_data
= (void *) DB8500_REGULATOR_SWITCH_ESRAM12
, },
468 { .name
= "db8500_esram12_ret", .driver_data
= (void *) DB8500_REGULATOR_SWITCH_ESRAM12RET
, },
469 { .name
= "db8500_esram34", .driver_data
= (void *) DB8500_REGULATOR_SWITCH_ESRAM34
, },
470 { .name
= "db8500_esram34_ret", .driver_data
= (void *) DB8500_REGULATOR_SWITCH_ESRAM34RET
, },
474 db8500_regulator_of_probe(struct platform_device
*pdev
,
475 struct device_node
*np
)
479 for (i
= 0; i
< ARRAY_SIZE(dbx500_regulator_info
); i
++) {
480 err
= db8500_regulator_register(
481 pdev
, db8500_regulator_matches
[i
].init_data
,
482 i
, db8500_regulator_matches
[i
].of_node
);
490 static int db8500_regulator_probe(struct platform_device
*pdev
)
492 struct regulator_init_data
*db8500_init_data
=
493 dev_get_platdata(&pdev
->dev
);
494 struct device_node
*np
= pdev
->dev
.of_node
;
497 /* register all regulators */
499 err
= of_regulator_match(&pdev
->dev
, np
,
500 db8500_regulator_matches
,
501 ARRAY_SIZE(db8500_regulator_matches
));
504 "Error parsing regulator init data: %d\n", err
);
508 err
= db8500_regulator_of_probe(pdev
, np
);
512 for (i
= 0; i
< ARRAY_SIZE(dbx500_regulator_info
); i
++) {
513 err
= db8500_regulator_register(pdev
,
514 &db8500_init_data
[i
],
521 err
= ux500_regulator_debug_init(pdev
,
522 dbx500_regulator_info
,
523 ARRAY_SIZE(dbx500_regulator_info
));
527 static int db8500_regulator_remove(struct platform_device
*pdev
)
529 ux500_regulator_debug_exit();
534 static struct platform_driver db8500_regulator_driver
= {
536 .name
= "db8500-prcmu-regulators",
538 .probe
= db8500_regulator_probe
,
539 .remove
= db8500_regulator_remove
,
542 static int __init
db8500_regulator_init(void)
544 return platform_driver_register(&db8500_regulator_driver
);
547 static void __exit
db8500_regulator_exit(void)
549 platform_driver_unregister(&db8500_regulator_driver
);
552 arch_initcall(db8500_regulator_init
);
553 module_exit(db8500_regulator_exit
);
555 MODULE_AUTHOR("STMicroelectronics/ST-Ericsson");
556 MODULE_DESCRIPTION("DB8500 regulator driver");
557 MODULE_LICENSE("GPL v2");