GNU Linux-libre 6.7.9-gnu
[releases.git] / drivers / regulator / rk808-regulator.c
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  * Copyright (c) 2021 Rockchip Electronics Co., Ltd.
7  *
8  * Author: Chris Zhong <zyw@rock-chips.com>
9  * Author: Zhang Qing <zhangqing@rock-chips.com>
10  * Author: Xu Shengfei <xsf@rock-chips.com>
11  *
12  * Copyright (C) 2016 PHYTEC Messtechnik GmbH
13  *
14  * Author: Wadim Egorov <w.egorov@phytec.de>
15  */
16
17 #include <linux/delay.h>
18 #include <linux/module.h>
19 #include <linux/of.h>
20 #include <linux/mfd/rk808.h>
21 #include <linux/platform_device.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 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
42
43 #define RK806_DCDC_SLP_REG_OFFSET       0x0A
44 #define RK806_NLDO_SLP_REG_OFFSET       0x05
45 #define RK806_PLDO_SLP_REG_OFFSET       0x06
46
47 #define RK806_BUCK_SEL_CNT              0xff
48 #define RK806_LDO_SEL_CNT               0xff
49
50 /* Ramp rate definitions for buck1 / buck2 only */
51 #define RK808_RAMP_RATE_OFFSET          3
52 #define RK808_RAMP_RATE_MASK            (3 << RK808_RAMP_RATE_OFFSET)
53 #define RK808_RAMP_RATE_2MV_PER_US      (0 << RK808_RAMP_RATE_OFFSET)
54 #define RK808_RAMP_RATE_4MV_PER_US      (1 << RK808_RAMP_RATE_OFFSET)
55 #define RK808_RAMP_RATE_6MV_PER_US      (2 << RK808_RAMP_RATE_OFFSET)
56 #define RK808_RAMP_RATE_10MV_PER_US     (3 << RK808_RAMP_RATE_OFFSET)
57
58 #define RK808_DVS2_POL          BIT(2)
59 #define RK808_DVS1_POL          BIT(1)
60
61 /* Offset from XXX_ON_VSEL to XXX_SLP_VSEL */
62 #define RK808_SLP_REG_OFFSET 1
63
64 /* Offset from XXX_ON_VSEL to XXX_DVS_VSEL */
65 #define RK808_DVS_REG_OFFSET 2
66
67 /* Offset from XXX_EN_REG to SLEEP_SET_OFF_XXX */
68 #define RK808_SLP_SET_OFF_REG_OFFSET 2
69
70 /* max steps for increase voltage of Buck1/2, equal 100mv*/
71 #define MAX_STEPS_ONE_TIME 8
72
73 #define ENABLE_MASK(id)                 (BIT(id) | BIT(4 + (id)))
74 #define DISABLE_VAL(id)                 (BIT(4 + (id)))
75
76 #define RK817_BOOST_DESC(_id, _match, _supply, _min, _max, _step, _vreg,\
77         _vmask, _ereg, _emask, _enval, _disval, _etime, m_drop)         \
78         {                                                       \
79                 .name           = (_match),                             \
80                 .supply_name    = (_supply),                            \
81                 .of_match       = of_match_ptr(_match),                 \
82                 .regulators_node = of_match_ptr("regulators"),          \
83                 .type           = REGULATOR_VOLTAGE,                    \
84                 .id             = (_id),                                \
85                 .n_voltages     = (((_max) - (_min)) / (_step) + 1),    \
86                 .owner          = THIS_MODULE,                          \
87                 .min_uV         = (_min) * 1000,                        \
88                 .uV_step        = (_step) * 1000,                       \
89                 .vsel_reg       = (_vreg),                              \
90                 .vsel_mask      = (_vmask),                             \
91                 .enable_reg     = (_ereg),                              \
92                 .enable_mask    = (_emask),                             \
93                 .enable_val     = (_enval),                             \
94                 .disable_val     = (_disval),                           \
95                 .enable_time    = (_etime),                             \
96                 .min_dropout_uV = (m_drop) * 1000,                      \
97                 .ops            = &rk817_boost_ops,                     \
98         }
99
100 #define RK8XX_DESC_COM(_id, _match, _supply, _min, _max, _step, _vreg,  \
101         _vmask, _ereg, _emask, _enval, _disval, _etime, _ops)           \
102         {                                                               \
103                 .name           = (_match),                             \
104                 .supply_name    = (_supply),                            \
105                 .of_match       = of_match_ptr(_match),                 \
106                 .regulators_node = of_match_ptr("regulators"),          \
107                 .type           = REGULATOR_VOLTAGE,                    \
108                 .id             = (_id),                                \
109                 .n_voltages     = (((_max) - (_min)) / (_step) + 1),    \
110                 .owner          = THIS_MODULE,                          \
111                 .min_uV         = (_min) * 1000,                        \
112                 .uV_step        = (_step) * 1000,                       \
113                 .vsel_reg       = (_vreg),                              \
114                 .vsel_mask      = (_vmask),                             \
115                 .enable_reg     = (_ereg),                              \
116                 .enable_mask    = (_emask),                             \
117                 .enable_val     = (_enval),                             \
118                 .disable_val     = (_disval),                           \
119                 .enable_time    = (_etime),                             \
120                 .ops            = _ops,                 \
121         }
122
123 #define RK805_DESC(_id, _match, _supply, _min, _max, _step, _vreg,      \
124         _vmask, _ereg, _emask, _etime)                                  \
125         RK8XX_DESC_COM(_id, _match, _supply, _min, _max, _step, _vreg,  \
126         _vmask, _ereg, _emask, 0, 0, _etime, &rk805_reg_ops)
127
128 #define RK806_REGULATOR(_name, _supply_name, _id, _ops,\
129                         _n_voltages, _vr, _er, _lr, ctrl_bit,\
130                         _rr, _rm, _rt)\
131 [_id] = {\
132                 .name = _name,\
133                 .supply_name = _supply_name,\
134                 .of_match = of_match_ptr(_name),\
135                 .regulators_node = of_match_ptr("regulators"),\
136                 .id = _id,\
137                 .ops = &_ops,\
138                 .type = REGULATOR_VOLTAGE,\
139                 .n_voltages = _n_voltages,\
140                 .linear_ranges = _lr,\
141                 .n_linear_ranges = ARRAY_SIZE(_lr),\
142                 .vsel_reg = _vr,\
143                 .vsel_mask = 0xff,\
144                 .enable_reg = _er,\
145                 .enable_mask = ENABLE_MASK(ctrl_bit),\
146                 .enable_val = ENABLE_MASK(ctrl_bit),\
147                 .disable_val = DISABLE_VAL(ctrl_bit),\
148                 .of_map_mode = rk8xx_regulator_of_map_mode,\
149                 .ramp_reg = _rr,\
150                 .ramp_mask = _rm,\
151                 .ramp_delay_table = _rt, \
152                 .n_ramp_values = ARRAY_SIZE(_rt), \
153                 .owner = THIS_MODULE,\
154         }
155
156 #define RK8XX_DESC(_id, _match, _supply, _min, _max, _step, _vreg,      \
157         _vmask, _ereg, _emask, _etime)                                  \
158         RK8XX_DESC_COM(_id, _match, _supply, _min, _max, _step, _vreg,  \
159         _vmask, _ereg, _emask, 0, 0, _etime, &rk808_reg_ops)
160
161 #define RK817_DESC(_id, _match, _supply, _min, _max, _step, _vreg,      \
162         _vmask, _ereg, _emask, _disval, _etime)                         \
163         RK8XX_DESC_COM(_id, _match, _supply, _min, _max, _step, _vreg,  \
164         _vmask, _ereg, _emask, _emask, _disval, _etime, &rk817_reg_ops)
165
166 #define RKXX_DESC_SWITCH_COM(_id, _match, _supply, _ereg, _emask,       \
167         _enval, _disval, _ops)                                          \
168         {                                                               \
169                 .name           = (_match),                             \
170                 .supply_name    = (_supply),                            \
171                 .of_match       = of_match_ptr(_match),                 \
172                 .regulators_node = of_match_ptr("regulators"),          \
173                 .type           = REGULATOR_VOLTAGE,                    \
174                 .id             = (_id),                                \
175                 .enable_reg     = (_ereg),                              \
176                 .enable_mask    = (_emask),                             \
177                 .enable_val     = (_enval),                             \
178                 .disable_val     = (_disval),                           \
179                 .owner          = THIS_MODULE,                          \
180                 .ops            = _ops                                  \
181         }
182
183 #define RK817_DESC_SWITCH(_id, _match, _supply, _ereg, _emask,          \
184         _disval)                                                        \
185         RKXX_DESC_SWITCH_COM(_id, _match, _supply, _ereg, _emask,       \
186         _emask, _disval, &rk817_switch_ops)
187
188 #define RK8XX_DESC_SWITCH(_id, _match, _supply, _ereg, _emask)          \
189         RKXX_DESC_SWITCH_COM(_id, _match, _supply, _ereg, _emask,       \
190         0, 0, &rk808_switch_ops)
191
192 struct rk8xx_register_bit {
193         u8 reg;
194         u8 bit;
195 };
196
197 #define RK8XX_REG_BIT(_reg, _bit)                                       \
198         {                                                               \
199                 .reg = _reg,                                            \
200                 .bit = BIT(_bit),                                               \
201         }
202
203 struct rk808_regulator_data {
204         struct gpio_desc *dvs_gpio[2];
205 };
206
207 static const struct linear_range rk808_ldo3_voltage_ranges[] = {
208         REGULATOR_LINEAR_RANGE(800000, 0, 13, 100000),
209         REGULATOR_LINEAR_RANGE(2500000, 15, 15, 0),
210 };
211
212 #define RK809_BUCK5_SEL_CNT             (8)
213
214 static const struct linear_range rk809_buck5_voltage_ranges[] = {
215         REGULATOR_LINEAR_RANGE(1500000, 0, 0, 0),
216         REGULATOR_LINEAR_RANGE(1800000, 1, 3, 200000),
217         REGULATOR_LINEAR_RANGE(2800000, 4, 5, 200000),
218         REGULATOR_LINEAR_RANGE(3300000, 6, 7, 300000),
219 };
220
221 #define RK817_BUCK1_MIN0 500000
222 #define RK817_BUCK1_MAX0 1500000
223
224 #define RK817_BUCK1_MIN1 1600000
225 #define RK817_BUCK1_MAX1 2400000
226
227 #define RK817_BUCK3_MAX1 3400000
228
229 #define RK817_BUCK1_STP0 12500
230 #define RK817_BUCK1_STP1 100000
231
232 #define RK817_BUCK1_SEL0 ((RK817_BUCK1_MAX0 - RK817_BUCK1_MIN0) /\
233                                                   RK817_BUCK1_STP0)
234 #define RK817_BUCK1_SEL1 ((RK817_BUCK1_MAX1 - RK817_BUCK1_MIN1) /\
235                                                   RK817_BUCK1_STP1)
236
237 #define RK817_BUCK3_SEL1 ((RK817_BUCK3_MAX1 - RK817_BUCK1_MIN1) /\
238                                                   RK817_BUCK1_STP1)
239
240 #define RK817_BUCK1_SEL_CNT (RK817_BUCK1_SEL0 + RK817_BUCK1_SEL1 + 1)
241 #define RK817_BUCK3_SEL_CNT (RK817_BUCK1_SEL0 + RK817_BUCK3_SEL1 + 1)
242
243 static const struct linear_range rk817_buck1_voltage_ranges[] = {
244         REGULATOR_LINEAR_RANGE(RK817_BUCK1_MIN0, 0,
245                                RK817_BUCK1_SEL0, RK817_BUCK1_STP0),
246         REGULATOR_LINEAR_RANGE(RK817_BUCK1_MIN1, RK817_BUCK1_SEL0 + 1,
247                                RK817_BUCK1_SEL_CNT, RK817_BUCK1_STP1),
248 };
249
250 static const struct linear_range rk817_buck3_voltage_ranges[] = {
251         REGULATOR_LINEAR_RANGE(RK817_BUCK1_MIN0, 0,
252                                RK817_BUCK1_SEL0, RK817_BUCK1_STP0),
253         REGULATOR_LINEAR_RANGE(RK817_BUCK1_MIN1, RK817_BUCK1_SEL0 + 1,
254                                RK817_BUCK3_SEL_CNT, RK817_BUCK1_STP1),
255 };
256
257 static const unsigned int rk808_buck1_2_ramp_table[] = {
258         2000, 4000, 6000, 10000
259 };
260
261 /* RK817 RK809 */
262 static const unsigned int rk817_buck1_4_ramp_table[] = {
263         3000, 6300, 12500, 25000
264 };
265
266 static int rk806_set_mode_dcdc(struct regulator_dev *rdev, unsigned int mode)
267 {
268         int rid = rdev_get_id(rdev);
269         int ctr_bit, reg;
270
271         reg = RK806_POWER_FPWM_EN0 + rid / 8;
272         ctr_bit = rid % 8;
273
274         switch (mode) {
275         case REGULATOR_MODE_FAST:
276                 return regmap_update_bits(rdev->regmap, reg,
277                                           PWM_MODE_MSK << ctr_bit,
278                                           FPWM_MODE << ctr_bit);
279         case REGULATOR_MODE_NORMAL:
280                 return regmap_update_bits(rdev->regmap, reg,
281                                           PWM_MODE_MSK << ctr_bit,
282                                           AUTO_PWM_MODE << ctr_bit);
283         default:
284                 dev_err(rdev_get_dev(rdev), "mode unsupported: %u\n", mode);
285                 return -EINVAL;
286         }
287
288         return 0;
289 }
290
291 static unsigned int rk806_get_mode_dcdc(struct regulator_dev *rdev)
292 {
293         int rid = rdev_get_id(rdev);
294         int ctr_bit, reg;
295         unsigned int val;
296         int err;
297
298         reg = RK806_POWER_FPWM_EN0 + rid / 8;
299         ctr_bit = rid % 8;
300
301         err = regmap_read(rdev->regmap, reg, &val);
302         if (err)
303                 return err;
304
305         if ((val >> ctr_bit) & FPWM_MODE)
306                 return REGULATOR_MODE_FAST;
307         else
308                 return REGULATOR_MODE_NORMAL;
309 }
310
311 static const struct rk8xx_register_bit rk806_dcdc_rate2[] = {
312         RK8XX_REG_BIT(0xEB, 0),
313         RK8XX_REG_BIT(0xEB, 1),
314         RK8XX_REG_BIT(0xEB, 2),
315         RK8XX_REG_BIT(0xEB, 3),
316         RK8XX_REG_BIT(0xEB, 4),
317         RK8XX_REG_BIT(0xEB, 5),
318         RK8XX_REG_BIT(0xEB, 6),
319         RK8XX_REG_BIT(0xEB, 7),
320         RK8XX_REG_BIT(0xEA, 0),
321         RK8XX_REG_BIT(0xEA, 1),
322 };
323
324 static const unsigned int rk806_ramp_delay_table_dcdc[] = {
325         50000, 25000, 12500, 6250, 3125, 1560, 961, 390
326 };
327
328 static int rk806_set_ramp_delay_dcdc(struct regulator_dev *rdev, int ramp_delay)
329 {
330         int rid = rdev_get_id(rdev);
331         int regval, ramp_value, ret;
332
333         ret = regulator_find_closest_bigger(ramp_delay, rdev->desc->ramp_delay_table,
334                                             rdev->desc->n_ramp_values, &ramp_value);
335         if (ret) {
336                 dev_warn(rdev_get_dev(rdev),
337                          "Can't set ramp-delay %u, setting %u\n", ramp_delay,
338                          rdev->desc->ramp_delay_table[ramp_value]);
339         }
340
341         regval = ramp_value << (ffs(rdev->desc->ramp_mask) - 1);
342
343         ret = regmap_update_bits(rdev->regmap, rdev->desc->ramp_reg,
344                                  rdev->desc->ramp_mask, regval);
345         if (ret)
346                 return ret;
347
348         /*
349          * The above is effectively a copy of regulator_set_ramp_delay_regmap(),
350          * but that only stores the lower 2 bits for rk806 DCDC ramp. The MSB must
351          * be stored in a separate register, so this open codes the implementation
352          * to have access to the ramp_value.
353          */
354
355         regval = (ramp_value >> 2) & 0x1 ? rk806_dcdc_rate2[rid].bit : 0;
356         return regmap_update_bits(rdev->regmap, rk806_dcdc_rate2[rid].reg,
357                                   rk806_dcdc_rate2[rid].bit,
358                                   regval);
359 }
360
361 static const unsigned int rk806_ramp_delay_table_ldo[] = {
362         100000, 50000, 25000, 12500, 6280, 3120, 1900, 780
363 };
364
365 static int rk806_set_suspend_voltage_range(struct regulator_dev *rdev, int reg_offset, int uv)
366 {
367         int sel = regulator_map_voltage_linear_range(rdev, uv, uv);
368         unsigned int reg;
369
370         if (sel < 0)
371                 return -EINVAL;
372
373         reg = rdev->desc->vsel_reg + reg_offset;
374
375         return regmap_update_bits(rdev->regmap, reg, rdev->desc->vsel_mask, sel);
376 }
377
378 static int rk806_set_suspend_voltage_range_dcdc(struct regulator_dev *rdev, int uv)
379 {
380         return rk806_set_suspend_voltage_range(rdev, RK806_DCDC_SLP_REG_OFFSET, uv);
381 }
382
383 static int rk806_set_suspend_voltage_range_nldo(struct regulator_dev *rdev, int uv)
384 {
385         return rk806_set_suspend_voltage_range(rdev, RK806_NLDO_SLP_REG_OFFSET, uv);
386 }
387
388 static int rk806_set_suspend_voltage_range_pldo(struct regulator_dev *rdev, int uv)
389 {
390         return rk806_set_suspend_voltage_range(rdev, RK806_PLDO_SLP_REG_OFFSET, uv);
391 }
392
393 static int rk808_buck1_2_get_voltage_sel_regmap(struct regulator_dev *rdev)
394 {
395         struct rk808_regulator_data *pdata = rdev_get_drvdata(rdev);
396         int id = rdev_get_id(rdev);
397         struct gpio_desc *gpio = pdata->dvs_gpio[id];
398         unsigned int val;
399         int ret;
400
401         if (!gpio || gpiod_get_value(gpio) == 0)
402                 return regulator_get_voltage_sel_regmap(rdev);
403
404         ret = regmap_read(rdev->regmap,
405                           rdev->desc->vsel_reg + RK808_DVS_REG_OFFSET,
406                           &val);
407         if (ret != 0)
408                 return ret;
409
410         val &= rdev->desc->vsel_mask;
411         val >>= ffs(rdev->desc->vsel_mask) - 1;
412
413         return val;
414 }
415
416 static int rk808_buck1_2_i2c_set_voltage_sel(struct regulator_dev *rdev,
417                                              unsigned sel)
418 {
419         int ret, delta_sel;
420         unsigned int old_sel, tmp, val, mask = rdev->desc->vsel_mask;
421
422         ret = regmap_read(rdev->regmap, rdev->desc->vsel_reg, &val);
423         if (ret != 0)
424                 return ret;
425
426         tmp = val & ~mask;
427         old_sel = val & mask;
428         old_sel >>= ffs(mask) - 1;
429         delta_sel = sel - old_sel;
430
431         /*
432          * If directly modify the register to change the voltage, we will face
433          * the risk of overshoot. Put it into a multi-step, can effectively
434          * avoid this problem, a step is 100mv here.
435          */
436         while (delta_sel > MAX_STEPS_ONE_TIME) {
437                 old_sel += MAX_STEPS_ONE_TIME;
438                 val = old_sel << (ffs(mask) - 1);
439                 val |= tmp;
440
441                 /*
442                  * i2c is 400kHz (2.5us per bit) and we must transmit _at least_
443                  * 3 bytes (24 bits) plus start and stop so 26 bits.  So we've
444                  * got more than 65 us between each voltage change and thus
445                  * won't ramp faster than ~1500 uV / us.
446                  */
447                 ret = regmap_write(rdev->regmap, rdev->desc->vsel_reg, val);
448                 delta_sel = sel - old_sel;
449         }
450
451         sel <<= ffs(mask) - 1;
452         val = tmp | sel;
453         ret = regmap_write(rdev->regmap, rdev->desc->vsel_reg, val);
454
455         /*
456          * When we change the voltage register directly, the ramp rate is about
457          * 100000uv/us, wait 1us to make sure the target voltage to be stable,
458          * so we needn't wait extra time after that.
459          */
460         udelay(1);
461
462         return ret;
463 }
464
465 static int rk808_buck1_2_set_voltage_sel(struct regulator_dev *rdev,
466                                          unsigned sel)
467 {
468         struct rk808_regulator_data *pdata = rdev_get_drvdata(rdev);
469         int id = rdev_get_id(rdev);
470         struct gpio_desc *gpio = pdata->dvs_gpio[id];
471         unsigned int reg = rdev->desc->vsel_reg;
472         unsigned old_sel;
473         int ret, gpio_level;
474
475         if (!gpio)
476                 return rk808_buck1_2_i2c_set_voltage_sel(rdev, sel);
477
478         gpio_level = gpiod_get_value(gpio);
479         if (gpio_level == 0) {
480                 reg += RK808_DVS_REG_OFFSET;
481                 ret = regmap_read(rdev->regmap, rdev->desc->vsel_reg, &old_sel);
482         } else {
483                 ret = regmap_read(rdev->regmap,
484                                   reg + RK808_DVS_REG_OFFSET,
485                                   &old_sel);
486         }
487
488         if (ret != 0)
489                 return ret;
490
491         sel <<= ffs(rdev->desc->vsel_mask) - 1;
492         sel |= old_sel & ~rdev->desc->vsel_mask;
493
494         ret = regmap_write(rdev->regmap, reg, sel);
495         if (ret)
496                 return ret;
497
498         gpiod_set_value(gpio, !gpio_level);
499
500         return ret;
501 }
502
503 static int rk808_buck1_2_set_voltage_time_sel(struct regulator_dev *rdev,
504                                        unsigned int old_selector,
505                                        unsigned int new_selector)
506 {
507         struct rk808_regulator_data *pdata = rdev_get_drvdata(rdev);
508         int id = rdev_get_id(rdev);
509         struct gpio_desc *gpio = pdata->dvs_gpio[id];
510
511         /* if there is no dvs1/2 pin, we don't need wait extra time here. */
512         if (!gpio)
513                 return 0;
514
515         return regulator_set_voltage_time_sel(rdev, old_selector, new_selector);
516 }
517
518 static int rk808_set_suspend_voltage(struct regulator_dev *rdev, int uv)
519 {
520         unsigned int reg;
521         int sel = regulator_map_voltage_linear(rdev, uv, uv);
522
523         if (sel < 0)
524                 return -EINVAL;
525
526         reg = rdev->desc->vsel_reg + RK808_SLP_REG_OFFSET;
527
528         return regmap_update_bits(rdev->regmap, reg,
529                                   rdev->desc->vsel_mask,
530                                   sel);
531 }
532
533 static int rk808_set_suspend_voltage_range(struct regulator_dev *rdev, int uv)
534 {
535         unsigned int reg;
536         int sel = regulator_map_voltage_linear_range(rdev, uv, uv);
537
538         if (sel < 0)
539                 return -EINVAL;
540
541         reg = rdev->desc->vsel_reg + RK808_SLP_REG_OFFSET;
542
543         return regmap_update_bits(rdev->regmap, reg,
544                                   rdev->desc->vsel_mask,
545                                   sel);
546 }
547
548 static int rk805_set_suspend_enable(struct regulator_dev *rdev)
549 {
550         unsigned int reg;
551
552         reg = rdev->desc->enable_reg + RK808_SLP_SET_OFF_REG_OFFSET;
553
554         return regmap_update_bits(rdev->regmap, reg,
555                                   rdev->desc->enable_mask,
556                                   rdev->desc->enable_mask);
557 }
558
559 static int rk805_set_suspend_disable(struct regulator_dev *rdev)
560 {
561         unsigned int reg;
562
563         reg = rdev->desc->enable_reg + RK808_SLP_SET_OFF_REG_OFFSET;
564
565         return regmap_update_bits(rdev->regmap, reg,
566                                   rdev->desc->enable_mask,
567                                   0);
568 }
569
570 static const struct rk8xx_register_bit rk806_suspend_bits[] = {
571         RK8XX_REG_BIT(RK806_POWER_SLP_EN0, 0),
572         RK8XX_REG_BIT(RK806_POWER_SLP_EN0, 1),
573         RK8XX_REG_BIT(RK806_POWER_SLP_EN0, 2),
574         RK8XX_REG_BIT(RK806_POWER_SLP_EN0, 3),
575         RK8XX_REG_BIT(RK806_POWER_SLP_EN0, 4),
576         RK8XX_REG_BIT(RK806_POWER_SLP_EN0, 5),
577         RK8XX_REG_BIT(RK806_POWER_SLP_EN0, 6),
578         RK8XX_REG_BIT(RK806_POWER_SLP_EN0, 7),
579         RK8XX_REG_BIT(RK806_POWER_SLP_EN1, 6),
580         RK8XX_REG_BIT(RK806_POWER_SLP_EN1, 7),
581         RK8XX_REG_BIT(RK806_POWER_SLP_EN1, 0),
582         RK8XX_REG_BIT(RK806_POWER_SLP_EN1, 1),
583         RK8XX_REG_BIT(RK806_POWER_SLP_EN1, 2),
584         RK8XX_REG_BIT(RK806_POWER_SLP_EN1, 3),
585         RK8XX_REG_BIT(RK806_POWER_SLP_EN1, 4),
586         RK8XX_REG_BIT(RK806_POWER_SLP_EN2, 1),
587         RK8XX_REG_BIT(RK806_POWER_SLP_EN2, 2),
588         RK8XX_REG_BIT(RK806_POWER_SLP_EN2, 3),
589         RK8XX_REG_BIT(RK806_POWER_SLP_EN2, 4),
590         RK8XX_REG_BIT(RK806_POWER_SLP_EN2, 5),
591         RK8XX_REG_BIT(RK806_POWER_SLP_EN2, 0),
592 };
593
594 static int rk806_set_suspend_enable(struct regulator_dev *rdev)
595 {
596         int rid = rdev_get_id(rdev);
597
598         return regmap_update_bits(rdev->regmap, rk806_suspend_bits[rid].reg,
599                                   rk806_suspend_bits[rid].bit,
600                                   rk806_suspend_bits[rid].bit);
601 }
602
603 static int rk806_set_suspend_disable(struct regulator_dev *rdev)
604 {
605         int rid = rdev_get_id(rdev);
606
607         return regmap_update_bits(rdev->regmap, rk806_suspend_bits[rid].reg,
608                                   rk806_suspend_bits[rid].bit, 0);
609 }
610
611 static int rk808_set_suspend_enable(struct regulator_dev *rdev)
612 {
613         unsigned int reg;
614
615         reg = rdev->desc->enable_reg + RK808_SLP_SET_OFF_REG_OFFSET;
616
617         return regmap_update_bits(rdev->regmap, reg,
618                                   rdev->desc->enable_mask,
619                                   0);
620 }
621
622 static int rk808_set_suspend_disable(struct regulator_dev *rdev)
623 {
624         unsigned int reg;
625
626         reg = rdev->desc->enable_reg + RK808_SLP_SET_OFF_REG_OFFSET;
627
628         return regmap_update_bits(rdev->regmap, reg,
629                                   rdev->desc->enable_mask,
630                                   rdev->desc->enable_mask);
631 }
632
633 static int rk817_set_suspend_enable_ctrl(struct regulator_dev *rdev,
634                                          unsigned int en)
635 {
636         unsigned int reg;
637         int id = rdev_get_id(rdev);
638         unsigned int id_slp, msk, val;
639
640         if (id >= RK817_ID_DCDC1 && id <= RK817_ID_DCDC4)
641                 id_slp = id;
642         else if (id >= RK817_ID_LDO1 && id <= RK817_ID_LDO8)
643                 id_slp = 8 + (id - RK817_ID_LDO1);
644         else if (id >= RK817_ID_LDO9 && id <= RK809_ID_SW2)
645                 id_slp = 4 + (id - RK817_ID_LDO9);
646         else
647                 return -EINVAL;
648
649         reg = RK817_POWER_SLP_EN_REG(id_slp / 8);
650
651         msk = BIT(id_slp % 8);
652         if (en)
653                 val = msk;
654         else
655                 val = 0;
656
657         return regmap_update_bits(rdev->regmap, reg, msk, val);
658 }
659
660 static int rk817_set_suspend_enable(struct regulator_dev *rdev)
661 {
662         return rk817_set_suspend_enable_ctrl(rdev, 1);
663 }
664
665 static int rk817_set_suspend_disable(struct regulator_dev *rdev)
666 {
667         return rk817_set_suspend_enable_ctrl(rdev, 0);
668 }
669
670 static int rk8xx_set_suspend_mode(struct regulator_dev *rdev, unsigned int mode)
671 {
672         unsigned int reg;
673
674         reg = rdev->desc->vsel_reg + RK808_SLP_REG_OFFSET;
675
676         switch (mode) {
677         case REGULATOR_MODE_FAST:
678                 return regmap_update_bits(rdev->regmap, reg,
679                                           PWM_MODE_MSK, FPWM_MODE);
680         case REGULATOR_MODE_NORMAL:
681                 return regmap_update_bits(rdev->regmap, reg,
682                                           PWM_MODE_MSK, AUTO_PWM_MODE);
683         default:
684                 dev_err(&rdev->dev, "do not support this mode\n");
685                 return -EINVAL;
686         }
687
688         return 0;
689 }
690
691 static int rk8xx_set_mode(struct regulator_dev *rdev, unsigned int mode)
692 {
693         switch (mode) {
694         case REGULATOR_MODE_FAST:
695                 return regmap_update_bits(rdev->regmap, rdev->desc->vsel_reg,
696                                           PWM_MODE_MSK, FPWM_MODE);
697         case REGULATOR_MODE_NORMAL:
698                 return regmap_update_bits(rdev->regmap, rdev->desc->vsel_reg,
699                                           PWM_MODE_MSK, AUTO_PWM_MODE);
700         default:
701                 dev_err(&rdev->dev, "do not support this mode\n");
702                 return -EINVAL;
703         }
704
705         return 0;
706 }
707
708 static unsigned int rk8xx_get_mode(struct regulator_dev *rdev)
709 {
710         unsigned int val;
711         int err;
712
713         err = regmap_read(rdev->regmap, rdev->desc->vsel_reg, &val);
714         if (err)
715                 return err;
716
717         if (val & FPWM_MODE)
718                 return REGULATOR_MODE_FAST;
719         else
720                 return REGULATOR_MODE_NORMAL;
721 }
722
723 static int rk8xx_is_enabled_wmsk_regmap(struct regulator_dev *rdev)
724 {
725         unsigned int val;
726         int ret;
727
728         ret = regmap_read(rdev->regmap, rdev->desc->enable_reg, &val);
729         if (ret != 0)
730                 return ret;
731
732         /* add write mask bit */
733         val |= (rdev->desc->enable_mask & 0xf0);
734         val &= rdev->desc->enable_mask;
735
736         if (rdev->desc->enable_is_inverted) {
737                 if (rdev->desc->enable_val)
738                         return val != rdev->desc->enable_val;
739                 return (val == 0);
740         }
741         if (rdev->desc->enable_val)
742                 return val == rdev->desc->enable_val;
743         return val != 0;
744 }
745
746 static unsigned int rk8xx_regulator_of_map_mode(unsigned int mode)
747 {
748         switch (mode) {
749         case 1:
750                 return REGULATOR_MODE_FAST;
751         case 2:
752                 return REGULATOR_MODE_NORMAL;
753         default:
754                 return REGULATOR_MODE_INVALID;
755         }
756 }
757
758 static const struct regulator_ops rk805_reg_ops = {
759         .list_voltage           = regulator_list_voltage_linear,
760         .map_voltage            = regulator_map_voltage_linear,
761         .get_voltage_sel        = regulator_get_voltage_sel_regmap,
762         .set_voltage_sel        = regulator_set_voltage_sel_regmap,
763         .enable                 = regulator_enable_regmap,
764         .disable                = regulator_disable_regmap,
765         .is_enabled             = regulator_is_enabled_regmap,
766         .set_suspend_voltage    = rk808_set_suspend_voltage,
767         .set_suspend_enable     = rk805_set_suspend_enable,
768         .set_suspend_disable    = rk805_set_suspend_disable,
769 };
770
771 static const struct regulator_ops rk805_switch_ops = {
772         .enable                 = regulator_enable_regmap,
773         .disable                = regulator_disable_regmap,
774         .is_enabled             = regulator_is_enabled_regmap,
775         .set_suspend_enable     = rk805_set_suspend_enable,
776         .set_suspend_disable    = rk805_set_suspend_disable,
777 };
778
779 static const struct regulator_ops rk806_ops_dcdc = {
780         .list_voltage           = regulator_list_voltage_linear_range,
781         .map_voltage            = regulator_map_voltage_linear_range,
782         .get_voltage_sel        = regulator_get_voltage_sel_regmap,
783         .set_voltage_sel        = regulator_set_voltage_sel_regmap,
784         .set_voltage_time_sel   = regulator_set_voltage_time_sel,
785         .set_mode               = rk806_set_mode_dcdc,
786         .get_mode               = rk806_get_mode_dcdc,
787
788         .enable                 = regulator_enable_regmap,
789         .disable                = regulator_disable_regmap,
790         .is_enabled             = rk8xx_is_enabled_wmsk_regmap,
791
792         .set_suspend_mode       = rk806_set_mode_dcdc,
793         .set_ramp_delay         = rk806_set_ramp_delay_dcdc,
794
795         .set_suspend_voltage    = rk806_set_suspend_voltage_range_dcdc,
796         .set_suspend_enable     = rk806_set_suspend_enable,
797         .set_suspend_disable    = rk806_set_suspend_disable,
798 };
799
800 static const struct regulator_ops rk806_ops_nldo = {
801         .list_voltage           = regulator_list_voltage_linear_range,
802         .map_voltage            = regulator_map_voltage_linear_range,
803         .get_voltage_sel        = regulator_get_voltage_sel_regmap,
804         .set_voltage_sel        = regulator_set_voltage_sel_regmap,
805         .set_voltage_time_sel   = regulator_set_voltage_time_sel,
806
807         .enable                 = regulator_enable_regmap,
808         .disable                = regulator_disable_regmap,
809         .is_enabled             = regulator_is_enabled_regmap,
810
811         .set_ramp_delay         = regulator_set_ramp_delay_regmap,
812
813         .set_suspend_voltage    = rk806_set_suspend_voltage_range_nldo,
814         .set_suspend_enable     = rk806_set_suspend_enable,
815         .set_suspend_disable    = rk806_set_suspend_disable,
816 };
817
818 static const struct regulator_ops rk806_ops_pldo = {
819         .list_voltage           = regulator_list_voltage_linear_range,
820         .map_voltage            = regulator_map_voltage_linear_range,
821
822         .get_voltage_sel        = regulator_get_voltage_sel_regmap,
823         .set_voltage_sel        = regulator_set_voltage_sel_regmap,
824         .set_voltage_time_sel   = regulator_set_voltage_time_sel,
825
826         .enable                 = regulator_enable_regmap,
827         .disable                = regulator_disable_regmap,
828         .is_enabled             = regulator_is_enabled_regmap,
829
830         .set_ramp_delay         = regulator_set_ramp_delay_regmap,
831
832         .set_suspend_voltage    = rk806_set_suspend_voltage_range_pldo,
833         .set_suspend_enable     = rk806_set_suspend_enable,
834         .set_suspend_disable    = rk806_set_suspend_disable,
835 };
836
837 static const struct regulator_ops rk808_buck1_2_ops = {
838         .list_voltage           = regulator_list_voltage_linear,
839         .map_voltage            = regulator_map_voltage_linear,
840         .get_voltage_sel        = rk808_buck1_2_get_voltage_sel_regmap,
841         .set_voltage_sel        = rk808_buck1_2_set_voltage_sel,
842         .set_voltage_time_sel   = rk808_buck1_2_set_voltage_time_sel,
843         .enable                 = regulator_enable_regmap,
844         .disable                = regulator_disable_regmap,
845         .is_enabled             = regulator_is_enabled_regmap,
846         .set_ramp_delay         = regulator_set_ramp_delay_regmap,
847         .set_suspend_voltage    = rk808_set_suspend_voltage,
848         .set_suspend_enable     = rk808_set_suspend_enable,
849         .set_suspend_disable    = rk808_set_suspend_disable,
850 };
851
852 static const struct regulator_ops rk808_reg_ops = {
853         .list_voltage           = regulator_list_voltage_linear,
854         .map_voltage            = regulator_map_voltage_linear,
855         .get_voltage_sel        = regulator_get_voltage_sel_regmap,
856         .set_voltage_sel        = regulator_set_voltage_sel_regmap,
857         .enable                 = regulator_enable_regmap,
858         .disable                = regulator_disable_regmap,
859         .is_enabled             = regulator_is_enabled_regmap,
860         .set_suspend_voltage    = rk808_set_suspend_voltage,
861         .set_suspend_enable     = rk808_set_suspend_enable,
862         .set_suspend_disable    = rk808_set_suspend_disable,
863 };
864
865 static const struct regulator_ops rk808_reg_ops_ranges = {
866         .list_voltage           = regulator_list_voltage_linear_range,
867         .map_voltage            = regulator_map_voltage_linear_range,
868         .get_voltage_sel        = regulator_get_voltage_sel_regmap,
869         .set_voltage_sel        = regulator_set_voltage_sel_regmap,
870         .enable                 = regulator_enable_regmap,
871         .disable                = regulator_disable_regmap,
872         .is_enabled             = regulator_is_enabled_regmap,
873         .set_suspend_voltage    = rk808_set_suspend_voltage_range,
874         .set_suspend_enable     = rk808_set_suspend_enable,
875         .set_suspend_disable    = rk808_set_suspend_disable,
876 };
877
878 static const struct regulator_ops rk808_switch_ops = {
879         .enable                 = regulator_enable_regmap,
880         .disable                = regulator_disable_regmap,
881         .is_enabled             = regulator_is_enabled_regmap,
882         .set_suspend_enable     = rk808_set_suspend_enable,
883         .set_suspend_disable    = rk808_set_suspend_disable,
884 };
885
886 static const struct linear_range rk805_buck_1_2_voltage_ranges[] = {
887         REGULATOR_LINEAR_RANGE(712500, 0, 59, 12500),
888         REGULATOR_LINEAR_RANGE(1800000, 60, 62, 200000),
889         REGULATOR_LINEAR_RANGE(2300000, 63, 63, 0),
890 };
891
892 static const struct regulator_ops rk809_buck5_ops_range = {
893         .list_voltage           = regulator_list_voltage_linear_range,
894         .map_voltage            = regulator_map_voltage_linear_range,
895         .get_voltage_sel        = regulator_get_voltage_sel_regmap,
896         .set_voltage_sel        = regulator_set_voltage_sel_regmap,
897         .set_voltage_time_sel   = regulator_set_voltage_time_sel,
898         .enable                 = regulator_enable_regmap,
899         .disable                = regulator_disable_regmap,
900         .is_enabled             = rk8xx_is_enabled_wmsk_regmap,
901         .set_suspend_voltage    = rk808_set_suspend_voltage_range,
902         .set_suspend_enable     = rk817_set_suspend_enable,
903         .set_suspend_disable    = rk817_set_suspend_disable,
904 };
905
906 static const struct regulator_ops rk817_reg_ops = {
907         .list_voltage           = regulator_list_voltage_linear,
908         .map_voltage            = regulator_map_voltage_linear,
909         .get_voltage_sel        = regulator_get_voltage_sel_regmap,
910         .set_voltage_sel        = regulator_set_voltage_sel_regmap,
911         .enable                 = regulator_enable_regmap,
912         .disable                = regulator_disable_regmap,
913         .is_enabled             = rk8xx_is_enabled_wmsk_regmap,
914         .set_suspend_voltage    = rk808_set_suspend_voltage,
915         .set_suspend_enable     = rk817_set_suspend_enable,
916         .set_suspend_disable    = rk817_set_suspend_disable,
917 };
918
919 static const struct regulator_ops rk817_boost_ops = {
920         .list_voltage           = regulator_list_voltage_linear,
921         .map_voltage            = regulator_map_voltage_linear,
922         .get_voltage_sel        = regulator_get_voltage_sel_regmap,
923         .set_voltage_sel        = regulator_set_voltage_sel_regmap,
924         .enable                 = regulator_enable_regmap,
925         .disable                = regulator_disable_regmap,
926         .is_enabled             = rk8xx_is_enabled_wmsk_regmap,
927         .set_suspend_enable     = rk817_set_suspend_enable,
928         .set_suspend_disable    = rk817_set_suspend_disable,
929 };
930
931 static const struct regulator_ops rk817_buck_ops_range = {
932         .list_voltage           = regulator_list_voltage_linear_range,
933         .map_voltage            = regulator_map_voltage_linear_range,
934         .get_voltage_sel        = regulator_get_voltage_sel_regmap,
935         .set_voltage_sel        = regulator_set_voltage_sel_regmap,
936         .set_voltage_time_sel   = regulator_set_voltage_time_sel,
937         .enable                 = regulator_enable_regmap,
938         .disable                = regulator_disable_regmap,
939         .is_enabled             = rk8xx_is_enabled_wmsk_regmap,
940         .set_mode               = rk8xx_set_mode,
941         .get_mode               = rk8xx_get_mode,
942         .set_suspend_mode       = rk8xx_set_suspend_mode,
943         .set_ramp_delay         = regulator_set_ramp_delay_regmap,
944         .set_suspend_voltage    = rk808_set_suspend_voltage_range,
945         .set_suspend_enable     = rk817_set_suspend_enable,
946         .set_suspend_disable    = rk817_set_suspend_disable,
947 };
948
949 static const struct regulator_ops rk817_switch_ops = {
950         .enable                 = regulator_enable_regmap,
951         .disable                = regulator_disable_regmap,
952         .is_enabled             = rk8xx_is_enabled_wmsk_regmap,
953         .set_suspend_enable     = rk817_set_suspend_enable,
954         .set_suspend_disable    = rk817_set_suspend_disable,
955 };
956
957 static const struct regulator_desc rk805_reg[] = {
958         {
959                 .name = "DCDC_REG1",
960                 .supply_name = "vcc1",
961                 .of_match = of_match_ptr("DCDC_REG1"),
962                 .regulators_node = of_match_ptr("regulators"),
963                 .id = RK805_ID_DCDC1,
964                 .ops = &rk808_reg_ops_ranges,
965                 .type = REGULATOR_VOLTAGE,
966                 .n_voltages = 64,
967                 .linear_ranges = rk805_buck_1_2_voltage_ranges,
968                 .n_linear_ranges = ARRAY_SIZE(rk805_buck_1_2_voltage_ranges),
969                 .vsel_reg = RK805_BUCK1_ON_VSEL_REG,
970                 .vsel_mask = RK818_BUCK_VSEL_MASK,
971                 .enable_reg = RK805_DCDC_EN_REG,
972                 .enable_mask = BIT(0),
973                 .owner = THIS_MODULE,
974         }, {
975                 .name = "DCDC_REG2",
976                 .supply_name = "vcc2",
977                 .of_match = of_match_ptr("DCDC_REG2"),
978                 .regulators_node = of_match_ptr("regulators"),
979                 .id = RK805_ID_DCDC2,
980                 .ops = &rk808_reg_ops_ranges,
981                 .type = REGULATOR_VOLTAGE,
982                 .n_voltages = 64,
983                 .linear_ranges = rk805_buck_1_2_voltage_ranges,
984                 .n_linear_ranges = ARRAY_SIZE(rk805_buck_1_2_voltage_ranges),
985                 .vsel_reg = RK805_BUCK2_ON_VSEL_REG,
986                 .vsel_mask = RK818_BUCK_VSEL_MASK,
987                 .enable_reg = RK805_DCDC_EN_REG,
988                 .enable_mask = BIT(1),
989                 .owner = THIS_MODULE,
990         }, {
991                 .name = "DCDC_REG3",
992                 .supply_name = "vcc3",
993                 .of_match = of_match_ptr("DCDC_REG3"),
994                 .regulators_node = of_match_ptr("regulators"),
995                 .id = RK805_ID_DCDC3,
996                 .ops = &rk805_switch_ops,
997                 .type = REGULATOR_VOLTAGE,
998                 .n_voltages = 1,
999                 .enable_reg = RK805_DCDC_EN_REG,
1000                 .enable_mask = BIT(2),
1001                 .owner = THIS_MODULE,
1002         },
1003
1004         RK805_DESC(RK805_ID_DCDC4, "DCDC_REG4", "vcc4", 800, 3400, 100,
1005                 RK805_BUCK4_ON_VSEL_REG, RK818_BUCK4_VSEL_MASK,
1006                 RK805_DCDC_EN_REG, BIT(3), 0),
1007
1008         RK805_DESC(RK805_ID_LDO1, "LDO_REG1", "vcc5", 800, 3400, 100,
1009                 RK805_LDO1_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK805_LDO_EN_REG,
1010                 BIT(0), 400),
1011         RK805_DESC(RK805_ID_LDO2, "LDO_REG2", "vcc5", 800, 3400, 100,
1012                 RK805_LDO2_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK805_LDO_EN_REG,
1013                 BIT(1), 400),
1014         RK805_DESC(RK805_ID_LDO3, "LDO_REG3", "vcc6", 800, 3400, 100,
1015                 RK805_LDO3_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK805_LDO_EN_REG,
1016                 BIT(2), 400),
1017 };
1018
1019 static const struct linear_range rk806_buck_voltage_ranges[] = {
1020         REGULATOR_LINEAR_RANGE(500000, 0, 160, 6250), /* 500mV ~ 1500mV */
1021         REGULATOR_LINEAR_RANGE(1500000, 161, 237, 25000), /* 1500mV ~ 3400mV */
1022         REGULATOR_LINEAR_RANGE(3400000, 238, 255, 0),
1023 };
1024
1025 static const struct linear_range rk806_ldo_voltage_ranges[] = {
1026         REGULATOR_LINEAR_RANGE(500000, 0, 232, 12500), /* 500mV ~ 3400mV */
1027         REGULATOR_LINEAR_RANGE(3400000, 233, 255, 0), /* 500mV ~ 3400mV */
1028 };
1029
1030 static const struct regulator_desc rk806_reg[] = {
1031         RK806_REGULATOR("dcdc-reg1", "vcc1", RK806_ID_DCDC1, rk806_ops_dcdc,
1032                         RK806_BUCK_SEL_CNT, RK806_BUCK1_ON_VSEL,
1033                         RK806_POWER_EN0, rk806_buck_voltage_ranges, 0,
1034                         RK806_BUCK1_CONFIG, 0xc0, rk806_ramp_delay_table_dcdc),
1035         RK806_REGULATOR("dcdc-reg2", "vcc2", RK806_ID_DCDC2, rk806_ops_dcdc,
1036                         RK806_BUCK_SEL_CNT, RK806_BUCK2_ON_VSEL,
1037                         RK806_POWER_EN0, rk806_buck_voltage_ranges, 1,
1038                         RK806_BUCK2_CONFIG, 0xc0, rk806_ramp_delay_table_dcdc),
1039         RK806_REGULATOR("dcdc-reg3", "vcc3", RK806_ID_DCDC3, rk806_ops_dcdc,
1040                         RK806_BUCK_SEL_CNT, RK806_BUCK3_ON_VSEL,
1041                         RK806_POWER_EN0, rk806_buck_voltage_ranges, 2,
1042                         RK806_BUCK3_CONFIG, 0xc0, rk806_ramp_delay_table_dcdc),
1043         RK806_REGULATOR("dcdc-reg4", "vcc4", RK806_ID_DCDC4, rk806_ops_dcdc,
1044                         RK806_BUCK_SEL_CNT, RK806_BUCK4_ON_VSEL,
1045                         RK806_POWER_EN0, rk806_buck_voltage_ranges, 3,
1046                         RK806_BUCK4_CONFIG, 0xc0, rk806_ramp_delay_table_dcdc),
1047
1048         RK806_REGULATOR("dcdc-reg5", "vcc5", RK806_ID_DCDC5, rk806_ops_dcdc,
1049                         RK806_BUCK_SEL_CNT, RK806_BUCK5_ON_VSEL,
1050                         RK806_POWER_EN1, rk806_buck_voltage_ranges, 0,
1051                         RK806_BUCK5_CONFIG, 0xc0, rk806_ramp_delay_table_dcdc),
1052         RK806_REGULATOR("dcdc-reg6", "vcc6", RK806_ID_DCDC6, rk806_ops_dcdc,
1053                         RK806_BUCK_SEL_CNT, RK806_BUCK6_ON_VSEL,
1054                         RK806_POWER_EN1, rk806_buck_voltage_ranges, 1,
1055                         RK806_BUCK6_CONFIG, 0xc0, rk806_ramp_delay_table_dcdc),
1056         RK806_REGULATOR("dcdc-reg7", "vcc7", RK806_ID_DCDC7, rk806_ops_dcdc,
1057                         RK806_BUCK_SEL_CNT, RK806_BUCK7_ON_VSEL,
1058                         RK806_POWER_EN1, rk806_buck_voltage_ranges, 2,
1059                         RK806_BUCK7_CONFIG, 0xc0, rk806_ramp_delay_table_dcdc),
1060         RK806_REGULATOR("dcdc-reg8", "vcc8", RK806_ID_DCDC8, rk806_ops_dcdc,
1061                         RK806_BUCK_SEL_CNT, RK806_BUCK8_ON_VSEL,
1062                         RK806_POWER_EN1, rk806_buck_voltage_ranges, 3,
1063                         RK806_BUCK8_CONFIG, 0xc0, rk806_ramp_delay_table_dcdc),
1064
1065         RK806_REGULATOR("dcdc-reg9", "vcc9", RK806_ID_DCDC9, rk806_ops_dcdc,
1066                         RK806_BUCK_SEL_CNT, RK806_BUCK9_ON_VSEL,
1067                         RK806_POWER_EN2, rk806_buck_voltage_ranges, 0,
1068                         RK806_BUCK9_CONFIG, 0xc0, rk806_ramp_delay_table_dcdc),
1069         RK806_REGULATOR("dcdc-reg10", "vcc10", RK806_ID_DCDC10, rk806_ops_dcdc,
1070                         RK806_BUCK_SEL_CNT, RK806_BUCK10_ON_VSEL,
1071                         RK806_POWER_EN2, rk806_buck_voltage_ranges, 1,
1072                         RK806_BUCK10_CONFIG, 0xc0, rk806_ramp_delay_table_dcdc),
1073
1074         RK806_REGULATOR("nldo-reg1", "vcc13", RK806_ID_NLDO1, rk806_ops_nldo,
1075                         RK806_LDO_SEL_CNT, RK806_NLDO1_ON_VSEL,
1076                         RK806_POWER_EN3, rk806_ldo_voltage_ranges, 0,
1077                         0xEA, 0x38, rk806_ramp_delay_table_ldo),
1078         RK806_REGULATOR("nldo-reg2", "vcc13", RK806_ID_NLDO2, rk806_ops_nldo,
1079                         RK806_LDO_SEL_CNT, RK806_NLDO2_ON_VSEL,
1080                         RK806_POWER_EN3, rk806_ldo_voltage_ranges, 1,
1081                         0xEA, 0x38, rk806_ramp_delay_table_ldo),
1082         RK806_REGULATOR("nldo-reg3", "vcc13", RK806_ID_NLDO3, rk806_ops_nldo,
1083                         RK806_LDO_SEL_CNT, RK806_NLDO3_ON_VSEL,
1084                         RK806_POWER_EN3, rk806_ldo_voltage_ranges, 2,
1085                         0xEA, 0x38, rk806_ramp_delay_table_ldo),
1086         RK806_REGULATOR("nldo-reg4", "vcc14", RK806_ID_NLDO4, rk806_ops_nldo,
1087                         RK806_LDO_SEL_CNT, RK806_NLDO4_ON_VSEL,
1088                         RK806_POWER_EN3, rk806_ldo_voltage_ranges, 3,
1089                         0xEA, 0x38, rk806_ramp_delay_table_ldo),
1090
1091         RK806_REGULATOR("nldo-reg5", "vcc14", RK806_ID_NLDO5, rk806_ops_nldo,
1092                         RK806_LDO_SEL_CNT, RK806_NLDO5_ON_VSEL,
1093                         RK806_POWER_EN5, rk806_ldo_voltage_ranges, 2,
1094                         0xEA, 0x38, rk806_ramp_delay_table_ldo),
1095
1096         RK806_REGULATOR("pldo-reg1", "vcc11", RK806_ID_PLDO1, rk806_ops_pldo,
1097                         RK806_LDO_SEL_CNT, RK806_PLDO1_ON_VSEL,
1098                         RK806_POWER_EN4, rk806_ldo_voltage_ranges, 1,
1099                         0xEA, 0x38, rk806_ramp_delay_table_ldo),
1100         RK806_REGULATOR("pldo-reg2", "vcc11", RK806_ID_PLDO2, rk806_ops_pldo,
1101                         RK806_LDO_SEL_CNT, RK806_PLDO2_ON_VSEL,
1102                         RK806_POWER_EN4, rk806_ldo_voltage_ranges, 2,
1103                         0xEA, 0x38, rk806_ramp_delay_table_ldo),
1104         RK806_REGULATOR("pldo-reg3", "vcc11", RK806_ID_PLDO3, rk806_ops_pldo,
1105                         RK806_LDO_SEL_CNT, RK806_PLDO3_ON_VSEL,
1106                         RK806_POWER_EN4, rk806_ldo_voltage_ranges, 3,
1107                         0xEA, 0x38, rk806_ramp_delay_table_ldo),
1108
1109         RK806_REGULATOR("pldo-reg4", "vcc12", RK806_ID_PLDO4, rk806_ops_pldo,
1110                         RK806_LDO_SEL_CNT, RK806_PLDO4_ON_VSEL,
1111                         RK806_POWER_EN5, rk806_ldo_voltage_ranges, 0,
1112                         0xEA, 0x38, rk806_ramp_delay_table_ldo),
1113         RK806_REGULATOR("pldo-reg5", "vcc12", RK806_ID_PLDO5, rk806_ops_pldo,
1114                         RK806_LDO_SEL_CNT, RK806_PLDO5_ON_VSEL,
1115                         RK806_POWER_EN5, rk806_ldo_voltage_ranges, 1,
1116                         0xEA, 0x38, rk806_ramp_delay_table_ldo),
1117
1118         RK806_REGULATOR("pldo-reg6", "vcca", RK806_ID_PLDO6, rk806_ops_pldo,
1119                         RK806_LDO_SEL_CNT, RK806_PLDO6_ON_VSEL,
1120                         RK806_POWER_EN4, rk806_ldo_voltage_ranges, 0,
1121                         0xEA, 0x38, rk806_ramp_delay_table_ldo),
1122 };
1123
1124
1125 static const struct regulator_desc rk808_reg[] = {
1126         {
1127                 .name = "DCDC_REG1",
1128                 .supply_name = "vcc1",
1129                 .of_match = of_match_ptr("DCDC_REG1"),
1130                 .regulators_node = of_match_ptr("regulators"),
1131                 .id = RK808_ID_DCDC1,
1132                 .ops = &rk808_buck1_2_ops,
1133                 .type = REGULATOR_VOLTAGE,
1134                 .min_uV = 712500,
1135                 .uV_step = 12500,
1136                 .n_voltages = 64,
1137                 .vsel_reg = RK808_BUCK1_ON_VSEL_REG,
1138                 .vsel_mask = RK808_BUCK_VSEL_MASK,
1139                 .enable_reg = RK808_DCDC_EN_REG,
1140                 .enable_mask = BIT(0),
1141                 .ramp_reg = RK808_BUCK1_CONFIG_REG,
1142                 .ramp_mask = RK808_RAMP_RATE_MASK,
1143                 .ramp_delay_table = rk808_buck1_2_ramp_table,
1144                 .n_ramp_values = ARRAY_SIZE(rk808_buck1_2_ramp_table),
1145                 .owner = THIS_MODULE,
1146         }, {
1147                 .name = "DCDC_REG2",
1148                 .supply_name = "vcc2",
1149                 .of_match = of_match_ptr("DCDC_REG2"),
1150                 .regulators_node = of_match_ptr("regulators"),
1151                 .id = RK808_ID_DCDC2,
1152                 .ops = &rk808_buck1_2_ops,
1153                 .type = REGULATOR_VOLTAGE,
1154                 .min_uV = 712500,
1155                 .uV_step = 12500,
1156                 .n_voltages = 64,
1157                 .vsel_reg = RK808_BUCK2_ON_VSEL_REG,
1158                 .vsel_mask = RK808_BUCK_VSEL_MASK,
1159                 .enable_reg = RK808_DCDC_EN_REG,
1160                 .enable_mask = BIT(1),
1161                 .ramp_reg = RK808_BUCK2_CONFIG_REG,
1162                 .ramp_mask = RK808_RAMP_RATE_MASK,
1163                 .ramp_delay_table = rk808_buck1_2_ramp_table,
1164                 .n_ramp_values = ARRAY_SIZE(rk808_buck1_2_ramp_table),
1165                 .owner = THIS_MODULE,
1166         }, {
1167                 .name = "DCDC_REG3",
1168                 .supply_name = "vcc3",
1169                 .of_match = of_match_ptr("DCDC_REG3"),
1170                 .regulators_node = of_match_ptr("regulators"),
1171                 .id = RK808_ID_DCDC3,
1172                 .ops = &rk808_switch_ops,
1173                 .type = REGULATOR_VOLTAGE,
1174                 .n_voltages = 1,
1175                 .enable_reg = RK808_DCDC_EN_REG,
1176                 .enable_mask = BIT(2),
1177                 .owner = THIS_MODULE,
1178         },
1179         RK8XX_DESC(RK808_ID_DCDC4, "DCDC_REG4", "vcc4", 1800, 3300, 100,
1180                 RK808_BUCK4_ON_VSEL_REG, RK808_BUCK4_VSEL_MASK,
1181                 RK808_DCDC_EN_REG, BIT(3), 0),
1182         RK8XX_DESC(RK808_ID_LDO1, "LDO_REG1", "vcc6", 1800, 3400, 100,
1183                 RK808_LDO1_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
1184                 BIT(0), 400),
1185         RK8XX_DESC(RK808_ID_LDO2, "LDO_REG2", "vcc6", 1800, 3400, 100,
1186                 RK808_LDO2_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
1187                 BIT(1), 400),
1188         {
1189                 .name = "LDO_REG3",
1190                 .supply_name = "vcc7",
1191                 .of_match = of_match_ptr("LDO_REG3"),
1192                 .regulators_node = of_match_ptr("regulators"),
1193                 .id = RK808_ID_LDO3,
1194                 .ops = &rk808_reg_ops_ranges,
1195                 .type = REGULATOR_VOLTAGE,
1196                 .n_voltages = 16,
1197                 .linear_ranges = rk808_ldo3_voltage_ranges,
1198                 .n_linear_ranges = ARRAY_SIZE(rk808_ldo3_voltage_ranges),
1199                 .vsel_reg = RK808_LDO3_ON_VSEL_REG,
1200                 .vsel_mask = RK808_BUCK4_VSEL_MASK,
1201                 .enable_reg = RK808_LDO_EN_REG,
1202                 .enable_mask = BIT(2),
1203                 .enable_time = 400,
1204                 .owner = THIS_MODULE,
1205         },
1206         RK8XX_DESC(RK808_ID_LDO4, "LDO_REG4", "vcc9", 1800, 3400, 100,
1207                 RK808_LDO4_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
1208                 BIT(3), 400),
1209         RK8XX_DESC(RK808_ID_LDO5, "LDO_REG5", "vcc9", 1800, 3400, 100,
1210                 RK808_LDO5_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
1211                 BIT(4), 400),
1212         RK8XX_DESC(RK808_ID_LDO6, "LDO_REG6", "vcc10", 800, 2500, 100,
1213                 RK808_LDO6_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
1214                 BIT(5), 400),
1215         RK8XX_DESC(RK808_ID_LDO7, "LDO_REG7", "vcc7", 800, 2500, 100,
1216                 RK808_LDO7_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
1217                 BIT(6), 400),
1218         RK8XX_DESC(RK808_ID_LDO8, "LDO_REG8", "vcc11", 1800, 3400, 100,
1219                 RK808_LDO8_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
1220                 BIT(7), 400),
1221         RK8XX_DESC_SWITCH(RK808_ID_SWITCH1, "SWITCH_REG1", "vcc8",
1222                 RK808_DCDC_EN_REG, BIT(5)),
1223         RK8XX_DESC_SWITCH(RK808_ID_SWITCH2, "SWITCH_REG2", "vcc12",
1224                 RK808_DCDC_EN_REG, BIT(6)),
1225 };
1226
1227 static const struct regulator_desc rk809_reg[] = {
1228         {
1229                 .name = "DCDC_REG1",
1230                 .supply_name = "vcc1",
1231                 .of_match = of_match_ptr("DCDC_REG1"),
1232                 .regulators_node = of_match_ptr("regulators"),
1233                 .id = RK817_ID_DCDC1,
1234                 .ops = &rk817_buck_ops_range,
1235                 .type = REGULATOR_VOLTAGE,
1236                 .n_voltages = RK817_BUCK1_SEL_CNT + 1,
1237                 .linear_ranges = rk817_buck1_voltage_ranges,
1238                 .n_linear_ranges = ARRAY_SIZE(rk817_buck1_voltage_ranges),
1239                 .vsel_reg = RK817_BUCK1_ON_VSEL_REG,
1240                 .vsel_mask = RK817_BUCK_VSEL_MASK,
1241                 .enable_reg = RK817_POWER_EN_REG(0),
1242                 .enable_mask = ENABLE_MASK(RK817_ID_DCDC1),
1243                 .enable_val = ENABLE_MASK(RK817_ID_DCDC1),
1244                 .disable_val = DISABLE_VAL(RK817_ID_DCDC1),
1245                 .ramp_reg = RK817_BUCK_CONFIG_REG(RK817_ID_DCDC1),
1246                 .ramp_mask = RK817_RAMP_RATE_MASK,
1247                 .ramp_delay_table = rk817_buck1_4_ramp_table,
1248                 .n_ramp_values = ARRAY_SIZE(rk817_buck1_4_ramp_table),
1249                 .of_map_mode = rk8xx_regulator_of_map_mode,
1250                 .owner = THIS_MODULE,
1251         }, {
1252                 .name = "DCDC_REG2",
1253                 .supply_name = "vcc2",
1254                 .of_match = of_match_ptr("DCDC_REG2"),
1255                 .regulators_node = of_match_ptr("regulators"),
1256                 .id = RK817_ID_DCDC2,
1257                 .ops = &rk817_buck_ops_range,
1258                 .type = REGULATOR_VOLTAGE,
1259                 .n_voltages = RK817_BUCK1_SEL_CNT + 1,
1260                 .linear_ranges = rk817_buck1_voltage_ranges,
1261                 .n_linear_ranges = ARRAY_SIZE(rk817_buck1_voltage_ranges),
1262                 .vsel_reg = RK817_BUCK2_ON_VSEL_REG,
1263                 .vsel_mask = RK817_BUCK_VSEL_MASK,
1264                 .enable_reg = RK817_POWER_EN_REG(0),
1265                 .enable_mask = ENABLE_MASK(RK817_ID_DCDC2),
1266                 .enable_val = ENABLE_MASK(RK817_ID_DCDC2),
1267                 .disable_val = DISABLE_VAL(RK817_ID_DCDC2),
1268                 .ramp_reg = RK817_BUCK_CONFIG_REG(RK817_ID_DCDC2),
1269                 .ramp_mask = RK817_RAMP_RATE_MASK,
1270                 .ramp_delay_table = rk817_buck1_4_ramp_table,
1271                 .n_ramp_values = ARRAY_SIZE(rk817_buck1_4_ramp_table),
1272                 .of_map_mode = rk8xx_regulator_of_map_mode,
1273                 .owner = THIS_MODULE,
1274         }, {
1275                 .name = "DCDC_REG3",
1276                 .supply_name = "vcc3",
1277                 .of_match = of_match_ptr("DCDC_REG3"),
1278                 .regulators_node = of_match_ptr("regulators"),
1279                 .id = RK817_ID_DCDC3,
1280                 .ops = &rk817_buck_ops_range,
1281                 .type = REGULATOR_VOLTAGE,
1282                 .n_voltages = RK817_BUCK1_SEL_CNT + 1,
1283                 .linear_ranges = rk817_buck1_voltage_ranges,
1284                 .n_linear_ranges = ARRAY_SIZE(rk817_buck1_voltage_ranges),
1285                 .vsel_reg = RK817_BUCK3_ON_VSEL_REG,
1286                 .vsel_mask = RK817_BUCK_VSEL_MASK,
1287                 .enable_reg = RK817_POWER_EN_REG(0),
1288                 .enable_mask = ENABLE_MASK(RK817_ID_DCDC3),
1289                 .enable_val = ENABLE_MASK(RK817_ID_DCDC3),
1290                 .disable_val = DISABLE_VAL(RK817_ID_DCDC3),
1291                 .ramp_reg = RK817_BUCK_CONFIG_REG(RK817_ID_DCDC3),
1292                 .ramp_mask = RK817_RAMP_RATE_MASK,
1293                 .ramp_delay_table = rk817_buck1_4_ramp_table,
1294                 .n_ramp_values = ARRAY_SIZE(rk817_buck1_4_ramp_table),
1295                 .of_map_mode = rk8xx_regulator_of_map_mode,
1296                 .owner = THIS_MODULE,
1297         }, {
1298                 .name = "DCDC_REG4",
1299                 .supply_name = "vcc4",
1300                 .of_match = of_match_ptr("DCDC_REG4"),
1301                 .regulators_node = of_match_ptr("regulators"),
1302                 .id = RK817_ID_DCDC4,
1303                 .ops = &rk817_buck_ops_range,
1304                 .type = REGULATOR_VOLTAGE,
1305                 .n_voltages = RK817_BUCK3_SEL_CNT + 1,
1306                 .linear_ranges = rk817_buck3_voltage_ranges,
1307                 .n_linear_ranges = ARRAY_SIZE(rk817_buck3_voltage_ranges),
1308                 .vsel_reg = RK817_BUCK4_ON_VSEL_REG,
1309                 .vsel_mask = RK817_BUCK_VSEL_MASK,
1310                 .enable_reg = RK817_POWER_EN_REG(0),
1311                 .enable_mask = ENABLE_MASK(RK817_ID_DCDC4),
1312                 .enable_val = ENABLE_MASK(RK817_ID_DCDC4),
1313                 .disable_val = DISABLE_VAL(RK817_ID_DCDC4),
1314                 .ramp_reg = RK817_BUCK_CONFIG_REG(RK817_ID_DCDC4),
1315                 .ramp_mask = RK817_RAMP_RATE_MASK,
1316                 .ramp_delay_table = rk817_buck1_4_ramp_table,
1317                 .n_ramp_values = ARRAY_SIZE(rk817_buck1_4_ramp_table),
1318                 .of_map_mode = rk8xx_regulator_of_map_mode,
1319                 .owner = THIS_MODULE,
1320         },
1321         {
1322                 .name = "DCDC_REG5",
1323                 .supply_name = "vcc9",
1324                 .of_match = of_match_ptr("DCDC_REG5"),
1325                 .regulators_node = of_match_ptr("regulators"),
1326                 .id = RK809_ID_DCDC5,
1327                 .ops = &rk809_buck5_ops_range,
1328                 .type = REGULATOR_VOLTAGE,
1329                 .n_voltages = RK809_BUCK5_SEL_CNT,
1330                 .linear_ranges = rk809_buck5_voltage_ranges,
1331                 .n_linear_ranges = ARRAY_SIZE(rk809_buck5_voltage_ranges),
1332                 .vsel_reg = RK809_BUCK5_CONFIG(0),
1333                 .vsel_mask = RK809_BUCK5_VSEL_MASK,
1334                 .enable_reg = RK817_POWER_EN_REG(3),
1335                 .enable_mask = ENABLE_MASK(1),
1336                 .enable_val = ENABLE_MASK(1),
1337                 .disable_val = DISABLE_VAL(1),
1338                 .of_map_mode = rk8xx_regulator_of_map_mode,
1339                 .owner = THIS_MODULE,
1340         },
1341         RK817_DESC(RK817_ID_LDO1, "LDO_REG1", "vcc5", 600, 3400, 25,
1342                    RK817_LDO_ON_VSEL_REG(0), RK817_LDO_VSEL_MASK,
1343                    RK817_POWER_EN_REG(1), ENABLE_MASK(0),
1344                    DISABLE_VAL(0), 400),
1345         RK817_DESC(RK817_ID_LDO2, "LDO_REG2", "vcc5", 600, 3400, 25,
1346                    RK817_LDO_ON_VSEL_REG(1), RK817_LDO_VSEL_MASK,
1347                    RK817_POWER_EN_REG(1), ENABLE_MASK(1),
1348                    DISABLE_VAL(1), 400),
1349         RK817_DESC(RK817_ID_LDO3, "LDO_REG3", "vcc5", 600, 3400, 25,
1350                    RK817_LDO_ON_VSEL_REG(2), RK817_LDO_VSEL_MASK,
1351                    RK817_POWER_EN_REG(1), ENABLE_MASK(2),
1352                    DISABLE_VAL(2), 400),
1353         RK817_DESC(RK817_ID_LDO4, "LDO_REG4", "vcc6", 600, 3400, 25,
1354                    RK817_LDO_ON_VSEL_REG(3), RK817_LDO_VSEL_MASK,
1355                    RK817_POWER_EN_REG(1), ENABLE_MASK(3),
1356                    DISABLE_VAL(3), 400),
1357         RK817_DESC(RK817_ID_LDO5, "LDO_REG5", "vcc6", 600, 3400, 25,
1358                    RK817_LDO_ON_VSEL_REG(4), RK817_LDO_VSEL_MASK,
1359                    RK817_POWER_EN_REG(2), ENABLE_MASK(0),
1360                    DISABLE_VAL(0), 400),
1361         RK817_DESC(RK817_ID_LDO6, "LDO_REG6", "vcc6", 600, 3400, 25,
1362                    RK817_LDO_ON_VSEL_REG(5), RK817_LDO_VSEL_MASK,
1363                    RK817_POWER_EN_REG(2), ENABLE_MASK(1),
1364                    DISABLE_VAL(1), 400),
1365         RK817_DESC(RK817_ID_LDO7, "LDO_REG7", "vcc7", 600, 3400, 25,
1366                    RK817_LDO_ON_VSEL_REG(6), RK817_LDO_VSEL_MASK,
1367                    RK817_POWER_EN_REG(2), ENABLE_MASK(2),
1368                    DISABLE_VAL(2), 400),
1369         RK817_DESC(RK817_ID_LDO8, "LDO_REG8", "vcc7", 600, 3400, 25,
1370                    RK817_LDO_ON_VSEL_REG(7), RK817_LDO_VSEL_MASK,
1371                    RK817_POWER_EN_REG(2), ENABLE_MASK(3),
1372                    DISABLE_VAL(3), 400),
1373         RK817_DESC(RK817_ID_LDO9, "LDO_REG9", "vcc7", 600, 3400, 25,
1374                    RK817_LDO_ON_VSEL_REG(8), RK817_LDO_VSEL_MASK,
1375                    RK817_POWER_EN_REG(3), ENABLE_MASK(0),
1376                    DISABLE_VAL(0), 400),
1377         RK817_DESC_SWITCH(RK809_ID_SW1, "SWITCH_REG1", "vcc9",
1378                           RK817_POWER_EN_REG(3), ENABLE_MASK(2),
1379                           DISABLE_VAL(2)),
1380         RK817_DESC_SWITCH(RK809_ID_SW2, "SWITCH_REG2", "vcc8",
1381                           RK817_POWER_EN_REG(3), ENABLE_MASK(3),
1382                           DISABLE_VAL(3)),
1383 };
1384
1385 static const struct regulator_desc rk817_reg[] = {
1386         {
1387                 .name = "DCDC_REG1",
1388                 .supply_name = "vcc1",
1389                 .of_match = of_match_ptr("DCDC_REG1"),
1390                 .regulators_node = of_match_ptr("regulators"),
1391                 .id = RK817_ID_DCDC1,
1392                 .ops = &rk817_buck_ops_range,
1393                 .type = REGULATOR_VOLTAGE,
1394                 .n_voltages = RK817_BUCK1_SEL_CNT + 1,
1395                 .linear_ranges = rk817_buck1_voltage_ranges,
1396                 .n_linear_ranges = ARRAY_SIZE(rk817_buck1_voltage_ranges),
1397                 .vsel_reg = RK817_BUCK1_ON_VSEL_REG,
1398                 .vsel_mask = RK817_BUCK_VSEL_MASK,
1399                 .enable_reg = RK817_POWER_EN_REG(0),
1400                 .enable_mask = ENABLE_MASK(RK817_ID_DCDC1),
1401                 .enable_val = ENABLE_MASK(RK817_ID_DCDC1),
1402                 .disable_val = DISABLE_VAL(RK817_ID_DCDC1),
1403                 .ramp_reg = RK817_BUCK_CONFIG_REG(RK817_ID_DCDC1),
1404                 .ramp_mask = RK817_RAMP_RATE_MASK,
1405                 .ramp_delay_table = rk817_buck1_4_ramp_table,
1406                 .n_ramp_values = ARRAY_SIZE(rk817_buck1_4_ramp_table),
1407                 .of_map_mode = rk8xx_regulator_of_map_mode,
1408                 .owner = THIS_MODULE,
1409         }, {
1410                 .name = "DCDC_REG2",
1411                 .supply_name = "vcc2",
1412                 .of_match = of_match_ptr("DCDC_REG2"),
1413                 .regulators_node = of_match_ptr("regulators"),
1414                 .id = RK817_ID_DCDC2,
1415                 .ops = &rk817_buck_ops_range,
1416                 .type = REGULATOR_VOLTAGE,
1417                 .n_voltages = RK817_BUCK1_SEL_CNT + 1,
1418                 .linear_ranges = rk817_buck1_voltage_ranges,
1419                 .n_linear_ranges = ARRAY_SIZE(rk817_buck1_voltage_ranges),
1420                 .vsel_reg = RK817_BUCK2_ON_VSEL_REG,
1421                 .vsel_mask = RK817_BUCK_VSEL_MASK,
1422                 .enable_reg = RK817_POWER_EN_REG(0),
1423                 .enable_mask = ENABLE_MASK(RK817_ID_DCDC2),
1424                 .enable_val = ENABLE_MASK(RK817_ID_DCDC2),
1425                 .disable_val = DISABLE_VAL(RK817_ID_DCDC2),
1426                 .ramp_reg = RK817_BUCK_CONFIG_REG(RK817_ID_DCDC2),
1427                 .ramp_mask = RK817_RAMP_RATE_MASK,
1428                 .ramp_delay_table = rk817_buck1_4_ramp_table,
1429                 .n_ramp_values = ARRAY_SIZE(rk817_buck1_4_ramp_table),
1430                 .of_map_mode = rk8xx_regulator_of_map_mode,
1431                 .owner = THIS_MODULE,
1432         }, {
1433                 .name = "DCDC_REG3",
1434                 .supply_name = "vcc3",
1435                 .of_match = of_match_ptr("DCDC_REG3"),
1436                 .regulators_node = of_match_ptr("regulators"),
1437                 .id = RK817_ID_DCDC3,
1438                 .ops = &rk817_buck_ops_range,
1439                 .type = REGULATOR_VOLTAGE,
1440                 .n_voltages = RK817_BUCK1_SEL_CNT + 1,
1441                 .linear_ranges = rk817_buck1_voltage_ranges,
1442                 .n_linear_ranges = ARRAY_SIZE(rk817_buck1_voltage_ranges),
1443                 .vsel_reg = RK817_BUCK3_ON_VSEL_REG,
1444                 .vsel_mask = RK817_BUCK_VSEL_MASK,
1445                 .enable_reg = RK817_POWER_EN_REG(0),
1446                 .enable_mask = ENABLE_MASK(RK817_ID_DCDC3),
1447                 .enable_val = ENABLE_MASK(RK817_ID_DCDC3),
1448                 .disable_val = DISABLE_VAL(RK817_ID_DCDC3),
1449                 .ramp_reg = RK817_BUCK_CONFIG_REG(RK817_ID_DCDC3),
1450                 .ramp_mask = RK817_RAMP_RATE_MASK,
1451                 .ramp_delay_table = rk817_buck1_4_ramp_table,
1452                 .n_ramp_values = ARRAY_SIZE(rk817_buck1_4_ramp_table),
1453                 .of_map_mode = rk8xx_regulator_of_map_mode,
1454                 .owner = THIS_MODULE,
1455         }, {
1456                 .name = "DCDC_REG4",
1457                 .supply_name = "vcc4",
1458                 .of_match = of_match_ptr("DCDC_REG4"),
1459                 .regulators_node = of_match_ptr("regulators"),
1460                 .id = RK817_ID_DCDC4,
1461                 .ops = &rk817_buck_ops_range,
1462                 .type = REGULATOR_VOLTAGE,
1463                 .n_voltages = RK817_BUCK3_SEL_CNT + 1,
1464                 .linear_ranges = rk817_buck3_voltage_ranges,
1465                 .n_linear_ranges = ARRAY_SIZE(rk817_buck3_voltage_ranges),
1466                 .vsel_reg = RK817_BUCK4_ON_VSEL_REG,
1467                 .vsel_mask = RK817_BUCK_VSEL_MASK,
1468                 .enable_reg = RK817_POWER_EN_REG(0),
1469                 .enable_mask = ENABLE_MASK(RK817_ID_DCDC4),
1470                 .enable_val = ENABLE_MASK(RK817_ID_DCDC4),
1471                 .disable_val = DISABLE_VAL(RK817_ID_DCDC4),
1472                 .ramp_reg = RK817_BUCK_CONFIG_REG(RK817_ID_DCDC4),
1473                 .ramp_mask = RK817_RAMP_RATE_MASK,
1474                 .ramp_delay_table = rk817_buck1_4_ramp_table,
1475                 .n_ramp_values = ARRAY_SIZE(rk817_buck1_4_ramp_table),
1476                 .of_map_mode = rk8xx_regulator_of_map_mode,
1477                 .owner = THIS_MODULE,
1478         },
1479         RK817_DESC(RK817_ID_LDO1, "LDO_REG1", "vcc5", 600, 3400, 25,
1480                    RK817_LDO_ON_VSEL_REG(0), RK817_LDO_VSEL_MASK,
1481                    RK817_POWER_EN_REG(1), ENABLE_MASK(0),
1482                    DISABLE_VAL(0), 400),
1483         RK817_DESC(RK817_ID_LDO2, "LDO_REG2", "vcc5", 600, 3400, 25,
1484                    RK817_LDO_ON_VSEL_REG(1), RK817_LDO_VSEL_MASK,
1485                    RK817_POWER_EN_REG(1), ENABLE_MASK(1),
1486                    DISABLE_VAL(1), 400),
1487         RK817_DESC(RK817_ID_LDO3, "LDO_REG3", "vcc5", 600, 3400, 25,
1488                    RK817_LDO_ON_VSEL_REG(2), RK817_LDO_VSEL_MASK,
1489                    RK817_POWER_EN_REG(1), ENABLE_MASK(2),
1490                    DISABLE_VAL(2), 400),
1491         RK817_DESC(RK817_ID_LDO4, "LDO_REG4", "vcc6", 600, 3400, 25,
1492                    RK817_LDO_ON_VSEL_REG(3), RK817_LDO_VSEL_MASK,
1493                    RK817_POWER_EN_REG(1), ENABLE_MASK(3),
1494                    DISABLE_VAL(3), 400),
1495         RK817_DESC(RK817_ID_LDO5, "LDO_REG5", "vcc6", 600, 3400, 25,
1496                    RK817_LDO_ON_VSEL_REG(4), RK817_LDO_VSEL_MASK,
1497                    RK817_POWER_EN_REG(2), ENABLE_MASK(0),
1498                    DISABLE_VAL(0), 400),
1499         RK817_DESC(RK817_ID_LDO6, "LDO_REG6", "vcc6", 600, 3400, 25,
1500                    RK817_LDO_ON_VSEL_REG(5), RK817_LDO_VSEL_MASK,
1501                    RK817_POWER_EN_REG(2), ENABLE_MASK(1),
1502                    DISABLE_VAL(1), 400),
1503         RK817_DESC(RK817_ID_LDO7, "LDO_REG7", "vcc7", 600, 3400, 25,
1504                    RK817_LDO_ON_VSEL_REG(6), RK817_LDO_VSEL_MASK,
1505                    RK817_POWER_EN_REG(2), ENABLE_MASK(2),
1506                    DISABLE_VAL(2), 400),
1507         RK817_DESC(RK817_ID_LDO8, "LDO_REG8", "vcc7", 600, 3400, 25,
1508                    RK817_LDO_ON_VSEL_REG(7), RK817_LDO_VSEL_MASK,
1509                    RK817_POWER_EN_REG(2), ENABLE_MASK(3),
1510                    DISABLE_VAL(3), 400),
1511         RK817_DESC(RK817_ID_LDO9, "LDO_REG9", "vcc7", 600, 3400, 25,
1512                    RK817_LDO_ON_VSEL_REG(8), RK817_LDO_VSEL_MASK,
1513                    RK817_POWER_EN_REG(3), ENABLE_MASK(0),
1514                    DISABLE_VAL(0), 400),
1515         RK817_BOOST_DESC(RK817_ID_BOOST, "BOOST", "vcc8", 4700, 5400, 100,
1516                          RK817_BOOST_OTG_CFG, RK817_BOOST_VSEL_MASK,
1517                          RK817_POWER_EN_REG(3), ENABLE_MASK(1), ENABLE_MASK(1),
1518                    DISABLE_VAL(1), 400, 3500 - 5400),
1519         RK817_DESC_SWITCH(RK817_ID_BOOST_OTG_SW, "OTG_SWITCH", "vcc9",
1520                           RK817_POWER_EN_REG(3), ENABLE_MASK(2),
1521                           DISABLE_VAL(2)),
1522 };
1523
1524 static const struct regulator_desc rk818_reg[] = {
1525         {
1526                 .name = "DCDC_REG1",
1527                 .supply_name = "vcc1",
1528                 .of_match = of_match_ptr("DCDC_REG1"),
1529                 .regulators_node = of_match_ptr("regulators"),
1530                 .id = RK818_ID_DCDC1,
1531                 .ops = &rk808_reg_ops,
1532                 .type = REGULATOR_VOLTAGE,
1533                 .min_uV = 712500,
1534                 .uV_step = 12500,
1535                 .n_voltages = 64,
1536                 .vsel_reg = RK818_BUCK1_ON_VSEL_REG,
1537                 .vsel_mask = RK818_BUCK_VSEL_MASK,
1538                 .enable_reg = RK818_DCDC_EN_REG,
1539                 .enable_mask = BIT(0),
1540                 .owner = THIS_MODULE,
1541         }, {
1542                 .name = "DCDC_REG2",
1543                 .supply_name = "vcc2",
1544                 .of_match = of_match_ptr("DCDC_REG2"),
1545                 .regulators_node = of_match_ptr("regulators"),
1546                 .id = RK818_ID_DCDC2,
1547                 .ops = &rk808_reg_ops,
1548                 .type = REGULATOR_VOLTAGE,
1549                 .min_uV = 712500,
1550                 .uV_step = 12500,
1551                 .n_voltages = 64,
1552                 .vsel_reg = RK818_BUCK2_ON_VSEL_REG,
1553                 .vsel_mask = RK818_BUCK_VSEL_MASK,
1554                 .enable_reg = RK818_DCDC_EN_REG,
1555                 .enable_mask = BIT(1),
1556                 .owner = THIS_MODULE,
1557         }, {
1558                 .name = "DCDC_REG3",
1559                 .supply_name = "vcc3",
1560                 .of_match = of_match_ptr("DCDC_REG3"),
1561                 .regulators_node = of_match_ptr("regulators"),
1562                 .id = RK818_ID_DCDC3,
1563                 .ops = &rk808_switch_ops,
1564                 .type = REGULATOR_VOLTAGE,
1565                 .n_voltages = 1,
1566                 .enable_reg = RK818_DCDC_EN_REG,
1567                 .enable_mask = BIT(2),
1568                 .owner = THIS_MODULE,
1569         },
1570         RK8XX_DESC(RK818_ID_DCDC4, "DCDC_REG4", "vcc4", 1800, 3600, 100,
1571                 RK818_BUCK4_ON_VSEL_REG, RK818_BUCK4_VSEL_MASK,
1572                 RK818_DCDC_EN_REG, BIT(3), 0),
1573         RK8XX_DESC(RK818_ID_BOOST, "DCDC_BOOST", "boost", 4700, 5400, 100,
1574                 RK818_BOOST_LDO9_ON_VSEL_REG, RK818_BOOST_ON_VSEL_MASK,
1575                 RK818_DCDC_EN_REG, BIT(4), 0),
1576         RK8XX_DESC(RK818_ID_LDO1, "LDO_REG1", "vcc6", 1800, 3400, 100,
1577                 RK818_LDO1_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
1578                 BIT(0), 400),
1579         RK8XX_DESC(RK818_ID_LDO2, "LDO_REG2", "vcc6", 1800, 3400, 100,
1580                 RK818_LDO2_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
1581                 BIT(1), 400),
1582         {
1583                 .name = "LDO_REG3",
1584                 .supply_name = "vcc7",
1585                 .of_match = of_match_ptr("LDO_REG3"),
1586                 .regulators_node = of_match_ptr("regulators"),
1587                 .id = RK818_ID_LDO3,
1588                 .ops = &rk808_reg_ops_ranges,
1589                 .type = REGULATOR_VOLTAGE,
1590                 .n_voltages = 16,
1591                 .linear_ranges = rk808_ldo3_voltage_ranges,
1592                 .n_linear_ranges = ARRAY_SIZE(rk808_ldo3_voltage_ranges),
1593                 .vsel_reg = RK818_LDO3_ON_VSEL_REG,
1594                 .vsel_mask = RK818_LDO3_ON_VSEL_MASK,
1595                 .enable_reg = RK818_LDO_EN_REG,
1596                 .enable_mask = BIT(2),
1597                 .enable_time = 400,
1598                 .owner = THIS_MODULE,
1599         },
1600         RK8XX_DESC(RK818_ID_LDO4, "LDO_REG4", "vcc8", 1800, 3400, 100,
1601                 RK818_LDO4_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
1602                 BIT(3), 400),
1603         RK8XX_DESC(RK818_ID_LDO5, "LDO_REG5", "vcc7", 1800, 3400, 100,
1604                 RK818_LDO5_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
1605                 BIT(4), 400),
1606         RK8XX_DESC(RK818_ID_LDO6, "LDO_REG6", "vcc8", 800, 2500, 100,
1607                 RK818_LDO6_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
1608                 BIT(5), 400),
1609         RK8XX_DESC(RK818_ID_LDO7, "LDO_REG7", "vcc7", 800, 2500, 100,
1610                 RK818_LDO7_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
1611                 BIT(6), 400),
1612         RK8XX_DESC(RK818_ID_LDO8, "LDO_REG8", "vcc8", 1800, 3400, 100,
1613                 RK818_LDO8_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
1614                 BIT(7), 400),
1615         RK8XX_DESC(RK818_ID_LDO9, "LDO_REG9", "vcc9", 1800, 3400, 100,
1616                 RK818_BOOST_LDO9_ON_VSEL_REG, RK818_LDO_VSEL_MASK,
1617                 RK818_DCDC_EN_REG, BIT(5), 400),
1618         RK8XX_DESC_SWITCH(RK818_ID_SWITCH, "SWITCH_REG", "vcc9",
1619                 RK818_DCDC_EN_REG, BIT(6)),
1620         RK8XX_DESC_SWITCH(RK818_ID_HDMI_SWITCH, "HDMI_SWITCH", "h_5v",
1621                 RK818_H5V_EN_REG, BIT(0)),
1622         RK8XX_DESC_SWITCH(RK818_ID_OTG_SWITCH, "OTG_SWITCH", "usb",
1623                 RK818_DCDC_EN_REG, BIT(7)),
1624 };
1625
1626 static int rk808_regulator_dt_parse_pdata(struct device *dev,
1627                                    struct regmap *map,
1628                                    struct rk808_regulator_data *pdata)
1629 {
1630         struct device_node *np;
1631         int tmp, ret = 0, i;
1632
1633         np = of_get_child_by_name(dev->of_node, "regulators");
1634         if (!np)
1635                 return -ENXIO;
1636
1637         for (i = 0; i < ARRAY_SIZE(pdata->dvs_gpio); i++) {
1638                 pdata->dvs_gpio[i] =
1639                         devm_gpiod_get_index_optional(dev, "dvs", i,
1640                                                       GPIOD_OUT_LOW);
1641                 if (IS_ERR(pdata->dvs_gpio[i])) {
1642                         ret = PTR_ERR(pdata->dvs_gpio[i]);
1643                         dev_err(dev, "failed to get dvs%d gpio (%d)\n", i, ret);
1644                         goto dt_parse_end;
1645                 }
1646
1647                 if (!pdata->dvs_gpio[i]) {
1648                         dev_info(dev, "there is no dvs%d gpio\n", i);
1649                         continue;
1650                 }
1651
1652                 tmp = i ? RK808_DVS2_POL : RK808_DVS1_POL;
1653                 ret = regmap_update_bits(map, RK808_IO_POL_REG, tmp,
1654                                 gpiod_is_active_low(pdata->dvs_gpio[i]) ?
1655                                 0 : tmp);
1656         }
1657
1658 dt_parse_end:
1659         of_node_put(np);
1660         return ret;
1661 }
1662
1663 static int rk808_regulator_probe(struct platform_device *pdev)
1664 {
1665         struct rk808 *rk808 = dev_get_drvdata(pdev->dev.parent);
1666         struct regulator_config config = {};
1667         struct regulator_dev *rk808_rdev;
1668         struct rk808_regulator_data *pdata;
1669         const struct regulator_desc *regulators;
1670         struct regmap *regmap;
1671         int ret, i, nregulators;
1672
1673         pdev->dev.of_node = pdev->dev.parent->of_node;
1674         pdev->dev.of_node_reused = true;
1675
1676         regmap = dev_get_regmap(pdev->dev.parent, NULL);
1677         if (!regmap)
1678                 return -ENODEV;
1679
1680         pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
1681         if (!pdata)
1682                 return -ENOMEM;
1683
1684         ret = rk808_regulator_dt_parse_pdata(&pdev->dev, regmap, pdata);
1685         if (ret < 0)
1686                 return ret;
1687
1688         platform_set_drvdata(pdev, pdata);
1689
1690         switch (rk808->variant) {
1691         case RK805_ID:
1692                 regulators = rk805_reg;
1693                 nregulators = RK805_NUM_REGULATORS;
1694                 break;
1695         case RK806_ID:
1696                 regulators = rk806_reg;
1697                 nregulators = ARRAY_SIZE(rk806_reg);
1698                 break;
1699         case RK808_ID:
1700                 regulators = rk808_reg;
1701                 nregulators = RK808_NUM_REGULATORS;
1702                 break;
1703         case RK809_ID:
1704                 regulators = rk809_reg;
1705                 nregulators = RK809_NUM_REGULATORS;
1706                 break;
1707         case RK817_ID:
1708                 regulators = rk817_reg;
1709                 nregulators = RK817_NUM_REGULATORS;
1710                 break;
1711         case RK818_ID:
1712                 regulators = rk818_reg;
1713                 nregulators = RK818_NUM_REGULATORS;
1714                 break;
1715         default:
1716                 dev_err(&pdev->dev, "unsupported RK8XX ID %lu\n",
1717                         rk808->variant);
1718                 return -EINVAL;
1719         }
1720
1721         config.dev = &pdev->dev;
1722         config.driver_data = pdata;
1723         config.regmap = regmap;
1724
1725         /* Instantiate the regulators */
1726         for (i = 0; i < nregulators; i++) {
1727                 rk808_rdev = devm_regulator_register(&pdev->dev,
1728                                                      &regulators[i], &config);
1729                 if (IS_ERR(rk808_rdev))
1730                         return dev_err_probe(&pdev->dev, PTR_ERR(rk808_rdev),
1731                                              "failed to register %d regulator\n", i);
1732         }
1733
1734         return 0;
1735 }
1736
1737 static struct platform_driver rk808_regulator_driver = {
1738         .probe = rk808_regulator_probe,
1739         .driver = {
1740                 .name = "rk808-regulator",
1741                 .probe_type = PROBE_FORCE_SYNCHRONOUS,
1742         },
1743 };
1744
1745 module_platform_driver(rk808_regulator_driver);
1746
1747 MODULE_DESCRIPTION("regulator driver for the RK805/RK808/RK818 series PMICs");
1748 MODULE_AUTHOR("Tony xie <tony.xie@rock-chips.com>");
1749 MODULE_AUTHOR("Chris Zhong <zyw@rock-chips.com>");
1750 MODULE_AUTHOR("Zhang Qing <zhangqing@rock-chips.com>");
1751 MODULE_AUTHOR("Wadim Egorov <w.egorov@phytec.de>");
1752 MODULE_AUTHOR("Xu Shengfei <xsf@rock-chips.com>");
1753 MODULE_LICENSE("GPL");
1754 MODULE_ALIAS("platform:rk808-regulator");