aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHeiko Stuebner <heiko@sntech.de>2019-06-26 08:29:18 -0400
committerLee Jones <lee.jones@linaro.org>2019-06-27 09:57:31 -0400
commite444f6d68c07bc01a3a3d5905409dbe1ca391d26 (patch)
treed5d53514eaefcd16962020b80ec1b5c7d4dfb6f9
parent586c1b4125b3c7bf5b482fcafab5d568b8a3c285 (diff)
regulator: rk808: Add RK809 and RK817 support.
Add support for the rk809 and rk817 regulator driver. Their specifications are as follows: 1. The RK809 and RK809 consist of 5 DCDCs, 9 LDOs and have the same registers for these components except dcdc5. 2. The dcdc5 is a boost dcdc for RK817 and is a buck for RK809. 3. The RK817 has one switch but The Rk809 has two. The output voltages are configurable and are meant to supply power to the main processor and other components. Signed-off-by: Tony Xie <tony.xie@rock-chips.com> Acked-by: Mark Brown <broonie@kernel.org> [rebased on top of 5.2-rc1] Signed-off-by: Heiko Stuebner <heiko@sntech.de> Signed-off-by: Lee Jones <lee.jones@linaro.org>
-rw-r--r--drivers/regulator/Kconfig4
-rw-r--r--drivers/regulator/rk808-regulator.c646
-rw-r--r--include/linux/mfd/rk808.h3
3 files changed, 625 insertions, 28 deletions
diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig
index 6c37f0df9323..214a958ff3e5 100644
--- a/drivers/regulator/Kconfig
+++ b/drivers/regulator/Kconfig
@@ -762,11 +762,11 @@ config REGULATOR_RC5T583
762 outputs which can be controlled by i2c communication. 762 outputs which can be controlled by i2c communication.
763 763
764config REGULATOR_RK808 764config REGULATOR_RK808
765 tristate "Rockchip RK805/RK808/RK818 Power regulators" 765 tristate "Rockchip RK805/RK808/RK809/RK817/RK818 Power regulators"
766 depends on MFD_RK808 766 depends on MFD_RK808
767 help 767 help
768 Select this option to enable the power regulator of ROCKCHIP 768 Select this option to enable the power regulator of ROCKCHIP
769 PMIC RK805,RK808 and RK818. 769 PMIC RK805,RK809&RK817,RK808 and RK818.
770 This driver supports the control of different power rails of device 770 This driver supports the control of different power rails of device
771 through regulator interface. The device supports multiple DCDC/LDO 771 through regulator interface. The device supports multiple DCDC/LDO
772 outputs which can be controlled by i2c communication. 772 outputs which can be controlled by i2c communication.
diff --git a/drivers/regulator/rk808-regulator.c b/drivers/regulator/rk808-regulator.c
index 23713e16c286..e9b0bb996fc4 100644
--- a/drivers/regulator/rk808-regulator.c
+++ b/drivers/regulator/rk808-regulator.c
@@ -36,6 +36,12 @@
36#define RK808_BUCK4_VSEL_MASK 0xf 36#define RK808_BUCK4_VSEL_MASK 0xf
37#define RK808_LDO_VSEL_MASK 0x1f 37#define RK808_LDO_VSEL_MASK 0x1f
38 38
39#define RK809_BUCK5_VSEL_MASK 0x7
40
41#define RK817_LDO_VSEL_MASK 0x7f
42#define RK817_BOOST_VSEL_MASK 0x7
43#define RK817_BUCK_VSEL_MASK 0x7f
44
39#define RK818_BUCK_VSEL_MASK 0x3f 45#define RK818_BUCK_VSEL_MASK 0x3f
40#define RK818_BUCK4_VSEL_MASK 0x1f 46#define RK818_BUCK4_VSEL_MASK 0x1f
41#define RK818_LDO_VSEL_MASK 0x1f 47#define RK818_LDO_VSEL_MASK 0x1f
@@ -65,30 +71,36 @@
65/* max steps for increase voltage of Buck1/2, equal 100mv*/ 71/* max steps for increase voltage of Buck1/2, equal 100mv*/
66#define MAX_STEPS_ONE_TIME 8 72#define MAX_STEPS_ONE_TIME 8
67 73
68#define RK805_DESC(_id, _match, _supply, _min, _max, _step, _vreg, \ 74#define ENABLE_MASK(id) (BIT(id) | BIT(4 + (id)))
69 _vmask, _ereg, _emask, _etime) \ 75#define DISABLE_VAL(id) (BIT(4 + (id)))
70 [_id] = { \ 76
71 .name = (_match), \ 77#define RK817_BOOST_DESC(_id, _match, _supply, _min, _max, _step, _vreg,\
72 .supply_name = (_supply), \ 78 _vmask, _ereg, _emask, _enval, _disval, _etime, m_drop) \
73 .of_match = of_match_ptr(_match), \ 79 { \
74 .regulators_node = of_match_ptr("regulators"), \ 80 .name = (_match), \
75 .type = REGULATOR_VOLTAGE, \ 81 .supply_name = (_supply), \
76 .id = (_id), \ 82 .of_match = of_match_ptr(_match), \
77 .n_voltages = (((_max) - (_min)) / (_step) + 1), \ 83 .regulators_node = of_match_ptr("regulators"), \
78 .owner = THIS_MODULE, \ 84 .type = REGULATOR_VOLTAGE, \
79 .min_uV = (_min) * 1000, \ 85 .id = (_id), \
80 .uV_step = (_step) * 1000, \ 86 .n_voltages = (((_max) - (_min)) / (_step) + 1), \
81 .vsel_reg = (_vreg), \ 87 .owner = THIS_MODULE, \
82 .vsel_mask = (_vmask), \ 88 .min_uV = (_min) * 1000, \
83 .enable_reg = (_ereg), \ 89 .uV_step = (_step) * 1000, \
84 .enable_mask = (_emask), \ 90 .vsel_reg = (_vreg), \
85 .enable_time = (_etime), \ 91 .vsel_mask = (_vmask), \
86 .ops = &rk805_reg_ops, \ 92 .enable_reg = (_ereg), \
93 .enable_mask = (_emask), \
94 .enable_val = (_enval), \
95 .disable_val = (_disval), \
96 .enable_time = (_etime), \
97 .min_dropout_uV = (m_drop) * 1000, \
98 .ops = &rk817_boost_ops, \
87 } 99 }
88 100
89#define RK8XX_DESC(_id, _match, _supply, _min, _max, _step, _vreg, \ 101#define RK8XX_DESC_COM(_id, _match, _supply, _min, _max, _step, _vreg, \
90 _vmask, _ereg, _emask, _etime) \ 102 _vmask, _ereg, _emask, _enval, _disval, _etime, _ops) \
91 [_id] = { \ 103 { \
92 .name = (_match), \ 104 .name = (_match), \
93 .supply_name = (_supply), \ 105 .supply_name = (_supply), \
94 .of_match = of_match_ptr(_match), \ 106 .of_match = of_match_ptr(_match), \
@@ -103,12 +115,30 @@
103 .vsel_mask = (_vmask), \ 115 .vsel_mask = (_vmask), \
104 .enable_reg = (_ereg), \ 116 .enable_reg = (_ereg), \
105 .enable_mask = (_emask), \ 117 .enable_mask = (_emask), \
118 .enable_val = (_enval), \
119 .disable_val = (_disval), \
106 .enable_time = (_etime), \ 120 .enable_time = (_etime), \
107 .ops = &rk808_reg_ops, \ 121 .ops = _ops, \
108 } 122 }
109 123
110#define RK8XX_DESC_SWITCH(_id, _match, _supply, _ereg, _emask) \ 124#define RK805_DESC(_id, _match, _supply, _min, _max, _step, _vreg, \
111 [_id] = { \ 125 _vmask, _ereg, _emask, _etime) \
126 RK8XX_DESC_COM(_id, _match, _supply, _min, _max, _step, _vreg, \
127 _vmask, _ereg, _emask, 0, 0, _etime, &rk805_reg_ops)
128
129#define RK8XX_DESC(_id, _match, _supply, _min, _max, _step, _vreg, \
130 _vmask, _ereg, _emask, _etime) \
131 RK8XX_DESC_COM(_id, _match, _supply, _min, _max, _step, _vreg, \
132 _vmask, _ereg, _emask, 0, 0, _etime, &rk808_reg_ops)
133
134#define RK817_DESC(_id, _match, _supply, _min, _max, _step, _vreg, \
135 _vmask, _ereg, _emask, _disval, _etime) \
136 RK8XX_DESC_COM(_id, _match, _supply, _min, _max, _step, _vreg, \
137 _vmask, _ereg, _emask, _emask, _disval, _etime, &rk817_reg_ops)
138
139#define RKXX_DESC_SWITCH_COM(_id, _match, _supply, _ereg, _emask, \
140 _enval, _disval, _ops) \
141 { \
112 .name = (_match), \ 142 .name = (_match), \
113 .supply_name = (_supply), \ 143 .supply_name = (_supply), \
114 .of_match = of_match_ptr(_match), \ 144 .of_match = of_match_ptr(_match), \
@@ -117,10 +147,20 @@
117 .id = (_id), \ 147 .id = (_id), \
118 .enable_reg = (_ereg), \ 148 .enable_reg = (_ereg), \
119 .enable_mask = (_emask), \ 149 .enable_mask = (_emask), \
150 .enable_val = (_enval), \
151 .disable_val = (_disval), \
120 .owner = THIS_MODULE, \ 152 .owner = THIS_MODULE, \
121 .ops = &rk808_switch_ops \ 153 .ops = _ops \
122 } 154 }
123 155
156#define RK817_DESC_SWITCH(_id, _match, _supply, _ereg, _emask, \
157 _disval) \
158 RKXX_DESC_SWITCH_COM(_id, _match, _supply, _ereg, _emask, \
159 _emask, _disval, &rk817_switch_ops)
160
161#define RK8XX_DESC_SWITCH(_id, _match, _supply, _ereg, _emask) \
162 RKXX_DESC_SWITCH_COM(_id, _match, _supply, _ereg, _emask, \
163 0, 0, &rk808_switch_ops)
124 164
125struct rk808_regulator_data { 165struct rk808_regulator_data {
126 struct gpio_desc *dvs_gpio[2]; 166 struct gpio_desc *dvs_gpio[2];
@@ -138,6 +178,51 @@ static const struct regulator_linear_range rk808_ldo3_voltage_ranges[] = {
138 REGULATOR_LINEAR_RANGE(2500000, 15, 15, 0), 178 REGULATOR_LINEAR_RANGE(2500000, 15, 15, 0),
139}; 179};
140 180
181#define RK809_BUCK5_SEL_CNT (8)
182
183static const struct regulator_linear_range rk809_buck5_voltage_ranges[] = {
184 REGULATOR_LINEAR_RANGE(1500000, 0, 0, 0),
185 REGULATOR_LINEAR_RANGE(1800000, 1, 3, 200000),
186 REGULATOR_LINEAR_RANGE(2800000, 4, 5, 200000),
187 REGULATOR_LINEAR_RANGE(3300000, 6, 7, 300000),
188};
189
190#define RK817_BUCK1_MIN0 500000
191#define RK817_BUCK1_MAX0 1500000
192
193#define RK817_BUCK1_MIN1 1600000
194#define RK817_BUCK1_MAX1 2400000
195
196#define RK817_BUCK3_MAX1 3400000
197
198#define RK817_BUCK1_STP0 12500
199#define RK817_BUCK1_STP1 100000
200
201#define RK817_BUCK1_SEL0 ((RK817_BUCK1_MAX0 - RK817_BUCK1_MIN0) /\
202 RK817_BUCK1_STP0)
203#define RK817_BUCK1_SEL1 ((RK817_BUCK1_MAX1 - RK817_BUCK1_MIN1) /\
204 RK817_BUCK1_STP1)
205
206#define RK817_BUCK3_SEL1 ((RK817_BUCK3_MAX1 - RK817_BUCK1_MIN1) /\
207 RK817_BUCK1_STP1)
208
209#define RK817_BUCK1_SEL_CNT (RK817_BUCK1_SEL0 + RK817_BUCK1_SEL1 + 1)
210#define RK817_BUCK3_SEL_CNT (RK817_BUCK1_SEL0 + RK817_BUCK3_SEL1 + 1)
211
212static const struct regulator_linear_range rk817_buck1_voltage_ranges[] = {
213 REGULATOR_LINEAR_RANGE(RK817_BUCK1_MIN0, 0,
214 RK817_BUCK1_SEL0, RK817_BUCK1_STP0),
215 REGULATOR_LINEAR_RANGE(RK817_BUCK1_MIN1, RK817_BUCK1_SEL0 + 1,
216 RK817_BUCK1_SEL_CNT, RK817_BUCK1_STP1),
217};
218
219static const struct regulator_linear_range rk817_buck3_voltage_ranges[] = {
220 REGULATOR_LINEAR_RANGE(RK817_BUCK1_MIN0, 0,
221 RK817_BUCK1_SEL0, RK817_BUCK1_STP0),
222 REGULATOR_LINEAR_RANGE(RK817_BUCK1_MIN1, RK817_BUCK1_SEL0 + 1,
223 RK817_BUCK3_SEL_CNT, RK817_BUCK1_STP1),
224};
225
141static int rk808_buck1_2_get_voltage_sel_regmap(struct regulator_dev *rdev) 226static int rk808_buck1_2_get_voltage_sel_regmap(struct regulator_dev *rdev)
142{ 227{
143 struct rk808_regulator_data *pdata = rdev_get_drvdata(rdev); 228 struct rk808_regulator_data *pdata = rdev_get_drvdata(rdev);
@@ -289,6 +374,36 @@ static int rk808_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay)
289 RK808_RAMP_RATE_MASK, ramp_value); 374 RK808_RAMP_RATE_MASK, ramp_value);
290} 375}
291 376
377/*
378 * RK817 RK809
379 */
380static int rk817_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay)
381{
382 unsigned int ramp_value = RK817_RAMP_RATE_25MV_PER_US;
383 unsigned int reg = RK817_BUCK_CONFIG_REG(rdev_get_id(rdev));
384
385 switch (ramp_delay) {
386 case 0 ... 3000:
387 ramp_value = RK817_RAMP_RATE_3MV_PER_US;
388 break;
389 case 3001 ... 6300:
390 ramp_value = RK817_RAMP_RATE_6_3MV_PER_US;
391 break;
392 case 6301 ... 12500:
393 ramp_value = RK817_RAMP_RATE_12_5MV_PER_US;
394 break;
395 case 12501 ... 25000:
396 break;
397 default:
398 dev_warn(&rdev->dev,
399 "%s ramp_delay: %d not supported, setting 10000\n",
400 rdev->desc->name, ramp_delay);
401 }
402
403 return regmap_update_bits(rdev->regmap, reg,
404 RK817_RAMP_RATE_MASK, ramp_value);
405}
406
292static int rk808_set_suspend_voltage(struct regulator_dev *rdev, int uv) 407static int rk808_set_suspend_voltage(struct regulator_dev *rdev, int uv)
293{ 408{
294 unsigned int reg; 409 unsigned int reg;
@@ -304,6 +419,21 @@ static int rk808_set_suspend_voltage(struct regulator_dev *rdev, int uv)
304 sel); 419 sel);
305} 420}
306 421
422static int rk817_set_suspend_voltage(struct regulator_dev *rdev, int uv)
423{
424 unsigned int reg;
425 int sel = regulator_map_voltage_linear(rdev, uv, uv);
426 /* only ldo1~ldo9 */
427 if (sel < 0)
428 return -EINVAL;
429
430 reg = rdev->desc->vsel_reg + RK808_SLP_REG_OFFSET;
431
432 return regmap_update_bits(rdev->regmap, reg,
433 rdev->desc->vsel_mask,
434 sel);
435}
436
307static int rk808_set_suspend_voltage_range(struct regulator_dev *rdev, int uv) 437static int rk808_set_suspend_voltage_range(struct regulator_dev *rdev, int uv)
308{ 438{
309 unsigned int reg; 439 unsigned int reg;
@@ -363,6 +493,131 @@ static int rk808_set_suspend_disable(struct regulator_dev *rdev)
363 rdev->desc->enable_mask); 493 rdev->desc->enable_mask);
364} 494}
365 495
496static int rk817_set_suspend_enable_ctrl(struct regulator_dev *rdev,
497 unsigned int en)
498{
499 unsigned int reg;
500 int id = rdev_get_id(rdev);
501 unsigned int id_slp, msk, val;
502
503 if (id >= RK817_ID_DCDC1 && id <= RK817_ID_DCDC4)
504 id_slp = id;
505 else if (id >= RK817_ID_LDO1 && id <= RK817_ID_LDO8)
506 id_slp = 8 + (id - RK817_ID_LDO1);
507 else if (id >= RK817_ID_LDO9 && id <= RK809_ID_SW2)
508 id_slp = 4 + (id - RK817_ID_LDO9);
509 else
510 return -EINVAL;
511
512 reg = RK817_POWER_SLP_EN_REG(id_slp / 8);
513
514 msk = BIT(id_slp % 8);
515 if (en)
516 val = msk;
517 else
518 val = 0;
519
520 return regmap_update_bits(rdev->regmap, reg, msk, val);
521}
522
523static int rk817_set_suspend_enable(struct regulator_dev *rdev)
524{
525 return rk817_set_suspend_enable_ctrl(rdev, 1);
526}
527
528static int rk817_set_suspend_disable(struct regulator_dev *rdev)
529{
530 return rk817_set_suspend_enable_ctrl(rdev, 0);
531}
532
533static int rk8xx_set_suspend_mode(struct regulator_dev *rdev, unsigned int mode)
534{
535 unsigned int reg;
536
537 reg = rdev->desc->vsel_reg + RK808_SLP_REG_OFFSET;
538
539 switch (mode) {
540 case REGULATOR_MODE_FAST:
541 return regmap_update_bits(rdev->regmap, reg,
542 PWM_MODE_MSK, FPWM_MODE);
543 case REGULATOR_MODE_NORMAL:
544 return regmap_update_bits(rdev->regmap, reg,
545 PWM_MODE_MSK, AUTO_PWM_MODE);
546 default:
547 dev_err(&rdev->dev, "do not support this mode\n");
548 return -EINVAL;
549 }
550
551 return 0;
552}
553
554static int rk8xx_set_mode(struct regulator_dev *rdev, unsigned int mode)
555{
556 switch (mode) {
557 case REGULATOR_MODE_FAST:
558 return regmap_update_bits(rdev->regmap, rdev->desc->vsel_reg,
559 PWM_MODE_MSK, FPWM_MODE);
560 case REGULATOR_MODE_NORMAL:
561 return regmap_update_bits(rdev->regmap, rdev->desc->vsel_reg,
562 PWM_MODE_MSK, AUTO_PWM_MODE);
563 default:
564 dev_err(&rdev->dev, "do not support this mode\n");
565 return -EINVAL;
566 }
567
568 return 0;
569}
570
571static unsigned int rk8xx_get_mode(struct regulator_dev *rdev)
572{
573 unsigned int val;
574 int err;
575
576 err = regmap_read(rdev->regmap, rdev->desc->vsel_reg, &val);
577 if (err)
578 return err;
579
580 if (val & FPWM_MODE)
581 return REGULATOR_MODE_FAST;
582 else
583 return REGULATOR_MODE_NORMAL;
584}
585
586static int rk8xx_is_enabled_wmsk_regmap(struct regulator_dev *rdev)
587{
588 unsigned int val;
589 int ret;
590
591 ret = regmap_read(rdev->regmap, rdev->desc->enable_reg, &val);
592 if (ret != 0)
593 return ret;
594
595 /* add write mask bit */
596 val |= (rdev->desc->enable_mask & 0xf0);
597 val &= rdev->desc->enable_mask;
598
599 if (rdev->desc->enable_is_inverted) {
600 if (rdev->desc->enable_val)
601 return val != rdev->desc->enable_val;
602 return (val == 0);
603 }
604 if (rdev->desc->enable_val)
605 return val == rdev->desc->enable_val;
606 return val != 0;
607}
608
609static unsigned int rk8xx_regulator_of_map_mode(unsigned int mode)
610{
611 switch (mode) {
612 case 1:
613 return REGULATOR_MODE_FAST;
614 case 2:
615 return REGULATOR_MODE_NORMAL;
616 default:
617 return -EINVAL;
618 }
619}
620
366static const struct regulator_ops rk805_reg_ops = { 621static const struct regulator_ops rk805_reg_ops = {
367 .list_voltage = regulator_list_voltage_linear, 622 .list_voltage = regulator_list_voltage_linear,
368 .map_voltage = regulator_map_voltage_linear, 623 .map_voltage = regulator_map_voltage_linear,
@@ -439,6 +694,71 @@ static const struct regulator_linear_range rk805_buck_1_2_voltage_ranges[] = {
439 REGULATOR_LINEAR_RANGE(2300000, 63, 63, 0), 694 REGULATOR_LINEAR_RANGE(2300000, 63, 63, 0),
440}; 695};
441 696
697static struct regulator_ops rk809_buck5_ops_range = {
698 .list_voltage = regulator_list_voltage_linear_range,
699 .map_voltage = regulator_map_voltage_linear_range,
700 .get_voltage_sel = regulator_get_voltage_sel_regmap,
701 .set_voltage_sel = regulator_set_voltage_sel_regmap,
702 .set_voltage_time_sel = regulator_set_voltage_time_sel,
703 .enable = regulator_enable_regmap,
704 .disable = regulator_disable_regmap,
705 .is_enabled = rk8xx_is_enabled_wmsk_regmap,
706 .set_suspend_voltage = rk808_set_suspend_voltage_range,
707 .set_suspend_enable = rk817_set_suspend_enable,
708 .set_suspend_disable = rk817_set_suspend_disable,
709};
710
711static struct regulator_ops rk817_reg_ops = {
712 .list_voltage = regulator_list_voltage_linear,
713 .map_voltage = regulator_map_voltage_linear,
714 .get_voltage_sel = regulator_get_voltage_sel_regmap,
715 .set_voltage_sel = regulator_set_voltage_sel_regmap,
716 .enable = regulator_enable_regmap,
717 .disable = regulator_disable_regmap,
718 .is_enabled = rk8xx_is_enabled_wmsk_regmap,
719 .set_suspend_voltage = rk817_set_suspend_voltage,
720 .set_suspend_enable = rk817_set_suspend_enable,
721 .set_suspend_disable = rk817_set_suspend_disable,
722};
723
724static struct regulator_ops rk817_boost_ops = {
725 .list_voltage = regulator_list_voltage_linear,
726 .map_voltage = regulator_map_voltage_linear,
727 .get_voltage_sel = regulator_get_voltage_sel_regmap,
728 .set_voltage_sel = regulator_set_voltage_sel_regmap,
729 .enable = regulator_enable_regmap,
730 .disable = regulator_disable_regmap,
731 .is_enabled = rk8xx_is_enabled_wmsk_regmap,
732 .set_suspend_enable = rk817_set_suspend_enable,
733 .set_suspend_disable = rk817_set_suspend_disable,
734};
735
736static struct regulator_ops rk817_buck_ops_range = {
737 .list_voltage = regulator_list_voltage_linear_range,
738 .map_voltage = regulator_map_voltage_linear_range,
739 .get_voltage_sel = regulator_get_voltage_sel_regmap,
740 .set_voltage_sel = regulator_set_voltage_sel_regmap,
741 .set_voltage_time_sel = regulator_set_voltage_time_sel,
742 .enable = regulator_enable_regmap,
743 .disable = regulator_disable_regmap,
744 .is_enabled = rk8xx_is_enabled_wmsk_regmap,
745 .set_mode = rk8xx_set_mode,
746 .get_mode = rk8xx_get_mode,
747 .set_suspend_mode = rk8xx_set_suspend_mode,
748 .set_ramp_delay = rk817_set_ramp_delay,
749 .set_suspend_voltage = rk808_set_suspend_voltage_range,
750 .set_suspend_enable = rk817_set_suspend_enable,
751 .set_suspend_disable = rk817_set_suspend_disable,
752};
753
754static struct regulator_ops rk817_switch_ops = {
755 .enable = regulator_enable_regmap,
756 .disable = regulator_disable_regmap,
757 .is_enabled = rk8xx_is_enabled_wmsk_regmap,
758 .set_suspend_enable = rk817_set_suspend_enable,
759 .set_suspend_disable = rk817_set_suspend_disable,
760};
761
442static const struct regulator_desc rk805_reg[] = { 762static const struct regulator_desc rk805_reg[] = {
443 { 763 {
444 .name = "DCDC_REG1", 764 .name = "DCDC_REG1",
@@ -595,6 +915,271 @@ static const struct regulator_desc rk808_reg[] = {
595 RK808_DCDC_EN_REG, BIT(6)), 915 RK808_DCDC_EN_REG, BIT(6)),
596}; 916};
597 917
918static const struct regulator_desc rk809_reg[] = {
919 {
920 .name = "DCDC_REG1",
921 .supply_name = "vcc1",
922 .of_match = of_match_ptr("DCDC_REG1"),
923 .regulators_node = of_match_ptr("regulators"),
924 .id = RK817_ID_DCDC1,
925 .ops = &rk817_buck_ops_range,
926 .type = REGULATOR_VOLTAGE,
927 .n_voltages = RK817_BUCK1_SEL_CNT + 1,
928 .linear_ranges = rk817_buck1_voltage_ranges,
929 .n_linear_ranges = ARRAY_SIZE(rk817_buck1_voltage_ranges),
930 .vsel_reg = RK817_BUCK1_ON_VSEL_REG,
931 .vsel_mask = RK817_BUCK_VSEL_MASK,
932 .enable_reg = RK817_POWER_EN_REG(0),
933 .enable_mask = ENABLE_MASK(RK817_ID_DCDC1),
934 .enable_val = ENABLE_MASK(RK817_ID_DCDC1),
935 .disable_val = DISABLE_VAL(RK817_ID_DCDC1),
936 .of_map_mode = rk8xx_regulator_of_map_mode,
937 .owner = THIS_MODULE,
938 }, {
939 .name = "DCDC_REG2",
940 .supply_name = "vcc2",
941 .of_match = of_match_ptr("DCDC_REG2"),
942 .regulators_node = of_match_ptr("regulators"),
943 .id = RK817_ID_DCDC2,
944 .ops = &rk817_buck_ops_range,
945 .type = REGULATOR_VOLTAGE,
946 .n_voltages = RK817_BUCK1_SEL_CNT + 1,
947 .linear_ranges = rk817_buck1_voltage_ranges,
948 .n_linear_ranges = ARRAY_SIZE(rk817_buck1_voltage_ranges),
949 .vsel_reg = RK817_BUCK2_ON_VSEL_REG,
950 .vsel_mask = RK817_BUCK_VSEL_MASK,
951 .enable_reg = RK817_POWER_EN_REG(0),
952 .enable_mask = ENABLE_MASK(RK817_ID_DCDC2),
953 .enable_val = ENABLE_MASK(RK817_ID_DCDC2),
954 .disable_val = DISABLE_VAL(RK817_ID_DCDC2),
955 .of_map_mode = rk8xx_regulator_of_map_mode,
956 .owner = THIS_MODULE,
957 }, {
958 .name = "DCDC_REG3",
959 .supply_name = "vcc3",
960 .of_match = of_match_ptr("DCDC_REG3"),
961 .regulators_node = of_match_ptr("regulators"),
962 .id = RK817_ID_DCDC3,
963 .ops = &rk817_buck_ops_range,
964 .type = REGULATOR_VOLTAGE,
965 .n_voltages = RK817_BUCK1_SEL_CNT + 1,
966 .linear_ranges = rk817_buck1_voltage_ranges,
967 .n_linear_ranges = ARRAY_SIZE(rk817_buck1_voltage_ranges),
968 .vsel_reg = RK817_BUCK3_ON_VSEL_REG,
969 .vsel_mask = RK817_BUCK_VSEL_MASK,
970 .enable_reg = RK817_POWER_EN_REG(0),
971 .enable_mask = ENABLE_MASK(RK817_ID_DCDC3),
972 .enable_val = ENABLE_MASK(RK817_ID_DCDC3),
973 .disable_val = DISABLE_VAL(RK817_ID_DCDC3),
974 .of_map_mode = rk8xx_regulator_of_map_mode,
975 .owner = THIS_MODULE,
976 }, {
977 .name = "DCDC_REG4",
978 .supply_name = "vcc4",
979 .of_match = of_match_ptr("DCDC_REG4"),
980 .regulators_node = of_match_ptr("regulators"),
981 .id = RK817_ID_DCDC4,
982 .ops = &rk817_buck_ops_range,
983 .type = REGULATOR_VOLTAGE,
984 .n_voltages = RK817_BUCK3_SEL_CNT + 1,
985 .linear_ranges = rk817_buck3_voltage_ranges,
986 .n_linear_ranges = ARRAY_SIZE(rk817_buck3_voltage_ranges),
987 .vsel_reg = RK817_BUCK4_ON_VSEL_REG,
988 .vsel_mask = RK817_BUCK_VSEL_MASK,
989 .enable_reg = RK817_POWER_EN_REG(0),
990 .enable_mask = ENABLE_MASK(RK817_ID_DCDC4),
991 .enable_val = ENABLE_MASK(RK817_ID_DCDC4),
992 .disable_val = DISABLE_VAL(RK817_ID_DCDC4),
993 .of_map_mode = rk8xx_regulator_of_map_mode,
994 .owner = THIS_MODULE,
995 },
996 {
997 .name = "DCDC_REG5",
998 .supply_name = "vcc9",
999 .of_match = of_match_ptr("DCDC_REG5"),
1000 .regulators_node = of_match_ptr("regulators"),
1001 .id = RK809_ID_DCDC5,
1002 .ops = &rk809_buck5_ops_range,
1003 .type = REGULATOR_VOLTAGE,
1004 .n_voltages = RK809_BUCK5_SEL_CNT,
1005 .linear_ranges = rk809_buck5_voltage_ranges,
1006 .n_linear_ranges = ARRAY_SIZE(rk809_buck5_voltage_ranges),
1007 .vsel_reg = RK809_BUCK5_CONFIG(0),
1008 .vsel_mask = RK809_BUCK5_VSEL_MASK,
1009 .enable_reg = RK817_POWER_EN_REG(3),
1010 .enable_mask = ENABLE_MASK(1),
1011 .enable_val = ENABLE_MASK(1),
1012 .disable_val = DISABLE_VAL(1),
1013 .of_map_mode = rk8xx_regulator_of_map_mode,
1014 .owner = THIS_MODULE,
1015 },
1016 RK817_DESC(RK817_ID_LDO1, "LDO_REG1", "vcc5", 600, 3400, 25,
1017 RK817_LDO_ON_VSEL_REG(0), RK817_LDO_VSEL_MASK,
1018 RK817_POWER_EN_REG(1), ENABLE_MASK(0),
1019 DISABLE_VAL(0), 400),
1020 RK817_DESC(RK817_ID_LDO2, "LDO_REG2", "vcc5", 600, 3400, 25,
1021 RK817_LDO_ON_VSEL_REG(1), RK817_LDO_VSEL_MASK,
1022 RK817_POWER_EN_REG(1), ENABLE_MASK(1),
1023 DISABLE_VAL(1), 400),
1024 RK817_DESC(RK817_ID_LDO3, "LDO_REG3", "vcc5", 600, 3400, 25,
1025 RK817_LDO_ON_VSEL_REG(2), RK817_LDO_VSEL_MASK,
1026 RK817_POWER_EN_REG(1), ENABLE_MASK(2),
1027 DISABLE_VAL(2), 400),
1028 RK817_DESC(RK817_ID_LDO4, "LDO_REG4", "vcc6", 600, 3400, 25,
1029 RK817_LDO_ON_VSEL_REG(3), RK817_LDO_VSEL_MASK,
1030 RK817_POWER_EN_REG(1), ENABLE_MASK(3),
1031 DISABLE_VAL(3), 400),
1032 RK817_DESC(RK817_ID_LDO5, "LDO_REG5", "vcc6", 600, 3400, 25,
1033 RK817_LDO_ON_VSEL_REG(4), RK817_LDO_VSEL_MASK,
1034 RK817_POWER_EN_REG(2), ENABLE_MASK(0),
1035 DISABLE_VAL(0), 400),
1036 RK817_DESC(RK817_ID_LDO6, "LDO_REG6", "vcc6", 600, 3400, 25,
1037 RK817_LDO_ON_VSEL_REG(5), RK817_LDO_VSEL_MASK,
1038 RK817_POWER_EN_REG(2), ENABLE_MASK(1),
1039 DISABLE_VAL(1), 400),
1040 RK817_DESC(RK817_ID_LDO7, "LDO_REG7", "vcc7", 600, 3400, 25,
1041 RK817_LDO_ON_VSEL_REG(6), RK817_LDO_VSEL_MASK,
1042 RK817_POWER_EN_REG(2), ENABLE_MASK(2),
1043 DISABLE_VAL(2), 400),
1044 RK817_DESC(RK817_ID_LDO8, "LDO_REG8", "vcc7", 600, 3400, 25,
1045 RK817_LDO_ON_VSEL_REG(7), RK817_LDO_VSEL_MASK,
1046 RK817_POWER_EN_REG(2), ENABLE_MASK(3),
1047 DISABLE_VAL(3), 400),
1048 RK817_DESC(RK817_ID_LDO9, "LDO_REG9", "vcc7", 600, 3400, 25,
1049 RK817_LDO_ON_VSEL_REG(8), RK817_LDO_VSEL_MASK,
1050 RK817_POWER_EN_REG(3), ENABLE_MASK(0),
1051 DISABLE_VAL(0), 400),
1052 RK817_DESC_SWITCH(RK809_ID_SW1, "SWITCH_REG1", "vcc9",
1053 RK817_POWER_EN_REG(3), ENABLE_MASK(2),
1054 DISABLE_VAL(2)),
1055 RK817_DESC_SWITCH(RK809_ID_SW2, "SWITCH_REG2", "vcc8",
1056 RK817_POWER_EN_REG(3), ENABLE_MASK(3),
1057 DISABLE_VAL(3)),
1058};
1059
1060static const struct regulator_desc rk817_reg[] = {
1061 {
1062 .name = "DCDC_REG1",
1063 .supply_name = "vcc1",
1064 .of_match = of_match_ptr("DCDC_REG1"),
1065 .regulators_node = of_match_ptr("regulators"),
1066 .id = RK817_ID_DCDC1,
1067 .ops = &rk817_buck_ops_range,
1068 .type = REGULATOR_VOLTAGE,
1069 .n_voltages = RK817_BUCK1_SEL_CNT + 1,
1070 .linear_ranges = rk817_buck1_voltage_ranges,
1071 .n_linear_ranges = ARRAY_SIZE(rk817_buck1_voltage_ranges),
1072 .vsel_reg = RK817_BUCK1_ON_VSEL_REG,
1073 .vsel_mask = RK817_BUCK_VSEL_MASK,
1074 .enable_reg = RK817_POWER_EN_REG(0),
1075 .enable_mask = ENABLE_MASK(RK817_ID_DCDC1),
1076 .enable_val = ENABLE_MASK(RK817_ID_DCDC1),
1077 .disable_val = DISABLE_VAL(RK817_ID_DCDC1),
1078 .of_map_mode = rk8xx_regulator_of_map_mode,
1079 .owner = THIS_MODULE,
1080 }, {
1081 .name = "DCDC_REG2",
1082 .supply_name = "vcc2",
1083 .of_match = of_match_ptr("DCDC_REG2"),
1084 .regulators_node = of_match_ptr("regulators"),
1085 .id = RK817_ID_DCDC2,
1086 .ops = &rk817_buck_ops_range,
1087 .type = REGULATOR_VOLTAGE,
1088 .n_voltages = RK817_BUCK1_SEL_CNT + 1,
1089 .linear_ranges = rk817_buck1_voltage_ranges,
1090 .n_linear_ranges = ARRAY_SIZE(rk817_buck1_voltage_ranges),
1091 .vsel_reg = RK817_BUCK2_ON_VSEL_REG,
1092 .vsel_mask = RK817_BUCK_VSEL_MASK,
1093 .enable_reg = RK817_POWER_EN_REG(0),
1094 .enable_mask = ENABLE_MASK(RK817_ID_DCDC2),
1095 .enable_val = ENABLE_MASK(RK817_ID_DCDC2),
1096 .disable_val = DISABLE_VAL(RK817_ID_DCDC2),
1097 .of_map_mode = rk8xx_regulator_of_map_mode,
1098 .owner = THIS_MODULE,
1099 }, {
1100 .name = "DCDC_REG3",
1101 .supply_name = "vcc3",
1102 .of_match = of_match_ptr("DCDC_REG3"),
1103 .regulators_node = of_match_ptr("regulators"),
1104 .id = RK817_ID_DCDC3,
1105 .ops = &rk817_buck_ops_range,
1106 .type = REGULATOR_VOLTAGE,
1107 .n_voltages = RK817_BUCK1_SEL_CNT + 1,
1108 .linear_ranges = rk817_buck1_voltage_ranges,
1109 .n_linear_ranges = ARRAY_SIZE(rk817_buck1_voltage_ranges),
1110 .vsel_reg = RK817_BUCK3_ON_VSEL_REG,
1111 .vsel_mask = RK817_BUCK_VSEL_MASK,
1112 .enable_reg = RK817_POWER_EN_REG(0),
1113 .enable_mask = ENABLE_MASK(RK817_ID_DCDC3),
1114 .enable_val = ENABLE_MASK(RK817_ID_DCDC3),
1115 .disable_val = DISABLE_VAL(RK817_ID_DCDC3),
1116 .of_map_mode = rk8xx_regulator_of_map_mode,
1117 .owner = THIS_MODULE,
1118 }, {
1119 .name = "DCDC_REG4",
1120 .supply_name = "vcc4",
1121 .of_match = of_match_ptr("DCDC_REG4"),
1122 .regulators_node = of_match_ptr("regulators"),
1123 .id = RK817_ID_DCDC4,
1124 .ops = &rk817_buck_ops_range,
1125 .type = REGULATOR_VOLTAGE,
1126 .n_voltages = RK817_BUCK3_SEL_CNT + 1,
1127 .linear_ranges = rk817_buck3_voltage_ranges,
1128 .n_linear_ranges = ARRAY_SIZE(rk817_buck3_voltage_ranges),
1129 .vsel_reg = RK817_BUCK4_ON_VSEL_REG,
1130 .vsel_mask = RK817_BUCK_VSEL_MASK,
1131 .enable_reg = RK817_POWER_EN_REG(0),
1132 .enable_mask = ENABLE_MASK(RK817_ID_DCDC4),
1133 .enable_val = ENABLE_MASK(RK817_ID_DCDC4),
1134 .disable_val = DISABLE_VAL(RK817_ID_DCDC4),
1135 .of_map_mode = rk8xx_regulator_of_map_mode,
1136 .owner = THIS_MODULE,
1137 },
1138 RK817_DESC(RK817_ID_LDO1, "LDO_REG1", "vcc5", 600, 3400, 25,
1139 RK817_LDO_ON_VSEL_REG(0), RK817_LDO_VSEL_MASK,
1140 RK817_POWER_EN_REG(1), ENABLE_MASK(0),
1141 DISABLE_VAL(0), 400),
1142 RK817_DESC(RK817_ID_LDO2, "LDO_REG2", "vcc5", 600, 3400, 25,
1143 RK817_LDO_ON_VSEL_REG(1), RK817_LDO_VSEL_MASK,
1144 RK817_POWER_EN_REG(1), ENABLE_MASK(1),
1145 DISABLE_VAL(1), 400),
1146 RK817_DESC(RK817_ID_LDO3, "LDO_REG3", "vcc5", 600, 3400, 25,
1147 RK817_LDO_ON_VSEL_REG(2), RK817_LDO_VSEL_MASK,
1148 RK817_POWER_EN_REG(1), ENABLE_MASK(2),
1149 DISABLE_VAL(2), 400),
1150 RK817_DESC(RK817_ID_LDO4, "LDO_REG4", "vcc6", 600, 3400, 25,
1151 RK817_LDO_ON_VSEL_REG(3), RK817_LDO_VSEL_MASK,
1152 RK817_POWER_EN_REG(1), ENABLE_MASK(3),
1153 DISABLE_VAL(3), 400),
1154 RK817_DESC(RK817_ID_LDO5, "LDO_REG5", "vcc6", 600, 3400, 25,
1155 RK817_LDO_ON_VSEL_REG(4), RK817_LDO_VSEL_MASK,
1156 RK817_POWER_EN_REG(2), ENABLE_MASK(0),
1157 DISABLE_VAL(0), 400),
1158 RK817_DESC(RK817_ID_LDO6, "LDO_REG6", "vcc6", 600, 3400, 25,
1159 RK817_LDO_ON_VSEL_REG(5), RK817_LDO_VSEL_MASK,
1160 RK817_POWER_EN_REG(2), ENABLE_MASK(1),
1161 DISABLE_VAL(1), 400),
1162 RK817_DESC(RK817_ID_LDO7, "LDO_REG7", "vcc7", 600, 3400, 25,
1163 RK817_LDO_ON_VSEL_REG(6), RK817_LDO_VSEL_MASK,
1164 RK817_POWER_EN_REG(2), ENABLE_MASK(2),
1165 DISABLE_VAL(2), 400),
1166 RK817_DESC(RK817_ID_LDO8, "LDO_REG8", "vcc7", 600, 3400, 25,
1167 RK817_LDO_ON_VSEL_REG(7), RK817_LDO_VSEL_MASK,
1168 RK817_POWER_EN_REG(2), ENABLE_MASK(3),
1169 DISABLE_VAL(3), 400),
1170 RK817_DESC(RK817_ID_LDO9, "LDO_REG9", "vcc7", 600, 3400, 25,
1171 RK817_LDO_ON_VSEL_REG(8), RK817_LDO_VSEL_MASK,
1172 RK817_POWER_EN_REG(3), ENABLE_MASK(0),
1173 DISABLE_VAL(0), 400),
1174 RK817_BOOST_DESC(RK817_ID_BOOST, "BOOST", "vcc8", 4700, 5400, 100,
1175 RK817_BOOST_OTG_CFG, RK817_BOOST_VSEL_MASK,
1176 RK817_POWER_EN_REG(3), ENABLE_MASK(1), ENABLE_MASK(1),
1177 DISABLE_VAL(1), 400, 3500 - 5400),
1178 RK817_DESC_SWITCH(RK817_ID_BOOST_OTG_SW, "OTG_SWITCH", "vcc9",
1179 RK817_POWER_EN_REG(3), ENABLE_MASK(2),
1180 DISABLE_VAL(2)),
1181};
1182
598static const struct regulator_desc rk818_reg[] = { 1183static const struct regulator_desc rk818_reg[] = {
599 { 1184 {
600 .name = "DCDC_REG1", 1185 .name = "DCDC_REG1",
@@ -765,6 +1350,14 @@ static int rk808_regulator_probe(struct platform_device *pdev)
765 regulators = rk808_reg; 1350 regulators = rk808_reg;
766 nregulators = RK808_NUM_REGULATORS; 1351 nregulators = RK808_NUM_REGULATORS;
767 break; 1352 break;
1353 case RK809_ID:
1354 regulators = rk809_reg;
1355 nregulators = RK809_NUM_REGULATORS;
1356 break;
1357 case RK817_ID:
1358 regulators = rk817_reg;
1359 nregulators = RK817_NUM_REGULATORS;
1360 break;
768 case RK818_ID: 1361 case RK818_ID:
769 regulators = rk818_reg; 1362 regulators = rk818_reg;
770 nregulators = RK818_NUM_REGULATORS; 1363 nregulators = RK818_NUM_REGULATORS;
@@ -803,6 +1396,7 @@ static struct platform_driver rk808_regulator_driver = {
803module_platform_driver(rk808_regulator_driver); 1396module_platform_driver(rk808_regulator_driver);
804 1397
805MODULE_DESCRIPTION("regulator driver for the RK805/RK808/RK818 series PMICs"); 1398MODULE_DESCRIPTION("regulator driver for the RK805/RK808/RK818 series PMICs");
1399MODULE_AUTHOR("Tony xie <tony.xie@rock-chips.com>");
806MODULE_AUTHOR("Chris Zhong <zyw@rock-chips.com>"); 1400MODULE_AUTHOR("Chris Zhong <zyw@rock-chips.com>");
807MODULE_AUTHOR("Zhang Qing <zhangqing@rock-chips.com>"); 1401MODULE_AUTHOR("Zhang Qing <zhangqing@rock-chips.com>");
808MODULE_AUTHOR("Wadim Egorov <w.egorov@phytec.de>"); 1402MODULE_AUTHOR("Wadim Egorov <w.egorov@phytec.de>");
diff --git a/include/linux/mfd/rk808.h b/include/linux/mfd/rk808.h
index 0fd9eedf3c20..2a9cd01691b2 100644
--- a/include/linux/mfd/rk808.h
+++ b/include/linux/mfd/rk808.h
@@ -396,7 +396,10 @@ enum rk805_reg {
396#define SHUTDOWN_FUN (0x2 << 2) 396#define SHUTDOWN_FUN (0x2 << 2)
397#define SLEEP_FUN (0x1 << 2) 397#define SLEEP_FUN (0x1 << 2)
398#define RK8XX_ID_MSK 0xfff0 398#define RK8XX_ID_MSK 0xfff0
399#define PWM_MODE_MSK BIT(7)
399#define FPWM_MODE BIT(7) 400#define FPWM_MODE BIT(7)
401#define AUTO_PWM_MODE 0
402
400enum rk817_reg_id { 403enum rk817_reg_id {
401 RK817_ID_DCDC1 = 0, 404 RK817_ID_DCDC1 = 0,
402 RK817_ID_DCDC2, 405 RK817_ID_DCDC2,