]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/arm64/rockchip/rk805.c
MFV r356163,r356197:
[FreeBSD/FreeBSD.git] / sys / arm64 / rockchip / rk805.c
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3  *
4  * Copyright (c) 2018 Emmanuel Vadot <manu@FreeBSD.org>
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 #include <sys/cdefs.h>
29 __FBSDID("$FreeBSD$");
30
31 #include <sys/param.h>
32 #include <sys/bus.h>
33 #include <sys/kernel.h>
34 #include <sys/module.h>
35 #include <sys/mutex.h>
36 #include <sys/rman.h>
37 #include <machine/bus.h>
38
39 #include <dev/iicbus/iiconf.h>
40 #include <dev/iicbus/iicbus.h>
41
42 #include <dev/ofw/ofw_bus.h>
43 #include <dev/ofw/ofw_bus_subr.h>
44
45 #include <dev/extres/regulator/regulator.h>
46
47 #include <arm64/rockchip/rk805reg.h>
48
49 #include "regdev_if.h"
50
51 MALLOC_DEFINE(M_RK805_REG, "RK805 regulator", "RK805 power regulator");
52
53 /* #define      dprintf(sc, format, arg...)     device_printf(sc->base_dev, "%s: " format, __func__, arg) */
54 #define dprintf(sc, format, arg...)
55
56 enum rk_pmic_type {
57         RK805 = 1,
58         RK808,
59 };
60
61 static struct ofw_compat_data compat_data[] = {
62         {"rockchip,rk805", RK805},
63         {"rockchip,rk808", RK808},
64         {NULL,             0}
65 };
66
67 struct rk805_regdef {
68         intptr_t                id;
69         char                    *name;
70         uint8_t                 enable_reg;
71         uint8_t                 enable_mask;
72         uint8_t                 voltage_reg;
73         uint8_t                 voltage_mask;
74         int                     voltage_min;
75         int                     voltage_max;
76         int                     voltage_step;
77         int                     voltage_nstep;
78 };
79
80 struct rk805_reg_sc {
81         struct regnode          *regnode;
82         device_t                base_dev;
83         struct rk805_regdef     *def;
84         phandle_t               xref;
85         struct regnode_std_param *param;
86 };
87
88 struct rk805_softc {
89         device_t                dev;
90         struct mtx              mtx;
91         struct resource *       res[1];
92         void *                  intrcookie;
93         struct intr_config_hook intr_hook;
94         enum rk_pmic_type       type;
95
96         struct rk805_reg_sc     **regs;
97         int                     nregs;
98 };
99
100 static struct rk805_regdef rk805_regdefs[] = {
101         {
102                 .id = RK805_DCDC1,
103                 .name = "DCDC_REG1",
104                 .enable_reg = RK805_DCDC_EN,
105                 .enable_mask = 0x11,
106                 .voltage_reg = RK805_DCDC1_ON_VSEL,
107                 .voltage_mask = 0x3F,
108                 .voltage_min = 712500,
109                 .voltage_max = 1450000,
110                 .voltage_step = 12500,
111                 .voltage_nstep = 64,
112         },
113         {
114                 .id = RK805_DCDC2,
115                 .name = "DCDC_REG2",
116                 .enable_reg = RK805_DCDC_EN,
117                 .enable_mask = 0x22,
118                 .voltage_reg = RK805_DCDC2_ON_VSEL,
119                 .voltage_mask = 0x3F,
120                 .voltage_min = 712500,
121                 .voltage_max = 1450000,
122                 .voltage_step = 12500,
123                 .voltage_nstep = 64,
124         },
125         {
126                 .id = RK805_DCDC3,
127                 .name = "DCDC_REG3",
128                 .enable_reg = RK805_DCDC_EN,
129                 .enable_mask = 0x44,
130         },
131         {
132                 .id = RK805_DCDC4,
133                 .name = "DCDC_REG4",
134                 .enable_reg = RK805_DCDC_EN,
135                 .enable_mask = 0x88,
136                 .voltage_reg = RK805_DCDC4_ON_VSEL,
137                 .voltage_mask = 0x3F,
138                 .voltage_min = 800000,
139                 .voltage_max = 3500000,
140                 .voltage_step = 100000,
141                 .voltage_nstep = 28,
142         },
143         {
144                 .id = RK805_LDO1,
145                 .name = "LDO_REG1",
146                 .enable_reg = RK805_LDO_EN,
147                 .enable_mask = 0x11,
148                 .voltage_reg = RK805_LDO1_ON_VSEL,
149                 .voltage_mask = 0x1F,
150                 .voltage_min = 800000,
151                 .voltage_max = 3400000,
152                 .voltage_step = 100000,
153                 .voltage_nstep = 27,
154         },
155         {
156                 .id = RK805_LDO2,
157                 .name = "LDO_REG2",
158                 .enable_reg = RK805_LDO_EN,
159                 .enable_mask = 0x22,
160                 .voltage_reg = RK805_LDO2_ON_VSEL,
161                 .voltage_mask = 0x1F,
162                 .voltage_min = 800000,
163                 .voltage_max = 3400000,
164                 .voltage_step = 100000,
165                 .voltage_nstep = 27,
166         },
167         {
168                 .id = RK805_LDO3,
169                 .name = "LDO_REG3",
170                 .enable_reg = RK805_LDO_EN,
171                 .enable_mask = 0x44,
172                 .voltage_reg = RK805_LDO3_ON_VSEL,
173                 .voltage_mask = 0x1F,
174                 .voltage_min = 800000,
175                 .voltage_max = 3400000,
176                 .voltage_step = 100000,
177                 .voltage_nstep = 27,
178         },
179 };
180
181 static struct rk805_regdef rk808_regdefs[] = {
182         {
183                 .id = RK805_DCDC1,
184                 .name = "DCDC_REG1",
185                 .enable_reg = RK805_DCDC_EN,
186                 .enable_mask = 0x1,
187                 .voltage_reg = RK805_DCDC1_ON_VSEL,
188                 .voltage_mask = 0x3F,
189                 .voltage_min = 712500,
190                 .voltage_max = 1500000,
191                 .voltage_step = 12500,
192                 .voltage_nstep = 64,
193         },
194         {
195                 .id = RK805_DCDC2,
196                 .name = "DCDC_REG2",
197                 .enable_reg = RK805_DCDC_EN,
198                 .enable_mask = 0x2,
199                 .voltage_reg = RK805_DCDC2_ON_VSEL,
200                 .voltage_mask = 0x3F,
201                 .voltage_min = 712500,
202                 .voltage_max = 1500000,
203                 .voltage_step = 12500,
204                 .voltage_nstep = 64,
205         },
206         {
207                 .id = RK805_DCDC3,
208                 .name = "DCDC_REG3",
209                 .enable_reg = RK805_DCDC_EN,
210                 .enable_mask = 0x4,
211         },
212         {
213                 .id = RK805_DCDC4,
214                 .name = "DCDC_REG4",
215                 .enable_reg = RK805_DCDC_EN,
216                 .enable_mask = 0x8,
217                 .voltage_reg = RK805_DCDC4_ON_VSEL,
218                 .voltage_mask = 0xF,
219                 .voltage_min = 1800000,
220                 .voltage_max = 3300000,
221                 .voltage_step = 100000,
222                 .voltage_nstep = 16,
223         },
224         {
225                 .id = RK808_LDO1,
226                 .name = "LDO_REG1",
227                 .enable_reg = RK808_LDO_EN,
228                 .enable_mask = 0x1,
229                 .voltage_reg = RK805_LDO1_ON_VSEL,
230                 .voltage_mask = 0x1F,
231                 .voltage_min = 1800000,
232                 .voltage_max = 3400000,
233                 .voltage_step = 100000,
234                 .voltage_nstep = 17,
235         },
236         {
237                 .id = RK808_LDO2,
238                 .name = "LDO_REG2",
239                 .enable_reg = RK808_LDO_EN,
240                 .enable_mask = 0x2,
241                 .voltage_reg = RK805_LDO2_ON_VSEL,
242                 .voltage_mask = 0x1F,
243                 .voltage_min = 1800000,
244                 .voltage_max = 3400000,
245                 .voltage_step = 100000,
246                 .voltage_nstep = 17,
247         },
248         {
249                 .id = RK808_LDO3,
250                 .name = "LDO_REG3",
251                 .enable_reg = RK808_LDO_EN,
252                 .enable_mask = 0x4,
253                 .voltage_reg = RK805_LDO3_ON_VSEL,
254                 .voltage_mask = 0xF,
255                 .voltage_min = 800000,
256                 .voltage_max = 2500000,
257                 .voltage_step = 100000,
258                 .voltage_nstep = 18,
259         },
260         {
261                 .id = RK808_LDO4,
262                 .name = "LDO_REG4",
263                 .enable_reg = RK808_LDO_EN,
264                 .enable_mask = 0x8,
265                 .voltage_reg = RK808_LDO4_ON_VSEL,
266                 .voltage_mask = 0x1F,
267                 .voltage_min = 1800000,
268                 .voltage_max = 3400000,
269                 .voltage_step = 100000,
270                 .voltage_nstep = 17,
271         },
272         {
273                 .id = RK808_LDO5,
274                 .name = "LDO_REG5",
275                 .enable_reg = RK808_LDO_EN,
276                 .enable_mask = 0x10,
277                 .voltage_reg = RK808_LDO5_ON_VSEL,
278                 .voltage_mask = 0x1F,
279                 .voltage_min = 1800000,
280                 .voltage_max = 3400000,
281                 .voltage_step = 100000,
282                 .voltage_nstep = 17,
283         },
284         {
285                 .id = RK808_LDO6,
286                 .name = "LDO_REG6",
287                 .enable_reg = RK808_LDO_EN,
288                 .enable_mask = 0x20,
289                 .voltage_reg = RK808_LDO6_ON_VSEL,
290                 .voltage_mask = 0x1F,
291                 .voltage_min = 800000,
292                 .voltage_max = 2500000,
293                 .voltage_step = 100000,
294                 .voltage_nstep = 18,
295         },
296         {
297                 .id = RK808_LDO7,
298                 .name = "LDO_REG7",
299                 .enable_reg = RK808_LDO_EN,
300                 .enable_mask = 0x40,
301                 .voltage_reg = RK808_LDO7_ON_VSEL,
302                 .voltage_mask = 0x1F,
303                 .voltage_min = 800000,
304                 .voltage_max = 2500000,
305                 .voltage_step = 100000,
306                 .voltage_nstep = 18,
307         },
308         {
309                 .id = RK808_LDO8,
310                 .name = "LDO_REG8",
311                 .enable_reg = RK808_LDO_EN,
312                 .enable_mask = 0x80,
313                 .voltage_reg = RK808_LDO8_ON_VSEL,
314                 .voltage_mask = 0x1F,
315                 .voltage_min = 1800000,
316                 .voltage_max = 3400000,
317                 .voltage_step = 100000,
318                 .voltage_nstep = 17,
319         },
320         {
321                 .id = RK808_SWITCH1,
322                 .name = "SWITCH_REG1",
323                 .enable_reg = RK805_DCDC_EN,
324                 .enable_mask = 0x20,
325         },
326         {
327                 .id = RK808_SWITCH2,
328                 .name = "SWITCH_REG2",
329                 .enable_reg = RK805_DCDC_EN,
330                 .enable_mask = 0x40,
331         },
332 };
333
334 static int
335 rk805_read(device_t dev, uint8_t reg, uint8_t *data, uint8_t size)
336 {
337         int err;
338
339         err = iicdev_readfrom(dev, reg, data, size, IIC_INTRWAIT);
340         return (err);
341 }
342
343 static int
344 rk805_write(device_t dev, uint8_t reg, uint8_t data)
345 {
346         return (iicdev_writeto(dev, reg, &data, 1, IIC_INTRWAIT));
347 }
348
349 static int
350 rk805_regnode_init(struct regnode *regnode)
351 {
352         return (0);
353 }
354
355 static int
356 rk805_regnode_enable(struct regnode *regnode, bool enable, int *udelay)
357 {
358         struct rk805_reg_sc *sc;
359         uint8_t val;
360
361         sc = regnode_get_softc(regnode);
362
363         dprintf(sc, "%sabling regulator %s\n",
364             enable ? "En" : "Dis",
365             sc->def->name);
366         rk805_read(sc->base_dev, sc->def->enable_reg, &val, 1);
367         if (enable)
368                 val |= sc->def->enable_mask;
369         else
370                 val &= ~sc->def->enable_mask;
371         rk805_write(sc->base_dev, sc->def->enable_reg, val);
372
373         *udelay = 0;
374
375         return (0);
376 }
377
378 static void
379 rk805_regnode_reg_to_voltage(struct rk805_reg_sc *sc, uint8_t val, int *uv)
380 {
381         if (val < sc->def->voltage_nstep)
382                 *uv = sc->def->voltage_min + val * sc->def->voltage_step;
383         else
384                 *uv = sc->def->voltage_min +
385                        (sc->def->voltage_nstep * sc->def->voltage_step);
386 }
387
388 static int
389 rk805_regnode_voltage_to_reg(struct rk805_reg_sc *sc, int min_uvolt,
390     int max_uvolt, uint8_t *val)
391 {
392         uint8_t nval;
393         int nstep, uvolt;
394
395         nval = 0;
396         uvolt = sc->def->voltage_min;
397
398         for (nstep = 0; nstep < sc->def->voltage_nstep && uvolt < min_uvolt;
399              nstep++) {
400                 ++nval;
401                 uvolt += sc->def->voltage_step;
402         }
403         if (uvolt > max_uvolt)
404                 return (EINVAL);
405
406         *val = nval;
407         return (0);
408 }
409
410 static int
411 rk805_regnode_set_voltage(struct regnode *regnode, int min_uvolt,
412     int max_uvolt, int *udelay)
413 {
414         struct rk805_reg_sc *sc;
415         uint8_t val;
416         int uvolt;
417
418         sc = regnode_get_softc(regnode);
419
420         if (!sc->def->voltage_step)
421                 return (ENXIO);
422
423         dprintf(sc, "Setting %s to %d<->%d uvolts\n",
424             sc->def->name,
425             min_uvolt,
426             max_uvolt);
427         rk805_read(sc->base_dev, sc->def->voltage_reg, &val, 1);
428         if (rk805_regnode_voltage_to_reg(sc, min_uvolt, max_uvolt, &val) != 0)
429                 return (ERANGE);
430
431         rk805_write(sc->base_dev, sc->def->voltage_reg, val);
432
433         rk805_read(sc->base_dev, sc->def->voltage_reg, &val, 1);
434
435         *udelay = 0;
436
437         rk805_regnode_reg_to_voltage(sc, val, &uvolt);
438         dprintf(sc, "Regulator %s set to %d uvolt\n",
439           sc->def->name,
440           uvolt);
441
442         return (0);
443 }
444
445 static int
446 rk805_regnode_get_voltage(struct regnode *regnode, int *uvolt)
447 {
448         struct rk805_reg_sc *sc;
449         uint8_t val;
450
451         sc = regnode_get_softc(regnode);
452
453         if (!sc->def->voltage_step)
454                 return (ENXIO);
455
456         rk805_read(sc->base_dev, sc->def->voltage_reg, &val, 1);
457         rk805_regnode_reg_to_voltage(sc, val & sc->def->voltage_mask, uvolt);
458
459         dprintf(sc, "Regulator %s is at %d uvolt\n",
460           sc->def->name,
461           *uvolt);
462
463         return (0);
464 }
465
466 static regnode_method_t rk805_regnode_methods[] = {
467         /* Regulator interface */
468         REGNODEMETHOD(regnode_init,             rk805_regnode_init),
469         REGNODEMETHOD(regnode_enable,           rk805_regnode_enable),
470         REGNODEMETHOD(regnode_set_voltage,      rk805_regnode_set_voltage),
471         REGNODEMETHOD(regnode_get_voltage,      rk805_regnode_get_voltage),
472         REGNODEMETHOD(regnode_check_voltage,    regnode_method_check_voltage),
473         REGNODEMETHOD_END
474 };
475 DEFINE_CLASS_1(rk805_regnode, rk805_regnode_class, rk805_regnode_methods,
476     sizeof(struct rk805_reg_sc), regnode_class);
477
478 static struct rk805_reg_sc *
479 rk805_reg_attach(device_t dev, phandle_t node,
480     struct rk805_regdef *def)
481 {
482         struct rk805_reg_sc *reg_sc;
483         struct regnode_init_def initdef;
484         struct regnode *regnode;
485
486         memset(&initdef, 0, sizeof(initdef));
487         if (regulator_parse_ofw_stdparam(dev, node, &initdef) != 0) {
488                 device_printf(dev, "cannot create regulator\n");
489                 return (NULL);
490         }
491         if (initdef.std_param.min_uvolt == 0)
492                 initdef.std_param.min_uvolt = def->voltage_min;
493         if (initdef.std_param.max_uvolt == 0)
494                 initdef.std_param.max_uvolt = def->voltage_max;
495         initdef.id = def->id;
496         initdef.ofw_node = node;
497
498         regnode = regnode_create(dev, &rk805_regnode_class, &initdef);
499         if (regnode == NULL) {
500                 device_printf(dev, "cannot create regulator\n");
501                 return (NULL);
502         }
503
504         reg_sc = regnode_get_softc(regnode);
505         reg_sc->regnode = regnode;
506         reg_sc->base_dev = dev;
507         reg_sc->def = def;
508         reg_sc->xref = OF_xref_from_node(node);
509         reg_sc->param = regnode_get_stdparam(regnode);
510
511         regnode_register(regnode);
512
513         return (reg_sc);
514 }
515
516 static int
517 rk805_probe(device_t dev)
518 {
519         if (!ofw_bus_status_okay(dev))
520                 return (ENXIO);
521
522         if (ofw_bus_search_compatible(dev, compat_data)->ocd_data == 0)
523                 return (ENXIO);
524
525         device_set_desc(dev, "RockChip RK805 PMIC");
526         return (BUS_PROBE_DEFAULT);
527 }
528
529 static void
530 rk805_start(void *pdev)
531 {
532         struct rk805_softc *sc;
533         device_t dev;
534         uint8_t data[2];
535         int err;
536
537         dev = pdev;
538         sc = device_get_softc(dev);
539         sc->dev = dev;
540
541         /* No version register in RK808 */
542         if (bootverbose && sc->type == RK805) {
543                 err = rk805_read(dev, RK805_CHIP_NAME, data, 1);
544                 if (err != 0) {
545                         device_printf(dev, "Cannot read chip name reg\n");
546                         return;
547                 }
548                 err = rk805_read(dev, RK805_CHIP_VER, data + 1, 1);
549                 if (err != 0) {
550                         device_printf(dev, "Cannot read chip version reg\n");
551                         return;
552                 }
553                 device_printf(dev, "Chip Name: %x\n",
554                     data[0] << 4 | ((data[1] >> 4) & 0xf));
555                 device_printf(dev, "Chip Version: %x\n", data[1] & 0xf);
556         }
557
558         config_intrhook_disestablish(&sc->intr_hook);
559 }
560
561 static int
562 rk805_attach(device_t dev)
563 {
564         struct rk805_softc *sc;
565         struct rk805_reg_sc *reg;
566         struct rk805_regdef *regdefs;
567         phandle_t rnode, child;
568         int i;
569
570         sc = device_get_softc(dev);
571
572         sc->intr_hook.ich_func = rk805_start;
573         sc->intr_hook.ich_arg = dev;
574
575         if (config_intrhook_establish(&sc->intr_hook) != 0)
576                 return (ENOMEM);
577
578         sc->type = ofw_bus_search_compatible(dev, compat_data)->ocd_data;
579         switch (sc->type) {
580         case RK805:
581                 regdefs = rk805_regdefs;
582                 sc->nregs = nitems(rk805_regdefs);
583                 break;
584         case RK808:
585                 regdefs = rk808_regdefs;
586                 sc->nregs = nitems(rk808_regdefs);
587                 break;
588         default:
589                 device_printf(dev, "Unknown type %d\n", sc->type);
590                 return (ENXIO);
591         }
592
593         sc->regs = malloc(sizeof(struct rk805_reg_sc *) * sc->nregs,
594             M_RK805_REG, M_WAITOK | M_ZERO);
595
596         rnode = ofw_bus_find_child(ofw_bus_get_node(dev), "regulators");
597         if (rnode > 0) {
598                 for (i = 0; i < sc->nregs; i++) {
599                         child = ofw_bus_find_child(rnode,
600                             regdefs[i].name);
601                         if (child == 0)
602                                 continue;
603                         reg = rk805_reg_attach(dev, child, &regdefs[i]);
604                         if (reg == NULL) {
605                                 device_printf(dev,
606                                     "cannot attach regulator %s\n",
607                                     regdefs[i].name);
608                                 continue;
609                         }
610                         sc->regs[i] = reg;
611                         if (bootverbose)
612                                 device_printf(dev, "Regulator %s attached\n",
613                                     regdefs[i].name);
614                 }
615         }
616
617         return (0);
618 }
619
620 static int
621 rk805_detach(device_t dev)
622 {
623
624         /* We cannot detach regulators */
625         return (EBUSY);
626 }
627
628 static int
629 rk805_map(device_t dev, phandle_t xref, int ncells,
630     pcell_t *cells, intptr_t *id)
631 {
632         struct rk805_softc *sc;
633         int i;
634
635         sc = device_get_softc(dev);
636
637         for (i = 0; i < sc->nregs; i++) {
638                 if (sc->regs[i]->xref == xref) {
639                         *id = sc->regs[i]->def->id;
640                         return (0);
641                 }
642         }
643
644         return (ERANGE);
645 }
646
647 static device_method_t rk805_methods[] = {
648         DEVMETHOD(device_probe,         rk805_probe),
649         DEVMETHOD(device_attach,        rk805_attach),
650         DEVMETHOD(device_detach,        rk805_detach),
651
652         /* regdev interface */
653         DEVMETHOD(regdev_map,           rk805_map),
654         DEVMETHOD_END
655 };
656
657 static driver_t rk805_driver = {
658         "rk805_pmu",
659         rk805_methods,
660         sizeof(struct rk805_softc),
661 };
662
663 static devclass_t rk805_devclass;
664
665 EARLY_DRIVER_MODULE(rk805, iicbus, rk805_driver, rk805_devclass, 0, 0,
666     BUS_PASS_INTERRUPT + BUS_PASS_ORDER_LAST);
667 MODULE_DEPEND(rk805, iicbus, IICBUS_MINVER, IICBUS_PREFVER, IICBUS_MAXVER);
668 MODULE_VERSION(rk805, 1);