2 * wm831x-ldo.c -- LDO driver for the WM831x series
4 * Copyright 2009 Wolfson Microelectronics PLC.
6 * Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License as published by the
10 * Free Software Foundation; either version 2 of the License, or (at your
11 * option) any later version.
14 #include <linux/module.h>
15 #include <linux/moduleparam.h>
16 #include <linux/init.h>
17 #include <linux/bitops.h>
18 #include <linux/err.h>
19 #include <linux/i2c.h>
20 #include <linux/platform_device.h>
21 #include <linux/regulator/driver.h>
22 #include <linux/slab.h>
24 #include <linux/mfd/wm831x/core.h>
25 #include <linux/mfd/wm831x/regulator.h>
26 #include <linux/mfd/wm831x/pdata.h>
28 #define WM831X_LDO_MAX_NAME 9
30 #define WM831X_LDO_CONTROL 0
31 #define WM831X_LDO_ON_CONTROL 1
32 #define WM831X_LDO_SLEEP_CONTROL 2
34 #define WM831X_ALIVE_LDO_ON_CONTROL 0
35 #define WM831X_ALIVE_LDO_SLEEP_CONTROL 1
38 char name[WM831X_LDO_MAX_NAME];
39 char supply_name[WM831X_LDO_MAX_NAME];
40 struct regulator_desc desc;
42 struct wm831x *wm831x;
43 struct regulator_dev *regulator;
50 static irqreturn_t wm831x_ldo_uv_irq(int irq, void *data)
52 struct wm831x_ldo *ldo = data;
54 regulator_notifier_call_chain(ldo->regulator,
55 REGULATOR_EVENT_UNDER_VOLTAGE,
62 * General purpose LDOs
65 #define WM831X_GP_LDO_SELECTOR_LOW 0xe
66 #define WM831X_GP_LDO_MAX_SELECTOR 0x1f
68 static int wm831x_gp_ldo_list_voltage(struct regulator_dev *rdev,
69 unsigned int selector)
71 /* 0.9-1.6V in 50mV steps */
72 if (selector <= WM831X_GP_LDO_SELECTOR_LOW)
73 return 900000 + (selector * 50000);
74 /* 1.7-3.3V in 100mV steps */
75 if (selector <= WM831X_GP_LDO_MAX_SELECTOR)
76 return 1600000 + ((selector - WM831X_GP_LDO_SELECTOR_LOW)
81 static int wm831x_gp_ldo_map_voltage(struct regulator_dev *rdev,
82 int min_uV, int max_uV)
88 else if (min_uV < 1700000)
89 vsel = ((min_uV - 900000) / 50000);
91 vsel = ((min_uV - 1700000) / 100000)
92 + WM831X_GP_LDO_SELECTOR_LOW + 1;
94 volt = wm831x_gp_ldo_list_voltage(rdev, vsel);
95 if (volt < min_uV || volt > max_uV)
101 static int wm831x_gp_ldo_set_suspend_voltage(struct regulator_dev *rdev,
104 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
105 struct wm831x *wm831x = ldo->wm831x;
106 int sel, reg = ldo->base + WM831X_LDO_SLEEP_CONTROL;
108 sel = wm831x_gp_ldo_map_voltage(rdev, uV, uV);
112 return wm831x_set_bits(wm831x, reg, WM831X_LDO1_ON_VSEL_MASK, sel);
115 static unsigned int wm831x_gp_ldo_get_mode(struct regulator_dev *rdev)
117 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
118 struct wm831x *wm831x = ldo->wm831x;
119 int ctrl_reg = ldo->base + WM831X_LDO_CONTROL;
120 int on_reg = ldo->base + WM831X_LDO_ON_CONTROL;
123 ret = wm831x_reg_read(wm831x, on_reg);
127 if (!(ret & WM831X_LDO1_ON_MODE))
128 return REGULATOR_MODE_NORMAL;
130 ret = wm831x_reg_read(wm831x, ctrl_reg);
134 if (ret & WM831X_LDO1_LP_MODE)
135 return REGULATOR_MODE_STANDBY;
137 return REGULATOR_MODE_IDLE;
140 static int wm831x_gp_ldo_set_mode(struct regulator_dev *rdev,
143 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
144 struct wm831x *wm831x = ldo->wm831x;
145 int ctrl_reg = ldo->base + WM831X_LDO_CONTROL;
146 int on_reg = ldo->base + WM831X_LDO_ON_CONTROL;
151 case REGULATOR_MODE_NORMAL:
152 ret = wm831x_set_bits(wm831x, on_reg,
153 WM831X_LDO1_ON_MODE, 0);
158 case REGULATOR_MODE_IDLE:
159 ret = wm831x_set_bits(wm831x, ctrl_reg,
160 WM831X_LDO1_LP_MODE, 0);
164 ret = wm831x_set_bits(wm831x, on_reg,
166 WM831X_LDO1_ON_MODE);
171 case REGULATOR_MODE_STANDBY:
172 ret = wm831x_set_bits(wm831x, ctrl_reg,
174 WM831X_LDO1_LP_MODE);
178 ret = wm831x_set_bits(wm831x, on_reg,
180 WM831X_LDO1_ON_MODE);
192 static int wm831x_gp_ldo_get_status(struct regulator_dev *rdev)
194 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
195 struct wm831x *wm831x = ldo->wm831x;
196 int mask = 1 << rdev_get_id(rdev);
199 /* Is the regulator on? */
200 ret = wm831x_reg_read(wm831x, WM831X_LDO_STATUS);
204 return REGULATOR_STATUS_OFF;
206 /* Is it reporting under voltage? */
207 ret = wm831x_reg_read(wm831x, WM831X_LDO_UV_STATUS);
211 return REGULATOR_STATUS_ERROR;
213 ret = wm831x_gp_ldo_get_mode(rdev);
217 return regulator_mode_to_status(ret);
220 static unsigned int wm831x_gp_ldo_get_optimum_mode(struct regulator_dev *rdev,
222 int output_uV, int load_uA)
225 return REGULATOR_MODE_STANDBY;
227 return REGULATOR_MODE_IDLE;
228 return REGULATOR_MODE_NORMAL;
232 static struct regulator_ops wm831x_gp_ldo_ops = {
233 .list_voltage = wm831x_gp_ldo_list_voltage,
234 .map_voltage = wm831x_gp_ldo_map_voltage,
235 .get_voltage_sel = regulator_get_voltage_sel_regmap,
236 .set_voltage_sel = regulator_set_voltage_sel_regmap,
237 .set_suspend_voltage = wm831x_gp_ldo_set_suspend_voltage,
238 .get_mode = wm831x_gp_ldo_get_mode,
239 .set_mode = wm831x_gp_ldo_set_mode,
240 .get_status = wm831x_gp_ldo_get_status,
241 .get_optimum_mode = wm831x_gp_ldo_get_optimum_mode,
242 .get_bypass = regulator_get_bypass_regmap,
243 .set_bypass = regulator_set_bypass_regmap,
245 .is_enabled = regulator_is_enabled_regmap,
246 .enable = regulator_enable_regmap,
247 .disable = regulator_disable_regmap,
250 static int wm831x_gp_ldo_probe(struct platform_device *pdev)
252 struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
253 struct wm831x_pdata *pdata = wm831x->dev->platform_data;
254 struct regulator_config config = { };
256 struct wm831x_ldo *ldo;
257 struct resource *res;
260 if (pdata && pdata->wm831x_num)
261 id = (pdata->wm831x_num * 10) + 1;
266 dev_dbg(&pdev->dev, "Probing LDO%d\n", id + 1);
268 ldo = devm_kzalloc(&pdev->dev, sizeof(struct wm831x_ldo), GFP_KERNEL);
270 dev_err(&pdev->dev, "Unable to allocate private data\n");
274 ldo->wm831x = wm831x;
276 res = platform_get_resource(pdev, IORESOURCE_REG, 0);
278 dev_err(&pdev->dev, "No REG resource\n");
282 ldo->base = res->start;
284 snprintf(ldo->name, sizeof(ldo->name), "LDO%d", id + 1);
285 ldo->desc.name = ldo->name;
287 snprintf(ldo->supply_name, sizeof(ldo->supply_name),
289 ldo->desc.supply_name = ldo->supply_name;
292 ldo->desc.type = REGULATOR_VOLTAGE;
293 ldo->desc.n_voltages = WM831X_GP_LDO_MAX_SELECTOR + 1;
294 ldo->desc.ops = &wm831x_gp_ldo_ops;
295 ldo->desc.owner = THIS_MODULE;
296 ldo->desc.vsel_reg = ldo->base + WM831X_LDO_ON_CONTROL;
297 ldo->desc.vsel_mask = WM831X_LDO1_ON_VSEL_MASK;
298 ldo->desc.enable_reg = WM831X_LDO_ENABLE;
299 ldo->desc.enable_mask = 1 << id;
300 ldo->desc.bypass_reg = ldo->base;
301 ldo->desc.bypass_mask = WM831X_LDO1_SWI;
303 config.dev = pdev->dev.parent;
305 config.init_data = pdata->ldo[id];
306 config.driver_data = ldo;
307 config.regmap = wm831x->regmap;
309 ldo->regulator = regulator_register(&ldo->desc, &config);
310 if (IS_ERR(ldo->regulator)) {
311 ret = PTR_ERR(ldo->regulator);
312 dev_err(wm831x->dev, "Failed to register LDO%d: %d\n",
317 irq = wm831x_irq(wm831x, platform_get_irq_byname(pdev, "UV"));
318 ret = request_threaded_irq(irq, NULL, wm831x_ldo_uv_irq,
319 IRQF_TRIGGER_RISING, ldo->name,
322 dev_err(&pdev->dev, "Failed to request UV IRQ %d: %d\n",
327 platform_set_drvdata(pdev, ldo);
332 regulator_unregister(ldo->regulator);
337 static int wm831x_gp_ldo_remove(struct platform_device *pdev)
339 struct wm831x_ldo *ldo = platform_get_drvdata(pdev);
341 free_irq(wm831x_irq(ldo->wm831x,
342 platform_get_irq_byname(pdev, "UV")), ldo);
343 regulator_unregister(ldo->regulator);
348 static struct platform_driver wm831x_gp_ldo_driver = {
349 .probe = wm831x_gp_ldo_probe,
350 .remove = wm831x_gp_ldo_remove,
352 .name = "wm831x-ldo",
353 .owner = THIS_MODULE,
362 #define WM831X_ALDO_SELECTOR_LOW 0xc
363 #define WM831X_ALDO_MAX_SELECTOR 0x1f
365 static int wm831x_aldo_list_voltage(struct regulator_dev *rdev,
366 unsigned int selector)
368 /* 1-1.6V in 50mV steps */
369 if (selector <= WM831X_ALDO_SELECTOR_LOW)
370 return 1000000 + (selector * 50000);
371 /* 1.7-3.5V in 100mV steps */
372 if (selector <= WM831X_ALDO_MAX_SELECTOR)
373 return 1600000 + ((selector - WM831X_ALDO_SELECTOR_LOW)
378 static int wm831x_aldo_map_voltage(struct regulator_dev *rdev,
379 int min_uV, int max_uV)
383 if (min_uV < 1000000)
385 else if (min_uV < 1700000)
386 vsel = ((min_uV - 1000000) / 50000);
388 vsel = ((min_uV - 1700000) / 100000)
389 + WM831X_ALDO_SELECTOR_LOW + 1;
391 volt = wm831x_aldo_list_voltage(rdev, vsel);
392 if (volt < min_uV || volt > max_uV)
399 static int wm831x_aldo_set_suspend_voltage(struct regulator_dev *rdev,
402 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
403 struct wm831x *wm831x = ldo->wm831x;
404 int sel, reg = ldo->base + WM831X_LDO_SLEEP_CONTROL;
406 sel = wm831x_aldo_map_voltage(rdev, uV, uV);
410 return wm831x_set_bits(wm831x, reg, WM831X_LDO7_ON_VSEL_MASK, sel);
413 static unsigned int wm831x_aldo_get_mode(struct regulator_dev *rdev)
415 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
416 struct wm831x *wm831x = ldo->wm831x;
417 int on_reg = ldo->base + WM831X_LDO_ON_CONTROL;
420 ret = wm831x_reg_read(wm831x, on_reg);
424 if (ret & WM831X_LDO7_ON_MODE)
425 return REGULATOR_MODE_IDLE;
427 return REGULATOR_MODE_NORMAL;
430 static int wm831x_aldo_set_mode(struct regulator_dev *rdev,
433 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
434 struct wm831x *wm831x = ldo->wm831x;
435 int on_reg = ldo->base + WM831X_LDO_ON_CONTROL;
440 case REGULATOR_MODE_NORMAL:
441 ret = wm831x_set_bits(wm831x, on_reg, WM831X_LDO7_ON_MODE, 0);
446 case REGULATOR_MODE_IDLE:
447 ret = wm831x_set_bits(wm831x, on_reg, WM831X_LDO7_ON_MODE,
448 WM831X_LDO7_ON_MODE);
460 static int wm831x_aldo_get_status(struct regulator_dev *rdev)
462 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
463 struct wm831x *wm831x = ldo->wm831x;
464 int mask = 1 << rdev_get_id(rdev);
467 /* Is the regulator on? */
468 ret = wm831x_reg_read(wm831x, WM831X_LDO_STATUS);
472 return REGULATOR_STATUS_OFF;
474 /* Is it reporting under voltage? */
475 ret = wm831x_reg_read(wm831x, WM831X_LDO_UV_STATUS);
479 return REGULATOR_STATUS_ERROR;
481 ret = wm831x_aldo_get_mode(rdev);
485 return regulator_mode_to_status(ret);
488 static struct regulator_ops wm831x_aldo_ops = {
489 .list_voltage = wm831x_aldo_list_voltage,
490 .map_voltage = wm831x_aldo_map_voltage,
491 .get_voltage_sel = regulator_get_voltage_sel_regmap,
492 .set_voltage_sel = regulator_set_voltage_sel_regmap,
493 .set_suspend_voltage = wm831x_aldo_set_suspend_voltage,
494 .get_mode = wm831x_aldo_get_mode,
495 .set_mode = wm831x_aldo_set_mode,
496 .get_status = wm831x_aldo_get_status,
497 .set_bypass = regulator_set_bypass_regmap,
498 .get_bypass = regulator_get_bypass_regmap,
500 .is_enabled = regulator_is_enabled_regmap,
501 .enable = regulator_enable_regmap,
502 .disable = regulator_disable_regmap,
505 static int wm831x_aldo_probe(struct platform_device *pdev)
507 struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
508 struct wm831x_pdata *pdata = wm831x->dev->platform_data;
509 struct regulator_config config = { };
511 struct wm831x_ldo *ldo;
512 struct resource *res;
515 if (pdata && pdata->wm831x_num)
516 id = (pdata->wm831x_num * 10) + 1;
521 dev_dbg(&pdev->dev, "Probing LDO%d\n", id + 1);
523 ldo = devm_kzalloc(&pdev->dev, sizeof(struct wm831x_ldo), GFP_KERNEL);
525 dev_err(&pdev->dev, "Unable to allocate private data\n");
529 ldo->wm831x = wm831x;
531 res = platform_get_resource(pdev, IORESOURCE_REG, 0);
533 dev_err(&pdev->dev, "No REG resource\n");
537 ldo->base = res->start;
539 snprintf(ldo->name, sizeof(ldo->name), "LDO%d", id + 1);
540 ldo->desc.name = ldo->name;
542 snprintf(ldo->supply_name, sizeof(ldo->supply_name),
544 ldo->desc.supply_name = ldo->supply_name;
547 ldo->desc.type = REGULATOR_VOLTAGE;
548 ldo->desc.n_voltages = WM831X_ALDO_MAX_SELECTOR + 1;
549 ldo->desc.ops = &wm831x_aldo_ops;
550 ldo->desc.owner = THIS_MODULE;
551 ldo->desc.vsel_reg = ldo->base + WM831X_LDO_ON_CONTROL;
552 ldo->desc.vsel_mask = WM831X_LDO7_ON_VSEL_MASK;
553 ldo->desc.enable_reg = WM831X_LDO_ENABLE;
554 ldo->desc.enable_mask = 1 << id;
555 ldo->desc.bypass_reg = ldo->base;
556 ldo->desc.bypass_mask = WM831X_LDO7_SWI;
558 config.dev = pdev->dev.parent;
560 config.init_data = pdata->ldo[id];
561 config.driver_data = ldo;
562 config.regmap = wm831x->regmap;
564 ldo->regulator = regulator_register(&ldo->desc, &config);
565 if (IS_ERR(ldo->regulator)) {
566 ret = PTR_ERR(ldo->regulator);
567 dev_err(wm831x->dev, "Failed to register LDO%d: %d\n",
572 irq = wm831x_irq(wm831x, platform_get_irq_byname(pdev, "UV"));
573 ret = request_threaded_irq(irq, NULL, wm831x_ldo_uv_irq,
574 IRQF_TRIGGER_RISING, ldo->name, ldo);
576 dev_err(&pdev->dev, "Failed to request UV IRQ %d: %d\n",
581 platform_set_drvdata(pdev, ldo);
586 regulator_unregister(ldo->regulator);
591 static int wm831x_aldo_remove(struct platform_device *pdev)
593 struct wm831x_ldo *ldo = platform_get_drvdata(pdev);
595 free_irq(wm831x_irq(ldo->wm831x, platform_get_irq_byname(pdev, "UV")),
597 regulator_unregister(ldo->regulator);
602 static struct platform_driver wm831x_aldo_driver = {
603 .probe = wm831x_aldo_probe,
604 .remove = wm831x_aldo_remove,
606 .name = "wm831x-aldo",
607 .owner = THIS_MODULE,
615 #define WM831X_ALIVE_LDO_MAX_SELECTOR 0xf
617 static int wm831x_alive_ldo_set_suspend_voltage(struct regulator_dev *rdev,
620 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
621 struct wm831x *wm831x = ldo->wm831x;
622 int sel, reg = ldo->base + WM831X_ALIVE_LDO_SLEEP_CONTROL;
624 sel = regulator_map_voltage_linear(rdev, uV, uV);
628 return wm831x_set_bits(wm831x, reg, WM831X_LDO11_ON_VSEL_MASK, sel);
631 static int wm831x_alive_ldo_get_status(struct regulator_dev *rdev)
633 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
634 struct wm831x *wm831x = ldo->wm831x;
635 int mask = 1 << rdev_get_id(rdev);
638 /* Is the regulator on? */
639 ret = wm831x_reg_read(wm831x, WM831X_LDO_STATUS);
643 return REGULATOR_STATUS_ON;
645 return REGULATOR_STATUS_OFF;
648 static struct regulator_ops wm831x_alive_ldo_ops = {
649 .list_voltage = regulator_list_voltage_linear,
650 .map_voltage = regulator_map_voltage_linear,
651 .get_voltage_sel = regulator_get_voltage_sel_regmap,
652 .set_voltage_sel = regulator_set_voltage_sel_regmap,
653 .set_suspend_voltage = wm831x_alive_ldo_set_suspend_voltage,
654 .get_status = wm831x_alive_ldo_get_status,
656 .is_enabled = regulator_is_enabled_regmap,
657 .enable = regulator_enable_regmap,
658 .disable = regulator_disable_regmap,
661 static int wm831x_alive_ldo_probe(struct platform_device *pdev)
663 struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
664 struct wm831x_pdata *pdata = wm831x->dev->platform_data;
665 struct regulator_config config = { };
667 struct wm831x_ldo *ldo;
668 struct resource *res;
671 if (pdata && pdata->wm831x_num)
672 id = (pdata->wm831x_num * 10) + 1;
678 dev_dbg(&pdev->dev, "Probing LDO%d\n", id + 1);
680 ldo = devm_kzalloc(&pdev->dev, sizeof(struct wm831x_ldo), GFP_KERNEL);
682 dev_err(&pdev->dev, "Unable to allocate private data\n");
686 ldo->wm831x = wm831x;
688 res = platform_get_resource(pdev, IORESOURCE_REG, 0);
690 dev_err(&pdev->dev, "No REG resource\n");
694 ldo->base = res->start;
696 snprintf(ldo->name, sizeof(ldo->name), "LDO%d", id + 1);
697 ldo->desc.name = ldo->name;
699 snprintf(ldo->supply_name, sizeof(ldo->supply_name),
701 ldo->desc.supply_name = ldo->supply_name;
704 ldo->desc.type = REGULATOR_VOLTAGE;
705 ldo->desc.n_voltages = WM831X_ALIVE_LDO_MAX_SELECTOR + 1;
706 ldo->desc.ops = &wm831x_alive_ldo_ops;
707 ldo->desc.owner = THIS_MODULE;
708 ldo->desc.vsel_reg = ldo->base + WM831X_ALIVE_LDO_ON_CONTROL;
709 ldo->desc.vsel_mask = WM831X_LDO11_ON_VSEL_MASK;
710 ldo->desc.enable_reg = WM831X_LDO_ENABLE;
711 ldo->desc.enable_mask = 1 << id;
712 ldo->desc.min_uV = 800000;
713 ldo->desc.uV_step = 50000;
714 ldo->desc.enable_time = 1000;
716 config.dev = pdev->dev.parent;
718 config.init_data = pdata->ldo[id];
719 config.driver_data = ldo;
720 config.regmap = wm831x->regmap;
722 ldo->regulator = regulator_register(&ldo->desc, &config);
723 if (IS_ERR(ldo->regulator)) {
724 ret = PTR_ERR(ldo->regulator);
725 dev_err(wm831x->dev, "Failed to register LDO%d: %d\n",
730 platform_set_drvdata(pdev, ldo);
738 static int wm831x_alive_ldo_remove(struct platform_device *pdev)
740 struct wm831x_ldo *ldo = platform_get_drvdata(pdev);
742 regulator_unregister(ldo->regulator);
747 static struct platform_driver wm831x_alive_ldo_driver = {
748 .probe = wm831x_alive_ldo_probe,
749 .remove = wm831x_alive_ldo_remove,
751 .name = "wm831x-alive-ldo",
752 .owner = THIS_MODULE,
756 static int __init wm831x_ldo_init(void)
760 ret = platform_driver_register(&wm831x_gp_ldo_driver);
762 pr_err("Failed to register WM831x GP LDO driver: %d\n", ret);
764 ret = platform_driver_register(&wm831x_aldo_driver);
766 pr_err("Failed to register WM831x ALDO driver: %d\n", ret);
768 ret = platform_driver_register(&wm831x_alive_ldo_driver);
770 pr_err("Failed to register WM831x alive LDO driver: %d\n",
775 subsys_initcall(wm831x_ldo_init);
777 static void __exit wm831x_ldo_exit(void)
779 platform_driver_unregister(&wm831x_alive_ldo_driver);
780 platform_driver_unregister(&wm831x_aldo_driver);
781 platform_driver_unregister(&wm831x_gp_ldo_driver);
783 module_exit(wm831x_ldo_exit);
785 /* Module information */
786 MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
787 MODULE_DESCRIPTION("WM831x LDO driver");
788 MODULE_LICENSE("GPL");
789 MODULE_ALIAS("platform:wm831x-ldo");
790 MODULE_ALIAS("platform:wm831x-aldo");
791 MODULE_ALIAS("platform:wm831x-aliveldo");