2 * Copyright (C) ST-Ericsson SA 2010
4 * License Terms: GNU General Public License v2
6 * Authors: Sundar Iyer <sundar.iyer@stericsson.com> for ST-Ericsson
7 * Bengt Jonsson <bengt.g.jonsson@stericsson.com> for ST-Ericsson
8 * Daniel Willerud <daniel.willerud@stericsson.com> for ST-Ericsson
10 * AB8500 peripheral regulators
12 * AB8500 supports the following regulators:
13 * VAUX1/2/3, VINTCORE, VTVOUT, VUSB, VAUDIO, VAMIC1/2, VDMIC, VANA
15 * AB8505 supports the following regulators:
16 * VAUX1/2/3/4/5/6, VINTCORE, VADC, VUSB, VAUDIO, VAMIC1/2, VDMIC, VANA
18 #include <linux/init.h>
19 #include <linux/kernel.h>
20 #include <linux/module.h>
21 #include <linux/err.h>
22 #include <linux/platform_device.h>
23 #include <linux/mfd/abx500.h>
24 #include <linux/mfd/abx500/ab8500.h>
26 #include <linux/regulator/of_regulator.h>
27 #include <linux/regulator/driver.h>
28 #include <linux/regulator/machine.h>
29 #include <linux/regulator/ab8500.h>
30 #include <linux/slab.h>
33 * struct ab8500_shared_mode - is used when mode is shared between
35 * @shared_regulator: pointer to the other sharing regulator
36 * @lp_mode_req: low power mode requested by this regulator
38 struct ab8500_shared_mode {
39 struct ab8500_regulator_info *shared_regulator;
44 * struct ab8500_regulator_info - ab8500 regulator information
45 * @dev: device pointer
46 * @desc: regulator description
47 * @regulator_dev: regulator device
48 * @shared_mode: used when mode is shared between two regulators
49 * @is_enabled: status of regulator (on/off)
50 * @load_lp_uA: maximum load in idle (low power) mode
51 * @update_bank: bank to control on/off
52 * @update_reg: register to control on/off
53 * @update_mask: mask to enable/disable and set mode of regulator
54 * @update_val: bits holding the regulator current mode
55 * @update_val_idle: bits to enable the regulator in idle (low power) mode
56 * @update_val_normal: bits to enable the regulator in normal (high power) mode
57 * @mode_bank: bank with location of mode register
58 * @mode_reg: mode register
59 * @mode_mask: mask for setting mode
60 * @mode_val_idle: mode setting for low power
61 * @mode_val_normal: mode setting for normal power
62 * @voltage_bank: bank to control regulator voltage
63 * @voltage_reg: register to control regulator voltage
64 * @voltage_mask: mask to control regulator voltage
65 * @voltage_shift: shift to control regulator voltage
67 struct ab8500_regulator_info {
69 struct regulator_desc desc;
70 struct regulator_dev *regulator;
71 struct ab8500_shared_mode *shared_mode;
98 /* voltage tables for the vauxn/vintcore supplies */
99 static const unsigned int ldo_vauxn_voltages[] = {
118 static const unsigned int ldo_vaux3_voltages[] = {
129 static const unsigned int ldo_vaux56_voltages[] = {
140 static const unsigned int ldo_vaux3_ab8540_voltages[] = {
152 static const unsigned int ldo_vaux56_ab8540_voltages[] = {
153 750000, 760000, 770000, 780000, 790000, 800000,
154 810000, 820000, 830000, 840000, 850000, 860000,
155 870000, 880000, 890000, 900000, 910000, 920000,
156 930000, 940000, 950000, 960000, 970000, 980000,
157 990000, 1000000, 1010000, 1020000, 1030000,
158 1040000, 1050000, 1060000, 1070000, 1080000,
159 1090000, 1100000, 1110000, 1120000, 1130000,
160 1140000, 1150000, 1160000, 1170000, 1180000,
161 1190000, 1200000, 1210000, 1220000, 1230000,
162 1240000, 1250000, 1260000, 1270000, 1280000,
163 1290000, 1300000, 1310000, 1320000, 1330000,
164 1340000, 1350000, 1360000, 1800000, 2790000,
167 static const unsigned int ldo_vintcore_voltages[] = {
177 static const unsigned int ldo_sdio_voltages[] = {
188 static const unsigned int fixed_1200000_voltage[] = {
192 static const unsigned int fixed_1800000_voltage[] = {
196 static const unsigned int fixed_2000000_voltage[] = {
200 static const unsigned int fixed_2050000_voltage[] = {
204 static const unsigned int fixed_3300000_voltage[] = {
208 static const unsigned int ldo_vana_voltages[] = {
219 static const unsigned int ldo_vaudio_voltages[] = {
227 2600000, /* Duplicated in Vaudio and IsoUicc Control register. */
230 static const unsigned int ldo_vdmic_voltages[] = {
237 static DEFINE_MUTEX(shared_mode_mutex);
238 static struct ab8500_shared_mode ldo_anamic1_shared;
239 static struct ab8500_shared_mode ldo_anamic2_shared;
240 static struct ab8500_shared_mode ab8540_ldo_anamic1_shared;
241 static struct ab8500_shared_mode ab8540_ldo_anamic2_shared;
243 static int ab8500_regulator_enable(struct regulator_dev *rdev)
246 struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
249 dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
253 ret = abx500_mask_and_set_register_interruptible(info->dev,
254 info->update_bank, info->update_reg,
255 info->update_mask, info->update_val);
257 dev_err(rdev_get_dev(rdev),
258 "couldn't set enable bits for regulator\n");
262 info->is_enabled = true;
264 dev_vdbg(rdev_get_dev(rdev),
265 "%s-enable (bank, reg, mask, value): 0x%x, 0x%x, 0x%x, 0x%x\n",
266 info->desc.name, info->update_bank, info->update_reg,
267 info->update_mask, info->update_val);
272 static int ab8500_regulator_disable(struct regulator_dev *rdev)
275 struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
278 dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
282 ret = abx500_mask_and_set_register_interruptible(info->dev,
283 info->update_bank, info->update_reg,
284 info->update_mask, 0x0);
286 dev_err(rdev_get_dev(rdev),
287 "couldn't set disable bits for regulator\n");
291 info->is_enabled = false;
293 dev_vdbg(rdev_get_dev(rdev),
294 "%s-disable (bank, reg, mask, value): 0x%x, 0x%x, 0x%x, 0x%x\n",
295 info->desc.name, info->update_bank, info->update_reg,
296 info->update_mask, 0x0);
301 static unsigned int ab8500_regulator_get_optimum_mode(
302 struct regulator_dev *rdev, int input_uV,
303 int output_uV, int load_uA)
307 struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
310 dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
314 if (load_uA <= info->load_lp_uA)
315 mode = REGULATOR_MODE_IDLE;
317 mode = REGULATOR_MODE_NORMAL;
322 static int ab8500_regulator_set_mode(struct regulator_dev *rdev,
330 bool dmr = false; /* Dedicated mode register */
331 struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
334 dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
338 if (info->shared_mode) {
340 * Special case where mode is shared between two regulators.
342 struct ab8500_shared_mode *sm = info->shared_mode;
343 mutex_lock(&shared_mode_mutex);
345 if (mode == REGULATOR_MODE_IDLE) {
346 sm->lp_mode_req = true; /* Low power mode requested */
347 if (!((sm->shared_regulator)->
348 shared_mode->lp_mode_req)) {
349 mutex_unlock(&shared_mode_mutex);
350 return 0; /* Other regulator prevent LP mode */
353 sm->lp_mode_req = false;
357 if (info->mode_mask) {
358 /* Dedicated register for handling mode */
363 case REGULATOR_MODE_NORMAL:
364 val = info->mode_val_normal;
366 case REGULATOR_MODE_IDLE:
367 val = info->mode_val_idle;
370 if (info->shared_mode)
371 mutex_unlock(&shared_mode_mutex);
375 bank = info->mode_bank;
376 reg = info->mode_reg;
377 mask = info->mode_mask;
379 /* Mode register same as enable register */
382 case REGULATOR_MODE_NORMAL:
383 info->update_val = info->update_val_normal;
384 val = info->update_val_normal;
386 case REGULATOR_MODE_IDLE:
387 info->update_val = info->update_val_idle;
388 val = info->update_val_idle;
391 if (info->shared_mode)
392 mutex_unlock(&shared_mode_mutex);
396 bank = info->update_bank;
397 reg = info->update_reg;
398 mask = info->update_mask;
401 if (info->is_enabled || dmr) {
402 ret = abx500_mask_and_set_register_interruptible(info->dev,
403 bank, reg, mask, val);
405 dev_err(rdev_get_dev(rdev),
406 "couldn't set regulator mode\n");
408 dev_vdbg(rdev_get_dev(rdev),
409 "%s-set_mode (bank, reg, mask, value): "
410 "0x%x, 0x%x, 0x%x, 0x%x\n",
411 info->desc.name, bank, reg,
415 if (info->shared_mode)
416 mutex_unlock(&shared_mode_mutex);
421 static unsigned int ab8500_regulator_get_mode(struct regulator_dev *rdev)
423 struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
430 dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
434 /* Need special handling for shared mode */
435 if (info->shared_mode) {
436 if (info->shared_mode->lp_mode_req)
437 return REGULATOR_MODE_IDLE;
439 return REGULATOR_MODE_NORMAL;
442 if (info->mode_mask) {
443 /* Dedicated register for handling mode */
444 ret = abx500_get_register_interruptible(info->dev,
445 info->mode_bank, info->mode_reg, &val);
446 val = val & info->mode_mask;
448 val_normal = info->mode_val_normal;
449 val_idle = info->mode_val_idle;
451 /* Mode register same as enable register */
452 val = info->update_val;
453 val_normal = info->update_val_normal;
454 val_idle = info->update_val_idle;
457 if (val == val_normal)
458 ret = REGULATOR_MODE_NORMAL;
459 else if (val == val_idle)
460 ret = REGULATOR_MODE_IDLE;
467 static int ab8500_regulator_is_enabled(struct regulator_dev *rdev)
470 struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
474 dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
478 ret = abx500_get_register_interruptible(info->dev,
479 info->update_bank, info->update_reg, ®val);
481 dev_err(rdev_get_dev(rdev),
482 "couldn't read 0x%x register\n", info->update_reg);
486 dev_vdbg(rdev_get_dev(rdev),
487 "%s-is_enabled (bank, reg, mask, value): 0x%x, 0x%x, 0x%x,"
489 info->desc.name, info->update_bank, info->update_reg,
490 info->update_mask, regval);
492 if (regval & info->update_mask)
493 info->is_enabled = true;
495 info->is_enabled = false;
497 return info->is_enabled;
500 static int ab8500_regulator_get_voltage_sel(struct regulator_dev *rdev)
503 struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
507 dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
511 ret = abx500_get_register_interruptible(info->dev,
512 info->voltage_bank, info->voltage_reg, ®val);
514 dev_err(rdev_get_dev(rdev),
515 "couldn't read voltage reg for regulator\n");
519 dev_vdbg(rdev_get_dev(rdev),
520 "%s-get_voltage (bank, reg, mask, shift, value): "
521 "0x%x, 0x%x, 0x%x, 0x%x, 0x%x\n",
522 info->desc.name, info->voltage_bank,
523 info->voltage_reg, info->voltage_mask,
524 info->voltage_shift, regval);
526 val = regval & info->voltage_mask;
527 return val >> info->voltage_shift;
530 static int ab8540_aux3_regulator_get_voltage_sel(struct regulator_dev *rdev)
533 struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
534 u8 regval, regval_expand;
537 dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
541 ret = abx500_get_register_interruptible(info->dev,
542 info->voltage_bank, info->voltage_reg, ®val);
545 dev_err(rdev_get_dev(rdev),
546 "couldn't read voltage reg for regulator\n");
550 ret = abx500_get_register_interruptible(info->dev,
551 info->expand_register.voltage_bank,
552 info->expand_register.voltage_reg, ®val_expand);
555 dev_err(rdev_get_dev(rdev),
556 "couldn't read voltage reg for regulator\n");
560 dev_vdbg(rdev_get_dev(rdev),
561 "%s-get_voltage (bank, reg, mask, value): 0x%x, 0x%x, 0x%x,"
563 info->desc.name, info->voltage_bank, info->voltage_reg,
564 info->voltage_mask, regval);
565 dev_vdbg(rdev_get_dev(rdev),
566 "%s-get_voltage expand (bank, reg, mask, value): 0x%x, 0x%x, 0x%x,"
568 info->desc.name, info->expand_register.voltage_bank,
569 info->expand_register.voltage_reg,
570 info->expand_register.voltage_mask, regval_expand);
572 if (regval_expand&(info->expand_register.voltage_mask))
573 /* Vaux3 has a different layout */
574 val = info->expand_register.voltage_limit;
576 val = (regval & info->voltage_mask) >> info->voltage_shift;
581 static int ab8500_regulator_set_voltage_sel(struct regulator_dev *rdev,
585 struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
589 dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
593 /* set the registers for the request */
594 regval = (u8)selector << info->voltage_shift;
595 ret = abx500_mask_and_set_register_interruptible(info->dev,
596 info->voltage_bank, info->voltage_reg,
597 info->voltage_mask, regval);
599 dev_err(rdev_get_dev(rdev),
600 "couldn't set voltage reg for regulator\n");
602 dev_vdbg(rdev_get_dev(rdev),
603 "%s-set_voltage (bank, reg, mask, value): 0x%x, 0x%x, 0x%x,"
605 info->desc.name, info->voltage_bank, info->voltage_reg,
606 info->voltage_mask, regval);
611 static int ab8540_aux3_regulator_set_voltage_sel(struct regulator_dev *rdev,
615 struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
619 dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
623 if (selector >= info->expand_register.voltage_limit) {
624 /* Vaux3 bit4 has different layout */
625 regval = (u8)selector << info->expand_register.voltage_shift;
626 ret = abx500_mask_and_set_register_interruptible(info->dev,
627 info->expand_register.voltage_bank,
628 info->expand_register.voltage_reg,
629 info->expand_register.voltage_mask,
632 /* set the registers for the request */
633 regval = (u8)selector << info->voltage_shift;
634 ret = abx500_mask_and_set_register_interruptible(info->dev,
635 info->voltage_bank, info->voltage_reg,
636 info->voltage_mask, regval);
639 dev_err(rdev_get_dev(rdev),
640 "couldn't set voltage reg for regulator\n");
642 dev_vdbg(rdev_get_dev(rdev),
643 "%s-set_voltage (bank, reg, mask, value): 0x%x, 0x%x, 0x%x,"
645 info->desc.name, info->voltage_bank, info->voltage_reg,
646 info->voltage_mask, regval);
651 static int ab8500_regulator_set_voltage_time_sel(struct regulator_dev *rdev,
652 unsigned int old_sel,
653 unsigned int new_sel)
655 struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
657 return info->desc.enable_time;
660 static struct regulator_ops ab8500_regulator_volt_mode_ops = {
661 .enable = ab8500_regulator_enable,
662 .disable = ab8500_regulator_disable,
663 .is_enabled = ab8500_regulator_is_enabled,
664 .get_optimum_mode = ab8500_regulator_get_optimum_mode,
665 .set_mode = ab8500_regulator_set_mode,
666 .get_mode = ab8500_regulator_get_mode,
667 .get_voltage_sel = ab8500_regulator_get_voltage_sel,
668 .set_voltage_sel = ab8500_regulator_set_voltage_sel,
669 .list_voltage = regulator_list_voltage_table,
672 static struct regulator_ops ab8540_aux3_regulator_volt_mode_ops = {
673 .enable = ab8500_regulator_enable,
674 .disable = ab8500_regulator_disable,
675 .get_optimum_mode = ab8500_regulator_get_optimum_mode,
676 .set_mode = ab8500_regulator_set_mode,
677 .get_mode = ab8500_regulator_get_mode,
678 .is_enabled = ab8500_regulator_is_enabled,
679 .get_voltage_sel = ab8540_aux3_regulator_get_voltage_sel,
680 .set_voltage_sel = ab8540_aux3_regulator_set_voltage_sel,
681 .list_voltage = regulator_list_voltage_table,
682 .set_voltage_time_sel = ab8500_regulator_set_voltage_time_sel,
685 static struct regulator_ops ab8500_regulator_volt_ops = {
686 .enable = ab8500_regulator_enable,
687 .disable = ab8500_regulator_disable,
688 .is_enabled = ab8500_regulator_is_enabled,
689 .get_voltage_sel = ab8500_regulator_get_voltage_sel,
690 .set_voltage_sel = ab8500_regulator_set_voltage_sel,
691 .list_voltage = regulator_list_voltage_table,
692 .set_voltage_time_sel = ab8500_regulator_set_voltage_time_sel,
695 static struct regulator_ops ab8500_regulator_mode_ops = {
696 .enable = ab8500_regulator_enable,
697 .disable = ab8500_regulator_disable,
698 .is_enabled = ab8500_regulator_is_enabled,
699 .get_optimum_mode = ab8500_regulator_get_optimum_mode,
700 .set_mode = ab8500_regulator_set_mode,
701 .get_mode = ab8500_regulator_get_mode,
702 .list_voltage = regulator_list_voltage_linear,
705 static struct regulator_ops ab8500_regulator_ops = {
706 .enable = ab8500_regulator_enable,
707 .disable = ab8500_regulator_disable,
708 .is_enabled = ab8500_regulator_is_enabled,
709 .list_voltage = regulator_list_voltage_linear,
712 static struct regulator_ops ab8500_regulator_anamic_mode_ops = {
713 .enable = ab8500_regulator_enable,
714 .disable = ab8500_regulator_disable,
715 .is_enabled = ab8500_regulator_is_enabled,
716 .set_mode = ab8500_regulator_set_mode,
717 .get_mode = ab8500_regulator_get_mode,
718 .list_voltage = regulator_list_voltage_table,
721 /* AB8500 regulator information */
722 static struct ab8500_regulator_info
723 ab8500_regulator_info[AB8500_NUM_REGULATORS] = {
725 * Variable Voltage Regulators
726 * name, min mV, max mV,
727 * update bank, reg, mask, enable val
728 * volt bank, reg, mask
730 [AB8500_LDO_AUX1] = {
733 .ops = &ab8500_regulator_volt_mode_ops,
734 .type = REGULATOR_VOLTAGE,
735 .id = AB8500_LDO_AUX1,
736 .owner = THIS_MODULE,
737 .n_voltages = ARRAY_SIZE(ldo_vauxn_voltages),
738 .volt_table = ldo_vauxn_voltages,
746 .update_val_idle = 0x03,
747 .update_val_normal = 0x01,
748 .voltage_bank = 0x04,
750 .voltage_mask = 0x0f,
752 [AB8500_LDO_AUX2] = {
755 .ops = &ab8500_regulator_volt_mode_ops,
756 .type = REGULATOR_VOLTAGE,
757 .id = AB8500_LDO_AUX2,
758 .owner = THIS_MODULE,
759 .n_voltages = ARRAY_SIZE(ldo_vauxn_voltages),
760 .volt_table = ldo_vauxn_voltages,
768 .update_val_idle = 0x0c,
769 .update_val_normal = 0x04,
770 .voltage_bank = 0x04,
772 .voltage_mask = 0x0f,
774 [AB8500_LDO_AUX3] = {
777 .ops = &ab8500_regulator_volt_mode_ops,
778 .type = REGULATOR_VOLTAGE,
779 .id = AB8500_LDO_AUX3,
780 .owner = THIS_MODULE,
781 .n_voltages = ARRAY_SIZE(ldo_vaux3_voltages),
782 .volt_table = ldo_vaux3_voltages,
790 .update_val_idle = 0x03,
791 .update_val_normal = 0x01,
792 .voltage_bank = 0x04,
794 .voltage_mask = 0x07,
796 [AB8500_LDO_INTCORE] = {
798 .name = "LDO-INTCORE",
799 .ops = &ab8500_regulator_volt_mode_ops,
800 .type = REGULATOR_VOLTAGE,
801 .id = AB8500_LDO_INTCORE,
802 .owner = THIS_MODULE,
803 .n_voltages = ARRAY_SIZE(ldo_vintcore_voltages),
804 .volt_table = ldo_vintcore_voltages,
812 .update_val_idle = 0x44,
813 .update_val_normal = 0x04,
814 .voltage_bank = 0x03,
816 .voltage_mask = 0x38,
821 * Fixed Voltage Regulators
823 * update bank, reg, mask, enable val
825 [AB8500_LDO_TVOUT] = {
828 .ops = &ab8500_regulator_mode_ops,
829 .type = REGULATOR_VOLTAGE,
830 .id = AB8500_LDO_TVOUT,
831 .owner = THIS_MODULE,
833 .volt_table = fixed_2000000_voltage,
841 .update_val_idle = 0x82,
842 .update_val_normal = 0x02,
844 [AB8500_LDO_AUDIO] = {
847 .ops = &ab8500_regulator_ops,
848 .type = REGULATOR_VOLTAGE,
849 .id = AB8500_LDO_AUDIO,
850 .owner = THIS_MODULE,
853 .volt_table = fixed_2000000_voltage,
860 [AB8500_LDO_ANAMIC1] = {
862 .name = "LDO-ANAMIC1",
863 .ops = &ab8500_regulator_ops,
864 .type = REGULATOR_VOLTAGE,
865 .id = AB8500_LDO_ANAMIC1,
866 .owner = THIS_MODULE,
869 .volt_table = fixed_2050000_voltage,
876 [AB8500_LDO_ANAMIC2] = {
878 .name = "LDO-ANAMIC2",
879 .ops = &ab8500_regulator_ops,
880 .type = REGULATOR_VOLTAGE,
881 .id = AB8500_LDO_ANAMIC2,
882 .owner = THIS_MODULE,
885 .volt_table = fixed_2050000_voltage,
892 [AB8500_LDO_DMIC] = {
895 .ops = &ab8500_regulator_ops,
896 .type = REGULATOR_VOLTAGE,
897 .id = AB8500_LDO_DMIC,
898 .owner = THIS_MODULE,
901 .volt_table = fixed_1800000_voltage,
910 * Regulators with fixed voltage and normal/idle modes
915 .ops = &ab8500_regulator_mode_ops,
916 .type = REGULATOR_VOLTAGE,
917 .id = AB8500_LDO_ANA,
918 .owner = THIS_MODULE,
921 .volt_table = fixed_1200000_voltage,
928 .update_val_idle = 0x0c,
929 .update_val_normal = 0x04,
933 /* AB8505 regulator information */
934 static struct ab8500_regulator_info
935 ab8505_regulator_info[AB8505_NUM_REGULATORS] = {
937 * Variable Voltage Regulators
938 * name, min mV, max mV,
939 * update bank, reg, mask, enable val
940 * volt bank, reg, mask, table, table length
942 [AB8505_LDO_AUX1] = {
945 .ops = &ab8500_regulator_volt_mode_ops,
946 .type = REGULATOR_VOLTAGE,
947 .id = AB8505_LDO_AUX1,
948 .owner = THIS_MODULE,
949 .n_voltages = ARRAY_SIZE(ldo_vauxn_voltages),
950 .volt_table = ldo_vauxn_voltages,
957 .update_val_idle = 0x03,
958 .update_val_normal = 0x01,
959 .voltage_bank = 0x04,
961 .voltage_mask = 0x0f,
963 [AB8505_LDO_AUX2] = {
966 .ops = &ab8500_regulator_volt_mode_ops,
967 .type = REGULATOR_VOLTAGE,
968 .id = AB8505_LDO_AUX2,
969 .owner = THIS_MODULE,
970 .n_voltages = ARRAY_SIZE(ldo_vauxn_voltages),
971 .volt_table = ldo_vauxn_voltages,
978 .update_val_idle = 0x0c,
979 .update_val_normal = 0x04,
980 .voltage_bank = 0x04,
982 .voltage_mask = 0x0f,
984 [AB8505_LDO_AUX3] = {
987 .ops = &ab8500_regulator_volt_mode_ops,
988 .type = REGULATOR_VOLTAGE,
989 .id = AB8505_LDO_AUX3,
990 .owner = THIS_MODULE,
991 .n_voltages = ARRAY_SIZE(ldo_vaux3_voltages),
992 .volt_table = ldo_vaux3_voltages,
999 .update_val_idle = 0x03,
1000 .update_val_normal = 0x01,
1001 .voltage_bank = 0x04,
1002 .voltage_reg = 0x21,
1003 .voltage_mask = 0x07,
1005 [AB8505_LDO_AUX4] = {
1008 .ops = &ab8500_regulator_volt_mode_ops,
1009 .type = REGULATOR_VOLTAGE,
1010 .id = AB8505_LDO_AUX4,
1011 .owner = THIS_MODULE,
1012 .n_voltages = ARRAY_SIZE(ldo_vauxn_voltages),
1013 .volt_table = ldo_vauxn_voltages,
1016 /* values for Vaux4Regu register */
1017 .update_bank = 0x04,
1019 .update_mask = 0x03,
1021 .update_val_idle = 0x03,
1022 .update_val_normal = 0x01,
1023 /* values for Vaux4SEL register */
1024 .voltage_bank = 0x04,
1025 .voltage_reg = 0x2f,
1026 .voltage_mask = 0x0f,
1028 [AB8505_LDO_AUX5] = {
1031 .ops = &ab8500_regulator_volt_mode_ops,
1032 .type = REGULATOR_VOLTAGE,
1033 .id = AB8505_LDO_AUX5,
1034 .owner = THIS_MODULE,
1035 .n_voltages = ARRAY_SIZE(ldo_vaux56_voltages),
1036 .volt_table = ldo_vaux56_voltages,
1039 /* values for CtrlVaux5 register */
1040 .update_bank = 0x01,
1042 .update_mask = 0x18,
1044 .update_val_idle = 0x18,
1045 .update_val_normal = 0x10,
1046 .voltage_bank = 0x01,
1047 .voltage_reg = 0x55,
1048 .voltage_mask = 0x07,
1050 [AB8505_LDO_AUX6] = {
1053 .ops = &ab8500_regulator_volt_mode_ops,
1054 .type = REGULATOR_VOLTAGE,
1055 .id = AB8505_LDO_AUX6,
1056 .owner = THIS_MODULE,
1057 .n_voltages = ARRAY_SIZE(ldo_vaux56_voltages),
1058 .volt_table = ldo_vaux56_voltages,
1061 /* values for CtrlVaux6 register */
1062 .update_bank = 0x01,
1064 .update_mask = 0x18,
1066 .update_val_idle = 0x18,
1067 .update_val_normal = 0x10,
1068 .voltage_bank = 0x01,
1069 .voltage_reg = 0x56,
1070 .voltage_mask = 0x07,
1072 [AB8505_LDO_INTCORE] = {
1074 .name = "LDO-INTCORE",
1075 .ops = &ab8500_regulator_volt_mode_ops,
1076 .type = REGULATOR_VOLTAGE,
1077 .id = AB8505_LDO_INTCORE,
1078 .owner = THIS_MODULE,
1079 .n_voltages = ARRAY_SIZE(ldo_vintcore_voltages),
1080 .volt_table = ldo_vintcore_voltages,
1083 .update_bank = 0x03,
1085 .update_mask = 0x44,
1087 .update_val_idle = 0x44,
1088 .update_val_normal = 0x04,
1089 .voltage_bank = 0x03,
1090 .voltage_reg = 0x80,
1091 .voltage_mask = 0x38,
1096 * Fixed Voltage Regulators
1098 * update bank, reg, mask, enable val
1100 [AB8505_LDO_ADC] = {
1103 .ops = &ab8500_regulator_mode_ops,
1104 .type = REGULATOR_VOLTAGE,
1105 .id = AB8505_LDO_ADC,
1106 .owner = THIS_MODULE,
1108 .volt_table = fixed_2000000_voltage,
1109 .enable_time = 10000,
1112 .update_bank = 0x03,
1114 .update_mask = 0x82,
1116 .update_val_idle = 0x82,
1117 .update_val_normal = 0x02,
1119 [AB8505_LDO_USB] = {
1122 .ops = &ab8500_regulator_mode_ops,
1123 .type = REGULATOR_VOLTAGE,
1124 .id = AB8505_LDO_USB,
1125 .owner = THIS_MODULE,
1127 .volt_table = fixed_3300000_voltage,
1129 .update_bank = 0x03,
1131 .update_mask = 0x03,
1133 .update_val_idle = 0x03,
1134 .update_val_normal = 0x01,
1136 [AB8505_LDO_AUDIO] = {
1138 .name = "LDO-AUDIO",
1139 .ops = &ab8500_regulator_volt_ops,
1140 .type = REGULATOR_VOLTAGE,
1141 .id = AB8505_LDO_AUDIO,
1142 .owner = THIS_MODULE,
1143 .n_voltages = ARRAY_SIZE(ldo_vaudio_voltages),
1144 .volt_table = ldo_vaudio_voltages,
1146 .update_bank = 0x03,
1148 .update_mask = 0x02,
1150 .voltage_bank = 0x01,
1151 .voltage_reg = 0x57,
1152 .voltage_mask = 0x7,
1154 .voltages = ldo_vaudio_voltages,
1155 .voltages_len = ARRAY_SIZE(ldo_vaudio_voltages),
1157 [AB8505_LDO_ANAMIC1] = {
1159 .name = "LDO-ANAMIC1",
1160 .ops = &ab8500_regulator_anamic_mode_ops,
1161 .type = REGULATOR_VOLTAGE,
1162 .id = AB8505_LDO_ANAMIC1,
1163 .owner = THIS_MODULE,
1165 .volt_table = fixed_2050000_voltage,
1167 .shared_mode = &ldo_anamic1_shared,
1168 .update_bank = 0x03,
1170 .update_mask = 0x08,
1175 .mode_val_idle = 0x04,
1176 .mode_val_normal = 0x00,
1178 [AB8505_LDO_ANAMIC2] = {
1180 .name = "LDO-ANAMIC2",
1181 .ops = &ab8500_regulator_anamic_mode_ops,
1182 .type = REGULATOR_VOLTAGE,
1183 .id = AB8505_LDO_ANAMIC2,
1184 .owner = THIS_MODULE,
1186 .volt_table = fixed_2050000_voltage,
1188 .shared_mode = &ldo_anamic2_shared,
1189 .update_bank = 0x03,
1191 .update_mask = 0x10,
1196 .mode_val_idle = 0x04,
1197 .mode_val_normal = 0x00,
1199 [AB8505_LDO_AUX8] = {
1202 .ops = &ab8500_regulator_ops,
1203 .type = REGULATOR_VOLTAGE,
1204 .id = AB8505_LDO_AUX8,
1205 .owner = THIS_MODULE,
1207 .volt_table = fixed_1800000_voltage,
1209 .update_bank = 0x03,
1211 .update_mask = 0x04,
1215 * Regulators with fixed voltage and normal/idle modes
1217 [AB8505_LDO_ANA] = {
1220 .ops = &ab8500_regulator_volt_mode_ops,
1221 .type = REGULATOR_VOLTAGE,
1222 .id = AB8505_LDO_ANA,
1223 .owner = THIS_MODULE,
1224 .n_voltages = ARRAY_SIZE(ldo_vana_voltages),
1225 .volt_table = ldo_vana_voltages,
1228 .update_bank = 0x04,
1230 .update_mask = 0x0c,
1232 .update_val_idle = 0x0c,
1233 .update_val_normal = 0x04,
1234 .voltage_bank = 0x04,
1235 .voltage_reg = 0x29,
1236 .voltage_mask = 0x7,
1237 .voltages = ldo_vana_voltages,
1238 .voltages_len = ARRAY_SIZE(ldo_vana_voltages),
1242 /* AB9540 regulator information */
1243 static struct ab8500_regulator_info
1244 ab9540_regulator_info[AB9540_NUM_REGULATORS] = {
1246 * Variable Voltage Regulators
1247 * name, min mV, max mV,
1248 * update bank, reg, mask, enable val
1249 * volt bank, reg, mask, table, table length
1251 [AB9540_LDO_AUX1] = {
1254 .ops = &ab8500_regulator_volt_mode_ops,
1255 .type = REGULATOR_VOLTAGE,
1256 .id = AB9540_LDO_AUX1,
1257 .owner = THIS_MODULE,
1258 .n_voltages = ARRAY_SIZE(ldo_vauxn_voltages),
1259 .volt_table = ldo_vauxn_voltages,
1262 .update_bank = 0x04,
1264 .update_mask = 0x03,
1266 .update_val_idle = 0x03,
1267 .update_val_normal = 0x01,
1268 .voltage_bank = 0x04,
1269 .voltage_reg = 0x1f,
1270 .voltage_mask = 0x0f,
1272 [AB9540_LDO_AUX2] = {
1275 .ops = &ab8500_regulator_volt_mode_ops,
1276 .type = REGULATOR_VOLTAGE,
1277 .id = AB9540_LDO_AUX2,
1278 .owner = THIS_MODULE,
1279 .n_voltages = ARRAY_SIZE(ldo_vauxn_voltages),
1280 .volt_table = ldo_vauxn_voltages,
1283 .update_bank = 0x04,
1285 .update_mask = 0x0c,
1287 .update_val_idle = 0x0c,
1288 .update_val_normal = 0x04,
1289 .voltage_bank = 0x04,
1290 .voltage_reg = 0x20,
1291 .voltage_mask = 0x0f,
1293 [AB9540_LDO_AUX3] = {
1296 .ops = &ab8500_regulator_volt_mode_ops,
1297 .type = REGULATOR_VOLTAGE,
1298 .id = AB9540_LDO_AUX3,
1299 .owner = THIS_MODULE,
1300 .n_voltages = ARRAY_SIZE(ldo_vaux3_voltages),
1301 .volt_table = ldo_vaux3_voltages,
1304 .update_bank = 0x04,
1306 .update_mask = 0x03,
1308 .update_val_idle = 0x03,
1309 .update_val_normal = 0x01,
1310 .voltage_bank = 0x04,
1311 .voltage_reg = 0x21,
1312 .voltage_mask = 0x07,
1314 [AB9540_LDO_AUX4] = {
1317 .ops = &ab8500_regulator_volt_mode_ops,
1318 .type = REGULATOR_VOLTAGE,
1319 .id = AB9540_LDO_AUX4,
1320 .owner = THIS_MODULE,
1321 .n_voltages = ARRAY_SIZE(ldo_vauxn_voltages),
1322 .volt_table = ldo_vauxn_voltages,
1325 /* values for Vaux4Regu register */
1326 .update_bank = 0x04,
1328 .update_mask = 0x03,
1330 .update_val_idle = 0x03,
1331 .update_val_normal = 0x01,
1332 /* values for Vaux4SEL register */
1333 .voltage_bank = 0x04,
1334 .voltage_reg = 0x2f,
1335 .voltage_mask = 0x0f,
1337 [AB9540_LDO_INTCORE] = {
1339 .name = "LDO-INTCORE",
1340 .ops = &ab8500_regulator_volt_mode_ops,
1341 .type = REGULATOR_VOLTAGE,
1342 .id = AB9540_LDO_INTCORE,
1343 .owner = THIS_MODULE,
1344 .n_voltages = ARRAY_SIZE(ldo_vintcore_voltages),
1345 .volt_table = ldo_vintcore_voltages,
1348 .update_bank = 0x03,
1350 .update_mask = 0x44,
1352 .update_val_idle = 0x44,
1353 .update_val_normal = 0x04,
1354 .voltage_bank = 0x03,
1355 .voltage_reg = 0x80,
1356 .voltage_mask = 0x38,
1361 * Fixed Voltage Regulators
1363 * update bank, reg, mask, enable val
1365 [AB9540_LDO_TVOUT] = {
1367 .name = "LDO-TVOUT",
1368 .ops = &ab8500_regulator_mode_ops,
1369 .type = REGULATOR_VOLTAGE,
1370 .id = AB9540_LDO_TVOUT,
1371 .owner = THIS_MODULE,
1373 .volt_table = fixed_2000000_voltage,
1374 .enable_time = 10000,
1377 .update_bank = 0x03,
1379 .update_mask = 0x82,
1381 .update_val_idle = 0x82,
1382 .update_val_normal = 0x02,
1384 [AB9540_LDO_USB] = {
1387 .ops = &ab8500_regulator_ops,
1388 .type = REGULATOR_VOLTAGE,
1389 .id = AB9540_LDO_USB,
1390 .owner = THIS_MODULE,
1392 .volt_table = fixed_3300000_voltage,
1394 .update_bank = 0x03,
1396 .update_mask = 0x03,
1398 .update_val_idle = 0x03,
1399 .update_val_normal = 0x01,
1401 [AB9540_LDO_AUDIO] = {
1403 .name = "LDO-AUDIO",
1404 .ops = &ab8500_regulator_ops,
1405 .type = REGULATOR_VOLTAGE,
1406 .id = AB9540_LDO_AUDIO,
1407 .owner = THIS_MODULE,
1409 .volt_table = fixed_2000000_voltage,
1411 .update_bank = 0x03,
1413 .update_mask = 0x02,
1416 [AB9540_LDO_ANAMIC1] = {
1418 .name = "LDO-ANAMIC1",
1419 .ops = &ab8500_regulator_ops,
1420 .type = REGULATOR_VOLTAGE,
1421 .id = AB9540_LDO_ANAMIC1,
1422 .owner = THIS_MODULE,
1424 .volt_table = fixed_2050000_voltage,
1426 .update_bank = 0x03,
1428 .update_mask = 0x08,
1431 [AB9540_LDO_ANAMIC2] = {
1433 .name = "LDO-ANAMIC2",
1434 .ops = &ab8500_regulator_ops,
1435 .type = REGULATOR_VOLTAGE,
1436 .id = AB9540_LDO_ANAMIC2,
1437 .owner = THIS_MODULE,
1439 .volt_table = fixed_2050000_voltage,
1441 .update_bank = 0x03,
1443 .update_mask = 0x10,
1446 [AB9540_LDO_DMIC] = {
1449 .ops = &ab8500_regulator_ops,
1450 .type = REGULATOR_VOLTAGE,
1451 .id = AB9540_LDO_DMIC,
1452 .owner = THIS_MODULE,
1454 .volt_table = fixed_1800000_voltage,
1456 .update_bank = 0x03,
1458 .update_mask = 0x04,
1463 * Regulators with fixed voltage and normal/idle modes
1465 [AB9540_LDO_ANA] = {
1468 .ops = &ab8500_regulator_mode_ops,
1469 .type = REGULATOR_VOLTAGE,
1470 .id = AB9540_LDO_ANA,
1471 .owner = THIS_MODULE,
1473 .volt_table = fixed_1200000_voltage,
1476 .update_bank = 0x04,
1478 .update_mask = 0x0c,
1480 .update_val_idle = 0x0c,
1481 .update_val_normal = 0x08,
1485 /* AB8540 regulator information */
1486 static struct ab8500_regulator_info
1487 ab8540_regulator_info[AB8540_NUM_REGULATORS] = {
1489 * Variable Voltage Regulators
1490 * name, min mV, max mV,
1491 * update bank, reg, mask, enable val
1492 * volt bank, reg, mask, table, table length
1494 [AB8540_LDO_AUX1] = {
1497 .ops = &ab8500_regulator_volt_mode_ops,
1498 .type = REGULATOR_VOLTAGE,
1499 .id = AB8540_LDO_AUX1,
1500 .owner = THIS_MODULE,
1501 .n_voltages = ARRAY_SIZE(ldo_vauxn_voltages),
1502 .volt_table = ldo_vauxn_voltages,
1505 .update_bank = 0x04,
1507 .update_mask = 0x03,
1509 .update_val_idle = 0x03,
1510 .update_val_normal = 0x01,
1511 .voltage_bank = 0x04,
1512 .voltage_reg = 0x1f,
1513 .voltage_mask = 0x0f,
1515 [AB8540_LDO_AUX2] = {
1518 .ops = &ab8500_regulator_volt_mode_ops,
1519 .type = REGULATOR_VOLTAGE,
1520 .id = AB8540_LDO_AUX2,
1521 .owner = THIS_MODULE,
1522 .n_voltages = ARRAY_SIZE(ldo_vauxn_voltages),
1523 .volt_table = ldo_vauxn_voltages,
1526 .update_bank = 0x04,
1528 .update_mask = 0x0c,
1530 .update_val_idle = 0x0c,
1531 .update_val_normal = 0x04,
1532 .voltage_bank = 0x04,
1533 .voltage_reg = 0x20,
1534 .voltage_mask = 0x0f,
1536 [AB8540_LDO_AUX3] = {
1539 .ops = &ab8540_aux3_regulator_volt_mode_ops,
1540 .type = REGULATOR_VOLTAGE,
1541 .id = AB8540_LDO_AUX3,
1542 .owner = THIS_MODULE,
1543 .n_voltages = ARRAY_SIZE(ldo_vaux3_ab8540_voltages),
1544 .volt_table = ldo_vaux3_ab8540_voltages,
1547 .update_bank = 0x04,
1549 .update_mask = 0x03,
1551 .update_val_idle = 0x03,
1552 .update_val_normal = 0x01,
1553 .voltage_bank = 0x04,
1554 .voltage_reg = 0x21,
1555 .voltage_mask = 0x07,
1556 .expand_register = {
1558 .voltage_bank = 0x04,
1559 .voltage_reg = 0x01,
1560 .voltage_mask = 0x10,
1564 [AB8540_LDO_AUX4] = {
1567 .ops = &ab8500_regulator_volt_mode_ops,
1568 .type = REGULATOR_VOLTAGE,
1569 .id = AB8540_LDO_AUX4,
1570 .owner = THIS_MODULE,
1571 .n_voltages = ARRAY_SIZE(ldo_vauxn_voltages),
1572 .volt_table = ldo_vauxn_voltages,
1575 /* values for Vaux4Regu register */
1576 .update_bank = 0x04,
1578 .update_mask = 0x03,
1580 .update_val_idle = 0x03,
1581 .update_val_normal = 0x01,
1582 /* values for Vaux4SEL register */
1583 .voltage_bank = 0x04,
1584 .voltage_reg = 0x2f,
1585 .voltage_mask = 0x0f,
1587 [AB8540_LDO_AUX5] = {
1590 .ops = &ab8500_regulator_volt_mode_ops,
1591 .type = REGULATOR_VOLTAGE,
1592 .id = AB8540_LDO_AUX5,
1593 .owner = THIS_MODULE,
1594 .n_voltages = ARRAY_SIZE(ldo_vaux56_ab8540_voltages),
1596 .load_lp_uA = 20000,
1597 /* values for Vaux5Regu register */
1598 .update_bank = 0x04,
1600 .update_mask = 0x03,
1602 .update_val_idle = 0x03,
1603 .update_val_normal = 0x01,
1604 /* values for Vaux5SEL register */
1605 .voltage_bank = 0x04,
1606 .voltage_reg = 0x33,
1607 .voltage_mask = 0x3f,
1608 .voltages = ldo_vaux56_ab8540_voltages,
1609 .voltages_len = ARRAY_SIZE(ldo_vaux56_ab8540_voltages),
1611 [AB8540_LDO_AUX6] = {
1614 .ops = &ab8500_regulator_volt_mode_ops,
1615 .type = REGULATOR_VOLTAGE,
1616 .id = AB8540_LDO_AUX6,
1617 .owner = THIS_MODULE,
1618 .n_voltages = ARRAY_SIZE(ldo_vaux56_ab8540_voltages),
1620 .load_lp_uA = 20000,
1621 /* values for Vaux6Regu register */
1622 .update_bank = 0x04,
1624 .update_mask = 0x03,
1626 .update_val_idle = 0x03,
1627 .update_val_normal = 0x01,
1628 /* values for Vaux6SEL register */
1629 .voltage_bank = 0x04,
1630 .voltage_reg = 0x36,
1631 .voltage_mask = 0x3f,
1632 .voltages = ldo_vaux56_ab8540_voltages,
1633 .voltages_len = ARRAY_SIZE(ldo_vaux56_ab8540_voltages),
1635 [AB8540_LDO_INTCORE] = {
1637 .name = "LDO-INTCORE",
1638 .ops = &ab8500_regulator_volt_mode_ops,
1639 .type = REGULATOR_VOLTAGE,
1640 .id = AB8540_LDO_INTCORE,
1641 .owner = THIS_MODULE,
1642 .n_voltages = ARRAY_SIZE(ldo_vintcore_voltages),
1643 .volt_table = ldo_vintcore_voltages,
1646 .update_bank = 0x03,
1648 .update_mask = 0x44,
1650 .update_val_idle = 0x44,
1651 .update_val_normal = 0x04,
1652 .voltage_bank = 0x03,
1653 .voltage_reg = 0x80,
1654 .voltage_mask = 0x38,
1659 * Fixed Voltage Regulators
1661 * update bank, reg, mask, enable val
1663 [AB8540_LDO_TVOUT] = {
1665 .name = "LDO-TVOUT",
1666 .ops = &ab8500_regulator_mode_ops,
1667 .type = REGULATOR_VOLTAGE,
1668 .id = AB8540_LDO_TVOUT,
1669 .owner = THIS_MODULE,
1671 .enable_time = 10000,
1674 .update_bank = 0x03,
1676 .update_mask = 0x82,
1678 .update_val_idle = 0x82,
1679 .update_val_normal = 0x02,
1681 [AB8540_LDO_AUDIO] = {
1683 .name = "LDO-AUDIO",
1684 .ops = &ab8500_regulator_ops,
1685 .type = REGULATOR_VOLTAGE,
1686 .id = AB8540_LDO_AUDIO,
1687 .owner = THIS_MODULE,
1689 .volt_table = fixed_2000000_voltage,
1691 .update_bank = 0x03,
1693 .update_mask = 0x02,
1696 [AB8540_LDO_ANAMIC1] = {
1698 .name = "LDO-ANAMIC1",
1699 .ops = &ab8500_regulator_anamic_mode_ops,
1700 .type = REGULATOR_VOLTAGE,
1701 .id = AB8540_LDO_ANAMIC1,
1702 .owner = THIS_MODULE,
1704 .volt_table = fixed_2050000_voltage,
1706 .shared_mode = &ab8540_ldo_anamic1_shared,
1707 .update_bank = 0x03,
1709 .update_mask = 0x08,
1714 .mode_val_idle = 0x20,
1715 .mode_val_normal = 0x00,
1717 [AB8540_LDO_ANAMIC2] = {
1719 .name = "LDO-ANAMIC2",
1720 .ops = &ab8500_regulator_anamic_mode_ops,
1721 .type = REGULATOR_VOLTAGE,
1722 .id = AB8540_LDO_ANAMIC2,
1723 .owner = THIS_MODULE,
1725 .volt_table = fixed_2050000_voltage,
1727 .shared_mode = &ab8540_ldo_anamic2_shared,
1728 .update_bank = 0x03,
1730 .update_mask = 0x10,
1735 .mode_val_idle = 0x20,
1736 .mode_val_normal = 0x00,
1738 [AB8540_LDO_DMIC] = {
1741 .ops = &ab8500_regulator_volt_mode_ops,
1742 .type = REGULATOR_VOLTAGE,
1743 .id = AB8540_LDO_DMIC,
1744 .owner = THIS_MODULE,
1745 .n_voltages = ARRAY_SIZE(ldo_vdmic_voltages),
1748 .update_bank = 0x03,
1750 .update_mask = 0x04,
1752 .voltage_bank = 0x03,
1753 .voltage_reg = 0x83,
1754 .voltage_mask = 0xc0,
1755 .voltages = ldo_vdmic_voltages,
1756 .voltages_len = ARRAY_SIZE(ldo_vdmic_voltages),
1760 * Regulators with fixed voltage and normal/idle modes
1762 [AB8540_LDO_ANA] = {
1765 .ops = &ab8500_regulator_mode_ops,
1766 .type = REGULATOR_VOLTAGE,
1767 .id = AB8540_LDO_ANA,
1768 .owner = THIS_MODULE,
1770 .volt_table = fixed_1200000_voltage,
1773 .update_bank = 0x04,
1775 .update_mask = 0x0c,
1777 .update_val_idle = 0x0c,
1778 .update_val_normal = 0x04,
1780 [AB8540_LDO_SDIO] = {
1783 .ops = &ab8500_regulator_volt_mode_ops,
1784 .type = REGULATOR_VOLTAGE,
1785 .id = AB8540_LDO_SDIO,
1786 .owner = THIS_MODULE,
1787 .n_voltages = ARRAY_SIZE(ldo_sdio_voltages),
1788 .volt_table = ldo_sdio_voltages,
1791 .update_bank = 0x03,
1793 .update_mask = 0x30,
1795 .update_val_idle = 0x30,
1796 .update_val_normal = 0x10,
1797 .voltage_bank = 0x03,
1798 .voltage_reg = 0x88,
1799 .voltage_mask = 0x07,
1803 static struct ab8500_shared_mode ldo_anamic1_shared = {
1804 .shared_regulator = &ab8505_regulator_info[AB8505_LDO_ANAMIC2],
1807 static struct ab8500_shared_mode ldo_anamic2_shared = {
1808 .shared_regulator = &ab8505_regulator_info[AB8505_LDO_ANAMIC1],
1811 static struct ab8500_shared_mode ab8540_ldo_anamic1_shared = {
1812 .shared_regulator = &ab8540_regulator_info[AB8540_LDO_ANAMIC2],
1815 static struct ab8500_shared_mode ab8540_ldo_anamic2_shared = {
1816 .shared_regulator = &ab8540_regulator_info[AB8540_LDO_ANAMIC1],
1819 struct ab8500_reg_init {
1825 #define REG_INIT(_id, _bank, _addr, _mask) \
1832 /* AB8500 register init */
1833 static struct ab8500_reg_init ab8500_reg_init[] = {
1835 * 0x30, VanaRequestCtrl
1836 * 0xc0, VextSupply1RequestCtrl
1838 REG_INIT(AB8500_REGUREQUESTCTRL2, 0x03, 0x04, 0xf0),
1840 * 0x03, VextSupply2RequestCtrl
1841 * 0x0c, VextSupply3RequestCtrl
1842 * 0x30, Vaux1RequestCtrl
1843 * 0xc0, Vaux2RequestCtrl
1845 REG_INIT(AB8500_REGUREQUESTCTRL3, 0x03, 0x05, 0xff),
1847 * 0x03, Vaux3RequestCtrl
1850 REG_INIT(AB8500_REGUREQUESTCTRL4, 0x03, 0x06, 0x07),
1852 * 0x08, VanaSysClkReq1HPValid
1853 * 0x20, Vaux1SysClkReq1HPValid
1854 * 0x40, Vaux2SysClkReq1HPValid
1855 * 0x80, Vaux3SysClkReq1HPValid
1857 REG_INIT(AB8500_REGUSYSCLKREQ1HPVALID1, 0x03, 0x07, 0xe8),
1859 * 0x10, VextSupply1SysClkReq1HPValid
1860 * 0x20, VextSupply2SysClkReq1HPValid
1861 * 0x40, VextSupply3SysClkReq1HPValid
1863 REG_INIT(AB8500_REGUSYSCLKREQ1HPVALID2, 0x03, 0x08, 0x70),
1865 * 0x08, VanaHwHPReq1Valid
1866 * 0x20, Vaux1HwHPReq1Valid
1867 * 0x40, Vaux2HwHPReq1Valid
1868 * 0x80, Vaux3HwHPReq1Valid
1870 REG_INIT(AB8500_REGUHWHPREQ1VALID1, 0x03, 0x09, 0xe8),
1872 * 0x01, VextSupply1HwHPReq1Valid
1873 * 0x02, VextSupply2HwHPReq1Valid
1874 * 0x04, VextSupply3HwHPReq1Valid
1876 REG_INIT(AB8500_REGUHWHPREQ1VALID2, 0x03, 0x0a, 0x07),
1878 * 0x08, VanaHwHPReq2Valid
1879 * 0x20, Vaux1HwHPReq2Valid
1880 * 0x40, Vaux2HwHPReq2Valid
1881 * 0x80, Vaux3HwHPReq2Valid
1883 REG_INIT(AB8500_REGUHWHPREQ2VALID1, 0x03, 0x0b, 0xe8),
1885 * 0x01, VextSupply1HwHPReq2Valid
1886 * 0x02, VextSupply2HwHPReq2Valid
1887 * 0x04, VextSupply3HwHPReq2Valid
1889 REG_INIT(AB8500_REGUHWHPREQ2VALID2, 0x03, 0x0c, 0x07),
1891 * 0x20, VanaSwHPReqValid
1892 * 0x80, Vaux1SwHPReqValid
1894 REG_INIT(AB8500_REGUSWHPREQVALID1, 0x03, 0x0d, 0xa0),
1896 * 0x01, Vaux2SwHPReqValid
1897 * 0x02, Vaux3SwHPReqValid
1898 * 0x04, VextSupply1SwHPReqValid
1899 * 0x08, VextSupply2SwHPReqValid
1900 * 0x10, VextSupply3SwHPReqValid
1902 REG_INIT(AB8500_REGUSWHPREQVALID2, 0x03, 0x0e, 0x1f),
1904 * 0x02, SysClkReq2Valid1
1905 * 0x04, SysClkReq3Valid1
1906 * 0x08, SysClkReq4Valid1
1907 * 0x10, SysClkReq5Valid1
1908 * 0x20, SysClkReq6Valid1
1909 * 0x40, SysClkReq7Valid1
1910 * 0x80, SysClkReq8Valid1
1912 REG_INIT(AB8500_REGUSYSCLKREQVALID1, 0x03, 0x0f, 0xfe),
1914 * 0x02, SysClkReq2Valid2
1915 * 0x04, SysClkReq3Valid2
1916 * 0x08, SysClkReq4Valid2
1917 * 0x10, SysClkReq5Valid2
1918 * 0x20, SysClkReq6Valid2
1919 * 0x40, SysClkReq7Valid2
1920 * 0x80, SysClkReq8Valid2
1922 REG_INIT(AB8500_REGUSYSCLKREQVALID2, 0x03, 0x10, 0xfe),
1925 * 0x04, Vintcore12Ena
1926 * 0x38, Vintcore12Sel
1927 * 0x40, Vintcore12LP
1930 REG_INIT(AB8500_REGUMISC1, 0x03, 0x80, 0xfe),
1937 REG_INIT(AB8500_VAUDIOSUPPLY, 0x03, 0x83, 0x1e),
1939 * 0x01, Vamic1_dzout
1940 * 0x02, Vamic2_dzout
1942 REG_INIT(AB8500_REGUCTRL1VAMIC, 0x03, 0x84, 0x03),
1944 * 0x03, VpllRegu (NOTE! PRCMU register bits)
1947 REG_INIT(AB8500_VPLLVANAREGU, 0x04, 0x06, 0x0f),
1950 * 0x02, VrefDDRSleepMode
1952 REG_INIT(AB8500_VREFDDR, 0x04, 0x07, 0x03),
1954 * 0x03, VextSupply1Regu
1955 * 0x0c, VextSupply2Regu
1956 * 0x30, VextSupply3Regu
1957 * 0x40, ExtSupply2Bypass
1958 * 0x80, ExtSupply3Bypass
1960 REG_INIT(AB8500_EXTSUPPLYREGU, 0x04, 0x08, 0xff),
1965 REG_INIT(AB8500_VAUX12REGU, 0x04, 0x09, 0x0f),
1969 REG_INIT(AB8500_VRF1VAUX3REGU, 0x04, 0x0a, 0x03),
1973 REG_INIT(AB8500_VAUX1SEL, 0x04, 0x1f, 0x0f),
1977 REG_INIT(AB8500_VAUX2SEL, 0x04, 0x20, 0x0f),
1981 REG_INIT(AB8500_VRF1VAUX3SEL, 0x04, 0x21, 0x07),
1983 * 0x01, VextSupply12LP
1985 REG_INIT(AB8500_REGUCTRL2SPARE, 0x04, 0x22, 0x01),
1990 * 0x20, Vintcore12Disch
1994 REG_INIT(AB8500_REGUCTRLDISCH, 0x04, 0x43, 0xfc),
1997 * 0x04, VdmicPullDownEna
2000 REG_INIT(AB8500_REGUCTRLDISCH2, 0x04, 0x44, 0x16),
2003 /* AB8505 register init */
2004 static struct ab8500_reg_init ab8505_reg_init[] = {
2006 * 0x03, VarmRequestCtrl
2007 * 0x0c, VsmpsCRequestCtrl
2008 * 0x30, VsmpsARequestCtrl
2009 * 0xc0, VsmpsBRequestCtrl
2011 REG_INIT(AB8505_REGUREQUESTCTRL1, 0x03, 0x03, 0xff),
2013 * 0x03, VsafeRequestCtrl
2014 * 0x0c, VpllRequestCtrl
2015 * 0x30, VanaRequestCtrl
2017 REG_INIT(AB8505_REGUREQUESTCTRL2, 0x03, 0x04, 0x3f),
2019 * 0x30, Vaux1RequestCtrl
2020 * 0xc0, Vaux2RequestCtrl
2022 REG_INIT(AB8505_REGUREQUESTCTRL3, 0x03, 0x05, 0xf0),
2024 * 0x03, Vaux3RequestCtrl
2027 REG_INIT(AB8505_REGUREQUESTCTRL4, 0x03, 0x06, 0x07),
2029 * 0x01, VsmpsASysClkReq1HPValid
2030 * 0x02, VsmpsBSysClkReq1HPValid
2031 * 0x04, VsafeSysClkReq1HPValid
2032 * 0x08, VanaSysClkReq1HPValid
2033 * 0x10, VpllSysClkReq1HPValid
2034 * 0x20, Vaux1SysClkReq1HPValid
2035 * 0x40, Vaux2SysClkReq1HPValid
2036 * 0x80, Vaux3SysClkReq1HPValid
2038 REG_INIT(AB8505_REGUSYSCLKREQ1HPVALID1, 0x03, 0x07, 0xff),
2040 * 0x01, VsmpsCSysClkReq1HPValid
2041 * 0x02, VarmSysClkReq1HPValid
2042 * 0x04, VbbSysClkReq1HPValid
2043 * 0x08, VsmpsMSysClkReq1HPValid
2045 REG_INIT(AB8505_REGUSYSCLKREQ1HPVALID2, 0x03, 0x08, 0x0f),
2047 * 0x01, VsmpsAHwHPReq1Valid
2048 * 0x02, VsmpsBHwHPReq1Valid
2049 * 0x04, VsafeHwHPReq1Valid
2050 * 0x08, VanaHwHPReq1Valid
2051 * 0x10, VpllHwHPReq1Valid
2052 * 0x20, Vaux1HwHPReq1Valid
2053 * 0x40, Vaux2HwHPReq1Valid
2054 * 0x80, Vaux3HwHPReq1Valid
2056 REG_INIT(AB8505_REGUHWHPREQ1VALID1, 0x03, 0x09, 0xff),
2058 * 0x08, VsmpsMHwHPReq1Valid
2060 REG_INIT(AB8505_REGUHWHPREQ1VALID2, 0x03, 0x0a, 0x08),
2062 * 0x01, VsmpsAHwHPReq2Valid
2063 * 0x02, VsmpsBHwHPReq2Valid
2064 * 0x04, VsafeHwHPReq2Valid
2065 * 0x08, VanaHwHPReq2Valid
2066 * 0x10, VpllHwHPReq2Valid
2067 * 0x20, Vaux1HwHPReq2Valid
2068 * 0x40, Vaux2HwHPReq2Valid
2069 * 0x80, Vaux3HwHPReq2Valid
2071 REG_INIT(AB8505_REGUHWHPREQ2VALID1, 0x03, 0x0b, 0xff),
2073 * 0x08, VsmpsMHwHPReq2Valid
2075 REG_INIT(AB8505_REGUHWHPREQ2VALID2, 0x03, 0x0c, 0x08),
2077 * 0x01, VsmpsCSwHPReqValid
2078 * 0x02, VarmSwHPReqValid
2079 * 0x04, VsmpsASwHPReqValid
2080 * 0x08, VsmpsBSwHPReqValid
2081 * 0x10, VsafeSwHPReqValid
2082 * 0x20, VanaSwHPReqValid
2083 * 0x40, VpllSwHPReqValid
2084 * 0x80, Vaux1SwHPReqValid
2086 REG_INIT(AB8505_REGUSWHPREQVALID1, 0x03, 0x0d, 0xff),
2088 * 0x01, Vaux2SwHPReqValid
2089 * 0x02, Vaux3SwHPReqValid
2090 * 0x20, VsmpsMSwHPReqValid
2092 REG_INIT(AB8505_REGUSWHPREQVALID2, 0x03, 0x0e, 0x23),
2094 * 0x02, SysClkReq2Valid1
2095 * 0x04, SysClkReq3Valid1
2096 * 0x08, SysClkReq4Valid1
2098 REG_INIT(AB8505_REGUSYSCLKREQVALID1, 0x03, 0x0f, 0x0e),
2100 * 0x02, SysClkReq2Valid2
2101 * 0x04, SysClkReq3Valid2
2102 * 0x08, SysClkReq4Valid2
2104 REG_INIT(AB8505_REGUSYSCLKREQVALID2, 0x03, 0x10, 0x0e),
2106 * 0x01, Vaux4SwHPReqValid
2107 * 0x02, Vaux4HwHPReq2Valid
2108 * 0x04, Vaux4HwHPReq1Valid
2109 * 0x08, Vaux4SysClkReq1HPValid
2111 REG_INIT(AB8505_REGUVAUX4REQVALID, 0x03, 0x11, 0x0f),
2114 * 0x04, VintCore12Ena
2115 * 0x38, VintCore12Sel
2116 * 0x40, VintCore12LP
2119 REG_INIT(AB8505_REGUMISC1, 0x03, 0x80, 0xfe),
2126 REG_INIT(AB8505_VAUDIOSUPPLY, 0x03, 0x83, 0x1e),
2128 * 0x01, Vamic1_dzout
2129 * 0x02, Vamic2_dzout
2131 REG_INIT(AB8505_REGUCTRL1VAMIC, 0x03, 0x84, 0x03),
2134 * 0x0c, VsmpsASelCtrl
2135 * 0x10, VsmpsAAutoMode
2136 * 0x20, VsmpsAPWMMode
2138 REG_INIT(AB8505_VSMPSAREGU, 0x04, 0x03, 0x3f),
2141 * 0x0c, VsmpsBSelCtrl
2142 * 0x10, VsmpsBAutoMode
2143 * 0x20, VsmpsBPWMMode
2145 REG_INIT(AB8505_VSMPSBREGU, 0x04, 0x04, 0x3f),
2148 * 0x0c, VsafeSelCtrl
2149 * 0x10, VsafeAutoMode
2150 * 0x20, VsafePWMMode
2152 REG_INIT(AB8505_VSAFEREGU, 0x04, 0x05, 0x3f),
2154 * 0x03, VpllRegu (NOTE! PRCMU register bits)
2157 REG_INIT(AB8505_VPLLVANAREGU, 0x04, 0x06, 0x0f),
2159 * 0x03, VextSupply1Regu
2160 * 0x0c, VextSupply2Regu
2161 * 0x30, VextSupply3Regu
2162 * 0x40, ExtSupply2Bypass
2163 * 0x80, ExtSupply3Bypass
2165 REG_INIT(AB8505_EXTSUPPLYREGU, 0x04, 0x08, 0xff),
2170 REG_INIT(AB8505_VAUX12REGU, 0x04, 0x09, 0x0f),
2174 REG_INIT(AB8505_VRF1VAUX3REGU, 0x04, 0x0a, 0x0f),
2178 REG_INIT(AB8505_VSMPSASEL1, 0x04, 0x13, 0x3f),
2182 REG_INIT(AB8505_VSMPSASEL2, 0x04, 0x14, 0x3f),
2186 REG_INIT(AB8505_VSMPSASEL3, 0x04, 0x15, 0x3f),
2190 REG_INIT(AB8505_VSMPSBSEL1, 0x04, 0x17, 0x3f),
2194 REG_INIT(AB8505_VSMPSBSEL2, 0x04, 0x18, 0x3f),
2198 REG_INIT(AB8505_VSMPSBSEL3, 0x04, 0x19, 0x3f),
2202 REG_INIT(AB8505_VSAFESEL1, 0x04, 0x1b, 0x7f),
2206 REG_INIT(AB8505_VSAFESEL2, 0x04, 0x1c, 0x7f),
2210 REG_INIT(AB8505_VSAFESEL3, 0x04, 0x1d, 0x7f),
2214 REG_INIT(AB8505_VAUX1SEL, 0x04, 0x1f, 0x0f),
2218 REG_INIT(AB8505_VAUX2SEL, 0x04, 0x20, 0x0f),
2223 REG_INIT(AB8505_VRF1VAUX3SEL, 0x04, 0x21, 0x37),
2225 * 0x03, Vaux4RequestCtrl
2227 REG_INIT(AB8505_VAUX4REQCTRL, 0x04, 0x2d, 0x03),
2231 REG_INIT(AB8505_VAUX4REGU, 0x04, 0x2e, 0x03),
2235 REG_INIT(AB8505_VAUX4SEL, 0x04, 0x2f, 0x0f),
2240 * 0x20, Vintcore12Disch
2244 REG_INIT(AB8505_REGUCTRLDISCH, 0x04, 0x43, 0xfc),
2247 * 0x04, VdmicPullDownEna
2250 REG_INIT(AB8505_REGUCTRLDISCH2, 0x04, 0x44, 0x16),
2254 REG_INIT(AB8505_REGUCTRLDISCH3, 0x04, 0x48, 0x01),
2260 * 0x40, Vaux5DisSfst
2261 * 0x80, Vaux5DisPulld
2263 REG_INIT(AB8505_CTRLVAUX5, 0x01, 0x55, 0xff),
2268 * 0x80, Vaux6DisPulld
2270 REG_INIT(AB8505_CTRLVAUX6, 0x01, 0x56, 0x9f),
2273 /* AB9540 register init */
2274 static struct ab8500_reg_init ab9540_reg_init[] = {
2276 * 0x03, VarmRequestCtrl
2277 * 0x0c, VapeRequestCtrl
2278 * 0x30, Vsmps1RequestCtrl
2279 * 0xc0, Vsmps2RequestCtrl
2281 REG_INIT(AB9540_REGUREQUESTCTRL1, 0x03, 0x03, 0xff),
2283 * 0x03, Vsmps3RequestCtrl
2284 * 0x0c, VpllRequestCtrl
2285 * 0x30, VanaRequestCtrl
2286 * 0xc0, VextSupply1RequestCtrl
2288 REG_INIT(AB9540_REGUREQUESTCTRL2, 0x03, 0x04, 0xff),
2290 * 0x03, VextSupply2RequestCtrl
2291 * 0x0c, VextSupply3RequestCtrl
2292 * 0x30, Vaux1RequestCtrl
2293 * 0xc0, Vaux2RequestCtrl
2295 REG_INIT(AB9540_REGUREQUESTCTRL3, 0x03, 0x05, 0xff),
2297 * 0x03, Vaux3RequestCtrl
2300 REG_INIT(AB9540_REGUREQUESTCTRL4, 0x03, 0x06, 0x07),
2302 * 0x01, Vsmps1SysClkReq1HPValid
2303 * 0x02, Vsmps2SysClkReq1HPValid
2304 * 0x04, Vsmps3SysClkReq1HPValid
2305 * 0x08, VanaSysClkReq1HPValid
2306 * 0x10, VpllSysClkReq1HPValid
2307 * 0x20, Vaux1SysClkReq1HPValid
2308 * 0x40, Vaux2SysClkReq1HPValid
2309 * 0x80, Vaux3SysClkReq1HPValid
2311 REG_INIT(AB9540_REGUSYSCLKREQ1HPVALID1, 0x03, 0x07, 0xff),
2313 * 0x01, VapeSysClkReq1HPValid
2314 * 0x02, VarmSysClkReq1HPValid
2315 * 0x04, VbbSysClkReq1HPValid
2316 * 0x08, VmodSysClkReq1HPValid
2317 * 0x10, VextSupply1SysClkReq1HPValid
2318 * 0x20, VextSupply2SysClkReq1HPValid
2319 * 0x40, VextSupply3SysClkReq1HPValid
2321 REG_INIT(AB9540_REGUSYSCLKREQ1HPVALID2, 0x03, 0x08, 0x7f),
2323 * 0x01, Vsmps1HwHPReq1Valid
2324 * 0x02, Vsmps2HwHPReq1Valid
2325 * 0x04, Vsmps3HwHPReq1Valid
2326 * 0x08, VanaHwHPReq1Valid
2327 * 0x10, VpllHwHPReq1Valid
2328 * 0x20, Vaux1HwHPReq1Valid
2329 * 0x40, Vaux2HwHPReq1Valid
2330 * 0x80, Vaux3HwHPReq1Valid
2332 REG_INIT(AB9540_REGUHWHPREQ1VALID1, 0x03, 0x09, 0xff),
2334 * 0x01, VextSupply1HwHPReq1Valid
2335 * 0x02, VextSupply2HwHPReq1Valid
2336 * 0x04, VextSupply3HwHPReq1Valid
2337 * 0x08, VmodHwHPReq1Valid
2339 REG_INIT(AB9540_REGUHWHPREQ1VALID2, 0x03, 0x0a, 0x0f),
2341 * 0x01, Vsmps1HwHPReq2Valid
2342 * 0x02, Vsmps2HwHPReq2Valid
2343 * 0x03, Vsmps3HwHPReq2Valid
2344 * 0x08, VanaHwHPReq2Valid
2345 * 0x10, VpllHwHPReq2Valid
2346 * 0x20, Vaux1HwHPReq2Valid
2347 * 0x40, Vaux2HwHPReq2Valid
2348 * 0x80, Vaux3HwHPReq2Valid
2350 REG_INIT(AB9540_REGUHWHPREQ2VALID1, 0x03, 0x0b, 0xff),
2352 * 0x01, VextSupply1HwHPReq2Valid
2353 * 0x02, VextSupply2HwHPReq2Valid
2354 * 0x04, VextSupply3HwHPReq2Valid
2355 * 0x08, VmodHwHPReq2Valid
2357 REG_INIT(AB9540_REGUHWHPREQ2VALID2, 0x03, 0x0c, 0x0f),
2359 * 0x01, VapeSwHPReqValid
2360 * 0x02, VarmSwHPReqValid
2361 * 0x04, Vsmps1SwHPReqValid
2362 * 0x08, Vsmps2SwHPReqValid
2363 * 0x10, Vsmps3SwHPReqValid
2364 * 0x20, VanaSwHPReqValid
2365 * 0x40, VpllSwHPReqValid
2366 * 0x80, Vaux1SwHPReqValid
2368 REG_INIT(AB9540_REGUSWHPREQVALID1, 0x03, 0x0d, 0xff),
2370 * 0x01, Vaux2SwHPReqValid
2371 * 0x02, Vaux3SwHPReqValid
2372 * 0x04, VextSupply1SwHPReqValid
2373 * 0x08, VextSupply2SwHPReqValid
2374 * 0x10, VextSupply3SwHPReqValid
2375 * 0x20, VmodSwHPReqValid
2377 REG_INIT(AB9540_REGUSWHPREQVALID2, 0x03, 0x0e, 0x3f),
2379 * 0x02, SysClkReq2Valid1
2381 * 0x80, SysClkReq8Valid1
2383 REG_INIT(AB9540_REGUSYSCLKREQVALID1, 0x03, 0x0f, 0xfe),
2385 * 0x02, SysClkReq2Valid2
2387 * 0x80, SysClkReq8Valid2
2389 REG_INIT(AB9540_REGUSYSCLKREQVALID2, 0x03, 0x10, 0xfe),
2391 * 0x01, Vaux4SwHPReqValid
2392 * 0x02, Vaux4HwHPReq2Valid
2393 * 0x04, Vaux4HwHPReq1Valid
2394 * 0x08, Vaux4SysClkReq1HPValid
2396 REG_INIT(AB9540_REGUVAUX4REQVALID, 0x03, 0x11, 0x0f),
2399 * 0x04, Vintcore12Ena
2400 * 0x38, Vintcore12Sel
2401 * 0x40, Vintcore12LP
2404 REG_INIT(AB9540_REGUMISC1, 0x03, 0x80, 0xfe),
2411 REG_INIT(AB9540_VAUDIOSUPPLY, 0x03, 0x83, 0x1e),
2413 * 0x01, Vamic1_dzout
2414 * 0x02, Vamic2_dzout
2416 REG_INIT(AB9540_REGUCTRL1VAMIC, 0x03, 0x84, 0x03),
2419 * 0x0c, Vsmps1SelCtrl
2420 * 0x10, Vsmps1AutoMode
2421 * 0x20, Vsmps1PWMMode
2423 REG_INIT(AB9540_VSMPS1REGU, 0x04, 0x03, 0x3f),
2426 * 0x0c, Vsmps2SelCtrl
2427 * 0x10, Vsmps2AutoMode
2428 * 0x20, Vsmps2PWMMode
2430 REG_INIT(AB9540_VSMPS2REGU, 0x04, 0x04, 0x3f),
2433 * 0x0c, Vsmps3SelCtrl
2434 * NOTE! PRCMU register
2436 REG_INIT(AB9540_VSMPS3REGU, 0x04, 0x05, 0x0f),
2441 REG_INIT(AB9540_VPLLVANAREGU, 0x04, 0x06, 0x0f),
2443 * 0x03, VextSupply1Regu
2444 * 0x0c, VextSupply2Regu
2445 * 0x30, VextSupply3Regu
2446 * 0x40, ExtSupply2Bypass
2447 * 0x80, ExtSupply3Bypass
2449 REG_INIT(AB9540_EXTSUPPLYREGU, 0x04, 0x08, 0xff),
2454 REG_INIT(AB9540_VAUX12REGU, 0x04, 0x09, 0x0f),
2459 REG_INIT(AB9540_VRF1VAUX3REGU, 0x04, 0x0a, 0x0f),
2463 REG_INIT(AB9540_VSMPS1SEL1, 0x04, 0x13, 0x3f),
2467 REG_INIT(AB9540_VSMPS1SEL2, 0x04, 0x14, 0x3f),
2471 REG_INIT(AB9540_VSMPS1SEL3, 0x04, 0x15, 0x3f),
2475 REG_INIT(AB9540_VSMPS2SEL1, 0x04, 0x17, 0x3f),
2479 REG_INIT(AB9540_VSMPS2SEL2, 0x04, 0x18, 0x3f),
2483 REG_INIT(AB9540_VSMPS2SEL3, 0x04, 0x19, 0x3f),
2486 * NOTE! PRCMU register
2488 REG_INIT(AB9540_VSMPS3SEL1, 0x04, 0x1b, 0x7f),
2491 * NOTE! PRCMU register
2493 REG_INIT(AB9540_VSMPS3SEL2, 0x04, 0x1c, 0x7f),
2497 REG_INIT(AB9540_VAUX1SEL, 0x04, 0x1f, 0x0f),
2501 REG_INIT(AB9540_VAUX2SEL, 0x04, 0x20, 0x0f),
2506 REG_INIT(AB9540_VRF1VAUX3SEL, 0x04, 0x21, 0x37),
2508 * 0x01, VextSupply12LP
2510 REG_INIT(AB9540_REGUCTRL2SPARE, 0x04, 0x22, 0x01),
2512 * 0x03, Vaux4RequestCtrl
2514 REG_INIT(AB9540_VAUX4REQCTRL, 0x04, 0x2d, 0x03),
2518 REG_INIT(AB9540_VAUX4REGU, 0x04, 0x2e, 0x03),
2522 REG_INIT(AB9540_VAUX4SEL, 0x04, 0x2f, 0x0f),
2529 * 0x20, Vintcore12Disch
2533 REG_INIT(AB9540_REGUCTRLDISCH, 0x04, 0x43, 0xff),
2537 * 0x04, VdmicPullDownEna
2538 * 0x08, VpllPullDownEna
2541 REG_INIT(AB9540_REGUCTRLDISCH2, 0x04, 0x44, 0x1f),
2545 REG_INIT(AB9540_REGUCTRLDISCH3, 0x04, 0x48, 0x01),
2548 /* AB8540 register init */
2549 static struct ab8500_reg_init ab8540_reg_init[] = {
2551 * 0x01, VSimSycClkReq1Valid
2552 * 0x02, VSimSycClkReq2Valid
2553 * 0x04, VSimSycClkReq3Valid
2554 * 0x08, VSimSycClkReq4Valid
2555 * 0x10, VSimSycClkReq5Valid
2556 * 0x20, VSimSycClkReq6Valid
2557 * 0x40, VSimSycClkReq7Valid
2558 * 0x80, VSimSycClkReq8Valid
2560 REG_INIT(AB8540_VSIMSYSCLKCTRL, 0x02, 0x33, 0xff),
2562 * 0x03, VarmRequestCtrl
2563 * 0x0c, VapeRequestCtrl
2564 * 0x30, Vsmps1RequestCtrl
2565 * 0xc0, Vsmps2RequestCtrl
2567 REG_INIT(AB8540_REGUREQUESTCTRL1, 0x03, 0x03, 0xff),
2569 * 0x03, Vsmps3RequestCtrl
2570 * 0x0c, VpllRequestCtrl
2571 * 0x30, VanaRequestCtrl
2572 * 0xc0, VextSupply1RequestCtrl
2574 REG_INIT(AB8540_REGUREQUESTCTRL2, 0x03, 0x04, 0xff),
2576 * 0x03, VextSupply2RequestCtrl
2577 * 0x0c, VextSupply3RequestCtrl
2578 * 0x30, Vaux1RequestCtrl
2579 * 0xc0, Vaux2RequestCtrl
2581 REG_INIT(AB8540_REGUREQUESTCTRL3, 0x03, 0x05, 0xff),
2583 * 0x03, Vaux3RequestCtrl
2586 REG_INIT(AB8540_REGUREQUESTCTRL4, 0x03, 0x06, 0x07),
2588 * 0x01, Vsmps1SysClkReq1HPValid
2589 * 0x02, Vsmps2SysClkReq1HPValid
2590 * 0x04, Vsmps3SysClkReq1HPValid
2591 * 0x08, VanaSysClkReq1HPValid
2592 * 0x10, VpllSysClkReq1HPValid
2593 * 0x20, Vaux1SysClkReq1HPValid
2594 * 0x40, Vaux2SysClkReq1HPValid
2595 * 0x80, Vaux3SysClkReq1HPValid
2597 REG_INIT(AB8540_REGUSYSCLKREQ1HPVALID1, 0x03, 0x07, 0xff),
2599 * 0x01, VapeSysClkReq1HPValid
2600 * 0x02, VarmSysClkReq1HPValid
2601 * 0x04, VbbSysClkReq1HPValid
2602 * 0x10, VextSupply1SysClkReq1HPValid
2603 * 0x20, VextSupply2SysClkReq1HPValid
2604 * 0x40, VextSupply3SysClkReq1HPValid
2606 REG_INIT(AB8540_REGUSYSCLKREQ1HPVALID2, 0x03, 0x08, 0x77),
2608 * 0x01, Vsmps1HwHPReq1Valid
2609 * 0x02, Vsmps2HwHPReq1Valid
2610 * 0x04, Vsmps3HwHPReq1Valid
2611 * 0x08, VanaHwHPReq1Valid
2612 * 0x10, VpllHwHPReq1Valid
2613 * 0x20, Vaux1HwHPReq1Valid
2614 * 0x40, Vaux2HwHPReq1Valid
2615 * 0x80, Vaux3HwHPReq1Valid
2617 REG_INIT(AB8540_REGUHWHPREQ1VALID1, 0x03, 0x09, 0xff),
2619 * 0x01, VextSupply1HwHPReq1Valid
2620 * 0x02, VextSupply2HwHPReq1Valid
2621 * 0x04, VextSupply3HwHPReq1Valid
2623 REG_INIT(AB8540_REGUHWHPREQ1VALID2, 0x03, 0x0a, 0x07),
2625 * 0x01, Vsmps1HwHPReq2Valid
2626 * 0x02, Vsmps2HwHPReq2Valid
2627 * 0x03, Vsmps3HwHPReq2Valid
2628 * 0x08, VanaHwHPReq2Valid
2629 * 0x10, VpllHwHPReq2Valid
2630 * 0x20, Vaux1HwHPReq2Valid
2631 * 0x40, Vaux2HwHPReq2Valid
2632 * 0x80, Vaux3HwHPReq2Valid
2634 REG_INIT(AB8540_REGUHWHPREQ2VALID1, 0x03, 0x0b, 0xff),
2636 * 0x01, VextSupply1HwHPReq2Valid
2637 * 0x02, VextSupply2HwHPReq2Valid
2638 * 0x04, VextSupply3HwHPReq2Valid
2640 REG_INIT(AB8540_REGUHWHPREQ2VALID2, 0x03, 0x0c, 0x07),
2642 * 0x01, VapeSwHPReqValid
2643 * 0x02, VarmSwHPReqValid
2644 * 0x04, Vsmps1SwHPReqValid
2645 * 0x08, Vsmps2SwHPReqValid
2646 * 0x10, Vsmps3SwHPReqValid
2647 * 0x20, VanaSwHPReqValid
2648 * 0x40, VpllSwHPReqValid
2649 * 0x80, Vaux1SwHPReqValid
2651 REG_INIT(AB8540_REGUSWHPREQVALID1, 0x03, 0x0d, 0xff),
2653 * 0x01, Vaux2SwHPReqValid
2654 * 0x02, Vaux3SwHPReqValid
2655 * 0x04, VextSupply1SwHPReqValid
2656 * 0x08, VextSupply2SwHPReqValid
2657 * 0x10, VextSupply3SwHPReqValid
2659 REG_INIT(AB8540_REGUSWHPREQVALID2, 0x03, 0x0e, 0x1f),
2661 * 0x02, SysClkReq2Valid1
2663 * 0x80, SysClkReq8Valid1
2665 REG_INIT(AB8540_REGUSYSCLKREQVALID1, 0x03, 0x0f, 0xff),
2667 * 0x02, SysClkReq2Valid2
2669 * 0x80, SysClkReq8Valid2
2671 REG_INIT(AB8540_REGUSYSCLKREQVALID2, 0x03, 0x10, 0xff),
2673 * 0x01, Vaux4SwHPReqValid
2674 * 0x02, Vaux4HwHPReq2Valid
2675 * 0x04, Vaux4HwHPReq1Valid
2676 * 0x08, Vaux4SysClkReq1HPValid
2678 REG_INIT(AB8540_REGUVAUX4REQVALID, 0x03, 0x11, 0x0f),
2680 * 0x01, Vaux5SwHPReqValid
2681 * 0x02, Vaux5HwHPReq2Valid
2682 * 0x04, Vaux5HwHPReq1Valid
2683 * 0x08, Vaux5SysClkReq1HPValid
2685 REG_INIT(AB8540_REGUVAUX5REQVALID, 0x03, 0x12, 0x0f),
2687 * 0x01, Vaux6SwHPReqValid
2688 * 0x02, Vaux6HwHPReq2Valid
2689 * 0x04, Vaux6HwHPReq1Valid
2690 * 0x08, Vaux6SysClkReq1HPValid
2692 REG_INIT(AB8540_REGUVAUX6REQVALID, 0x03, 0x13, 0x0f),
2694 * 0x01, VclkbSwHPReqValid
2695 * 0x02, VclkbHwHPReq2Valid
2696 * 0x04, VclkbHwHPReq1Valid
2697 * 0x08, VclkbSysClkReq1HPValid
2699 REG_INIT(AB8540_REGUVCLKBREQVALID, 0x03, 0x14, 0x0f),
2701 * 0x01, Vrf1SwHPReqValid
2702 * 0x02, Vrf1HwHPReq2Valid
2703 * 0x04, Vrf1HwHPReq1Valid
2704 * 0x08, Vrf1SysClkReq1HPValid
2706 REG_INIT(AB8540_REGUVRF1REQVALID, 0x03, 0x15, 0x0f),
2709 * 0x04, Vintcore12Ena
2710 * 0x38, Vintcore12Sel
2711 * 0x40, Vintcore12LP
2714 REG_INIT(AB8540_REGUMISC1, 0x03, 0x80, 0xfe),
2723 REG_INIT(AB8540_VAUDIOSUPPLY, 0x03, 0x83, 0xfe),
2725 * 0x01, Vamic1_dzout
2726 * 0x02, Vamic2_dzout
2728 REG_INIT(AB8540_REGUCTRL1VAMIC, 0x03, 0x84, 0x03),
2731 * 0x08, VHSICOffState
2735 REG_INIT(AB8540_VHSIC, 0x03, 0x87, 0x3f),
2738 * 0x08, VSDIOOffState
2742 REG_INIT(AB8540_VSDIO, 0x03, 0x88, 0x3f),
2745 * 0x0c, Vsmps1SelCtrl
2746 * 0x10, Vsmps1AutoMode
2747 * 0x20, Vsmps1PWMMode
2749 REG_INIT(AB8540_VSMPS1REGU, 0x04, 0x03, 0x3f),
2752 * 0x0c, Vsmps2SelCtrl
2753 * 0x10, Vsmps2AutoMode
2754 * 0x20, Vsmps2PWMMode
2756 REG_INIT(AB8540_VSMPS2REGU, 0x04, 0x04, 0x3f),
2759 * 0x0c, Vsmps3SelCtrl
2760 * 0x10, Vsmps3AutoMode
2761 * 0x20, Vsmps3PWMMode
2762 * NOTE! PRCMU register
2764 REG_INIT(AB8540_VSMPS3REGU, 0x04, 0x05, 0x0f),
2769 REG_INIT(AB8540_VPLLVANAREGU, 0x04, 0x06, 0x0f),
2771 * 0x03, VextSupply1Regu
2772 * 0x0c, VextSupply2Regu
2773 * 0x30, VextSupply3Regu
2774 * 0x40, ExtSupply2Bypass
2775 * 0x80, ExtSupply3Bypass
2777 REG_INIT(AB8540_EXTSUPPLYREGU, 0x04, 0x08, 0xff),
2782 REG_INIT(AB8540_VAUX12REGU, 0x04, 0x09, 0x0f),
2787 REG_INIT(AB8540_VRF1VAUX3REGU, 0x04, 0x0a, 0x0f),
2791 REG_INIT(AB8540_VSMPS1SEL1, 0x04, 0x13, 0x3f),
2795 REG_INIT(AB8540_VSMPS1SEL2, 0x04, 0x14, 0x3f),
2799 REG_INIT(AB8540_VSMPS1SEL3, 0x04, 0x15, 0x3f),
2803 REG_INIT(AB8540_VSMPS2SEL1, 0x04, 0x17, 0x3f),
2807 REG_INIT(AB8540_VSMPS2SEL2, 0x04, 0x18, 0x3f),
2811 REG_INIT(AB8540_VSMPS2SEL3, 0x04, 0x19, 0x3f),
2814 * NOTE! PRCMU register
2816 REG_INIT(AB8540_VSMPS3SEL1, 0x04, 0x1b, 0x7f),
2819 * NOTE! PRCMU register
2821 REG_INIT(AB8540_VSMPS3SEL2, 0x04, 0x1c, 0x7f),
2825 REG_INIT(AB8540_VAUX1SEL, 0x04, 0x1f, 0x0f),
2829 REG_INIT(AB8540_VAUX2SEL, 0x04, 0x20, 0x0f),
2834 REG_INIT(AB8540_VRF1VAUX3SEL, 0x04, 0x21, 0x77),
2836 * 0x01, VextSupply12LP
2838 REG_INIT(AB8540_REGUCTRL2SPARE, 0x04, 0x22, 0x01),
2843 REG_INIT(AB8540_VANAVPLLSEL, 0x04, 0x29, 0x37),
2845 * 0x03, Vaux4RequestCtrl
2847 REG_INIT(AB8540_VAUX4REQCTRL, 0x04, 0x2d, 0x03),
2851 REG_INIT(AB8540_VAUX4REGU, 0x04, 0x2e, 0x03),
2855 REG_INIT(AB8540_VAUX4SEL, 0x04, 0x2f, 0x0f),
2857 * 0x03, Vaux5RequestCtrl
2859 REG_INIT(AB8540_VAUX5REQCTRL, 0x04, 0x31, 0x03),
2863 REG_INIT(AB8540_VAUX5REGU, 0x04, 0x32, 0x03),
2867 REG_INIT(AB8540_VAUX5SEL, 0x04, 0x33, 0x3f),
2869 * 0x03, Vaux6RequestCtrl
2871 REG_INIT(AB8540_VAUX6REQCTRL, 0x04, 0x34, 0x03),
2875 REG_INIT(AB8540_VAUX6REGU, 0x04, 0x35, 0x03),
2879 REG_INIT(AB8540_VAUX6SEL, 0x04, 0x36, 0x3f),
2881 * 0x03, VCLKBRequestCtrl
2883 REG_INIT(AB8540_VCLKBREQCTRL, 0x04, 0x37, 0x03),
2887 REG_INIT(AB8540_VCLKBREGU, 0x04, 0x38, 0x03),
2891 REG_INIT(AB8540_VCLKBSEL, 0x04, 0x39, 0x07),
2893 * 0x03, Vrf1RequestCtrl
2895 REG_INIT(AB8540_VRF1REQCTRL, 0x04, 0x3a, 0x03),
2902 * 0x20, Vintcore12Disch
2906 REG_INIT(AB8540_REGUCTRLDISCH, 0x04, 0x43, 0xff),
2909 * 0x04, VdmicPullDownEna
2910 * 0x08, VpllPullDownEna
2913 REG_INIT(AB8540_REGUCTRLDISCH2, 0x04, 0x44, 0x1e),
2917 REG_INIT(AB8540_REGUCTRLDISCH3, 0x04, 0x48, 0x01),
2923 REG_INIT(AB8540_REGUCTRLDISCH4, 0x04, 0x49, 0x07),
2927 struct ab8500_regulator_info *info;
2929 struct ab8500_reg_init *init;
2931 struct of_regulator_match *match;
2935 static int ab8500_regulator_init_registers(struct platform_device *pdev,
2936 int id, int mask, int value)
2938 struct ab8500_reg_init *reg_init = abx500_regulator.init;
2941 BUG_ON(value & ~mask);
2942 BUG_ON(mask & ~reg_init[id].mask);
2944 /* initialize register */
2945 err = abx500_mask_and_set_register_interruptible(
2952 "Failed to initialize 0x%02x, 0x%02x.\n",
2957 dev_vdbg(&pdev->dev,
2958 " init: 0x%02x, 0x%02x, 0x%02x, 0x%02x\n",
2966 static int ab8500_regulator_register(struct platform_device *pdev,
2967 struct regulator_init_data *init_data,
2968 int id, struct device_node *np)
2970 struct ab8500 *ab8500 = dev_get_drvdata(pdev->dev.parent);
2971 struct ab8500_regulator_info *info = NULL;
2972 struct regulator_config config = { };
2975 /* assign per-regulator data */
2976 info = &abx500_regulator.info[id];
2977 info->dev = &pdev->dev;
2979 config.dev = &pdev->dev;
2980 config.init_data = init_data;
2981 config.driver_data = info;
2982 config.of_node = np;
2984 /* fix for hardware before ab8500v2.0 */
2985 if (is_ab8500_1p1_or_earlier(ab8500)) {
2986 if (info->desc.id == AB8500_LDO_AUX3) {
2987 info->desc.n_voltages =
2988 ARRAY_SIZE(ldo_vauxn_voltages);
2989 info->desc.volt_table = ldo_vauxn_voltages;
2990 info->voltage_mask = 0xf;
2994 /* register regulator with framework */
2995 info->regulator = regulator_register(&info->desc, &config);
2996 if (IS_ERR(info->regulator)) {
2997 err = PTR_ERR(info->regulator);
2998 dev_err(&pdev->dev, "failed to register regulator %s\n",
3000 /* when we fail, un-register all earlier regulators */
3002 info = &abx500_regulator.info[id];
3003 regulator_unregister(info->regulator);
3011 static struct of_regulator_match ab8500_regulator_match[] = {
3012 { .name = "ab8500_ldo_aux1", .driver_data = (void *) AB8500_LDO_AUX1, },
3013 { .name = "ab8500_ldo_aux2", .driver_data = (void *) AB8500_LDO_AUX2, },
3014 { .name = "ab8500_ldo_aux3", .driver_data = (void *) AB8500_LDO_AUX3, },
3015 { .name = "ab8500_ldo_intcore", .driver_data = (void *) AB8500_LDO_INTCORE, },
3016 { .name = "ab8500_ldo_tvout", .driver_data = (void *) AB8500_LDO_TVOUT, },
3017 { .name = "ab8500_ldo_audio", .driver_data = (void *) AB8500_LDO_AUDIO, },
3018 { .name = "ab8500_ldo_anamic1", .driver_data = (void *) AB8500_LDO_ANAMIC1, },
3019 { .name = "ab8500_ldo_amamic2", .driver_data = (void *) AB8500_LDO_ANAMIC2, },
3020 { .name = "ab8500_ldo_dmic", .driver_data = (void *) AB8500_LDO_DMIC, },
3021 { .name = "ab8500_ldo_ana", .driver_data = (void *) AB8500_LDO_ANA, },
3024 static struct of_regulator_match ab8505_regulator_match[] = {
3025 { .name = "ab8500_ldo_aux1", .driver_data = (void *) AB8505_LDO_AUX1, },
3026 { .name = "ab8500_ldo_aux2", .driver_data = (void *) AB8505_LDO_AUX2, },
3027 { .name = "ab8500_ldo_aux3", .driver_data = (void *) AB8505_LDO_AUX3, },
3028 { .name = "ab8500_ldo_aux4", .driver_data = (void *) AB8505_LDO_AUX4, },
3029 { .name = "ab8500_ldo_aux5", .driver_data = (void *) AB8505_LDO_AUX5, },
3030 { .name = "ab8500_ldo_aux6", .driver_data = (void *) AB8505_LDO_AUX6, },
3031 { .name = "ab8500_ldo_intcore", .driver_data = (void *) AB8505_LDO_INTCORE, },
3032 { .name = "ab8500_ldo_adc", .driver_data = (void *) AB8505_LDO_ADC, },
3033 { .name = "ab8500_ldo_audio", .driver_data = (void *) AB8505_LDO_AUDIO, },
3034 { .name = "ab8500_ldo_anamic1", .driver_data = (void *) AB8505_LDO_ANAMIC1, },
3035 { .name = "ab8500_ldo_amamic2", .driver_data = (void *) AB8505_LDO_ANAMIC2, },
3036 { .name = "ab8500_ldo_aux8", .driver_data = (void *) AB8505_LDO_AUX8, },
3037 { .name = "ab8500_ldo_ana", .driver_data = (void *) AB8505_LDO_ANA, },
3040 static struct of_regulator_match ab8540_regulator_match[] = {
3041 { .name = "ab8500_ldo_aux1", .driver_data = (void *) AB8540_LDO_AUX1, },
3042 { .name = "ab8500_ldo_aux2", .driver_data = (void *) AB8540_LDO_AUX2, },
3043 { .name = "ab8500_ldo_aux3", .driver_data = (void *) AB8540_LDO_AUX3, },
3044 { .name = "ab8500_ldo_aux4", .driver_data = (void *) AB8540_LDO_AUX4, },
3045 { .name = "ab8500_ldo_aux5", .driver_data = (void *) AB8540_LDO_AUX5, },
3046 { .name = "ab8500_ldo_aux6", .driver_data = (void *) AB8540_LDO_AUX6, },
3047 { .name = "ab8500_ldo_intcore", .driver_data = (void *) AB8540_LDO_INTCORE, },
3048 { .name = "ab8500_ldo_tvout", .driver_data = (void *) AB8540_LDO_TVOUT, },
3049 { .name = "ab8500_ldo_audio", .driver_data = (void *) AB8540_LDO_AUDIO, },
3050 { .name = "ab8500_ldo_anamic1", .driver_data = (void *) AB8540_LDO_ANAMIC1, },
3051 { .name = "ab8500_ldo_amamic2", .driver_data = (void *) AB8540_LDO_ANAMIC2, },
3052 { .name = "ab8500_ldo_dmic", .driver_data = (void *) AB8540_LDO_DMIC, },
3053 { .name = "ab8500_ldo_ana", .driver_data = (void *) AB8540_LDO_ANA, },
3054 { .name = "ab8500_ldo_sdio", .driver_data = (void *) AB8540_LDO_SDIO, },
3057 static struct of_regulator_match ab9540_regulator_match[] = {
3058 { .name = "ab8500_ldo_aux1", .driver_data = (void *) AB9540_LDO_AUX1, },
3059 { .name = "ab8500_ldo_aux2", .driver_data = (void *) AB9540_LDO_AUX2, },
3060 { .name = "ab8500_ldo_aux3", .driver_data = (void *) AB9540_LDO_AUX3, },
3061 { .name = "ab8500_ldo_aux4", .driver_data = (void *) AB9540_LDO_AUX4, },
3062 { .name = "ab8500_ldo_intcore", .driver_data = (void *) AB9540_LDO_INTCORE, },
3063 { .name = "ab8500_ldo_tvout", .driver_data = (void *) AB9540_LDO_TVOUT, },
3064 { .name = "ab8500_ldo_audio", .driver_data = (void *) AB9540_LDO_AUDIO, },
3065 { .name = "ab8500_ldo_anamic1", .driver_data = (void *) AB9540_LDO_ANAMIC1, },
3066 { .name = "ab8500_ldo_amamic2", .driver_data = (void *) AB9540_LDO_ANAMIC2, },
3067 { .name = "ab8500_ldo_dmic", .driver_data = (void *) AB9540_LDO_DMIC, },
3068 { .name = "ab8500_ldo_ana", .driver_data = (void *) AB9540_LDO_ANA, },
3071 static void abx500_get_regulator_info(struct ab8500 *ab8500)
3073 if (is_ab9540(ab8500)) {
3074 abx500_regulator.info = ab9540_regulator_info;
3075 abx500_regulator.info_size = ARRAY_SIZE(ab9540_regulator_info);
3076 abx500_regulator.init = ab9540_reg_init;
3077 abx500_regulator.init_size = AB9540_NUM_REGULATOR_REGISTERS;
3078 abx500_regulator.match = ab9540_regulator_match;
3079 abx500_regulator.match_size = ARRAY_SIZE(ab9540_regulator_match);
3080 } else if (is_ab8505(ab8500)) {
3081 abx500_regulator.info = ab8505_regulator_info;
3082 abx500_regulator.info_size = ARRAY_SIZE(ab8505_regulator_info);
3083 abx500_regulator.init = ab8505_reg_init;
3084 abx500_regulator.init_size = AB8505_NUM_REGULATOR_REGISTERS;
3085 abx500_regulator.match = ab8505_regulator_match;
3086 abx500_regulator.match_size = ARRAY_SIZE(ab8505_regulator_match);
3087 } else if (is_ab8540(ab8500)) {
3088 abx500_regulator.info = ab8540_regulator_info;
3089 abx500_regulator.info_size = ARRAY_SIZE(ab8540_regulator_info);
3090 abx500_regulator.init = ab8540_reg_init;
3091 abx500_regulator.init_size = AB8540_NUM_REGULATOR_REGISTERS;
3092 abx500_regulator.match = ab8540_regulator_match;
3093 abx500_regulator.match_size = ARRAY_SIZE(ab8540_regulator_match);
3095 abx500_regulator.info = ab8500_regulator_info;
3096 abx500_regulator.info_size = ARRAY_SIZE(ab8500_regulator_info);
3097 abx500_regulator.init = ab8500_reg_init;
3098 abx500_regulator.init_size = AB8500_NUM_REGULATOR_REGISTERS;
3099 abx500_regulator.match = ab8500_regulator_match;
3100 abx500_regulator.match_size = ARRAY_SIZE(ab8500_regulator_match);
3105 ab8500_regulator_of_probe(struct platform_device *pdev,
3106 struct device_node *np)
3108 struct of_regulator_match *match = abx500_regulator.match;
3111 for (i = 0; i < abx500_regulator.info_size; i++) {
3112 err = ab8500_regulator_register(
3113 pdev, match[i].init_data, i, match[i].of_node);
3121 static int ab8500_regulator_probe(struct platform_device *pdev)
3123 struct ab8500 *ab8500 = dev_get_drvdata(pdev->dev.parent);
3124 struct device_node *np = pdev->dev.of_node;
3125 struct ab8500_platform_data *ppdata;
3126 struct ab8500_regulator_platform_data *pdata;
3130 dev_err(&pdev->dev, "null mfd parent\n");
3134 abx500_get_regulator_info(ab8500);
3137 err = of_regulator_match(&pdev->dev, np,
3138 abx500_regulator.match,
3139 abx500_regulator.match_size);
3142 "Error parsing regulator init data: %d\n", err);
3146 err = ab8500_regulator_of_probe(pdev, np);
3150 ppdata = dev_get_platdata(ab8500->dev);
3152 dev_err(&pdev->dev, "null parent pdata\n");
3156 pdata = ppdata->regulator;
3158 dev_err(&pdev->dev, "null pdata\n");
3162 /* make sure the platform data has the correct size */
3163 if (pdata->num_regulator != abx500_regulator.info_size) {
3164 dev_err(&pdev->dev, "Configuration error: size mismatch.\n");
3168 /* initialize debug (initial state is recorded with this call) */
3169 err = ab8500_regulator_debug_init(pdev);
3173 /* initialize registers */
3174 for (i = 0; i < pdata->num_reg_init; i++) {
3175 int id, mask, value;
3177 id = pdata->reg_init[i].id;
3178 mask = pdata->reg_init[i].mask;
3179 value = pdata->reg_init[i].value;
3181 /* check for configuration errors */
3182 BUG_ON(id >= abx500_regulator.init_size);
3184 err = ab8500_regulator_init_registers(pdev, id, mask, value);
3189 if (!is_ab8505(ab8500)) {
3190 /* register external regulators (before Vaux1, 2 and 3) */
3191 err = ab8500_ext_regulator_init(pdev);
3196 /* register all regulators */
3197 for (i = 0; i < abx500_regulator.info_size; i++) {
3198 err = ab8500_regulator_register(pdev, &pdata->regulator[i],
3207 static int ab8500_regulator_remove(struct platform_device *pdev)
3210 struct ab8500 *ab8500 = dev_get_drvdata(pdev->dev.parent);
3212 for (i = 0; i < abx500_regulator.info_size; i++) {
3213 struct ab8500_regulator_info *info = NULL;
3214 info = &abx500_regulator.info[i];
3216 dev_vdbg(rdev_get_dev(info->regulator),
3217 "%s-remove\n", info->desc.name);
3219 regulator_unregister(info->regulator);
3222 if (!is_ab8505(ab8500)) {
3223 /* remove external regulators (after Vaux1, 2 and 3) */
3224 err = ab8500_ext_regulator_exit(pdev);
3229 /* remove regulator debug */
3230 err = ab8500_regulator_debug_exit(pdev);
3237 static struct platform_driver ab8500_regulator_driver = {
3238 .probe = ab8500_regulator_probe,
3239 .remove = ab8500_regulator_remove,
3241 .name = "ab8500-regulator",
3242 .owner = THIS_MODULE,
3246 static int __init ab8500_regulator_init(void)
3250 ret = platform_driver_register(&ab8500_regulator_driver);
3252 pr_err("Failed to register ab8500 regulator: %d\n", ret);
3256 subsys_initcall(ab8500_regulator_init);
3258 static void __exit ab8500_regulator_exit(void)
3260 platform_driver_unregister(&ab8500_regulator_driver);
3262 module_exit(ab8500_regulator_exit);
3264 MODULE_LICENSE("GPL v2");
3265 MODULE_AUTHOR("Sundar Iyer <sundar.iyer@stericsson.com>");
3266 MODULE_AUTHOR("Bengt Jonsson <bengt.g.jonsson@stericsson.com>");
3267 MODULE_AUTHOR("Daniel Willerud <daniel.willerud@stericsson.com>");
3268 MODULE_DESCRIPTION("Regulator Driver for ST-Ericsson AB8500 Mixed-Sig PMIC");
3269 MODULE_ALIAS("platform:ab8500-regulator");