1 // SPDX-License-Identifier: GPL-2.0-only
3 * Regulator driver for Rockchip RK805/RK808/RK818
5 * Copyright (c) 2014, Fuzhou Rockchip Electronics Co., Ltd
7 * Author: Chris Zhong <zyw@rock-chips.com>
8 * Author: Zhang Qing <zhangqing@rock-chips.com>
10 * Copyright (C) 2016 PHYTEC Messtechnik GmbH
12 * Author: Wadim Egorov <w.egorov@phytec.de>
15 #include <linux/delay.h>
16 #include <linux/gpio.h>
17 #include <linux/i2c.h>
18 #include <linux/module.h>
19 #include <linux/of_device.h>
20 #include <linux/of_gpio.h>
21 #include <linux/mfd/rk808.h>
22 #include <linux/regulator/driver.h>
23 #include <linux/regulator/of_regulator.h>
24 #include <linux/gpio/consumer.h>
26 /* Field Definitions */
27 #define RK808_BUCK_VSEL_MASK 0x3f
28 #define RK808_BUCK4_VSEL_MASK 0xf
29 #define RK808_LDO_VSEL_MASK 0x1f
31 #define RK809_BUCK5_VSEL_MASK 0x7
33 #define RK817_LDO_VSEL_MASK 0x7f
34 #define RK817_BOOST_VSEL_MASK 0x7
35 #define RK817_BUCK_VSEL_MASK 0x7f
37 #define RK818_BUCK_VSEL_MASK 0x3f
38 #define RK818_BUCK4_VSEL_MASK 0x1f
39 #define RK818_LDO_VSEL_MASK 0x1f
40 #define RK818_LDO3_ON_VSEL_MASK 0xf
41 #define RK818_BOOST_ON_VSEL_MASK 0xe0
43 /* Ramp rate definitions for buck1 / buck2 only */
44 #define RK808_RAMP_RATE_OFFSET 3
45 #define RK808_RAMP_RATE_MASK (3 << RK808_RAMP_RATE_OFFSET)
46 #define RK808_RAMP_RATE_2MV_PER_US (0 << RK808_RAMP_RATE_OFFSET)
47 #define RK808_RAMP_RATE_4MV_PER_US (1 << RK808_RAMP_RATE_OFFSET)
48 #define RK808_RAMP_RATE_6MV_PER_US (2 << RK808_RAMP_RATE_OFFSET)
49 #define RK808_RAMP_RATE_10MV_PER_US (3 << RK808_RAMP_RATE_OFFSET)
51 #define RK808_DVS2_POL BIT(2)
52 #define RK808_DVS1_POL BIT(1)
54 /* Offset from XXX_ON_VSEL to XXX_SLP_VSEL */
55 #define RK808_SLP_REG_OFFSET 1
57 /* Offset from XXX_ON_VSEL to XXX_DVS_VSEL */
58 #define RK808_DVS_REG_OFFSET 2
60 /* Offset from XXX_EN_REG to SLEEP_SET_OFF_XXX */
61 #define RK808_SLP_SET_OFF_REG_OFFSET 2
63 /* max steps for increase voltage of Buck1/2, equal 100mv*/
64 #define MAX_STEPS_ONE_TIME 8
66 #define ENABLE_MASK(id) (BIT(id) | BIT(4 + (id)))
67 #define DISABLE_VAL(id) (BIT(4 + (id)))
69 #define RK817_BOOST_DESC(_id, _match, _supply, _min, _max, _step, _vreg,\
70 _vmask, _ereg, _emask, _enval, _disval, _etime, m_drop) \
73 .supply_name = (_supply), \
74 .of_match = of_match_ptr(_match), \
75 .regulators_node = of_match_ptr("regulators"), \
76 .type = REGULATOR_VOLTAGE, \
78 .n_voltages = (((_max) - (_min)) / (_step) + 1), \
79 .owner = THIS_MODULE, \
80 .min_uV = (_min) * 1000, \
81 .uV_step = (_step) * 1000, \
82 .vsel_reg = (_vreg), \
83 .vsel_mask = (_vmask), \
84 .enable_reg = (_ereg), \
85 .enable_mask = (_emask), \
86 .enable_val = (_enval), \
87 .disable_val = (_disval), \
88 .enable_time = (_etime), \
89 .min_dropout_uV = (m_drop) * 1000, \
90 .ops = &rk817_boost_ops, \
93 #define RK8XX_DESC_COM(_id, _match, _supply, _min, _max, _step, _vreg, \
94 _vmask, _ereg, _emask, _enval, _disval, _etime, _ops) \
97 .supply_name = (_supply), \
98 .of_match = of_match_ptr(_match), \
99 .regulators_node = of_match_ptr("regulators"), \
100 .type = REGULATOR_VOLTAGE, \
102 .n_voltages = (((_max) - (_min)) / (_step) + 1), \
103 .owner = THIS_MODULE, \
104 .min_uV = (_min) * 1000, \
105 .uV_step = (_step) * 1000, \
106 .vsel_reg = (_vreg), \
107 .vsel_mask = (_vmask), \
108 .enable_reg = (_ereg), \
109 .enable_mask = (_emask), \
110 .enable_val = (_enval), \
111 .disable_val = (_disval), \
112 .enable_time = (_etime), \
116 #define RK805_DESC(_id, _match, _supply, _min, _max, _step, _vreg, \
117 _vmask, _ereg, _emask, _etime) \
118 RK8XX_DESC_COM(_id, _match, _supply, _min, _max, _step, _vreg, \
119 _vmask, _ereg, _emask, 0, 0, _etime, &rk805_reg_ops)
121 #define RK8XX_DESC(_id, _match, _supply, _min, _max, _step, _vreg, \
122 _vmask, _ereg, _emask, _etime) \
123 RK8XX_DESC_COM(_id, _match, _supply, _min, _max, _step, _vreg, \
124 _vmask, _ereg, _emask, 0, 0, _etime, &rk808_reg_ops)
126 #define RK817_DESC(_id, _match, _supply, _min, _max, _step, _vreg, \
127 _vmask, _ereg, _emask, _disval, _etime) \
128 RK8XX_DESC_COM(_id, _match, _supply, _min, _max, _step, _vreg, \
129 _vmask, _ereg, _emask, _emask, _disval, _etime, &rk817_reg_ops)
131 #define RKXX_DESC_SWITCH_COM(_id, _match, _supply, _ereg, _emask, \
132 _enval, _disval, _ops) \
135 .supply_name = (_supply), \
136 .of_match = of_match_ptr(_match), \
137 .regulators_node = of_match_ptr("regulators"), \
138 .type = REGULATOR_VOLTAGE, \
140 .enable_reg = (_ereg), \
141 .enable_mask = (_emask), \
142 .enable_val = (_enval), \
143 .disable_val = (_disval), \
144 .owner = THIS_MODULE, \
148 #define RK817_DESC_SWITCH(_id, _match, _supply, _ereg, _emask, \
150 RKXX_DESC_SWITCH_COM(_id, _match, _supply, _ereg, _emask, \
151 _emask, _disval, &rk817_switch_ops)
153 #define RK8XX_DESC_SWITCH(_id, _match, _supply, _ereg, _emask) \
154 RKXX_DESC_SWITCH_COM(_id, _match, _supply, _ereg, _emask, \
155 0, 0, &rk808_switch_ops)
157 struct rk808_regulator_data {
158 struct gpio_desc *dvs_gpio[2];
161 static const struct linear_range rk808_ldo3_voltage_ranges[] = {
162 REGULATOR_LINEAR_RANGE(800000, 0, 13, 100000),
163 REGULATOR_LINEAR_RANGE(2500000, 15, 15, 0),
166 #define RK809_BUCK5_SEL_CNT (8)
168 static const struct linear_range rk809_buck5_voltage_ranges[] = {
169 REGULATOR_LINEAR_RANGE(1500000, 0, 0, 0),
170 REGULATOR_LINEAR_RANGE(1800000, 1, 3, 200000),
171 REGULATOR_LINEAR_RANGE(2800000, 4, 5, 200000),
172 REGULATOR_LINEAR_RANGE(3300000, 6, 7, 300000),
175 #define RK817_BUCK1_MIN0 500000
176 #define RK817_BUCK1_MAX0 1500000
178 #define RK817_BUCK1_MIN1 1600000
179 #define RK817_BUCK1_MAX1 2400000
181 #define RK817_BUCK3_MAX1 3400000
183 #define RK817_BUCK1_STP0 12500
184 #define RK817_BUCK1_STP1 100000
186 #define RK817_BUCK1_SEL0 ((RK817_BUCK1_MAX0 - RK817_BUCK1_MIN0) /\
188 #define RK817_BUCK1_SEL1 ((RK817_BUCK1_MAX1 - RK817_BUCK1_MIN1) /\
191 #define RK817_BUCK3_SEL1 ((RK817_BUCK3_MAX1 - RK817_BUCK1_MIN1) /\
194 #define RK817_BUCK1_SEL_CNT (RK817_BUCK1_SEL0 + RK817_BUCK1_SEL1 + 1)
195 #define RK817_BUCK3_SEL_CNT (RK817_BUCK1_SEL0 + RK817_BUCK3_SEL1 + 1)
197 static const struct linear_range rk817_buck1_voltage_ranges[] = {
198 REGULATOR_LINEAR_RANGE(RK817_BUCK1_MIN0, 0,
199 RK817_BUCK1_SEL0, RK817_BUCK1_STP0),
200 REGULATOR_LINEAR_RANGE(RK817_BUCK1_MIN1, RK817_BUCK1_SEL0 + 1,
201 RK817_BUCK1_SEL_CNT, RK817_BUCK1_STP1),
204 static const struct linear_range rk817_buck3_voltage_ranges[] = {
205 REGULATOR_LINEAR_RANGE(RK817_BUCK1_MIN0, 0,
206 RK817_BUCK1_SEL0, RK817_BUCK1_STP0),
207 REGULATOR_LINEAR_RANGE(RK817_BUCK1_MIN1, RK817_BUCK1_SEL0 + 1,
208 RK817_BUCK3_SEL_CNT, RK817_BUCK1_STP1),
211 static const unsigned int rk808_buck1_2_ramp_table[] = {
212 2000, 4000, 6000, 10000
216 static const unsigned int rk817_buck1_4_ramp_table[] = {
217 3000, 6300, 12500, 25000
220 static int rk808_buck1_2_get_voltage_sel_regmap(struct regulator_dev *rdev)
222 struct rk808_regulator_data *pdata = rdev_get_drvdata(rdev);
223 int id = rdev_get_id(rdev);
224 struct gpio_desc *gpio = pdata->dvs_gpio[id];
228 if (!gpio || gpiod_get_value(gpio) == 0)
229 return regulator_get_voltage_sel_regmap(rdev);
231 ret = regmap_read(rdev->regmap,
232 rdev->desc->vsel_reg + RK808_DVS_REG_OFFSET,
237 val &= rdev->desc->vsel_mask;
238 val >>= ffs(rdev->desc->vsel_mask) - 1;
243 static int rk808_buck1_2_i2c_set_voltage_sel(struct regulator_dev *rdev,
247 unsigned int old_sel, tmp, val, mask = rdev->desc->vsel_mask;
249 ret = regmap_read(rdev->regmap, rdev->desc->vsel_reg, &val);
254 old_sel = val & mask;
255 old_sel >>= ffs(mask) - 1;
256 delta_sel = sel - old_sel;
259 * If directly modify the register to change the voltage, we will face
260 * the risk of overshoot. Put it into a multi-step, can effectively
261 * avoid this problem, a step is 100mv here.
263 while (delta_sel > MAX_STEPS_ONE_TIME) {
264 old_sel += MAX_STEPS_ONE_TIME;
265 val = old_sel << (ffs(mask) - 1);
269 * i2c is 400kHz (2.5us per bit) and we must transmit _at least_
270 * 3 bytes (24 bits) plus start and stop so 26 bits. So we've
271 * got more than 65 us between each voltage change and thus
272 * won't ramp faster than ~1500 uV / us.
274 ret = regmap_write(rdev->regmap, rdev->desc->vsel_reg, val);
275 delta_sel = sel - old_sel;
278 sel <<= ffs(mask) - 1;
280 ret = regmap_write(rdev->regmap, rdev->desc->vsel_reg, val);
283 * When we change the voltage register directly, the ramp rate is about
284 * 100000uv/us, wait 1us to make sure the target voltage to be stable,
285 * so we needn't wait extra time after that.
292 static int rk808_buck1_2_set_voltage_sel(struct regulator_dev *rdev,
295 struct rk808_regulator_data *pdata = rdev_get_drvdata(rdev);
296 int id = rdev_get_id(rdev);
297 struct gpio_desc *gpio = pdata->dvs_gpio[id];
298 unsigned int reg = rdev->desc->vsel_reg;
303 return rk808_buck1_2_i2c_set_voltage_sel(rdev, sel);
305 gpio_level = gpiod_get_value(gpio);
306 if (gpio_level == 0) {
307 reg += RK808_DVS_REG_OFFSET;
308 ret = regmap_read(rdev->regmap, rdev->desc->vsel_reg, &old_sel);
310 ret = regmap_read(rdev->regmap,
311 reg + RK808_DVS_REG_OFFSET,
318 sel <<= ffs(rdev->desc->vsel_mask) - 1;
319 sel |= old_sel & ~rdev->desc->vsel_mask;
321 ret = regmap_write(rdev->regmap, reg, sel);
325 gpiod_set_value(gpio, !gpio_level);
330 static int rk808_buck1_2_set_voltage_time_sel(struct regulator_dev *rdev,
331 unsigned int old_selector,
332 unsigned int new_selector)
334 struct rk808_regulator_data *pdata = rdev_get_drvdata(rdev);
335 int id = rdev_get_id(rdev);
336 struct gpio_desc *gpio = pdata->dvs_gpio[id];
338 /* if there is no dvs1/2 pin, we don't need wait extra time here. */
342 return regulator_set_voltage_time_sel(rdev, old_selector, new_selector);
345 static int rk808_set_suspend_voltage(struct regulator_dev *rdev, int uv)
348 int sel = regulator_map_voltage_linear(rdev, uv, uv);
353 reg = rdev->desc->vsel_reg + RK808_SLP_REG_OFFSET;
355 return regmap_update_bits(rdev->regmap, reg,
356 rdev->desc->vsel_mask,
360 static int rk808_set_suspend_voltage_range(struct regulator_dev *rdev, int uv)
363 int sel = regulator_map_voltage_linear_range(rdev, uv, uv);
368 reg = rdev->desc->vsel_reg + RK808_SLP_REG_OFFSET;
370 return regmap_update_bits(rdev->regmap, reg,
371 rdev->desc->vsel_mask,
375 static int rk805_set_suspend_enable(struct regulator_dev *rdev)
379 reg = rdev->desc->enable_reg + RK808_SLP_SET_OFF_REG_OFFSET;
381 return regmap_update_bits(rdev->regmap, reg,
382 rdev->desc->enable_mask,
383 rdev->desc->enable_mask);
386 static int rk805_set_suspend_disable(struct regulator_dev *rdev)
390 reg = rdev->desc->enable_reg + RK808_SLP_SET_OFF_REG_OFFSET;
392 return regmap_update_bits(rdev->regmap, reg,
393 rdev->desc->enable_mask,
397 static int rk808_set_suspend_enable(struct regulator_dev *rdev)
401 reg = rdev->desc->enable_reg + RK808_SLP_SET_OFF_REG_OFFSET;
403 return regmap_update_bits(rdev->regmap, reg,
404 rdev->desc->enable_mask,
408 static int rk808_set_suspend_disable(struct regulator_dev *rdev)
412 reg = rdev->desc->enable_reg + RK808_SLP_SET_OFF_REG_OFFSET;
414 return regmap_update_bits(rdev->regmap, reg,
415 rdev->desc->enable_mask,
416 rdev->desc->enable_mask);
419 static int rk817_set_suspend_enable_ctrl(struct regulator_dev *rdev,
423 int id = rdev_get_id(rdev);
424 unsigned int id_slp, msk, val;
426 if (id >= RK817_ID_DCDC1 && id <= RK817_ID_DCDC4)
428 else if (id >= RK817_ID_LDO1 && id <= RK817_ID_LDO8)
429 id_slp = 8 + (id - RK817_ID_LDO1);
430 else if (id >= RK817_ID_LDO9 && id <= RK809_ID_SW2)
431 id_slp = 4 + (id - RK817_ID_LDO9);
435 reg = RK817_POWER_SLP_EN_REG(id_slp / 8);
437 msk = BIT(id_slp % 8);
443 return regmap_update_bits(rdev->regmap, reg, msk, val);
446 static int rk817_set_suspend_enable(struct regulator_dev *rdev)
448 return rk817_set_suspend_enable_ctrl(rdev, 1);
451 static int rk817_set_suspend_disable(struct regulator_dev *rdev)
453 return rk817_set_suspend_enable_ctrl(rdev, 0);
456 static int rk8xx_set_suspend_mode(struct regulator_dev *rdev, unsigned int mode)
460 reg = rdev->desc->vsel_reg + RK808_SLP_REG_OFFSET;
463 case REGULATOR_MODE_FAST:
464 return regmap_update_bits(rdev->regmap, reg,
465 PWM_MODE_MSK, FPWM_MODE);
466 case REGULATOR_MODE_NORMAL:
467 return regmap_update_bits(rdev->regmap, reg,
468 PWM_MODE_MSK, AUTO_PWM_MODE);
470 dev_err(&rdev->dev, "do not support this mode\n");
477 static int rk8xx_set_mode(struct regulator_dev *rdev, unsigned int mode)
480 case REGULATOR_MODE_FAST:
481 return regmap_update_bits(rdev->regmap, rdev->desc->vsel_reg,
482 PWM_MODE_MSK, FPWM_MODE);
483 case REGULATOR_MODE_NORMAL:
484 return regmap_update_bits(rdev->regmap, rdev->desc->vsel_reg,
485 PWM_MODE_MSK, AUTO_PWM_MODE);
487 dev_err(&rdev->dev, "do not support this mode\n");
494 static unsigned int rk8xx_get_mode(struct regulator_dev *rdev)
499 err = regmap_read(rdev->regmap, rdev->desc->vsel_reg, &val);
504 return REGULATOR_MODE_FAST;
506 return REGULATOR_MODE_NORMAL;
509 static int rk8xx_is_enabled_wmsk_regmap(struct regulator_dev *rdev)
514 ret = regmap_read(rdev->regmap, rdev->desc->enable_reg, &val);
518 /* add write mask bit */
519 val |= (rdev->desc->enable_mask & 0xf0);
520 val &= rdev->desc->enable_mask;
522 if (rdev->desc->enable_is_inverted) {
523 if (rdev->desc->enable_val)
524 return val != rdev->desc->enable_val;
527 if (rdev->desc->enable_val)
528 return val == rdev->desc->enable_val;
532 static unsigned int rk8xx_regulator_of_map_mode(unsigned int mode)
536 return REGULATOR_MODE_FAST;
538 return REGULATOR_MODE_NORMAL;
540 return REGULATOR_MODE_INVALID;
544 static const struct regulator_ops rk805_reg_ops = {
545 .list_voltage = regulator_list_voltage_linear,
546 .map_voltage = regulator_map_voltage_linear,
547 .get_voltage_sel = regulator_get_voltage_sel_regmap,
548 .set_voltage_sel = regulator_set_voltage_sel_regmap,
549 .enable = regulator_enable_regmap,
550 .disable = regulator_disable_regmap,
551 .is_enabled = regulator_is_enabled_regmap,
552 .set_suspend_voltage = rk808_set_suspend_voltage,
553 .set_suspend_enable = rk805_set_suspend_enable,
554 .set_suspend_disable = rk805_set_suspend_disable,
557 static const struct regulator_ops rk805_switch_ops = {
558 .enable = regulator_enable_regmap,
559 .disable = regulator_disable_regmap,
560 .is_enabled = regulator_is_enabled_regmap,
561 .set_suspend_enable = rk805_set_suspend_enable,
562 .set_suspend_disable = rk805_set_suspend_disable,
565 static const struct regulator_ops rk808_buck1_2_ops = {
566 .list_voltage = regulator_list_voltage_linear,
567 .map_voltage = regulator_map_voltage_linear,
568 .get_voltage_sel = rk808_buck1_2_get_voltage_sel_regmap,
569 .set_voltage_sel = rk808_buck1_2_set_voltage_sel,
570 .set_voltage_time_sel = rk808_buck1_2_set_voltage_time_sel,
571 .enable = regulator_enable_regmap,
572 .disable = regulator_disable_regmap,
573 .is_enabled = regulator_is_enabled_regmap,
574 .set_ramp_delay = regulator_set_ramp_delay_regmap,
575 .set_suspend_voltage = rk808_set_suspend_voltage,
576 .set_suspend_enable = rk808_set_suspend_enable,
577 .set_suspend_disable = rk808_set_suspend_disable,
580 static const struct regulator_ops rk808_reg_ops = {
581 .list_voltage = regulator_list_voltage_linear,
582 .map_voltage = regulator_map_voltage_linear,
583 .get_voltage_sel = regulator_get_voltage_sel_regmap,
584 .set_voltage_sel = regulator_set_voltage_sel_regmap,
585 .enable = regulator_enable_regmap,
586 .disable = regulator_disable_regmap,
587 .is_enabled = regulator_is_enabled_regmap,
588 .set_suspend_voltage = rk808_set_suspend_voltage,
589 .set_suspend_enable = rk808_set_suspend_enable,
590 .set_suspend_disable = rk808_set_suspend_disable,
593 static const struct regulator_ops rk808_reg_ops_ranges = {
594 .list_voltage = regulator_list_voltage_linear_range,
595 .map_voltage = regulator_map_voltage_linear_range,
596 .get_voltage_sel = regulator_get_voltage_sel_regmap,
597 .set_voltage_sel = regulator_set_voltage_sel_regmap,
598 .enable = regulator_enable_regmap,
599 .disable = regulator_disable_regmap,
600 .is_enabled = regulator_is_enabled_regmap,
601 .set_suspend_voltage = rk808_set_suspend_voltage_range,
602 .set_suspend_enable = rk808_set_suspend_enable,
603 .set_suspend_disable = rk808_set_suspend_disable,
606 static const struct regulator_ops rk808_switch_ops = {
607 .enable = regulator_enable_regmap,
608 .disable = regulator_disable_regmap,
609 .is_enabled = regulator_is_enabled_regmap,
610 .set_suspend_enable = rk808_set_suspend_enable,
611 .set_suspend_disable = rk808_set_suspend_disable,
614 static const struct linear_range rk805_buck_1_2_voltage_ranges[] = {
615 REGULATOR_LINEAR_RANGE(712500, 0, 59, 12500),
616 REGULATOR_LINEAR_RANGE(1800000, 60, 62, 200000),
617 REGULATOR_LINEAR_RANGE(2300000, 63, 63, 0),
620 static const struct regulator_ops rk809_buck5_ops_range = {
621 .list_voltage = regulator_list_voltage_linear_range,
622 .map_voltage = regulator_map_voltage_linear_range,
623 .get_voltage_sel = regulator_get_voltage_sel_regmap,
624 .set_voltage_sel = regulator_set_voltage_sel_regmap,
625 .set_voltage_time_sel = regulator_set_voltage_time_sel,
626 .enable = regulator_enable_regmap,
627 .disable = regulator_disable_regmap,
628 .is_enabled = rk8xx_is_enabled_wmsk_regmap,
629 .set_suspend_voltage = rk808_set_suspend_voltage_range,
630 .set_suspend_enable = rk817_set_suspend_enable,
631 .set_suspend_disable = rk817_set_suspend_disable,
634 static const struct regulator_ops rk817_reg_ops = {
635 .list_voltage = regulator_list_voltage_linear,
636 .map_voltage = regulator_map_voltage_linear,
637 .get_voltage_sel = regulator_get_voltage_sel_regmap,
638 .set_voltage_sel = regulator_set_voltage_sel_regmap,
639 .enable = regulator_enable_regmap,
640 .disable = regulator_disable_regmap,
641 .is_enabled = rk8xx_is_enabled_wmsk_regmap,
642 .set_suspend_voltage = rk808_set_suspend_voltage,
643 .set_suspend_enable = rk817_set_suspend_enable,
644 .set_suspend_disable = rk817_set_suspend_disable,
647 static const struct regulator_ops rk817_boost_ops = {
648 .list_voltage = regulator_list_voltage_linear,
649 .map_voltage = regulator_map_voltage_linear,
650 .get_voltage_sel = regulator_get_voltage_sel_regmap,
651 .set_voltage_sel = regulator_set_voltage_sel_regmap,
652 .enable = regulator_enable_regmap,
653 .disable = regulator_disable_regmap,
654 .is_enabled = rk8xx_is_enabled_wmsk_regmap,
655 .set_suspend_enable = rk817_set_suspend_enable,
656 .set_suspend_disable = rk817_set_suspend_disable,
659 static const struct regulator_ops rk817_buck_ops_range = {
660 .list_voltage = regulator_list_voltage_linear_range,
661 .map_voltage = regulator_map_voltage_linear_range,
662 .get_voltage_sel = regulator_get_voltage_sel_regmap,
663 .set_voltage_sel = regulator_set_voltage_sel_regmap,
664 .set_voltage_time_sel = regulator_set_voltage_time_sel,
665 .enable = regulator_enable_regmap,
666 .disable = regulator_disable_regmap,
667 .is_enabled = rk8xx_is_enabled_wmsk_regmap,
668 .set_mode = rk8xx_set_mode,
669 .get_mode = rk8xx_get_mode,
670 .set_suspend_mode = rk8xx_set_suspend_mode,
671 .set_ramp_delay = regulator_set_ramp_delay_regmap,
672 .set_suspend_voltage = rk808_set_suspend_voltage_range,
673 .set_suspend_enable = rk817_set_suspend_enable,
674 .set_suspend_disable = rk817_set_suspend_disable,
677 static const struct regulator_ops rk817_switch_ops = {
678 .enable = regulator_enable_regmap,
679 .disable = regulator_disable_regmap,
680 .is_enabled = rk8xx_is_enabled_wmsk_regmap,
681 .set_suspend_enable = rk817_set_suspend_enable,
682 .set_suspend_disable = rk817_set_suspend_disable,
685 static const struct regulator_desc rk805_reg[] = {
688 .supply_name = "vcc1",
689 .of_match = of_match_ptr("DCDC_REG1"),
690 .regulators_node = of_match_ptr("regulators"),
691 .id = RK805_ID_DCDC1,
692 .ops = &rk808_reg_ops_ranges,
693 .type = REGULATOR_VOLTAGE,
695 .linear_ranges = rk805_buck_1_2_voltage_ranges,
696 .n_linear_ranges = ARRAY_SIZE(rk805_buck_1_2_voltage_ranges),
697 .vsel_reg = RK805_BUCK1_ON_VSEL_REG,
698 .vsel_mask = RK818_BUCK_VSEL_MASK,
699 .enable_reg = RK805_DCDC_EN_REG,
700 .enable_mask = BIT(0),
701 .owner = THIS_MODULE,
704 .supply_name = "vcc2",
705 .of_match = of_match_ptr("DCDC_REG2"),
706 .regulators_node = of_match_ptr("regulators"),
707 .id = RK805_ID_DCDC2,
708 .ops = &rk808_reg_ops_ranges,
709 .type = REGULATOR_VOLTAGE,
711 .linear_ranges = rk805_buck_1_2_voltage_ranges,
712 .n_linear_ranges = ARRAY_SIZE(rk805_buck_1_2_voltage_ranges),
713 .vsel_reg = RK805_BUCK2_ON_VSEL_REG,
714 .vsel_mask = RK818_BUCK_VSEL_MASK,
715 .enable_reg = RK805_DCDC_EN_REG,
716 .enable_mask = BIT(1),
717 .owner = THIS_MODULE,
720 .supply_name = "vcc3",
721 .of_match = of_match_ptr("DCDC_REG3"),
722 .regulators_node = of_match_ptr("regulators"),
723 .id = RK805_ID_DCDC3,
724 .ops = &rk805_switch_ops,
725 .type = REGULATOR_VOLTAGE,
727 .enable_reg = RK805_DCDC_EN_REG,
728 .enable_mask = BIT(2),
729 .owner = THIS_MODULE,
732 RK805_DESC(RK805_ID_DCDC4, "DCDC_REG4", "vcc4", 800, 3400, 100,
733 RK805_BUCK4_ON_VSEL_REG, RK818_BUCK4_VSEL_MASK,
734 RK805_DCDC_EN_REG, BIT(3), 0),
736 RK805_DESC(RK805_ID_LDO1, "LDO_REG1", "vcc5", 800, 3400, 100,
737 RK805_LDO1_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK805_LDO_EN_REG,
739 RK805_DESC(RK805_ID_LDO2, "LDO_REG2", "vcc5", 800, 3400, 100,
740 RK805_LDO2_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK805_LDO_EN_REG,
742 RK805_DESC(RK805_ID_LDO3, "LDO_REG3", "vcc6", 800, 3400, 100,
743 RK805_LDO3_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK805_LDO_EN_REG,
747 static const struct regulator_desc rk808_reg[] = {
750 .supply_name = "vcc1",
751 .of_match = of_match_ptr("DCDC_REG1"),
752 .regulators_node = of_match_ptr("regulators"),
753 .id = RK808_ID_DCDC1,
754 .ops = &rk808_buck1_2_ops,
755 .type = REGULATOR_VOLTAGE,
759 .vsel_reg = RK808_BUCK1_ON_VSEL_REG,
760 .vsel_mask = RK808_BUCK_VSEL_MASK,
761 .enable_reg = RK808_DCDC_EN_REG,
762 .enable_mask = BIT(0),
763 .ramp_reg = RK808_BUCK1_CONFIG_REG,
764 .ramp_mask = RK808_RAMP_RATE_MASK,
765 .ramp_delay_table = rk808_buck1_2_ramp_table,
766 .n_ramp_values = ARRAY_SIZE(rk808_buck1_2_ramp_table),
767 .owner = THIS_MODULE,
770 .supply_name = "vcc2",
771 .of_match = of_match_ptr("DCDC_REG2"),
772 .regulators_node = of_match_ptr("regulators"),
773 .id = RK808_ID_DCDC2,
774 .ops = &rk808_buck1_2_ops,
775 .type = REGULATOR_VOLTAGE,
779 .vsel_reg = RK808_BUCK2_ON_VSEL_REG,
780 .vsel_mask = RK808_BUCK_VSEL_MASK,
781 .enable_reg = RK808_DCDC_EN_REG,
782 .enable_mask = BIT(1),
783 .ramp_reg = RK808_BUCK2_CONFIG_REG,
784 .ramp_mask = RK808_RAMP_RATE_MASK,
785 .ramp_delay_table = rk808_buck1_2_ramp_table,
786 .n_ramp_values = ARRAY_SIZE(rk808_buck1_2_ramp_table),
787 .owner = THIS_MODULE,
790 .supply_name = "vcc3",
791 .of_match = of_match_ptr("DCDC_REG3"),
792 .regulators_node = of_match_ptr("regulators"),
793 .id = RK808_ID_DCDC3,
794 .ops = &rk808_switch_ops,
795 .type = REGULATOR_VOLTAGE,
797 .enable_reg = RK808_DCDC_EN_REG,
798 .enable_mask = BIT(2),
799 .owner = THIS_MODULE,
801 RK8XX_DESC(RK808_ID_DCDC4, "DCDC_REG4", "vcc4", 1800, 3300, 100,
802 RK808_BUCK4_ON_VSEL_REG, RK808_BUCK4_VSEL_MASK,
803 RK808_DCDC_EN_REG, BIT(3), 0),
804 RK8XX_DESC(RK808_ID_LDO1, "LDO_REG1", "vcc6", 1800, 3400, 100,
805 RK808_LDO1_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
807 RK8XX_DESC(RK808_ID_LDO2, "LDO_REG2", "vcc6", 1800, 3400, 100,
808 RK808_LDO2_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
812 .supply_name = "vcc7",
813 .of_match = of_match_ptr("LDO_REG3"),
814 .regulators_node = of_match_ptr("regulators"),
816 .ops = &rk808_reg_ops_ranges,
817 .type = REGULATOR_VOLTAGE,
819 .linear_ranges = rk808_ldo3_voltage_ranges,
820 .n_linear_ranges = ARRAY_SIZE(rk808_ldo3_voltage_ranges),
821 .vsel_reg = RK808_LDO3_ON_VSEL_REG,
822 .vsel_mask = RK808_BUCK4_VSEL_MASK,
823 .enable_reg = RK808_LDO_EN_REG,
824 .enable_mask = BIT(2),
826 .owner = THIS_MODULE,
828 RK8XX_DESC(RK808_ID_LDO4, "LDO_REG4", "vcc9", 1800, 3400, 100,
829 RK808_LDO4_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
831 RK8XX_DESC(RK808_ID_LDO5, "LDO_REG5", "vcc9", 1800, 3400, 100,
832 RK808_LDO5_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
834 RK8XX_DESC(RK808_ID_LDO6, "LDO_REG6", "vcc10", 800, 2500, 100,
835 RK808_LDO6_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
837 RK8XX_DESC(RK808_ID_LDO7, "LDO_REG7", "vcc7", 800, 2500, 100,
838 RK808_LDO7_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
840 RK8XX_DESC(RK808_ID_LDO8, "LDO_REG8", "vcc11", 1800, 3400, 100,
841 RK808_LDO8_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
843 RK8XX_DESC_SWITCH(RK808_ID_SWITCH1, "SWITCH_REG1", "vcc8",
844 RK808_DCDC_EN_REG, BIT(5)),
845 RK8XX_DESC_SWITCH(RK808_ID_SWITCH2, "SWITCH_REG2", "vcc12",
846 RK808_DCDC_EN_REG, BIT(6)),
849 static const struct regulator_desc rk809_reg[] = {
852 .supply_name = "vcc1",
853 .of_match = of_match_ptr("DCDC_REG1"),
854 .regulators_node = of_match_ptr("regulators"),
855 .id = RK817_ID_DCDC1,
856 .ops = &rk817_buck_ops_range,
857 .type = REGULATOR_VOLTAGE,
858 .n_voltages = RK817_BUCK1_SEL_CNT + 1,
859 .linear_ranges = rk817_buck1_voltage_ranges,
860 .n_linear_ranges = ARRAY_SIZE(rk817_buck1_voltage_ranges),
861 .vsel_reg = RK817_BUCK1_ON_VSEL_REG,
862 .vsel_mask = RK817_BUCK_VSEL_MASK,
863 .enable_reg = RK817_POWER_EN_REG(0),
864 .enable_mask = ENABLE_MASK(RK817_ID_DCDC1),
865 .enable_val = ENABLE_MASK(RK817_ID_DCDC1),
866 .disable_val = DISABLE_VAL(RK817_ID_DCDC1),
867 .ramp_reg = RK817_BUCK_CONFIG_REG(RK817_ID_DCDC1),
868 .ramp_mask = RK817_RAMP_RATE_MASK,
869 .ramp_delay_table = rk817_buck1_4_ramp_table,
870 .n_ramp_values = ARRAY_SIZE(rk817_buck1_4_ramp_table),
871 .of_map_mode = rk8xx_regulator_of_map_mode,
872 .owner = THIS_MODULE,
875 .supply_name = "vcc2",
876 .of_match = of_match_ptr("DCDC_REG2"),
877 .regulators_node = of_match_ptr("regulators"),
878 .id = RK817_ID_DCDC2,
879 .ops = &rk817_buck_ops_range,
880 .type = REGULATOR_VOLTAGE,
881 .n_voltages = RK817_BUCK1_SEL_CNT + 1,
882 .linear_ranges = rk817_buck1_voltage_ranges,
883 .n_linear_ranges = ARRAY_SIZE(rk817_buck1_voltage_ranges),
884 .vsel_reg = RK817_BUCK2_ON_VSEL_REG,
885 .vsel_mask = RK817_BUCK_VSEL_MASK,
886 .enable_reg = RK817_POWER_EN_REG(0),
887 .enable_mask = ENABLE_MASK(RK817_ID_DCDC2),
888 .enable_val = ENABLE_MASK(RK817_ID_DCDC2),
889 .disable_val = DISABLE_VAL(RK817_ID_DCDC2),
890 .ramp_reg = RK817_BUCK_CONFIG_REG(RK817_ID_DCDC2),
891 .ramp_mask = RK817_RAMP_RATE_MASK,
892 .ramp_delay_table = rk817_buck1_4_ramp_table,
893 .n_ramp_values = ARRAY_SIZE(rk817_buck1_4_ramp_table),
894 .of_map_mode = rk8xx_regulator_of_map_mode,
895 .owner = THIS_MODULE,
898 .supply_name = "vcc3",
899 .of_match = of_match_ptr("DCDC_REG3"),
900 .regulators_node = of_match_ptr("regulators"),
901 .id = RK817_ID_DCDC3,
902 .ops = &rk817_buck_ops_range,
903 .type = REGULATOR_VOLTAGE,
904 .n_voltages = RK817_BUCK1_SEL_CNT + 1,
905 .linear_ranges = rk817_buck1_voltage_ranges,
906 .n_linear_ranges = ARRAY_SIZE(rk817_buck1_voltage_ranges),
907 .vsel_reg = RK817_BUCK3_ON_VSEL_REG,
908 .vsel_mask = RK817_BUCK_VSEL_MASK,
909 .enable_reg = RK817_POWER_EN_REG(0),
910 .enable_mask = ENABLE_MASK(RK817_ID_DCDC3),
911 .enable_val = ENABLE_MASK(RK817_ID_DCDC3),
912 .disable_val = DISABLE_VAL(RK817_ID_DCDC3),
913 .ramp_reg = RK817_BUCK_CONFIG_REG(RK817_ID_DCDC3),
914 .ramp_mask = RK817_RAMP_RATE_MASK,
915 .ramp_delay_table = rk817_buck1_4_ramp_table,
916 .n_ramp_values = ARRAY_SIZE(rk817_buck1_4_ramp_table),
917 .of_map_mode = rk8xx_regulator_of_map_mode,
918 .owner = THIS_MODULE,
921 .supply_name = "vcc4",
922 .of_match = of_match_ptr("DCDC_REG4"),
923 .regulators_node = of_match_ptr("regulators"),
924 .id = RK817_ID_DCDC4,
925 .ops = &rk817_buck_ops_range,
926 .type = REGULATOR_VOLTAGE,
927 .n_voltages = RK817_BUCK3_SEL_CNT + 1,
928 .linear_ranges = rk817_buck3_voltage_ranges,
929 .n_linear_ranges = ARRAY_SIZE(rk817_buck3_voltage_ranges),
930 .vsel_reg = RK817_BUCK4_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_DCDC4),
934 .enable_val = ENABLE_MASK(RK817_ID_DCDC4),
935 .disable_val = DISABLE_VAL(RK817_ID_DCDC4),
936 .ramp_reg = RK817_BUCK_CONFIG_REG(RK817_ID_DCDC4),
937 .ramp_mask = RK817_RAMP_RATE_MASK,
938 .ramp_delay_table = rk817_buck1_4_ramp_table,
939 .n_ramp_values = ARRAY_SIZE(rk817_buck1_4_ramp_table),
940 .of_map_mode = rk8xx_regulator_of_map_mode,
941 .owner = THIS_MODULE,
945 .supply_name = "vcc9",
946 .of_match = of_match_ptr("DCDC_REG5"),
947 .regulators_node = of_match_ptr("regulators"),
948 .id = RK809_ID_DCDC5,
949 .ops = &rk809_buck5_ops_range,
950 .type = REGULATOR_VOLTAGE,
951 .n_voltages = RK809_BUCK5_SEL_CNT,
952 .linear_ranges = rk809_buck5_voltage_ranges,
953 .n_linear_ranges = ARRAY_SIZE(rk809_buck5_voltage_ranges),
954 .vsel_reg = RK809_BUCK5_CONFIG(0),
955 .vsel_mask = RK809_BUCK5_VSEL_MASK,
956 .enable_reg = RK817_POWER_EN_REG(3),
957 .enable_mask = ENABLE_MASK(1),
958 .enable_val = ENABLE_MASK(1),
959 .disable_val = DISABLE_VAL(1),
960 .of_map_mode = rk8xx_regulator_of_map_mode,
961 .owner = THIS_MODULE,
963 RK817_DESC(RK817_ID_LDO1, "LDO_REG1", "vcc5", 600, 3400, 25,
964 RK817_LDO_ON_VSEL_REG(0), RK817_LDO_VSEL_MASK,
965 RK817_POWER_EN_REG(1), ENABLE_MASK(0),
966 DISABLE_VAL(0), 400),
967 RK817_DESC(RK817_ID_LDO2, "LDO_REG2", "vcc5", 600, 3400, 25,
968 RK817_LDO_ON_VSEL_REG(1), RK817_LDO_VSEL_MASK,
969 RK817_POWER_EN_REG(1), ENABLE_MASK(1),
970 DISABLE_VAL(1), 400),
971 RK817_DESC(RK817_ID_LDO3, "LDO_REG3", "vcc5", 600, 3400, 25,
972 RK817_LDO_ON_VSEL_REG(2), RK817_LDO_VSEL_MASK,
973 RK817_POWER_EN_REG(1), ENABLE_MASK(2),
974 DISABLE_VAL(2), 400),
975 RK817_DESC(RK817_ID_LDO4, "LDO_REG4", "vcc6", 600, 3400, 25,
976 RK817_LDO_ON_VSEL_REG(3), RK817_LDO_VSEL_MASK,
977 RK817_POWER_EN_REG(1), ENABLE_MASK(3),
978 DISABLE_VAL(3), 400),
979 RK817_DESC(RK817_ID_LDO5, "LDO_REG5", "vcc6", 600, 3400, 25,
980 RK817_LDO_ON_VSEL_REG(4), RK817_LDO_VSEL_MASK,
981 RK817_POWER_EN_REG(2), ENABLE_MASK(0),
982 DISABLE_VAL(0), 400),
983 RK817_DESC(RK817_ID_LDO6, "LDO_REG6", "vcc6", 600, 3400, 25,
984 RK817_LDO_ON_VSEL_REG(5), RK817_LDO_VSEL_MASK,
985 RK817_POWER_EN_REG(2), ENABLE_MASK(1),
986 DISABLE_VAL(1), 400),
987 RK817_DESC(RK817_ID_LDO7, "LDO_REG7", "vcc7", 600, 3400, 25,
988 RK817_LDO_ON_VSEL_REG(6), RK817_LDO_VSEL_MASK,
989 RK817_POWER_EN_REG(2), ENABLE_MASK(2),
990 DISABLE_VAL(2), 400),
991 RK817_DESC(RK817_ID_LDO8, "LDO_REG8", "vcc7", 600, 3400, 25,
992 RK817_LDO_ON_VSEL_REG(7), RK817_LDO_VSEL_MASK,
993 RK817_POWER_EN_REG(2), ENABLE_MASK(3),
994 DISABLE_VAL(3), 400),
995 RK817_DESC(RK817_ID_LDO9, "LDO_REG9", "vcc7", 600, 3400, 25,
996 RK817_LDO_ON_VSEL_REG(8), RK817_LDO_VSEL_MASK,
997 RK817_POWER_EN_REG(3), ENABLE_MASK(0),
998 DISABLE_VAL(0), 400),
999 RK817_DESC_SWITCH(RK809_ID_SW1, "SWITCH_REG1", "vcc9",
1000 RK817_POWER_EN_REG(3), ENABLE_MASK(2),
1002 RK817_DESC_SWITCH(RK809_ID_SW2, "SWITCH_REG2", "vcc8",
1003 RK817_POWER_EN_REG(3), ENABLE_MASK(3),
1007 static const struct regulator_desc rk817_reg[] = {
1009 .name = "DCDC_REG1",
1010 .supply_name = "vcc1",
1011 .of_match = of_match_ptr("DCDC_REG1"),
1012 .regulators_node = of_match_ptr("regulators"),
1013 .id = RK817_ID_DCDC1,
1014 .ops = &rk817_buck_ops_range,
1015 .type = REGULATOR_VOLTAGE,
1016 .n_voltages = RK817_BUCK1_SEL_CNT + 1,
1017 .linear_ranges = rk817_buck1_voltage_ranges,
1018 .n_linear_ranges = ARRAY_SIZE(rk817_buck1_voltage_ranges),
1019 .vsel_reg = RK817_BUCK1_ON_VSEL_REG,
1020 .vsel_mask = RK817_BUCK_VSEL_MASK,
1021 .enable_reg = RK817_POWER_EN_REG(0),
1022 .enable_mask = ENABLE_MASK(RK817_ID_DCDC1),
1023 .enable_val = ENABLE_MASK(RK817_ID_DCDC1),
1024 .disable_val = DISABLE_VAL(RK817_ID_DCDC1),
1025 .ramp_reg = RK817_BUCK_CONFIG_REG(RK817_ID_DCDC1),
1026 .ramp_mask = RK817_RAMP_RATE_MASK,
1027 .ramp_delay_table = rk817_buck1_4_ramp_table,
1028 .n_ramp_values = ARRAY_SIZE(rk817_buck1_4_ramp_table),
1029 .of_map_mode = rk8xx_regulator_of_map_mode,
1030 .owner = THIS_MODULE,
1032 .name = "DCDC_REG2",
1033 .supply_name = "vcc2",
1034 .of_match = of_match_ptr("DCDC_REG2"),
1035 .regulators_node = of_match_ptr("regulators"),
1036 .id = RK817_ID_DCDC2,
1037 .ops = &rk817_buck_ops_range,
1038 .type = REGULATOR_VOLTAGE,
1039 .n_voltages = RK817_BUCK1_SEL_CNT + 1,
1040 .linear_ranges = rk817_buck1_voltage_ranges,
1041 .n_linear_ranges = ARRAY_SIZE(rk817_buck1_voltage_ranges),
1042 .vsel_reg = RK817_BUCK2_ON_VSEL_REG,
1043 .vsel_mask = RK817_BUCK_VSEL_MASK,
1044 .enable_reg = RK817_POWER_EN_REG(0),
1045 .enable_mask = ENABLE_MASK(RK817_ID_DCDC2),
1046 .enable_val = ENABLE_MASK(RK817_ID_DCDC2),
1047 .disable_val = DISABLE_VAL(RK817_ID_DCDC2),
1048 .ramp_reg = RK817_BUCK_CONFIG_REG(RK817_ID_DCDC2),
1049 .ramp_mask = RK817_RAMP_RATE_MASK,
1050 .ramp_delay_table = rk817_buck1_4_ramp_table,
1051 .n_ramp_values = ARRAY_SIZE(rk817_buck1_4_ramp_table),
1052 .of_map_mode = rk8xx_regulator_of_map_mode,
1053 .owner = THIS_MODULE,
1055 .name = "DCDC_REG3",
1056 .supply_name = "vcc3",
1057 .of_match = of_match_ptr("DCDC_REG3"),
1058 .regulators_node = of_match_ptr("regulators"),
1059 .id = RK817_ID_DCDC3,
1060 .ops = &rk817_buck_ops_range,
1061 .type = REGULATOR_VOLTAGE,
1062 .n_voltages = RK817_BUCK1_SEL_CNT + 1,
1063 .linear_ranges = rk817_buck1_voltage_ranges,
1064 .n_linear_ranges = ARRAY_SIZE(rk817_buck1_voltage_ranges),
1065 .vsel_reg = RK817_BUCK3_ON_VSEL_REG,
1066 .vsel_mask = RK817_BUCK_VSEL_MASK,
1067 .enable_reg = RK817_POWER_EN_REG(0),
1068 .enable_mask = ENABLE_MASK(RK817_ID_DCDC3),
1069 .enable_val = ENABLE_MASK(RK817_ID_DCDC3),
1070 .disable_val = DISABLE_VAL(RK817_ID_DCDC3),
1071 .ramp_reg = RK817_BUCK_CONFIG_REG(RK817_ID_DCDC3),
1072 .ramp_mask = RK817_RAMP_RATE_MASK,
1073 .ramp_delay_table = rk817_buck1_4_ramp_table,
1074 .n_ramp_values = ARRAY_SIZE(rk817_buck1_4_ramp_table),
1075 .of_map_mode = rk8xx_regulator_of_map_mode,
1076 .owner = THIS_MODULE,
1078 .name = "DCDC_REG4",
1079 .supply_name = "vcc4",
1080 .of_match = of_match_ptr("DCDC_REG4"),
1081 .regulators_node = of_match_ptr("regulators"),
1082 .id = RK817_ID_DCDC4,
1083 .ops = &rk817_buck_ops_range,
1084 .type = REGULATOR_VOLTAGE,
1085 .n_voltages = RK817_BUCK3_SEL_CNT + 1,
1086 .linear_ranges = rk817_buck3_voltage_ranges,
1087 .n_linear_ranges = ARRAY_SIZE(rk817_buck3_voltage_ranges),
1088 .vsel_reg = RK817_BUCK4_ON_VSEL_REG,
1089 .vsel_mask = RK817_BUCK_VSEL_MASK,
1090 .enable_reg = RK817_POWER_EN_REG(0),
1091 .enable_mask = ENABLE_MASK(RK817_ID_DCDC4),
1092 .enable_val = ENABLE_MASK(RK817_ID_DCDC4),
1093 .disable_val = DISABLE_VAL(RK817_ID_DCDC4),
1094 .ramp_reg = RK817_BUCK_CONFIG_REG(RK817_ID_DCDC4),
1095 .ramp_mask = RK817_RAMP_RATE_MASK,
1096 .ramp_delay_table = rk817_buck1_4_ramp_table,
1097 .n_ramp_values = ARRAY_SIZE(rk817_buck1_4_ramp_table),
1098 .of_map_mode = rk8xx_regulator_of_map_mode,
1099 .owner = THIS_MODULE,
1101 RK817_DESC(RK817_ID_LDO1, "LDO_REG1", "vcc5", 600, 3400, 25,
1102 RK817_LDO_ON_VSEL_REG(0), RK817_LDO_VSEL_MASK,
1103 RK817_POWER_EN_REG(1), ENABLE_MASK(0),
1104 DISABLE_VAL(0), 400),
1105 RK817_DESC(RK817_ID_LDO2, "LDO_REG2", "vcc5", 600, 3400, 25,
1106 RK817_LDO_ON_VSEL_REG(1), RK817_LDO_VSEL_MASK,
1107 RK817_POWER_EN_REG(1), ENABLE_MASK(1),
1108 DISABLE_VAL(1), 400),
1109 RK817_DESC(RK817_ID_LDO3, "LDO_REG3", "vcc5", 600, 3400, 25,
1110 RK817_LDO_ON_VSEL_REG(2), RK817_LDO_VSEL_MASK,
1111 RK817_POWER_EN_REG(1), ENABLE_MASK(2),
1112 DISABLE_VAL(2), 400),
1113 RK817_DESC(RK817_ID_LDO4, "LDO_REG4", "vcc6", 600, 3400, 25,
1114 RK817_LDO_ON_VSEL_REG(3), RK817_LDO_VSEL_MASK,
1115 RK817_POWER_EN_REG(1), ENABLE_MASK(3),
1116 DISABLE_VAL(3), 400),
1117 RK817_DESC(RK817_ID_LDO5, "LDO_REG5", "vcc6", 600, 3400, 25,
1118 RK817_LDO_ON_VSEL_REG(4), RK817_LDO_VSEL_MASK,
1119 RK817_POWER_EN_REG(2), ENABLE_MASK(0),
1120 DISABLE_VAL(0), 400),
1121 RK817_DESC(RK817_ID_LDO6, "LDO_REG6", "vcc6", 600, 3400, 25,
1122 RK817_LDO_ON_VSEL_REG(5), RK817_LDO_VSEL_MASK,
1123 RK817_POWER_EN_REG(2), ENABLE_MASK(1),
1124 DISABLE_VAL(1), 400),
1125 RK817_DESC(RK817_ID_LDO7, "LDO_REG7", "vcc7", 600, 3400, 25,
1126 RK817_LDO_ON_VSEL_REG(6), RK817_LDO_VSEL_MASK,
1127 RK817_POWER_EN_REG(2), ENABLE_MASK(2),
1128 DISABLE_VAL(2), 400),
1129 RK817_DESC(RK817_ID_LDO8, "LDO_REG8", "vcc7", 600, 3400, 25,
1130 RK817_LDO_ON_VSEL_REG(7), RK817_LDO_VSEL_MASK,
1131 RK817_POWER_EN_REG(2), ENABLE_MASK(3),
1132 DISABLE_VAL(3), 400),
1133 RK817_DESC(RK817_ID_LDO9, "LDO_REG9", "vcc7", 600, 3400, 25,
1134 RK817_LDO_ON_VSEL_REG(8), RK817_LDO_VSEL_MASK,
1135 RK817_POWER_EN_REG(3), ENABLE_MASK(0),
1136 DISABLE_VAL(0), 400),
1137 RK817_BOOST_DESC(RK817_ID_BOOST, "BOOST", "vcc8", 4700, 5400, 100,
1138 RK817_BOOST_OTG_CFG, RK817_BOOST_VSEL_MASK,
1139 RK817_POWER_EN_REG(3), ENABLE_MASK(1), ENABLE_MASK(1),
1140 DISABLE_VAL(1), 400, 3500 - 5400),
1141 RK817_DESC_SWITCH(RK817_ID_BOOST_OTG_SW, "OTG_SWITCH", "vcc9",
1142 RK817_POWER_EN_REG(3), ENABLE_MASK(2),
1146 static const struct regulator_desc rk818_reg[] = {
1148 .name = "DCDC_REG1",
1149 .supply_name = "vcc1",
1150 .of_match = of_match_ptr("DCDC_REG1"),
1151 .regulators_node = of_match_ptr("regulators"),
1152 .id = RK818_ID_DCDC1,
1153 .ops = &rk808_reg_ops,
1154 .type = REGULATOR_VOLTAGE,
1158 .vsel_reg = RK818_BUCK1_ON_VSEL_REG,
1159 .vsel_mask = RK818_BUCK_VSEL_MASK,
1160 .enable_reg = RK818_DCDC_EN_REG,
1161 .enable_mask = BIT(0),
1162 .owner = THIS_MODULE,
1164 .name = "DCDC_REG2",
1165 .supply_name = "vcc2",
1166 .of_match = of_match_ptr("DCDC_REG2"),
1167 .regulators_node = of_match_ptr("regulators"),
1168 .id = RK818_ID_DCDC2,
1169 .ops = &rk808_reg_ops,
1170 .type = REGULATOR_VOLTAGE,
1174 .vsel_reg = RK818_BUCK2_ON_VSEL_REG,
1175 .vsel_mask = RK818_BUCK_VSEL_MASK,
1176 .enable_reg = RK818_DCDC_EN_REG,
1177 .enable_mask = BIT(1),
1178 .owner = THIS_MODULE,
1180 .name = "DCDC_REG3",
1181 .supply_name = "vcc3",
1182 .of_match = of_match_ptr("DCDC_REG3"),
1183 .regulators_node = of_match_ptr("regulators"),
1184 .id = RK818_ID_DCDC3,
1185 .ops = &rk808_switch_ops,
1186 .type = REGULATOR_VOLTAGE,
1188 .enable_reg = RK818_DCDC_EN_REG,
1189 .enable_mask = BIT(2),
1190 .owner = THIS_MODULE,
1192 RK8XX_DESC(RK818_ID_DCDC4, "DCDC_REG4", "vcc4", 1800, 3600, 100,
1193 RK818_BUCK4_ON_VSEL_REG, RK818_BUCK4_VSEL_MASK,
1194 RK818_DCDC_EN_REG, BIT(3), 0),
1195 RK8XX_DESC(RK818_ID_BOOST, "DCDC_BOOST", "boost", 4700, 5400, 100,
1196 RK818_BOOST_LDO9_ON_VSEL_REG, RK818_BOOST_ON_VSEL_MASK,
1197 RK818_DCDC_EN_REG, BIT(4), 0),
1198 RK8XX_DESC(RK818_ID_LDO1, "LDO_REG1", "vcc6", 1800, 3400, 100,
1199 RK818_LDO1_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
1201 RK8XX_DESC(RK818_ID_LDO2, "LDO_REG2", "vcc6", 1800, 3400, 100,
1202 RK818_LDO2_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
1206 .supply_name = "vcc7",
1207 .of_match = of_match_ptr("LDO_REG3"),
1208 .regulators_node = of_match_ptr("regulators"),
1209 .id = RK818_ID_LDO3,
1210 .ops = &rk808_reg_ops_ranges,
1211 .type = REGULATOR_VOLTAGE,
1213 .linear_ranges = rk808_ldo3_voltage_ranges,
1214 .n_linear_ranges = ARRAY_SIZE(rk808_ldo3_voltage_ranges),
1215 .vsel_reg = RK818_LDO3_ON_VSEL_REG,
1216 .vsel_mask = RK818_LDO3_ON_VSEL_MASK,
1217 .enable_reg = RK818_LDO_EN_REG,
1218 .enable_mask = BIT(2),
1220 .owner = THIS_MODULE,
1222 RK8XX_DESC(RK818_ID_LDO4, "LDO_REG4", "vcc8", 1800, 3400, 100,
1223 RK818_LDO4_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
1225 RK8XX_DESC(RK818_ID_LDO5, "LDO_REG5", "vcc7", 1800, 3400, 100,
1226 RK818_LDO5_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
1228 RK8XX_DESC(RK818_ID_LDO6, "LDO_REG6", "vcc8", 800, 2500, 100,
1229 RK818_LDO6_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
1231 RK8XX_DESC(RK818_ID_LDO7, "LDO_REG7", "vcc7", 800, 2500, 100,
1232 RK818_LDO7_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
1234 RK8XX_DESC(RK818_ID_LDO8, "LDO_REG8", "vcc8", 1800, 3400, 100,
1235 RK818_LDO8_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
1237 RK8XX_DESC(RK818_ID_LDO9, "LDO_REG9", "vcc9", 1800, 3400, 100,
1238 RK818_BOOST_LDO9_ON_VSEL_REG, RK818_LDO_VSEL_MASK,
1239 RK818_DCDC_EN_REG, BIT(5), 400),
1240 RK8XX_DESC_SWITCH(RK818_ID_SWITCH, "SWITCH_REG", "vcc9",
1241 RK818_DCDC_EN_REG, BIT(6)),
1242 RK8XX_DESC_SWITCH(RK818_ID_HDMI_SWITCH, "HDMI_SWITCH", "h_5v",
1243 RK818_H5V_EN_REG, BIT(0)),
1244 RK8XX_DESC_SWITCH(RK818_ID_OTG_SWITCH, "OTG_SWITCH", "usb",
1245 RK818_DCDC_EN_REG, BIT(7)),
1248 static int rk808_regulator_dt_parse_pdata(struct device *dev,
1249 struct device *client_dev,
1251 struct rk808_regulator_data *pdata)
1253 struct device_node *np;
1254 int tmp, ret = 0, i;
1256 np = of_get_child_by_name(client_dev->of_node, "regulators");
1260 for (i = 0; i < ARRAY_SIZE(pdata->dvs_gpio); i++) {
1261 pdata->dvs_gpio[i] =
1262 devm_gpiod_get_index_optional(client_dev, "dvs", i,
1264 if (IS_ERR(pdata->dvs_gpio[i])) {
1265 ret = PTR_ERR(pdata->dvs_gpio[i]);
1266 dev_err(dev, "failed to get dvs%d gpio (%d)\n", i, ret);
1270 if (!pdata->dvs_gpio[i]) {
1271 dev_info(dev, "there is no dvs%d gpio\n", i);
1275 tmp = i ? RK808_DVS2_POL : RK808_DVS1_POL;
1276 ret = regmap_update_bits(map, RK808_IO_POL_REG, tmp,
1277 gpiod_is_active_low(pdata->dvs_gpio[i]) ?
1286 static int rk808_regulator_probe(struct platform_device *pdev)
1288 struct rk808 *rk808 = dev_get_drvdata(pdev->dev.parent);
1289 struct i2c_client *client = rk808->i2c;
1290 struct regulator_config config = {};
1291 struct regulator_dev *rk808_rdev;
1292 struct rk808_regulator_data *pdata;
1293 const struct regulator_desc *regulators;
1294 int ret, i, nregulators;
1296 pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
1300 ret = rk808_regulator_dt_parse_pdata(&pdev->dev, &client->dev,
1301 rk808->regmap, pdata);
1305 platform_set_drvdata(pdev, pdata);
1307 switch (rk808->variant) {
1309 regulators = rk805_reg;
1310 nregulators = RK805_NUM_REGULATORS;
1313 regulators = rk808_reg;
1314 nregulators = RK808_NUM_REGULATORS;
1317 regulators = rk809_reg;
1318 nregulators = RK809_NUM_REGULATORS;
1321 regulators = rk817_reg;
1322 nregulators = RK817_NUM_REGULATORS;
1325 regulators = rk818_reg;
1326 nregulators = RK818_NUM_REGULATORS;
1329 dev_err(&client->dev, "unsupported RK8XX ID %lu\n",
1334 config.dev = &client->dev;
1335 config.driver_data = pdata;
1336 config.regmap = rk808->regmap;
1338 /* Instantiate the regulators */
1339 for (i = 0; i < nregulators; i++) {
1340 rk808_rdev = devm_regulator_register(&pdev->dev,
1341 ®ulators[i], &config);
1342 if (IS_ERR(rk808_rdev)) {
1343 dev_err(&client->dev,
1344 "failed to register %d regulator\n", i);
1345 return PTR_ERR(rk808_rdev);
1352 static struct platform_driver rk808_regulator_driver = {
1353 .probe = rk808_regulator_probe,
1355 .name = "rk808-regulator"
1359 module_platform_driver(rk808_regulator_driver);
1361 MODULE_DESCRIPTION("regulator driver for the RK805/RK808/RK818 series PMICs");
1362 MODULE_AUTHOR("Tony xie <tony.xie@rock-chips.com>");
1363 MODULE_AUTHOR("Chris Zhong <zyw@rock-chips.com>");
1364 MODULE_AUTHOR("Zhang Qing <zhangqing@rock-chips.com>");
1365 MODULE_AUTHOR("Wadim Egorov <w.egorov@phytec.de>");
1366 MODULE_LICENSE("GPL");
1367 MODULE_ALIAS("platform:rk808-regulator");