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 = ARRAY_SIZE(isink_cur) - 1; i >= 0; i--) {
103 if (min_uA <= isink_cur[i] && max_uA >= isink_cur[i]) {
111 static inline int wm8350_ldo_val_to_mvolts(unsigned int val)
114 return (val * 50) + 900;
116 return ((val - 16) * 100) + 1800;
120 static inline unsigned int wm8350_ldo_mvolts_to_val(int mV)
123 return (mV - 900) / 50;
125 return ((mV - 1800) / 100) + 16;
128 static inline int wm8350_dcdc_val_to_mvolts(unsigned int val)
130 return (val * 25) + 850;
133 static inline unsigned int wm8350_dcdc_mvolts_to_val(int mV)
135 return (mV - 850) / 25;
138 static int wm8350_isink_set_current(struct regulator_dev *rdev, int min_uA,
141 struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
142 int isink = rdev_get_id(rdev);
146 ret = get_isink_val(min_uA, max_uA, &setting);
152 val = wm8350_reg_read(wm8350, WM8350_CURRENT_SINK_DRIVER_A) &
153 ~WM8350_CS1_ISEL_MASK;
154 wm8350_reg_write(wm8350, WM8350_CURRENT_SINK_DRIVER_A,
158 val = wm8350_reg_read(wm8350, WM8350_CURRENT_SINK_DRIVER_B) &
159 ~WM8350_CS1_ISEL_MASK;
160 wm8350_reg_write(wm8350, WM8350_CURRENT_SINK_DRIVER_B,
170 static int wm8350_isink_get_current(struct regulator_dev *rdev)
172 struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
173 int isink = rdev_get_id(rdev);
178 val = wm8350_reg_read(wm8350, WM8350_CURRENT_SINK_DRIVER_A) &
179 WM8350_CS1_ISEL_MASK;
182 val = wm8350_reg_read(wm8350, WM8350_CURRENT_SINK_DRIVER_B) &
183 WM8350_CS1_ISEL_MASK;
189 return (isink_cur[val] + 50) / 100;
192 /* turn on ISINK followed by DCDC */
193 static int wm8350_isink_enable(struct regulator_dev *rdev)
195 struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
196 int isink = rdev_get_id(rdev);
200 switch (wm8350->pmic.isink_A_dcdc) {
203 wm8350_set_bits(wm8350, WM8350_POWER_MGMT_7,
205 wm8350_set_bits(wm8350, WM8350_CSA_FLASH_CONTROL,
207 wm8350_set_bits(wm8350, WM8350_DCDC_LDO_REQUESTED,
208 1 << (wm8350->pmic.isink_A_dcdc -
216 switch (wm8350->pmic.isink_B_dcdc) {
219 wm8350_set_bits(wm8350, WM8350_POWER_MGMT_7,
221 wm8350_set_bits(wm8350, WM8350_CSB_FLASH_CONTROL,
223 wm8350_set_bits(wm8350, WM8350_DCDC_LDO_REQUESTED,
224 1 << (wm8350->pmic.isink_B_dcdc -
237 static int wm8350_isink_disable(struct regulator_dev *rdev)
239 struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
240 int isink = rdev_get_id(rdev);
244 switch (wm8350->pmic.isink_A_dcdc) {
247 wm8350_clear_bits(wm8350, WM8350_DCDC_LDO_REQUESTED,
248 1 << (wm8350->pmic.isink_A_dcdc -
250 wm8350_clear_bits(wm8350, WM8350_POWER_MGMT_7,
258 switch (wm8350->pmic.isink_B_dcdc) {
261 wm8350_clear_bits(wm8350, WM8350_DCDC_LDO_REQUESTED,
262 1 << (wm8350->pmic.isink_B_dcdc -
264 wm8350_clear_bits(wm8350, WM8350_POWER_MGMT_7,
277 static int wm8350_isink_is_enabled(struct regulator_dev *rdev)
279 struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
280 int isink = rdev_get_id(rdev);
284 return wm8350_reg_read(wm8350, WM8350_CURRENT_SINK_DRIVER_A) &
287 return wm8350_reg_read(wm8350, WM8350_CURRENT_SINK_DRIVER_B) &
293 static int wm8350_isink_enable_time(struct regulator_dev *rdev)
295 struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
296 int isink = rdev_get_id(rdev);
301 reg = wm8350_reg_read(wm8350, WM8350_CSA_FLASH_CONTROL);
304 reg = wm8350_reg_read(wm8350, WM8350_CSB_FLASH_CONTROL);
310 if (reg & WM8350_CS1_FLASH_MODE) {
311 switch (reg & WM8350_CS1_ON_RAMP_MASK) {
322 switch (reg & WM8350_CS1_ON_RAMP_MASK) {
338 int wm8350_isink_set_flash(struct wm8350 *wm8350, int isink, u16 mode,
339 u16 trigger, u16 duration, u16 on_ramp, u16 off_ramp,
344 wm8350_reg_write(wm8350, WM8350_CSA_FLASH_CONTROL,
345 (mode ? WM8350_CS1_FLASH_MODE : 0) |
346 (trigger ? WM8350_CS1_TRIGSRC : 0) |
347 duration | on_ramp | off_ramp | drive);
350 wm8350_reg_write(wm8350, WM8350_CSB_FLASH_CONTROL,
351 (mode ? WM8350_CS2_FLASH_MODE : 0) |
352 (trigger ? WM8350_CS2_TRIGSRC : 0) |
353 duration | on_ramp | off_ramp | drive);
360 EXPORT_SYMBOL_GPL(wm8350_isink_set_flash);
362 static int wm8350_dcdc_set_voltage(struct regulator_dev *rdev, int min_uV,
363 int max_uV, unsigned *selector)
365 struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
366 int volt_reg, dcdc = rdev_get_id(rdev), mV,
367 min_mV = min_uV / 1000, max_mV = max_uV / 1000;
370 if (min_mV < 850 || min_mV > 4025)
372 if (max_mV < 850 || max_mV > 4025)
375 /* step size is 25mV */
376 mV = (min_mV - 826) / 25;
377 if (wm8350_dcdc_val_to_mvolts(mV) > max_mV)
379 BUG_ON(wm8350_dcdc_val_to_mvolts(mV) < min_mV);
383 volt_reg = WM8350_DCDC1_CONTROL;
386 volt_reg = WM8350_DCDC3_CONTROL;
389 volt_reg = WM8350_DCDC4_CONTROL;
392 volt_reg = WM8350_DCDC6_CONTROL;
402 /* all DCDCs have same mV bits */
403 val = wm8350_reg_read(wm8350, volt_reg) & ~WM8350_DC1_VSEL_MASK;
404 wm8350_reg_write(wm8350, volt_reg, val | mV);
408 static int wm8350_dcdc_get_voltage(struct regulator_dev *rdev)
410 struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
411 int volt_reg, dcdc = rdev_get_id(rdev);
416 volt_reg = WM8350_DCDC1_CONTROL;
419 volt_reg = WM8350_DCDC3_CONTROL;
422 volt_reg = WM8350_DCDC4_CONTROL;
425 volt_reg = WM8350_DCDC6_CONTROL;
433 /* all DCDCs have same mV bits */
434 val = wm8350_reg_read(wm8350, volt_reg) & WM8350_DC1_VSEL_MASK;
435 return wm8350_dcdc_val_to_mvolts(val) * 1000;
438 static int wm8350_dcdc_list_voltage(struct regulator_dev *rdev,
441 if (selector > WM8350_DCDC_MAX_VSEL)
443 return wm8350_dcdc_val_to_mvolts(selector) * 1000;
446 static int wm8350_dcdc_set_suspend_voltage(struct regulator_dev *rdev, int uV)
448 struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
449 int volt_reg, mV = uV / 1000, dcdc = rdev_get_id(rdev);
452 dev_dbg(wm8350->dev, "%s %d mV %d\n", __func__, dcdc, mV);
454 if (mV && (mV < 850 || mV > 4025)) {
456 "DCDC%d suspend voltage %d mV out of range\n",
465 volt_reg = WM8350_DCDC1_LOW_POWER;
468 volt_reg = WM8350_DCDC3_LOW_POWER;
471 volt_reg = WM8350_DCDC4_LOW_POWER;
474 volt_reg = WM8350_DCDC6_LOW_POWER;
482 /* all DCDCs have same mV bits */
483 val = wm8350_reg_read(wm8350, volt_reg) & ~WM8350_DC1_VSEL_MASK;
484 wm8350_reg_write(wm8350, volt_reg,
485 val | wm8350_dcdc_mvolts_to_val(mV));
489 static int wm8350_dcdc_set_suspend_enable(struct regulator_dev *rdev)
491 struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
492 int dcdc = rdev_get_id(rdev);
497 val = wm8350_reg_read(wm8350, WM8350_DCDC1_LOW_POWER)
498 & ~WM8350_DCDC_HIB_MODE_MASK;
499 wm8350_reg_write(wm8350, WM8350_DCDC1_LOW_POWER,
500 wm8350->pmic.dcdc1_hib_mode);
503 val = wm8350_reg_read(wm8350, WM8350_DCDC3_LOW_POWER)
504 & ~WM8350_DCDC_HIB_MODE_MASK;
505 wm8350_reg_write(wm8350, WM8350_DCDC3_LOW_POWER,
506 wm8350->pmic.dcdc3_hib_mode);
509 val = wm8350_reg_read(wm8350, WM8350_DCDC4_LOW_POWER)
510 & ~WM8350_DCDC_HIB_MODE_MASK;
511 wm8350_reg_write(wm8350, WM8350_DCDC4_LOW_POWER,
512 wm8350->pmic.dcdc4_hib_mode);
515 val = wm8350_reg_read(wm8350, WM8350_DCDC6_LOW_POWER)
516 & ~WM8350_DCDC_HIB_MODE_MASK;
517 wm8350_reg_write(wm8350, WM8350_DCDC6_LOW_POWER,
518 wm8350->pmic.dcdc6_hib_mode);
529 static int wm8350_dcdc_set_suspend_disable(struct regulator_dev *rdev)
531 struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
532 int dcdc = rdev_get_id(rdev);
537 val = wm8350_reg_read(wm8350, WM8350_DCDC1_LOW_POWER);
538 wm8350->pmic.dcdc1_hib_mode = val & WM8350_DCDC_HIB_MODE_MASK;
539 wm8350_reg_write(wm8350, WM8350_DCDC1_LOW_POWER,
540 WM8350_DCDC_HIB_MODE_DIS);
543 val = wm8350_reg_read(wm8350, WM8350_DCDC3_LOW_POWER);
544 wm8350->pmic.dcdc3_hib_mode = val & WM8350_DCDC_HIB_MODE_MASK;
545 wm8350_reg_write(wm8350, WM8350_DCDC3_LOW_POWER,
546 WM8350_DCDC_HIB_MODE_DIS);
549 val = wm8350_reg_read(wm8350, WM8350_DCDC4_LOW_POWER);
550 wm8350->pmic.dcdc4_hib_mode = val & WM8350_DCDC_HIB_MODE_MASK;
551 wm8350_reg_write(wm8350, WM8350_DCDC4_LOW_POWER,
552 WM8350_DCDC_HIB_MODE_DIS);
555 val = wm8350_reg_read(wm8350, WM8350_DCDC6_LOW_POWER);
556 wm8350->pmic.dcdc6_hib_mode = val & WM8350_DCDC_HIB_MODE_MASK;
557 wm8350_reg_write(wm8350, WM8350_DCDC6_LOW_POWER,
558 WM8350_DCDC_HIB_MODE_DIS);
569 static int wm8350_dcdc25_set_suspend_enable(struct regulator_dev *rdev)
571 struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
572 int dcdc = rdev_get_id(rdev);
577 val = wm8350_reg_read(wm8350, WM8350_DCDC2_CONTROL)
578 & ~WM8350_DC2_HIB_MODE_MASK;
579 wm8350_reg_write(wm8350, WM8350_DCDC2_CONTROL, val |
580 WM8350_DC2_HIB_MODE_ACTIVE);
583 val = wm8350_reg_read(wm8350, WM8350_DCDC5_CONTROL)
584 & ~WM8350_DC2_HIB_MODE_MASK;
585 wm8350_reg_write(wm8350, WM8350_DCDC5_CONTROL, val |
586 WM8350_DC5_HIB_MODE_ACTIVE);
594 static int wm8350_dcdc25_set_suspend_disable(struct regulator_dev *rdev)
596 struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
597 int dcdc = rdev_get_id(rdev);
602 val = wm8350_reg_read(wm8350, WM8350_DCDC2_CONTROL)
603 & ~WM8350_DC2_HIB_MODE_MASK;
604 wm8350_reg_write(wm8350, WM8350_DCDC2_CONTROL, val |
605 WM8350_DC2_HIB_MODE_DISABLE);
608 val = wm8350_reg_read(wm8350, WM8350_DCDC5_CONTROL)
609 & ~WM8350_DC2_HIB_MODE_MASK;
610 wm8350_reg_write(wm8350, WM8350_DCDC5_CONTROL, val |
611 WM8350_DC2_HIB_MODE_DISABLE);
619 static int wm8350_dcdc_set_suspend_mode(struct regulator_dev *rdev,
622 struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
623 int dcdc = rdev_get_id(rdev);
628 hib_mode = &wm8350->pmic.dcdc1_hib_mode;
631 hib_mode = &wm8350->pmic.dcdc3_hib_mode;
634 hib_mode = &wm8350->pmic.dcdc4_hib_mode;
637 hib_mode = &wm8350->pmic.dcdc6_hib_mode;
646 case REGULATOR_MODE_NORMAL:
647 *hib_mode = WM8350_DCDC_HIB_MODE_IMAGE;
649 case REGULATOR_MODE_IDLE:
650 *hib_mode = WM8350_DCDC_HIB_MODE_STANDBY;
652 case REGULATOR_MODE_STANDBY:
653 *hib_mode = WM8350_DCDC_HIB_MODE_LDO_IM;
662 static int wm8350_ldo_set_suspend_voltage(struct regulator_dev *rdev, int uV)
664 struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
665 int volt_reg, mV = uV / 1000, ldo = rdev_get_id(rdev);
668 dev_dbg(wm8350->dev, "%s %d mV %d\n", __func__, ldo, mV);
670 if (mV < 900 || mV > 3300) {
671 dev_err(wm8350->dev, "LDO%d voltage %d mV out of range\n",
678 volt_reg = WM8350_LDO1_LOW_POWER;
681 volt_reg = WM8350_LDO2_LOW_POWER;
684 volt_reg = WM8350_LDO3_LOW_POWER;
687 volt_reg = WM8350_LDO4_LOW_POWER;
693 /* all LDOs have same mV bits */
694 val = wm8350_reg_read(wm8350, volt_reg) & ~WM8350_LDO1_VSEL_MASK;
695 wm8350_reg_write(wm8350, volt_reg,
696 val | wm8350_ldo_mvolts_to_val(mV));
700 static int wm8350_ldo_set_suspend_enable(struct regulator_dev *rdev)
702 struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
703 int volt_reg, ldo = rdev_get_id(rdev);
708 volt_reg = WM8350_LDO1_LOW_POWER;
711 volt_reg = WM8350_LDO2_LOW_POWER;
714 volt_reg = WM8350_LDO3_LOW_POWER;
717 volt_reg = WM8350_LDO4_LOW_POWER;
723 /* all LDOs have same mV bits */
724 val = wm8350_reg_read(wm8350, volt_reg) & ~WM8350_LDO1_HIB_MODE_MASK;
725 wm8350_reg_write(wm8350, volt_reg, val);
729 static int wm8350_ldo_set_suspend_disable(struct regulator_dev *rdev)
731 struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
732 int volt_reg, ldo = rdev_get_id(rdev);
737 volt_reg = WM8350_LDO1_LOW_POWER;
740 volt_reg = WM8350_LDO2_LOW_POWER;
743 volt_reg = WM8350_LDO3_LOW_POWER;
746 volt_reg = WM8350_LDO4_LOW_POWER;
752 /* all LDOs have same mV bits */
753 val = wm8350_reg_read(wm8350, volt_reg) & ~WM8350_LDO1_HIB_MODE_MASK;
754 wm8350_reg_write(wm8350, volt_reg, WM8350_LDO1_HIB_MODE_DIS);
758 static int wm8350_ldo_set_voltage(struct regulator_dev *rdev, int min_uV,
759 int max_uV, unsigned *selector)
761 struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
762 int volt_reg, ldo = rdev_get_id(rdev), mV, min_mV = min_uV / 1000,
763 max_mV = max_uV / 1000;
766 if (min_mV < 900 || min_mV > 3300)
768 if (max_mV < 900 || max_mV > 3300)
772 /* step size is 50mV < 1800mV */
773 mV = (min_mV - 851) / 50;
774 if (wm8350_ldo_val_to_mvolts(mV) > max_mV)
776 BUG_ON(wm8350_ldo_val_to_mvolts(mV) < min_mV);
778 /* step size is 100mV > 1800mV */
779 mV = ((min_mV - 1701) / 100) + 16;
780 if (wm8350_ldo_val_to_mvolts(mV) > max_mV)
782 BUG_ON(wm8350_ldo_val_to_mvolts(mV) < min_mV);
787 volt_reg = WM8350_LDO1_CONTROL;
790 volt_reg = WM8350_LDO2_CONTROL;
793 volt_reg = WM8350_LDO3_CONTROL;
796 volt_reg = WM8350_LDO4_CONTROL;
804 /* all LDOs have same mV bits */
805 val = wm8350_reg_read(wm8350, volt_reg) & ~WM8350_LDO1_VSEL_MASK;
806 wm8350_reg_write(wm8350, volt_reg, val | mV);
810 static int wm8350_ldo_get_voltage(struct regulator_dev *rdev)
812 struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
813 int volt_reg, ldo = rdev_get_id(rdev);
818 volt_reg = WM8350_LDO1_CONTROL;
821 volt_reg = WM8350_LDO2_CONTROL;
824 volt_reg = WM8350_LDO3_CONTROL;
827 volt_reg = WM8350_LDO4_CONTROL;
833 /* all LDOs have same mV bits */
834 val = wm8350_reg_read(wm8350, volt_reg) & WM8350_LDO1_VSEL_MASK;
835 return wm8350_ldo_val_to_mvolts(val) * 1000;
838 static int wm8350_ldo_list_voltage(struct regulator_dev *rdev,
841 if (selector > WM8350_LDO1_VSEL_MASK)
843 return wm8350_ldo_val_to_mvolts(selector) * 1000;
846 int wm8350_dcdc_set_slot(struct wm8350 *wm8350, int dcdc, u16 start,
852 dev_dbg(wm8350->dev, "%s %d start %d stop %d\n",
853 __func__, dcdc, start, stop);
856 if (start > 15 || stop > 15)
861 slot_reg = WM8350_DCDC1_TIMEOUTS;
864 slot_reg = WM8350_DCDC2_TIMEOUTS;
867 slot_reg = WM8350_DCDC3_TIMEOUTS;
870 slot_reg = WM8350_DCDC4_TIMEOUTS;
873 slot_reg = WM8350_DCDC5_TIMEOUTS;
876 slot_reg = WM8350_DCDC6_TIMEOUTS;
882 val = wm8350_reg_read(wm8350, slot_reg) &
883 ~(WM8350_DC1_ENSLOT_MASK | WM8350_DC1_SDSLOT_MASK |
884 WM8350_DC1_ERRACT_MASK);
885 wm8350_reg_write(wm8350, slot_reg,
886 val | (start << WM8350_DC1_ENSLOT_SHIFT) |
887 (stop << WM8350_DC1_SDSLOT_SHIFT) |
888 (fault << WM8350_DC1_ERRACT_SHIFT));
892 EXPORT_SYMBOL_GPL(wm8350_dcdc_set_slot);
894 int wm8350_ldo_set_slot(struct wm8350 *wm8350, int ldo, u16 start, u16 stop)
899 dev_dbg(wm8350->dev, "%s %d start %d stop %d\n",
900 __func__, ldo, start, stop);
903 if (start > 15 || stop > 15)
908 slot_reg = WM8350_LDO1_TIMEOUTS;
911 slot_reg = WM8350_LDO2_TIMEOUTS;
914 slot_reg = WM8350_LDO3_TIMEOUTS;
917 slot_reg = WM8350_LDO4_TIMEOUTS;
923 val = wm8350_reg_read(wm8350, slot_reg) & ~WM8350_LDO1_SDSLOT_MASK;
924 wm8350_reg_write(wm8350, slot_reg, val | ((start << 10) | (stop << 6)));
927 EXPORT_SYMBOL_GPL(wm8350_ldo_set_slot);
929 int wm8350_dcdc25_set_mode(struct wm8350 *wm8350, int dcdc, u16 mode,
930 u16 ilim, u16 ramp, u16 feedback)
934 dev_dbg(wm8350->dev, "%s %d mode: %s %s\n", __func__, dcdc,
935 mode ? "normal" : "boost", ilim ? "low" : "normal");
939 val = wm8350_reg_read(wm8350, WM8350_DCDC2_CONTROL)
940 & ~(WM8350_DC2_MODE_MASK | WM8350_DC2_ILIM_MASK |
941 WM8350_DC2_RMP_MASK | WM8350_DC2_FBSRC_MASK);
942 wm8350_reg_write(wm8350, WM8350_DCDC2_CONTROL, val |
943 (mode << WM8350_DC2_MODE_SHIFT) |
944 (ilim << WM8350_DC2_ILIM_SHIFT) |
945 (ramp << WM8350_DC2_RMP_SHIFT) |
946 (feedback << WM8350_DC2_FBSRC_SHIFT));
949 val = wm8350_reg_read(wm8350, WM8350_DCDC5_CONTROL)
950 & ~(WM8350_DC5_MODE_MASK | WM8350_DC5_ILIM_MASK |
951 WM8350_DC5_RMP_MASK | WM8350_DC5_FBSRC_MASK);
952 wm8350_reg_write(wm8350, WM8350_DCDC5_CONTROL, val |
953 (mode << WM8350_DC5_MODE_SHIFT) |
954 (ilim << WM8350_DC5_ILIM_SHIFT) |
955 (ramp << WM8350_DC5_RMP_SHIFT) |
956 (feedback << WM8350_DC5_FBSRC_SHIFT));
964 EXPORT_SYMBOL_GPL(wm8350_dcdc25_set_mode);
966 static int wm8350_dcdc_enable(struct regulator_dev *rdev)
968 struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
969 int dcdc = rdev_get_id(rdev);
972 if (dcdc < WM8350_DCDC_1 || dcdc > WM8350_DCDC_6)
975 shift = dcdc - WM8350_DCDC_1;
976 wm8350_set_bits(wm8350, WM8350_DCDC_LDO_REQUESTED, 1 << shift);
980 static int wm8350_dcdc_disable(struct regulator_dev *rdev)
982 struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
983 int dcdc = rdev_get_id(rdev);
986 if (dcdc < WM8350_DCDC_1 || dcdc > WM8350_DCDC_6)
989 shift = dcdc - WM8350_DCDC_1;
990 wm8350_clear_bits(wm8350, WM8350_DCDC_LDO_REQUESTED, 1 << shift);
995 static int wm8350_ldo_enable(struct regulator_dev *rdev)
997 struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
998 int ldo = rdev_get_id(rdev);
1001 if (ldo < WM8350_LDO_1 || ldo > WM8350_LDO_4)
1004 shift = (ldo - WM8350_LDO_1) + 8;
1005 wm8350_set_bits(wm8350, WM8350_DCDC_LDO_REQUESTED, 1 << shift);
1009 static int wm8350_ldo_disable(struct regulator_dev *rdev)
1011 struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
1012 int ldo = rdev_get_id(rdev);
1015 if (ldo < WM8350_LDO_1 || ldo > WM8350_LDO_4)
1018 shift = (ldo - WM8350_LDO_1) + 8;
1019 wm8350_clear_bits(wm8350, WM8350_DCDC_LDO_REQUESTED, 1 << shift);
1023 static int force_continuous_enable(struct wm8350 *wm8350, int dcdc, int enable)
1029 reg = WM8350_DCDC1_FORCE_PWM;
1032 reg = WM8350_DCDC3_FORCE_PWM;
1035 reg = WM8350_DCDC4_FORCE_PWM;
1038 reg = WM8350_DCDC6_FORCE_PWM;
1045 ret = wm8350_set_bits(wm8350, reg,
1046 WM8350_DCDC1_FORCE_PWM_ENA);
1048 ret = wm8350_clear_bits(wm8350, reg,
1049 WM8350_DCDC1_FORCE_PWM_ENA);
1053 static int wm8350_dcdc_set_mode(struct regulator_dev *rdev, unsigned int mode)
1055 struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
1056 int dcdc = rdev_get_id(rdev);
1059 if (dcdc < WM8350_DCDC_1 || dcdc > WM8350_DCDC_6)
1062 if (dcdc == WM8350_DCDC_2 || dcdc == WM8350_DCDC_5)
1065 val = 1 << (dcdc - WM8350_DCDC_1);
1068 case REGULATOR_MODE_FAST:
1069 /* force continuous mode */
1070 wm8350_set_bits(wm8350, WM8350_DCDC_ACTIVE_OPTIONS, val);
1071 wm8350_clear_bits(wm8350, WM8350_DCDC_SLEEP_OPTIONS, val);
1072 force_continuous_enable(wm8350, dcdc, 1);
1074 case REGULATOR_MODE_NORMAL:
1075 /* active / pulse skipping */
1076 wm8350_set_bits(wm8350, WM8350_DCDC_ACTIVE_OPTIONS, val);
1077 wm8350_clear_bits(wm8350, WM8350_DCDC_SLEEP_OPTIONS, val);
1078 force_continuous_enable(wm8350, dcdc, 0);
1080 case REGULATOR_MODE_IDLE:
1082 force_continuous_enable(wm8350, dcdc, 0);
1083 wm8350_clear_bits(wm8350, WM8350_DCDC_SLEEP_OPTIONS, val);
1084 wm8350_clear_bits(wm8350, WM8350_DCDC_ACTIVE_OPTIONS, val);
1086 case REGULATOR_MODE_STANDBY:
1088 force_continuous_enable(wm8350, dcdc, 0);
1089 wm8350_set_bits(wm8350, WM8350_DCDC_SLEEP_OPTIONS, val);
1096 static unsigned int wm8350_dcdc_get_mode(struct regulator_dev *rdev)
1098 struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
1099 int dcdc = rdev_get_id(rdev);
1100 u16 mask, sleep, active, force;
1101 int mode = REGULATOR_MODE_NORMAL;
1106 reg = WM8350_DCDC1_FORCE_PWM;
1109 reg = WM8350_DCDC3_FORCE_PWM;
1112 reg = WM8350_DCDC4_FORCE_PWM;
1115 reg = WM8350_DCDC6_FORCE_PWM;
1121 mask = 1 << (dcdc - WM8350_DCDC_1);
1122 active = wm8350_reg_read(wm8350, WM8350_DCDC_ACTIVE_OPTIONS) & mask;
1123 force = wm8350_reg_read(wm8350, reg) & WM8350_DCDC1_FORCE_PWM_ENA;
1124 sleep = wm8350_reg_read(wm8350, WM8350_DCDC_SLEEP_OPTIONS) & mask;
1126 dev_dbg(wm8350->dev, "mask %x active %x sleep %x force %x",
1127 mask, active, sleep, force);
1129 if (active && !sleep) {
1131 mode = REGULATOR_MODE_FAST;
1133 mode = REGULATOR_MODE_NORMAL;
1134 } else if (!active && !sleep)
1135 mode = REGULATOR_MODE_IDLE;
1137 mode = REGULATOR_MODE_STANDBY;
1142 static unsigned int wm8350_ldo_get_mode(struct regulator_dev *rdev)
1144 return REGULATOR_MODE_NORMAL;
1147 struct wm8350_dcdc_efficiency {
1153 static const struct wm8350_dcdc_efficiency dcdc1_6_efficiency[] = {
1154 {0, 10000, REGULATOR_MODE_STANDBY}, /* 0 - 10mA - LDO */
1155 {10000, 100000, REGULATOR_MODE_IDLE}, /* 10mA - 100mA - Standby */
1156 {100000, 1000000, REGULATOR_MODE_NORMAL}, /* > 100mA - Active */
1157 {-1, -1, REGULATOR_MODE_NORMAL},
1160 static const struct wm8350_dcdc_efficiency dcdc3_4_efficiency[] = {
1161 {0, 10000, REGULATOR_MODE_STANDBY}, /* 0 - 10mA - LDO */
1162 {10000, 100000, REGULATOR_MODE_IDLE}, /* 10mA - 100mA - Standby */
1163 {100000, 800000, REGULATOR_MODE_NORMAL}, /* > 100mA - Active */
1164 {-1, -1, REGULATOR_MODE_NORMAL},
1167 static unsigned int get_mode(int uA, const struct wm8350_dcdc_efficiency *eff)
1171 while (eff[i].uA_load_min != -1) {
1172 if (uA >= eff[i].uA_load_min && uA <= eff[i].uA_load_max)
1175 return REGULATOR_MODE_NORMAL;
1178 /* Query the regulator for it's most efficient mode @ uV,uA
1179 * WM8350 regulator efficiency is pretty similar over
1180 * different input and output uV.
1182 static unsigned int wm8350_dcdc_get_optimum_mode(struct regulator_dev *rdev,
1183 int input_uV, int output_uV,
1186 int dcdc = rdev_get_id(rdev), mode;
1191 mode = get_mode(output_uA, dcdc1_6_efficiency);
1195 mode = get_mode(output_uA, dcdc3_4_efficiency);
1198 mode = REGULATOR_MODE_NORMAL;
1204 static int wm8350_dcdc_is_enabled(struct regulator_dev *rdev)
1206 struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
1207 int dcdc = rdev_get_id(rdev), shift;
1209 if (dcdc < WM8350_DCDC_1 || dcdc > WM8350_DCDC_6)
1212 shift = dcdc - WM8350_DCDC_1;
1213 return wm8350_reg_read(wm8350, WM8350_DCDC_LDO_REQUESTED)
1217 static int wm8350_ldo_is_enabled(struct regulator_dev *rdev)
1219 struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
1220 int ldo = rdev_get_id(rdev), shift;
1222 if (ldo < WM8350_LDO_1 || ldo > WM8350_LDO_4)
1225 shift = (ldo - WM8350_LDO_1) + 8;
1226 return wm8350_reg_read(wm8350, WM8350_DCDC_LDO_REQUESTED)
1230 static struct regulator_ops wm8350_dcdc_ops = {
1231 .set_voltage = wm8350_dcdc_set_voltage,
1232 .get_voltage = wm8350_dcdc_get_voltage,
1233 .list_voltage = wm8350_dcdc_list_voltage,
1234 .enable = wm8350_dcdc_enable,
1235 .disable = wm8350_dcdc_disable,
1236 .get_mode = wm8350_dcdc_get_mode,
1237 .set_mode = wm8350_dcdc_set_mode,
1238 .get_optimum_mode = wm8350_dcdc_get_optimum_mode,
1239 .is_enabled = wm8350_dcdc_is_enabled,
1240 .set_suspend_voltage = wm8350_dcdc_set_suspend_voltage,
1241 .set_suspend_enable = wm8350_dcdc_set_suspend_enable,
1242 .set_suspend_disable = wm8350_dcdc_set_suspend_disable,
1243 .set_suspend_mode = wm8350_dcdc_set_suspend_mode,
1246 static struct regulator_ops wm8350_dcdc2_5_ops = {
1247 .enable = wm8350_dcdc_enable,
1248 .disable = wm8350_dcdc_disable,
1249 .is_enabled = wm8350_dcdc_is_enabled,
1250 .set_suspend_enable = wm8350_dcdc25_set_suspend_enable,
1251 .set_suspend_disable = wm8350_dcdc25_set_suspend_disable,
1254 static struct regulator_ops wm8350_ldo_ops = {
1255 .set_voltage = wm8350_ldo_set_voltage,
1256 .get_voltage = wm8350_ldo_get_voltage,
1257 .list_voltage = wm8350_ldo_list_voltage,
1258 .enable = wm8350_ldo_enable,
1259 .disable = wm8350_ldo_disable,
1260 .is_enabled = wm8350_ldo_is_enabled,
1261 .get_mode = wm8350_ldo_get_mode,
1262 .set_suspend_voltage = wm8350_ldo_set_suspend_voltage,
1263 .set_suspend_enable = wm8350_ldo_set_suspend_enable,
1264 .set_suspend_disable = wm8350_ldo_set_suspend_disable,
1267 static struct regulator_ops wm8350_isink_ops = {
1268 .set_current_limit = wm8350_isink_set_current,
1269 .get_current_limit = wm8350_isink_get_current,
1270 .enable = wm8350_isink_enable,
1271 .disable = wm8350_isink_disable,
1272 .is_enabled = wm8350_isink_is_enabled,
1273 .enable_time = wm8350_isink_enable_time,
1276 static struct regulator_desc wm8350_reg[NUM_WM8350_REGULATORS] = {
1279 .id = WM8350_DCDC_1,
1280 .ops = &wm8350_dcdc_ops,
1281 .irq = WM8350_IRQ_UV_DC1,
1282 .type = REGULATOR_VOLTAGE,
1283 .n_voltages = WM8350_DCDC_MAX_VSEL + 1,
1284 .owner = THIS_MODULE,
1288 .id = WM8350_DCDC_2,
1289 .ops = &wm8350_dcdc2_5_ops,
1290 .irq = WM8350_IRQ_UV_DC2,
1291 .type = REGULATOR_VOLTAGE,
1292 .owner = THIS_MODULE,
1296 .id = WM8350_DCDC_3,
1297 .ops = &wm8350_dcdc_ops,
1298 .irq = WM8350_IRQ_UV_DC3,
1299 .type = REGULATOR_VOLTAGE,
1300 .n_voltages = WM8350_DCDC_MAX_VSEL + 1,
1301 .owner = THIS_MODULE,
1305 .id = WM8350_DCDC_4,
1306 .ops = &wm8350_dcdc_ops,
1307 .irq = WM8350_IRQ_UV_DC4,
1308 .type = REGULATOR_VOLTAGE,
1309 .n_voltages = WM8350_DCDC_MAX_VSEL + 1,
1310 .owner = THIS_MODULE,
1314 .id = WM8350_DCDC_5,
1315 .ops = &wm8350_dcdc2_5_ops,
1316 .irq = WM8350_IRQ_UV_DC5,
1317 .type = REGULATOR_VOLTAGE,
1318 .owner = THIS_MODULE,
1322 .id = WM8350_DCDC_6,
1323 .ops = &wm8350_dcdc_ops,
1324 .irq = WM8350_IRQ_UV_DC6,
1325 .type = REGULATOR_VOLTAGE,
1326 .n_voltages = WM8350_DCDC_MAX_VSEL + 1,
1327 .owner = THIS_MODULE,
1332 .ops = &wm8350_ldo_ops,
1333 .irq = WM8350_IRQ_UV_LDO1,
1334 .type = REGULATOR_VOLTAGE,
1335 .n_voltages = WM8350_LDO1_VSEL_MASK + 1,
1336 .owner = THIS_MODULE,
1341 .ops = &wm8350_ldo_ops,
1342 .irq = WM8350_IRQ_UV_LDO2,
1343 .type = REGULATOR_VOLTAGE,
1344 .n_voltages = WM8350_LDO2_VSEL_MASK + 1,
1345 .owner = THIS_MODULE,
1350 .ops = &wm8350_ldo_ops,
1351 .irq = WM8350_IRQ_UV_LDO3,
1352 .type = REGULATOR_VOLTAGE,
1353 .n_voltages = WM8350_LDO3_VSEL_MASK + 1,
1354 .owner = THIS_MODULE,
1359 .ops = &wm8350_ldo_ops,
1360 .irq = WM8350_IRQ_UV_LDO4,
1361 .type = REGULATOR_VOLTAGE,
1362 .n_voltages = WM8350_LDO4_VSEL_MASK + 1,
1363 .owner = THIS_MODULE,
1367 .id = WM8350_ISINK_A,
1368 .ops = &wm8350_isink_ops,
1369 .irq = WM8350_IRQ_CS1,
1370 .type = REGULATOR_CURRENT,
1371 .owner = THIS_MODULE,
1375 .id = WM8350_ISINK_B,
1376 .ops = &wm8350_isink_ops,
1377 .irq = WM8350_IRQ_CS2,
1378 .type = REGULATOR_CURRENT,
1379 .owner = THIS_MODULE,
1383 static irqreturn_t pmic_uv_handler(int irq, void *data)
1385 struct regulator_dev *rdev = (struct regulator_dev *)data;
1386 struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
1388 mutex_lock(&rdev->mutex);
1389 if (irq == WM8350_IRQ_CS1 || irq == WM8350_IRQ_CS2)
1390 regulator_notifier_call_chain(rdev,
1391 REGULATOR_EVENT_REGULATION_OUT,
1394 regulator_notifier_call_chain(rdev,
1395 REGULATOR_EVENT_UNDER_VOLTAGE,
1397 mutex_unlock(&rdev->mutex);
1402 static int wm8350_regulator_probe(struct platform_device *pdev)
1404 struct wm8350 *wm8350 = dev_get_drvdata(&pdev->dev);
1405 struct regulator_dev *rdev;
1409 if (pdev->id < WM8350_DCDC_1 || pdev->id > WM8350_ISINK_B)
1412 /* do any regulatior specific init */
1415 val = wm8350_reg_read(wm8350, WM8350_DCDC1_LOW_POWER);
1416 wm8350->pmic.dcdc1_hib_mode = val & WM8350_DCDC_HIB_MODE_MASK;
1419 val = wm8350_reg_read(wm8350, WM8350_DCDC3_LOW_POWER);
1420 wm8350->pmic.dcdc3_hib_mode = val & WM8350_DCDC_HIB_MODE_MASK;
1423 val = wm8350_reg_read(wm8350, WM8350_DCDC4_LOW_POWER);
1424 wm8350->pmic.dcdc4_hib_mode = val & WM8350_DCDC_HIB_MODE_MASK;
1427 val = wm8350_reg_read(wm8350, WM8350_DCDC6_LOW_POWER);
1428 wm8350->pmic.dcdc6_hib_mode = val & WM8350_DCDC_HIB_MODE_MASK;
1432 /* register regulator */
1433 rdev = regulator_register(&wm8350_reg[pdev->id], &pdev->dev,
1434 pdev->dev.platform_data,
1435 dev_get_drvdata(&pdev->dev));
1437 dev_err(&pdev->dev, "failed to register %s\n",
1438 wm8350_reg[pdev->id].name);
1439 return PTR_ERR(rdev);
1442 /* register regulator IRQ */
1443 ret = wm8350_register_irq(wm8350, wm8350_reg[pdev->id].irq,
1444 pmic_uv_handler, 0, "UV", rdev);
1446 regulator_unregister(rdev);
1447 dev_err(&pdev->dev, "failed to register regulator %s IRQ\n",
1448 wm8350_reg[pdev->id].name);
1455 static int wm8350_regulator_remove(struct platform_device *pdev)
1457 struct regulator_dev *rdev = platform_get_drvdata(pdev);
1458 struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
1460 wm8350_free_irq(wm8350, wm8350_reg[pdev->id].irq, rdev);
1462 regulator_unregister(rdev);
1467 int wm8350_register_regulator(struct wm8350 *wm8350, int reg,
1468 struct regulator_init_data *initdata)
1470 struct platform_device *pdev;
1472 if (reg < 0 || reg >= NUM_WM8350_REGULATORS)
1475 if (wm8350->pmic.pdev[reg])
1478 if (reg >= WM8350_DCDC_1 && reg <= WM8350_DCDC_6 &&
1479 reg > wm8350->pmic.max_dcdc)
1481 if (reg >= WM8350_ISINK_A && reg <= WM8350_ISINK_B &&
1482 reg > wm8350->pmic.max_isink)
1485 pdev = platform_device_alloc("wm8350-regulator", reg);
1489 wm8350->pmic.pdev[reg] = pdev;
1491 initdata->driver_data = wm8350;
1493 pdev->dev.platform_data = initdata;
1494 pdev->dev.parent = wm8350->dev;
1495 platform_set_drvdata(pdev, wm8350);
1497 ret = platform_device_add(pdev);
1500 dev_err(wm8350->dev, "Failed to register regulator %d: %d\n",
1502 platform_device_put(pdev);
1503 wm8350->pmic.pdev[reg] = NULL;
1508 EXPORT_SYMBOL_GPL(wm8350_register_regulator);
1511 * wm8350_register_led - Register a WM8350 LED output
1513 * @param wm8350 The WM8350 device to configure.
1514 * @param lednum LED device index to create.
1515 * @param dcdc The DCDC to use for the LED.
1516 * @param isink The ISINK to use for the LED.
1517 * @param pdata Configuration for the LED.
1519 * The WM8350 supports the use of an ISINK together with a DCDC to
1520 * provide a power-efficient LED driver. This function registers the
1521 * regulators and instantiates the platform device for a LED. The
1522 * operating modes for the LED regulators must be configured using
1523 * wm8350_isink_set_flash(), wm8350_dcdc25_set_mode() and
1524 * wm8350_dcdc_set_slot() prior to calling this function.
1526 int wm8350_register_led(struct wm8350 *wm8350, int lednum, int dcdc, int isink,
1527 struct wm8350_led_platform_data *pdata)
1529 struct wm8350_led *led;
1530 struct platform_device *pdev;
1533 if (lednum >= ARRAY_SIZE(wm8350->pmic.led) || lednum < 0) {
1534 dev_err(wm8350->dev, "Invalid LED index %d\n", lednum);
1538 led = &wm8350->pmic.led[lednum];
1541 dev_err(wm8350->dev, "LED %d already allocated\n", lednum);
1545 pdev = platform_device_alloc("wm8350-led", lednum);
1547 dev_err(wm8350->dev, "Failed to allocate LED %d\n", lednum);
1551 led->isink_consumer.dev = &pdev->dev;
1552 led->isink_consumer.supply = "led_isink";
1553 led->isink_init.num_consumer_supplies = 1;
1554 led->isink_init.consumer_supplies = &led->isink_consumer;
1555 led->isink_init.constraints.min_uA = 0;
1556 led->isink_init.constraints.max_uA = pdata->max_uA;
1557 led->isink_init.constraints.valid_ops_mask
1558 = REGULATOR_CHANGE_CURRENT | REGULATOR_CHANGE_STATUS;
1559 led->isink_init.constraints.valid_modes_mask = REGULATOR_MODE_NORMAL;
1560 ret = wm8350_register_regulator(wm8350, isink, &led->isink_init);
1562 platform_device_put(pdev);
1566 led->dcdc_consumer.dev = &pdev->dev;
1567 led->dcdc_consumer.supply = "led_vcc";
1568 led->dcdc_init.num_consumer_supplies = 1;
1569 led->dcdc_init.consumer_supplies = &led->dcdc_consumer;
1570 led->dcdc_init.constraints.valid_modes_mask = REGULATOR_MODE_NORMAL;
1571 led->dcdc_init.constraints.valid_ops_mask = REGULATOR_CHANGE_STATUS;
1572 ret = wm8350_register_regulator(wm8350, dcdc, &led->dcdc_init);
1574 platform_device_put(pdev);
1579 case WM8350_ISINK_A:
1580 wm8350->pmic.isink_A_dcdc = dcdc;
1582 case WM8350_ISINK_B:
1583 wm8350->pmic.isink_B_dcdc = dcdc;
1587 pdev->dev.platform_data = pdata;
1588 pdev->dev.parent = wm8350->dev;
1589 ret = platform_device_add(pdev);
1591 dev_err(wm8350->dev, "Failed to register LED %d: %d\n",
1593 platform_device_put(pdev);
1601 EXPORT_SYMBOL_GPL(wm8350_register_led);
1603 static struct platform_driver wm8350_regulator_driver = {
1604 .probe = wm8350_regulator_probe,
1605 .remove = wm8350_regulator_remove,
1607 .name = "wm8350-regulator",
1611 static int __init wm8350_regulator_init(void)
1613 return platform_driver_register(&wm8350_regulator_driver);
1615 subsys_initcall(wm8350_regulator_init);
1617 static void __exit wm8350_regulator_exit(void)
1619 platform_driver_unregister(&wm8350_regulator_driver);
1621 module_exit(wm8350_regulator_exit);
1623 /* Module information */
1624 MODULE_AUTHOR("Liam Girdwood");
1625 MODULE_DESCRIPTION("WM8350 voltage and current regulator driver");
1626 MODULE_LICENSE("GPL");
1627 MODULE_ALIAS("platform:wm8350-regulator");