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