xref: /freebsd/sys/dev/iicbus/pmic/rockchip/rk817.c (revision d9a42747950146bf03cda7f6e25d219253f8a57a)
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause
3  *
4  * Copyright (c) 2021, 2022 Soren Schmidt <sos@deepcore.dk>
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25  * SUCH DAMAGE.
26  *
27  */
28 
29 #include <sys/cdefs.h>
30 __FBSDID("$FreeBSD$");
31 
32 #include <sys/param.h>
33 #include <sys/bus.h>
34 #include <sys/clock.h>
35 #include <sys/kernel.h>
36 #include <sys/module.h>
37 #include <sys/mutex.h>
38 #include <sys/rman.h>
39 #include <machine/bus.h>
40 
41 #include <dev/iicbus/iiconf.h>
42 #include <dev/iicbus/iicbus.h>
43 
44 #include <dev/ofw/ofw_bus.h>
45 #include <dev/ofw/ofw_bus_subr.h>
46 
47 #include <dev/iicbus/pmic/rockchip/rk817reg.h>
48 #include <dev/iicbus/pmic/rockchip/rk8xx.h>
49 
50 
51 static struct ofw_compat_data compat_data[] = {
52 	{"rockchip,rk809",	RK809},
53 	{"rockchip,rk817",	RK817},
54 	{NULL,			0}
55 };
56 
57 static struct rk8xx_regdef rk809_regdefs[] = {
58 	{
59 		.id = RK809_DCDC1,
60 		.name = "DCDC_REG1",
61 		.enable_reg = RK817_DCDC_EN,
62 		.enable_mask = 0x11,
63 		.voltage_reg = RK817_DCDC1_ON_VSEL,
64 		.voltage_mask = 0x7f,
65 		.voltage_min = 500000,
66 		.voltage_max = 1487500,
67 		.voltage_min2 = 1500000,
68 		.voltage_max2 = 2400000,
69 		.voltage_step = 12500,
70 		.voltage_step2 = 100000,
71 		.voltage_nstep = 177,
72 	},
73 	{
74 		.id = RK809_DCDC2,
75 		.name = "DCDC_REG2",
76 		.enable_reg = RK817_DCDC_EN,
77 		.enable_mask = 0x22,
78 		.voltage_reg = RK817_DCDC2_ON_VSEL,
79 		.voltage_mask = 0x7f,
80 		.voltage_min = 500000,
81 		.voltage_max = 1487500,
82 		.voltage_min2 = 1500000,
83 		.voltage_max2 = 2400000,
84 		.voltage_step = 12500,
85 		.voltage_step2 = 100000,
86 		.voltage_nstep = 177,
87 	},
88 	{
89 		.id = RK809_DCDC3,
90 		.name = "DCDC_REG3",
91 		.enable_reg = RK817_DCDC_EN,
92 		.enable_mask = 0x44,
93 		.voltage_reg = RK817_DCDC3_ON_VSEL,
94 		.voltage_mask = 0x7f,
95 		.voltage_min = 500000,
96 		.voltage_max = 1487500,
97 		.voltage_min2 = 1500000,
98 		.voltage_max2 = 2400000,
99 		.voltage_step = 12500,
100 		.voltage_step2 = 100000,
101 		.voltage_nstep = 177,
102 	},
103 	{
104 		.id = RK809_DCDC4,
105 		.name = "DCDC_REG4",
106 		.enable_reg = RK817_DCDC_EN,
107 		.enable_mask = 0x88,
108 		.voltage_reg = RK817_DCDC4_ON_VSEL,
109 		.voltage_mask = 0x7f,
110 		.voltage_min = 500000,
111 		.voltage_max = 1487500,
112 		.voltage_min2 = 1500000,
113 		.voltage_max2 = 3400000,
114 		.voltage_step = 12500,
115 		.voltage_step2 = 100000,
116 		.voltage_nstep = 195,
117 	},
118 	{
119 		.id = RK809_DCDC5,
120 		.name = "DCDC_REG5",
121 		.enable_reg = RK817_LDO_EN3,
122 		.enable_mask = 0x22,
123 		.voltage_reg = RK817_BOOST_ON_VSEL,
124 		.voltage_mask = 0x07,
125 		.voltage_min = 1600000,	/* cheat is 1.5V */
126 		.voltage_max = 3400000,
127 		.voltage_min2 = 3500000,
128 		.voltage_max2 = 3600000,
129 		.voltage_step = 200000,
130 		.voltage_step2 = 300000,
131 		.voltage_nstep = 8,
132 	},
133 	{
134 		.id = RK809_LDO1,
135 		.name = "LDO_REG1",
136 		.enable_reg = RK817_LDO_EN1,
137 		.enable_mask = 0x11,
138 		.voltage_reg = RK817_LDO1_ON_VSEL,
139 		.voltage_mask = 0x7f,
140 		.voltage_min = 600000,
141 		.voltage_max = 3400000,
142 		.voltage_step = 25000,
143 		.voltage_nstep = 112,
144 	},
145 	{
146 		.id = RK809_LDO2,
147 		.name = "LDO_REG2",
148 		.enable_reg = RK817_LDO_EN1,
149 		.enable_mask = 0x22,
150 		.voltage_reg = RK817_LDO2_ON_VSEL,
151 		.voltage_mask = 0x7f,
152 		.voltage_min = 600000,
153 		.voltage_max = 3400000,
154 		.voltage_step = 25000,
155 		.voltage_nstep = 112,
156 	},
157 	{
158 		.id = RK809_LDO3,
159 		.name = "LDO_REG3",
160 		.enable_reg = RK817_LDO_EN1,
161 		.enable_mask = 0x44,
162 		.voltage_reg = RK817_LDO3_ON_VSEL,
163 		.voltage_mask = 0x7f,
164 		.voltage_min = 600000,
165 		.voltage_max = 3400000,
166 		.voltage_step = 25000,
167 		.voltage_nstep = 112,
168 	},
169 	{
170 		.id = RK809_LDO4,
171 		.name = "LDO_REG4",
172 		.enable_reg = RK817_LDO_EN1,
173 		.enable_mask = 0x88,
174 		.voltage_reg = RK817_LDO4_ON_VSEL,
175 		.voltage_mask = 0x7f,
176 		.voltage_min = 600000,
177 		.voltage_max = 3400000,
178 		.voltage_step = 25000,
179 		.voltage_nstep = 112,
180 	},
181 	{
182 		.id = RK809_LDO5,
183 		.name = "LDO_REG5",
184 		.enable_reg = RK817_LDO_EN2,
185 		.enable_mask = 0x11,
186 		.voltage_reg = RK817_LDO5_ON_VSEL,
187 		.voltage_mask = 0x7f,
188 		.voltage_min = 600000,
189 		.voltage_max = 3400000,
190 		.voltage_step = 25000,
191 		.voltage_nstep = 112,
192 	},
193 	{
194 		.id = RK809_LDO6,
195 		.name = "LDO_REG6",
196 		.enable_reg = RK817_LDO_EN2,
197 		.enable_mask = 0x22,
198 		.voltage_reg = RK817_LDO6_ON_VSEL,
199 		.voltage_mask = 0x7f,
200 		.voltage_min = 600000,
201 		.voltage_max = 3400000,
202 		.voltage_step = 25000,
203 		.voltage_nstep = 112,
204 	},
205 	{
206 		.id = RK809_LDO7,
207 		.name = "LDO_REG7",
208 		.enable_reg = RK817_LDO_EN2,
209 		.enable_mask = 0x44,
210 		.voltage_reg = RK817_LDO7_ON_VSEL,
211 		.voltage_mask = 0x7f,
212 		.voltage_min = 600000,
213 		.voltage_max = 3400000,
214 		.voltage_step = 25000,
215 		.voltage_nstep = 112,
216 	},
217 	{
218 		.id = RK809_LDO8,
219 		.name = "LDO_REG8",
220 		.enable_reg = RK817_LDO_EN2,
221 		.enable_mask = 0x88,
222 		.voltage_reg = RK817_LDO8_ON_VSEL,
223 		.voltage_mask = 0x7f,
224 		.voltage_min = 600000,
225 		.voltage_max = 3400000,
226 		.voltage_step = 25000,
227 		.voltage_nstep = 112,
228 	},
229 	{
230 		.id = RK809_LDO9,
231 		.name = "LDO_REG9",
232 		.enable_reg = RK817_LDO_EN3,
233 		.enable_mask = 0x11,
234 		.voltage_reg = RK817_LDO9_ON_VSEL,
235 		.voltage_mask = 0x7f,
236 		.voltage_min = 600000,
237 		.voltage_max = 3400000,
238 		.voltage_step = 25000,
239 		.voltage_nstep = 112,
240 	},
241 	{
242 		.id = RK809_SWITCH1,
243 		.name = "SWITCH_REG1",
244 		.enable_reg = RK817_LDO_EN3,
245 		.enable_mask = 0x44,
246 		.voltage_min = 3300000,
247 		.voltage_max = 3300000,
248 		.voltage_nstep = 0,
249 	},
250 	{
251 		.id = RK809_SWITCH2,
252 		.name = "SWITCH_REG2",
253 		.enable_reg = RK817_LDO_EN3,
254 		.enable_mask = 0x88,
255 		.voltage_min = 3300000,
256 		.voltage_max = 3300000,
257 		.voltage_nstep = 0,
258 	},
259 };
260 
261 static struct rk8xx_regdef rk817_regdefs[] = {
262 	{
263 		.id = RK817_DCDC1,
264 		.name = "DCDC_REG1",
265 		.enable_reg = RK817_DCDC_EN,
266 		.enable_mask = 0x11,
267 		.voltage_reg = RK817_DCDC1_ON_VSEL,
268 		.voltage_mask = 0x7f,
269 		.voltage_min = 500000,
270 		.voltage_max = 1487500,
271 		.voltage_min2 = 1500000,
272 		.voltage_max2 = 2400000,
273 		.voltage_step = 12500,
274 		.voltage_step2 = 100000,
275 		.voltage_nstep = 177,
276 	},
277 	{
278 		.id = RK817_DCDC2,
279 		.name = "DCDC_REG2",
280 		.enable_reg = RK817_DCDC_EN,
281 		.enable_mask = 0x22,
282 		.voltage_reg = RK817_DCDC2_ON_VSEL,
283 		.voltage_mask = 0x7f,
284 		.voltage_min = 500000,
285 		.voltage_max = 1487500,
286 		.voltage_min2 = 1500000,
287 		.voltage_max2 = 2400000,
288 		.voltage_step = 12500,
289 		.voltage_step2 = 100000,
290 		.voltage_nstep = 177,
291 	},
292 	{
293 		.id = RK817_DCDC3,
294 		.name = "DCDC_REG3",
295 		.enable_reg = RK817_DCDC_EN,
296 		.enable_mask = 0x44,
297 		.voltage_reg = RK817_DCDC3_ON_VSEL,
298 		.voltage_mask = 0x7f,
299 		.voltage_min = 500000,
300 		.voltage_max = 1487500,
301 		.voltage_min2 = 1500000,
302 		.voltage_max2 = 2400000,
303 		.voltage_step = 12500,
304 		.voltage_step2 = 100000,
305 		.voltage_nstep = 177,
306 	},
307 	{
308 		.id = RK817_DCDC4,
309 		.name = "DCDC_REG4",
310 		.enable_reg = RK817_DCDC_EN,
311 		.enable_mask = 0x88,
312 		.voltage_reg = RK817_DCDC4_ON_VSEL,
313 		.voltage_mask = 0x7f,
314 		.voltage_min = 500000,
315 		.voltage_max = 1487500,
316 		.voltage_min2 = 1500000,
317 		.voltage_max2 = 3400000,
318 		.voltage_step = 12500,
319 		.voltage_step2 = 100000,
320 		.voltage_nstep = 195,
321 	},
322 	{
323 		.id = RK817_LDO1,
324 		.name = "LDO_REG1",
325 		.enable_reg = RK817_LDO_EN1,
326 		.enable_mask = 0x11,
327 		.voltage_reg = RK817_LDO1_ON_VSEL,
328 		.voltage_mask = 0x7f,
329 		.voltage_min = 600000,
330 		.voltage_max = 3400000,
331 		.voltage_step = 25000,
332 		.voltage_nstep = 112,
333 	},
334 	{
335 		.id = RK817_LDO2,
336 		.name = "LDO_REG2",
337 		.enable_reg = RK817_LDO_EN1,
338 		.enable_mask = 0x22,
339 		.voltage_reg = RK817_LDO2_ON_VSEL,
340 		.voltage_mask = 0x7f,
341 		.voltage_min = 600000,
342 		.voltage_max = 3400000,
343 		.voltage_step = 25000,
344 		.voltage_nstep = 112,
345 	},
346 	{
347 		.id = RK817_LDO3,
348 		.name = "LDO_REG3",
349 		.enable_reg = RK817_LDO_EN1,
350 		.enable_mask = 0x44,
351 		.voltage_reg = RK817_LDO3_ON_VSEL,
352 		.voltage_mask = 0x7f,
353 		.voltage_min = 600000,
354 		.voltage_max = 3400000,
355 		.voltage_step = 25000,
356 		.voltage_nstep = 112,
357 	},
358 	{
359 		.id = RK817_LDO4,
360 		.name = "LDO_REG4",
361 		.enable_reg = RK817_LDO_EN1,
362 		.enable_mask = 0x88,
363 		.voltage_reg = RK817_LDO4_ON_VSEL,
364 		.voltage_mask = 0x7f,
365 		.voltage_min = 600000,
366 		.voltage_max = 3400000,
367 		.voltage_step = 25000,
368 		.voltage_nstep = 112,
369 	},
370 	{
371 		.id = RK817_LDO5,
372 		.name = "LDO_REG5",
373 		.enable_reg = RK817_LDO_EN2,
374 		.enable_mask = 0x11,
375 		.voltage_reg = RK817_LDO5_ON_VSEL,
376 		.voltage_mask = 0x7f,
377 		.voltage_min = 600000,
378 		.voltage_max = 3400000,
379 		.voltage_step = 25000,
380 		.voltage_nstep = 112,
381 	},
382 	{
383 		.id = RK817_LDO6,
384 		.name = "LDO_REG6",
385 		.enable_reg = RK817_LDO_EN2,
386 		.enable_mask = 0x22,
387 		.voltage_reg = RK817_LDO6_ON_VSEL,
388 		.voltage_mask = 0x7f,
389 		.voltage_min = 600000,
390 		.voltage_max = 3400000,
391 		.voltage_step = 25000,
392 		.voltage_nstep = 112,
393 	},
394 	{
395 		.id = RK817_LDO7,
396 		.name = "LDO_REG7",
397 		.enable_reg = RK817_LDO_EN2,
398 		.enable_mask = 0x44,
399 		.voltage_reg = RK817_LDO7_ON_VSEL,
400 		.voltage_mask = 0x7f,
401 		.voltage_min = 600000,
402 		.voltage_max = 3400000,
403 		.voltage_step = 25000,
404 		.voltage_nstep = 112,
405 	},
406 	{
407 		.id = RK817_LDO8,
408 		.name = "LDO_REG8",
409 		.enable_reg = RK817_LDO_EN2,
410 		.enable_mask = 0x88,
411 		.voltage_reg = RK817_LDO8_ON_VSEL,
412 		.voltage_mask = 0x7f,
413 		.voltage_min = 600000,
414 		.voltage_max = 3400000,
415 		.voltage_step = 25000,
416 		.voltage_nstep = 112,
417 	},
418 	{
419 		.id = RK817_LDO9,
420 		.name = "LDO_REG9",
421 		.enable_reg = RK817_LDO_EN3,
422 		.enable_mask = 0x11,
423 		.voltage_reg = RK817_LDO9_ON_VSEL,
424 		.voltage_mask = 0x7f,
425 		.voltage_min = 600000,
426 		.voltage_max = 3400000,
427 		.voltage_step = 25000,
428 		.voltage_nstep = 112,
429 	},
430 	{
431 		.id = RK817_BOOST,
432 		.name = "BOOST",
433 		.enable_reg = RK817_LDO_EN3,
434 		.enable_mask = 0x22,
435 		.voltage_reg = RK817_BOOST_ON_VSEL,
436 		.voltage_mask = 0x07,
437 		.voltage_min = 4700000,
438 		.voltage_max = 5400000,
439 		.voltage_step = 100000,
440 		.voltage_nstep = 8,
441 	},
442 	{
443 		.id = RK817_OTG_SWITCH,
444 		.name = "OTG_SWITCH",
445 		.enable_reg = RK817_LDO_EN3,
446 		.enable_mask = 0x44,
447 		.voltage_nstep = 0,
448 	},
449 };
450 
451 static int
452 rk817_probe(device_t dev)
453 {
454 	if (!ofw_bus_status_okay(dev))
455 		return (ENXIO);
456 
457 	switch (ofw_bus_search_compatible(dev, compat_data)->ocd_data) {
458 	case RK809:
459 		device_set_desc(dev, "RockChip RK809 PMIC");
460 		break;
461 	case RK817:
462 		device_set_desc(dev, "RockChip RK817 PMIC");
463 		break;
464 	default:
465 		return (ENXIO);
466 	}
467 
468 	return (BUS_PROBE_DEFAULT);
469 }
470 
471 static int
472 rk817_attach(device_t dev)
473 {
474 	struct rk8xx_softc *sc;
475 
476 	sc = device_get_softc(dev);
477 	sc->dev = dev;
478 
479 	sc->type = ofw_bus_search_compatible(dev, compat_data)->ocd_data;
480 	switch (sc->type) {
481 	case RK809:
482 		sc->regdefs = rk809_regdefs;
483 		sc->nregs = nitems(rk809_regdefs);
484 		break;
485 	case RK817:
486 		sc->regdefs = rk817_regdefs;
487 		sc->nregs = nitems(rk817_regdefs);
488 		break;
489 	default:
490 		device_printf(dev, "Unknown type %d\n", sc->type);
491 		return (ENXIO);
492 	}
493 	sc->rtc_regs.secs = RK817_RTC_SECONDS;
494 	sc->rtc_regs.secs_mask = RK817_RTC_SECONDS_MASK;
495 	sc->rtc_regs.minutes = RK817_RTC_MINUTES;
496 	sc->rtc_regs.minutes_mask = RK817_RTC_MINUTES_MASK;
497 	sc->rtc_regs.hours = RK817_RTC_HOURS;
498 	sc->rtc_regs.hours_mask = RK817_RTC_HOURS_MASK;
499 	sc->rtc_regs.days = RK817_RTC_DAYS;
500 	sc->rtc_regs.days_mask = RK817_RTC_DAYS_MASK;
501 	sc->rtc_regs.months = RK817_RTC_MONTHS;
502 	sc->rtc_regs.months_mask = RK817_RTC_MONTHS_MASK;
503 	sc->rtc_regs.years = RK817_RTC_YEARS;
504 	sc->rtc_regs.weeks = RK817_RTC_WEEKS_MASK;
505 	sc->rtc_regs.ctrl = RK817_RTC_CTRL;
506 	sc->rtc_regs.ctrl_stop_mask = RK817_RTC_CTRL_STOP;
507 	sc->rtc_regs.ctrl_ampm_mask = RK817_RTC_AMPM_MODE;
508 	sc->rtc_regs.ctrl_gettime_mask = RK817_RTC_GET_TIME;
509 	sc->rtc_regs.ctrl_readsel_mask = RK817_RTC_READSEL;
510 	sc->dev_ctrl.dev_ctrl_reg = RK817_SYS_CFG3;
511 	sc->dev_ctrl.pwr_off_mask = RK817_SYS_CFG3_OFF;
512 	sc->dev_ctrl.pwr_rst_mask = RK817_SYS_CFG3_RST;
513 
514 	return (rk8xx_attach(sc));
515 }
516 
517 static device_method_t rk817_methods[] = {
518 	DEVMETHOD(device_probe,		rk817_probe),
519 	DEVMETHOD(device_attach,	rk817_attach),
520 
521 	DEVMETHOD_END
522 };
523 
524 DEFINE_CLASS_1(rk817_pmu, rk817_driver, rk817_methods,
525     sizeof(struct rk8xx_softc), rk8xx_driver);
526 
527 EARLY_DRIVER_MODULE(rk817_pmu, iicbus, rk817_driver, 0, 0,
528     BUS_PASS_INTERRUPT + BUS_PASS_ORDER_LATE);
529 EARLY_DRIVER_MODULE(iicbus, rk817_pmu, iicbus_driver, 0, 0,
530     BUS_PASS_INTERRUPT + BUS_PASS_ORDER_LATE);
531 MODULE_DEPEND(rk817_pmu, iicbus, IICBUS_MINVER, IICBUS_PREFVER, IICBUS_MAXVER);
532 MODULE_VERSION(rk817_pmu, 1);
533