2 * wm8350.c -- Voltage and current regulation for the Wolfson WM8350 PMIC
4 * Copyright 2007, 2008 Wolfson Microelectronics PLC.
6 * Author: Liam Girdwood
7 * linux@wolfsonmicro.com
9 * This program is free software; you can redistribute it and/or modify it
10 * under the terms of the GNU General Public License as published by the
11 * Free Software Foundation; either version 2 of the License, or (at your
12 * option) any later version.
15 #include <linux/module.h>
16 #include <linux/moduleparam.h>
17 #include <linux/init.h>
18 #include <linux/bitops.h>
19 #include <linux/err.h>
20 #include <linux/i2c.h>
21 #include <linux/mfd/wm8350/core.h>
22 #include <linux/mfd/wm8350/pmic.h>
23 #include <linux/platform_device.h>
24 #include <linux/regulator/driver.h>
25 #include <linux/regulator/machine.h>
27 /* Maximum value possible for VSEL */
28 #define WM8350_DCDC_MAX_VSEL 0x66
31 static const int isink_cur
[] = {
98 static int get_isink_val(int min_uA
, int max_uA
, u16
*setting
)
102 for (i
= 0; i
< ARRAY_SIZE(isink_cur
); i
++) {
103 if (min_uA
<= isink_cur
[i
] && max_uA
>= isink_cur
[i
]) {
111 static int wm8350_isink_set_current(struct regulator_dev
*rdev
, int min_uA
,
114 struct wm8350
*wm8350
= rdev_get_drvdata(rdev
);
115 int isink
= rdev_get_id(rdev
);
119 ret
= get_isink_val(min_uA
, max_uA
, &setting
);
125 val
= wm8350_reg_read(wm8350
, WM8350_CURRENT_SINK_DRIVER_A
) &
126 ~WM8350_CS1_ISEL_MASK
;
127 wm8350_reg_write(wm8350
, WM8350_CURRENT_SINK_DRIVER_A
,
131 val
= wm8350_reg_read(wm8350
, WM8350_CURRENT_SINK_DRIVER_B
) &
132 ~WM8350_CS1_ISEL_MASK
;
133 wm8350_reg_write(wm8350
, WM8350_CURRENT_SINK_DRIVER_B
,
143 static int wm8350_isink_get_current(struct regulator_dev
*rdev
)
145 struct wm8350
*wm8350
= rdev_get_drvdata(rdev
);
146 int isink
= rdev_get_id(rdev
);
151 val
= wm8350_reg_read(wm8350
, WM8350_CURRENT_SINK_DRIVER_A
) &
152 WM8350_CS1_ISEL_MASK
;
155 val
= wm8350_reg_read(wm8350
, WM8350_CURRENT_SINK_DRIVER_B
) &
156 WM8350_CS1_ISEL_MASK
;
162 return isink_cur
[val
];
165 /* turn on ISINK followed by DCDC */
166 static int wm8350_isink_enable(struct regulator_dev
*rdev
)
168 struct wm8350
*wm8350
= rdev_get_drvdata(rdev
);
169 int isink
= rdev_get_id(rdev
);
173 switch (wm8350
->pmic
.isink_A_dcdc
) {
176 wm8350_set_bits(wm8350
, WM8350_POWER_MGMT_7
,
178 wm8350_set_bits(wm8350
, WM8350_CSA_FLASH_CONTROL
,
180 wm8350_set_bits(wm8350
, WM8350_DCDC_LDO_REQUESTED
,
181 1 << (wm8350
->pmic
.isink_A_dcdc
-
189 switch (wm8350
->pmic
.isink_B_dcdc
) {
192 wm8350_set_bits(wm8350
, WM8350_POWER_MGMT_7
,
194 wm8350_set_bits(wm8350
, WM8350_CSB_FLASH_CONTROL
,
196 wm8350_set_bits(wm8350
, WM8350_DCDC_LDO_REQUESTED
,
197 1 << (wm8350
->pmic
.isink_B_dcdc
-
210 static int wm8350_isink_disable(struct regulator_dev
*rdev
)
212 struct wm8350
*wm8350
= rdev_get_drvdata(rdev
);
213 int isink
= rdev_get_id(rdev
);
217 switch (wm8350
->pmic
.isink_A_dcdc
) {
220 wm8350_clear_bits(wm8350
, WM8350_DCDC_LDO_REQUESTED
,
221 1 << (wm8350
->pmic
.isink_A_dcdc
-
223 wm8350_clear_bits(wm8350
, WM8350_POWER_MGMT_7
,
231 switch (wm8350
->pmic
.isink_B_dcdc
) {
234 wm8350_clear_bits(wm8350
, WM8350_DCDC_LDO_REQUESTED
,
235 1 << (wm8350
->pmic
.isink_B_dcdc
-
237 wm8350_clear_bits(wm8350
, WM8350_POWER_MGMT_7
,
250 static int wm8350_isink_is_enabled(struct regulator_dev
*rdev
)
252 struct wm8350
*wm8350
= rdev_get_drvdata(rdev
);
253 int isink
= rdev_get_id(rdev
);
257 return wm8350_reg_read(wm8350
, WM8350_CURRENT_SINK_DRIVER_A
) &
260 return wm8350_reg_read(wm8350
, WM8350_CURRENT_SINK_DRIVER_B
) &
266 static int wm8350_isink_enable_time(struct regulator_dev
*rdev
)
268 struct wm8350
*wm8350
= rdev_get_drvdata(rdev
);
269 int isink
= rdev_get_id(rdev
);
274 reg
= wm8350_reg_read(wm8350
, WM8350_CSA_FLASH_CONTROL
);
277 reg
= wm8350_reg_read(wm8350
, WM8350_CSB_FLASH_CONTROL
);
283 if (reg
& WM8350_CS1_FLASH_MODE
) {
284 switch (reg
& WM8350_CS1_ON_RAMP_MASK
) {
295 switch (reg
& WM8350_CS1_ON_RAMP_MASK
) {
311 int wm8350_isink_set_flash(struct wm8350
*wm8350
, int isink
, u16 mode
,
312 u16 trigger
, u16 duration
, u16 on_ramp
, u16 off_ramp
,
317 wm8350_reg_write(wm8350
, WM8350_CSA_FLASH_CONTROL
,
318 (mode
? WM8350_CS1_FLASH_MODE
: 0) |
319 (trigger
? WM8350_CS1_TRIGSRC
: 0) |
320 duration
| on_ramp
| off_ramp
| drive
);
323 wm8350_reg_write(wm8350
, WM8350_CSB_FLASH_CONTROL
,
324 (mode
? WM8350_CS2_FLASH_MODE
: 0) |
325 (trigger
? WM8350_CS2_TRIGSRC
: 0) |
326 duration
| on_ramp
| off_ramp
| drive
);
333 EXPORT_SYMBOL_GPL(wm8350_isink_set_flash
);
335 static int wm8350_dcdc_set_suspend_voltage(struct regulator_dev
*rdev
, int uV
)
337 struct wm8350
*wm8350
= rdev_get_drvdata(rdev
);
338 int sel
, volt_reg
, dcdc
= rdev_get_id(rdev
);
341 dev_dbg(wm8350
->dev
, "%s %d mV %d\n", __func__
, dcdc
, uV
/ 1000);
345 volt_reg
= WM8350_DCDC1_LOW_POWER
;
348 volt_reg
= WM8350_DCDC3_LOW_POWER
;
351 volt_reg
= WM8350_DCDC4_LOW_POWER
;
354 volt_reg
= WM8350_DCDC6_LOW_POWER
;
362 sel
= regulator_map_voltage_linear(rdev
, uV
, uV
);
366 /* all DCDCs have same mV bits */
367 val
= wm8350_reg_read(wm8350
, volt_reg
) & ~WM8350_DC1_VSEL_MASK
;
368 wm8350_reg_write(wm8350
, volt_reg
, val
| sel
);
372 static int wm8350_dcdc_set_suspend_enable(struct regulator_dev
*rdev
)
374 struct wm8350
*wm8350
= rdev_get_drvdata(rdev
);
375 int dcdc
= rdev_get_id(rdev
);
380 val
= wm8350_reg_read(wm8350
, WM8350_DCDC1_LOW_POWER
)
381 & ~WM8350_DCDC_HIB_MODE_MASK
;
382 wm8350_reg_write(wm8350
, WM8350_DCDC1_LOW_POWER
,
383 val
| wm8350
->pmic
.dcdc1_hib_mode
);
386 val
= wm8350_reg_read(wm8350
, WM8350_DCDC3_LOW_POWER
)
387 & ~WM8350_DCDC_HIB_MODE_MASK
;
388 wm8350_reg_write(wm8350
, WM8350_DCDC3_LOW_POWER
,
389 val
| wm8350
->pmic
.dcdc3_hib_mode
);
392 val
= wm8350_reg_read(wm8350
, WM8350_DCDC4_LOW_POWER
)
393 & ~WM8350_DCDC_HIB_MODE_MASK
;
394 wm8350_reg_write(wm8350
, WM8350_DCDC4_LOW_POWER
,
395 val
| wm8350
->pmic
.dcdc4_hib_mode
);
398 val
= wm8350_reg_read(wm8350
, WM8350_DCDC6_LOW_POWER
)
399 & ~WM8350_DCDC_HIB_MODE_MASK
;
400 wm8350_reg_write(wm8350
, WM8350_DCDC6_LOW_POWER
,
401 val
| wm8350
->pmic
.dcdc6_hib_mode
);
412 static int wm8350_dcdc_set_suspend_disable(struct regulator_dev
*rdev
)
414 struct wm8350
*wm8350
= rdev_get_drvdata(rdev
);
415 int dcdc
= rdev_get_id(rdev
);
420 val
= wm8350_reg_read(wm8350
, WM8350_DCDC1_LOW_POWER
);
421 wm8350
->pmic
.dcdc1_hib_mode
= val
& WM8350_DCDC_HIB_MODE_MASK
;
422 wm8350_reg_write(wm8350
, WM8350_DCDC1_LOW_POWER
,
423 val
| WM8350_DCDC_HIB_MODE_DIS
);
426 val
= wm8350_reg_read(wm8350
, WM8350_DCDC3_LOW_POWER
);
427 wm8350
->pmic
.dcdc3_hib_mode
= val
& WM8350_DCDC_HIB_MODE_MASK
;
428 wm8350_reg_write(wm8350
, WM8350_DCDC3_LOW_POWER
,
429 val
| WM8350_DCDC_HIB_MODE_DIS
);
432 val
= wm8350_reg_read(wm8350
, WM8350_DCDC4_LOW_POWER
);
433 wm8350
->pmic
.dcdc4_hib_mode
= val
& WM8350_DCDC_HIB_MODE_MASK
;
434 wm8350_reg_write(wm8350
, WM8350_DCDC4_LOW_POWER
,
435 val
| WM8350_DCDC_HIB_MODE_DIS
);
438 val
= wm8350_reg_read(wm8350
, WM8350_DCDC6_LOW_POWER
);
439 wm8350
->pmic
.dcdc6_hib_mode
= val
& WM8350_DCDC_HIB_MODE_MASK
;
440 wm8350_reg_write(wm8350
, WM8350_DCDC6_LOW_POWER
,
441 val
| WM8350_DCDC_HIB_MODE_DIS
);
452 static int wm8350_dcdc25_set_suspend_enable(struct regulator_dev
*rdev
)
454 struct wm8350
*wm8350
= rdev_get_drvdata(rdev
);
455 int dcdc
= rdev_get_id(rdev
);
460 val
= wm8350_reg_read(wm8350
, WM8350_DCDC2_CONTROL
)
461 & ~WM8350_DC2_HIB_MODE_MASK
;
462 wm8350_reg_write(wm8350
, WM8350_DCDC2_CONTROL
, val
|
463 (WM8350_DC2_HIB_MODE_ACTIVE
<< WM8350_DC2_HIB_MODE_SHIFT
));
466 val
= wm8350_reg_read(wm8350
, WM8350_DCDC5_CONTROL
)
467 & ~WM8350_DC5_HIB_MODE_MASK
;
468 wm8350_reg_write(wm8350
, WM8350_DCDC5_CONTROL
, val
|
469 (WM8350_DC5_HIB_MODE_ACTIVE
<< WM8350_DC5_HIB_MODE_SHIFT
));
477 static int wm8350_dcdc25_set_suspend_disable(struct regulator_dev
*rdev
)
479 struct wm8350
*wm8350
= rdev_get_drvdata(rdev
);
480 int dcdc
= rdev_get_id(rdev
);
485 val
= wm8350_reg_read(wm8350
, WM8350_DCDC2_CONTROL
)
486 & ~WM8350_DC2_HIB_MODE_MASK
;
487 wm8350_reg_write(wm8350
, WM8350_DCDC2_CONTROL
, val
|
488 (WM8350_DC2_HIB_MODE_DISABLE
<< WM8350_DC2_HIB_MODE_SHIFT
));
491 val
= wm8350_reg_read(wm8350
, WM8350_DCDC5_CONTROL
)
492 & ~WM8350_DC5_HIB_MODE_MASK
;
493 wm8350_reg_write(wm8350
, WM8350_DCDC5_CONTROL
, val
|
494 (WM8350_DC5_HIB_MODE_DISABLE
<< WM8350_DC5_HIB_MODE_SHIFT
));
502 static int wm8350_dcdc_set_suspend_mode(struct regulator_dev
*rdev
,
505 struct wm8350
*wm8350
= rdev_get_drvdata(rdev
);
506 int dcdc
= rdev_get_id(rdev
);
511 hib_mode
= &wm8350
->pmic
.dcdc1_hib_mode
;
514 hib_mode
= &wm8350
->pmic
.dcdc3_hib_mode
;
517 hib_mode
= &wm8350
->pmic
.dcdc4_hib_mode
;
520 hib_mode
= &wm8350
->pmic
.dcdc6_hib_mode
;
529 case REGULATOR_MODE_NORMAL
:
530 *hib_mode
= WM8350_DCDC_HIB_MODE_IMAGE
;
532 case REGULATOR_MODE_IDLE
:
533 *hib_mode
= WM8350_DCDC_HIB_MODE_STANDBY
;
535 case REGULATOR_MODE_STANDBY
:
536 *hib_mode
= WM8350_DCDC_HIB_MODE_LDO_IM
;
545 static const struct regulator_linear_range wm8350_ldo_ranges
[] = {
546 { .min_uV
= 900000, .max_uV
= 1650000, .min_sel
= 0, .max_sel
= 15,
548 { .min_uV
= 1800000, .max_uV
= 3300000, .min_sel
= 16, .max_sel
= 31,
552 static int wm8350_ldo_set_suspend_voltage(struct regulator_dev
*rdev
, int uV
)
554 struct wm8350
*wm8350
= rdev_get_drvdata(rdev
);
555 int sel
, volt_reg
, ldo
= rdev_get_id(rdev
);
558 dev_dbg(wm8350
->dev
, "%s %d mV %d\n", __func__
, ldo
, uV
/ 1000);
562 volt_reg
= WM8350_LDO1_LOW_POWER
;
565 volt_reg
= WM8350_LDO2_LOW_POWER
;
568 volt_reg
= WM8350_LDO3_LOW_POWER
;
571 volt_reg
= WM8350_LDO4_LOW_POWER
;
577 sel
= regulator_map_voltage_linear_range(rdev
, uV
, uV
);
581 /* all LDOs have same mV bits */
582 val
= wm8350_reg_read(wm8350
, volt_reg
) & ~WM8350_LDO1_VSEL_MASK
;
583 wm8350_reg_write(wm8350
, volt_reg
, val
| sel
);
587 static int wm8350_ldo_set_suspend_enable(struct regulator_dev
*rdev
)
589 struct wm8350
*wm8350
= rdev_get_drvdata(rdev
);
590 int volt_reg
, ldo
= rdev_get_id(rdev
);
595 volt_reg
= WM8350_LDO1_LOW_POWER
;
598 volt_reg
= WM8350_LDO2_LOW_POWER
;
601 volt_reg
= WM8350_LDO3_LOW_POWER
;
604 volt_reg
= WM8350_LDO4_LOW_POWER
;
610 /* all LDOs have same mV bits */
611 val
= wm8350_reg_read(wm8350
, volt_reg
) & ~WM8350_LDO1_HIB_MODE_MASK
;
612 wm8350_reg_write(wm8350
, volt_reg
, val
);
616 static int wm8350_ldo_set_suspend_disable(struct regulator_dev
*rdev
)
618 struct wm8350
*wm8350
= rdev_get_drvdata(rdev
);
619 int volt_reg
, ldo
= rdev_get_id(rdev
);
624 volt_reg
= WM8350_LDO1_LOW_POWER
;
627 volt_reg
= WM8350_LDO2_LOW_POWER
;
630 volt_reg
= WM8350_LDO3_LOW_POWER
;
633 volt_reg
= WM8350_LDO4_LOW_POWER
;
639 /* all LDOs have same mV bits */
640 val
= wm8350_reg_read(wm8350
, volt_reg
) & ~WM8350_LDO1_HIB_MODE_MASK
;
641 wm8350_reg_write(wm8350
, volt_reg
, val
| WM8350_LDO1_HIB_MODE_DIS
);
645 int wm8350_dcdc_set_slot(struct wm8350
*wm8350
, int dcdc
, u16 start
,
651 dev_dbg(wm8350
->dev
, "%s %d start %d stop %d\n",
652 __func__
, dcdc
, start
, stop
);
655 if (start
> 15 || stop
> 15)
660 slot_reg
= WM8350_DCDC1_TIMEOUTS
;
663 slot_reg
= WM8350_DCDC2_TIMEOUTS
;
666 slot_reg
= WM8350_DCDC3_TIMEOUTS
;
669 slot_reg
= WM8350_DCDC4_TIMEOUTS
;
672 slot_reg
= WM8350_DCDC5_TIMEOUTS
;
675 slot_reg
= WM8350_DCDC6_TIMEOUTS
;
681 val
= wm8350_reg_read(wm8350
, slot_reg
) &
682 ~(WM8350_DC1_ENSLOT_MASK
| WM8350_DC1_SDSLOT_MASK
|
683 WM8350_DC1_ERRACT_MASK
);
684 wm8350_reg_write(wm8350
, slot_reg
,
685 val
| (start
<< WM8350_DC1_ENSLOT_SHIFT
) |
686 (stop
<< WM8350_DC1_SDSLOT_SHIFT
) |
687 (fault
<< WM8350_DC1_ERRACT_SHIFT
));
691 EXPORT_SYMBOL_GPL(wm8350_dcdc_set_slot
);
693 int wm8350_ldo_set_slot(struct wm8350
*wm8350
, int ldo
, u16 start
, u16 stop
)
698 dev_dbg(wm8350
->dev
, "%s %d start %d stop %d\n",
699 __func__
, ldo
, start
, stop
);
702 if (start
> 15 || stop
> 15)
707 slot_reg
= WM8350_LDO1_TIMEOUTS
;
710 slot_reg
= WM8350_LDO2_TIMEOUTS
;
713 slot_reg
= WM8350_LDO3_TIMEOUTS
;
716 slot_reg
= WM8350_LDO4_TIMEOUTS
;
722 val
= wm8350_reg_read(wm8350
, slot_reg
) & ~WM8350_LDO1_SDSLOT_MASK
;
723 wm8350_reg_write(wm8350
, slot_reg
, val
| ((start
<< 10) | (stop
<< 6)));
726 EXPORT_SYMBOL_GPL(wm8350_ldo_set_slot
);
728 int wm8350_dcdc25_set_mode(struct wm8350
*wm8350
, int dcdc
, u16 mode
,
729 u16 ilim
, u16 ramp
, u16 feedback
)
733 dev_dbg(wm8350
->dev
, "%s %d mode: %s %s\n", __func__
, dcdc
,
734 mode
? "normal" : "boost", ilim
? "low" : "normal");
738 val
= wm8350_reg_read(wm8350
, WM8350_DCDC2_CONTROL
)
739 & ~(WM8350_DC2_MODE_MASK
| WM8350_DC2_ILIM_MASK
|
740 WM8350_DC2_RMP_MASK
| WM8350_DC2_FBSRC_MASK
);
741 wm8350_reg_write(wm8350
, WM8350_DCDC2_CONTROL
, val
|
742 (mode
<< WM8350_DC2_MODE_SHIFT
) |
743 (ilim
<< WM8350_DC2_ILIM_SHIFT
) |
744 (ramp
<< WM8350_DC2_RMP_SHIFT
) |
745 (feedback
<< WM8350_DC2_FBSRC_SHIFT
));
748 val
= wm8350_reg_read(wm8350
, WM8350_DCDC5_CONTROL
)
749 & ~(WM8350_DC5_MODE_MASK
| WM8350_DC5_ILIM_MASK
|
750 WM8350_DC5_RMP_MASK
| WM8350_DC5_FBSRC_MASK
);
751 wm8350_reg_write(wm8350
, WM8350_DCDC5_CONTROL
, val
|
752 (mode
<< WM8350_DC5_MODE_SHIFT
) |
753 (ilim
<< WM8350_DC5_ILIM_SHIFT
) |
754 (ramp
<< WM8350_DC5_RMP_SHIFT
) |
755 (feedback
<< WM8350_DC5_FBSRC_SHIFT
));
763 EXPORT_SYMBOL_GPL(wm8350_dcdc25_set_mode
);
765 static int force_continuous_enable(struct wm8350
*wm8350
, int dcdc
, int enable
)
771 reg
= WM8350_DCDC1_FORCE_PWM
;
774 reg
= WM8350_DCDC3_FORCE_PWM
;
777 reg
= WM8350_DCDC4_FORCE_PWM
;
780 reg
= WM8350_DCDC6_FORCE_PWM
;
787 ret
= wm8350_set_bits(wm8350
, reg
,
788 WM8350_DCDC1_FORCE_PWM_ENA
);
790 ret
= wm8350_clear_bits(wm8350
, reg
,
791 WM8350_DCDC1_FORCE_PWM_ENA
);
795 static int wm8350_dcdc_set_mode(struct regulator_dev
*rdev
, unsigned int mode
)
797 struct wm8350
*wm8350
= rdev_get_drvdata(rdev
);
798 int dcdc
= rdev_get_id(rdev
);
801 if (dcdc
< WM8350_DCDC_1
|| dcdc
> WM8350_DCDC_6
)
804 if (dcdc
== WM8350_DCDC_2
|| dcdc
== WM8350_DCDC_5
)
807 val
= 1 << (dcdc
- WM8350_DCDC_1
);
810 case REGULATOR_MODE_FAST
:
811 /* force continuous mode */
812 wm8350_set_bits(wm8350
, WM8350_DCDC_ACTIVE_OPTIONS
, val
);
813 wm8350_clear_bits(wm8350
, WM8350_DCDC_SLEEP_OPTIONS
, val
);
814 force_continuous_enable(wm8350
, dcdc
, 1);
816 case REGULATOR_MODE_NORMAL
:
817 /* active / pulse skipping */
818 wm8350_set_bits(wm8350
, WM8350_DCDC_ACTIVE_OPTIONS
, val
);
819 wm8350_clear_bits(wm8350
, WM8350_DCDC_SLEEP_OPTIONS
, val
);
820 force_continuous_enable(wm8350
, dcdc
, 0);
822 case REGULATOR_MODE_IDLE
:
824 force_continuous_enable(wm8350
, dcdc
, 0);
825 wm8350_clear_bits(wm8350
, WM8350_DCDC_SLEEP_OPTIONS
, val
);
826 wm8350_clear_bits(wm8350
, WM8350_DCDC_ACTIVE_OPTIONS
, val
);
828 case REGULATOR_MODE_STANDBY
:
830 force_continuous_enable(wm8350
, dcdc
, 0);
831 wm8350_set_bits(wm8350
, WM8350_DCDC_SLEEP_OPTIONS
, val
);
838 static unsigned int wm8350_dcdc_get_mode(struct regulator_dev
*rdev
)
840 struct wm8350
*wm8350
= rdev_get_drvdata(rdev
);
841 int dcdc
= rdev_get_id(rdev
);
842 u16 mask
, sleep
, active
, force
;
843 int mode
= REGULATOR_MODE_NORMAL
;
848 reg
= WM8350_DCDC1_FORCE_PWM
;
851 reg
= WM8350_DCDC3_FORCE_PWM
;
854 reg
= WM8350_DCDC4_FORCE_PWM
;
857 reg
= WM8350_DCDC6_FORCE_PWM
;
863 mask
= 1 << (dcdc
- WM8350_DCDC_1
);
864 active
= wm8350_reg_read(wm8350
, WM8350_DCDC_ACTIVE_OPTIONS
) & mask
;
865 force
= wm8350_reg_read(wm8350
, reg
) & WM8350_DCDC1_FORCE_PWM_ENA
;
866 sleep
= wm8350_reg_read(wm8350
, WM8350_DCDC_SLEEP_OPTIONS
) & mask
;
868 dev_dbg(wm8350
->dev
, "mask %x active %x sleep %x force %x",
869 mask
, active
, sleep
, force
);
871 if (active
&& !sleep
) {
873 mode
= REGULATOR_MODE_FAST
;
875 mode
= REGULATOR_MODE_NORMAL
;
876 } else if (!active
&& !sleep
)
877 mode
= REGULATOR_MODE_IDLE
;
879 mode
= REGULATOR_MODE_STANDBY
;
884 static unsigned int wm8350_ldo_get_mode(struct regulator_dev
*rdev
)
886 return REGULATOR_MODE_NORMAL
;
889 struct wm8350_dcdc_efficiency
{
895 static const struct wm8350_dcdc_efficiency dcdc1_6_efficiency
[] = {
896 {0, 10000, REGULATOR_MODE_STANDBY
}, /* 0 - 10mA - LDO */
897 {10000, 100000, REGULATOR_MODE_IDLE
}, /* 10mA - 100mA - Standby */
898 {100000, 1000000, REGULATOR_MODE_NORMAL
}, /* > 100mA - Active */
899 {-1, -1, REGULATOR_MODE_NORMAL
},
902 static const struct wm8350_dcdc_efficiency dcdc3_4_efficiency
[] = {
903 {0, 10000, REGULATOR_MODE_STANDBY
}, /* 0 - 10mA - LDO */
904 {10000, 100000, REGULATOR_MODE_IDLE
}, /* 10mA - 100mA - Standby */
905 {100000, 800000, REGULATOR_MODE_NORMAL
}, /* > 100mA - Active */
906 {-1, -1, REGULATOR_MODE_NORMAL
},
909 static unsigned int get_mode(int uA
, const struct wm8350_dcdc_efficiency
*eff
)
913 while (eff
[i
].uA_load_min
!= -1) {
914 if (uA
>= eff
[i
].uA_load_min
&& uA
<= eff
[i
].uA_load_max
)
917 return REGULATOR_MODE_NORMAL
;
920 /* Query the regulator for it's most efficient mode @ uV,uA
921 * WM8350 regulator efficiency is pretty similar over
922 * different input and output uV.
924 static unsigned int wm8350_dcdc_get_optimum_mode(struct regulator_dev
*rdev
,
925 int input_uV
, int output_uV
,
928 int dcdc
= rdev_get_id(rdev
), mode
;
933 mode
= get_mode(output_uA
, dcdc1_6_efficiency
);
937 mode
= get_mode(output_uA
, dcdc3_4_efficiency
);
940 mode
= REGULATOR_MODE_NORMAL
;
946 static struct regulator_ops wm8350_dcdc_ops
= {
947 .set_voltage_sel
= regulator_set_voltage_sel_regmap
,
948 .get_voltage_sel
= regulator_get_voltage_sel_regmap
,
949 .list_voltage
= regulator_list_voltage_linear
,
950 .map_voltage
= regulator_map_voltage_linear
,
951 .enable
= regulator_enable_regmap
,
952 .disable
= regulator_disable_regmap
,
953 .is_enabled
= regulator_is_enabled_regmap
,
954 .get_mode
= wm8350_dcdc_get_mode
,
955 .set_mode
= wm8350_dcdc_set_mode
,
956 .get_optimum_mode
= wm8350_dcdc_get_optimum_mode
,
957 .set_suspend_voltage
= wm8350_dcdc_set_suspend_voltage
,
958 .set_suspend_enable
= wm8350_dcdc_set_suspend_enable
,
959 .set_suspend_disable
= wm8350_dcdc_set_suspend_disable
,
960 .set_suspend_mode
= wm8350_dcdc_set_suspend_mode
,
963 static struct regulator_ops wm8350_dcdc2_5_ops
= {
964 .enable
= regulator_enable_regmap
,
965 .disable
= regulator_disable_regmap
,
966 .is_enabled
= regulator_is_enabled_regmap
,
967 .set_suspend_enable
= wm8350_dcdc25_set_suspend_enable
,
968 .set_suspend_disable
= wm8350_dcdc25_set_suspend_disable
,
971 static struct regulator_ops wm8350_ldo_ops
= {
972 .map_voltage
= regulator_map_voltage_linear_range
,
973 .set_voltage_sel
= regulator_set_voltage_sel_regmap
,
974 .get_voltage_sel
= regulator_get_voltage_sel_regmap
,
975 .list_voltage
= regulator_list_voltage_linear_range
,
976 .enable
= regulator_enable_regmap
,
977 .disable
= regulator_disable_regmap
,
978 .is_enabled
= regulator_is_enabled_regmap
,
979 .get_mode
= wm8350_ldo_get_mode
,
980 .set_suspend_voltage
= wm8350_ldo_set_suspend_voltage
,
981 .set_suspend_enable
= wm8350_ldo_set_suspend_enable
,
982 .set_suspend_disable
= wm8350_ldo_set_suspend_disable
,
985 static struct regulator_ops wm8350_isink_ops
= {
986 .set_current_limit
= wm8350_isink_set_current
,
987 .get_current_limit
= wm8350_isink_get_current
,
988 .enable
= wm8350_isink_enable
,
989 .disable
= wm8350_isink_disable
,
990 .is_enabled
= wm8350_isink_is_enabled
,
991 .enable_time
= wm8350_isink_enable_time
,
994 static const struct regulator_desc wm8350_reg
[NUM_WM8350_REGULATORS
] = {
998 .ops
= &wm8350_dcdc_ops
,
999 .irq
= WM8350_IRQ_UV_DC1
,
1000 .type
= REGULATOR_VOLTAGE
,
1001 .n_voltages
= WM8350_DCDC_MAX_VSEL
+ 1,
1004 .vsel_reg
= WM8350_DCDC1_CONTROL
,
1005 .vsel_mask
= WM8350_DC1_VSEL_MASK
,
1006 .enable_reg
= WM8350_DCDC_LDO_REQUESTED
,
1007 .enable_mask
= WM8350_DC1_ENA
,
1008 .owner
= THIS_MODULE
,
1012 .id
= WM8350_DCDC_2
,
1013 .ops
= &wm8350_dcdc2_5_ops
,
1014 .irq
= WM8350_IRQ_UV_DC2
,
1015 .type
= REGULATOR_VOLTAGE
,
1016 .enable_reg
= WM8350_DCDC_LDO_REQUESTED
,
1017 .enable_mask
= WM8350_DC2_ENA
,
1018 .owner
= THIS_MODULE
,
1022 .id
= WM8350_DCDC_3
,
1023 .ops
= &wm8350_dcdc_ops
,
1024 .irq
= WM8350_IRQ_UV_DC3
,
1025 .type
= REGULATOR_VOLTAGE
,
1026 .n_voltages
= WM8350_DCDC_MAX_VSEL
+ 1,
1029 .vsel_reg
= WM8350_DCDC3_CONTROL
,
1030 .vsel_mask
= WM8350_DC3_VSEL_MASK
,
1031 .enable_reg
= WM8350_DCDC_LDO_REQUESTED
,
1032 .enable_mask
= WM8350_DC3_ENA
,
1033 .owner
= THIS_MODULE
,
1037 .id
= WM8350_DCDC_4
,
1038 .ops
= &wm8350_dcdc_ops
,
1039 .irq
= WM8350_IRQ_UV_DC4
,
1040 .type
= REGULATOR_VOLTAGE
,
1041 .n_voltages
= WM8350_DCDC_MAX_VSEL
+ 1,
1044 .vsel_reg
= WM8350_DCDC4_CONTROL
,
1045 .vsel_mask
= WM8350_DC4_VSEL_MASK
,
1046 .enable_reg
= WM8350_DCDC_LDO_REQUESTED
,
1047 .enable_mask
= WM8350_DC4_ENA
,
1048 .owner
= THIS_MODULE
,
1052 .id
= WM8350_DCDC_5
,
1053 .ops
= &wm8350_dcdc2_5_ops
,
1054 .irq
= WM8350_IRQ_UV_DC5
,
1055 .type
= REGULATOR_VOLTAGE
,
1056 .enable_reg
= WM8350_DCDC_LDO_REQUESTED
,
1057 .enable_mask
= WM8350_DC5_ENA
,
1058 .owner
= THIS_MODULE
,
1062 .id
= WM8350_DCDC_6
,
1063 .ops
= &wm8350_dcdc_ops
,
1064 .irq
= WM8350_IRQ_UV_DC6
,
1065 .type
= REGULATOR_VOLTAGE
,
1066 .n_voltages
= WM8350_DCDC_MAX_VSEL
+ 1,
1069 .vsel_reg
= WM8350_DCDC6_CONTROL
,
1070 .vsel_mask
= WM8350_DC6_VSEL_MASK
,
1071 .enable_reg
= WM8350_DCDC_LDO_REQUESTED
,
1072 .enable_mask
= WM8350_DC6_ENA
,
1073 .owner
= THIS_MODULE
,
1078 .ops
= &wm8350_ldo_ops
,
1079 .irq
= WM8350_IRQ_UV_LDO1
,
1080 .type
= REGULATOR_VOLTAGE
,
1081 .n_voltages
= WM8350_LDO1_VSEL_MASK
+ 1,
1082 .linear_ranges
= wm8350_ldo_ranges
,
1083 .n_linear_ranges
= ARRAY_SIZE(wm8350_ldo_ranges
),
1084 .vsel_reg
= WM8350_LDO1_CONTROL
,
1085 .vsel_mask
= WM8350_LDO1_VSEL_MASK
,
1086 .enable_reg
= WM8350_DCDC_LDO_REQUESTED
,
1087 .enable_mask
= WM8350_LDO1_ENA
,
1088 .owner
= THIS_MODULE
,
1093 .ops
= &wm8350_ldo_ops
,
1094 .irq
= WM8350_IRQ_UV_LDO2
,
1095 .type
= REGULATOR_VOLTAGE
,
1096 .n_voltages
= WM8350_LDO2_VSEL_MASK
+ 1,
1097 .linear_ranges
= wm8350_ldo_ranges
,
1098 .n_linear_ranges
= ARRAY_SIZE(wm8350_ldo_ranges
),
1099 .vsel_reg
= WM8350_LDO2_CONTROL
,
1100 .vsel_mask
= WM8350_LDO2_VSEL_MASK
,
1101 .enable_reg
= WM8350_DCDC_LDO_REQUESTED
,
1102 .enable_mask
= WM8350_LDO2_ENA
,
1103 .owner
= THIS_MODULE
,
1108 .ops
= &wm8350_ldo_ops
,
1109 .irq
= WM8350_IRQ_UV_LDO3
,
1110 .type
= REGULATOR_VOLTAGE
,
1111 .n_voltages
= WM8350_LDO3_VSEL_MASK
+ 1,
1112 .linear_ranges
= wm8350_ldo_ranges
,
1113 .n_linear_ranges
= ARRAY_SIZE(wm8350_ldo_ranges
),
1114 .vsel_reg
= WM8350_LDO3_CONTROL
,
1115 .vsel_mask
= WM8350_LDO3_VSEL_MASK
,
1116 .enable_reg
= WM8350_DCDC_LDO_REQUESTED
,
1117 .enable_mask
= WM8350_LDO3_ENA
,
1118 .owner
= THIS_MODULE
,
1123 .ops
= &wm8350_ldo_ops
,
1124 .irq
= WM8350_IRQ_UV_LDO4
,
1125 .type
= REGULATOR_VOLTAGE
,
1126 .n_voltages
= WM8350_LDO4_VSEL_MASK
+ 1,
1127 .linear_ranges
= wm8350_ldo_ranges
,
1128 .n_linear_ranges
= ARRAY_SIZE(wm8350_ldo_ranges
),
1129 .vsel_reg
= WM8350_LDO4_CONTROL
,
1130 .vsel_mask
= WM8350_LDO4_VSEL_MASK
,
1131 .enable_reg
= WM8350_DCDC_LDO_REQUESTED
,
1132 .enable_mask
= WM8350_LDO4_ENA
,
1133 .owner
= THIS_MODULE
,
1137 .id
= WM8350_ISINK_A
,
1138 .ops
= &wm8350_isink_ops
,
1139 .irq
= WM8350_IRQ_CS1
,
1140 .type
= REGULATOR_CURRENT
,
1141 .owner
= THIS_MODULE
,
1145 .id
= WM8350_ISINK_B
,
1146 .ops
= &wm8350_isink_ops
,
1147 .irq
= WM8350_IRQ_CS2
,
1148 .type
= REGULATOR_CURRENT
,
1149 .owner
= THIS_MODULE
,
1153 static irqreturn_t
pmic_uv_handler(int irq
, void *data
)
1155 struct regulator_dev
*rdev
= (struct regulator_dev
*)data
;
1156 struct wm8350
*wm8350
= rdev_get_drvdata(rdev
);
1158 mutex_lock(&rdev
->mutex
);
1159 if (irq
== WM8350_IRQ_CS1
|| irq
== WM8350_IRQ_CS2
)
1160 regulator_notifier_call_chain(rdev
,
1161 REGULATOR_EVENT_REGULATION_OUT
,
1164 regulator_notifier_call_chain(rdev
,
1165 REGULATOR_EVENT_UNDER_VOLTAGE
,
1167 mutex_unlock(&rdev
->mutex
);
1172 static int wm8350_regulator_probe(struct platform_device
*pdev
)
1174 struct wm8350
*wm8350
= dev_get_drvdata(&pdev
->dev
);
1175 struct regulator_config config
= { };
1176 struct regulator_dev
*rdev
;
1180 if (pdev
->id
< WM8350_DCDC_1
|| pdev
->id
> WM8350_ISINK_B
)
1183 /* do any regulatior specific init */
1186 val
= wm8350_reg_read(wm8350
, WM8350_DCDC1_LOW_POWER
);
1187 wm8350
->pmic
.dcdc1_hib_mode
= val
& WM8350_DCDC_HIB_MODE_MASK
;
1190 val
= wm8350_reg_read(wm8350
, WM8350_DCDC3_LOW_POWER
);
1191 wm8350
->pmic
.dcdc3_hib_mode
= val
& WM8350_DCDC_HIB_MODE_MASK
;
1194 val
= wm8350_reg_read(wm8350
, WM8350_DCDC4_LOW_POWER
);
1195 wm8350
->pmic
.dcdc4_hib_mode
= val
& WM8350_DCDC_HIB_MODE_MASK
;
1198 val
= wm8350_reg_read(wm8350
, WM8350_DCDC6_LOW_POWER
);
1199 wm8350
->pmic
.dcdc6_hib_mode
= val
& WM8350_DCDC_HIB_MODE_MASK
;
1203 config
.dev
= &pdev
->dev
;
1204 config
.init_data
= dev_get_platdata(&pdev
->dev
);
1205 config
.driver_data
= dev_get_drvdata(&pdev
->dev
);
1206 config
.regmap
= wm8350
->regmap
;
1208 /* register regulator */
1209 rdev
= regulator_register(&wm8350_reg
[pdev
->id
], &config
);
1211 dev_err(&pdev
->dev
, "failed to register %s\n",
1212 wm8350_reg
[pdev
->id
].name
);
1213 return PTR_ERR(rdev
);
1216 /* register regulator IRQ */
1217 ret
= wm8350_register_irq(wm8350
, wm8350_reg
[pdev
->id
].irq
,
1218 pmic_uv_handler
, 0, "UV", rdev
);
1220 regulator_unregister(rdev
);
1221 dev_err(&pdev
->dev
, "failed to register regulator %s IRQ\n",
1222 wm8350_reg
[pdev
->id
].name
);
1229 static int wm8350_regulator_remove(struct platform_device
*pdev
)
1231 struct regulator_dev
*rdev
= platform_get_drvdata(pdev
);
1232 struct wm8350
*wm8350
= rdev_get_drvdata(rdev
);
1234 wm8350_free_irq(wm8350
, wm8350_reg
[pdev
->id
].irq
, rdev
);
1236 regulator_unregister(rdev
);
1241 int wm8350_register_regulator(struct wm8350
*wm8350
, int reg
,
1242 struct regulator_init_data
*initdata
)
1244 struct platform_device
*pdev
;
1246 if (reg
< 0 || reg
>= NUM_WM8350_REGULATORS
)
1249 if (wm8350
->pmic
.pdev
[reg
])
1252 if (reg
>= WM8350_DCDC_1
&& reg
<= WM8350_DCDC_6
&&
1253 reg
> wm8350
->pmic
.max_dcdc
)
1255 if (reg
>= WM8350_ISINK_A
&& reg
<= WM8350_ISINK_B
&&
1256 reg
> wm8350
->pmic
.max_isink
)
1259 pdev
= platform_device_alloc("wm8350-regulator", reg
);
1263 wm8350
->pmic
.pdev
[reg
] = pdev
;
1265 initdata
->driver_data
= wm8350
;
1267 pdev
->dev
.platform_data
= initdata
;
1268 pdev
->dev
.parent
= wm8350
->dev
;
1269 platform_set_drvdata(pdev
, wm8350
);
1271 ret
= platform_device_add(pdev
);
1274 dev_err(wm8350
->dev
, "Failed to register regulator %d: %d\n",
1276 platform_device_put(pdev
);
1277 wm8350
->pmic
.pdev
[reg
] = NULL
;
1282 EXPORT_SYMBOL_GPL(wm8350_register_regulator
);
1285 * wm8350_register_led - Register a WM8350 LED output
1287 * @param wm8350 The WM8350 device to configure.
1288 * @param lednum LED device index to create.
1289 * @param dcdc The DCDC to use for the LED.
1290 * @param isink The ISINK to use for the LED.
1291 * @param pdata Configuration for the LED.
1293 * The WM8350 supports the use of an ISINK together with a DCDC to
1294 * provide a power-efficient LED driver. This function registers the
1295 * regulators and instantiates the platform device for a LED. The
1296 * operating modes for the LED regulators must be configured using
1297 * wm8350_isink_set_flash(), wm8350_dcdc25_set_mode() and
1298 * wm8350_dcdc_set_slot() prior to calling this function.
1300 int wm8350_register_led(struct wm8350
*wm8350
, int lednum
, int dcdc
, int isink
,
1301 struct wm8350_led_platform_data
*pdata
)
1303 struct wm8350_led
*led
;
1304 struct platform_device
*pdev
;
1307 if (lednum
>= ARRAY_SIZE(wm8350
->pmic
.led
) || lednum
< 0) {
1308 dev_err(wm8350
->dev
, "Invalid LED index %d\n", lednum
);
1312 led
= &wm8350
->pmic
.led
[lednum
];
1315 dev_err(wm8350
->dev
, "LED %d already allocated\n", lednum
);
1319 pdev
= platform_device_alloc("wm8350-led", lednum
);
1321 dev_err(wm8350
->dev
, "Failed to allocate LED %d\n", lednum
);
1325 led
->isink_consumer
.dev_name
= dev_name(&pdev
->dev
);
1326 led
->isink_consumer
.supply
= "led_isink";
1327 led
->isink_init
.num_consumer_supplies
= 1;
1328 led
->isink_init
.consumer_supplies
= &led
->isink_consumer
;
1329 led
->isink_init
.constraints
.min_uA
= 0;
1330 led
->isink_init
.constraints
.max_uA
= pdata
->max_uA
;
1331 led
->isink_init
.constraints
.valid_ops_mask
1332 = REGULATOR_CHANGE_CURRENT
| REGULATOR_CHANGE_STATUS
;
1333 led
->isink_init
.constraints
.valid_modes_mask
= REGULATOR_MODE_NORMAL
;
1334 ret
= wm8350_register_regulator(wm8350
, isink
, &led
->isink_init
);
1336 platform_device_put(pdev
);
1340 led
->dcdc_consumer
.dev_name
= dev_name(&pdev
->dev
);
1341 led
->dcdc_consumer
.supply
= "led_vcc";
1342 led
->dcdc_init
.num_consumer_supplies
= 1;
1343 led
->dcdc_init
.consumer_supplies
= &led
->dcdc_consumer
;
1344 led
->dcdc_init
.constraints
.valid_modes_mask
= REGULATOR_MODE_NORMAL
;
1345 led
->dcdc_init
.constraints
.valid_ops_mask
= REGULATOR_CHANGE_STATUS
;
1346 ret
= wm8350_register_regulator(wm8350
, dcdc
, &led
->dcdc_init
);
1348 platform_device_put(pdev
);
1353 case WM8350_ISINK_A
:
1354 wm8350
->pmic
.isink_A_dcdc
= dcdc
;
1356 case WM8350_ISINK_B
:
1357 wm8350
->pmic
.isink_B_dcdc
= dcdc
;
1361 pdev
->dev
.platform_data
= pdata
;
1362 pdev
->dev
.parent
= wm8350
->dev
;
1363 ret
= platform_device_add(pdev
);
1365 dev_err(wm8350
->dev
, "Failed to register LED %d: %d\n",
1367 platform_device_put(pdev
);
1375 EXPORT_SYMBOL_GPL(wm8350_register_led
);
1377 static struct platform_driver wm8350_regulator_driver
= {
1378 .probe
= wm8350_regulator_probe
,
1379 .remove
= wm8350_regulator_remove
,
1381 .name
= "wm8350-regulator",
1385 static int __init
wm8350_regulator_init(void)
1387 return platform_driver_register(&wm8350_regulator_driver
);
1389 subsys_initcall(wm8350_regulator_init
);
1391 static void __exit
wm8350_regulator_exit(void)
1393 platform_driver_unregister(&wm8350_regulator_driver
);
1395 module_exit(wm8350_regulator_exit
);
1397 /* Module information */
1398 MODULE_AUTHOR("Liam Girdwood");
1399 MODULE_DESCRIPTION("WM8350 voltage and current regulator driver");
1400 MODULE_LICENSE("GPL");
1401 MODULE_ALIAS("platform:wm8350-regulator");