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
10 * Copyright (C) 2016 PHYTEC Messtechnik GmbH
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 RK818_BUCK_VSEL_MASK 0x3f
32 #define RK818_BUCK4_VSEL_MASK 0x1f
33 #define RK818_LDO_VSEL_MASK 0x1f
34 #define RK818_LDO3_ON_VSEL_MASK 0xf
35 #define RK818_BOOST_ON_VSEL_MASK 0xe0
37 /* Ramp rate definitions for buck1 / buck2 only */
38 #define RK808_RAMP_RATE_OFFSET 3
39 #define RK808_RAMP_RATE_MASK (3 << RK808_RAMP_RATE_OFFSET)
40 #define RK808_RAMP_RATE_2MV_PER_US (0 << RK808_RAMP_RATE_OFFSET)
41 #define RK808_RAMP_RATE_4MV_PER_US (1 << RK808_RAMP_RATE_OFFSET)
42 #define RK808_RAMP_RATE_6MV_PER_US (2 << RK808_RAMP_RATE_OFFSET)
43 #define RK808_RAMP_RATE_10MV_PER_US (3 << RK808_RAMP_RATE_OFFSET)
45 #define RK808_DVS2_POL BIT(2)
46 #define RK808_DVS1_POL BIT(1)
48 /* Offset from XXX_ON_VSEL to XXX_SLP_VSEL */
49 #define RK808_SLP_REG_OFFSET 1
51 /* Offset from XXX_ON_VSEL to XXX_DVS_VSEL */
52 #define RK808_DVS_REG_OFFSET 2
54 /* Offset from XXX_EN_REG to SLEEP_SET_OFF_XXX */
55 #define RK808_SLP_SET_OFF_REG_OFFSET 2
57 /* max steps for increase voltage of Buck1/2, equal 100mv*/
58 #define MAX_STEPS_ONE_TIME 8
60 #define RK805_DESC(_id, _match, _supply, _min, _max, _step, _vreg, \
61 _vmask, _ereg, _emask, _etime) \
64 .supply_name = (_supply), \
65 .of_match = of_match_ptr(_match), \
66 .regulators_node = of_match_ptr("regulators"), \
67 .type = REGULATOR_VOLTAGE, \
69 .n_voltages = (((_max) - (_min)) / (_step) + 1), \
70 .owner = THIS_MODULE, \
71 .min_uV = (_min) * 1000, \
72 .uV_step = (_step) * 1000, \
73 .vsel_reg = (_vreg), \
74 .vsel_mask = (_vmask), \
75 .enable_reg = (_ereg), \
76 .enable_mask = (_emask), \
77 .enable_time = (_etime), \
78 .ops = &rk805_reg_ops, \
81 #define RK8XX_DESC(_id, _match, _supply, _min, _max, _step, _vreg, \
82 _vmask, _ereg, _emask, _etime) \
85 .supply_name = (_supply), \
86 .of_match = of_match_ptr(_match), \
87 .regulators_node = of_match_ptr("regulators"), \
88 .type = REGULATOR_VOLTAGE, \
90 .n_voltages = (((_max) - (_min)) / (_step) + 1), \
91 .owner = THIS_MODULE, \
92 .min_uV = (_min) * 1000, \
93 .uV_step = (_step) * 1000, \
94 .vsel_reg = (_vreg), \
95 .vsel_mask = (_vmask), \
96 .enable_reg = (_ereg), \
97 .enable_mask = (_emask), \
98 .enable_time = (_etime), \
99 .ops = &rk808_reg_ops, \
102 #define RK8XX_DESC_SWITCH(_id, _match, _supply, _ereg, _emask) \
105 .supply_name = (_supply), \
106 .of_match = of_match_ptr(_match), \
107 .regulators_node = of_match_ptr("regulators"), \
108 .type = REGULATOR_VOLTAGE, \
110 .enable_reg = (_ereg), \
111 .enable_mask = (_emask), \
112 .owner = THIS_MODULE, \
113 .ops = &rk808_switch_ops \
117 struct rk808_regulator_data {
118 struct gpio_desc *dvs_gpio[2];
121 static const int rk808_buck_config_regs[] = {
122 RK808_BUCK1_CONFIG_REG,
123 RK808_BUCK2_CONFIG_REG,
124 RK808_BUCK3_CONFIG_REG,
125 RK808_BUCK4_CONFIG_REG,
128 static const struct regulator_linear_range rk808_ldo3_voltage_ranges[] = {
129 REGULATOR_LINEAR_RANGE(800000, 0, 13, 100000),
130 REGULATOR_LINEAR_RANGE(2500000, 15, 15, 0),
133 static int rk808_buck1_2_get_voltage_sel_regmap(struct regulator_dev *rdev)
135 struct rk808_regulator_data *pdata = rdev_get_drvdata(rdev);
136 int id = rdev_get_id(rdev);
137 struct gpio_desc *gpio = pdata->dvs_gpio[id];
141 if (!gpio || gpiod_get_value(gpio) == 0)
142 return regulator_get_voltage_sel_regmap(rdev);
144 ret = regmap_read(rdev->regmap,
145 rdev->desc->vsel_reg + RK808_DVS_REG_OFFSET,
150 val &= rdev->desc->vsel_mask;
151 val >>= ffs(rdev->desc->vsel_mask) - 1;
156 static int rk808_buck1_2_i2c_set_voltage_sel(struct regulator_dev *rdev,
160 unsigned int old_sel, tmp, val, mask = rdev->desc->vsel_mask;
162 ret = regmap_read(rdev->regmap, rdev->desc->vsel_reg, &val);
167 old_sel = val & mask;
168 old_sel >>= ffs(mask) - 1;
169 delta_sel = sel - old_sel;
172 * If directly modify the register to change the voltage, we will face
173 * the risk of overshoot. Put it into a multi-step, can effectively
174 * avoid this problem, a step is 100mv here.
176 while (delta_sel > MAX_STEPS_ONE_TIME) {
177 old_sel += MAX_STEPS_ONE_TIME;
178 val = old_sel << (ffs(mask) - 1);
182 * i2c is 400kHz (2.5us per bit) and we must transmit _at least_
183 * 3 bytes (24 bits) plus start and stop so 26 bits. So we've
184 * got more than 65 us between each voltage change and thus
185 * won't ramp faster than ~1500 uV / us.
187 ret = regmap_write(rdev->regmap, rdev->desc->vsel_reg, val);
188 delta_sel = sel - old_sel;
191 sel <<= ffs(mask) - 1;
193 ret = regmap_write(rdev->regmap, rdev->desc->vsel_reg, val);
196 * When we change the voltage register directly, the ramp rate is about
197 * 100000uv/us, wait 1us to make sure the target voltage to be stable,
198 * so we needn't wait extra time after that.
205 static int rk808_buck1_2_set_voltage_sel(struct regulator_dev *rdev,
208 struct rk808_regulator_data *pdata = rdev_get_drvdata(rdev);
209 int id = rdev_get_id(rdev);
210 struct gpio_desc *gpio = pdata->dvs_gpio[id];
211 unsigned int reg = rdev->desc->vsel_reg;
216 return rk808_buck1_2_i2c_set_voltage_sel(rdev, sel);
218 gpio_level = gpiod_get_value(gpio);
219 if (gpio_level == 0) {
220 reg += RK808_DVS_REG_OFFSET;
221 ret = regmap_read(rdev->regmap, rdev->desc->vsel_reg, &old_sel);
223 ret = regmap_read(rdev->regmap,
224 reg + RK808_DVS_REG_OFFSET,
231 sel <<= ffs(rdev->desc->vsel_mask) - 1;
232 sel |= old_sel & ~rdev->desc->vsel_mask;
234 ret = regmap_write(rdev->regmap, reg, sel);
238 gpiod_set_value(gpio, !gpio_level);
243 static int rk808_buck1_2_set_voltage_time_sel(struct regulator_dev *rdev,
244 unsigned int old_selector,
245 unsigned int new_selector)
247 struct rk808_regulator_data *pdata = rdev_get_drvdata(rdev);
248 int id = rdev_get_id(rdev);
249 struct gpio_desc *gpio = pdata->dvs_gpio[id];
251 /* if there is no dvs1/2 pin, we don't need wait extra time here. */
255 return regulator_set_voltage_time_sel(rdev, old_selector, new_selector);
258 static int rk808_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay)
260 unsigned int ramp_value = RK808_RAMP_RATE_10MV_PER_US;
261 unsigned int reg = rk808_buck_config_regs[rdev_get_id(rdev)];
263 switch (ramp_delay) {
265 ramp_value = RK808_RAMP_RATE_2MV_PER_US;
268 ramp_value = RK808_RAMP_RATE_4MV_PER_US;
271 ramp_value = RK808_RAMP_RATE_6MV_PER_US;
276 pr_warn("%s ramp_delay: %d not supported, setting 10000\n",
277 rdev->desc->name, ramp_delay);
280 return regmap_update_bits(rdev->regmap, reg,
281 RK808_RAMP_RATE_MASK, ramp_value);
284 static int rk808_set_suspend_voltage(struct regulator_dev *rdev, int uv)
287 int sel = regulator_map_voltage_linear(rdev, uv, uv);
292 reg = rdev->desc->vsel_reg + RK808_SLP_REG_OFFSET;
294 return regmap_update_bits(rdev->regmap, reg,
295 rdev->desc->vsel_mask,
299 static int rk808_set_suspend_voltage_range(struct regulator_dev *rdev, int uv)
302 int sel = regulator_map_voltage_linear_range(rdev, uv, uv);
307 reg = rdev->desc->vsel_reg + RK808_SLP_REG_OFFSET;
309 return regmap_update_bits(rdev->regmap, reg,
310 rdev->desc->vsel_mask,
314 static int rk805_set_suspend_enable(struct regulator_dev *rdev)
318 reg = rdev->desc->enable_reg + RK808_SLP_SET_OFF_REG_OFFSET;
320 return regmap_update_bits(rdev->regmap, reg,
321 rdev->desc->enable_mask,
322 rdev->desc->enable_mask);
325 static int rk805_set_suspend_disable(struct regulator_dev *rdev)
329 reg = rdev->desc->enable_reg + RK808_SLP_SET_OFF_REG_OFFSET;
331 return regmap_update_bits(rdev->regmap, reg,
332 rdev->desc->enable_mask,
336 static int rk808_set_suspend_enable(struct regulator_dev *rdev)
340 reg = rdev->desc->enable_reg + RK808_SLP_SET_OFF_REG_OFFSET;
342 return regmap_update_bits(rdev->regmap, reg,
343 rdev->desc->enable_mask,
347 static int rk808_set_suspend_disable(struct regulator_dev *rdev)
351 reg = rdev->desc->enable_reg + RK808_SLP_SET_OFF_REG_OFFSET;
353 return regmap_update_bits(rdev->regmap, reg,
354 rdev->desc->enable_mask,
355 rdev->desc->enable_mask);
358 static const struct regulator_ops rk805_reg_ops = {
359 .list_voltage = regulator_list_voltage_linear,
360 .map_voltage = regulator_map_voltage_linear,
361 .get_voltage_sel = regulator_get_voltage_sel_regmap,
362 .set_voltage_sel = regulator_set_voltage_sel_regmap,
363 .enable = regulator_enable_regmap,
364 .disable = regulator_disable_regmap,
365 .is_enabled = regulator_is_enabled_regmap,
366 .set_suspend_voltage = rk808_set_suspend_voltage,
367 .set_suspend_enable = rk805_set_suspend_enable,
368 .set_suspend_disable = rk805_set_suspend_disable,
371 static const struct regulator_ops rk805_switch_ops = {
372 .enable = regulator_enable_regmap,
373 .disable = regulator_disable_regmap,
374 .is_enabled = regulator_is_enabled_regmap,
375 .set_suspend_enable = rk805_set_suspend_enable,
376 .set_suspend_disable = rk805_set_suspend_disable,
379 static const struct regulator_ops rk808_buck1_2_ops = {
380 .list_voltage = regulator_list_voltage_linear,
381 .map_voltage = regulator_map_voltage_linear,
382 .get_voltage_sel = rk808_buck1_2_get_voltage_sel_regmap,
383 .set_voltage_sel = rk808_buck1_2_set_voltage_sel,
384 .set_voltage_time_sel = rk808_buck1_2_set_voltage_time_sel,
385 .enable = regulator_enable_regmap,
386 .disable = regulator_disable_regmap,
387 .is_enabled = regulator_is_enabled_regmap,
388 .set_ramp_delay = rk808_set_ramp_delay,
389 .set_suspend_voltage = rk808_set_suspend_voltage,
390 .set_suspend_enable = rk808_set_suspend_enable,
391 .set_suspend_disable = rk808_set_suspend_disable,
394 static const struct regulator_ops rk808_reg_ops = {
395 .list_voltage = regulator_list_voltage_linear,
396 .map_voltage = regulator_map_voltage_linear,
397 .get_voltage_sel = regulator_get_voltage_sel_regmap,
398 .set_voltage_sel = regulator_set_voltage_sel_regmap,
399 .enable = regulator_enable_regmap,
400 .disable = regulator_disable_regmap,
401 .is_enabled = regulator_is_enabled_regmap,
402 .set_suspend_voltage = rk808_set_suspend_voltage,
403 .set_suspend_enable = rk808_set_suspend_enable,
404 .set_suspend_disable = rk808_set_suspend_disable,
407 static const struct regulator_ops rk808_reg_ops_ranges = {
408 .list_voltage = regulator_list_voltage_linear_range,
409 .map_voltage = regulator_map_voltage_linear_range,
410 .get_voltage_sel = regulator_get_voltage_sel_regmap,
411 .set_voltage_sel = regulator_set_voltage_sel_regmap,
412 .enable = regulator_enable_regmap,
413 .disable = regulator_disable_regmap,
414 .is_enabled = regulator_is_enabled_regmap,
415 .set_suspend_voltage = rk808_set_suspend_voltage_range,
416 .set_suspend_enable = rk808_set_suspend_enable,
417 .set_suspend_disable = rk808_set_suspend_disable,
420 static const struct regulator_ops rk808_switch_ops = {
421 .enable = regulator_enable_regmap,
422 .disable = regulator_disable_regmap,
423 .is_enabled = regulator_is_enabled_regmap,
424 .set_suspend_enable = rk808_set_suspend_enable,
425 .set_suspend_disable = rk808_set_suspend_disable,
428 static const struct regulator_linear_range rk805_buck_1_2_voltage_ranges[] = {
429 REGULATOR_LINEAR_RANGE(712500, 0, 59, 12500),
430 REGULATOR_LINEAR_RANGE(1800000, 60, 62, 200000),
431 REGULATOR_LINEAR_RANGE(2300000, 63, 63, 0),
434 static const struct regulator_desc rk805_reg[] = {
437 .supply_name = "vcc1",
438 .of_match = of_match_ptr("DCDC_REG1"),
439 .regulators_node = of_match_ptr("regulators"),
440 .id = RK805_ID_DCDC1,
441 .ops = &rk808_reg_ops_ranges,
442 .type = REGULATOR_VOLTAGE,
444 .linear_ranges = rk805_buck_1_2_voltage_ranges,
445 .n_linear_ranges = ARRAY_SIZE(rk805_buck_1_2_voltage_ranges),
446 .vsel_reg = RK805_BUCK1_ON_VSEL_REG,
447 .vsel_mask = RK818_BUCK_VSEL_MASK,
448 .enable_reg = RK805_DCDC_EN_REG,
449 .enable_mask = BIT(0),
450 .owner = THIS_MODULE,
453 .supply_name = "vcc2",
454 .of_match = of_match_ptr("DCDC_REG2"),
455 .regulators_node = of_match_ptr("regulators"),
456 .id = RK805_ID_DCDC2,
457 .ops = &rk808_reg_ops_ranges,
458 .type = REGULATOR_VOLTAGE,
460 .linear_ranges = rk805_buck_1_2_voltage_ranges,
461 .n_linear_ranges = ARRAY_SIZE(rk805_buck_1_2_voltage_ranges),
462 .vsel_reg = RK805_BUCK2_ON_VSEL_REG,
463 .vsel_mask = RK818_BUCK_VSEL_MASK,
464 .enable_reg = RK805_DCDC_EN_REG,
465 .enable_mask = BIT(1),
466 .owner = THIS_MODULE,
469 .supply_name = "vcc3",
470 .of_match = of_match_ptr("DCDC_REG3"),
471 .regulators_node = of_match_ptr("regulators"),
472 .id = RK805_ID_DCDC3,
473 .ops = &rk805_switch_ops,
474 .type = REGULATOR_VOLTAGE,
476 .enable_reg = RK805_DCDC_EN_REG,
477 .enable_mask = BIT(2),
478 .owner = THIS_MODULE,
481 RK805_DESC(RK805_ID_DCDC4, "DCDC_REG4", "vcc4", 800, 3400, 100,
482 RK805_BUCK4_ON_VSEL_REG, RK818_BUCK4_VSEL_MASK,
483 RK805_DCDC_EN_REG, BIT(3), 0),
485 RK805_DESC(RK805_ID_LDO1, "LDO_REG1", "vcc5", 800, 3400, 100,
486 RK805_LDO1_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK805_LDO_EN_REG,
488 RK805_DESC(RK805_ID_LDO2, "LDO_REG2", "vcc5", 800, 3400, 100,
489 RK805_LDO2_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK805_LDO_EN_REG,
491 RK805_DESC(RK805_ID_LDO3, "LDO_REG3", "vcc6", 800, 3400, 100,
492 RK805_LDO3_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK805_LDO_EN_REG,
496 static const struct regulator_desc rk808_reg[] = {
499 .supply_name = "vcc1",
500 .of_match = of_match_ptr("DCDC_REG1"),
501 .regulators_node = of_match_ptr("regulators"),
502 .id = RK808_ID_DCDC1,
503 .ops = &rk808_buck1_2_ops,
504 .type = REGULATOR_VOLTAGE,
508 .vsel_reg = RK808_BUCK1_ON_VSEL_REG,
509 .vsel_mask = RK808_BUCK_VSEL_MASK,
510 .enable_reg = RK808_DCDC_EN_REG,
511 .enable_mask = BIT(0),
512 .owner = THIS_MODULE,
515 .supply_name = "vcc2",
516 .of_match = of_match_ptr("DCDC_REG2"),
517 .regulators_node = of_match_ptr("regulators"),
518 .id = RK808_ID_DCDC2,
519 .ops = &rk808_buck1_2_ops,
520 .type = REGULATOR_VOLTAGE,
524 .vsel_reg = RK808_BUCK2_ON_VSEL_REG,
525 .vsel_mask = RK808_BUCK_VSEL_MASK,
526 .enable_reg = RK808_DCDC_EN_REG,
527 .enable_mask = BIT(1),
528 .owner = THIS_MODULE,
531 .supply_name = "vcc3",
532 .of_match = of_match_ptr("DCDC_REG3"),
533 .regulators_node = of_match_ptr("regulators"),
534 .id = RK808_ID_DCDC3,
535 .ops = &rk808_switch_ops,
536 .type = REGULATOR_VOLTAGE,
538 .enable_reg = RK808_DCDC_EN_REG,
539 .enable_mask = BIT(2),
540 .owner = THIS_MODULE,
542 RK8XX_DESC(RK808_ID_DCDC4, "DCDC_REG4", "vcc4", 1800, 3300, 100,
543 RK808_BUCK4_ON_VSEL_REG, RK808_BUCK4_VSEL_MASK,
544 RK808_DCDC_EN_REG, BIT(3), 0),
545 RK8XX_DESC(RK808_ID_LDO1, "LDO_REG1", "vcc6", 1800, 3400, 100,
546 RK808_LDO1_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
548 RK8XX_DESC(RK808_ID_LDO2, "LDO_REG2", "vcc6", 1800, 3400, 100,
549 RK808_LDO2_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
553 .supply_name = "vcc7",
554 .of_match = of_match_ptr("LDO_REG3"),
555 .regulators_node = of_match_ptr("regulators"),
557 .ops = &rk808_reg_ops_ranges,
558 .type = REGULATOR_VOLTAGE,
560 .linear_ranges = rk808_ldo3_voltage_ranges,
561 .n_linear_ranges = ARRAY_SIZE(rk808_ldo3_voltage_ranges),
562 .vsel_reg = RK808_LDO3_ON_VSEL_REG,
563 .vsel_mask = RK808_BUCK4_VSEL_MASK,
564 .enable_reg = RK808_LDO_EN_REG,
565 .enable_mask = BIT(2),
567 .owner = THIS_MODULE,
569 RK8XX_DESC(RK808_ID_LDO4, "LDO_REG4", "vcc9", 1800, 3400, 100,
570 RK808_LDO4_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
572 RK8XX_DESC(RK808_ID_LDO5, "LDO_REG5", "vcc9", 1800, 3400, 100,
573 RK808_LDO5_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
575 RK8XX_DESC(RK808_ID_LDO6, "LDO_REG6", "vcc10", 800, 2500, 100,
576 RK808_LDO6_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
578 RK8XX_DESC(RK808_ID_LDO7, "LDO_REG7", "vcc7", 800, 2500, 100,
579 RK808_LDO7_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
581 RK8XX_DESC(RK808_ID_LDO8, "LDO_REG8", "vcc11", 1800, 3400, 100,
582 RK808_LDO8_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
584 RK8XX_DESC_SWITCH(RK808_ID_SWITCH1, "SWITCH_REG1", "vcc8",
585 RK808_DCDC_EN_REG, BIT(5)),
586 RK8XX_DESC_SWITCH(RK808_ID_SWITCH2, "SWITCH_REG2", "vcc12",
587 RK808_DCDC_EN_REG, BIT(6)),
590 static const struct regulator_desc rk818_reg[] = {
593 .supply_name = "vcc1",
594 .of_match = of_match_ptr("DCDC_REG1"),
595 .regulators_node = of_match_ptr("regulators"),
596 .id = RK818_ID_DCDC1,
597 .ops = &rk808_reg_ops,
598 .type = REGULATOR_VOLTAGE,
602 .vsel_reg = RK818_BUCK1_ON_VSEL_REG,
603 .vsel_mask = RK818_BUCK_VSEL_MASK,
604 .enable_reg = RK818_DCDC_EN_REG,
605 .enable_mask = BIT(0),
606 .owner = THIS_MODULE,
609 .supply_name = "vcc2",
610 .of_match = of_match_ptr("DCDC_REG2"),
611 .regulators_node = of_match_ptr("regulators"),
612 .id = RK818_ID_DCDC2,
613 .ops = &rk808_reg_ops,
614 .type = REGULATOR_VOLTAGE,
618 .vsel_reg = RK818_BUCK2_ON_VSEL_REG,
619 .vsel_mask = RK818_BUCK_VSEL_MASK,
620 .enable_reg = RK818_DCDC_EN_REG,
621 .enable_mask = BIT(1),
622 .owner = THIS_MODULE,
625 .supply_name = "vcc3",
626 .of_match = of_match_ptr("DCDC_REG3"),
627 .regulators_node = of_match_ptr("regulators"),
628 .id = RK818_ID_DCDC3,
629 .ops = &rk808_switch_ops,
630 .type = REGULATOR_VOLTAGE,
632 .enable_reg = RK818_DCDC_EN_REG,
633 .enable_mask = BIT(2),
634 .owner = THIS_MODULE,
636 RK8XX_DESC(RK818_ID_DCDC4, "DCDC_REG4", "vcc4", 1800, 3600, 100,
637 RK818_BUCK4_ON_VSEL_REG, RK818_BUCK4_VSEL_MASK,
638 RK818_DCDC_EN_REG, BIT(3), 0),
639 RK8XX_DESC(RK818_ID_BOOST, "DCDC_BOOST", "boost", 4700, 5400, 100,
640 RK818_BOOST_LDO9_ON_VSEL_REG, RK818_BOOST_ON_VSEL_MASK,
641 RK818_DCDC_EN_REG, BIT(4), 0),
642 RK8XX_DESC(RK818_ID_LDO1, "LDO_REG1", "vcc6", 1800, 3400, 100,
643 RK818_LDO1_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
645 RK8XX_DESC(RK818_ID_LDO2, "LDO_REG2", "vcc6", 1800, 3400, 100,
646 RK818_LDO2_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
650 .supply_name = "vcc7",
651 .of_match = of_match_ptr("LDO_REG3"),
652 .regulators_node = of_match_ptr("regulators"),
654 .ops = &rk808_reg_ops_ranges,
655 .type = REGULATOR_VOLTAGE,
657 .linear_ranges = rk808_ldo3_voltage_ranges,
658 .n_linear_ranges = ARRAY_SIZE(rk808_ldo3_voltage_ranges),
659 .vsel_reg = RK818_LDO3_ON_VSEL_REG,
660 .vsel_mask = RK818_LDO3_ON_VSEL_MASK,
661 .enable_reg = RK818_LDO_EN_REG,
662 .enable_mask = BIT(2),
664 .owner = THIS_MODULE,
666 RK8XX_DESC(RK818_ID_LDO4, "LDO_REG4", "vcc8", 1800, 3400, 100,
667 RK818_LDO4_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
669 RK8XX_DESC(RK818_ID_LDO5, "LDO_REG5", "vcc7", 1800, 3400, 100,
670 RK818_LDO5_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
672 RK8XX_DESC(RK818_ID_LDO6, "LDO_REG6", "vcc8", 800, 2500, 100,
673 RK818_LDO6_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
675 RK8XX_DESC(RK818_ID_LDO7, "LDO_REG7", "vcc7", 800, 2500, 100,
676 RK818_LDO7_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
678 RK8XX_DESC(RK818_ID_LDO8, "LDO_REG8", "vcc8", 1800, 3400, 100,
679 RK818_LDO8_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
681 RK8XX_DESC(RK818_ID_LDO9, "LDO_REG9", "vcc9", 1800, 3400, 100,
682 RK818_BOOST_LDO9_ON_VSEL_REG, RK818_LDO_VSEL_MASK,
683 RK818_DCDC_EN_REG, BIT(5), 400),
684 RK8XX_DESC_SWITCH(RK818_ID_SWITCH, "SWITCH_REG", "vcc9",
685 RK818_DCDC_EN_REG, BIT(6)),
686 RK8XX_DESC_SWITCH(RK818_ID_HDMI_SWITCH, "HDMI_SWITCH", "h_5v",
687 RK818_H5V_EN_REG, BIT(0)),
688 RK8XX_DESC_SWITCH(RK818_ID_OTG_SWITCH, "OTG_SWITCH", "usb",
689 RK818_DCDC_EN_REG, BIT(7)),
692 static int rk808_regulator_dt_parse_pdata(struct device *dev,
693 struct device *client_dev,
695 struct rk808_regulator_data *pdata)
697 struct device_node *np;
700 np = of_get_child_by_name(client_dev->of_node, "regulators");
704 for (i = 0; i < ARRAY_SIZE(pdata->dvs_gpio); i++) {
706 devm_gpiod_get_index_optional(client_dev, "dvs", i,
708 if (IS_ERR(pdata->dvs_gpio[i])) {
709 ret = PTR_ERR(pdata->dvs_gpio[i]);
710 dev_err(dev, "failed to get dvs%d gpio (%d)\n", i, ret);
714 if (!pdata->dvs_gpio[i]) {
715 dev_warn(dev, "there is no dvs%d gpio\n", i);
719 tmp = i ? RK808_DVS2_POL : RK808_DVS1_POL;
720 ret = regmap_update_bits(map, RK808_IO_POL_REG, tmp,
721 gpiod_is_active_low(pdata->dvs_gpio[i]) ?
730 static int rk808_regulator_probe(struct platform_device *pdev)
732 struct rk808 *rk808 = dev_get_drvdata(pdev->dev.parent);
733 struct i2c_client *client = rk808->i2c;
734 struct regulator_config config = {};
735 struct regulator_dev *rk808_rdev;
736 struct rk808_regulator_data *pdata;
737 const struct regulator_desc *regulators;
738 int ret, i, nregulators;
740 pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
744 ret = rk808_regulator_dt_parse_pdata(&pdev->dev, &client->dev,
745 rk808->regmap, pdata);
749 platform_set_drvdata(pdev, pdata);
751 switch (rk808->variant) {
753 regulators = rk805_reg;
754 nregulators = RK805_NUM_REGULATORS;
757 regulators = rk808_reg;
758 nregulators = RK808_NUM_REGULATORS;
761 regulators = rk818_reg;
762 nregulators = RK818_NUM_REGULATORS;
765 dev_err(&client->dev, "unsupported RK8XX ID %lu\n",
770 config.dev = &client->dev;
771 config.driver_data = pdata;
772 config.regmap = rk808->regmap;
774 /* Instantiate the regulators */
775 for (i = 0; i < nregulators; i++) {
776 rk808_rdev = devm_regulator_register(&pdev->dev,
777 ®ulators[i], &config);
778 if (IS_ERR(rk808_rdev)) {
779 dev_err(&client->dev,
780 "failed to register %d regulator\n", i);
781 return PTR_ERR(rk808_rdev);
788 static struct platform_driver rk808_regulator_driver = {
789 .probe = rk808_regulator_probe,
791 .name = "rk808-regulator"
795 module_platform_driver(rk808_regulator_driver);
797 MODULE_DESCRIPTION("regulator driver for the RK805/RK808/RK818 series PMICs");
801 MODULE_LICENSE("GPL");
802 MODULE_ALIAS("platform:rk808-regulator");