1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Regulator driver for Rockchip RK805/RK808/RK818
4  *
5  * Copyright (c) 2014, Fuzhou Rockchip Electronics Co., Ltd
6  *
7  * Author: Chris Zhong <zyw@rock-chips.com>
8  * Author: Zhang Qing <zhangqing@rock-chips.com>
9  *
10  * Copyright (C) 2016 PHYTEC Messtechnik GmbH
11  *
12  * Author: Wadim Egorov <w.egorov@phytec.de>
13  */
14 
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>
25 
26 /* Field Definitions */
27 #define RK808_BUCK_VSEL_MASK 0x3f
28 #define RK808_BUCK4_VSEL_MASK 0xf
29 #define RK808_LDO_VSEL_MASK 0x1f
30 
31 #define RK809_BUCK5_VSEL_MASK 0x7
32 
33 #define RK817_LDO_VSEL_MASK 0x7f
34 #define RK817_BOOST_VSEL_MASK 0x7
35 #define RK817_BUCK_VSEL_MASK 0x7f
36 
37 #define RK816_DCDC_SLP_EN_REG_OFFSET 2
38 #define RK816_SWITCH_SLP_EN_REG_OFFSET 1
39 #define RK816_LDO1_4_SLP_EN_REG_OFFSET 1
40 #define RK816_LDO5_6_SLP_EN_REG_OFFSET 2
41 
42 #define RK818_BUCK_VSEL_MASK 0x3f
43 #define RK818_BUCK4_VSEL_MASK 0x1f
44 #define RK818_LDO_VSEL_MASK 0x1f
45 #define RK818_LDO3_ON_VSEL_MASK 0xf
46 #define RK818_BOOST_ON_VSEL_MASK 0xe0
47 
48 /* Ramp rate definitions for buck1 / buck2 only */
49 #define RK808_RAMP_RATE_OFFSET 3
50 #define RK808_RAMP_RATE_MASK (3 << RK808_RAMP_RATE_OFFSET)
51 #define RK808_RAMP_RATE_2MV_PER_US (0 << RK808_RAMP_RATE_OFFSET)
52 #define RK808_RAMP_RATE_4MV_PER_US (1 << RK808_RAMP_RATE_OFFSET)
53 #define RK808_RAMP_RATE_6MV_PER_US (2 << RK808_RAMP_RATE_OFFSET)
54 #define RK808_RAMP_RATE_10MV_PER_US (3 << RK808_RAMP_RATE_OFFSET)
55 
56 #define RK808_DVS2_POL BIT(2)
57 #define RK808_DVS1_POL BIT(1)
58 
59 /* Offset from XXX_ON_VSEL to XXX_SLP_VSEL */
60 #define RK808_SLP_REG_OFFSET 1
61 
62 /* Offset from XXX_ON_VSEL to XXX_DVS_VSEL */
63 #define RK808_DVS_REG_OFFSET 2
64 
65 /* Offset from XXX_EN_REG to SLEEP_SET_OFF_XXX */
66 #define RK808_SLP_SET_OFF_REG_OFFSET 2
67 
68 /* max steps for increase voltage of Buck1/2, equal 25mv */
69 #define MAX_STEPS_ONE_TIME 2
70 
71 #define ENABLE_MASK(id) (BIT(id) | BIT(4 + (id)))
72 #define DISABLE_VAL(id) (BIT(4 + (id)))
73 
74 #define RK817_BOOST_DESC(_id, _match, _supply, _min, _max, _step, _vreg, _vmask, _ereg, _emask, _enval, _disval,       \
75                          _etime, m_drop)                                                                               \
76     {                                                                                                                  \
77         .name = (_match), .supply_name = (_supply), .of_match = of_match_ptr(_match),                                  \
78         .regulators_node = of_match_ptr("regulators"), .type = REGULATOR_VOLTAGE, .id = (_id),                         \
79         .n_voltages = (((_max) - (_min)) / (_step) + 1), .owner = THIS_MODULE, .min_uV = (_min)*1000,                  \
80         .uV_step = (_step)*1000, .vsel_reg = (_vreg), .vsel_mask = (_vmask), .enable_reg = (_ereg),                    \
81         .enable_mask = (_emask), .enable_val = (_enval), .disable_val = (_disval), .enable_time = (_etime),            \
82         .min_dropout_uV = (m_drop)*1000, .ops = &rk817_boost_ops,                                                      \
83     }
84 
85 #define RK8XX_DESC_COM(_id, _match, _supply, _min, _max, _step, _vreg, _vmask, _ereg, _emask, _enval, _disval, _etime, \
86                        _ops)                                                                                           \
87     {                                                                                                                  \
88         .name = (_match), .supply_name = (_supply), .of_match = of_match_ptr(_match),                                  \
89         .regulators_node = of_match_ptr("regulators"), .type = REGULATOR_VOLTAGE, .id = (_id),                         \
90         .n_voltages = (((_max) - (_min)) / (_step) + 1), .owner = THIS_MODULE, .min_uV = (_min)*1000,                  \
91         .uV_step = (_step)*1000, .vsel_reg = (_vreg), .vsel_mask = (_vmask), .enable_reg = (_ereg),                    \
92         .enable_mask = (_emask), .enable_val = (_enval), .disable_val = (_disval), .enable_time = (_etime),            \
93         .ops = (_ops),                                                                                                 \
94     }
95 
96 #define RK816_DESC(_id, _match, _supply, _min, _max, _step, _vreg, _vmask, _ereg, _emask, _disval, _etime)             \
97     RK8XX_DESC_COM(_id, _match, _supply, _min, _max, _step, _vreg, _vmask, _ereg, _emask, _emask, _disval, _etime,     \
98                    &rk808_reg_ops)
99 
100 #define RK805_DESC(_id, _match, _supply, _min, _max, _step, _vreg, _vmask, _ereg, _emask, _disval, _etime)             \
101     RK8XX_DESC_COM(_id, _match, _supply, _min, _max, _step, _vreg, _vmask, _ereg, _emask, _emask, _disval, _etime,     \
102                    &rk808_reg_ops)
103 
104 #define RK8XX_DESC(_id, _match, _supply, _min, _max, _step, _vreg, _vmask, _ereg, _emask, _etime)                      \
105     RK8XX_DESC_COM(_id, _match, _supply, _min, _max, _step, _vreg, _vmask, _ereg, _emask, 0, 0, _etime, &rk808_reg_ops)
106 
107 #define RK817_DESC(_id, _match, _supply, _min, _max, _step, _vreg, _vmask, _ereg, _emask, _enval, _disval, _etime)     \
108     RK8XX_DESC_COM(_id, _match, _supply, _min, _max, _step, _vreg, _vmask, _ereg, _emask, _enval, _disval, _etime,     \
109                    &rk817_reg_ops)
110 
111 #define RKXX_DESC_SWITCH_COM(_id, _match, _supply, _ereg, _emask, _enval, _disval, _ops)                               \
112     {                                                                                                                  \
113         .name = (_match), .supply_name = (_supply), .of_match = of_match_ptr(_match),                                  \
114         .regulators_node = of_match_ptr("regulators"), .type = REGULATOR_VOLTAGE, .id = (_id), .enable_reg = (_ereg),  \
115         .enable_mask = (_emask), .enable_val = (_enval), .disable_val = (_disval), .owner = THIS_MODULE, .ops = _ops   \
116     }
117 
118 #define RK817_DESC_SWITCH(_id, _match, _supply, _ereg, _emask, _enval, _disval)                                        \
119     RKXX_DESC_SWITCH_COM(_id, _match, _supply, _ereg, _emask, _enval, _disval, &rk817_switch_ops)
120 
121 #define RK8XX_DESC_SWITCH(_id, _match, _supply, _ereg, _emask)                                                         \
122     RKXX_DESC_SWITCH_COM(_id, _match, _supply, _ereg, _emask, 0, 0, &rk808_switch_ops)
123 
124 struct rk808_regulator_data {
125     struct gpio_desc *dvs_gpio[2];
126 };
127 
128 static const int rk808_buck_config_regs[] = {
129     RK808_BUCK1_CONFIG_REG,
130     RK808_BUCK2_CONFIG_REG,
131     RK808_BUCK3_CONFIG_REG,
132     RK808_BUCK4_CONFIG_REG,
133 };
134 
135 static const struct linear_range rk805_buck_1_2_voltage_ranges[] = {
136     REGULATOR_LINEAR_RANGE(712500, 0, 59, 12500),    /* 0.7125v - 1.45v */
137     REGULATOR_LINEAR_RANGE(1800000, 60, 62, 200000), /* 1.8v - 2.2v */
138     REGULATOR_LINEAR_RANGE(2300000, 63, 63, 0),      /* 2.3v - 2.3v */
139 };
140 
141 static const struct linear_range rk805_buck4_voltage_ranges[] = {
142     REGULATOR_LINEAR_RANGE(800000, 0, 26, 100000), /* 0.8v - 3.4v */
143     REGULATOR_LINEAR_RANGE(3500000, 27, 31, 0),    /* 3.5v */
144 };
145 
146 static const struct linear_range rk808_ldo3_voltage_ranges[] = {
147     REGULATOR_LINEAR_RANGE(800000, 0, 13, 100000),
148     REGULATOR_LINEAR_RANGE(2500000, 15, 15, 0),
149 };
150 
151 static const struct linear_range rk816_buck_voltage_ranges[] = {
152     REGULATOR_LINEAR_RANGE(712500, 0, 59, 12500),    /* 0.7125v - 1.45v */
153     REGULATOR_LINEAR_RANGE(1800000, 60, 62, 200000), /* 1.8v - 2.2v */
154     REGULATOR_LINEAR_RANGE(2300000, 63, 63, 0),      /* 2.3v - 2.3v */
155 };
156 
157 static const struct linear_range rk816_buck4_voltage_ranges[] = {
158     REGULATOR_LINEAR_RANGE(800000, 0, 26, 100000), /* 0.8v - 3.4 */
159     REGULATOR_LINEAR_RANGE(3500000, 27, 31, 0),    /* 3.5v */
160 };
161 
162 #define RK809_BUCK5_SEL_CNT (8)
163 
164 static const struct linear_range rk809_buck5_voltage_ranges[] = {
165     REGULATOR_LINEAR_RANGE(1500000, 0, 0, 0),
166     REGULATOR_LINEAR_RANGE(1800000, 1, 3, 200000),
167     REGULATOR_LINEAR_RANGE(2800000, 4, 5, 200000),
168     REGULATOR_LINEAR_RANGE(3300000, 6, 7, 300000),
169 };
170 
171 #define RK817_BUCK1_MIN0 500000
172 #define RK817_BUCK1_MAX0 1500000
173 
174 #define RK817_BUCK1_MIN1 1600000
175 #define RK817_BUCK1_MAX1 2400000
176 
177 #define RK817_BUCK3_MAX1 3400000
178 
179 #define RK817_BUCK1_STP0 12500
180 #define RK817_BUCK1_STP1 100000
181 
182 #define RK817_BUCK1_SEL0 ((RK817_BUCK1_MAX0 - RK817_BUCK1_MIN0) / RK817_BUCK1_STP0)
183 #define RK817_BUCK1_SEL1 ((RK817_BUCK1_MAX1 - RK817_BUCK1_MIN1) / RK817_BUCK1_STP1)
184 
185 #define RK817_BUCK3_SEL1 ((RK817_BUCK3_MAX1 - RK817_BUCK1_MIN1) / RK817_BUCK1_STP1)
186 
187 #define RK817_BUCK1_SEL_CNT (RK817_BUCK1_SEL0 + RK817_BUCK1_SEL1 + 1)
188 #define RK817_BUCK3_SEL_CNT (RK817_BUCK1_SEL0 + RK817_BUCK3_SEL1 + 1)
189 
190 static const struct linear_range rk817_buck1_voltage_ranges[] = {
191     REGULATOR_LINEAR_RANGE(RK817_BUCK1_MIN0, 0, RK817_BUCK1_SEL0, RK817_BUCK1_STP0),
192     REGULATOR_LINEAR_RANGE(RK817_BUCK1_MIN1, RK817_BUCK1_SEL0 + 1, RK817_BUCK1_SEL_CNT, RK817_BUCK1_STP1),
193 };
194 
195 static const struct linear_range rk817_buck3_voltage_ranges[] = {
196     REGULATOR_LINEAR_RANGE(RK817_BUCK1_MIN0, 0, RK817_BUCK1_SEL0, RK817_BUCK1_STP0),
197     REGULATOR_LINEAR_RANGE(RK817_BUCK1_MIN1, RK817_BUCK1_SEL0 + 1, RK817_BUCK3_SEL_CNT, RK817_BUCK1_STP1),
198 };
199 
rk808_buck1_2_get_voltage_sel_regmap(struct regulator_dev *rdev)200 static int rk808_buck1_2_get_voltage_sel_regmap(struct regulator_dev *rdev)
201 {
202     struct rk808_regulator_data *pdata = rdev_get_drvdata(rdev);
203     int id = rdev_get_id(rdev);
204     struct gpio_desc *gpio = pdata->dvs_gpio[id];
205     unsigned int val;
206     int ret;
207 
208     if (!gpio || gpiod_get_value(gpio) == 0) {
209         return regulator_get_voltage_sel_regmap(rdev);
210     }
211 
212     ret = regmap_read(rdev->regmap, rdev->desc->vsel_reg + RK808_DVS_REG_OFFSET, &val);
213     if (ret != 0) {
214         return ret;
215     }
216 
217     val &= rdev->desc->vsel_mask;
218     val >>= ffs(rdev->desc->vsel_mask) - 1;
219 
220     return val;
221 }
222 
rk808_buck1_2_i2c_set_voltage_sel(struct regulator_dev *rdev, unsigned sel)223 static int rk808_buck1_2_i2c_set_voltage_sel(struct regulator_dev *rdev, unsigned sel)
224 {
225     int ret, delta_sel;
226     unsigned int old_sel, tmp, val, mask = rdev->desc->vsel_mask;
227 
228     ret = regmap_read(rdev->regmap, rdev->desc->vsel_reg, &val);
229     if (ret != 0) {
230         return ret;
231     }
232 
233     tmp = val & ~mask;
234     old_sel = val & mask;
235     old_sel >>= ffs(mask) - 1;
236     delta_sel = sel - old_sel;
237 
238     /*
239      * If directly modify the register to change the voltage, we will face
240      * the risk of overshoot. Put it into a multi-step, can effectively
241      * avoid this problem, a step is 100mv here.
242      */
243     while (delta_sel > MAX_STEPS_ONE_TIME) {
244         old_sel += MAX_STEPS_ONE_TIME;
245         val = old_sel << (ffs(mask) - 1);
246         val |= tmp;
247 
248         /*
249          * i2c is 400kHz (2.5us per bit) and we must transmit _at least_
250          * 3 bytes (24 bits) plus start and stop so 26 bits.  So we've
251          * got more than 65 us between each voltage change and thus
252          * won't ramp faster than ~1500 uV / us.
253          */
254         ret = regmap_write(rdev->regmap, rdev->desc->vsel_reg, val);
255         delta_sel = sel - old_sel;
256     }
257 
258     sel <<= ffs(mask) - 1;
259     val = tmp | sel;
260     ret = regmap_write(rdev->regmap, rdev->desc->vsel_reg, val);
261 
262     /*
263      * When we change the voltage register directly, the ramp rate is about
264      * 100000uv/us, wait 1us to make sure the target voltage to be stable,
265      * so we needn't wait extra time after that.
266      */
267     udelay(1);
268 
269     return ret;
270 }
271 
272 #ifdef CONFIG_CLK_RK312X
273 extern void rkclk_cpuclk_div_setting(int div);
274 #else
rkclk_cpuclk_div_setting(int div)275 static inline void rkclk_cpuclk_div_setting(int div)
276 {
277 }
278 #endif
279 
rk816_regulator_set_voltage_sel_regmap(struct regulator_dev *rdev, unsigned int sel)280 static int rk816_regulator_set_voltage_sel_regmap(struct regulator_dev *rdev, unsigned int sel)
281 {
282     int ret, real_sel, delay = 0x64;
283     int rk816_type;
284     int id = rdev_get_id(rdev);
285 
286     regmap_read(rdev->regmap, RK816_CHIP_VER_REG, &rk816_type);
287     rk816_type &= RK816_CHIP_VERSION_MASK;
288     sel <<= ffs(rdev->desc->vsel_mask) - 1;
289 
290     if ((rk816_type != RK816_TYPE_ES2) && (id == 0)) {
291         if (sel > 0x17) {
292             rkclk_cpuclk_div_setting(0x4);
293         } else {
294             rkclk_cpuclk_div_setting(0x2);
295         }
296     }
297 
298     do {
299         ret = regmap_update_bits(rdev->regmap, rdev->desc->vsel_reg, rdev->desc->vsel_mask, sel);
300         if (ret) {
301             return ret;
302         }
303 
304         if (rk816_type == RK816_TYPE_ES2) {
305             ret = regmap_update_bits(rdev->regmap, RK816_DCDC_EN_REG2, RK816_BUCK_DVS_CONFIRM, RK816_BUCK_DVS_CONFIRM);
306             if (ret) {
307                 return ret;
308             }
309         }
310 
311         regmap_read(rdev->regmap, rdev->desc->vsel_reg, &real_sel);
312         real_sel &= rdev->desc->vsel_mask;
313         delay--;
314     } while ((sel != real_sel) && (delay > 0));
315 
316     if ((rk816_type != RK816_TYPE_ES2) && (id == 0)) {
317         rkclk_cpuclk_div_setting(1);
318     }
319 
320     return ret;
321 }
322 
rk808_buck1_2_set_voltage_sel(struct regulator_dev *rdev, unsigned sel)323 static int rk808_buck1_2_set_voltage_sel(struct regulator_dev *rdev, unsigned sel)
324 {
325     struct rk808_regulator_data *pdata = rdev_get_drvdata(rdev);
326     int id = rdev_get_id(rdev);
327     struct gpio_desc *gpio = pdata->dvs_gpio[id];
328     unsigned int reg = rdev->desc->vsel_reg;
329     unsigned old_sel;
330     int ret, gpio_level;
331 
332     if (!gpio) {
333         return rk808_buck1_2_i2c_set_voltage_sel(rdev, sel);
334     }
335 
336     gpio_level = gpiod_get_value(gpio);
337     if (gpio_level == 0) {
338         reg += RK808_DVS_REG_OFFSET;
339         ret = regmap_read(rdev->regmap, rdev->desc->vsel_reg, &old_sel);
340     } else {
341         ret = regmap_read(rdev->regmap, reg + RK808_DVS_REG_OFFSET, &old_sel);
342     }
343 
344     if (ret != 0) {
345         return ret;
346     }
347 
348     sel <<= ffs(rdev->desc->vsel_mask) - 1;
349     sel |= old_sel & ~rdev->desc->vsel_mask;
350 
351     ret = regmap_write(rdev->regmap, reg, sel);
352     if (ret) {
353         return ret;
354     }
355 
356     gpiod_set_value(gpio, !gpio_level);
357 
358     return ret;
359 }
360 
rk808_buck1_2_set_voltage_time_sel(struct regulator_dev *rdev, unsigned int old_selector, unsigned int new_selector)361 static int rk808_buck1_2_set_voltage_time_sel(struct regulator_dev *rdev, unsigned int old_selector,
362                                               unsigned int new_selector)
363 {
364     struct rk808_regulator_data *pdata = rdev_get_drvdata(rdev);
365     int id = rdev_get_id(rdev);
366     struct gpio_desc *gpio = pdata->dvs_gpio[id];
367 
368     /* if there is no dvs1/2 pin, we don't need wait extra time here. */
369     if (!gpio) {
370         return 0;
371     }
372 
373     return regulator_set_voltage_time_sel(rdev, old_selector, new_selector);
374 }
375 
rk805_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay)376 static int rk805_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay)
377 {
378     unsigned int ramp_value = RK808_RAMP_RATE_10MV_PER_US;
379     unsigned int reg = rk808_buck_config_regs[rdev_get_id(rdev)];
380 
381     switch (ramp_delay) {
382         case 0x0 ... 0xbb8:
383             ramp_value = RK805_RAMP_RATE_3MV_PER_US;
384             break;
385         case 0xbb9 ... 0x1770:
386             ramp_value = RK805_RAMP_RATE_6MV_PER_US;
387             break;
388         case 0x1771 ... 0x30d4:
389             ramp_value = RK805_RAMP_RATE_12_5MV_PER_US;
390             break;
391         case 0x30d5 ... 0x61a8:
392             ramp_value = RK805_RAMP_RATE_25MV_PER_US;
393             break;
394         default:
395             pr_warn("%s ramp_delay: %d not supported\n", rdev->desc->name, ramp_delay);
396     }
397 
398     return regmap_update_bits(rdev->regmap, reg, RK805_RAMP_RATE_MASK, ramp_value);
399 }
400 
rk808_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay)401 static int rk808_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay)
402 {
403     unsigned int ramp_value = RK808_RAMP_RATE_10MV_PER_US;
404     unsigned int reg = rk808_buck_config_regs[rdev_get_id(rdev)];
405 
406     switch (ramp_delay) {
407         case 1 ... 0x7d0:
408             ramp_value = RK808_RAMP_RATE_2MV_PER_US;
409             break;
410         case 0x7d1 ... 0xfa0:
411             ramp_value = RK808_RAMP_RATE_4MV_PER_US;
412             break;
413         case 0xfa1 ... 0x1770:
414             ramp_value = RK808_RAMP_RATE_6MV_PER_US;
415             break;
416         case 0x1771 ... 0x2710:
417             break;
418         default:
419             pr_warn("%s ramp_delay: %d not supported, setting 10000\n", rdev->desc->name, ramp_delay);
420     }
421 
422     return regmap_update_bits(rdev->regmap, reg, RK808_RAMP_RATE_MASK, ramp_value);
423 }
424 
rk8xx_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay)425 static int rk8xx_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay)
426 {
427     struct rk808 *rk808 = dev_get_drvdata(rdev->dev.parent);
428 
429     if (rk808->variant == RK805_ID) {
430         return rk805_set_ramp_delay(rdev, ramp_delay);
431     }
432 
433     return rk808_set_ramp_delay(rdev, ramp_delay);
434 }
435 
436 /*
437  * RK817 RK809
438  */
rk817_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay)439 static int rk817_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay)
440 {
441     unsigned int ramp_value = RK817_RAMP_RATE_25MV_PER_US;
442     unsigned int reg = RK817_BUCK_CONFIG_REG(rdev_get_id(rdev));
443 
444     switch (ramp_delay) {
445         case 0 ... 0xbb8:
446             ramp_value = RK817_RAMP_RATE_3MV_PER_US;
447             break;
448         case 0xbb9 ... 0x189c:
449             ramp_value = RK817_RAMP_RATE_6_3MV_PER_US;
450             break;
451         case 0x189d ... 0x30d4:
452             ramp_value = RK817_RAMP_RATE_12_5MV_PER_US;
453             break;
454         case 0x30d5 ... 0x61a8:
455             break;
456         default:
457             dev_warn(&rdev->dev, "%s ramp_delay: %d not supported, setting 25000\n", rdev->desc->name, ramp_delay);
458     }
459 
460     return regmap_update_bits(rdev->regmap, reg, RK817_RAMP_RATE_MASK, ramp_value);
461 }
462 
rk808_set_suspend_voltage(struct regulator_dev *rdev, int uv)463 static int rk808_set_suspend_voltage(struct regulator_dev *rdev, int uv)
464 {
465     unsigned int reg;
466     int sel = regulator_map_voltage_linear(rdev, uv, uv);
467     if (sel < 0) {
468         return -EINVAL;
469     }
470     reg = rdev->desc->vsel_reg + RK808_SLP_REG_OFFSET;
471     return regmap_update_bits(rdev->regmap, reg, rdev->desc->vsel_mask, sel);
472 }
473 
rk808_set_suspend_voltage_range(struct regulator_dev *rdev, int uv)474 static int rk808_set_suspend_voltage_range(struct regulator_dev *rdev, int uv)
475 {
476     unsigned int reg;
477     int sel = regulator_map_voltage_linear_range(rdev, uv, uv);
478     if (sel < 0) {
479         return -EINVAL;
480     }
481     reg = rdev->desc->vsel_reg + RK808_SLP_REG_OFFSET;
482     return regmap_update_bits(rdev->regmap, reg, rdev->desc->vsel_mask, sel);
483 }
484 
rk805_set_suspend_enable(struct regulator_dev *rdev)485 static int rk805_set_suspend_enable(struct regulator_dev *rdev)
486 {
487     unsigned int reg, offset;
488 
489     if (rdev->desc->id >= RK805_ID_LDO1) {
490         offset = RK805_SLP_LDO_EN_OFFSET;
491     } else {
492         offset = RK805_SLP_DCDC_EN_OFFSET;
493     }
494 
495     reg = rdev->desc->enable_reg + offset;
496 
497     return regmap_update_bits(rdev->regmap, reg, rdev->desc->enable_mask, rdev->desc->enable_mask);
498 }
499 
rk805_set_suspend_disable(struct regulator_dev *rdev)500 static int rk805_set_suspend_disable(struct regulator_dev *rdev)
501 {
502     unsigned int reg, offset;
503 
504     if (rdev->desc->id >= RK805_ID_LDO1) {
505         offset = RK805_SLP_LDO_EN_OFFSET;
506     } else {
507         offset = RK805_SLP_DCDC_EN_OFFSET;
508     }
509 
510     reg = rdev->desc->enable_reg + offset;
511 
512     return regmap_update_bits(rdev->regmap, reg, rdev->desc->enable_mask, 0);
513 }
514 
rk816_set_suspend_enable(struct regulator_dev *rdev)515 static int rk816_set_suspend_enable(struct regulator_dev *rdev)
516 {
517     unsigned int reg, val;
518 
519     if (rdev->desc->id <= RK816_ID_DCDC4) {
520         reg = rdev->desc->enable_reg + RK816_DCDC_SLP_EN_REG_OFFSET;
521         val = 1 << rdev->desc->id;
522     } else if ((rdev->desc->id > RK816_ID_DCDC4) && (rdev->desc->id <= RK816_ID_LDO4)) {
523         reg = rdev->desc->enable_reg - RK816_LDO1_4_SLP_EN_REG_OFFSET;
524         val = 1 << (rdev->desc->id - RK816_ID_LDO1);
525     } else {
526         reg = rdev->desc->enable_reg - RK816_LDO5_6_SLP_EN_REG_OFFSET;
527         val = 1 << (rdev->desc->id - RK816_ID_LDO1);
528     }
529 
530     return regmap_update_bits(rdev->regmap, reg, val, val);
531 }
532 
rk816_set_suspend_disable(struct regulator_dev *rdev)533 static int rk816_set_suspend_disable(struct regulator_dev *rdev)
534 {
535     unsigned int reg, val;
536 
537     if (rdev->desc->id <= RK816_ID_DCDC4) {
538         reg = rdev->desc->enable_reg + RK816_DCDC_SLP_EN_REG_OFFSET;
539         val = 1 << rdev->desc->id;
540     } else if ((rdev->desc->id > RK816_ID_DCDC4) && (rdev->desc->id <= RK816_ID_LDO4)) {
541         reg = rdev->desc->enable_reg - RK816_LDO1_4_SLP_EN_REG_OFFSET;
542         val = 1 << (rdev->desc->id - RK816_ID_LDO1);
543     } else {
544         reg = rdev->desc->enable_reg - RK816_LDO5_6_SLP_EN_REG_OFFSET;
545         val = 1 << (rdev->desc->id - RK816_ID_LDO1);
546     }
547 
548     return regmap_update_bits(rdev->regmap, reg, val, 0);
549 }
550 
rk808_set_suspend_enable(struct regulator_dev *rdev)551 static int rk808_set_suspend_enable(struct regulator_dev *rdev)
552 {
553     unsigned int reg;
554     struct rk808 *rk808 = dev_get_drvdata(rdev->dev.parent);
555 
556     if (rk808->variant == RK816_ID) {
557         return rk816_set_suspend_enable(rdev);
558     } else if (rk808->variant == RK805_ID) {
559         return rk805_set_suspend_enable(rdev);
560     }
561 
562     reg = rdev->desc->enable_reg + RK808_SLP_SET_OFF_REG_OFFSET;
563 
564     return regmap_update_bits(rdev->regmap, reg, rdev->desc->enable_mask, 0);
565 }
566 
rk808_set_suspend_disable(struct regulator_dev *rdev)567 static int rk808_set_suspend_disable(struct regulator_dev *rdev)
568 {
569     unsigned int reg;
570     struct rk808 *rk808 = dev_get_drvdata(rdev->dev.parent);
571 
572     if (rk808->variant == RK816_ID) {
573         return rk816_set_suspend_disable(rdev);
574     } else if (rk808->variant == RK805_ID) {
575         return rk805_set_suspend_disable(rdev);
576     }
577 
578     reg = rdev->desc->enable_reg + RK808_SLP_SET_OFF_REG_OFFSET;
579 
580     return regmap_update_bits(rdev->regmap, reg, rdev->desc->enable_mask, rdev->desc->enable_mask);
581 }
582 
rk817_set_suspend_enable_ctrl(struct regulator_dev *rdev, unsigned int en)583 static int rk817_set_suspend_enable_ctrl(struct regulator_dev *rdev, unsigned int en)
584 {
585     unsigned int reg;
586     int id = rdev_get_id(rdev);
587     unsigned int id_slp, msk, val;
588 
589     if (id >= RK817_ID_DCDC1 && id <= RK817_ID_DCDC4) {
590         id_slp = id;
591     } else if (id >= RK817_ID_LDO1 && id <= RK817_ID_LDO8) {
592         id_slp = 0x8 + (id - RK817_ID_LDO1);
593     } else if (id >= RK817_ID_LDO9 && id <= RK809_ID_SW2) {
594         id_slp = 0x4 + (id - RK817_ID_LDO9);
595     } else {
596         return -EINVAL;
597     }
598 
599     reg = RK817_POWER_SLP_EN_REG(id_slp / 0x8);
600 
601     msk = BIT(id_slp % 0x8);
602     if (en) {
603         val = msk;
604     } else {
605         val = 0;
606     }
607 
608     return regmap_update_bits(rdev->regmap, reg, msk, val);
609 }
610 
rk817_set_suspend_enable(struct regulator_dev *rdev)611 static int rk817_set_suspend_enable(struct regulator_dev *rdev)
612 {
613     return rk817_set_suspend_enable_ctrl(rdev, 1);
614 }
615 
rk817_set_suspend_disable(struct regulator_dev *rdev)616 static int rk817_set_suspend_disable(struct regulator_dev *rdev)
617 {
618     return rk817_set_suspend_enable_ctrl(rdev, 0);
619 }
620 
rk8xx_set_suspend_mode(struct regulator_dev *rdev, unsigned int mode)621 static int rk8xx_set_suspend_mode(struct regulator_dev *rdev, unsigned int mode)
622 {
623     unsigned int reg;
624 
625     reg = rdev->desc->vsel_reg + RK808_SLP_REG_OFFSET;
626 
627     switch (mode) {
628         case REGULATOR_MODE_FAST:
629             return regmap_update_bits(rdev->regmap, reg, PWM_MODE_MSK, FPWM_MODE);
630         case REGULATOR_MODE_NORMAL:
631             return regmap_update_bits(rdev->regmap, reg, PWM_MODE_MSK, AUTO_PWM_MODE);
632         default:
633             dev_err(&rdev->dev, "do not support this mode\n");
634             return -EINVAL;
635     }
636 
637     return 0;
638 }
639 
rk8xx_set_mode(struct regulator_dev *rdev, unsigned int mode)640 static int rk8xx_set_mode(struct regulator_dev *rdev, unsigned int mode)
641 {
642     switch (mode) {
643         case REGULATOR_MODE_FAST:
644             return regmap_update_bits(rdev->regmap, rdev->desc->vsel_reg, PWM_MODE_MSK, FPWM_MODE);
645         case REGULATOR_MODE_NORMAL:
646             return regmap_update_bits(rdev->regmap, rdev->desc->vsel_reg, PWM_MODE_MSK, AUTO_PWM_MODE);
647         default:
648             dev_err(&rdev->dev, "do not support this mode\n");
649             return -EINVAL;
650     }
651 
652     return 0;
653 }
654 
rk8xx_get_mode(struct regulator_dev *rdev)655 static unsigned int rk8xx_get_mode(struct regulator_dev *rdev)
656 {
657     unsigned int val;
658     int err;
659 
660     err = regmap_read(rdev->regmap, rdev->desc->vsel_reg, &val);
661     if (err) {
662         return err;
663     }
664 
665     if (val & FPWM_MODE) {
666         return REGULATOR_MODE_FAST;
667     } else {
668         return REGULATOR_MODE_NORMAL;
669     }
670 }
671 
rk8xx_enabled_wmsk_regmap(struct regulator_dev *rdev)672 static int rk8xx_enabled_wmsk_regmap(struct regulator_dev *rdev)
673 {
674     return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg, rdev->desc->enable_mask, rdev->desc->enable_mask);
675 }
676 
rk8xx_disabled_wmsk_regmap(struct regulator_dev *rdev)677 static int rk8xx_disabled_wmsk_regmap(struct regulator_dev *rdev)
678 {
679     return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg, rdev->desc->enable_mask, rdev->desc->disable_val);
680 }
681 
rk8xx_is_enabled_wmsk_regmap(struct regulator_dev *rdev)682 static int rk8xx_is_enabled_wmsk_regmap(struct regulator_dev *rdev)
683 {
684     unsigned int val;
685     int ret;
686 
687     ret = regmap_read(rdev->regmap, rdev->desc->enable_reg, &val);
688     if (ret != 0) {
689         return ret;
690     }
691 
692     val &= rdev->desc->enable_val;
693     return val != 0;
694 }
695 
rk8xx_regulator_of_map_mode(unsigned int mode)696 static unsigned int rk8xx_regulator_of_map_mode(unsigned int mode)
697 {
698     switch (mode) {
699         case 0x1:
700             return REGULATOR_MODE_FAST;
701         case 0x2:
702             return REGULATOR_MODE_NORMAL;
703         default:
704             return REGULATOR_MODE_INVALID;
705     }
706 }
707 
708 static const struct regulator_ops rk808_buck1_2_ops = {
709     .list_voltage = regulator_list_voltage_linear,
710     .map_voltage = regulator_map_voltage_linear,
711     .get_voltage_sel = rk808_buck1_2_get_voltage_sel_regmap,
712     .set_voltage_sel = rk808_buck1_2_set_voltage_sel,
713     .set_voltage_time_sel = rk808_buck1_2_set_voltage_time_sel,
714     .enable = regulator_enable_regmap,
715     .disable = regulator_disable_regmap,
716     .is_enabled = regulator_is_enabled_regmap,
717     .set_mode = rk8xx_set_mode,
718     .get_mode = rk8xx_get_mode,
719     .set_suspend_mode = rk8xx_set_suspend_mode,
720     .set_ramp_delay = rk8xx_set_ramp_delay,
721     .set_suspend_voltage = rk808_set_suspend_voltage,
722     .set_suspend_enable = rk808_set_suspend_enable,
723     .set_suspend_disable = rk808_set_suspend_disable,
724 };
725 
726 static const struct regulator_ops rk816_buck1_2_ops_ranges = {
727     .list_voltage = regulator_list_voltage_linear_range,
728     .map_voltage = regulator_map_voltage_linear_range,
729     .get_voltage_sel = regulator_get_voltage_sel_regmap,
730     .set_voltage_sel = rk816_regulator_set_voltage_sel_regmap,
731     .set_voltage_time_sel = regulator_set_voltage_time_sel,
732     .enable = regulator_enable_regmap,
733     .disable = regulator_disable_regmap,
734     .is_enabled = regulator_is_enabled_regmap,
735     .set_mode = rk8xx_set_mode,
736     .get_mode = rk8xx_get_mode,
737     .set_suspend_mode = rk8xx_set_suspend_mode,
738     .set_ramp_delay = rk8xx_set_ramp_delay,
739     .set_suspend_voltage = rk808_set_suspend_voltage_range,
740     .set_suspend_enable = rk808_set_suspend_enable,
741     .set_suspend_disable = rk808_set_suspend_disable,
742 };
743 
744 static const struct regulator_ops rk808_reg_ops = {
745     .list_voltage = regulator_list_voltage_linear,
746     .map_voltage = regulator_map_voltage_linear,
747     .get_voltage_sel = regulator_get_voltage_sel_regmap,
748     .set_voltage_sel = regulator_set_voltage_sel_regmap,
749     .enable = regulator_enable_regmap,
750     .disable = regulator_disable_regmap,
751     .is_enabled = regulator_is_enabled_regmap,
752     .set_suspend_voltage = rk808_set_suspend_voltage,
753     .set_suspend_enable = rk808_set_suspend_enable,
754     .set_suspend_disable = rk808_set_suspend_disable,
755 };
756 
757 static const struct regulator_ops rk808_reg_ops_ranges = {
758     .list_voltage = regulator_list_voltage_linear_range,
759     .map_voltage = regulator_map_voltage_linear_range,
760     .get_voltage_sel = regulator_get_voltage_sel_regmap,
761     .set_voltage_sel = regulator_set_voltage_sel_regmap,
762     .enable = regulator_enable_regmap,
763     .disable = regulator_disable_regmap,
764     .is_enabled = regulator_is_enabled_regmap,
765     .set_mode = rk8xx_set_mode,
766     .get_mode = rk8xx_get_mode,
767     .set_suspend_mode = rk8xx_set_suspend_mode,
768     .set_ramp_delay = rk8xx_set_ramp_delay,
769     .set_suspend_voltage = rk808_set_suspend_voltage_range,
770     .set_suspend_enable = rk808_set_suspend_enable,
771     .set_suspend_disable = rk808_set_suspend_disable,
772 };
773 
774 static const struct regulator_ops rk808_switch_ops = {
775     .enable = regulator_enable_regmap,
776     .disable = regulator_disable_regmap,
777     .is_enabled = regulator_is_enabled_regmap,
778     .set_mode = rk8xx_set_mode,
779     .get_mode = rk8xx_get_mode,
780     .set_suspend_enable = rk808_set_suspend_enable,
781     .set_suspend_disable = rk808_set_suspend_disable,
782 };
783 
784 static const struct regulator_ops rk809_buck5_ops_range = {
785     .list_voltage = regulator_list_voltage_linear_range,
786     .map_voltage = regulator_map_voltage_linear_range,
787     .get_voltage_sel = regulator_get_voltage_sel_regmap,
788     .set_voltage_sel = regulator_set_voltage_sel_regmap,
789     .set_voltage_time_sel = regulator_set_voltage_time_sel,
790     .enable = rk8xx_enabled_wmsk_regmap,
791     .disable = rk8xx_disabled_wmsk_regmap,
792     .is_enabled = rk8xx_is_enabled_wmsk_regmap,
793     .set_suspend_voltage = rk808_set_suspend_voltage_range,
794     .set_suspend_enable = rk817_set_suspend_enable,
795     .set_suspend_disable = rk817_set_suspend_disable,
796 };
797 
798 static const struct regulator_ops rk817_reg_ops = {
799     .list_voltage = regulator_list_voltage_linear,
800     .map_voltage = regulator_map_voltage_linear,
801     .get_voltage_sel = regulator_get_voltage_sel_regmap,
802     .set_voltage_sel = regulator_set_voltage_sel_regmap,
803     .enable = rk8xx_enabled_wmsk_regmap,
804     .disable = rk8xx_disabled_wmsk_regmap,
805     .is_enabled = rk8xx_is_enabled_wmsk_regmap,
806     .set_suspend_voltage = rk808_set_suspend_voltage,
807     .set_suspend_enable = rk817_set_suspend_enable,
808     .set_suspend_disable = rk817_set_suspend_disable,
809 };
810 
811 static const struct regulator_ops rk817_boost_ops = {
812     .list_voltage = regulator_list_voltage_linear,
813     .map_voltage = regulator_map_voltage_linear,
814     .get_voltage_sel = regulator_get_voltage_sel_regmap,
815     .set_voltage_sel = regulator_set_voltage_sel_regmap,
816     .enable = rk8xx_enabled_wmsk_regmap,
817     .disable = rk8xx_disabled_wmsk_regmap,
818     .is_enabled = rk8xx_is_enabled_wmsk_regmap,
819     .set_suspend_enable = rk817_set_suspend_enable,
820     .set_suspend_disable = rk817_set_suspend_disable,
821 };
822 
823 static const struct regulator_ops rk817_buck_ops_range = {
824     .list_voltage = regulator_list_voltage_linear_range,
825     .map_voltage = regulator_map_voltage_linear_range,
826     .get_voltage_sel = regulator_get_voltage_sel_regmap,
827     .set_voltage_sel = regulator_set_voltage_sel_regmap,
828     .set_voltage_time_sel = regulator_set_voltage_time_sel,
829     .enable = rk8xx_enabled_wmsk_regmap,
830     .disable = rk8xx_disabled_wmsk_regmap,
831     .is_enabled = rk8xx_is_enabled_wmsk_regmap,
832     .set_mode = rk8xx_set_mode,
833     .get_mode = rk8xx_get_mode,
834     .set_suspend_mode = rk8xx_set_suspend_mode,
835     .set_ramp_delay = rk817_set_ramp_delay,
836     .set_suspend_voltage = rk808_set_suspend_voltage_range,
837     .set_suspend_enable = rk817_set_suspend_enable,
838     .set_suspend_disable = rk817_set_suspend_disable,
839 };
840 
841 static const struct regulator_ops rk817_switch_ops = {
842     .enable = rk8xx_enabled_wmsk_regmap,
843     .disable = rk8xx_disabled_wmsk_regmap,
844     .is_enabled = rk8xx_is_enabled_wmsk_regmap,
845     .set_suspend_enable = rk817_set_suspend_enable,
846     .set_suspend_disable = rk817_set_suspend_disable,
847 };
848 
849 static const struct regulator_desc rk805_reg[] = {
850     {
851         .name = "DCDC_REG1",
852         .supply_name = "vcc1",
853         .of_match = of_match_ptr("DCDC_REG1"),
854         .regulators_node = of_match_ptr("regulators"),
855         .id = RK805_ID_DCDC1,
856         .ops = &rk808_reg_ops_ranges,
857         .type = REGULATOR_VOLTAGE,
858         .n_voltages = 64,
859         .linear_ranges = rk805_buck_1_2_voltage_ranges,
860         .n_linear_ranges = ARRAY_SIZE(rk805_buck_1_2_voltage_ranges),
861         .vsel_reg = RK805_BUCK1_ON_VSEL_REG,
862         .vsel_mask = RK818_BUCK_VSEL_MASK,
863         .enable_reg = RK805_DCDC_EN_REG,
864         .enable_mask = ENABLE_MASK(RK805_ID_DCDC1),
865         .enable_val = ENABLE_MASK(RK805_ID_DCDC1),
866         .disable_val = DISABLE_VAL(RK805_ID_DCDC1),
867         .of_map_mode = rk8xx_regulator_of_map_mode,
868         .owner = THIS_MODULE,
869     },
870     {
871         .name = "DCDC_REG2",
872         .supply_name = "vcc2",
873         .of_match = of_match_ptr("DCDC_REG2"),
874         .regulators_node = of_match_ptr("regulators"),
875         .id = RK805_ID_DCDC2,
876         .ops = &rk808_reg_ops_ranges,
877         .type = REGULATOR_VOLTAGE,
878         .n_voltages = 64,
879         .linear_ranges = rk805_buck_1_2_voltage_ranges,
880         .n_linear_ranges = ARRAY_SIZE(rk805_buck_1_2_voltage_ranges),
881         .vsel_reg = RK805_BUCK2_ON_VSEL_REG,
882         .vsel_mask = RK818_BUCK_VSEL_MASK,
883         .enable_reg = RK805_DCDC_EN_REG,
884         .enable_mask = ENABLE_MASK(RK805_ID_DCDC2),
885         .enable_val = ENABLE_MASK(RK805_ID_DCDC2),
886         .disable_val = DISABLE_VAL(RK805_ID_DCDC2),
887         .of_map_mode = rk8xx_regulator_of_map_mode,
888         .owner = THIS_MODULE,
889     },
890     {
891         .name = "DCDC_REG3",
892         .supply_name = "vcc3",
893         .of_match = of_match_ptr("DCDC_REG3"),
894         .regulators_node = of_match_ptr("regulators"),
895         .id = RK805_ID_DCDC3,
896         .ops = &rk808_switch_ops,
897         .type = REGULATOR_VOLTAGE,
898         .n_voltages = 1,
899         .enable_reg = RK805_DCDC_EN_REG,
900         .enable_mask = ENABLE_MASK(RK805_ID_DCDC3),
901         .enable_val = ENABLE_MASK(RK805_ID_DCDC3),
902         .disable_val = DISABLE_VAL(RK805_ID_DCDC3),
903         .of_map_mode = rk8xx_regulator_of_map_mode,
904         .owner = THIS_MODULE,
905     },
906     {
907         .name = "DCDC_REG4",
908         .supply_name = "vcc4",
909         .of_match = of_match_ptr("DCDC_REG4"),
910         .regulators_node = of_match_ptr("regulators"),
911         .id = RK805_ID_DCDC4,
912         .ops = &rk808_reg_ops_ranges,
913         .type = REGULATOR_VOLTAGE,
914         .n_voltages = 32,
915         .linear_ranges = rk805_buck4_voltage_ranges,
916         .n_linear_ranges = ARRAY_SIZE(rk805_buck4_voltage_ranges),
917         .vsel_reg = RK805_BUCK4_ON_VSEL_REG,
918         .vsel_mask = RK818_BUCK4_VSEL_MASK,
919         .enable_reg = RK805_DCDC_EN_REG,
920         .enable_mask = ENABLE_MASK(RK805_ID_DCDC4),
921         .enable_val = ENABLE_MASK(RK805_ID_DCDC4),
922         .disable_val = DISABLE_VAL(RK805_ID_DCDC4),
923         .of_map_mode = rk8xx_regulator_of_map_mode,
924         .owner = THIS_MODULE,
925     },
926 
927     RK805_DESC(RK805_ID_LDO1, "LDO_REG1", "vcc5", 800, 3400, 100, RK805_LDO1_ON_VSEL_REG, RK818_LDO_VSEL_MASK,
928                RK805_LDO_EN_REG, ENABLE_MASK(0), DISABLE_VAL(0), 400),
929     RK805_DESC(RK805_ID_LDO2, "LDO_REG2", "vcc5", 800, 3400, 100, RK805_LDO2_ON_VSEL_REG, RK818_LDO_VSEL_MASK,
930                RK805_LDO_EN_REG, ENABLE_MASK(1), DISABLE_VAL(1), 400),
931     RK805_DESC(RK805_ID_LDO3, "LDO_REG3", "vcc6", 800, 3400, 100, RK805_LDO3_ON_VSEL_REG, RK818_LDO_VSEL_MASK,
932                RK805_LDO_EN_REG, ENABLE_MASK(2), DISABLE_VAL(2), 400),
933 };
934 
935 static const struct regulator_desc rk808_reg[] = {
936     {
937         .name = "DCDC_REG1",
938         .supply_name = "vcc1",
939         .of_match = of_match_ptr("DCDC_REG1"),
940         .regulators_node = of_match_ptr("regulators"),
941         .id = RK808_ID_DCDC1,
942         .ops = &rk808_buck1_2_ops,
943         .type = REGULATOR_VOLTAGE,
944         .min_uV = 712500,
945         .uV_step = 12500,
946         .n_voltages = 64,
947         .vsel_reg = RK808_BUCK1_ON_VSEL_REG,
948         .vsel_mask = RK808_BUCK_VSEL_MASK,
949         .enable_reg = RK808_DCDC_EN_REG,
950         .enable_mask = BIT(0),
951         .owner = THIS_MODULE,
952     },
953     {
954         .name = "DCDC_REG2",
955         .supply_name = "vcc2",
956         .of_match = of_match_ptr("DCDC_REG2"),
957         .regulators_node = of_match_ptr("regulators"),
958         .id = RK808_ID_DCDC2,
959         .ops = &rk808_buck1_2_ops,
960         .type = REGULATOR_VOLTAGE,
961         .min_uV = 712500,
962         .uV_step = 12500,
963         .n_voltages = 64,
964         .vsel_reg = RK808_BUCK2_ON_VSEL_REG,
965         .vsel_mask = RK808_BUCK_VSEL_MASK,
966         .enable_reg = RK808_DCDC_EN_REG,
967         .enable_mask = BIT(1),
968         .owner = THIS_MODULE,
969     },
970     {
971         .name = "DCDC_REG3",
972         .supply_name = "vcc3",
973         .of_match = of_match_ptr("DCDC_REG3"),
974         .regulators_node = of_match_ptr("regulators"),
975         .id = RK808_ID_DCDC3,
976         .ops = &rk808_switch_ops,
977         .type = REGULATOR_VOLTAGE,
978         .n_voltages = 1,
979         .enable_reg = RK808_DCDC_EN_REG,
980         .enable_mask = BIT(2),
981         .owner = THIS_MODULE,
982     },
983     RK8XX_DESC(RK808_ID_DCDC4, "DCDC_REG4", "vcc4", 1800, 3300, 100, RK808_BUCK4_ON_VSEL_REG, RK808_BUCK4_VSEL_MASK,
984                RK808_DCDC_EN_REG, BIT(3), 0),
985     RK8XX_DESC(RK808_ID_LDO1, "LDO_REG1", "vcc6", 1800, 3400, 100, RK808_LDO1_ON_VSEL_REG, RK808_LDO_VSEL_MASK,
986                RK808_LDO_EN_REG, BIT(0), 400),
987     RK8XX_DESC(RK808_ID_LDO2, "LDO_REG2", "vcc6", 1800, 3400, 100, RK808_LDO2_ON_VSEL_REG, RK808_LDO_VSEL_MASK,
988                RK808_LDO_EN_REG, BIT(1), 400),
989     {
990         .name = "LDO_REG3",
991         .supply_name = "vcc7",
992         .of_match = of_match_ptr("LDO_REG3"),
993         .regulators_node = of_match_ptr("regulators"),
994         .id = RK808_ID_LDO3,
995         .ops = &rk808_reg_ops_ranges,
996         .type = REGULATOR_VOLTAGE,
997         .n_voltages = 16,
998         .linear_ranges = rk808_ldo3_voltage_ranges,
999         .n_linear_ranges = ARRAY_SIZE(rk808_ldo3_voltage_ranges),
1000         .vsel_reg = RK808_LDO3_ON_VSEL_REG,
1001         .vsel_mask = RK808_BUCK4_VSEL_MASK,
1002         .enable_reg = RK808_LDO_EN_REG,
1003         .enable_mask = BIT(2),
1004         .enable_time = 400,
1005         .owner = THIS_MODULE,
1006     },
1007     RK8XX_DESC(RK808_ID_LDO4, "LDO_REG4", "vcc9", 1800, 3400, 100, RK808_LDO4_ON_VSEL_REG, RK808_LDO_VSEL_MASK,
1008                RK808_LDO_EN_REG, BIT(3), 400),
1009     RK8XX_DESC(RK808_ID_LDO5, "LDO_REG5", "vcc9", 1800, 3400, 100, RK808_LDO5_ON_VSEL_REG, RK808_LDO_VSEL_MASK,
1010                RK808_LDO_EN_REG, BIT(4), 400),
1011     RK8XX_DESC(RK808_ID_LDO6, "LDO_REG6", "vcc10", 800, 2500, 100, RK808_LDO6_ON_VSEL_REG, RK808_LDO_VSEL_MASK,
1012                RK808_LDO_EN_REG, BIT(5), 400),
1013     RK8XX_DESC(RK808_ID_LDO7, "LDO_REG7", "vcc7", 800, 2500, 100, RK808_LDO7_ON_VSEL_REG, RK808_LDO_VSEL_MASK,
1014                RK808_LDO_EN_REG, BIT(6), 400),
1015     RK8XX_DESC(RK808_ID_LDO8, "LDO_REG8", "vcc11", 1800, 3400, 100, RK808_LDO8_ON_VSEL_REG, RK808_LDO_VSEL_MASK,
1016                RK808_LDO_EN_REG, BIT(7), 400),
1017     RK8XX_DESC_SWITCH(RK808_ID_SWITCH1, "SWITCH_REG1", "vcc8", RK808_DCDC_EN_REG, BIT(5)),
1018     RK8XX_DESC_SWITCH(RK808_ID_SWITCH2, "SWITCH_REG2", "vcc12", RK808_DCDC_EN_REG, BIT(6)),
1019 };
1020 
1021 static const struct regulator_desc rk816_reg[] = {
1022     {
1023         .name = "DCDC_REG1",
1024         .supply_name = "vcc1",
1025         .of_match = of_match_ptr("DCDC_REG1"),
1026         .regulators_node = of_match_ptr("regulators"),
1027         .id = RK816_ID_DCDC1,
1028         .ops = &rk816_buck1_2_ops_ranges,
1029         .type = REGULATOR_VOLTAGE,
1030         .n_voltages = 64,
1031         .linear_ranges = rk816_buck_voltage_ranges,
1032         .n_linear_ranges = ARRAY_SIZE(rk816_buck_voltage_ranges),
1033         .vsel_reg = RK816_BUCK1_ON_VSEL_REG,
1034         .vsel_mask = RK818_BUCK_VSEL_MASK,
1035         .enable_reg = RK816_DCDC_EN_REG1,
1036         .enable_mask = BIT(4) | BIT(0),
1037         .enable_val = BIT(4) | BIT(0),
1038         .disable_val = BIT(4),
1039         .of_map_mode = rk8xx_regulator_of_map_mode,
1040         .owner = THIS_MODULE,
1041     },
1042     {
1043         .name = "DCDC_REG2",
1044         .supply_name = "vcc2",
1045         .of_match = of_match_ptr("DCDC_REG2"),
1046         .regulators_node = of_match_ptr("regulators"),
1047         .id = RK816_ID_DCDC2,
1048         .ops = &rk816_buck1_2_ops_ranges,
1049         .type = REGULATOR_VOLTAGE,
1050         .n_voltages = 64,
1051         .linear_ranges = rk816_buck_voltage_ranges,
1052         .n_linear_ranges = ARRAY_SIZE(rk816_buck_voltage_ranges),
1053         .vsel_reg = RK816_BUCK2_ON_VSEL_REG,
1054         .vsel_mask = RK818_BUCK_VSEL_MASK,
1055         .enable_reg = RK816_DCDC_EN_REG1,
1056         .enable_mask = BIT(5) | BIT(1),
1057         .enable_val = BIT(5) | BIT(1),
1058         .disable_val = BIT(5),
1059         .of_map_mode = rk8xx_regulator_of_map_mode,
1060         .owner = THIS_MODULE,
1061     },
1062     {
1063         .name = "DCDC_REG3",
1064         .supply_name = "vcc3",
1065         .of_match = of_match_ptr("DCDC_REG3"),
1066         .regulators_node = of_match_ptr("regulators"),
1067         .id = RK818_ID_DCDC3,
1068         .ops = &rk808_switch_ops,
1069         .type = REGULATOR_VOLTAGE,
1070         .n_voltages = 1,
1071         .enable_reg = RK816_DCDC_EN_REG1,
1072         .enable_mask = BIT(6) | BIT(2),
1073         .enable_val = BIT(6) | BIT(2),
1074         .disable_val = BIT(6),
1075         .of_map_mode = rk8xx_regulator_of_map_mode,
1076         .owner = THIS_MODULE,
1077     },
1078     {
1079         .name = "DCDC_REG4",
1080         .supply_name = "vcc4",
1081         .of_match = of_match_ptr("DCDC_REG4"),
1082         .regulators_node = of_match_ptr("regulators"),
1083         .id = RK816_ID_DCDC4,
1084         .ops = &rk808_reg_ops_ranges,
1085         .type = REGULATOR_VOLTAGE,
1086         .n_voltages = 32,
1087         .linear_ranges = rk816_buck4_voltage_ranges,
1088         .n_linear_ranges = ARRAY_SIZE(rk816_buck4_voltage_ranges),
1089         .vsel_reg = RK816_BUCK4_ON_VSEL_REG,
1090         .vsel_mask = RK818_BUCK4_VSEL_MASK,
1091         .enable_reg = RK816_DCDC_EN_REG1,
1092         .enable_mask = BIT(7) | BIT(3),
1093         .enable_val = BIT(7) | BIT(3),
1094         .disable_val = BIT(7),
1095         .of_map_mode = rk8xx_regulator_of_map_mode,
1096         .owner = THIS_MODULE,
1097     },
1098 
1099     RK816_DESC(RK816_ID_LDO1, "LDO_REG1", "vcc5", 800, 3400, 100, RK816_LDO1_ON_VSEL_REG, RK818_LDO_VSEL_MASK,
1100                RK816_LDO_EN_REG1, ENABLE_MASK(0), DISABLE_VAL(0), 400),
1101     RK816_DESC(RK816_ID_LDO2, "LDO_REG2", "vcc5", 800, 3400, 100, RK816_LDO2_ON_VSEL_REG, RK818_LDO_VSEL_MASK,
1102                RK816_LDO_EN_REG1, ENABLE_MASK(1), DISABLE_VAL(1), 400),
1103     RK816_DESC(RK816_ID_LDO3, "LDO_REG3", "vcc5", 800, 3400, 100, RK816_LDO3_ON_VSEL_REG, RK818_LDO_VSEL_MASK,
1104                RK816_LDO_EN_REG1, ENABLE_MASK(2), DISABLE_VAL(2), 400),
1105     RK816_DESC(RK816_ID_LDO4, "LDO_REG4", "vcc6", 800, 3400, 100, RK816_LDO4_ON_VSEL_REG, RK818_LDO_VSEL_MASK,
1106                RK816_LDO_EN_REG1, ENABLE_MASK(3), DISABLE_VAL(3), 400),
1107     RK816_DESC(RK816_ID_LDO5, "LDO_REG5", "vcc6", 800, 3400, 100, RK816_LDO5_ON_VSEL_REG, RK818_LDO_VSEL_MASK,
1108                RK816_LDO_EN_REG2, ENABLE_MASK(0), DISABLE_VAL(0), 400),
1109     RK816_DESC(RK816_ID_LDO6, "LDO_REG6", "vcc6", 800, 3400, 100, RK816_LDO6_ON_VSEL_REG, RK818_LDO_VSEL_MASK,
1110                RK816_LDO_EN_REG2, ENABLE_MASK(1), DISABLE_VAL(1), 400),
1111 };
1112 
1113 static const struct regulator_desc rk809_reg[] = {
1114     {
1115         .name = "DCDC_REG1",
1116         .supply_name = "vcc1",
1117         .of_match = of_match_ptr("DCDC_REG1"),
1118         .regulators_node = of_match_ptr("regulators"),
1119         .id = RK817_ID_DCDC1,
1120         .ops = &rk817_buck_ops_range,
1121         .type = REGULATOR_VOLTAGE,
1122         .n_voltages = RK817_BUCK1_SEL_CNT + 1,
1123         .linear_ranges = rk817_buck1_voltage_ranges,
1124         .n_linear_ranges = ARRAY_SIZE(rk817_buck1_voltage_ranges),
1125         .vsel_reg = RK817_BUCK1_ON_VSEL_REG,
1126         .vsel_mask = RK817_BUCK_VSEL_MASK,
1127         .enable_reg = RK817_POWER_EN_REG(0),
1128         .enable_mask = ENABLE_MASK(RK817_ID_DCDC1),
1129         .enable_val = BIT(RK817_ID_DCDC1),
1130         .disable_val = DISABLE_VAL(RK817_ID_DCDC1),
1131         .of_map_mode = rk8xx_regulator_of_map_mode,
1132         .owner = THIS_MODULE,
1133     },
1134     {
1135         .name = "DCDC_REG2",
1136         .supply_name = "vcc2",
1137         .of_match = of_match_ptr("DCDC_REG2"),
1138         .regulators_node = of_match_ptr("regulators"),
1139         .id = RK817_ID_DCDC2,
1140         .ops = &rk817_buck_ops_range,
1141         .type = REGULATOR_VOLTAGE,
1142         .n_voltages = RK817_BUCK1_SEL_CNT + 1,
1143         .linear_ranges = rk817_buck1_voltage_ranges,
1144         .n_linear_ranges = ARRAY_SIZE(rk817_buck1_voltage_ranges),
1145         .vsel_reg = RK817_BUCK2_ON_VSEL_REG,
1146         .vsel_mask = RK817_BUCK_VSEL_MASK,
1147         .enable_reg = RK817_POWER_EN_REG(0),
1148         .enable_mask = ENABLE_MASK(RK817_ID_DCDC2),
1149         .enable_val = BIT(RK817_ID_DCDC2),
1150         .disable_val = DISABLE_VAL(RK817_ID_DCDC2),
1151         .of_map_mode = rk8xx_regulator_of_map_mode,
1152         .owner = THIS_MODULE,
1153     },
1154     {
1155         .name = "DCDC_REG3",
1156         .supply_name = "vcc3",
1157         .of_match = of_match_ptr("DCDC_REG3"),
1158         .regulators_node = of_match_ptr("regulators"),
1159         .id = RK817_ID_DCDC3,
1160         .ops = &rk817_buck_ops_range,
1161         .type = REGULATOR_VOLTAGE,
1162         .n_voltages = RK817_BUCK1_SEL_CNT + 1,
1163         .linear_ranges = rk817_buck1_voltage_ranges,
1164         .n_linear_ranges = ARRAY_SIZE(rk817_buck1_voltage_ranges),
1165         .vsel_reg = RK817_BUCK3_ON_VSEL_REG,
1166         .vsel_mask = RK817_BUCK_VSEL_MASK,
1167         .enable_reg = RK817_POWER_EN_REG(0),
1168         .enable_mask = ENABLE_MASK(RK817_ID_DCDC3),
1169         .enable_val = BIT(RK817_ID_DCDC3),
1170         .disable_val = DISABLE_VAL(RK817_ID_DCDC3),
1171         .of_map_mode = rk8xx_regulator_of_map_mode,
1172         .owner = THIS_MODULE,
1173     },
1174     {
1175         .name = "DCDC_REG4",
1176         .supply_name = "vcc4",
1177         .of_match = of_match_ptr("DCDC_REG4"),
1178         .regulators_node = of_match_ptr("regulators"),
1179         .id = RK817_ID_DCDC4,
1180         .ops = &rk817_buck_ops_range,
1181         .type = REGULATOR_VOLTAGE,
1182         .n_voltages = RK817_BUCK3_SEL_CNT + 1,
1183         .linear_ranges = rk817_buck3_voltage_ranges,
1184         .n_linear_ranges = ARRAY_SIZE(rk817_buck3_voltage_ranges),
1185         .vsel_reg = RK817_BUCK4_ON_VSEL_REG,
1186         .vsel_mask = RK817_BUCK_VSEL_MASK,
1187         .enable_reg = RK817_POWER_EN_REG(0),
1188         .enable_mask = ENABLE_MASK(RK817_ID_DCDC4),
1189         .enable_val = BIT(RK817_ID_DCDC4),
1190         .disable_val = DISABLE_VAL(RK817_ID_DCDC4),
1191         .of_map_mode = rk8xx_regulator_of_map_mode,
1192         .owner = THIS_MODULE,
1193     },
1194     {
1195         .name = "DCDC_REG5",
1196         .supply_name = "vcc9",
1197         .of_match = of_match_ptr("DCDC_REG5"),
1198         .regulators_node = of_match_ptr("regulators"),
1199         .id = RK809_ID_DCDC5,
1200         .ops = &rk809_buck5_ops_range,
1201         .type = REGULATOR_VOLTAGE,
1202         .n_voltages = RK809_BUCK5_SEL_CNT,
1203         .linear_ranges = rk809_buck5_voltage_ranges,
1204         .n_linear_ranges = ARRAY_SIZE(rk809_buck5_voltage_ranges),
1205         .vsel_reg = RK809_BUCK5_CONFIG(0),
1206         .vsel_mask = RK809_BUCK5_VSEL_MASK,
1207         .enable_reg = RK817_POWER_EN_REG(3),
1208         .enable_mask = ENABLE_MASK(1),
1209         .enable_val = BIT(1),
1210         .disable_val = DISABLE_VAL(1),
1211         .of_map_mode = rk8xx_regulator_of_map_mode,
1212         .owner = THIS_MODULE,
1213     },
1214     RK817_DESC(RK817_ID_LDO1, "LDO_REG1", "vcc5", 600, 3400, 25, RK817_LDO_ON_VSEL_REG(0), RK817_LDO_VSEL_MASK,
1215                RK817_POWER_EN_REG(1), ENABLE_MASK(0), BIT(0), DISABLE_VAL(0), 400),
1216     RK817_DESC(RK817_ID_LDO2, "LDO_REG2", "vcc5", 600, 3400, 25, RK817_LDO_ON_VSEL_REG(1), RK817_LDO_VSEL_MASK,
1217                RK817_POWER_EN_REG(1), ENABLE_MASK(1), BIT(1), DISABLE_VAL(1), 400),
1218     RK817_DESC(RK817_ID_LDO3, "LDO_REG3", "vcc5", 600, 3400, 25, RK817_LDO_ON_VSEL_REG(2), RK817_LDO_VSEL_MASK,
1219                RK817_POWER_EN_REG(1), ENABLE_MASK(2), BIT(2), DISABLE_VAL(2), 400),
1220     RK817_DESC(RK817_ID_LDO4, "LDO_REG4", "vcc6", 600, 3400, 25, RK817_LDO_ON_VSEL_REG(3), RK817_LDO_VSEL_MASK,
1221                RK817_POWER_EN_REG(1), ENABLE_MASK(3), BIT(3), DISABLE_VAL(3), 400),
1222     RK817_DESC(RK817_ID_LDO5, "LDO_REG5", "vcc6", 600, 3400, 25, RK817_LDO_ON_VSEL_REG(4), RK817_LDO_VSEL_MASK,
1223                RK817_POWER_EN_REG(2), ENABLE_MASK(0), BIT(0), DISABLE_VAL(0), 400),
1224     RK817_DESC(RK817_ID_LDO6, "LDO_REG6", "vcc6", 600, 3400, 25, RK817_LDO_ON_VSEL_REG(5), RK817_LDO_VSEL_MASK,
1225                RK817_POWER_EN_REG(2), ENABLE_MASK(1), BIT(1), DISABLE_VAL(1), 400),
1226     RK817_DESC(RK817_ID_LDO7, "LDO_REG7", "vcc7", 600, 3400, 25, RK817_LDO_ON_VSEL_REG(6), RK817_LDO_VSEL_MASK,
1227                RK817_POWER_EN_REG(2), ENABLE_MASK(2), BIT(2), DISABLE_VAL(2), 400),
1228     RK817_DESC(RK817_ID_LDO8, "LDO_REG8", "vcc7", 600, 3400, 25, RK817_LDO_ON_VSEL_REG(7), RK817_LDO_VSEL_MASK,
1229                RK817_POWER_EN_REG(2), ENABLE_MASK(3), BIT(3), DISABLE_VAL(3), 400),
1230     RK817_DESC(RK817_ID_LDO9, "LDO_REG9", "vcc7", 600, 3400, 25, RK817_LDO_ON_VSEL_REG(8), RK817_LDO_VSEL_MASK,
1231                RK817_POWER_EN_REG(3), ENABLE_MASK(0), BIT(0), DISABLE_VAL(0), 400),
1232     RK817_DESC_SWITCH(RK809_ID_SW1, "SWITCH_REG1", "vcc9", RK817_POWER_EN_REG(3), ENABLE_MASK(2), BIT(2),
1233                       DISABLE_VAL(2)),
1234     RK817_DESC_SWITCH(RK809_ID_SW2, "SWITCH_REG2", "vcc8", RK817_POWER_EN_REG(3), ENABLE_MASK(3), BIT(3),
1235                       DISABLE_VAL(3)),
1236 };
1237 
1238 static const struct regulator_desc rk817_reg[] = {
1239     {
1240         .name = "DCDC_REG1",
1241         .supply_name = "vcc1",
1242         .of_match = of_match_ptr("DCDC_REG1"),
1243         .regulators_node = of_match_ptr("regulators"),
1244         .id = RK817_ID_DCDC1,
1245         .ops = &rk817_buck_ops_range,
1246         .type = REGULATOR_VOLTAGE,
1247         .n_voltages = RK817_BUCK1_SEL_CNT + 1,
1248         .linear_ranges = rk817_buck1_voltage_ranges,
1249         .n_linear_ranges = ARRAY_SIZE(rk817_buck1_voltage_ranges),
1250         .vsel_reg = RK817_BUCK1_ON_VSEL_REG,
1251         .vsel_mask = RK817_BUCK_VSEL_MASK,
1252         .enable_reg = RK817_POWER_EN_REG(0),
1253         .enable_mask = ENABLE_MASK(RK817_ID_DCDC1),
1254         .enable_val = ENABLE_MASK(RK817_ID_DCDC1),
1255         .disable_val = DISABLE_VAL(RK817_ID_DCDC1),
1256         .of_map_mode = rk8xx_regulator_of_map_mode,
1257         .owner = THIS_MODULE,
1258     },
1259     {
1260         .name = "DCDC_REG2",
1261         .supply_name = "vcc2",
1262         .of_match = of_match_ptr("DCDC_REG2"),
1263         .regulators_node = of_match_ptr("regulators"),
1264         .id = RK817_ID_DCDC2,
1265         .ops = &rk817_buck_ops_range,
1266         .type = REGULATOR_VOLTAGE,
1267         .n_voltages = RK817_BUCK1_SEL_CNT + 1,
1268         .linear_ranges = rk817_buck1_voltage_ranges,
1269         .n_linear_ranges = ARRAY_SIZE(rk817_buck1_voltage_ranges),
1270         .vsel_reg = RK817_BUCK2_ON_VSEL_REG,
1271         .vsel_mask = RK817_BUCK_VSEL_MASK,
1272         .enable_reg = RK817_POWER_EN_REG(0),
1273         .enable_mask = ENABLE_MASK(RK817_ID_DCDC2),
1274         .enable_val = ENABLE_MASK(RK817_ID_DCDC2),
1275         .disable_val = DISABLE_VAL(RK817_ID_DCDC2),
1276         .of_map_mode = rk8xx_regulator_of_map_mode,
1277         .owner = THIS_MODULE,
1278     },
1279     {
1280         .name = "DCDC_REG3",
1281         .supply_name = "vcc3",
1282         .of_match = of_match_ptr("DCDC_REG3"),
1283         .regulators_node = of_match_ptr("regulators"),
1284         .id = RK817_ID_DCDC3,
1285         .ops = &rk817_buck_ops_range,
1286         .type = REGULATOR_VOLTAGE,
1287         .n_voltages = RK817_BUCK1_SEL_CNT + 1,
1288         .linear_ranges = rk817_buck1_voltage_ranges,
1289         .n_linear_ranges = ARRAY_SIZE(rk817_buck1_voltage_ranges),
1290         .vsel_reg = RK817_BUCK3_ON_VSEL_REG,
1291         .vsel_mask = RK817_BUCK_VSEL_MASK,
1292         .enable_reg = RK817_POWER_EN_REG(0),
1293         .enable_mask = ENABLE_MASK(RK817_ID_DCDC3),
1294         .enable_val = ENABLE_MASK(RK817_ID_DCDC3),
1295         .disable_val = DISABLE_VAL(RK817_ID_DCDC3),
1296         .of_map_mode = rk8xx_regulator_of_map_mode,
1297         .owner = THIS_MODULE,
1298     },
1299     {
1300         .name = "DCDC_REG4",
1301         .supply_name = "vcc4",
1302         .of_match = of_match_ptr("DCDC_REG4"),
1303         .regulators_node = of_match_ptr("regulators"),
1304         .id = RK817_ID_DCDC4,
1305         .ops = &rk817_buck_ops_range,
1306         .type = REGULATOR_VOLTAGE,
1307         .n_voltages = RK817_BUCK3_SEL_CNT + 1,
1308         .linear_ranges = rk817_buck3_voltage_ranges,
1309         .n_linear_ranges = ARRAY_SIZE(rk817_buck3_voltage_ranges),
1310         .vsel_reg = RK817_BUCK4_ON_VSEL_REG,
1311         .vsel_mask = RK817_BUCK_VSEL_MASK,
1312         .enable_reg = RK817_POWER_EN_REG(0),
1313         .enable_mask = ENABLE_MASK(RK817_ID_DCDC4),
1314         .enable_val = ENABLE_MASK(RK817_ID_DCDC4),
1315         .disable_val = DISABLE_VAL(RK817_ID_DCDC4),
1316         .of_map_mode = rk8xx_regulator_of_map_mode,
1317         .owner = THIS_MODULE,
1318     },
1319     RK817_DESC(RK817_ID_LDO1, "LDO_REG1", "vcc5", 600, 3400, 25, RK817_LDO_ON_VSEL_REG(0), RK817_LDO_VSEL_MASK,
1320                RK817_POWER_EN_REG(1), ENABLE_MASK(0), BIT(0), DISABLE_VAL(0), 400),
1321     RK817_DESC(RK817_ID_LDO2, "LDO_REG2", "vcc5", 600, 3400, 25, RK817_LDO_ON_VSEL_REG(1), RK817_LDO_VSEL_MASK,
1322                RK817_POWER_EN_REG(1), ENABLE_MASK(1), BIT(1), DISABLE_VAL(1), 400),
1323     RK817_DESC(RK817_ID_LDO3, "LDO_REG3", "vcc5", 600, 3400, 25, RK817_LDO_ON_VSEL_REG(2), RK817_LDO_VSEL_MASK,
1324                RK817_POWER_EN_REG(1), ENABLE_MASK(2), BIT(2), DISABLE_VAL(2), 400),
1325     RK817_DESC(RK817_ID_LDO4, "LDO_REG4", "vcc6", 600, 3400, 25, RK817_LDO_ON_VSEL_REG(3), RK817_LDO_VSEL_MASK,
1326                RK817_POWER_EN_REG(1), ENABLE_MASK(3), BIT(3), DISABLE_VAL(3), 400),
1327     RK817_DESC(RK817_ID_LDO5, "LDO_REG5", "vcc6", 600, 3400, 25, RK817_LDO_ON_VSEL_REG(4), RK817_LDO_VSEL_MASK,
1328                RK817_POWER_EN_REG(2), ENABLE_MASK(0), BIT(0), DISABLE_VAL(0), 400),
1329     RK817_DESC(RK817_ID_LDO6, "LDO_REG6", "vcc6", 600, 3400, 25, RK817_LDO_ON_VSEL_REG(5), RK817_LDO_VSEL_MASK,
1330                RK817_POWER_EN_REG(2), ENABLE_MASK(1), BIT(1), DISABLE_VAL(1), 400),
1331     RK817_DESC(RK817_ID_LDO7, "LDO_REG7", "vcc7", 600, 3400, 25, RK817_LDO_ON_VSEL_REG(6), RK817_LDO_VSEL_MASK,
1332                RK817_POWER_EN_REG(2), ENABLE_MASK(2), BIT(2), DISABLE_VAL(2), 400),
1333     RK817_DESC(RK817_ID_LDO8, "LDO_REG8", "vcc7", 600, 3400, 25, RK817_LDO_ON_VSEL_REG(7), RK817_LDO_VSEL_MASK,
1334                RK817_POWER_EN_REG(2), ENABLE_MASK(3), BIT(3), DISABLE_VAL(3), 400),
1335     RK817_DESC(RK817_ID_LDO9, "LDO_REG9", "vcc7", 600, 3400, 25, RK817_LDO_ON_VSEL_REG(8), RK817_LDO_VSEL_MASK,
1336                RK817_POWER_EN_REG(3), ENABLE_MASK(0), BIT(0), DISABLE_VAL(0), 400),
1337     RK817_BOOST_DESC(RK817_ID_BOOST, "BOOST", "vcc8", 4700, 5400, 100, RK817_BOOST_OTG_CFG, RK817_BOOST_VSEL_MASK,
1338                      RK817_POWER_EN_REG(3), ENABLE_MASK(1), BIT(1), DISABLE_VAL(1), 400, 3500 - 5400),
1339     RK817_DESC_SWITCH(RK817_ID_BOOST_OTG_SW, "OTG_SWITCH", "vcc9", RK817_POWER_EN_REG(3), ENABLE_MASK(2), BIT(2),
1340                       DISABLE_VAL(2)),
1341 };
1342 
1343 static const struct regulator_desc rk818_reg[] = {
1344     {
1345         .name = "DCDC_REG1",
1346         .supply_name = "vcc1",
1347         .of_match = of_match_ptr("DCDC_REG1"),
1348         .regulators_node = of_match_ptr("regulators"),
1349         .id = RK818_ID_DCDC1,
1350         .ops = &rk808_reg_ops,
1351         .type = REGULATOR_VOLTAGE,
1352         .min_uV = 712500,
1353         .uV_step = 12500,
1354         .n_voltages = 64,
1355         .vsel_reg = RK818_BUCK1_ON_VSEL_REG,
1356         .vsel_mask = RK818_BUCK_VSEL_MASK,
1357         .enable_reg = RK818_DCDC_EN_REG,
1358         .enable_mask = BIT(0),
1359         .owner = THIS_MODULE,
1360     },
1361     {
1362         .name = "DCDC_REG2",
1363         .supply_name = "vcc2",
1364         .of_match = of_match_ptr("DCDC_REG2"),
1365         .regulators_node = of_match_ptr("regulators"),
1366         .id = RK818_ID_DCDC2,
1367         .ops = &rk808_reg_ops,
1368         .type = REGULATOR_VOLTAGE,
1369         .min_uV = 712500,
1370         .uV_step = 12500,
1371         .n_voltages = 64,
1372         .vsel_reg = RK818_BUCK2_ON_VSEL_REG,
1373         .vsel_mask = RK818_BUCK_VSEL_MASK,
1374         .enable_reg = RK818_DCDC_EN_REG,
1375         .enable_mask = BIT(1),
1376         .owner = THIS_MODULE,
1377     },
1378     {
1379         .name = "DCDC_REG3",
1380         .supply_name = "vcc3",
1381         .of_match = of_match_ptr("DCDC_REG3"),
1382         .regulators_node = of_match_ptr("regulators"),
1383         .id = RK818_ID_DCDC3,
1384         .ops = &rk808_switch_ops,
1385         .type = REGULATOR_VOLTAGE,
1386         .n_voltages = 1,
1387         .enable_reg = RK818_DCDC_EN_REG,
1388         .enable_mask = BIT(2),
1389         .owner = THIS_MODULE,
1390     },
1391     RK8XX_DESC(RK818_ID_DCDC4, "DCDC_REG4", "vcc4", 1800, 3600, 100, RK818_BUCK4_ON_VSEL_REG, RK818_BUCK4_VSEL_MASK,
1392                RK818_DCDC_EN_REG, BIT(3), 0),
1393     RK8XX_DESC(RK818_ID_BOOST, "DCDC_BOOST", "boost", 4700, 5400, 100, RK818_BOOST_LDO9_ON_VSEL_REG,
1394                RK818_BOOST_ON_VSEL_MASK, RK818_DCDC_EN_REG, BIT(4), 0),
1395     RK8XX_DESC(RK818_ID_LDO1, "LDO_REG1", "vcc6", 1800, 3400, 100, RK818_LDO1_ON_VSEL_REG, RK818_LDO_VSEL_MASK,
1396                RK818_LDO_EN_REG, BIT(0), 400),
1397     RK8XX_DESC(RK818_ID_LDO2, "LDO_REG2", "vcc6", 1800, 3400, 100, RK818_LDO2_ON_VSEL_REG, RK818_LDO_VSEL_MASK,
1398                RK818_LDO_EN_REG, BIT(1), 400),
1399     {
1400         .name = "LDO_REG3",
1401         .supply_name = "vcc7",
1402         .of_match = of_match_ptr("LDO_REG3"),
1403         .regulators_node = of_match_ptr("regulators"),
1404         .id = RK818_ID_LDO3,
1405         .ops = &rk808_reg_ops_ranges,
1406         .type = REGULATOR_VOLTAGE,
1407         .n_voltages = 16,
1408         .linear_ranges = rk808_ldo3_voltage_ranges,
1409         .n_linear_ranges = ARRAY_SIZE(rk808_ldo3_voltage_ranges),
1410         .vsel_reg = RK818_LDO3_ON_VSEL_REG,
1411         .vsel_mask = RK818_LDO3_ON_VSEL_MASK,
1412         .enable_reg = RK818_LDO_EN_REG,
1413         .enable_mask = BIT(2),
1414         .enable_time = 400,
1415         .owner = THIS_MODULE,
1416     },
1417     RK8XX_DESC(RK818_ID_LDO4, "LDO_REG4", "vcc8", 1800, 3400, 100, RK818_LDO4_ON_VSEL_REG, RK818_LDO_VSEL_MASK,
1418                RK818_LDO_EN_REG, BIT(3), 400),
1419     RK8XX_DESC(RK818_ID_LDO5, "LDO_REG5", "vcc7", 1800, 3400, 100, RK818_LDO5_ON_VSEL_REG, RK818_LDO_VSEL_MASK,
1420                RK818_LDO_EN_REG, BIT(4), 400),
1421     RK8XX_DESC(RK818_ID_LDO6, "LDO_REG6", "vcc8", 800, 2500, 100, RK818_LDO6_ON_VSEL_REG, RK818_LDO_VSEL_MASK,
1422                RK818_LDO_EN_REG, BIT(5), 400),
1423     RK8XX_DESC(RK818_ID_LDO7, "LDO_REG7", "vcc7", 800, 2500, 100, RK818_LDO7_ON_VSEL_REG, RK818_LDO_VSEL_MASK,
1424                RK818_LDO_EN_REG, BIT(6), 400),
1425     RK8XX_DESC(RK818_ID_LDO8, "LDO_REG8", "vcc8", 1800, 3400, 100, RK818_LDO8_ON_VSEL_REG, RK818_LDO_VSEL_MASK,
1426                RK818_LDO_EN_REG, BIT(7), 400),
1427     RK8XX_DESC(RK818_ID_LDO9, "LDO_REG9", "vcc9", 1800, 3400, 100, RK818_BOOST_LDO9_ON_VSEL_REG, RK818_LDO_VSEL_MASK,
1428                RK818_DCDC_EN_REG, BIT(5), 400),
1429     RK8XX_DESC_SWITCH(RK818_ID_SWITCH, "SWITCH_REG", "vcc9", RK818_DCDC_EN_REG, BIT(6)),
1430     RK8XX_DESC_SWITCH(RK818_ID_HDMI_SWITCH, "HDMI_SWITCH", "h_5v", RK818_H5V_EN_REG, BIT(0)),
1431     RK8XX_DESC_SWITCH(RK818_ID_OTG_SWITCH, "OTG_SWITCH", "usb", RK818_DCDC_EN_REG, BIT(7)),
1432 };
1433 
rk808_regulator_dt_parse_pdata(struct device *dev, struct device *client_dev, struct regmap *map, struct rk808_regulator_data *pdata)1434 static int rk808_regulator_dt_parse_pdata(struct device *dev, struct device *client_dev, struct regmap *map,
1435                                           struct rk808_regulator_data *pdata)
1436 {
1437     struct device_node *np;
1438     int tmp, ret = 0, i;
1439 
1440     np = of_get_child_by_name(client_dev->of_node, "regulators");
1441     if (!np) {
1442         return -ENXIO;
1443     }
1444 
1445     for (i = 0; i < ARRAY_SIZE(pdata->dvs_gpio); i++) {
1446         pdata->dvs_gpio[i] = devm_gpiod_get_index_optional(client_dev, "dvs", i, GPIOD_OUT_LOW);
1447         if (IS_ERR(pdata->dvs_gpio[i])) {
1448             ret = PTR_ERR(pdata->dvs_gpio[i]);
1449             dev_err(dev, "failed to get dvs%d gpio (%d)\n", i, ret);
1450             goto dt_parse_end;
1451         }
1452 
1453         if (!pdata->dvs_gpio[i]) {
1454             dev_info(dev, "there is no dvs%d gpio\n", i);
1455             continue;
1456         }
1457 
1458         tmp = i ? RK808_DVS2_POL : RK808_DVS1_POL;
1459         ret = regmap_update_bits(map, RK808_IO_POL_REG, tmp, gpiod_is_active_low(pdata->dvs_gpio[i]) ? 0 : tmp);
1460     }
1461 
1462 dt_parse_end:
1463     of_node_put(np);
1464     return ret;
1465 }
1466 
rk808_regulator_probe(struct platform_device *pdev)1467 static int rk808_regulator_probe(struct platform_device *pdev)
1468 {
1469     struct rk808 *rk808 = dev_get_drvdata(pdev->dev.parent);
1470     struct i2c_client *client = rk808->i2c;
1471     struct regulator_config config = {};
1472     struct regulator_dev *rk808_rdev;
1473     struct rk808_regulator_data *pdata;
1474     const struct regulator_desc *regulators;
1475     int ret, i, nregulators;
1476 
1477     pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
1478     if (!pdata) {
1479         return -ENOMEM;
1480     }
1481 
1482     ret = rk808_regulator_dt_parse_pdata(&pdev->dev, &client->dev, rk808->regmap, pdata);
1483     if (ret < 0) {
1484         return ret;
1485     }
1486 
1487     platform_set_drvdata(pdev, pdata);
1488 
1489     switch (rk808->variant) {
1490         case RK805_ID:
1491             regulators = rk805_reg;
1492             nregulators = RK805_NUM_REGULATORS;
1493             break;
1494         case RK808_ID:
1495             regulators = rk808_reg;
1496             nregulators = RK808_NUM_REGULATORS;
1497             break;
1498         case RK809_ID:
1499             regulators = rk809_reg;
1500             nregulators = RK809_NUM_REGULATORS;
1501             break;
1502         case RK816_ID:
1503             regulators = rk816_reg;
1504             nregulators = RK816_NUM_REGULATORS;
1505             break;
1506         case RK817_ID:
1507             regulators = rk817_reg;
1508             nregulators = RK817_NUM_REGULATORS;
1509             break;
1510         case RK818_ID:
1511             regulators = rk818_reg;
1512             nregulators = RK818_NUM_REGULATORS;
1513             break;
1514         default:
1515             dev_err(&client->dev, "unsupported RK8XX ID %lu\n", rk808->variant);
1516             return -EINVAL;
1517     }
1518 
1519     config.dev = &client->dev;
1520     config.driver_data = pdata;
1521     config.regmap = rk808->regmap;
1522 
1523     /* Instantiate the regulators */
1524     for (i = 0; i < nregulators; i++) {
1525         rk808_rdev = devm_regulator_register(&pdev->dev, &regulators[i], &config);
1526         if (IS_ERR(rk808_rdev)) {
1527             dev_err(&client->dev, "failed to register %d regulator\n", i);
1528             return PTR_ERR(rk808_rdev);
1529         }
1530     }
1531 
1532     return 0;
1533 }
1534 
1535 static struct platform_driver rk808_regulator_driver = {
1536     .probe = rk808_regulator_probe,
1537     .driver = {.name = "rk808-regulator"},
1538 };
1539 
1540 #ifdef CONFIG_ROCKCHIP_THUNDER_BOOT
rk808_regulator_driver_init(void)1541 static int __init rk808_regulator_driver_init(void)
1542 {
1543     return platform_driver_register(&rk808_regulator_driver);
1544 }
1545 subsys_initcall(rk808_regulator_driver_init);
1546 
rk808_regulator_driver_exit(void)1547 static void __exit rk808_regulator_driver_exit(void)
1548 {
1549     platform_driver_unregister(&rk808_regulator_driver);
1550 }
1551 module_exit(rk808_regulator_driver_exit);
1552 #else
1553 module_platform_driver(rk808_regulator_driver);
1554 #endif
1555 
1556 MODULE_DESCRIPTION("regulator driver for the RK805/RK808/RK816/RK818 series PMICs");
1557 MODULE_AUTHOR("Tony xie <tony.xie@rock-chips.com>");
1558 MODULE_AUTHOR("Chris Zhong <zyw@rock-chips.com>");
1559 MODULE_AUTHOR("Zhang Qing <zhangqing@rock-chips.com>");
1560 MODULE_AUTHOR("Wadim Egorov <w.egorov@phytec.de>");
1561 MODULE_LICENSE("GPL");
1562 MODULE_ALIAS("platform:rk808-regulator");
1563