]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/arm64/rockchip/clk/rk3399_pmucru.c
Merge missed sources for lldb-specific TableGen tool.
[FreeBSD/FreeBSD.git] / sys / arm64 / rockchip / clk / rk3399_pmucru.c
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3  *
4  * Copyright (c) 2018 Emmanuel Vadot <manu@freebsd.org>
5  * Copyright (c) 2018 Greg V <greg@unrelenting.technology>
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26  * SUCH DAMAGE.
27  *
28  * $FreeBSD$
29  */
30
31 #include <sys/cdefs.h>
32 __FBSDID("$FreeBSD$");
33
34 #include <sys/param.h>
35 #include <sys/systm.h>
36 #include <sys/bus.h>
37 #include <sys/rman.h>
38 #include <sys/kernel.h>
39 #include <sys/module.h>
40 #include <machine/bus.h>
41
42 #include <dev/fdt/simplebus.h>
43
44 #include <dev/ofw/ofw_bus.h>
45 #include <dev/ofw/ofw_bus_subr.h>
46
47 #include <dev/extres/clk/clk_div.h>
48 #include <dev/extres/clk/clk_fixed.h>
49 #include <dev/extres/clk/clk_mux.h>
50
51 #include <arm64/rockchip/clk/rk_cru.h>
52
53 /* GATES */
54
55 #define PCLK_PMU                20
56 #define PCLK_GPIO0_PMU          23
57 #define PCLK_GPIO1_PMU          24
58 #define PCLK_I2C0_PMU           27
59 #define PCLK_I2C4_PMU           28
60 #define PCLK_I2C8_PMU           29
61
62 static struct rk_cru_gate rk3399_pmu_gates[] = {
63         /* PMUCRU_CLKGATE_CON1 */
64         CRU_GATE(PCLK_PMU, "pclk_pmu", "pclk_pmu_src", 0x104, 0)
65         CRU_GATE(PCLK_GPIO0_PMU, "pclk_gpio0_pmu", "pclk_pmu_src", 0x104, 3)
66         CRU_GATE(PCLK_GPIO1_PMU, "pclk_gpio1_pmu", "pclk_pmu_src", 0x104, 4)
67         CRU_GATE(PCLK_I2C0_PMU, "pclk_i2c0_pmu", "pclk_pmu_src", 0x104, 7)
68         CRU_GATE(PCLK_I2C4_PMU, "pclk_i2c4_pmu", "pclk_pmu_src", 0x104, 8)
69         CRU_GATE(PCLK_I2C8_PMU, "pclk_i2c8_pmu", "pclk_pmu_src", 0x104, 9)
70 };
71
72
73 /*
74  * PLLs
75  */
76
77 #define PLL_PPLL        1
78
79 static struct rk_clk_pll_rate rk3399_pll_rates[] = {
80         {
81                 .freq = 2208000000,
82                 .refdiv = 1,
83                 .fbdiv = 92,
84                 .postdiv1 = 1,
85                 .postdiv2 = 1,
86                 .dsmpd = 1,
87         },
88         {
89                 .freq = 2184000000,
90                 .refdiv = 1,
91                 .fbdiv = 91,
92                 .postdiv1 = 1,
93                 .postdiv2 = 1,
94                 .dsmpd = 1,
95         },
96         {
97                 .freq = 2160000000,
98                 .refdiv = 1,
99                 .fbdiv = 90,
100                 .postdiv1 = 1,
101                 .postdiv2 = 1,
102                 .dsmpd = 1,
103         },
104         {
105                 .freq = 2136000000,
106                 .refdiv = 1,
107                 .fbdiv = 89,
108                 .postdiv1 = 1,
109                 .postdiv2 = 1,
110                 .dsmpd = 1,
111         },
112         {
113                 .freq = 2112000000,
114                 .refdiv = 1,
115                 .fbdiv = 88,
116                 .postdiv1 = 1,
117                 .postdiv2 = 1,
118                 .dsmpd = 1,
119         },
120         {
121                 .freq = 2088000000,
122                 .refdiv = 1,
123                 .fbdiv = 87,
124                 .postdiv1 = 1,
125                 .postdiv2 = 1,
126                 .dsmpd = 1,
127         },
128         {
129                 .freq = 2064000000,
130                 .refdiv = 1,
131                 .fbdiv = 86,
132                 .postdiv1 = 1,
133                 .postdiv2 = 1,
134                 .dsmpd = 1,
135         },
136         {
137                 .freq = 2040000000,
138                 .refdiv = 1,
139                 .fbdiv = 85,
140                 .postdiv1 = 1,
141                 .postdiv2 = 1,
142                 .dsmpd = 1,
143         },
144         {
145                 .freq = 2016000000,
146                 .refdiv = 1,
147                 .fbdiv = 84,
148                 .postdiv1 = 1,
149                 .postdiv2 = 1,
150                 .dsmpd = 1,
151         },
152         {
153                 .freq = 1992000000,
154                 .refdiv = 1,
155                 .fbdiv = 83,
156                 .postdiv1 = 1,
157                 .postdiv2 = 1,
158                 .dsmpd = 1,
159         },
160         {
161                 .freq = 1968000000,
162                 .refdiv = 1,
163                 .fbdiv = 82,
164                 .postdiv1 = 1,
165                 .postdiv2 = 1,
166                 .dsmpd = 1,
167         },
168         {
169                 .freq = 1944000000,
170                 .refdiv = 1,
171                 .fbdiv = 81,
172                 .postdiv1 = 1,
173                 .postdiv2 = 1,
174                 .dsmpd = 1,
175         },
176         {
177                 .freq = 1920000000,
178                 .refdiv = 1,
179                 .fbdiv = 80,
180                 .postdiv1 = 1,
181                 .postdiv2 = 1,
182                 .dsmpd = 1,
183         },
184         {
185                 .freq = 1896000000,
186                 .refdiv = 1,
187                 .fbdiv = 79,
188                 .postdiv1 = 1,
189                 .postdiv2 = 1,
190                 .dsmpd = 1,
191         },
192         {
193                 .freq = 1872000000,
194                 .refdiv = 1,
195                 .fbdiv = 78,
196                 .postdiv1 = 1,
197                 .postdiv2 = 1,
198                 .dsmpd = 1,
199         },
200         {
201                 .freq = 1848000000,
202                 .refdiv = 1,
203                 .fbdiv = 77,
204                 .postdiv1 = 1,
205                 .postdiv2 = 1,
206                 .dsmpd = 1,
207         },
208         {
209                 .freq = 1824000000,
210                 .refdiv = 1,
211                 .fbdiv = 76,
212                 .postdiv1 = 1,
213                 .postdiv2 = 1,
214                 .dsmpd = 1,
215         },
216         {
217                 .freq = 1800000000,
218                 .refdiv = 1,
219                 .fbdiv = 75,
220                 .postdiv1 = 1,
221                 .postdiv2 = 1,
222                 .dsmpd = 1,
223         },
224         {
225                 .freq = 1776000000,
226                 .refdiv = 1,
227                 .fbdiv = 74,
228                 .postdiv1 = 1,
229                 .postdiv2 = 1,
230                 .dsmpd = 1,
231         },
232         {
233                 .freq = 1752000000,
234                 .refdiv = 1,
235                 .fbdiv = 73,
236                 .postdiv1 = 1,
237                 .postdiv2 = 1,
238                 .dsmpd = 1,
239         },
240         {
241                 .freq = 1728000000,
242                 .refdiv = 1,
243                 .fbdiv = 72,
244                 .postdiv1 = 1,
245                 .postdiv2 = 1,
246                 .dsmpd = 1,
247         },
248         {
249                 .freq = 1704000000,
250                 .refdiv = 1,
251                 .fbdiv = 71,
252                 .postdiv1 = 1,
253                 .postdiv2 = 1,
254                 .dsmpd = 1,
255         },
256         {
257                 .freq = 1680000000,
258                 .refdiv = 1,
259                 .fbdiv = 70,
260                 .postdiv1 = 1,
261                 .postdiv2 = 1,
262                 .dsmpd = 1,
263         },
264         {
265                 .freq = 1656000000,
266                 .refdiv = 1,
267                 .fbdiv = 69,
268                 .postdiv1 = 1,
269                 .postdiv2 = 1,
270                 .dsmpd = 1,
271         },
272         {
273                 .freq = 1632000000,
274                 .refdiv = 1,
275                 .fbdiv = 68,
276                 .postdiv1 = 1,
277                 .postdiv2 = 1,
278                 .dsmpd = 1,
279         },
280         {
281                 .freq = 1608000000,
282                 .refdiv = 1,
283                 .fbdiv = 67,
284                 .postdiv1 = 1,
285                 .postdiv2 = 1,
286                 .dsmpd = 1,
287         },
288         {
289                 .freq = 1600000000,
290                 .refdiv = 3,
291                 .fbdiv = 200,
292                 .postdiv1 = 1,
293                 .postdiv2 = 1,
294                 .dsmpd = 1,
295         },
296         {
297                 .freq = 1584000000,
298                 .refdiv = 1,
299                 .fbdiv = 66,
300                 .postdiv1 = 1,
301                 .postdiv2 = 1,
302                 .dsmpd = 1,
303         },
304         {
305                 .freq = 1560000000,
306                 .refdiv = 1,
307                 .fbdiv = 65,
308                 .postdiv1 = 1,
309                 .postdiv2 = 1,
310                 .dsmpd = 1,
311         },
312         {
313                 .freq = 1536000000,
314                 .refdiv = 1,
315                 .fbdiv = 64,
316                 .postdiv1 = 1,
317                 .postdiv2 = 1,
318                 .dsmpd = 1,
319         },
320         {
321                 .freq = 1512000000,
322                 .refdiv = 1,
323                 .fbdiv = 63,
324                 .postdiv1 = 1,
325                 .postdiv2 = 1,
326                 .dsmpd = 1,
327         },
328         {
329                 .freq = 1488000000,
330                 .refdiv = 1,
331                 .fbdiv = 62,
332                 .postdiv1 = 1,
333                 .postdiv2 = 1,
334                 .dsmpd = 1,
335         },
336         {
337                 .freq = 1464000000,
338                 .refdiv = 1,
339                 .fbdiv = 61,
340                 .postdiv1 = 1,
341                 .postdiv2 = 1,
342                 .dsmpd = 1,
343         },
344         {
345                 .freq = 1440000000,
346                 .refdiv = 1,
347                 .fbdiv = 60,
348                 .postdiv1 = 1,
349                 .postdiv2 = 1,
350                 .dsmpd = 1,
351         },
352         {
353                 .freq = 1416000000,
354                 .refdiv = 1,
355                 .fbdiv = 59,
356                 .postdiv1 = 1,
357                 .postdiv2 = 1,
358                 .dsmpd = 1,
359         },
360         {
361                 .freq = 1392000000,
362                 .refdiv = 1,
363                 .fbdiv = 58,
364                 .postdiv1 = 1,
365                 .postdiv2 = 1,
366                 .dsmpd = 1,
367         },
368         {
369                 .freq = 1368000000,
370                 .refdiv = 1,
371                 .fbdiv = 57,
372                 .postdiv1 = 1,
373                 .postdiv2 = 1,
374                 .dsmpd = 1,
375         },
376         {
377                 .freq = 1344000000,
378                 .refdiv = 1,
379                 .fbdiv = 56,
380                 .postdiv1 = 1,
381                 .postdiv2 = 1,
382                 .dsmpd = 1,
383         },
384         {
385                 .freq = 1320000000,
386                 .refdiv = 1,
387                 .fbdiv = 55,
388                 .postdiv1 = 1,
389                 .postdiv2 = 1,
390                 .dsmpd = 1,
391         },
392         {
393                 .freq = 1296000000,
394                 .refdiv = 1,
395                 .fbdiv = 54,
396                 .postdiv1 = 1,
397                 .postdiv2 = 1,
398                 .dsmpd = 1,
399         },
400         {
401                 .freq = 1272000000,
402                 .refdiv = 1,
403                 .fbdiv = 53,
404                 .postdiv1 = 1,
405                 .postdiv2 = 1,
406                 .dsmpd = 1,
407         },
408         {
409                 .freq = 1248000000,
410                 .refdiv = 1,
411                 .fbdiv = 52,
412                 .postdiv1 = 1,
413                 .postdiv2 = 1,
414                 .dsmpd = 1,
415         },
416         {
417                 .freq = 1200000000,
418                 .refdiv = 1,
419                 .fbdiv = 50,
420                 .postdiv1 = 1,
421                 .postdiv2 = 1,
422                 .dsmpd = 1,
423         },
424         {
425                 .freq = 1188000000,
426                 .refdiv = 2,
427                 .fbdiv = 99,
428                 .postdiv1 = 1,
429                 .postdiv2 = 1,
430                 .dsmpd = 1,
431         },
432         {
433                 .freq = 1104000000,
434                 .refdiv = 1,
435                 .fbdiv = 46,
436                 .postdiv1 = 1,
437                 .postdiv2 = 1,
438                 .dsmpd = 1,
439         },
440         {
441                 .freq = 1100000000,
442                 .refdiv = 12,
443                 .fbdiv = 550,
444                 .postdiv1 = 1,
445                 .postdiv2 = 1,
446                 .dsmpd = 1,
447         },
448         {
449                 .freq = 1008000000,
450                 .refdiv = 1,
451                 .fbdiv = 84,
452                 .postdiv1 = 2,
453                 .postdiv2 = 1,
454                 .dsmpd = 1,
455         },
456         {
457                 .freq = 1000000000,
458                 .refdiv = 1,
459                 .fbdiv = 125,
460                 .postdiv1 = 3,
461                 .postdiv2 = 1,
462                 .dsmpd = 1,
463         },
464         {
465                 .freq = 984000000,
466                 .refdiv = 1,
467                 .fbdiv = 82,
468                 .postdiv1 = 2,
469                 .postdiv2 = 1,
470                 .dsmpd = 1,
471         },
472         {
473                 .freq = 960000000,
474                 .refdiv = 1,
475                 .fbdiv = 80,
476                 .postdiv1 = 2,
477                 .postdiv2 = 1,
478                 .dsmpd = 1,
479         },
480         {
481                 .freq = 936000000,
482                 .refdiv = 1,
483                 .fbdiv = 78,
484                 .postdiv1 = 2,
485                 .postdiv2 = 1,
486                 .dsmpd = 1,
487         },
488         {
489                 .freq = 912000000,
490                 .refdiv = 1,
491                 .fbdiv = 76,
492                 .postdiv1 = 2,
493                 .postdiv2 = 1,
494                 .dsmpd = 1,
495         },
496         {
497                 .freq = 900000000,
498                 .refdiv = 4,
499                 .fbdiv = 300,
500                 .postdiv1 = 2,
501                 .postdiv2 = 1,
502                 .dsmpd = 1,
503         },
504         {
505                 .freq = 888000000,
506                 .refdiv = 1,
507                 .fbdiv = 74,
508                 .postdiv1 = 2,
509                 .postdiv2 = 1,
510                 .dsmpd = 1,
511         },
512         {
513                 .freq = 864000000,
514                 .refdiv = 1,
515                 .fbdiv = 72,
516                 .postdiv1 = 2,
517                 .postdiv2 = 1,
518                 .dsmpd = 1,
519         },
520         {
521                 .freq = 840000000,
522                 .refdiv = 1,
523                 .fbdiv = 70,
524                 .postdiv1 = 2,
525                 .postdiv2 = 1,
526                 .dsmpd = 1,
527         },
528         {
529                 .freq = 816000000,
530                 .refdiv = 1,
531                 .fbdiv = 68,
532                 .postdiv1 = 2,
533                 .postdiv2 = 1,
534                 .dsmpd = 1,
535         },
536         {
537                 .freq = 800000000,
538                 .refdiv = 1,
539                 .fbdiv = 100,
540                 .postdiv1 = 3,
541                 .postdiv2 = 1,
542                 .dsmpd = 1,
543         },
544         {
545                 .freq = 700000000,
546                 .refdiv = 6,
547                 .fbdiv = 350,
548                 .postdiv1 = 2,
549                 .postdiv2 = 1,
550                 .dsmpd = 1,
551         },
552         {
553                 .freq = 696000000,
554                 .refdiv = 1,
555                 .fbdiv = 58,
556                 .postdiv1 = 2,
557                 .postdiv2 = 1,
558                 .dsmpd = 1,
559         },
560         {
561                 .freq = 676000000,
562                 .refdiv = 3,
563                 .fbdiv = 169,
564                 .postdiv1 = 2,
565                 .postdiv2 = 1,
566                 .dsmpd = 1,
567         },
568         {
569                 .freq = 600000000,
570                 .refdiv = 1,
571                 .fbdiv = 75,
572                 .postdiv1 = 3,
573                 .postdiv2 = 1,
574                 .dsmpd = 1,
575         },
576         {
577                 .freq = 594000000,
578                 .refdiv = 1,
579                 .fbdiv = 99,
580                 .postdiv1 = 4,
581                 .postdiv2 = 1,
582                 .dsmpd = 1,
583         },
584         {
585                 .freq = 533250000,
586                 .refdiv = 8,
587                 .fbdiv = 711,
588                 .postdiv1 = 4,
589                 .postdiv2 = 1,
590                 .dsmpd = 1,
591         },
592         {
593                 .freq = 504000000,
594                 .refdiv = 1,
595                 .fbdiv = 63,
596                 .postdiv1 = 3,
597                 .postdiv2 = 1,
598                 .dsmpd = 1,
599         },
600         {
601                 .freq = 500000000,
602                 .refdiv = 6,
603                 .fbdiv = 250,
604                 .postdiv1 = 2,
605                 .postdiv2 = 1,
606                 .dsmpd = 1,
607         },
608         {
609                 .freq = 408000000,
610                 .refdiv = 1,
611                 .fbdiv = 68,
612                 .postdiv1 = 2,
613                 .postdiv2 = 2,
614                 .dsmpd = 1,
615         },
616         {
617                 .freq = 312000000,
618                 .refdiv = 1,
619                 .fbdiv = 52,
620                 .postdiv1 = 2,
621                 .postdiv2 = 2,
622                 .dsmpd = 1,
623         },
624         {
625                 .freq = 297000000,
626                 .refdiv = 1,
627                 .fbdiv = 99,
628                 .postdiv1 = 4,
629                 .postdiv2 = 2,
630                 .dsmpd = 1,
631         },
632         {
633                 .freq = 216000000,
634                 .refdiv = 1,
635                 .fbdiv = 72,
636                 .postdiv1 = 4,
637                 .postdiv2 = 2,
638                 .dsmpd = 1,
639         },
640         {
641                 .freq = 148500000,
642                 .refdiv = 1,
643                 .fbdiv = 99,
644                 .postdiv1 = 4,
645                 .postdiv2 = 4,
646                 .dsmpd = 1,
647         },
648         {
649                 .freq = 106500000,
650                 .refdiv = 1,
651                 .fbdiv = 71,
652                 .postdiv1 = 4,
653                 .postdiv2 = 4,
654                 .dsmpd = 1,
655         },
656         {
657                 .freq = 96000000,
658                 .refdiv = 1,
659                 .fbdiv = 64,
660                 .postdiv1 = 4,
661                 .postdiv2 = 4,
662                 .dsmpd = 1,
663         },
664         {
665                 .freq = 74250000,
666                 .refdiv = 2,
667                 .fbdiv = 99,
668                 .postdiv1 = 4,
669                 .postdiv2 = 4,
670                 .dsmpd = 1,
671         },
672         {
673                 .freq = 65000000,
674                 .refdiv = 1,
675                 .fbdiv = 65,
676                 .postdiv1 = 6,
677                 .postdiv2 = 4,
678                 .dsmpd = 1,
679         },
680         {
681                 .freq = 54000000,
682                 .refdiv = 1,
683                 .fbdiv = 54,
684                 .postdiv1 = 6,
685                 .postdiv2 = 4,
686                 .dsmpd = 1,
687         },
688         {
689                 .freq = 27000000,
690                 .refdiv = 1,
691                 .fbdiv = 27,
692                 .postdiv1 = 6,
693                 .postdiv2 = 4,
694                 .dsmpd = 1,
695         },
696         {},
697 };
698
699 static const char *pll_parents[] = {"xin24m"};
700
701 static struct rk_clk_pll_def ppll = {
702         .clkdef = {
703                 .id = PLL_PPLL,
704                 .name = "ppll",
705                 .parent_names = pll_parents,
706                 .parent_cnt = nitems(pll_parents),
707         },
708         .base_offset = 0x00,
709
710         .rates = rk3399_pll_rates,
711 };
712
713 static const char *pmu_parents[] = {"ppll"};
714
715 #define PCLK_PMU_SRC                    19
716
717 static struct rk_clk_composite_def pclk_pmu_src = {
718         .clkdef = {
719                 .id = PCLK_PMU_SRC,
720                 .name = "pclk_pmu_src",
721                 .parent_names = pmu_parents,
722                 .parent_cnt = nitems(pmu_parents),
723         },
724         /* PMUCRU_CLKSEL_CON0 */
725         .muxdiv_offset = 0x80,
726
727         .div_shift = 0,
728         .div_width = 5,
729 };
730
731
732 #define SCLK_I2C0_PMU   9
733 #define SCLK_I2C4_PMU   10
734 #define SCLK_I2C8_PMU   11
735
736 static struct rk_clk_composite_def i2c0 = {
737         .clkdef = {
738                 .id = SCLK_I2C0_PMU,
739                 .name = "clk_i2c0_pmu",
740                 .parent_names = pmu_parents,
741                 .parent_cnt = nitems(pmu_parents),
742         },
743         /* PMUCRU_CLKSEL_CON2 */
744         .muxdiv_offset = 0x88,
745
746         .div_shift = 0,
747         .div_width = 7,
748
749         /* PMUCRU_CLKGATE_CON0 */
750         .gate_offset = 0x100,
751         .gate_shift = 9,
752
753         .flags = RK_CLK_COMPOSITE_HAVE_GATE,
754 };
755
756 static struct rk_clk_composite_def i2c8 = {
757         .clkdef = {
758                 .id = SCLK_I2C8_PMU,
759                 .name = "clk_i2c8_pmu",
760                 .parent_names = pmu_parents,
761                 .parent_cnt = nitems(pmu_parents),
762         },
763         /* PMUCRU_CLKSEL_CON2 */
764         .muxdiv_offset = 0x88,
765
766         .div_shift = 8,
767         .div_width = 7,
768
769         /* PMUCRU_CLKGATE_CON0 */
770         .gate_offset = 0x100,
771         .gate_shift = 11,
772
773         .flags = RK_CLK_COMPOSITE_HAVE_GATE,
774 };
775
776 static struct rk_clk_composite_def i2c4 = {
777         .clkdef = {
778                 .id = SCLK_I2C4_PMU,
779                 .name = "clk_i2c4_pmu",
780                 .parent_names = pmu_parents,
781                 .parent_cnt = nitems(pmu_parents),
782         },
783         /* PMUCRU_CLKSEL_CON3 */
784         .muxdiv_offset = 0x8c,
785
786         .div_shift = 0,
787         .div_width = 7,
788
789         /* PMUCRU_CLKGATE_CON0 */
790         .gate_offset = 0x100,
791         .gate_shift = 10,
792
793         .flags = RK_CLK_COMPOSITE_HAVE_GATE,
794 };
795
796 static struct rk_clk rk3399_pmu_clks[] = {
797         {
798                 .type = RK3399_CLK_PLL,
799                 .clk.pll = &ppll
800         },
801
802         {
803                 .type = RK_CLK_COMPOSITE,
804                 .clk.composite = &pclk_pmu_src
805         },
806         {
807                 .type = RK_CLK_COMPOSITE,
808                 .clk.composite = &i2c0
809         },
810         {
811                 .type = RK_CLK_COMPOSITE,
812                 .clk.composite = &i2c4
813         },
814         {
815                 .type = RK_CLK_COMPOSITE,
816                 .clk.composite = &i2c8
817         },
818 };
819
820 static int
821 rk3399_pmucru_probe(device_t dev)
822 {
823
824         if (!ofw_bus_status_okay(dev))
825                 return (ENXIO);
826
827         if (ofw_bus_is_compatible(dev, "rockchip,rk3399-pmucru")) {
828                 device_set_desc(dev, "Rockchip RK3399 PMU Clock and Reset Unit");
829                 return (BUS_PROBE_DEFAULT);
830         }
831
832         return (ENXIO);
833 }
834
835 static int
836 rk3399_pmucru_attach(device_t dev)
837 {
838         struct rk_cru_softc *sc;
839
840         sc = device_get_softc(dev);
841         sc->dev = dev;
842
843         sc->gates = rk3399_pmu_gates;
844         sc->ngates = nitems(rk3399_pmu_gates);
845
846         sc->clks = rk3399_pmu_clks;
847         sc->nclks = nitems(rk3399_pmu_clks);
848
849         return (rk_cru_attach(dev));
850 }
851
852 static device_method_t rk3399_pmucru_methods[] = {
853         /* Device interface */
854         DEVMETHOD(device_probe,         rk3399_pmucru_probe),
855         DEVMETHOD(device_attach,        rk3399_pmucru_attach),
856
857         DEVMETHOD_END
858 };
859
860 static devclass_t rk3399_pmucru_devclass;
861
862 DEFINE_CLASS_1(rk3399_pmucru, rk3399_pmucru_driver, rk3399_pmucru_methods,
863   sizeof(struct rk_cru_softc), rk_cru_driver);
864
865 EARLY_DRIVER_MODULE(rk3399_pmucru, simplebus, rk3399_pmucru_driver,
866     rk3399_pmucru_devclass, 0, 0, BUS_PASS_BUS + BUS_PASS_ORDER_MIDDLE);