xref: /rk3399_rockchip-uboot/drivers/power/regulator/rk860x_regulator.c (revision 5a94b26492fd3ad20c580976e18e101b67d14e6e)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (c) 2021 Rockchip Electronics Co., Ltd
4  */
5 #include <common.h>
6 #include <dm.h>
7 #include <errno.h>
8 #include <i2c.h>
9 #include <syscon.h>
10 #include <asm/gpio.h>
11 #include <power/regulator.h>
12 #include <asm/arch/clock.h>
13 #include <asm/io.h>
14 
15 DECLARE_GLOBAL_DATA_PTR;
16 
17 /* Voltage setting */
18 
19 #define RK860X_VSEL0_A		0x00
20 #define RK860X_VSEL1_A		0x01
21 #define RK860X_VSEL0_B		0x06
22 #define RK860X_VSEL1_B		0x07
23 #define RK860X_MAX_SET		0x08
24 
25 /* Control register */
26 #define RK860X_CONTROL		0x02
27 /* IC Type */
28 #define RK860X_ID1		0x03
29 /* IC mask version */
30 #define RK860X_ID2		0x04
31 /* Monitor register */
32 #define RK860X_MONITOR		0x05
33 
34 /* VSEL bit definitions */
35 #define VSEL_BUCK_EN		BIT(7)
36 #define VSEL_MODE		BIT(6)
37 #define VSEL_A_NSEL_MASK	0x3F
38 #define VSEL_B_NSEL_MASK	0xff
39 
40 /* Chip ID */
41 #define DIE_ID			0x0F
42 #define DIE_REV			0x0F
43 /* Control bit definitions */
44 #define CTL_OUTPUT_DISCHG	BIT(7)
45 #define CTL_SLEW_MASK		(0x7 << 4)
46 #define CTL_SLEW_SHIFT		4
47 #define CTL_RESET		BIT(2)
48 
49 #define RK860X_NVOLTAGES_64	64
50 #define RK860X_NVOLTAGES_160	160
51 
52 /* IC Type */
53 enum {
54 	RK860X_CHIP_ID_00 = 0,
55 	RK860X_CHIP_ID_01,
56 	RK860X_CHIP_ID_02,
57 	RK860X_CHIP_ID_03,
58 };
59 
60 struct rk860x_regulator_info {
61 	struct udevice *dev;
62 	/* IC Type and Rev */
63 	int chip_id;
64 	/* Voltage setting register */
65 	unsigned int vol_reg;
66 	unsigned int sleep_reg;
67 	unsigned int en_reg;
68 	unsigned int sleep_en_reg;
69 	unsigned int mode_reg;
70 	unsigned int vol_mask;
71 	unsigned int mode_mask;
72 	unsigned int n_voltages;
73 	/* Voltage range and step(linear) */
74 	unsigned int vsel_min;
75 	unsigned int vsel_step;
76 	struct gpio_desc vsel_gpio;
77 	struct gpio_desc en_gpio;
78 	unsigned int sleep_vsel_id;
79 };
80 
81 static int rk860x_write(struct udevice *dev, uint reg, const uint8_t *buff,
82 			int len)
83 {
84 	int ret;
85 
86 	ret = dm_i2c_write(dev, reg, buff, len);
87 	if (ret) {
88 		debug("%s: write reg 0x%02x failed, ret=%d\n",
89 		      __func__, reg, ret);
90 		return ret;
91 	}
92 
93 	return 0;
94 }
95 
96 static int rk860x_read(struct udevice *dev, uint reg, uint8_t *buff, int len)
97 {
98 	int ret;
99 
100 	ret = dm_i2c_read(dev, reg, buff, len);
101 	if (ret) {
102 		debug("%s: read reg 0x%02x failed, ret=%d\n",
103 		      __func__, reg, ret);
104 		return ret;
105 	}
106 
107 	return 0;
108 }
109 
110 int rk860x_reg_read(struct udevice *dev, uint reg)
111 {
112 	u8 byte;
113 	int ret;
114 
115 	debug("%s: reg=%x", __func__, reg);
116 	ret = rk860x_read(dev, reg, &byte, 1);
117 	debug(", value=%x, ret=%d\n", byte, ret);
118 
119 	return ret ? ret : byte;
120 }
121 
122 int rk860x_reg_write(struct udevice *dev, uint reg, uint value)
123 {
124 	u8 byte = value;
125 	int ret;
126 
127 	debug("%s: reg=%x, value=%x", __func__, reg, value);
128 	ret = rk860x_write(dev, reg, &byte, 1);
129 	debug(", ret=%d\n", ret);
130 
131 	return ret;
132 }
133 
134 int  rk860x_clrsetbits(struct udevice *dev, uint reg, uint clr, uint set)
135 {
136 	u8 byte;
137 	int ret;
138 
139 	ret = rk860x_reg_read(dev, reg);
140 	if (ret < 0)
141 		return ret;
142 	byte = (ret & ~clr) | set;
143 
144 	return rk860x_reg_write(dev, reg, byte);
145 }
146 
147 static int rk860x_regulator_set_enable(struct udevice *dev, bool enable)
148 {
149 	struct rk860x_regulator_info *priv = dev_get_priv(dev);
150 	int val, sleep_vsel_id;
151 
152 	if (enable) {
153 		val = VSEL_BUCK_EN;
154 		sleep_vsel_id = !priv->sleep_vsel_id;
155 	} else {
156 		val = 0;
157 		sleep_vsel_id = priv->sleep_vsel_id;
158 	}
159 
160 	if (dm_gpio_is_valid(&priv->vsel_gpio)) {
161 		dm_gpio_set_value(&priv->vsel_gpio, sleep_vsel_id);
162 		return 0;
163 	}
164 	rk860x_clrsetbits(dev, priv->en_reg, VSEL_BUCK_EN, val);
165 
166 	return 0;
167 }
168 
169 static int rk860x_regulator_get_enable(struct udevice *dev)
170 {
171 	struct rk860x_regulator_info *priv = dev_get_priv(dev);
172 	int val;
173 
174 	if (dm_gpio_is_valid(&priv->vsel_gpio)) {
175 		if (priv->sleep_vsel_id)
176 			return !dm_gpio_get_value(&priv->vsel_gpio);
177 		else
178 			return dm_gpio_get_value(&priv->vsel_gpio);
179 	}
180 
181 	val = rk860x_reg_read(dev, priv->en_reg);
182 	if (val & VSEL_BUCK_EN)
183 		return 1;
184 	else
185 		return 0;
186 }
187 
188 static int rk860x_regulator_set_suspend_enable(struct udevice *dev,
189 					       bool enable)
190 {
191 	struct rk860x_regulator_info *priv = dev_get_priv(dev);
192 	int val;
193 
194 	if (enable)
195 		val = VSEL_BUCK_EN;
196 	else
197 		val = 0;
198 
199 	rk860x_clrsetbits(dev, priv->sleep_en_reg, VSEL_BUCK_EN, val);
200 
201 	return 0;
202 }
203 
204 static int rk860x_regulator_get_suspend_enable(struct udevice *dev)
205 {
206 	struct rk860x_regulator_info *priv = dev_get_priv(dev);
207 	int val;
208 
209 	val = rk860x_reg_read(dev, priv->sleep_en_reg);
210 	if (val & VSEL_BUCK_EN)
211 		return 1;
212 	else
213 		return 0;
214 }
215 
216 static int rk860x_regulator_get_voltage(struct udevice *dev)
217 {
218 	struct rk860x_regulator_info *priv = dev_get_priv(dev);
219 	int uvolt = 0, val;
220 
221 	val = rk860x_reg_read(dev, priv->vol_reg);
222 	val &= priv->vol_mask;
223 	uvolt = (val * priv->vsel_step) + priv->vsel_min;
224 
225 	return uvolt;
226 }
227 
228 static int rk860x_regulator_set_voltage(struct udevice *dev, int uvolt)
229 {
230 	struct rk860x_regulator_info *priv = dev_get_priv(dev);
231 	int val;
232 
233 	val = ((uvolt - priv->vsel_min) / priv->vsel_step);
234 	rk860x_clrsetbits(dev, priv->vol_reg, priv->vol_mask, val);
235 
236 	return 0;
237 }
238 
239 static int rk860x_regulator_get_suspend_voltage(struct udevice *dev)
240 {
241 	struct rk860x_regulator_info *priv = dev_get_priv(dev);
242 	int uvolt = 0, val;
243 
244 	val = rk860x_reg_read(dev, priv->sleep_reg);
245 	val &= priv->vol_mask;
246 	uvolt = (val * priv->vsel_step) + priv->vsel_min;
247 
248 	return uvolt;
249 }
250 
251 static int rk860x_regulator_set_suspend_voltage(struct udevice *dev,
252 						int uvolt)
253 {
254 	struct rk860x_regulator_info *priv = dev_get_priv(dev);
255 	int val;
256 
257 	val = ((uvolt - priv->vsel_min) / priv->vsel_step);
258 	rk860x_clrsetbits(dev, priv->sleep_reg, priv->vol_mask, val);
259 
260 	return 0;
261 }
262 
263 /* For 00,01 options:
264  * VOUT = 0.7125V + NSELx * 12.5mV, from 0.7125 to 1.5V.
265  * For 02,03 options:
266  * VOUT = 0.5V + NSELx * 6.25mV, from 0.5 to 1.5V.
267  */
268 static int rk860x_device_setup(struct rk860x_regulator_info *di)
269 {
270 	int ret = 0;
271 
272 	switch (di->chip_id) {
273 	case RK860X_CHIP_ID_00:
274 	case RK860X_CHIP_ID_01:
275 		di->vsel_min = 712500;
276 		di->vsel_step = 12500;
277 		di->n_voltages = RK860X_NVOLTAGES_64;
278 		di->vol_mask = VSEL_A_NSEL_MASK;
279 		if (di->sleep_vsel_id) {
280 			di->sleep_reg = RK860X_VSEL1_A;
281 			di->vol_reg = RK860X_VSEL0_A;
282 			di->mode_reg = RK860X_VSEL0_A;
283 			di->en_reg = RK860X_VSEL0_A;
284 			di->sleep_en_reg = RK860X_VSEL1_A;
285 		} else {
286 			di->sleep_reg = RK860X_VSEL0_A;
287 			di->vol_reg = RK860X_VSEL1_A;
288 			di->mode_reg = RK860X_VSEL1_A;
289 			di->en_reg = RK860X_VSEL1_A;
290 			di->sleep_en_reg = RK860X_VSEL0_A;
291 		}
292 		break;
293 	case RK860X_CHIP_ID_02:
294 	case RK860X_CHIP_ID_03:
295 		di->vsel_min = 500000;
296 		di->vsel_step = 6250;
297 		di->n_voltages = RK860X_NVOLTAGES_160;
298 		di->vol_mask = VSEL_B_NSEL_MASK;
299 		if (di->sleep_vsel_id) {
300 			di->sleep_reg = RK860X_VSEL1_B;
301 			di->vol_reg = RK860X_VSEL0_B;
302 			di->mode_reg = RK860X_VSEL0_A;
303 			di->en_reg = RK860X_VSEL0_A;
304 			di->sleep_en_reg = RK860X_VSEL1_A;
305 		} else {
306 			di->sleep_reg = RK860X_VSEL0_B;
307 			di->vol_reg = RK860X_VSEL1_B;
308 			di->mode_reg = RK860X_VSEL1_A;
309 			di->en_reg = RK860X_VSEL1_A;
310 			di->sleep_en_reg = RK860X_VSEL0_A;
311 		}
312 		break;
313 	default:
314 		dev_err(di->dev,
315 			"Chip ID %d not supported!\n",
316 			di->chip_id);
317 		return -EINVAL;
318 	}
319 
320 	di->mode_mask = VSEL_MODE;
321 
322 	return ret;
323 }
324 
325 static int rk860x_regulator_ofdata_to_platdata(struct udevice *dev)
326 {
327 	struct rk860x_regulator_info *priv = dev_get_priv(dev);
328 	int ret;
329 
330 	priv->sleep_vsel_id = dev_read_u32_default(dev,
331 						   "rockchip,suspend-voltage-selector",
332 						   1);
333 
334 	ret = gpio_request_by_name(dev, "vsel-gpios", 0,
335 				   &priv->vsel_gpio, GPIOD_IS_OUT);
336 	if (ret)
337 		dev_err(dev, "vsel-gpios- not found! Error: %d\n", ret);
338 
339 	if (dm_gpio_is_valid(&priv->vsel_gpio))
340 		dm_gpio_set_value(&priv->vsel_gpio, !priv->sleep_vsel_id);
341 
342 	ret = gpio_request_by_name(dev, "en-gpios", 0,
343 				   &priv->en_gpio, GPIOD_IS_OUT);
344 	if (ret)
345 		dev_err(dev, "en-gpios- not found! Error: %d\n", ret);
346 
347 	if (dm_gpio_is_valid(&priv->en_gpio))
348 		dm_gpio_set_value(&priv->en_gpio, 1);
349 
350 	return 0;
351 }
352 
353 static int rk860x_regulator_probe(struct udevice *dev)
354 {
355 	struct rk860x_regulator_info *di = dev_get_priv(dev);
356 	struct dm_regulator_uclass_platdata *uc_pdata;
357 	u8 val;
358 	int ret;
359 
360 	uc_pdata = dev_get_uclass_platdata(dev);
361 	uc_pdata->type = REGULATOR_TYPE_BUCK;
362 	uc_pdata->mode_count = 0;
363 
364 	/* Get chip ID */
365 	val = rk860x_reg_read(dev, RK860X_ID1);
366 	if (val < 0) {
367 		dev_err(dev, "Failed to get chip ID!\n");
368 		return val;
369 	}
370 	if ((val & DIE_ID) == 0x8)
371 		di->chip_id = RK860X_CHIP_ID_00;
372 	else
373 		di->chip_id = RK860X_CHIP_ID_02;
374 
375 	debug("RK860X Option[%d] Detected!\n", val & DIE_ID);
376 
377 	/* Device init */
378 	ret = rk860x_device_setup(di);
379 	if (ret < 0) {
380 		dev_err(dev, "Failed to setup device!\n");
381 		return ret;
382 	}
383 
384 	return 0;
385 }
386 
387 static const struct udevice_id rk860x_id[] = {
388 	{
389 		.compatible = "rockchip,rk860x",
390 	},
391 	{ },
392 };
393 
394 static const struct dm_regulator_ops rk860x_regulator_ops = {
395 	.get_value  = rk860x_regulator_get_voltage,
396 	.set_value  = rk860x_regulator_set_voltage,
397 	.set_suspend_value = rk860x_regulator_set_suspend_voltage,
398 	.get_suspend_value = rk860x_regulator_get_suspend_voltage,
399 	.set_enable = rk860x_regulator_set_enable,
400 	.get_enable = rk860x_regulator_get_enable,
401 	.set_suspend_enable = rk860x_regulator_set_suspend_enable,
402 	.get_suspend_enable = rk860x_regulator_get_suspend_enable,
403 };
404 
405 U_BOOT_DRIVER(rk860x_regulator) = {
406 	.name = "rk860x_regulator",
407 	.id = UCLASS_REGULATOR,
408 	.ops = &rk860x_regulator_ops,
409 	.probe = rk860x_regulator_probe,
410 	.of_match = rk860x_id,
411 	.ofdata_to_platdata = rk860x_regulator_ofdata_to_platdata,
412 	.priv_auto_alloc_size = sizeof(struct rk860x_regulator_info),
413 };
414 
415