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 static const struct regulator_linear_range wm831x_gp_ldo_ranges[] = {
66 { .min_uV = 900000, .max_uV = 1600000, .min_sel = 0, .max_sel = 14,
68 { .min_uV = 1700000, .max_uV = 3300000, .min_sel = 15, .max_sel = 31,
72 static int wm831x_gp_ldo_set_suspend_voltage(struct regulator_dev *rdev,
75 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
76 struct wm831x *wm831x = ldo->wm831x;
77 int sel, reg = ldo->base + WM831X_LDO_SLEEP_CONTROL;
79 sel = regulator_map_voltage_linear_range(rdev, uV, uV);
83 return wm831x_set_bits(wm831x, reg, WM831X_LDO1_ON_VSEL_MASK, sel);
86 static unsigned int wm831x_gp_ldo_get_mode(struct regulator_dev *rdev)
88 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
89 struct wm831x *wm831x = ldo->wm831x;
90 int ctrl_reg = ldo->base + WM831X_LDO_CONTROL;
91 int on_reg = ldo->base + WM831X_LDO_ON_CONTROL;
94 ret = wm831x_reg_read(wm831x, on_reg);
98 if (!(ret & WM831X_LDO1_ON_MODE))
99 return REGULATOR_MODE_NORMAL;
101 ret = wm831x_reg_read(wm831x, ctrl_reg);
105 if (ret & WM831X_LDO1_LP_MODE)
106 return REGULATOR_MODE_STANDBY;
108 return REGULATOR_MODE_IDLE;
111 static int wm831x_gp_ldo_set_mode(struct regulator_dev *rdev,
114 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
115 struct wm831x *wm831x = ldo->wm831x;
116 int ctrl_reg = ldo->base + WM831X_LDO_CONTROL;
117 int on_reg = ldo->base + WM831X_LDO_ON_CONTROL;
122 case REGULATOR_MODE_NORMAL:
123 ret = wm831x_set_bits(wm831x, on_reg,
124 WM831X_LDO1_ON_MODE, 0);
129 case REGULATOR_MODE_IDLE:
130 ret = wm831x_set_bits(wm831x, ctrl_reg,
131 WM831X_LDO1_LP_MODE, 0);
135 ret = wm831x_set_bits(wm831x, on_reg,
137 WM831X_LDO1_ON_MODE);
142 case REGULATOR_MODE_STANDBY:
143 ret = wm831x_set_bits(wm831x, ctrl_reg,
145 WM831X_LDO1_LP_MODE);
149 ret = wm831x_set_bits(wm831x, on_reg,
151 WM831X_LDO1_ON_MODE);
163 static int wm831x_gp_ldo_get_status(struct regulator_dev *rdev)
165 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
166 struct wm831x *wm831x = ldo->wm831x;
167 int mask = 1 << rdev_get_id(rdev);
170 /* Is the regulator on? */
171 ret = wm831x_reg_read(wm831x, WM831X_LDO_STATUS);
175 return REGULATOR_STATUS_OFF;
177 /* Is it reporting under voltage? */
178 ret = wm831x_reg_read(wm831x, WM831X_LDO_UV_STATUS);
182 return REGULATOR_STATUS_ERROR;
184 ret = wm831x_gp_ldo_get_mode(rdev);
188 return regulator_mode_to_status(ret);
191 static unsigned int wm831x_gp_ldo_get_optimum_mode(struct regulator_dev *rdev,
193 int output_uV, int load_uA)
196 return REGULATOR_MODE_STANDBY;
198 return REGULATOR_MODE_IDLE;
199 return REGULATOR_MODE_NORMAL;
203 static struct regulator_ops wm831x_gp_ldo_ops = {
204 .list_voltage = regulator_list_voltage_linear_range,
205 .map_voltage = regulator_map_voltage_linear_range,
206 .get_voltage_sel = regulator_get_voltage_sel_regmap,
207 .set_voltage_sel = regulator_set_voltage_sel_regmap,
208 .set_suspend_voltage = wm831x_gp_ldo_set_suspend_voltage,
209 .get_mode = wm831x_gp_ldo_get_mode,
210 .set_mode = wm831x_gp_ldo_set_mode,
211 .get_status = wm831x_gp_ldo_get_status,
212 .get_optimum_mode = wm831x_gp_ldo_get_optimum_mode,
213 .get_bypass = regulator_get_bypass_regmap,
214 .set_bypass = regulator_set_bypass_regmap,
216 .is_enabled = regulator_is_enabled_regmap,
217 .enable = regulator_enable_regmap,
218 .disable = regulator_disable_regmap,
221 static int wm831x_gp_ldo_probe(struct platform_device *pdev)
223 struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
224 struct wm831x_pdata *pdata = dev_get_platdata(wm831x->dev);
225 struct regulator_config config = { };
227 struct wm831x_ldo *ldo;
228 struct resource *res;
231 if (pdata && pdata->wm831x_num)
232 id = (pdata->wm831x_num * 10) + 1;
237 dev_dbg(&pdev->dev, "Probing LDO%d\n", id + 1);
239 ldo = devm_kzalloc(&pdev->dev, sizeof(struct wm831x_ldo), GFP_KERNEL);
241 dev_err(&pdev->dev, "Unable to allocate private data\n");
245 ldo->wm831x = wm831x;
247 res = platform_get_resource(pdev, IORESOURCE_REG, 0);
249 dev_err(&pdev->dev, "No REG resource\n");
253 ldo->base = res->start;
255 snprintf(ldo->name, sizeof(ldo->name), "LDO%d", id + 1);
256 ldo->desc.name = ldo->name;
258 snprintf(ldo->supply_name, sizeof(ldo->supply_name),
260 ldo->desc.supply_name = ldo->supply_name;
263 ldo->desc.type = REGULATOR_VOLTAGE;
264 ldo->desc.n_voltages = 32;
265 ldo->desc.ops = &wm831x_gp_ldo_ops;
266 ldo->desc.owner = THIS_MODULE;
267 ldo->desc.vsel_reg = ldo->base + WM831X_LDO_ON_CONTROL;
268 ldo->desc.vsel_mask = WM831X_LDO1_ON_VSEL_MASK;
269 ldo->desc.enable_reg = WM831X_LDO_ENABLE;
270 ldo->desc.enable_mask = 1 << id;
271 ldo->desc.bypass_reg = ldo->base;
272 ldo->desc.bypass_mask = WM831X_LDO1_SWI;
273 ldo->desc.linear_ranges = wm831x_gp_ldo_ranges;
274 ldo->desc.n_linear_ranges = ARRAY_SIZE(wm831x_gp_ldo_ranges);
276 config.dev = pdev->dev.parent;
278 config.init_data = pdata->ldo[id];
279 config.driver_data = ldo;
280 config.regmap = wm831x->regmap;
282 ldo->regulator = devm_regulator_register(&pdev->dev, &ldo->desc,
284 if (IS_ERR(ldo->regulator)) {
285 ret = PTR_ERR(ldo->regulator);
286 dev_err(wm831x->dev, "Failed to register LDO%d: %d\n",
291 irq = wm831x_irq(wm831x, platform_get_irq_byname(pdev, "UV"));
292 ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
294 IRQF_TRIGGER_RISING, ldo->name,
297 dev_err(&pdev->dev, "Failed to request UV IRQ %d: %d\n",
302 platform_set_drvdata(pdev, ldo);
310 static struct platform_driver wm831x_gp_ldo_driver = {
311 .probe = wm831x_gp_ldo_probe,
313 .name = "wm831x-ldo",
314 .owner = THIS_MODULE,
322 static const struct regulator_linear_range wm831x_aldo_ranges[] = {
323 { .min_uV = 1000000, .max_uV = 1600000, .min_sel = 0, .max_sel = 12,
325 { .min_uV = 1700000, .max_uV = 3500000, .min_sel = 13, .max_sel = 31,
329 static int wm831x_aldo_set_suspend_voltage(struct regulator_dev *rdev,
332 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
333 struct wm831x *wm831x = ldo->wm831x;
334 int sel, reg = ldo->base + WM831X_LDO_SLEEP_CONTROL;
336 sel = regulator_map_voltage_linear_range(rdev, uV, uV);
340 return wm831x_set_bits(wm831x, reg, WM831X_LDO7_ON_VSEL_MASK, sel);
343 static unsigned int wm831x_aldo_get_mode(struct regulator_dev *rdev)
345 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
346 struct wm831x *wm831x = ldo->wm831x;
347 int on_reg = ldo->base + WM831X_LDO_ON_CONTROL;
350 ret = wm831x_reg_read(wm831x, on_reg);
354 if (ret & WM831X_LDO7_ON_MODE)
355 return REGULATOR_MODE_IDLE;
357 return REGULATOR_MODE_NORMAL;
360 static int wm831x_aldo_set_mode(struct regulator_dev *rdev,
363 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
364 struct wm831x *wm831x = ldo->wm831x;
365 int on_reg = ldo->base + WM831X_LDO_ON_CONTROL;
370 case REGULATOR_MODE_NORMAL:
371 ret = wm831x_set_bits(wm831x, on_reg, WM831X_LDO7_ON_MODE, 0);
376 case REGULATOR_MODE_IDLE:
377 ret = wm831x_set_bits(wm831x, on_reg, WM831X_LDO7_ON_MODE,
378 WM831X_LDO7_ON_MODE);
390 static int wm831x_aldo_get_status(struct regulator_dev *rdev)
392 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
393 struct wm831x *wm831x = ldo->wm831x;
394 int mask = 1 << rdev_get_id(rdev);
397 /* Is the regulator on? */
398 ret = wm831x_reg_read(wm831x, WM831X_LDO_STATUS);
402 return REGULATOR_STATUS_OFF;
404 /* Is it reporting under voltage? */
405 ret = wm831x_reg_read(wm831x, WM831X_LDO_UV_STATUS);
409 return REGULATOR_STATUS_ERROR;
411 ret = wm831x_aldo_get_mode(rdev);
415 return regulator_mode_to_status(ret);
418 static struct regulator_ops wm831x_aldo_ops = {
419 .list_voltage = regulator_list_voltage_linear_range,
420 .map_voltage = regulator_map_voltage_linear_range,
421 .get_voltage_sel = regulator_get_voltage_sel_regmap,
422 .set_voltage_sel = regulator_set_voltage_sel_regmap,
423 .set_suspend_voltage = wm831x_aldo_set_suspend_voltage,
424 .get_mode = wm831x_aldo_get_mode,
425 .set_mode = wm831x_aldo_set_mode,
426 .get_status = wm831x_aldo_get_status,
427 .set_bypass = regulator_set_bypass_regmap,
428 .get_bypass = regulator_get_bypass_regmap,
430 .is_enabled = regulator_is_enabled_regmap,
431 .enable = regulator_enable_regmap,
432 .disable = regulator_disable_regmap,
435 static int wm831x_aldo_probe(struct platform_device *pdev)
437 struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
438 struct wm831x_pdata *pdata = dev_get_platdata(wm831x->dev);
439 struct regulator_config config = { };
441 struct wm831x_ldo *ldo;
442 struct resource *res;
445 if (pdata && pdata->wm831x_num)
446 id = (pdata->wm831x_num * 10) + 1;
451 dev_dbg(&pdev->dev, "Probing LDO%d\n", id + 1);
453 ldo = devm_kzalloc(&pdev->dev, sizeof(struct wm831x_ldo), GFP_KERNEL);
455 dev_err(&pdev->dev, "Unable to allocate private data\n");
459 ldo->wm831x = wm831x;
461 res = platform_get_resource(pdev, IORESOURCE_REG, 0);
463 dev_err(&pdev->dev, "No REG resource\n");
467 ldo->base = res->start;
469 snprintf(ldo->name, sizeof(ldo->name), "LDO%d", id + 1);
470 ldo->desc.name = ldo->name;
472 snprintf(ldo->supply_name, sizeof(ldo->supply_name),
474 ldo->desc.supply_name = ldo->supply_name;
477 ldo->desc.type = REGULATOR_VOLTAGE;
478 ldo->desc.n_voltages = 32;
479 ldo->desc.linear_ranges = wm831x_aldo_ranges;
480 ldo->desc.n_linear_ranges = ARRAY_SIZE(wm831x_aldo_ranges);
481 ldo->desc.ops = &wm831x_aldo_ops;
482 ldo->desc.owner = THIS_MODULE;
483 ldo->desc.vsel_reg = ldo->base + WM831X_LDO_ON_CONTROL;
484 ldo->desc.vsel_mask = WM831X_LDO7_ON_VSEL_MASK;
485 ldo->desc.enable_reg = WM831X_LDO_ENABLE;
486 ldo->desc.enable_mask = 1 << id;
487 ldo->desc.bypass_reg = ldo->base;
488 ldo->desc.bypass_mask = WM831X_LDO7_SWI;
490 config.dev = pdev->dev.parent;
492 config.init_data = pdata->ldo[id];
493 config.driver_data = ldo;
494 config.regmap = wm831x->regmap;
496 ldo->regulator = devm_regulator_register(&pdev->dev, &ldo->desc,
498 if (IS_ERR(ldo->regulator)) {
499 ret = PTR_ERR(ldo->regulator);
500 dev_err(wm831x->dev, "Failed to register LDO%d: %d\n",
505 irq = wm831x_irq(wm831x, platform_get_irq_byname(pdev, "UV"));
506 ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
508 IRQF_TRIGGER_RISING, ldo->name, ldo);
510 dev_err(&pdev->dev, "Failed to request UV IRQ %d: %d\n",
515 platform_set_drvdata(pdev, ldo);
523 static struct platform_driver wm831x_aldo_driver = {
524 .probe = wm831x_aldo_probe,
526 .name = "wm831x-aldo",
527 .owner = THIS_MODULE,
535 #define WM831X_ALIVE_LDO_MAX_SELECTOR 0xf
537 static int wm831x_alive_ldo_set_suspend_voltage(struct regulator_dev *rdev,
540 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
541 struct wm831x *wm831x = ldo->wm831x;
542 int sel, reg = ldo->base + WM831X_ALIVE_LDO_SLEEP_CONTROL;
544 sel = regulator_map_voltage_linear(rdev, uV, uV);
548 return wm831x_set_bits(wm831x, reg, WM831X_LDO11_ON_VSEL_MASK, sel);
551 static int wm831x_alive_ldo_get_status(struct regulator_dev *rdev)
553 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
554 struct wm831x *wm831x = ldo->wm831x;
555 int mask = 1 << rdev_get_id(rdev);
558 /* Is the regulator on? */
559 ret = wm831x_reg_read(wm831x, WM831X_LDO_STATUS);
563 return REGULATOR_STATUS_ON;
565 return REGULATOR_STATUS_OFF;
568 static struct regulator_ops wm831x_alive_ldo_ops = {
569 .list_voltage = regulator_list_voltage_linear,
570 .map_voltage = regulator_map_voltage_linear,
571 .get_voltage_sel = regulator_get_voltage_sel_regmap,
572 .set_voltage_sel = regulator_set_voltage_sel_regmap,
573 .set_suspend_voltage = wm831x_alive_ldo_set_suspend_voltage,
574 .get_status = wm831x_alive_ldo_get_status,
576 .is_enabled = regulator_is_enabled_regmap,
577 .enable = regulator_enable_regmap,
578 .disable = regulator_disable_regmap,
581 static int wm831x_alive_ldo_probe(struct platform_device *pdev)
583 struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
584 struct wm831x_pdata *pdata = dev_get_platdata(wm831x->dev);
585 struct regulator_config config = { };
587 struct wm831x_ldo *ldo;
588 struct resource *res;
591 if (pdata && pdata->wm831x_num)
592 id = (pdata->wm831x_num * 10) + 1;
598 dev_dbg(&pdev->dev, "Probing LDO%d\n", id + 1);
600 ldo = devm_kzalloc(&pdev->dev, sizeof(struct wm831x_ldo), GFP_KERNEL);
602 dev_err(&pdev->dev, "Unable to allocate private data\n");
606 ldo->wm831x = wm831x;
608 res = platform_get_resource(pdev, IORESOURCE_REG, 0);
610 dev_err(&pdev->dev, "No REG resource\n");
614 ldo->base = res->start;
616 snprintf(ldo->name, sizeof(ldo->name), "LDO%d", id + 1);
617 ldo->desc.name = ldo->name;
619 snprintf(ldo->supply_name, sizeof(ldo->supply_name),
621 ldo->desc.supply_name = ldo->supply_name;
624 ldo->desc.type = REGULATOR_VOLTAGE;
625 ldo->desc.n_voltages = WM831X_ALIVE_LDO_MAX_SELECTOR + 1;
626 ldo->desc.ops = &wm831x_alive_ldo_ops;
627 ldo->desc.owner = THIS_MODULE;
628 ldo->desc.vsel_reg = ldo->base + WM831X_ALIVE_LDO_ON_CONTROL;
629 ldo->desc.vsel_mask = WM831X_LDO11_ON_VSEL_MASK;
630 ldo->desc.enable_reg = WM831X_LDO_ENABLE;
631 ldo->desc.enable_mask = 1 << id;
632 ldo->desc.min_uV = 800000;
633 ldo->desc.uV_step = 50000;
634 ldo->desc.enable_time = 1000;
636 config.dev = pdev->dev.parent;
638 config.init_data = pdata->ldo[id];
639 config.driver_data = ldo;
640 config.regmap = wm831x->regmap;
642 ldo->regulator = devm_regulator_register(&pdev->dev, &ldo->desc,
644 if (IS_ERR(ldo->regulator)) {
645 ret = PTR_ERR(ldo->regulator);
646 dev_err(wm831x->dev, "Failed to register LDO%d: %d\n",
651 platform_set_drvdata(pdev, ldo);
659 static struct platform_driver wm831x_alive_ldo_driver = {
660 .probe = wm831x_alive_ldo_probe,
662 .name = "wm831x-alive-ldo",
663 .owner = THIS_MODULE,
667 static int __init wm831x_ldo_init(void)
671 ret = platform_driver_register(&wm831x_gp_ldo_driver);
673 pr_err("Failed to register WM831x GP LDO driver: %d\n", ret);
675 ret = platform_driver_register(&wm831x_aldo_driver);
677 pr_err("Failed to register WM831x ALDO driver: %d\n", ret);
679 ret = platform_driver_register(&wm831x_alive_ldo_driver);
681 pr_err("Failed to register WM831x alive LDO driver: %d\n",
686 subsys_initcall(wm831x_ldo_init);
688 static void __exit wm831x_ldo_exit(void)
690 platform_driver_unregister(&wm831x_alive_ldo_driver);
691 platform_driver_unregister(&wm831x_aldo_driver);
692 platform_driver_unregister(&wm831x_gp_ldo_driver);
694 module_exit(wm831x_ldo_exit);
696 /* Module information */
697 MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
698 MODULE_DESCRIPTION("WM831x LDO driver");
699 MODULE_LICENSE("GPL");
700 MODULE_ALIAS("platform:wm831x-ldo");
701 MODULE_ALIAS("platform:wm831x-aldo");
702 MODULE_ALIAS("platform:wm831x-aliveldo");