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 REGULATOR_LINEAR_RANGE(900000, 0, 15, 50000),
547 REGULATOR_LINEAR_RANGE(1800000, 16, 31, 100000),
550 static int wm8350_ldo_set_suspend_voltage(struct regulator_dev
*rdev
, int uV
)
552 struct wm8350
*wm8350
= rdev_get_drvdata(rdev
);
553 int sel
, volt_reg
, ldo
= rdev_get_id(rdev
);
556 dev_dbg(wm8350
->dev
, "%s %d mV %d\n", __func__
, ldo
, uV
/ 1000);
560 volt_reg
= WM8350_LDO1_LOW_POWER
;
563 volt_reg
= WM8350_LDO2_LOW_POWER
;
566 volt_reg
= WM8350_LDO3_LOW_POWER
;
569 volt_reg
= WM8350_LDO4_LOW_POWER
;
575 sel
= regulator_map_voltage_linear_range(rdev
, uV
, uV
);
579 /* all LDOs have same mV bits */
580 val
= wm8350_reg_read(wm8350
, volt_reg
) & ~WM8350_LDO1_VSEL_MASK
;
581 wm8350_reg_write(wm8350
, volt_reg
, val
| sel
);
585 static int wm8350_ldo_set_suspend_enable(struct regulator_dev
*rdev
)
587 struct wm8350
*wm8350
= rdev_get_drvdata(rdev
);
588 int volt_reg
, ldo
= rdev_get_id(rdev
);
593 volt_reg
= WM8350_LDO1_LOW_POWER
;
596 volt_reg
= WM8350_LDO2_LOW_POWER
;
599 volt_reg
= WM8350_LDO3_LOW_POWER
;
602 volt_reg
= WM8350_LDO4_LOW_POWER
;
608 /* all LDOs have same mV bits */
609 val
= wm8350_reg_read(wm8350
, volt_reg
) & ~WM8350_LDO1_HIB_MODE_MASK
;
610 wm8350_reg_write(wm8350
, volt_reg
, val
);
614 static int wm8350_ldo_set_suspend_disable(struct regulator_dev
*rdev
)
616 struct wm8350
*wm8350
= rdev_get_drvdata(rdev
);
617 int volt_reg
, ldo
= rdev_get_id(rdev
);
622 volt_reg
= WM8350_LDO1_LOW_POWER
;
625 volt_reg
= WM8350_LDO2_LOW_POWER
;
628 volt_reg
= WM8350_LDO3_LOW_POWER
;
631 volt_reg
= WM8350_LDO4_LOW_POWER
;
637 /* all LDOs have same mV bits */
638 val
= wm8350_reg_read(wm8350
, volt_reg
) & ~WM8350_LDO1_HIB_MODE_MASK
;
639 wm8350_reg_write(wm8350
, volt_reg
, val
| WM8350_LDO1_HIB_MODE_DIS
);
643 int wm8350_dcdc_set_slot(struct wm8350
*wm8350
, int dcdc
, u16 start
,
649 dev_dbg(wm8350
->dev
, "%s %d start %d stop %d\n",
650 __func__
, dcdc
, start
, stop
);
653 if (start
> 15 || stop
> 15)
658 slot_reg
= WM8350_DCDC1_TIMEOUTS
;
661 slot_reg
= WM8350_DCDC2_TIMEOUTS
;
664 slot_reg
= WM8350_DCDC3_TIMEOUTS
;
667 slot_reg
= WM8350_DCDC4_TIMEOUTS
;
670 slot_reg
= WM8350_DCDC5_TIMEOUTS
;
673 slot_reg
= WM8350_DCDC6_TIMEOUTS
;
679 val
= wm8350_reg_read(wm8350
, slot_reg
) &
680 ~(WM8350_DC1_ENSLOT_MASK
| WM8350_DC1_SDSLOT_MASK
|
681 WM8350_DC1_ERRACT_MASK
);
682 wm8350_reg_write(wm8350
, slot_reg
,
683 val
| (start
<< WM8350_DC1_ENSLOT_SHIFT
) |
684 (stop
<< WM8350_DC1_SDSLOT_SHIFT
) |
685 (fault
<< WM8350_DC1_ERRACT_SHIFT
));
689 EXPORT_SYMBOL_GPL(wm8350_dcdc_set_slot
);
691 int wm8350_ldo_set_slot(struct wm8350
*wm8350
, int ldo
, u16 start
, u16 stop
)
696 dev_dbg(wm8350
->dev
, "%s %d start %d stop %d\n",
697 __func__
, ldo
, start
, stop
);
700 if (start
> 15 || stop
> 15)
705 slot_reg
= WM8350_LDO1_TIMEOUTS
;
708 slot_reg
= WM8350_LDO2_TIMEOUTS
;
711 slot_reg
= WM8350_LDO3_TIMEOUTS
;
714 slot_reg
= WM8350_LDO4_TIMEOUTS
;
720 val
= wm8350_reg_read(wm8350
, slot_reg
) & ~WM8350_LDO1_SDSLOT_MASK
;
721 wm8350_reg_write(wm8350
, slot_reg
, val
| ((start
<< 10) | (stop
<< 6)));
724 EXPORT_SYMBOL_GPL(wm8350_ldo_set_slot
);
726 int wm8350_dcdc25_set_mode(struct wm8350
*wm8350
, int dcdc
, u16 mode
,
727 u16 ilim
, u16 ramp
, u16 feedback
)
731 dev_dbg(wm8350
->dev
, "%s %d mode: %s %s\n", __func__
, dcdc
,
732 mode
? "normal" : "boost", ilim
? "low" : "normal");
736 val
= wm8350_reg_read(wm8350
, WM8350_DCDC2_CONTROL
)
737 & ~(WM8350_DC2_MODE_MASK
| WM8350_DC2_ILIM_MASK
|
738 WM8350_DC2_RMP_MASK
| WM8350_DC2_FBSRC_MASK
);
739 wm8350_reg_write(wm8350
, WM8350_DCDC2_CONTROL
, val
|
740 (mode
<< WM8350_DC2_MODE_SHIFT
) |
741 (ilim
<< WM8350_DC2_ILIM_SHIFT
) |
742 (ramp
<< WM8350_DC2_RMP_SHIFT
) |
743 (feedback
<< WM8350_DC2_FBSRC_SHIFT
));
746 val
= wm8350_reg_read(wm8350
, WM8350_DCDC5_CONTROL
)
747 & ~(WM8350_DC5_MODE_MASK
| WM8350_DC5_ILIM_MASK
|
748 WM8350_DC5_RMP_MASK
| WM8350_DC5_FBSRC_MASK
);
749 wm8350_reg_write(wm8350
, WM8350_DCDC5_CONTROL
, val
|
750 (mode
<< WM8350_DC5_MODE_SHIFT
) |
751 (ilim
<< WM8350_DC5_ILIM_SHIFT
) |
752 (ramp
<< WM8350_DC5_RMP_SHIFT
) |
753 (feedback
<< WM8350_DC5_FBSRC_SHIFT
));
761 EXPORT_SYMBOL_GPL(wm8350_dcdc25_set_mode
);
763 static int force_continuous_enable(struct wm8350
*wm8350
, int dcdc
, int enable
)
769 reg
= WM8350_DCDC1_FORCE_PWM
;
772 reg
= WM8350_DCDC3_FORCE_PWM
;
775 reg
= WM8350_DCDC4_FORCE_PWM
;
778 reg
= WM8350_DCDC6_FORCE_PWM
;
785 ret
= wm8350_set_bits(wm8350
, reg
,
786 WM8350_DCDC1_FORCE_PWM_ENA
);
788 ret
= wm8350_clear_bits(wm8350
, reg
,
789 WM8350_DCDC1_FORCE_PWM_ENA
);
793 static int wm8350_dcdc_set_mode(struct regulator_dev
*rdev
, unsigned int mode
)
795 struct wm8350
*wm8350
= rdev_get_drvdata(rdev
);
796 int dcdc
= rdev_get_id(rdev
);
799 if (dcdc
< WM8350_DCDC_1
|| dcdc
> WM8350_DCDC_6
)
802 if (dcdc
== WM8350_DCDC_2
|| dcdc
== WM8350_DCDC_5
)
805 val
= 1 << (dcdc
- WM8350_DCDC_1
);
808 case REGULATOR_MODE_FAST
:
809 /* force continuous mode */
810 wm8350_set_bits(wm8350
, WM8350_DCDC_ACTIVE_OPTIONS
, val
);
811 wm8350_clear_bits(wm8350
, WM8350_DCDC_SLEEP_OPTIONS
, val
);
812 force_continuous_enable(wm8350
, dcdc
, 1);
814 case REGULATOR_MODE_NORMAL
:
815 /* active / pulse skipping */
816 wm8350_set_bits(wm8350
, WM8350_DCDC_ACTIVE_OPTIONS
, val
);
817 wm8350_clear_bits(wm8350
, WM8350_DCDC_SLEEP_OPTIONS
, val
);
818 force_continuous_enable(wm8350
, dcdc
, 0);
820 case REGULATOR_MODE_IDLE
:
822 force_continuous_enable(wm8350
, dcdc
, 0);
823 wm8350_clear_bits(wm8350
, WM8350_DCDC_SLEEP_OPTIONS
, val
);
824 wm8350_clear_bits(wm8350
, WM8350_DCDC_ACTIVE_OPTIONS
, val
);
826 case REGULATOR_MODE_STANDBY
:
828 force_continuous_enable(wm8350
, dcdc
, 0);
829 wm8350_set_bits(wm8350
, WM8350_DCDC_SLEEP_OPTIONS
, val
);
836 static unsigned int wm8350_dcdc_get_mode(struct regulator_dev
*rdev
)
838 struct wm8350
*wm8350
= rdev_get_drvdata(rdev
);
839 int dcdc
= rdev_get_id(rdev
);
840 u16 mask
, sleep
, active
, force
;
841 int mode
= REGULATOR_MODE_NORMAL
;
846 reg
= WM8350_DCDC1_FORCE_PWM
;
849 reg
= WM8350_DCDC3_FORCE_PWM
;
852 reg
= WM8350_DCDC4_FORCE_PWM
;
855 reg
= WM8350_DCDC6_FORCE_PWM
;
861 mask
= 1 << (dcdc
- WM8350_DCDC_1
);
862 active
= wm8350_reg_read(wm8350
, WM8350_DCDC_ACTIVE_OPTIONS
) & mask
;
863 force
= wm8350_reg_read(wm8350
, reg
) & WM8350_DCDC1_FORCE_PWM_ENA
;
864 sleep
= wm8350_reg_read(wm8350
, WM8350_DCDC_SLEEP_OPTIONS
) & mask
;
866 dev_dbg(wm8350
->dev
, "mask %x active %x sleep %x force %x",
867 mask
, active
, sleep
, force
);
869 if (active
&& !sleep
) {
871 mode
= REGULATOR_MODE_FAST
;
873 mode
= REGULATOR_MODE_NORMAL
;
874 } else if (!active
&& !sleep
)
875 mode
= REGULATOR_MODE_IDLE
;
877 mode
= REGULATOR_MODE_STANDBY
;
882 static unsigned int wm8350_ldo_get_mode(struct regulator_dev
*rdev
)
884 return REGULATOR_MODE_NORMAL
;
887 struct wm8350_dcdc_efficiency
{
893 static const struct wm8350_dcdc_efficiency dcdc1_6_efficiency
[] = {
894 {0, 10000, REGULATOR_MODE_STANDBY
}, /* 0 - 10mA - LDO */
895 {10000, 100000, REGULATOR_MODE_IDLE
}, /* 10mA - 100mA - Standby */
896 {100000, 1000000, REGULATOR_MODE_NORMAL
}, /* > 100mA - Active */
897 {-1, -1, REGULATOR_MODE_NORMAL
},
900 static const struct wm8350_dcdc_efficiency dcdc3_4_efficiency
[] = {
901 {0, 10000, REGULATOR_MODE_STANDBY
}, /* 0 - 10mA - LDO */
902 {10000, 100000, REGULATOR_MODE_IDLE
}, /* 10mA - 100mA - Standby */
903 {100000, 800000, REGULATOR_MODE_NORMAL
}, /* > 100mA - Active */
904 {-1, -1, REGULATOR_MODE_NORMAL
},
907 static unsigned int get_mode(int uA
, const struct wm8350_dcdc_efficiency
*eff
)
911 while (eff
[i
].uA_load_min
!= -1) {
912 if (uA
>= eff
[i
].uA_load_min
&& uA
<= eff
[i
].uA_load_max
)
915 return REGULATOR_MODE_NORMAL
;
918 /* Query the regulator for it's most efficient mode @ uV,uA
919 * WM8350 regulator efficiency is pretty similar over
920 * different input and output uV.
922 static unsigned int wm8350_dcdc_get_optimum_mode(struct regulator_dev
*rdev
,
923 int input_uV
, int output_uV
,
926 int dcdc
= rdev_get_id(rdev
), mode
;
931 mode
= get_mode(output_uA
, dcdc1_6_efficiency
);
935 mode
= get_mode(output_uA
, dcdc3_4_efficiency
);
938 mode
= REGULATOR_MODE_NORMAL
;
944 static const struct regulator_ops wm8350_dcdc_ops
= {
945 .set_voltage_sel
= regulator_set_voltage_sel_regmap
,
946 .get_voltage_sel
= regulator_get_voltage_sel_regmap
,
947 .list_voltage
= regulator_list_voltage_linear
,
948 .map_voltage
= regulator_map_voltage_linear
,
949 .enable
= regulator_enable_regmap
,
950 .disable
= regulator_disable_regmap
,
951 .is_enabled
= regulator_is_enabled_regmap
,
952 .get_mode
= wm8350_dcdc_get_mode
,
953 .set_mode
= wm8350_dcdc_set_mode
,
954 .get_optimum_mode
= wm8350_dcdc_get_optimum_mode
,
955 .set_suspend_voltage
= wm8350_dcdc_set_suspend_voltage
,
956 .set_suspend_enable
= wm8350_dcdc_set_suspend_enable
,
957 .set_suspend_disable
= wm8350_dcdc_set_suspend_disable
,
958 .set_suspend_mode
= wm8350_dcdc_set_suspend_mode
,
961 static const struct regulator_ops wm8350_dcdc2_5_ops
= {
962 .enable
= regulator_enable_regmap
,
963 .disable
= regulator_disable_regmap
,
964 .is_enabled
= regulator_is_enabled_regmap
,
965 .set_suspend_enable
= wm8350_dcdc25_set_suspend_enable
,
966 .set_suspend_disable
= wm8350_dcdc25_set_suspend_disable
,
969 static const struct regulator_ops wm8350_ldo_ops
= {
970 .map_voltage
= regulator_map_voltage_linear_range
,
971 .set_voltage_sel
= regulator_set_voltage_sel_regmap
,
972 .get_voltage_sel
= regulator_get_voltage_sel_regmap
,
973 .list_voltage
= regulator_list_voltage_linear_range
,
974 .enable
= regulator_enable_regmap
,
975 .disable
= regulator_disable_regmap
,
976 .is_enabled
= regulator_is_enabled_regmap
,
977 .get_mode
= wm8350_ldo_get_mode
,
978 .set_suspend_voltage
= wm8350_ldo_set_suspend_voltage
,
979 .set_suspend_enable
= wm8350_ldo_set_suspend_enable
,
980 .set_suspend_disable
= wm8350_ldo_set_suspend_disable
,
983 static const struct regulator_ops wm8350_isink_ops
= {
984 .set_current_limit
= wm8350_isink_set_current
,
985 .get_current_limit
= wm8350_isink_get_current
,
986 .enable
= wm8350_isink_enable
,
987 .disable
= wm8350_isink_disable
,
988 .is_enabled
= wm8350_isink_is_enabled
,
989 .enable_time
= wm8350_isink_enable_time
,
992 static const struct regulator_desc wm8350_reg
[NUM_WM8350_REGULATORS
] = {
996 .ops
= &wm8350_dcdc_ops
,
997 .irq
= WM8350_IRQ_UV_DC1
,
998 .type
= REGULATOR_VOLTAGE
,
999 .n_voltages
= WM8350_DCDC_MAX_VSEL
+ 1,
1002 .vsel_reg
= WM8350_DCDC1_CONTROL
,
1003 .vsel_mask
= WM8350_DC1_VSEL_MASK
,
1004 .enable_reg
= WM8350_DCDC_LDO_REQUESTED
,
1005 .enable_mask
= WM8350_DC1_ENA
,
1006 .owner
= THIS_MODULE
,
1010 .id
= WM8350_DCDC_2
,
1011 .ops
= &wm8350_dcdc2_5_ops
,
1012 .irq
= WM8350_IRQ_UV_DC2
,
1013 .type
= REGULATOR_VOLTAGE
,
1014 .enable_reg
= WM8350_DCDC_LDO_REQUESTED
,
1015 .enable_mask
= WM8350_DC2_ENA
,
1016 .owner
= THIS_MODULE
,
1020 .id
= WM8350_DCDC_3
,
1021 .ops
= &wm8350_dcdc_ops
,
1022 .irq
= WM8350_IRQ_UV_DC3
,
1023 .type
= REGULATOR_VOLTAGE
,
1024 .n_voltages
= WM8350_DCDC_MAX_VSEL
+ 1,
1027 .vsel_reg
= WM8350_DCDC3_CONTROL
,
1028 .vsel_mask
= WM8350_DC3_VSEL_MASK
,
1029 .enable_reg
= WM8350_DCDC_LDO_REQUESTED
,
1030 .enable_mask
= WM8350_DC3_ENA
,
1031 .owner
= THIS_MODULE
,
1035 .id
= WM8350_DCDC_4
,
1036 .ops
= &wm8350_dcdc_ops
,
1037 .irq
= WM8350_IRQ_UV_DC4
,
1038 .type
= REGULATOR_VOLTAGE
,
1039 .n_voltages
= WM8350_DCDC_MAX_VSEL
+ 1,
1042 .vsel_reg
= WM8350_DCDC4_CONTROL
,
1043 .vsel_mask
= WM8350_DC4_VSEL_MASK
,
1044 .enable_reg
= WM8350_DCDC_LDO_REQUESTED
,
1045 .enable_mask
= WM8350_DC4_ENA
,
1046 .owner
= THIS_MODULE
,
1050 .id
= WM8350_DCDC_5
,
1051 .ops
= &wm8350_dcdc2_5_ops
,
1052 .irq
= WM8350_IRQ_UV_DC5
,
1053 .type
= REGULATOR_VOLTAGE
,
1054 .enable_reg
= WM8350_DCDC_LDO_REQUESTED
,
1055 .enable_mask
= WM8350_DC5_ENA
,
1056 .owner
= THIS_MODULE
,
1060 .id
= WM8350_DCDC_6
,
1061 .ops
= &wm8350_dcdc_ops
,
1062 .irq
= WM8350_IRQ_UV_DC6
,
1063 .type
= REGULATOR_VOLTAGE
,
1064 .n_voltages
= WM8350_DCDC_MAX_VSEL
+ 1,
1067 .vsel_reg
= WM8350_DCDC6_CONTROL
,
1068 .vsel_mask
= WM8350_DC6_VSEL_MASK
,
1069 .enable_reg
= WM8350_DCDC_LDO_REQUESTED
,
1070 .enable_mask
= WM8350_DC6_ENA
,
1071 .owner
= THIS_MODULE
,
1076 .ops
= &wm8350_ldo_ops
,
1077 .irq
= WM8350_IRQ_UV_LDO1
,
1078 .type
= REGULATOR_VOLTAGE
,
1079 .n_voltages
= WM8350_LDO1_VSEL_MASK
+ 1,
1080 .linear_ranges
= wm8350_ldo_ranges
,
1081 .n_linear_ranges
= ARRAY_SIZE(wm8350_ldo_ranges
),
1082 .vsel_reg
= WM8350_LDO1_CONTROL
,
1083 .vsel_mask
= WM8350_LDO1_VSEL_MASK
,
1084 .enable_reg
= WM8350_DCDC_LDO_REQUESTED
,
1085 .enable_mask
= WM8350_LDO1_ENA
,
1086 .owner
= THIS_MODULE
,
1091 .ops
= &wm8350_ldo_ops
,
1092 .irq
= WM8350_IRQ_UV_LDO2
,
1093 .type
= REGULATOR_VOLTAGE
,
1094 .n_voltages
= WM8350_LDO2_VSEL_MASK
+ 1,
1095 .linear_ranges
= wm8350_ldo_ranges
,
1096 .n_linear_ranges
= ARRAY_SIZE(wm8350_ldo_ranges
),
1097 .vsel_reg
= WM8350_LDO2_CONTROL
,
1098 .vsel_mask
= WM8350_LDO2_VSEL_MASK
,
1099 .enable_reg
= WM8350_DCDC_LDO_REQUESTED
,
1100 .enable_mask
= WM8350_LDO2_ENA
,
1101 .owner
= THIS_MODULE
,
1106 .ops
= &wm8350_ldo_ops
,
1107 .irq
= WM8350_IRQ_UV_LDO3
,
1108 .type
= REGULATOR_VOLTAGE
,
1109 .n_voltages
= WM8350_LDO3_VSEL_MASK
+ 1,
1110 .linear_ranges
= wm8350_ldo_ranges
,
1111 .n_linear_ranges
= ARRAY_SIZE(wm8350_ldo_ranges
),
1112 .vsel_reg
= WM8350_LDO3_CONTROL
,
1113 .vsel_mask
= WM8350_LDO3_VSEL_MASK
,
1114 .enable_reg
= WM8350_DCDC_LDO_REQUESTED
,
1115 .enable_mask
= WM8350_LDO3_ENA
,
1116 .owner
= THIS_MODULE
,
1121 .ops
= &wm8350_ldo_ops
,
1122 .irq
= WM8350_IRQ_UV_LDO4
,
1123 .type
= REGULATOR_VOLTAGE
,
1124 .n_voltages
= WM8350_LDO4_VSEL_MASK
+ 1,
1125 .linear_ranges
= wm8350_ldo_ranges
,
1126 .n_linear_ranges
= ARRAY_SIZE(wm8350_ldo_ranges
),
1127 .vsel_reg
= WM8350_LDO4_CONTROL
,
1128 .vsel_mask
= WM8350_LDO4_VSEL_MASK
,
1129 .enable_reg
= WM8350_DCDC_LDO_REQUESTED
,
1130 .enable_mask
= WM8350_LDO4_ENA
,
1131 .owner
= THIS_MODULE
,
1135 .id
= WM8350_ISINK_A
,
1136 .ops
= &wm8350_isink_ops
,
1137 .irq
= WM8350_IRQ_CS1
,
1138 .type
= REGULATOR_CURRENT
,
1139 .owner
= THIS_MODULE
,
1143 .id
= WM8350_ISINK_B
,
1144 .ops
= &wm8350_isink_ops
,
1145 .irq
= WM8350_IRQ_CS2
,
1146 .type
= REGULATOR_CURRENT
,
1147 .owner
= THIS_MODULE
,
1151 static irqreturn_t
pmic_uv_handler(int irq
, void *data
)
1153 struct regulator_dev
*rdev
= (struct regulator_dev
*)data
;
1155 mutex_lock(&rdev
->mutex
);
1156 if (irq
== WM8350_IRQ_CS1
|| irq
== WM8350_IRQ_CS2
)
1157 regulator_notifier_call_chain(rdev
,
1158 REGULATOR_EVENT_REGULATION_OUT
,
1161 regulator_notifier_call_chain(rdev
,
1162 REGULATOR_EVENT_UNDER_VOLTAGE
,
1164 mutex_unlock(&rdev
->mutex
);
1169 static int wm8350_regulator_probe(struct platform_device
*pdev
)
1171 struct wm8350
*wm8350
= dev_get_drvdata(&pdev
->dev
);
1172 struct regulator_config config
= { };
1173 struct regulator_dev
*rdev
;
1177 if (pdev
->id
< WM8350_DCDC_1
|| pdev
->id
> WM8350_ISINK_B
)
1180 /* do any regulatior specific init */
1183 val
= wm8350_reg_read(wm8350
, WM8350_DCDC1_LOW_POWER
);
1184 wm8350
->pmic
.dcdc1_hib_mode
= val
& WM8350_DCDC_HIB_MODE_MASK
;
1187 val
= wm8350_reg_read(wm8350
, WM8350_DCDC3_LOW_POWER
);
1188 wm8350
->pmic
.dcdc3_hib_mode
= val
& WM8350_DCDC_HIB_MODE_MASK
;
1191 val
= wm8350_reg_read(wm8350
, WM8350_DCDC4_LOW_POWER
);
1192 wm8350
->pmic
.dcdc4_hib_mode
= val
& WM8350_DCDC_HIB_MODE_MASK
;
1195 val
= wm8350_reg_read(wm8350
, WM8350_DCDC6_LOW_POWER
);
1196 wm8350
->pmic
.dcdc6_hib_mode
= val
& WM8350_DCDC_HIB_MODE_MASK
;
1200 config
.dev
= &pdev
->dev
;
1201 config
.init_data
= dev_get_platdata(&pdev
->dev
);
1202 config
.driver_data
= dev_get_drvdata(&pdev
->dev
);
1203 config
.regmap
= wm8350
->regmap
;
1205 /* register regulator */
1206 rdev
= devm_regulator_register(&pdev
->dev
, &wm8350_reg
[pdev
->id
],
1209 dev_err(&pdev
->dev
, "failed to register %s\n",
1210 wm8350_reg
[pdev
->id
].name
);
1211 return PTR_ERR(rdev
);
1214 /* register regulator IRQ */
1215 ret
= wm8350_register_irq(wm8350
, wm8350_reg
[pdev
->id
].irq
,
1216 pmic_uv_handler
, 0, "UV", rdev
);
1218 dev_err(&pdev
->dev
, "failed to register regulator %s IRQ\n",
1219 wm8350_reg
[pdev
->id
].name
);
1226 static int wm8350_regulator_remove(struct platform_device
*pdev
)
1228 struct regulator_dev
*rdev
= platform_get_drvdata(pdev
);
1229 struct wm8350
*wm8350
= rdev_get_drvdata(rdev
);
1231 wm8350_free_irq(wm8350
, wm8350_reg
[pdev
->id
].irq
, rdev
);
1236 int wm8350_register_regulator(struct wm8350
*wm8350
, int reg
,
1237 struct regulator_init_data
*initdata
)
1239 struct platform_device
*pdev
;
1241 if (reg
< 0 || reg
>= NUM_WM8350_REGULATORS
)
1244 if (wm8350
->pmic
.pdev
[reg
])
1247 if (reg
>= WM8350_DCDC_1
&& reg
<= WM8350_DCDC_6
&&
1248 reg
> wm8350
->pmic
.max_dcdc
)
1250 if (reg
>= WM8350_ISINK_A
&& reg
<= WM8350_ISINK_B
&&
1251 reg
> wm8350
->pmic
.max_isink
)
1254 pdev
= platform_device_alloc("wm8350-regulator", reg
);
1258 wm8350
->pmic
.pdev
[reg
] = pdev
;
1260 initdata
->driver_data
= wm8350
;
1262 pdev
->dev
.platform_data
= initdata
;
1263 pdev
->dev
.parent
= wm8350
->dev
;
1264 platform_set_drvdata(pdev
, wm8350
);
1266 ret
= platform_device_add(pdev
);
1269 dev_err(wm8350
->dev
, "Failed to register regulator %d: %d\n",
1271 platform_device_put(pdev
);
1272 wm8350
->pmic
.pdev
[reg
] = NULL
;
1277 EXPORT_SYMBOL_GPL(wm8350_register_regulator
);
1280 * wm8350_register_led - Register a WM8350 LED output
1282 * @param wm8350 The WM8350 device to configure.
1283 * @param lednum LED device index to create.
1284 * @param dcdc The DCDC to use for the LED.
1285 * @param isink The ISINK to use for the LED.
1286 * @param pdata Configuration for the LED.
1288 * The WM8350 supports the use of an ISINK together with a DCDC to
1289 * provide a power-efficient LED driver. This function registers the
1290 * regulators and instantiates the platform device for a LED. The
1291 * operating modes for the LED regulators must be configured using
1292 * wm8350_isink_set_flash(), wm8350_dcdc25_set_mode() and
1293 * wm8350_dcdc_set_slot() prior to calling this function.
1295 int wm8350_register_led(struct wm8350
*wm8350
, int lednum
, int dcdc
, int isink
,
1296 struct wm8350_led_platform_data
*pdata
)
1298 struct wm8350_led
*led
;
1299 struct platform_device
*pdev
;
1302 if (lednum
>= ARRAY_SIZE(wm8350
->pmic
.led
) || lednum
< 0) {
1303 dev_err(wm8350
->dev
, "Invalid LED index %d\n", lednum
);
1307 led
= &wm8350
->pmic
.led
[lednum
];
1310 dev_err(wm8350
->dev
, "LED %d already allocated\n", lednum
);
1314 pdev
= platform_device_alloc("wm8350-led", lednum
);
1316 dev_err(wm8350
->dev
, "Failed to allocate LED %d\n", lednum
);
1320 led
->isink_consumer
.dev_name
= dev_name(&pdev
->dev
);
1321 led
->isink_consumer
.supply
= "led_isink";
1322 led
->isink_init
.num_consumer_supplies
= 1;
1323 led
->isink_init
.consumer_supplies
= &led
->isink_consumer
;
1324 led
->isink_init
.constraints
.min_uA
= 0;
1325 led
->isink_init
.constraints
.max_uA
= pdata
->max_uA
;
1326 led
->isink_init
.constraints
.valid_ops_mask
1327 = REGULATOR_CHANGE_CURRENT
| REGULATOR_CHANGE_STATUS
;
1328 led
->isink_init
.constraints
.valid_modes_mask
= REGULATOR_MODE_NORMAL
;
1329 ret
= wm8350_register_regulator(wm8350
, isink
, &led
->isink_init
);
1331 platform_device_put(pdev
);
1335 led
->dcdc_consumer
.dev_name
= dev_name(&pdev
->dev
);
1336 led
->dcdc_consumer
.supply
= "led_vcc";
1337 led
->dcdc_init
.num_consumer_supplies
= 1;
1338 led
->dcdc_init
.consumer_supplies
= &led
->dcdc_consumer
;
1339 led
->dcdc_init
.constraints
.valid_modes_mask
= REGULATOR_MODE_NORMAL
;
1340 led
->dcdc_init
.constraints
.valid_ops_mask
= REGULATOR_CHANGE_STATUS
;
1341 ret
= wm8350_register_regulator(wm8350
, dcdc
, &led
->dcdc_init
);
1343 platform_device_put(pdev
);
1348 case WM8350_ISINK_A
:
1349 wm8350
->pmic
.isink_A_dcdc
= dcdc
;
1351 case WM8350_ISINK_B
:
1352 wm8350
->pmic
.isink_B_dcdc
= dcdc
;
1356 pdev
->dev
.platform_data
= pdata
;
1357 pdev
->dev
.parent
= wm8350
->dev
;
1358 ret
= platform_device_add(pdev
);
1360 dev_err(wm8350
->dev
, "Failed to register LED %d: %d\n",
1362 platform_device_put(pdev
);
1370 EXPORT_SYMBOL_GPL(wm8350_register_led
);
1372 static struct platform_driver wm8350_regulator_driver
= {
1373 .probe
= wm8350_regulator_probe
,
1374 .remove
= wm8350_regulator_remove
,
1376 .name
= "wm8350-regulator",
1380 static int __init
wm8350_regulator_init(void)
1382 return platform_driver_register(&wm8350_regulator_driver
);
1384 subsys_initcall(wm8350_regulator_init
);
1386 static void __exit
wm8350_regulator_exit(void)
1388 platform_driver_unregister(&wm8350_regulator_driver
);
1390 module_exit(wm8350_regulator_exit
);
1392 /* Module information */
1393 MODULE_AUTHOR("Liam Girdwood");
1394 MODULE_DESCRIPTION("WM8350 voltage and current regulator driver");
1395 MODULE_LICENSE("GPL");
1396 MODULE_ALIAS("platform:wm8350-regulator");