1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2015 Endless Mobile, Inc.
4 * Author: Carlo Caione <carlo@endlessm.com>
6 * Copyright (c) 2016 BayLibre, Inc.
7 * Michael Turquette <mturquette@baylibre.com>
10 #include <linux/clk.h>
11 #include <linux/clk-provider.h>
12 #include <linux/init.h>
13 #include <linux/mfd/syscon.h>
14 #include <linux/of_address.h>
15 #include <linux/reset-controller.h>
16 #include <linux/slab.h>
17 #include <linux/regmap.h>
20 #include "clk-regmap.h"
24 static DEFINE_SPINLOCK(meson_clk_lock
);
26 struct meson8b_clk_reset
{
27 struct reset_controller_dev reset
;
28 struct regmap
*regmap
;
31 static const struct pll_params_table sys_pll_params_table
[] = {
55 static struct clk_fixed_rate meson8b_xtal
= {
56 .fixed_rate
= 24000000,
57 .hw
.init
= &(struct clk_init_data
){
60 .ops
= &clk_fixed_rate_ops
,
64 static struct clk_regmap meson8b_fixed_pll_dco
= {
65 .data
= &(struct meson_clk_pll_data
){
67 .reg_off
= HHI_MPLL_CNTL
,
72 .reg_off
= HHI_MPLL_CNTL
,
77 .reg_off
= HHI_MPLL_CNTL
,
82 .reg_off
= HHI_MPLL_CNTL2
,
87 .reg_off
= HHI_MPLL_CNTL
,
92 .reg_off
= HHI_MPLL_CNTL
,
97 .hw
.init
= &(struct clk_init_data
){
98 .name
= "fixed_pll_dco",
99 .ops
= &meson_clk_pll_ro_ops
,
100 .parent_names
= (const char *[]){ "xtal" },
105 static struct clk_regmap meson8b_fixed_pll
= {
106 .data
= &(struct clk_regmap_div_data
){
107 .offset
= HHI_MPLL_CNTL
,
110 .flags
= CLK_DIVIDER_POWER_OF_TWO
,
112 .hw
.init
= &(struct clk_init_data
){
114 .ops
= &clk_regmap_divider_ro_ops
,
115 .parent_names
= (const char *[]){ "fixed_pll_dco" },
118 * This clock won't ever change at runtime so
119 * CLK_SET_RATE_PARENT is not required
124 static struct clk_regmap meson8b_hdmi_pll_dco
= {
125 .data
= &(struct meson_clk_pll_data
){
127 .reg_off
= HHI_VID_PLL_CNTL
,
132 .reg_off
= HHI_VID_PLL_CNTL
,
137 .reg_off
= HHI_VID_PLL_CNTL
,
142 .reg_off
= HHI_VID_PLL_CNTL2
,
147 .reg_off
= HHI_VID_PLL_CNTL
,
152 .reg_off
= HHI_VID_PLL_CNTL
,
157 .hw
.init
= &(struct clk_init_data
){
158 /* sometimes also called "HPLL" or "HPLL PLL" */
159 .name
= "hdmi_pll_dco",
160 .ops
= &meson_clk_pll_ro_ops
,
161 .parent_names
= (const char *[]){ "xtal" },
166 static struct clk_regmap meson8b_hdmi_pll_lvds_out
= {
167 .data
= &(struct clk_regmap_div_data
){
168 .offset
= HHI_VID_PLL_CNTL
,
171 .flags
= CLK_DIVIDER_POWER_OF_TWO
,
173 .hw
.init
= &(struct clk_init_data
){
174 .name
= "hdmi_pll_lvds_out",
175 .ops
= &clk_regmap_divider_ro_ops
,
176 .parent_names
= (const char *[]){ "hdmi_pll_dco" },
178 .flags
= CLK_SET_RATE_PARENT
,
182 static struct clk_regmap meson8b_hdmi_pll_hdmi_out
= {
183 .data
= &(struct clk_regmap_div_data
){
184 .offset
= HHI_VID_PLL_CNTL
,
187 .flags
= CLK_DIVIDER_POWER_OF_TWO
,
189 .hw
.init
= &(struct clk_init_data
){
190 .name
= "hdmi_pll_hdmi_out",
191 .ops
= &clk_regmap_divider_ro_ops
,
192 .parent_names
= (const char *[]){ "hdmi_pll_dco" },
194 .flags
= CLK_SET_RATE_PARENT
,
198 static struct clk_regmap meson8b_sys_pll_dco
= {
199 .data
= &(struct meson_clk_pll_data
){
201 .reg_off
= HHI_SYS_PLL_CNTL
,
206 .reg_off
= HHI_SYS_PLL_CNTL
,
211 .reg_off
= HHI_SYS_PLL_CNTL
,
216 .reg_off
= HHI_SYS_PLL_CNTL
,
221 .reg_off
= HHI_SYS_PLL_CNTL
,
225 .table
= sys_pll_params_table
,
227 .hw
.init
= &(struct clk_init_data
){
228 .name
= "sys_pll_dco",
229 .ops
= &meson_clk_pll_ops
,
230 .parent_names
= (const char *[]){ "xtal" },
235 static struct clk_regmap meson8b_sys_pll
= {
236 .data
= &(struct clk_regmap_div_data
){
237 .offset
= HHI_SYS_PLL_CNTL
,
240 .flags
= CLK_DIVIDER_POWER_OF_TWO
,
242 .hw
.init
= &(struct clk_init_data
){
244 .ops
= &clk_regmap_divider_ops
,
245 .parent_names
= (const char *[]){ "sys_pll_dco" },
247 .flags
= CLK_SET_RATE_PARENT
,
251 static struct clk_fixed_factor meson8b_fclk_div2_div
= {
254 .hw
.init
= &(struct clk_init_data
){
255 .name
= "fclk_div2_div",
256 .ops
= &clk_fixed_factor_ops
,
257 .parent_names
= (const char *[]){ "fixed_pll" },
262 static struct clk_regmap meson8b_fclk_div2
= {
263 .data
= &(struct clk_regmap_gate_data
){
264 .offset
= HHI_MPLL_CNTL6
,
267 .hw
.init
= &(struct clk_init_data
){
269 .ops
= &clk_regmap_gate_ops
,
270 .parent_names
= (const char *[]){ "fclk_div2_div" },
273 * FIXME: Ethernet with a RGMII PHYs is not working if
274 * fclk_div2 is disabled. it is currently unclear why this
275 * is. keep it enabled until the Ethernet driver knows how
276 * to manage this clock.
278 .flags
= CLK_IS_CRITICAL
,
282 static struct clk_fixed_factor meson8b_fclk_div3_div
= {
285 .hw
.init
= &(struct clk_init_data
){
286 .name
= "fclk_div3_div",
287 .ops
= &clk_fixed_factor_ops
,
288 .parent_names
= (const char *[]){ "fixed_pll" },
293 static struct clk_regmap meson8b_fclk_div3
= {
294 .data
= &(struct clk_regmap_gate_data
){
295 .offset
= HHI_MPLL_CNTL6
,
298 .hw
.init
= &(struct clk_init_data
){
300 .ops
= &clk_regmap_gate_ops
,
301 .parent_names
= (const char *[]){ "fclk_div3_div" },
306 static struct clk_fixed_factor meson8b_fclk_div4_div
= {
309 .hw
.init
= &(struct clk_init_data
){
310 .name
= "fclk_div4_div",
311 .ops
= &clk_fixed_factor_ops
,
312 .parent_names
= (const char *[]){ "fixed_pll" },
317 static struct clk_regmap meson8b_fclk_div4
= {
318 .data
= &(struct clk_regmap_gate_data
){
319 .offset
= HHI_MPLL_CNTL6
,
322 .hw
.init
= &(struct clk_init_data
){
324 .ops
= &clk_regmap_gate_ops
,
325 .parent_names
= (const char *[]){ "fclk_div4_div" },
330 static struct clk_fixed_factor meson8b_fclk_div5_div
= {
333 .hw
.init
= &(struct clk_init_data
){
334 .name
= "fclk_div5_div",
335 .ops
= &clk_fixed_factor_ops
,
336 .parent_names
= (const char *[]){ "fixed_pll" },
341 static struct clk_regmap meson8b_fclk_div5
= {
342 .data
= &(struct clk_regmap_gate_data
){
343 .offset
= HHI_MPLL_CNTL6
,
346 .hw
.init
= &(struct clk_init_data
){
348 .ops
= &clk_regmap_gate_ops
,
349 .parent_names
= (const char *[]){ "fclk_div5_div" },
354 static struct clk_fixed_factor meson8b_fclk_div7_div
= {
357 .hw
.init
= &(struct clk_init_data
){
358 .name
= "fclk_div7_div",
359 .ops
= &clk_fixed_factor_ops
,
360 .parent_names
= (const char *[]){ "fixed_pll" },
365 static struct clk_regmap meson8b_fclk_div7
= {
366 .data
= &(struct clk_regmap_gate_data
){
367 .offset
= HHI_MPLL_CNTL6
,
370 .hw
.init
= &(struct clk_init_data
){
372 .ops
= &clk_regmap_gate_ops
,
373 .parent_names
= (const char *[]){ "fclk_div7_div" },
378 static struct clk_regmap meson8b_mpll_prediv
= {
379 .data
= &(struct clk_regmap_div_data
){
380 .offset
= HHI_MPLL_CNTL5
,
384 .hw
.init
= &(struct clk_init_data
){
385 .name
= "mpll_prediv",
386 .ops
= &clk_regmap_divider_ro_ops
,
387 .parent_names
= (const char *[]){ "fixed_pll" },
392 static struct clk_regmap meson8b_mpll0_div
= {
393 .data
= &(struct meson_clk_mpll_data
){
395 .reg_off
= HHI_MPLL_CNTL7
,
400 .reg_off
= HHI_MPLL_CNTL7
,
405 .reg_off
= HHI_MPLL_CNTL7
,
410 .reg_off
= HHI_MPLL_CNTL
,
414 .lock
= &meson_clk_lock
,
416 .hw
.init
= &(struct clk_init_data
){
418 .ops
= &meson_clk_mpll_ops
,
419 .parent_names
= (const char *[]){ "mpll_prediv" },
424 static struct clk_regmap meson8b_mpll0
= {
425 .data
= &(struct clk_regmap_gate_data
){
426 .offset
= HHI_MPLL_CNTL7
,
429 .hw
.init
= &(struct clk_init_data
){
431 .ops
= &clk_regmap_gate_ops
,
432 .parent_names
= (const char *[]){ "mpll0_div" },
434 .flags
= CLK_SET_RATE_PARENT
,
438 static struct clk_regmap meson8b_mpll1_div
= {
439 .data
= &(struct meson_clk_mpll_data
){
441 .reg_off
= HHI_MPLL_CNTL8
,
446 .reg_off
= HHI_MPLL_CNTL8
,
451 .reg_off
= HHI_MPLL_CNTL8
,
455 .lock
= &meson_clk_lock
,
457 .hw
.init
= &(struct clk_init_data
){
459 .ops
= &meson_clk_mpll_ops
,
460 .parent_names
= (const char *[]){ "mpll_prediv" },
465 static struct clk_regmap meson8b_mpll1
= {
466 .data
= &(struct clk_regmap_gate_data
){
467 .offset
= HHI_MPLL_CNTL8
,
470 .hw
.init
= &(struct clk_init_data
){
472 .ops
= &clk_regmap_gate_ops
,
473 .parent_names
= (const char *[]){ "mpll1_div" },
475 .flags
= CLK_SET_RATE_PARENT
,
479 static struct clk_regmap meson8b_mpll2_div
= {
480 .data
= &(struct meson_clk_mpll_data
){
482 .reg_off
= HHI_MPLL_CNTL9
,
487 .reg_off
= HHI_MPLL_CNTL9
,
492 .reg_off
= HHI_MPLL_CNTL9
,
496 .lock
= &meson_clk_lock
,
498 .hw
.init
= &(struct clk_init_data
){
500 .ops
= &meson_clk_mpll_ops
,
501 .parent_names
= (const char *[]){ "mpll_prediv" },
506 static struct clk_regmap meson8b_mpll2
= {
507 .data
= &(struct clk_regmap_gate_data
){
508 .offset
= HHI_MPLL_CNTL9
,
511 .hw
.init
= &(struct clk_init_data
){
513 .ops
= &clk_regmap_gate_ops
,
514 .parent_names
= (const char *[]){ "mpll2_div" },
516 .flags
= CLK_SET_RATE_PARENT
,
520 static u32 mux_table_clk81
[] = { 6, 5, 7 };
521 static struct clk_regmap meson8b_mpeg_clk_sel
= {
522 .data
= &(struct clk_regmap_mux_data
){
523 .offset
= HHI_MPEG_CLK_CNTL
,
526 .table
= mux_table_clk81
,
528 .hw
.init
= &(struct clk_init_data
){
529 .name
= "mpeg_clk_sel",
530 .ops
= &clk_regmap_mux_ro_ops
,
532 * FIXME bits 14:12 selects from 8 possible parents:
533 * xtal, 1'b0 (wtf), fclk_div7, mpll_clkout1, mpll_clkout2,
534 * fclk_div4, fclk_div3, fclk_div5
536 .parent_names
= (const char *[]){ "fclk_div3", "fclk_div4",
542 static struct clk_regmap meson8b_mpeg_clk_div
= {
543 .data
= &(struct clk_regmap_div_data
){
544 .offset
= HHI_MPEG_CLK_CNTL
,
548 .hw
.init
= &(struct clk_init_data
){
549 .name
= "mpeg_clk_div",
550 .ops
= &clk_regmap_divider_ro_ops
,
551 .parent_names
= (const char *[]){ "mpeg_clk_sel" },
556 static struct clk_regmap meson8b_clk81
= {
557 .data
= &(struct clk_regmap_gate_data
){
558 .offset
= HHI_MPEG_CLK_CNTL
,
561 .hw
.init
= &(struct clk_init_data
){
563 .ops
= &clk_regmap_gate_ops
,
564 .parent_names
= (const char *[]){ "mpeg_clk_div" },
566 .flags
= CLK_IS_CRITICAL
,
570 static struct clk_regmap meson8b_cpu_in_sel
= {
571 .data
= &(struct clk_regmap_mux_data
){
572 .offset
= HHI_SYS_CPU_CLK_CNTL0
,
576 .hw
.init
= &(struct clk_init_data
){
577 .name
= "cpu_in_sel",
578 .ops
= &clk_regmap_mux_ops
,
579 .parent_names
= (const char *[]){ "xtal", "sys_pll" },
581 .flags
= (CLK_SET_RATE_PARENT
|
582 CLK_SET_RATE_NO_REPARENT
),
586 static struct clk_fixed_factor meson8b_cpu_in_div2
= {
589 .hw
.init
= &(struct clk_init_data
){
590 .name
= "cpu_in_div2",
591 .ops
= &clk_fixed_factor_ops
,
592 .parent_names
= (const char *[]){ "cpu_in_sel" },
594 .flags
= CLK_SET_RATE_PARENT
,
598 static struct clk_fixed_factor meson8b_cpu_in_div3
= {
601 .hw
.init
= &(struct clk_init_data
){
602 .name
= "cpu_in_div3",
603 .ops
= &clk_fixed_factor_ops
,
604 .parent_names
= (const char *[]){ "cpu_in_sel" },
606 .flags
= CLK_SET_RATE_PARENT
,
610 static const struct clk_div_table cpu_scale_table
[] = {
611 { .val
= 1, .div
= 4 },
612 { .val
= 2, .div
= 6 },
613 { .val
= 3, .div
= 8 },
614 { .val
= 4, .div
= 10 },
615 { .val
= 5, .div
= 12 },
616 { .val
= 6, .div
= 14 },
617 { .val
= 7, .div
= 16 },
618 { .val
= 8, .div
= 18 },
622 static struct clk_regmap meson8b_cpu_scale_div
= {
623 .data
= &(struct clk_regmap_div_data
){
624 .offset
= HHI_SYS_CPU_CLK_CNTL1
,
627 .table
= cpu_scale_table
,
628 .flags
= CLK_DIVIDER_ALLOW_ZERO
,
630 .hw
.init
= &(struct clk_init_data
){
631 .name
= "cpu_scale_div",
632 .ops
= &clk_regmap_divider_ops
,
633 .parent_names
= (const char *[]){ "cpu_in_sel" },
635 .flags
= CLK_SET_RATE_PARENT
,
639 static u32 mux_table_cpu_scale_out_sel
[] = { 0, 1, 3 };
640 static struct clk_regmap meson8b_cpu_scale_out_sel
= {
641 .data
= &(struct clk_regmap_mux_data
){
642 .offset
= HHI_SYS_CPU_CLK_CNTL0
,
645 .table
= mux_table_cpu_scale_out_sel
,
647 .hw
.init
= &(struct clk_init_data
){
648 .name
= "cpu_scale_out_sel",
649 .ops
= &clk_regmap_mux_ops
,
651 * NOTE: We are skipping the parent with value 0x2 (which is
652 * "cpu_in_div3") because it results in a duty cycle of 33%
653 * which makes the system unstable and can result in a lockup
654 * of the whole system.
656 .parent_names
= (const char *[]) { "cpu_in_sel",
660 .flags
= CLK_SET_RATE_PARENT
,
664 static struct clk_regmap meson8b_cpu_clk
= {
665 .data
= &(struct clk_regmap_mux_data
){
666 .offset
= HHI_SYS_CPU_CLK_CNTL0
,
670 .hw
.init
= &(struct clk_init_data
){
672 .ops
= &clk_regmap_mux_ops
,
673 .parent_names
= (const char *[]){ "xtal",
674 "cpu_scale_out_sel" },
676 .flags
= (CLK_SET_RATE_PARENT
|
677 CLK_SET_RATE_NO_REPARENT
|
682 static struct clk_regmap meson8b_nand_clk_sel
= {
683 .data
= &(struct clk_regmap_mux_data
){
684 .offset
= HHI_NAND_CLK_CNTL
,
687 .flags
= CLK_MUX_ROUND_CLOSEST
,
689 .hw
.init
= &(struct clk_init_data
){
690 .name
= "nand_clk_sel",
691 .ops
= &clk_regmap_mux_ops
,
692 /* FIXME all other parents are unknown: */
693 .parent_names
= (const char *[]){ "fclk_div4", "fclk_div3",
694 "fclk_div5", "fclk_div7", "xtal" },
696 .flags
= CLK_SET_RATE_PARENT
,
700 static struct clk_regmap meson8b_nand_clk_div
= {
701 .data
= &(struct clk_regmap_div_data
){
702 .offset
= HHI_NAND_CLK_CNTL
,
705 .flags
= CLK_DIVIDER_ROUND_CLOSEST
,
707 .hw
.init
= &(struct clk_init_data
){
708 .name
= "nand_clk_div",
709 .ops
= &clk_regmap_divider_ops
,
710 .parent_names
= (const char *[]){ "nand_clk_sel" },
712 .flags
= CLK_SET_RATE_PARENT
,
716 static struct clk_regmap meson8b_nand_clk_gate
= {
717 .data
= &(struct clk_regmap_gate_data
){
718 .offset
= HHI_NAND_CLK_CNTL
,
721 .hw
.init
= &(struct clk_init_data
){
722 .name
= "nand_clk_gate",
723 .ops
= &clk_regmap_gate_ops
,
724 .parent_names
= (const char *[]){ "nand_clk_div" },
726 .flags
= CLK_SET_RATE_PARENT
,
730 static struct clk_fixed_factor meson8b_cpu_clk_div2
= {
733 .hw
.init
= &(struct clk_init_data
){
734 .name
= "cpu_clk_div2",
735 .ops
= &clk_fixed_factor_ops
,
736 .parent_names
= (const char *[]){ "cpu_clk" },
741 static struct clk_fixed_factor meson8b_cpu_clk_div3
= {
744 .hw
.init
= &(struct clk_init_data
){
745 .name
= "cpu_clk_div3",
746 .ops
= &clk_fixed_factor_ops
,
747 .parent_names
= (const char *[]){ "cpu_clk" },
752 static struct clk_fixed_factor meson8b_cpu_clk_div4
= {
755 .hw
.init
= &(struct clk_init_data
){
756 .name
= "cpu_clk_div4",
757 .ops
= &clk_fixed_factor_ops
,
758 .parent_names
= (const char *[]){ "cpu_clk" },
763 static struct clk_fixed_factor meson8b_cpu_clk_div5
= {
766 .hw
.init
= &(struct clk_init_data
){
767 .name
= "cpu_clk_div5",
768 .ops
= &clk_fixed_factor_ops
,
769 .parent_names
= (const char *[]){ "cpu_clk" },
774 static struct clk_fixed_factor meson8b_cpu_clk_div6
= {
777 .hw
.init
= &(struct clk_init_data
){
778 .name
= "cpu_clk_div6",
779 .ops
= &clk_fixed_factor_ops
,
780 .parent_names
= (const char *[]){ "cpu_clk" },
785 static struct clk_fixed_factor meson8b_cpu_clk_div7
= {
788 .hw
.init
= &(struct clk_init_data
){
789 .name
= "cpu_clk_div7",
790 .ops
= &clk_fixed_factor_ops
,
791 .parent_names
= (const char *[]){ "cpu_clk" },
796 static struct clk_fixed_factor meson8b_cpu_clk_div8
= {
799 .hw
.init
= &(struct clk_init_data
){
800 .name
= "cpu_clk_div8",
801 .ops
= &clk_fixed_factor_ops
,
802 .parent_names
= (const char *[]){ "cpu_clk" },
807 static u32 mux_table_apb
[] = { 1, 2, 3, 4, 5, 6, 7 };
808 static struct clk_regmap meson8b_apb_clk_sel
= {
809 .data
= &(struct clk_regmap_mux_data
){
810 .offset
= HHI_SYS_CPU_CLK_CNTL1
,
813 .table
= mux_table_apb
,
815 .hw
.init
= &(struct clk_init_data
){
816 .name
= "apb_clk_sel",
817 .ops
= &clk_regmap_mux_ops
,
818 .parent_names
= (const char *[]){ "cpu_clk_div2",
829 static struct clk_regmap meson8b_apb_clk_gate
= {
830 .data
= &(struct clk_regmap_gate_data
){
831 .offset
= HHI_SYS_CPU_CLK_CNTL1
,
833 .flags
= CLK_GATE_SET_TO_DISABLE
,
835 .hw
.init
= &(struct clk_init_data
){
836 .name
= "apb_clk_dis",
837 .ops
= &clk_regmap_gate_ro_ops
,
838 .parent_names
= (const char *[]){ "apb_clk_sel" },
840 .flags
= CLK_SET_RATE_PARENT
,
844 static struct clk_regmap meson8b_periph_clk_sel
= {
845 .data
= &(struct clk_regmap_mux_data
){
846 .offset
= HHI_SYS_CPU_CLK_CNTL1
,
850 .hw
.init
= &(struct clk_init_data
){
851 .name
= "periph_clk_sel",
852 .ops
= &clk_regmap_mux_ops
,
853 .parent_names
= (const char *[]){ "cpu_clk_div2",
864 static struct clk_regmap meson8b_periph_clk_gate
= {
865 .data
= &(struct clk_regmap_gate_data
){
866 .offset
= HHI_SYS_CPU_CLK_CNTL1
,
868 .flags
= CLK_GATE_SET_TO_DISABLE
,
870 .hw
.init
= &(struct clk_init_data
){
871 .name
= "periph_clk_dis",
872 .ops
= &clk_regmap_gate_ro_ops
,
873 .parent_names
= (const char *[]){ "periph_clk_sel" },
875 .flags
= CLK_SET_RATE_PARENT
,
879 static u32 mux_table_axi
[] = { 1, 2, 3, 4, 5, 6, 7 };
880 static struct clk_regmap meson8b_axi_clk_sel
= {
881 .data
= &(struct clk_regmap_mux_data
){
882 .offset
= HHI_SYS_CPU_CLK_CNTL1
,
885 .table
= mux_table_axi
,
887 .hw
.init
= &(struct clk_init_data
){
888 .name
= "axi_clk_sel",
889 .ops
= &clk_regmap_mux_ops
,
890 .parent_names
= (const char *[]){ "cpu_clk_div2",
901 static struct clk_regmap meson8b_axi_clk_gate
= {
902 .data
= &(struct clk_regmap_gate_data
){
903 .offset
= HHI_SYS_CPU_CLK_CNTL1
,
905 .flags
= CLK_GATE_SET_TO_DISABLE
,
907 .hw
.init
= &(struct clk_init_data
){
908 .name
= "axi_clk_dis",
909 .ops
= &clk_regmap_gate_ro_ops
,
910 .parent_names
= (const char *[]){ "axi_clk_sel" },
912 .flags
= CLK_SET_RATE_PARENT
,
916 static struct clk_regmap meson8b_l2_dram_clk_sel
= {
917 .data
= &(struct clk_regmap_mux_data
){
918 .offset
= HHI_SYS_CPU_CLK_CNTL1
,
922 .hw
.init
= &(struct clk_init_data
){
923 .name
= "l2_dram_clk_sel",
924 .ops
= &clk_regmap_mux_ops
,
925 .parent_names
= (const char *[]){ "cpu_clk_div2",
936 static struct clk_regmap meson8b_l2_dram_clk_gate
= {
937 .data
= &(struct clk_regmap_gate_data
){
938 .offset
= HHI_SYS_CPU_CLK_CNTL1
,
940 .flags
= CLK_GATE_SET_TO_DISABLE
,
942 .hw
.init
= &(struct clk_init_data
){
943 .name
= "l2_dram_clk_dis",
944 .ops
= &clk_regmap_gate_ro_ops
,
945 .parent_names
= (const char *[]){ "l2_dram_clk_sel" },
947 .flags
= CLK_SET_RATE_PARENT
,
951 static struct clk_regmap meson8b_vid_pll_in_sel
= {
952 .data
= &(struct clk_regmap_mux_data
){
953 .offset
= HHI_VID_DIVIDER_CNTL
,
957 .hw
.init
= &(struct clk_init_data
){
958 .name
= "vid_pll_in_sel",
959 .ops
= &clk_regmap_mux_ro_ops
,
961 * TODO: depending on the SoC there is also a second parent:
963 * Meson8b: hdmi_pll_dco
966 .parent_names
= (const char *[]){ "hdmi_pll_dco" },
968 .flags
= CLK_SET_RATE_PARENT
,
972 static struct clk_regmap meson8b_vid_pll_in_en
= {
973 .data
= &(struct clk_regmap_gate_data
){
974 .offset
= HHI_VID_DIVIDER_CNTL
,
977 .hw
.init
= &(struct clk_init_data
){
978 .name
= "vid_pll_in_en",
979 .ops
= &clk_regmap_gate_ro_ops
,
980 .parent_names
= (const char *[]){ "vid_pll_in_sel" },
982 .flags
= CLK_SET_RATE_PARENT
,
986 static struct clk_regmap meson8b_vid_pll_pre_div
= {
987 .data
= &(struct clk_regmap_div_data
){
988 .offset
= HHI_VID_DIVIDER_CNTL
,
992 .hw
.init
= &(struct clk_init_data
){
993 .name
= "vid_pll_pre_div",
994 .ops
= &clk_regmap_divider_ro_ops
,
995 .parent_names
= (const char *[]){ "vid_pll_in_en" },
997 .flags
= CLK_SET_RATE_PARENT
,
1001 static struct clk_regmap meson8b_vid_pll_post_div
= {
1002 .data
= &(struct clk_regmap_div_data
){
1003 .offset
= HHI_VID_DIVIDER_CNTL
,
1007 .hw
.init
= &(struct clk_init_data
){
1008 .name
= "vid_pll_post_div",
1009 .ops
= &clk_regmap_divider_ro_ops
,
1010 .parent_names
= (const char *[]){ "vid_pll_pre_div" },
1012 .flags
= CLK_SET_RATE_PARENT
,
1016 static struct clk_regmap meson8b_vid_pll
= {
1017 .data
= &(struct clk_regmap_mux_data
){
1018 .offset
= HHI_VID_DIVIDER_CNTL
,
1022 .hw
.init
= &(struct clk_init_data
){
1024 .ops
= &clk_regmap_mux_ro_ops
,
1025 /* TODO: parent 0x2 is vid_pll_pre_div_mult7_div2 */
1026 .parent_names
= (const char *[]){ "vid_pll_pre_div",
1027 "vid_pll_post_div" },
1029 .flags
= CLK_SET_RATE_PARENT
,
1033 static struct clk_regmap meson8b_vid_pll_final_div
= {
1034 .data
= &(struct clk_regmap_div_data
){
1035 .offset
= HHI_VID_CLK_DIV
,
1039 .hw
.init
= &(struct clk_init_data
){
1040 .name
= "vid_pll_final_div",
1041 .ops
= &clk_regmap_divider_ro_ops
,
1042 .parent_names
= (const char *[]){ "vid_pll" },
1044 .flags
= CLK_SET_RATE_PARENT
,
1048 static const char * const meson8b_vclk_mux_parents
[] = {
1049 "vid_pll_final_div", "fclk_div4", "fclk_div3", "fclk_div5",
1050 "vid_pll_final_div", "fclk_div7", "mpll1"
1053 static struct clk_regmap meson8b_vclk_in_sel
= {
1054 .data
= &(struct clk_regmap_mux_data
){
1055 .offset
= HHI_VID_CLK_CNTL
,
1059 .hw
.init
= &(struct clk_init_data
){
1060 .name
= "vclk_in_sel",
1061 .ops
= &clk_regmap_mux_ro_ops
,
1062 .parent_names
= meson8b_vclk_mux_parents
,
1063 .num_parents
= ARRAY_SIZE(meson8b_vclk_mux_parents
),
1064 .flags
= CLK_SET_RATE_PARENT
,
1068 static struct clk_regmap meson8b_vclk_in_en
= {
1069 .data
= &(struct clk_regmap_gate_data
){
1070 .offset
= HHI_VID_CLK_DIV
,
1073 .hw
.init
= &(struct clk_init_data
){
1074 .name
= "vclk_in_en",
1075 .ops
= &clk_regmap_gate_ro_ops
,
1076 .parent_names
= (const char *[]){ "vclk_in_sel" },
1078 .flags
= CLK_SET_RATE_PARENT
,
1082 static struct clk_regmap meson8b_vclk_div1_gate
= {
1083 .data
= &(struct clk_regmap_gate_data
){
1084 .offset
= HHI_VID_CLK_DIV
,
1087 .hw
.init
= &(struct clk_init_data
){
1088 .name
= "vclk_div1_en",
1089 .ops
= &clk_regmap_gate_ro_ops
,
1090 .parent_names
= (const char *[]){ "vclk_in_en" },
1092 .flags
= CLK_SET_RATE_PARENT
,
1096 static struct clk_fixed_factor meson8b_vclk_div2_div
= {
1099 .hw
.init
= &(struct clk_init_data
){
1100 .name
= "vclk_div2",
1101 .ops
= &clk_fixed_factor_ops
,
1102 .parent_names
= (const char *[]){ "vclk_in_en" },
1104 .flags
= CLK_SET_RATE_PARENT
,
1108 static struct clk_regmap meson8b_vclk_div2_div_gate
= {
1109 .data
= &(struct clk_regmap_gate_data
){
1110 .offset
= HHI_VID_CLK_DIV
,
1113 .hw
.init
= &(struct clk_init_data
){
1114 .name
= "vclk_div2_en",
1115 .ops
= &clk_regmap_gate_ro_ops
,
1116 .parent_names
= (const char *[]){ "vclk_div2" },
1118 .flags
= CLK_SET_RATE_PARENT
,
1122 static struct clk_fixed_factor meson8b_vclk_div4_div
= {
1125 .hw
.init
= &(struct clk_init_data
){
1126 .name
= "vclk_div4",
1127 .ops
= &clk_fixed_factor_ops
,
1128 .parent_names
= (const char *[]){ "vclk_in_en" },
1130 .flags
= CLK_SET_RATE_PARENT
,
1134 static struct clk_regmap meson8b_vclk_div4_div_gate
= {
1135 .data
= &(struct clk_regmap_gate_data
){
1136 .offset
= HHI_VID_CLK_DIV
,
1139 .hw
.init
= &(struct clk_init_data
){
1140 .name
= "vclk_div4_en",
1141 .ops
= &clk_regmap_gate_ro_ops
,
1142 .parent_names
= (const char *[]){ "vclk_div4" },
1144 .flags
= CLK_SET_RATE_PARENT
,
1148 static struct clk_fixed_factor meson8b_vclk_div6_div
= {
1151 .hw
.init
= &(struct clk_init_data
){
1152 .name
= "vclk_div6",
1153 .ops
= &clk_fixed_factor_ops
,
1154 .parent_names
= (const char *[]){ "vclk_in_en" },
1156 .flags
= CLK_SET_RATE_PARENT
,
1160 static struct clk_regmap meson8b_vclk_div6_div_gate
= {
1161 .data
= &(struct clk_regmap_gate_data
){
1162 .offset
= HHI_VID_CLK_DIV
,
1165 .hw
.init
= &(struct clk_init_data
){
1166 .name
= "vclk_div6_en",
1167 .ops
= &clk_regmap_gate_ro_ops
,
1168 .parent_names
= (const char *[]){ "vclk_div6" },
1170 .flags
= CLK_SET_RATE_PARENT
,
1174 static struct clk_fixed_factor meson8b_vclk_div12_div
= {
1177 .hw
.init
= &(struct clk_init_data
){
1178 .name
= "vclk_div12",
1179 .ops
= &clk_fixed_factor_ops
,
1180 .parent_names
= (const char *[]){ "vclk_in_en" },
1182 .flags
= CLK_SET_RATE_PARENT
,
1186 static struct clk_regmap meson8b_vclk_div12_div_gate
= {
1187 .data
= &(struct clk_regmap_gate_data
){
1188 .offset
= HHI_VID_CLK_DIV
,
1191 .hw
.init
= &(struct clk_init_data
){
1192 .name
= "vclk_div12_en",
1193 .ops
= &clk_regmap_gate_ro_ops
,
1194 .parent_names
= (const char *[]){ "vclk_div12" },
1196 .flags
= CLK_SET_RATE_PARENT
,
1200 static struct clk_regmap meson8b_vclk2_in_sel
= {
1201 .data
= &(struct clk_regmap_mux_data
){
1202 .offset
= HHI_VIID_CLK_CNTL
,
1206 .hw
.init
= &(struct clk_init_data
){
1207 .name
= "vclk2_in_sel",
1208 .ops
= &clk_regmap_mux_ro_ops
,
1209 .parent_names
= meson8b_vclk_mux_parents
,
1210 .num_parents
= ARRAY_SIZE(meson8b_vclk_mux_parents
),
1211 .flags
= CLK_SET_RATE_PARENT
,
1215 static struct clk_regmap meson8b_vclk2_clk_in_en
= {
1216 .data
= &(struct clk_regmap_gate_data
){
1217 .offset
= HHI_VIID_CLK_DIV
,
1220 .hw
.init
= &(struct clk_init_data
){
1221 .name
= "vclk2_in_en",
1222 .ops
= &clk_regmap_gate_ro_ops
,
1223 .parent_names
= (const char *[]){ "vclk2_in_sel" },
1225 .flags
= CLK_SET_RATE_PARENT
,
1229 static struct clk_regmap meson8b_vclk2_div1_gate
= {
1230 .data
= &(struct clk_regmap_gate_data
){
1231 .offset
= HHI_VIID_CLK_DIV
,
1234 .hw
.init
= &(struct clk_init_data
){
1235 .name
= "vclk2_div1_en",
1236 .ops
= &clk_regmap_gate_ro_ops
,
1237 .parent_names
= (const char *[]){ "vclk2_in_en" },
1239 .flags
= CLK_SET_RATE_PARENT
,
1243 static struct clk_fixed_factor meson8b_vclk2_div2_div
= {
1246 .hw
.init
= &(struct clk_init_data
){
1247 .name
= "vclk2_div2",
1248 .ops
= &clk_fixed_factor_ops
,
1249 .parent_names
= (const char *[]){ "vclk2_in_en" },
1251 .flags
= CLK_SET_RATE_PARENT
,
1255 static struct clk_regmap meson8b_vclk2_div2_div_gate
= {
1256 .data
= &(struct clk_regmap_gate_data
){
1257 .offset
= HHI_VIID_CLK_DIV
,
1260 .hw
.init
= &(struct clk_init_data
){
1261 .name
= "vclk2_div2_en",
1262 .ops
= &clk_regmap_gate_ro_ops
,
1263 .parent_names
= (const char *[]){ "vclk2_div2" },
1265 .flags
= CLK_SET_RATE_PARENT
,
1269 static struct clk_fixed_factor meson8b_vclk2_div4_div
= {
1272 .hw
.init
= &(struct clk_init_data
){
1273 .name
= "vclk2_div4",
1274 .ops
= &clk_fixed_factor_ops
,
1275 .parent_names
= (const char *[]){ "vclk2_in_en" },
1277 .flags
= CLK_SET_RATE_PARENT
,
1281 static struct clk_regmap meson8b_vclk2_div4_div_gate
= {
1282 .data
= &(struct clk_regmap_gate_data
){
1283 .offset
= HHI_VIID_CLK_DIV
,
1286 .hw
.init
= &(struct clk_init_data
){
1287 .name
= "vclk2_div4_en",
1288 .ops
= &clk_regmap_gate_ro_ops
,
1289 .parent_names
= (const char *[]){ "vclk2_div4" },
1291 .flags
= CLK_SET_RATE_PARENT
,
1295 static struct clk_fixed_factor meson8b_vclk2_div6_div
= {
1298 .hw
.init
= &(struct clk_init_data
){
1299 .name
= "vclk2_div6",
1300 .ops
= &clk_fixed_factor_ops
,
1301 .parent_names
= (const char *[]){ "vclk2_in_en" },
1303 .flags
= CLK_SET_RATE_PARENT
,
1307 static struct clk_regmap meson8b_vclk2_div6_div_gate
= {
1308 .data
= &(struct clk_regmap_gate_data
){
1309 .offset
= HHI_VIID_CLK_DIV
,
1312 .hw
.init
= &(struct clk_init_data
){
1313 .name
= "vclk2_div6_en",
1314 .ops
= &clk_regmap_gate_ro_ops
,
1315 .parent_names
= (const char *[]){ "vclk2_div6" },
1317 .flags
= CLK_SET_RATE_PARENT
,
1321 static struct clk_fixed_factor meson8b_vclk2_div12_div
= {
1324 .hw
.init
= &(struct clk_init_data
){
1325 .name
= "vclk2_div12",
1326 .ops
= &clk_fixed_factor_ops
,
1327 .parent_names
= (const char *[]){ "vclk2_in_en" },
1329 .flags
= CLK_SET_RATE_PARENT
,
1333 static struct clk_regmap meson8b_vclk2_div12_div_gate
= {
1334 .data
= &(struct clk_regmap_gate_data
){
1335 .offset
= HHI_VIID_CLK_DIV
,
1338 .hw
.init
= &(struct clk_init_data
){
1339 .name
= "vclk2_div12_en",
1340 .ops
= &clk_regmap_gate_ro_ops
,
1341 .parent_names
= (const char *[]){ "vclk2_div12" },
1343 .flags
= CLK_SET_RATE_PARENT
,
1347 static const char * const meson8b_vclk_enc_mux_parents
[] = {
1348 "vclk_div1_en", "vclk_div2_en", "vclk_div4_en", "vclk_div6_en",
1352 static struct clk_regmap meson8b_cts_enct_sel
= {
1353 .data
= &(struct clk_regmap_mux_data
){
1354 .offset
= HHI_VID_CLK_DIV
,
1358 .hw
.init
= &(struct clk_init_data
){
1359 .name
= "cts_enct_sel",
1360 .ops
= &clk_regmap_mux_ro_ops
,
1361 .parent_names
= meson8b_vclk_enc_mux_parents
,
1362 .num_parents
= ARRAY_SIZE(meson8b_vclk_enc_mux_parents
),
1363 .flags
= CLK_SET_RATE_PARENT
,
1367 static struct clk_regmap meson8b_cts_enct
= {
1368 .data
= &(struct clk_regmap_gate_data
){
1369 .offset
= HHI_VID_CLK_CNTL2
,
1372 .hw
.init
= &(struct clk_init_data
){
1374 .ops
= &clk_regmap_gate_ro_ops
,
1375 .parent_names
= (const char *[]){ "cts_enct_sel" },
1377 .flags
= CLK_SET_RATE_PARENT
,
1381 static struct clk_regmap meson8b_cts_encp_sel
= {
1382 .data
= &(struct clk_regmap_mux_data
){
1383 .offset
= HHI_VID_CLK_DIV
,
1387 .hw
.init
= &(struct clk_init_data
){
1388 .name
= "cts_encp_sel",
1389 .ops
= &clk_regmap_mux_ro_ops
,
1390 .parent_names
= meson8b_vclk_enc_mux_parents
,
1391 .num_parents
= ARRAY_SIZE(meson8b_vclk_enc_mux_parents
),
1392 .flags
= CLK_SET_RATE_PARENT
,
1396 static struct clk_regmap meson8b_cts_encp
= {
1397 .data
= &(struct clk_regmap_gate_data
){
1398 .offset
= HHI_VID_CLK_CNTL2
,
1401 .hw
.init
= &(struct clk_init_data
){
1403 .ops
= &clk_regmap_gate_ro_ops
,
1404 .parent_names
= (const char *[]){ "cts_encp_sel" },
1406 .flags
= CLK_SET_RATE_PARENT
,
1410 static struct clk_regmap meson8b_cts_enci_sel
= {
1411 .data
= &(struct clk_regmap_mux_data
){
1412 .offset
= HHI_VID_CLK_DIV
,
1416 .hw
.init
= &(struct clk_init_data
){
1417 .name
= "cts_enci_sel",
1418 .ops
= &clk_regmap_mux_ro_ops
,
1419 .parent_names
= meson8b_vclk_enc_mux_parents
,
1420 .num_parents
= ARRAY_SIZE(meson8b_vclk_enc_mux_parents
),
1421 .flags
= CLK_SET_RATE_PARENT
,
1425 static struct clk_regmap meson8b_cts_enci
= {
1426 .data
= &(struct clk_regmap_gate_data
){
1427 .offset
= HHI_VID_CLK_CNTL2
,
1430 .hw
.init
= &(struct clk_init_data
){
1432 .ops
= &clk_regmap_gate_ro_ops
,
1433 .parent_names
= (const char *[]){ "cts_enci_sel" },
1435 .flags
= CLK_SET_RATE_PARENT
,
1439 static struct clk_regmap meson8b_hdmi_tx_pixel_sel
= {
1440 .data
= &(struct clk_regmap_mux_data
){
1441 .offset
= HHI_HDMI_CLK_CNTL
,
1445 .hw
.init
= &(struct clk_init_data
){
1446 .name
= "hdmi_tx_pixel_sel",
1447 .ops
= &clk_regmap_mux_ro_ops
,
1448 .parent_names
= meson8b_vclk_enc_mux_parents
,
1449 .num_parents
= ARRAY_SIZE(meson8b_vclk_enc_mux_parents
),
1450 .flags
= CLK_SET_RATE_PARENT
,
1454 static struct clk_regmap meson8b_hdmi_tx_pixel
= {
1455 .data
= &(struct clk_regmap_gate_data
){
1456 .offset
= HHI_VID_CLK_CNTL2
,
1459 .hw
.init
= &(struct clk_init_data
){
1460 .name
= "hdmi_tx_pixel",
1461 .ops
= &clk_regmap_gate_ro_ops
,
1462 .parent_names
= (const char *[]){ "hdmi_tx_pixel_sel" },
1464 .flags
= CLK_SET_RATE_PARENT
,
1468 static const char * const meson8b_vclk2_enc_mux_parents
[] = {
1469 "vclk2_div1_en", "vclk2_div2_en", "vclk2_div4_en", "vclk2_div6_en",
1473 static struct clk_regmap meson8b_cts_encl_sel
= {
1474 .data
= &(struct clk_regmap_mux_data
){
1475 .offset
= HHI_VIID_CLK_DIV
,
1479 .hw
.init
= &(struct clk_init_data
){
1480 .name
= "cts_encl_sel",
1481 .ops
= &clk_regmap_mux_ro_ops
,
1482 .parent_names
= meson8b_vclk2_enc_mux_parents
,
1483 .num_parents
= ARRAY_SIZE(meson8b_vclk2_enc_mux_parents
),
1484 .flags
= CLK_SET_RATE_PARENT
,
1488 static struct clk_regmap meson8b_cts_encl
= {
1489 .data
= &(struct clk_regmap_gate_data
){
1490 .offset
= HHI_VID_CLK_CNTL2
,
1493 .hw
.init
= &(struct clk_init_data
){
1495 .ops
= &clk_regmap_gate_ro_ops
,
1496 .parent_names
= (const char *[]){ "cts_encl_sel" },
1498 .flags
= CLK_SET_RATE_PARENT
,
1502 static struct clk_regmap meson8b_cts_vdac0_sel
= {
1503 .data
= &(struct clk_regmap_mux_data
){
1504 .offset
= HHI_VIID_CLK_DIV
,
1508 .hw
.init
= &(struct clk_init_data
){
1509 .name
= "cts_vdac0_sel",
1510 .ops
= &clk_regmap_mux_ro_ops
,
1511 .parent_names
= meson8b_vclk2_enc_mux_parents
,
1512 .num_parents
= ARRAY_SIZE(meson8b_vclk2_enc_mux_parents
),
1513 .flags
= CLK_SET_RATE_PARENT
,
1517 static struct clk_regmap meson8b_cts_vdac0
= {
1518 .data
= &(struct clk_regmap_gate_data
){
1519 .offset
= HHI_VID_CLK_CNTL2
,
1522 .hw
.init
= &(struct clk_init_data
){
1523 .name
= "cts_vdac0",
1524 .ops
= &clk_regmap_gate_ro_ops
,
1525 .parent_names
= (const char *[]){ "cts_vdac0_sel" },
1527 .flags
= CLK_SET_RATE_PARENT
,
1531 static struct clk_regmap meson8b_hdmi_sys_sel
= {
1532 .data
= &(struct clk_regmap_mux_data
){
1533 .offset
= HHI_HDMI_CLK_CNTL
,
1536 .flags
= CLK_MUX_ROUND_CLOSEST
,
1538 .hw
.init
= &(struct clk_init_data
){
1539 .name
= "hdmi_sys_sel",
1540 .ops
= &clk_regmap_mux_ro_ops
,
1541 /* FIXME: all other parents are unknown */
1542 .parent_names
= (const char *[]){ "xtal" },
1544 .flags
= CLK_SET_RATE_NO_REPARENT
,
1548 static struct clk_regmap meson8b_hdmi_sys_div
= {
1549 .data
= &(struct clk_regmap_div_data
){
1550 .offset
= HHI_HDMI_CLK_CNTL
,
1554 .hw
.init
= &(struct clk_init_data
){
1555 .name
= "hdmi_sys_div",
1556 .ops
= &clk_regmap_divider_ro_ops
,
1557 .parent_names
= (const char *[]){ "hdmi_sys_sel" },
1559 .flags
= CLK_SET_RATE_PARENT
,
1563 static struct clk_regmap meson8b_hdmi_sys
= {
1564 .data
= &(struct clk_regmap_gate_data
){
1565 .offset
= HHI_HDMI_CLK_CNTL
,
1568 .hw
.init
= &(struct clk_init_data
) {
1570 .ops
= &clk_regmap_gate_ro_ops
,
1571 .parent_names
= (const char *[]){ "hdmi_sys_div" },
1573 .flags
= CLK_SET_RATE_PARENT
,
1578 * The MALI IP is clocked by two identical clocks (mali_0 and mali_1)
1579 * muxed by a glitch-free switch on Meson8b and Meson8m2. Meson8 only
1580 * has mali_0 and no glitch-free mux.
1582 static const char * const meson8b_mali_0_1_parent_names
[] = {
1583 "xtal", "mpll2", "mpll1", "fclk_div7", "fclk_div4", "fclk_div3",
1587 static u32 meson8b_mali_0_1_mux_table
[] = { 0, 2, 3, 4, 5, 6, 7 };
1589 static struct clk_regmap meson8b_mali_0_sel
= {
1590 .data
= &(struct clk_regmap_mux_data
){
1591 .offset
= HHI_MALI_CLK_CNTL
,
1594 .table
= meson8b_mali_0_1_mux_table
,
1596 .hw
.init
= &(struct clk_init_data
){
1597 .name
= "mali_0_sel",
1598 .ops
= &clk_regmap_mux_ops
,
1599 .parent_names
= meson8b_mali_0_1_parent_names
,
1600 .num_parents
= ARRAY_SIZE(meson8b_mali_0_1_parent_names
),
1602 * Don't propagate rate changes up because the only changeable
1603 * parents are mpll1 and mpll2 but we need those for audio and
1604 * RGMII (Ethernet). We don't want to change the audio or
1605 * Ethernet clocks when setting the GPU frequency.
1611 static struct clk_regmap meson8b_mali_0_div
= {
1612 .data
= &(struct clk_regmap_div_data
){
1613 .offset
= HHI_MALI_CLK_CNTL
,
1617 .hw
.init
= &(struct clk_init_data
){
1618 .name
= "mali_0_div",
1619 .ops
= &clk_regmap_divider_ops
,
1620 .parent_names
= (const char *[]){ "mali_0_sel" },
1622 .flags
= CLK_SET_RATE_PARENT
,
1626 static struct clk_regmap meson8b_mali_0
= {
1627 .data
= &(struct clk_regmap_gate_data
){
1628 .offset
= HHI_MALI_CLK_CNTL
,
1631 .hw
.init
= &(struct clk_init_data
){
1633 .ops
= &clk_regmap_gate_ops
,
1634 .parent_names
= (const char *[]){ "mali_0_div" },
1636 .flags
= CLK_SET_RATE_PARENT
,
1640 static struct clk_regmap meson8b_mali_1_sel
= {
1641 .data
= &(struct clk_regmap_mux_data
){
1642 .offset
= HHI_MALI_CLK_CNTL
,
1645 .table
= meson8b_mali_0_1_mux_table
,
1647 .hw
.init
= &(struct clk_init_data
){
1648 .name
= "mali_1_sel",
1649 .ops
= &clk_regmap_mux_ops
,
1650 .parent_names
= meson8b_mali_0_1_parent_names
,
1651 .num_parents
= ARRAY_SIZE(meson8b_mali_0_1_parent_names
),
1653 * Don't propagate rate changes up because the only changeable
1654 * parents are mpll1 and mpll2 but we need those for audio and
1655 * RGMII (Ethernet). We don't want to change the audio or
1656 * Ethernet clocks when setting the GPU frequency.
1662 static struct clk_regmap meson8b_mali_1_div
= {
1663 .data
= &(struct clk_regmap_div_data
){
1664 .offset
= HHI_MALI_CLK_CNTL
,
1668 .hw
.init
= &(struct clk_init_data
){
1669 .name
= "mali_1_div",
1670 .ops
= &clk_regmap_divider_ops
,
1671 .parent_names
= (const char *[]){ "mali_1_sel" },
1673 .flags
= CLK_SET_RATE_PARENT
,
1677 static struct clk_regmap meson8b_mali_1
= {
1678 .data
= &(struct clk_regmap_gate_data
){
1679 .offset
= HHI_MALI_CLK_CNTL
,
1682 .hw
.init
= &(struct clk_init_data
){
1684 .ops
= &clk_regmap_gate_ops
,
1685 .parent_names
= (const char *[]){ "mali_1_div" },
1687 .flags
= CLK_SET_RATE_PARENT
,
1691 static struct clk_regmap meson8b_mali
= {
1692 .data
= &(struct clk_regmap_mux_data
){
1693 .offset
= HHI_MALI_CLK_CNTL
,
1697 .hw
.init
= &(struct clk_init_data
){
1699 .ops
= &clk_regmap_mux_ops
,
1700 .parent_names
= (const char *[]){ "mali_0", "mali_1" },
1702 .flags
= CLK_SET_RATE_PARENT
,
1706 static const struct pll_params_table meson8m2_gp_pll_params_table
[] = {
1711 static struct clk_regmap meson8m2_gp_pll_dco
= {
1712 .data
= &(struct meson_clk_pll_data
){
1714 .reg_off
= HHI_GP_PLL_CNTL
,
1719 .reg_off
= HHI_GP_PLL_CNTL
,
1724 .reg_off
= HHI_GP_PLL_CNTL
,
1729 .reg_off
= HHI_GP_PLL_CNTL
,
1734 .reg_off
= HHI_GP_PLL_CNTL
,
1738 .table
= meson8m2_gp_pll_params_table
,
1740 .hw
.init
= &(struct clk_init_data
){
1741 .name
= "gp_pll_dco",
1742 .ops
= &meson_clk_pll_ops
,
1743 .parent_names
= (const char *[]){ "xtal" },
1748 static struct clk_regmap meson8m2_gp_pll
= {
1749 .data
= &(struct clk_regmap_div_data
){
1750 .offset
= HHI_GP_PLL_CNTL
,
1753 .flags
= CLK_DIVIDER_POWER_OF_TWO
,
1755 .hw
.init
= &(struct clk_init_data
){
1757 .ops
= &clk_regmap_divider_ops
,
1758 .parent_names
= (const char *[]){ "gp_pll_dco" },
1760 .flags
= CLK_SET_RATE_PARENT
,
1764 static const char * const meson8b_vpu_0_1_parent_names
[] = {
1765 "fclk_div4", "fclk_div3", "fclk_div5", "fclk_div7"
1768 static const char * const mmeson8m2_vpu_0_1_parent_names
[] = {
1769 "fclk_div4", "fclk_div3", "fclk_div5", "gp_pll"
1772 static struct clk_regmap meson8b_vpu_0_sel
= {
1773 .data
= &(struct clk_regmap_mux_data
){
1774 .offset
= HHI_VPU_CLK_CNTL
,
1778 .hw
.init
= &(struct clk_init_data
){
1779 .name
= "vpu_0_sel",
1780 .ops
= &clk_regmap_mux_ops
,
1781 .parent_names
= meson8b_vpu_0_1_parent_names
,
1782 .num_parents
= ARRAY_SIZE(meson8b_vpu_0_1_parent_names
),
1783 .flags
= CLK_SET_RATE_PARENT
,
1787 static struct clk_regmap meson8m2_vpu_0_sel
= {
1788 .data
= &(struct clk_regmap_mux_data
){
1789 .offset
= HHI_VPU_CLK_CNTL
,
1793 .hw
.init
= &(struct clk_init_data
){
1794 .name
= "vpu_0_sel",
1795 .ops
= &clk_regmap_mux_ops
,
1796 .parent_names
= mmeson8m2_vpu_0_1_parent_names
,
1797 .num_parents
= ARRAY_SIZE(mmeson8m2_vpu_0_1_parent_names
),
1798 .flags
= CLK_SET_RATE_PARENT
,
1802 static struct clk_regmap meson8b_vpu_0_div
= {
1803 .data
= &(struct clk_regmap_div_data
){
1804 .offset
= HHI_VPU_CLK_CNTL
,
1808 .hw
.init
= &(struct clk_init_data
){
1809 .name
= "vpu_0_div",
1810 .ops
= &clk_regmap_divider_ops
,
1811 .parent_names
= (const char *[]){ "vpu_0_sel" },
1813 .flags
= CLK_SET_RATE_PARENT
,
1817 static struct clk_regmap meson8b_vpu_0
= {
1818 .data
= &(struct clk_regmap_gate_data
){
1819 .offset
= HHI_VPU_CLK_CNTL
,
1822 .hw
.init
= &(struct clk_init_data
) {
1824 .ops
= &clk_regmap_gate_ops
,
1825 .parent_names
= (const char *[]){ "vpu_0_div" },
1827 .flags
= CLK_SET_RATE_PARENT
,
1831 static struct clk_regmap meson8b_vpu_1_sel
= {
1832 .data
= &(struct clk_regmap_mux_data
){
1833 .offset
= HHI_VPU_CLK_CNTL
,
1837 .hw
.init
= &(struct clk_init_data
){
1838 .name
= "vpu_1_sel",
1839 .ops
= &clk_regmap_mux_ops
,
1840 .parent_names
= meson8b_vpu_0_1_parent_names
,
1841 .num_parents
= ARRAY_SIZE(meson8b_vpu_0_1_parent_names
),
1842 .flags
= CLK_SET_RATE_PARENT
,
1846 static struct clk_regmap meson8m2_vpu_1_sel
= {
1847 .data
= &(struct clk_regmap_mux_data
){
1848 .offset
= HHI_VPU_CLK_CNTL
,
1852 .hw
.init
= &(struct clk_init_data
){
1853 .name
= "vpu_1_sel",
1854 .ops
= &clk_regmap_mux_ops
,
1855 .parent_names
= mmeson8m2_vpu_0_1_parent_names
,
1856 .num_parents
= ARRAY_SIZE(mmeson8m2_vpu_0_1_parent_names
),
1857 .flags
= CLK_SET_RATE_PARENT
,
1861 static struct clk_regmap meson8b_vpu_1_div
= {
1862 .data
= &(struct clk_regmap_div_data
){
1863 .offset
= HHI_VPU_CLK_CNTL
,
1867 .hw
.init
= &(struct clk_init_data
){
1868 .name
= "vpu_1_div",
1869 .ops
= &clk_regmap_divider_ops
,
1870 .parent_names
= (const char *[]){ "vpu_1_sel" },
1872 .flags
= CLK_SET_RATE_PARENT
,
1876 static struct clk_regmap meson8b_vpu_1
= {
1877 .data
= &(struct clk_regmap_gate_data
){
1878 .offset
= HHI_VPU_CLK_CNTL
,
1881 .hw
.init
= &(struct clk_init_data
) {
1883 .ops
= &clk_regmap_gate_ops
,
1884 .parent_names
= (const char *[]){ "vpu_1_div" },
1886 .flags
= CLK_SET_RATE_PARENT
,
1890 static struct clk_regmap meson8b_vpu
= {
1891 .data
= &(struct clk_regmap_mux_data
){
1892 .offset
= HHI_VPU_CLK_CNTL
,
1896 .hw
.init
= &(struct clk_init_data
){
1898 .ops
= &clk_regmap_mux_ops
,
1899 .parent_names
= (const char *[]){ "vpu_0", "vpu_1" },
1901 .flags
= CLK_SET_RATE_NO_REPARENT
,
1905 static const char * const meson8b_vdec_parent_names
[] = {
1906 "fclk_div4", "fclk_div3", "fclk_div5", "fclk_div7", "mpll2", "mpll1"
1909 static struct clk_regmap meson8b_vdec_1_sel
= {
1910 .data
= &(struct clk_regmap_mux_data
){
1911 .offset
= HHI_VDEC_CLK_CNTL
,
1914 .flags
= CLK_MUX_ROUND_CLOSEST
,
1916 .hw
.init
= &(struct clk_init_data
){
1917 .name
= "vdec_1_sel",
1918 .ops
= &clk_regmap_mux_ops
,
1919 .parent_names
= meson8b_vdec_parent_names
,
1920 .num_parents
= ARRAY_SIZE(meson8b_vdec_parent_names
),
1921 .flags
= CLK_SET_RATE_PARENT
,
1925 static struct clk_regmap meson8b_vdec_1_1_div
= {
1926 .data
= &(struct clk_regmap_div_data
){
1927 .offset
= HHI_VDEC_CLK_CNTL
,
1930 .flags
= CLK_DIVIDER_ROUND_CLOSEST
,
1932 .hw
.init
= &(struct clk_init_data
){
1933 .name
= "vdec_1_1_div",
1934 .ops
= &clk_regmap_divider_ops
,
1935 .parent_names
= (const char *[]){ "vdec_1_sel" },
1937 .flags
= CLK_SET_RATE_PARENT
,
1941 static struct clk_regmap meson8b_vdec_1_1
= {
1942 .data
= &(struct clk_regmap_gate_data
){
1943 .offset
= HHI_VDEC_CLK_CNTL
,
1946 .hw
.init
= &(struct clk_init_data
) {
1948 .ops
= &clk_regmap_gate_ops
,
1949 .parent_names
= (const char *[]){ "vdec_1_1_div" },
1951 .flags
= CLK_SET_RATE_PARENT
,
1955 static struct clk_regmap meson8b_vdec_1_2_div
= {
1956 .data
= &(struct clk_regmap_div_data
){
1957 .offset
= HHI_VDEC3_CLK_CNTL
,
1960 .flags
= CLK_DIVIDER_ROUND_CLOSEST
,
1962 .hw
.init
= &(struct clk_init_data
){
1963 .name
= "vdec_1_2_div",
1964 .ops
= &clk_regmap_divider_ops
,
1965 .parent_names
= (const char *[]){ "vdec_1_sel" },
1967 .flags
= CLK_SET_RATE_PARENT
,
1971 static struct clk_regmap meson8b_vdec_1_2
= {
1972 .data
= &(struct clk_regmap_gate_data
){
1973 .offset
= HHI_VDEC3_CLK_CNTL
,
1976 .hw
.init
= &(struct clk_init_data
) {
1978 .ops
= &clk_regmap_gate_ops
,
1979 .parent_names
= (const char *[]){ "vdec_1_2_div" },
1981 .flags
= CLK_SET_RATE_PARENT
,
1985 static struct clk_regmap meson8b_vdec_1
= {
1986 .data
= &(struct clk_regmap_mux_data
){
1987 .offset
= HHI_VDEC3_CLK_CNTL
,
1990 .flags
= CLK_MUX_ROUND_CLOSEST
,
1992 .hw
.init
= &(struct clk_init_data
){
1994 .ops
= &clk_regmap_mux_ops
,
1995 .parent_names
= (const char *[]){ "vdec_1_1", "vdec_1_2" },
1997 .flags
= CLK_SET_RATE_PARENT
,
2001 static struct clk_regmap meson8b_vdec_hcodec_sel
= {
2002 .data
= &(struct clk_regmap_mux_data
){
2003 .offset
= HHI_VDEC_CLK_CNTL
,
2006 .flags
= CLK_MUX_ROUND_CLOSEST
,
2008 .hw
.init
= &(struct clk_init_data
){
2009 .name
= "vdec_hcodec_sel",
2010 .ops
= &clk_regmap_mux_ops
,
2011 .parent_names
= meson8b_vdec_parent_names
,
2012 .num_parents
= ARRAY_SIZE(meson8b_vdec_parent_names
),
2013 .flags
= CLK_SET_RATE_PARENT
,
2017 static struct clk_regmap meson8b_vdec_hcodec_div
= {
2018 .data
= &(struct clk_regmap_div_data
){
2019 .offset
= HHI_VDEC_CLK_CNTL
,
2022 .flags
= CLK_DIVIDER_ROUND_CLOSEST
,
2024 .hw
.init
= &(struct clk_init_data
){
2025 .name
= "vdec_hcodec_div",
2026 .ops
= &clk_regmap_divider_ops
,
2027 .parent_names
= (const char *[]){ "vdec_hcodec_sel" },
2029 .flags
= CLK_SET_RATE_PARENT
,
2033 static struct clk_regmap meson8b_vdec_hcodec
= {
2034 .data
= &(struct clk_regmap_gate_data
){
2035 .offset
= HHI_VDEC_CLK_CNTL
,
2038 .hw
.init
= &(struct clk_init_data
) {
2039 .name
= "vdec_hcodec",
2040 .ops
= &clk_regmap_gate_ops
,
2041 .parent_names
= (const char *[]){ "vdec_hcodec_div" },
2043 .flags
= CLK_SET_RATE_PARENT
,
2047 static struct clk_regmap meson8b_vdec_2_sel
= {
2048 .data
= &(struct clk_regmap_mux_data
){
2049 .offset
= HHI_VDEC2_CLK_CNTL
,
2052 .flags
= CLK_MUX_ROUND_CLOSEST
,
2054 .hw
.init
= &(struct clk_init_data
){
2055 .name
= "vdec_2_sel",
2056 .ops
= &clk_regmap_mux_ops
,
2057 .parent_names
= meson8b_vdec_parent_names
,
2058 .num_parents
= ARRAY_SIZE(meson8b_vdec_parent_names
),
2059 .flags
= CLK_SET_RATE_PARENT
,
2063 static struct clk_regmap meson8b_vdec_2_div
= {
2064 .data
= &(struct clk_regmap_div_data
){
2065 .offset
= HHI_VDEC2_CLK_CNTL
,
2068 .flags
= CLK_DIVIDER_ROUND_CLOSEST
,
2070 .hw
.init
= &(struct clk_init_data
){
2071 .name
= "vdec_2_div",
2072 .ops
= &clk_regmap_divider_ops
,
2073 .parent_names
= (const char *[]){ "vdec_2_sel" },
2075 .flags
= CLK_SET_RATE_PARENT
,
2079 static struct clk_regmap meson8b_vdec_2
= {
2080 .data
= &(struct clk_regmap_gate_data
){
2081 .offset
= HHI_VDEC2_CLK_CNTL
,
2084 .hw
.init
= &(struct clk_init_data
) {
2086 .ops
= &clk_regmap_gate_ops
,
2087 .parent_names
= (const char *[]){ "vdec_2_div" },
2089 .flags
= CLK_SET_RATE_PARENT
,
2093 static struct clk_regmap meson8b_vdec_hevc_sel
= {
2094 .data
= &(struct clk_regmap_mux_data
){
2095 .offset
= HHI_VDEC2_CLK_CNTL
,
2098 .flags
= CLK_MUX_ROUND_CLOSEST
,
2100 .hw
.init
= &(struct clk_init_data
){
2101 .name
= "vdec_hevc_sel",
2102 .ops
= &clk_regmap_mux_ops
,
2103 .parent_names
= meson8b_vdec_parent_names
,
2104 .num_parents
= ARRAY_SIZE(meson8b_vdec_parent_names
),
2105 .flags
= CLK_SET_RATE_PARENT
,
2109 static struct clk_regmap meson8b_vdec_hevc_div
= {
2110 .data
= &(struct clk_regmap_div_data
){
2111 .offset
= HHI_VDEC2_CLK_CNTL
,
2114 .flags
= CLK_DIVIDER_ROUND_CLOSEST
,
2116 .hw
.init
= &(struct clk_init_data
){
2117 .name
= "vdec_hevc_div",
2118 .ops
= &clk_regmap_divider_ops
,
2119 .parent_names
= (const char *[]){ "vdec_hevc_sel" },
2121 .flags
= CLK_SET_RATE_PARENT
,
2125 static struct clk_regmap meson8b_vdec_hevc_en
= {
2126 .data
= &(struct clk_regmap_gate_data
){
2127 .offset
= HHI_VDEC2_CLK_CNTL
,
2130 .hw
.init
= &(struct clk_init_data
) {
2131 .name
= "vdec_hevc_en",
2132 .ops
= &clk_regmap_gate_ops
,
2133 .parent_names
= (const char *[]){ "vdec_hevc_div" },
2135 .flags
= CLK_SET_RATE_PARENT
,
2139 static struct clk_regmap meson8b_vdec_hevc
= {
2140 .data
= &(struct clk_regmap_mux_data
){
2141 .offset
= HHI_VDEC2_CLK_CNTL
,
2144 .flags
= CLK_MUX_ROUND_CLOSEST
,
2146 .hw
.init
= &(struct clk_init_data
){
2147 .name
= "vdec_hevc",
2148 .ops
= &clk_regmap_mux_ops
,
2149 /* TODO: The second parent is currently unknown */
2150 .parent_names
= (const char *[]){ "vdec_hevc_en" },
2152 .flags
= CLK_SET_RATE_PARENT
,
2156 /* TODO: the clock at index 0 is "DDR_PLL" which we don't support yet */
2157 static const char * const meson8b_cts_amclk_parent_names
[] = {
2158 "mpll0", "mpll1", "mpll2"
2161 static u32 meson8b_cts_amclk_mux_table
[] = { 1, 2, 3 };
2163 static struct clk_regmap meson8b_cts_amclk_sel
= {
2164 .data
= &(struct clk_regmap_mux_data
){
2165 .offset
= HHI_AUD_CLK_CNTL
,
2168 .table
= meson8b_cts_amclk_mux_table
,
2169 .flags
= CLK_MUX_ROUND_CLOSEST
,
2171 .hw
.init
= &(struct clk_init_data
){
2172 .name
= "cts_amclk_sel",
2173 .ops
= &clk_regmap_mux_ops
,
2174 .parent_names
= meson8b_cts_amclk_parent_names
,
2175 .num_parents
= ARRAY_SIZE(meson8b_cts_amclk_parent_names
),
2179 static struct clk_regmap meson8b_cts_amclk_div
= {
2180 .data
= &(struct clk_regmap_div_data
) {
2181 .offset
= HHI_AUD_CLK_CNTL
,
2184 .flags
= CLK_DIVIDER_ROUND_CLOSEST
,
2186 .hw
.init
= &(struct clk_init_data
){
2187 .name
= "cts_amclk_div",
2188 .ops
= &clk_regmap_divider_ops
,
2189 .parent_names
= (const char *[]){ "cts_amclk_sel" },
2191 .flags
= CLK_SET_RATE_PARENT
,
2195 static struct clk_regmap meson8b_cts_amclk
= {
2196 .data
= &(struct clk_regmap_gate_data
){
2197 .offset
= HHI_AUD_CLK_CNTL
,
2200 .hw
.init
= &(struct clk_init_data
){
2201 .name
= "cts_amclk",
2202 .ops
= &clk_regmap_gate_ops
,
2203 .parent_names
= (const char *[]){ "cts_amclk_div" },
2205 .flags
= CLK_SET_RATE_PARENT
,
2209 /* TODO: the clock at index 0 is "DDR_PLL" which we don't support yet */
2210 static const char * const meson8b_cts_mclk_i958_parent_names
[] = {
2211 "mpll0", "mpll1", "mpll2"
2214 static u32 meson8b_cts_mclk_i958_mux_table
[] = { 1, 2, 3 };
2216 static struct clk_regmap meson8b_cts_mclk_i958_sel
= {
2217 .data
= &(struct clk_regmap_mux_data
){
2218 .offset
= HHI_AUD_CLK_CNTL2
,
2221 .table
= meson8b_cts_mclk_i958_mux_table
,
2222 .flags
= CLK_MUX_ROUND_CLOSEST
,
2224 .hw
.init
= &(struct clk_init_data
) {
2225 .name
= "cts_mclk_i958_sel",
2226 .ops
= &clk_regmap_mux_ops
,
2227 .parent_names
= meson8b_cts_mclk_i958_parent_names
,
2228 .num_parents
= ARRAY_SIZE(meson8b_cts_mclk_i958_parent_names
),
2232 static struct clk_regmap meson8b_cts_mclk_i958_div
= {
2233 .data
= &(struct clk_regmap_div_data
){
2234 .offset
= HHI_AUD_CLK_CNTL2
,
2237 .flags
= CLK_DIVIDER_ROUND_CLOSEST
,
2239 .hw
.init
= &(struct clk_init_data
) {
2240 .name
= "cts_mclk_i958_div",
2241 .ops
= &clk_regmap_divider_ops
,
2242 .parent_names
= (const char *[]){ "cts_mclk_i958_sel" },
2244 .flags
= CLK_SET_RATE_PARENT
,
2248 static struct clk_regmap meson8b_cts_mclk_i958
= {
2249 .data
= &(struct clk_regmap_gate_data
){
2250 .offset
= HHI_AUD_CLK_CNTL2
,
2253 .hw
.init
= &(struct clk_init_data
){
2254 .name
= "cts_mclk_i958",
2255 .ops
= &clk_regmap_gate_ops
,
2256 .parent_names
= (const char *[]){ "cts_mclk_i958_div" },
2258 .flags
= CLK_SET_RATE_PARENT
,
2262 static struct clk_regmap meson8b_cts_i958
= {
2263 .data
= &(struct clk_regmap_mux_data
){
2264 .offset
= HHI_AUD_CLK_CNTL2
,
2268 .hw
.init
= &(struct clk_init_data
){
2270 .ops
= &clk_regmap_mux_ops
,
2271 .parent_names
= (const char *[]){ "cts_amclk",
2275 * The parent is specific to origin of the audio data. Let the
2276 * consumer choose the appropriate parent.
2278 .flags
= CLK_SET_RATE_PARENT
| CLK_SET_RATE_NO_REPARENT
,
2282 /* Everything Else (EE) domain gates */
2284 static MESON_GATE(meson8b_ddr
, HHI_GCLK_MPEG0
, 0);
2285 static MESON_GATE(meson8b_dos
, HHI_GCLK_MPEG0
, 1);
2286 static MESON_GATE(meson8b_isa
, HHI_GCLK_MPEG0
, 5);
2287 static MESON_GATE(meson8b_pl301
, HHI_GCLK_MPEG0
, 6);
2288 static MESON_GATE(meson8b_periphs
, HHI_GCLK_MPEG0
, 7);
2289 static MESON_GATE(meson8b_spicc
, HHI_GCLK_MPEG0
, 8);
2290 static MESON_GATE(meson8b_i2c
, HHI_GCLK_MPEG0
, 9);
2291 static MESON_GATE(meson8b_sar_adc
, HHI_GCLK_MPEG0
, 10);
2292 static MESON_GATE(meson8b_smart_card
, HHI_GCLK_MPEG0
, 11);
2293 static MESON_GATE(meson8b_rng0
, HHI_GCLK_MPEG0
, 12);
2294 static MESON_GATE(meson8b_uart0
, HHI_GCLK_MPEG0
, 13);
2295 static MESON_GATE(meson8b_sdhc
, HHI_GCLK_MPEG0
, 14);
2296 static MESON_GATE(meson8b_stream
, HHI_GCLK_MPEG0
, 15);
2297 static MESON_GATE(meson8b_async_fifo
, HHI_GCLK_MPEG0
, 16);
2298 static MESON_GATE(meson8b_sdio
, HHI_GCLK_MPEG0
, 17);
2299 static MESON_GATE(meson8b_abuf
, HHI_GCLK_MPEG0
, 18);
2300 static MESON_GATE(meson8b_hiu_iface
, HHI_GCLK_MPEG0
, 19);
2301 static MESON_GATE(meson8b_assist_misc
, HHI_GCLK_MPEG0
, 23);
2302 static MESON_GATE(meson8b_spi
, HHI_GCLK_MPEG0
, 30);
2304 static MESON_GATE(meson8b_i2s_spdif
, HHI_GCLK_MPEG1
, 2);
2305 static MESON_GATE(meson8b_eth
, HHI_GCLK_MPEG1
, 3);
2306 static MESON_GATE(meson8b_demux
, HHI_GCLK_MPEG1
, 4);
2307 static MESON_GATE(meson8b_aiu_glue
, HHI_GCLK_MPEG1
, 6);
2308 static MESON_GATE(meson8b_iec958
, HHI_GCLK_MPEG1
, 7);
2309 static MESON_GATE(meson8b_i2s_out
, HHI_GCLK_MPEG1
, 8);
2310 static MESON_GATE(meson8b_amclk
, HHI_GCLK_MPEG1
, 9);
2311 static MESON_GATE(meson8b_aififo2
, HHI_GCLK_MPEG1
, 10);
2312 static MESON_GATE(meson8b_mixer
, HHI_GCLK_MPEG1
, 11);
2313 static MESON_GATE(meson8b_mixer_iface
, HHI_GCLK_MPEG1
, 12);
2314 static MESON_GATE(meson8b_adc
, HHI_GCLK_MPEG1
, 13);
2315 static MESON_GATE(meson8b_blkmv
, HHI_GCLK_MPEG1
, 14);
2316 static MESON_GATE(meson8b_aiu
, HHI_GCLK_MPEG1
, 15);
2317 static MESON_GATE(meson8b_uart1
, HHI_GCLK_MPEG1
, 16);
2318 static MESON_GATE(meson8b_g2d
, HHI_GCLK_MPEG1
, 20);
2319 static MESON_GATE(meson8b_usb0
, HHI_GCLK_MPEG1
, 21);
2320 static MESON_GATE(meson8b_usb1
, HHI_GCLK_MPEG1
, 22);
2321 static MESON_GATE(meson8b_reset
, HHI_GCLK_MPEG1
, 23);
2322 static MESON_GATE(meson8b_nand
, HHI_GCLK_MPEG1
, 24);
2323 static MESON_GATE(meson8b_dos_parser
, HHI_GCLK_MPEG1
, 25);
2324 static MESON_GATE(meson8b_usb
, HHI_GCLK_MPEG1
, 26);
2325 static MESON_GATE(meson8b_vdin1
, HHI_GCLK_MPEG1
, 28);
2326 static MESON_GATE(meson8b_ahb_arb0
, HHI_GCLK_MPEG1
, 29);
2327 static MESON_GATE(meson8b_efuse
, HHI_GCLK_MPEG1
, 30);
2328 static MESON_GATE(meson8b_boot_rom
, HHI_GCLK_MPEG1
, 31);
2330 static MESON_GATE(meson8b_ahb_data_bus
, HHI_GCLK_MPEG2
, 1);
2331 static MESON_GATE(meson8b_ahb_ctrl_bus
, HHI_GCLK_MPEG2
, 2);
2332 static MESON_GATE(meson8b_hdmi_intr_sync
, HHI_GCLK_MPEG2
, 3);
2333 static MESON_GATE(meson8b_hdmi_pclk
, HHI_GCLK_MPEG2
, 4);
2334 static MESON_GATE(meson8b_usb1_ddr_bridge
, HHI_GCLK_MPEG2
, 8);
2335 static MESON_GATE(meson8b_usb0_ddr_bridge
, HHI_GCLK_MPEG2
, 9);
2336 static MESON_GATE(meson8b_mmc_pclk
, HHI_GCLK_MPEG2
, 11);
2337 static MESON_GATE(meson8b_dvin
, HHI_GCLK_MPEG2
, 12);
2338 static MESON_GATE(meson8b_uart2
, HHI_GCLK_MPEG2
, 15);
2339 static MESON_GATE(meson8b_sana
, HHI_GCLK_MPEG2
, 22);
2340 static MESON_GATE(meson8b_vpu_intr
, HHI_GCLK_MPEG2
, 25);
2341 static MESON_GATE(meson8b_sec_ahb_ahb3_bridge
, HHI_GCLK_MPEG2
, 26);
2342 static MESON_GATE(meson8b_clk81_a9
, HHI_GCLK_MPEG2
, 29);
2344 static MESON_GATE(meson8b_vclk2_venci0
, HHI_GCLK_OTHER
, 1);
2345 static MESON_GATE(meson8b_vclk2_venci1
, HHI_GCLK_OTHER
, 2);
2346 static MESON_GATE(meson8b_vclk2_vencp0
, HHI_GCLK_OTHER
, 3);
2347 static MESON_GATE(meson8b_vclk2_vencp1
, HHI_GCLK_OTHER
, 4);
2348 static MESON_GATE(meson8b_gclk_venci_int
, HHI_GCLK_OTHER
, 8);
2349 static MESON_GATE(meson8b_gclk_vencp_int
, HHI_GCLK_OTHER
, 9);
2350 static MESON_GATE(meson8b_dac_clk
, HHI_GCLK_OTHER
, 10);
2351 static MESON_GATE(meson8b_aoclk_gate
, HHI_GCLK_OTHER
, 14);
2352 static MESON_GATE(meson8b_iec958_gate
, HHI_GCLK_OTHER
, 16);
2353 static MESON_GATE(meson8b_enc480p
, HHI_GCLK_OTHER
, 20);
2354 static MESON_GATE(meson8b_rng1
, HHI_GCLK_OTHER
, 21);
2355 static MESON_GATE(meson8b_gclk_vencl_int
, HHI_GCLK_OTHER
, 22);
2356 static MESON_GATE(meson8b_vclk2_venclmcc
, HHI_GCLK_OTHER
, 24);
2357 static MESON_GATE(meson8b_vclk2_vencl
, HHI_GCLK_OTHER
, 25);
2358 static MESON_GATE(meson8b_vclk2_other
, HHI_GCLK_OTHER
, 26);
2359 static MESON_GATE(meson8b_edp
, HHI_GCLK_OTHER
, 31);
2361 /* Always On (AO) domain gates */
2363 static MESON_GATE(meson8b_ao_media_cpu
, HHI_GCLK_AO
, 0);
2364 static MESON_GATE(meson8b_ao_ahb_sram
, HHI_GCLK_AO
, 1);
2365 static MESON_GATE(meson8b_ao_ahb_bus
, HHI_GCLK_AO
, 2);
2366 static MESON_GATE(meson8b_ao_iface
, HHI_GCLK_AO
, 3);
2368 static struct clk_hw_onecell_data meson8_hw_onecell_data
= {
2370 [CLKID_XTAL
] = &meson8b_xtal
.hw
,
2371 [CLKID_PLL_FIXED
] = &meson8b_fixed_pll
.hw
,
2372 [CLKID_PLL_VID
] = &meson8b_vid_pll
.hw
,
2373 [CLKID_PLL_SYS
] = &meson8b_sys_pll
.hw
,
2374 [CLKID_FCLK_DIV2
] = &meson8b_fclk_div2
.hw
,
2375 [CLKID_FCLK_DIV3
] = &meson8b_fclk_div3
.hw
,
2376 [CLKID_FCLK_DIV4
] = &meson8b_fclk_div4
.hw
,
2377 [CLKID_FCLK_DIV5
] = &meson8b_fclk_div5
.hw
,
2378 [CLKID_FCLK_DIV7
] = &meson8b_fclk_div7
.hw
,
2379 [CLKID_CPUCLK
] = &meson8b_cpu_clk
.hw
,
2380 [CLKID_MPEG_SEL
] = &meson8b_mpeg_clk_sel
.hw
,
2381 [CLKID_MPEG_DIV
] = &meson8b_mpeg_clk_div
.hw
,
2382 [CLKID_CLK81
] = &meson8b_clk81
.hw
,
2383 [CLKID_DDR
] = &meson8b_ddr
.hw
,
2384 [CLKID_DOS
] = &meson8b_dos
.hw
,
2385 [CLKID_ISA
] = &meson8b_isa
.hw
,
2386 [CLKID_PL301
] = &meson8b_pl301
.hw
,
2387 [CLKID_PERIPHS
] = &meson8b_periphs
.hw
,
2388 [CLKID_SPICC
] = &meson8b_spicc
.hw
,
2389 [CLKID_I2C
] = &meson8b_i2c
.hw
,
2390 [CLKID_SAR_ADC
] = &meson8b_sar_adc
.hw
,
2391 [CLKID_SMART_CARD
] = &meson8b_smart_card
.hw
,
2392 [CLKID_RNG0
] = &meson8b_rng0
.hw
,
2393 [CLKID_UART0
] = &meson8b_uart0
.hw
,
2394 [CLKID_SDHC
] = &meson8b_sdhc
.hw
,
2395 [CLKID_STREAM
] = &meson8b_stream
.hw
,
2396 [CLKID_ASYNC_FIFO
] = &meson8b_async_fifo
.hw
,
2397 [CLKID_SDIO
] = &meson8b_sdio
.hw
,
2398 [CLKID_ABUF
] = &meson8b_abuf
.hw
,
2399 [CLKID_HIU_IFACE
] = &meson8b_hiu_iface
.hw
,
2400 [CLKID_ASSIST_MISC
] = &meson8b_assist_misc
.hw
,
2401 [CLKID_SPI
] = &meson8b_spi
.hw
,
2402 [CLKID_I2S_SPDIF
] = &meson8b_i2s_spdif
.hw
,
2403 [CLKID_ETH
] = &meson8b_eth
.hw
,
2404 [CLKID_DEMUX
] = &meson8b_demux
.hw
,
2405 [CLKID_AIU_GLUE
] = &meson8b_aiu_glue
.hw
,
2406 [CLKID_IEC958
] = &meson8b_iec958
.hw
,
2407 [CLKID_I2S_OUT
] = &meson8b_i2s_out
.hw
,
2408 [CLKID_AMCLK
] = &meson8b_amclk
.hw
,
2409 [CLKID_AIFIFO2
] = &meson8b_aififo2
.hw
,
2410 [CLKID_MIXER
] = &meson8b_mixer
.hw
,
2411 [CLKID_MIXER_IFACE
] = &meson8b_mixer_iface
.hw
,
2412 [CLKID_ADC
] = &meson8b_adc
.hw
,
2413 [CLKID_BLKMV
] = &meson8b_blkmv
.hw
,
2414 [CLKID_AIU
] = &meson8b_aiu
.hw
,
2415 [CLKID_UART1
] = &meson8b_uart1
.hw
,
2416 [CLKID_G2D
] = &meson8b_g2d
.hw
,
2417 [CLKID_USB0
] = &meson8b_usb0
.hw
,
2418 [CLKID_USB1
] = &meson8b_usb1
.hw
,
2419 [CLKID_RESET
] = &meson8b_reset
.hw
,
2420 [CLKID_NAND
] = &meson8b_nand
.hw
,
2421 [CLKID_DOS_PARSER
] = &meson8b_dos_parser
.hw
,
2422 [CLKID_USB
] = &meson8b_usb
.hw
,
2423 [CLKID_VDIN1
] = &meson8b_vdin1
.hw
,
2424 [CLKID_AHB_ARB0
] = &meson8b_ahb_arb0
.hw
,
2425 [CLKID_EFUSE
] = &meson8b_efuse
.hw
,
2426 [CLKID_BOOT_ROM
] = &meson8b_boot_rom
.hw
,
2427 [CLKID_AHB_DATA_BUS
] = &meson8b_ahb_data_bus
.hw
,
2428 [CLKID_AHB_CTRL_BUS
] = &meson8b_ahb_ctrl_bus
.hw
,
2429 [CLKID_HDMI_INTR_SYNC
] = &meson8b_hdmi_intr_sync
.hw
,
2430 [CLKID_HDMI_PCLK
] = &meson8b_hdmi_pclk
.hw
,
2431 [CLKID_USB1_DDR_BRIDGE
] = &meson8b_usb1_ddr_bridge
.hw
,
2432 [CLKID_USB0_DDR_BRIDGE
] = &meson8b_usb0_ddr_bridge
.hw
,
2433 [CLKID_MMC_PCLK
] = &meson8b_mmc_pclk
.hw
,
2434 [CLKID_DVIN
] = &meson8b_dvin
.hw
,
2435 [CLKID_UART2
] = &meson8b_uart2
.hw
,
2436 [CLKID_SANA
] = &meson8b_sana
.hw
,
2437 [CLKID_VPU_INTR
] = &meson8b_vpu_intr
.hw
,
2438 [CLKID_SEC_AHB_AHB3_BRIDGE
] = &meson8b_sec_ahb_ahb3_bridge
.hw
,
2439 [CLKID_CLK81_A9
] = &meson8b_clk81_a9
.hw
,
2440 [CLKID_VCLK2_VENCI0
] = &meson8b_vclk2_venci0
.hw
,
2441 [CLKID_VCLK2_VENCI1
] = &meson8b_vclk2_venci1
.hw
,
2442 [CLKID_VCLK2_VENCP0
] = &meson8b_vclk2_vencp0
.hw
,
2443 [CLKID_VCLK2_VENCP1
] = &meson8b_vclk2_vencp1
.hw
,
2444 [CLKID_GCLK_VENCI_INT
] = &meson8b_gclk_venci_int
.hw
,
2445 [CLKID_GCLK_VENCP_INT
] = &meson8b_gclk_vencp_int
.hw
,
2446 [CLKID_DAC_CLK
] = &meson8b_dac_clk
.hw
,
2447 [CLKID_AOCLK_GATE
] = &meson8b_aoclk_gate
.hw
,
2448 [CLKID_IEC958_GATE
] = &meson8b_iec958_gate
.hw
,
2449 [CLKID_ENC480P
] = &meson8b_enc480p
.hw
,
2450 [CLKID_RNG1
] = &meson8b_rng1
.hw
,
2451 [CLKID_GCLK_VENCL_INT
] = &meson8b_gclk_vencl_int
.hw
,
2452 [CLKID_VCLK2_VENCLMCC
] = &meson8b_vclk2_venclmcc
.hw
,
2453 [CLKID_VCLK2_VENCL
] = &meson8b_vclk2_vencl
.hw
,
2454 [CLKID_VCLK2_OTHER
] = &meson8b_vclk2_other
.hw
,
2455 [CLKID_EDP
] = &meson8b_edp
.hw
,
2456 [CLKID_AO_MEDIA_CPU
] = &meson8b_ao_media_cpu
.hw
,
2457 [CLKID_AO_AHB_SRAM
] = &meson8b_ao_ahb_sram
.hw
,
2458 [CLKID_AO_AHB_BUS
] = &meson8b_ao_ahb_bus
.hw
,
2459 [CLKID_AO_IFACE
] = &meson8b_ao_iface
.hw
,
2460 [CLKID_MPLL0
] = &meson8b_mpll0
.hw
,
2461 [CLKID_MPLL1
] = &meson8b_mpll1
.hw
,
2462 [CLKID_MPLL2
] = &meson8b_mpll2
.hw
,
2463 [CLKID_MPLL0_DIV
] = &meson8b_mpll0_div
.hw
,
2464 [CLKID_MPLL1_DIV
] = &meson8b_mpll1_div
.hw
,
2465 [CLKID_MPLL2_DIV
] = &meson8b_mpll2_div
.hw
,
2466 [CLKID_CPU_IN_SEL
] = &meson8b_cpu_in_sel
.hw
,
2467 [CLKID_CPU_IN_DIV2
] = &meson8b_cpu_in_div2
.hw
,
2468 [CLKID_CPU_IN_DIV3
] = &meson8b_cpu_in_div3
.hw
,
2469 [CLKID_CPU_SCALE_DIV
] = &meson8b_cpu_scale_div
.hw
,
2470 [CLKID_CPU_SCALE_OUT_SEL
] = &meson8b_cpu_scale_out_sel
.hw
,
2471 [CLKID_MPLL_PREDIV
] = &meson8b_mpll_prediv
.hw
,
2472 [CLKID_FCLK_DIV2_DIV
] = &meson8b_fclk_div2_div
.hw
,
2473 [CLKID_FCLK_DIV3_DIV
] = &meson8b_fclk_div3_div
.hw
,
2474 [CLKID_FCLK_DIV4_DIV
] = &meson8b_fclk_div4_div
.hw
,
2475 [CLKID_FCLK_DIV5_DIV
] = &meson8b_fclk_div5_div
.hw
,
2476 [CLKID_FCLK_DIV7_DIV
] = &meson8b_fclk_div7_div
.hw
,
2477 [CLKID_NAND_SEL
] = &meson8b_nand_clk_sel
.hw
,
2478 [CLKID_NAND_DIV
] = &meson8b_nand_clk_div
.hw
,
2479 [CLKID_NAND_CLK
] = &meson8b_nand_clk_gate
.hw
,
2480 [CLKID_PLL_FIXED_DCO
] = &meson8b_fixed_pll_dco
.hw
,
2481 [CLKID_HDMI_PLL_DCO
] = &meson8b_hdmi_pll_dco
.hw
,
2482 [CLKID_PLL_SYS_DCO
] = &meson8b_sys_pll_dco
.hw
,
2483 [CLKID_CPU_CLK_DIV2
] = &meson8b_cpu_clk_div2
.hw
,
2484 [CLKID_CPU_CLK_DIV3
] = &meson8b_cpu_clk_div3
.hw
,
2485 [CLKID_CPU_CLK_DIV4
] = &meson8b_cpu_clk_div4
.hw
,
2486 [CLKID_CPU_CLK_DIV5
] = &meson8b_cpu_clk_div5
.hw
,
2487 [CLKID_CPU_CLK_DIV6
] = &meson8b_cpu_clk_div6
.hw
,
2488 [CLKID_CPU_CLK_DIV7
] = &meson8b_cpu_clk_div7
.hw
,
2489 [CLKID_CPU_CLK_DIV8
] = &meson8b_cpu_clk_div8
.hw
,
2490 [CLKID_APB_SEL
] = &meson8b_apb_clk_sel
.hw
,
2491 [CLKID_APB
] = &meson8b_apb_clk_gate
.hw
,
2492 [CLKID_PERIPH_SEL
] = &meson8b_periph_clk_sel
.hw
,
2493 [CLKID_PERIPH
] = &meson8b_periph_clk_gate
.hw
,
2494 [CLKID_AXI_SEL
] = &meson8b_axi_clk_sel
.hw
,
2495 [CLKID_AXI
] = &meson8b_axi_clk_gate
.hw
,
2496 [CLKID_L2_DRAM_SEL
] = &meson8b_l2_dram_clk_sel
.hw
,
2497 [CLKID_L2_DRAM
] = &meson8b_l2_dram_clk_gate
.hw
,
2498 [CLKID_HDMI_PLL_LVDS_OUT
] = &meson8b_hdmi_pll_lvds_out
.hw
,
2499 [CLKID_HDMI_PLL_HDMI_OUT
] = &meson8b_hdmi_pll_hdmi_out
.hw
,
2500 [CLKID_VID_PLL_IN_SEL
] = &meson8b_vid_pll_in_sel
.hw
,
2501 [CLKID_VID_PLL_IN_EN
] = &meson8b_vid_pll_in_en
.hw
,
2502 [CLKID_VID_PLL_PRE_DIV
] = &meson8b_vid_pll_pre_div
.hw
,
2503 [CLKID_VID_PLL_POST_DIV
] = &meson8b_vid_pll_post_div
.hw
,
2504 [CLKID_VID_PLL_FINAL_DIV
] = &meson8b_vid_pll_final_div
.hw
,
2505 [CLKID_VCLK_IN_SEL
] = &meson8b_vclk_in_sel
.hw
,
2506 [CLKID_VCLK_IN_EN
] = &meson8b_vclk_in_en
.hw
,
2507 [CLKID_VCLK_DIV1
] = &meson8b_vclk_div1_gate
.hw
,
2508 [CLKID_VCLK_DIV2_DIV
] = &meson8b_vclk_div2_div
.hw
,
2509 [CLKID_VCLK_DIV2
] = &meson8b_vclk_div2_div_gate
.hw
,
2510 [CLKID_VCLK_DIV4_DIV
] = &meson8b_vclk_div4_div
.hw
,
2511 [CLKID_VCLK_DIV4
] = &meson8b_vclk_div4_div_gate
.hw
,
2512 [CLKID_VCLK_DIV6_DIV
] = &meson8b_vclk_div6_div
.hw
,
2513 [CLKID_VCLK_DIV6
] = &meson8b_vclk_div6_div_gate
.hw
,
2514 [CLKID_VCLK_DIV12_DIV
] = &meson8b_vclk_div12_div
.hw
,
2515 [CLKID_VCLK_DIV12
] = &meson8b_vclk_div12_div_gate
.hw
,
2516 [CLKID_VCLK2_IN_SEL
] = &meson8b_vclk2_in_sel
.hw
,
2517 [CLKID_VCLK2_IN_EN
] = &meson8b_vclk2_clk_in_en
.hw
,
2518 [CLKID_VCLK2_DIV1
] = &meson8b_vclk2_div1_gate
.hw
,
2519 [CLKID_VCLK2_DIV2_DIV
] = &meson8b_vclk2_div2_div
.hw
,
2520 [CLKID_VCLK2_DIV2
] = &meson8b_vclk2_div2_div_gate
.hw
,
2521 [CLKID_VCLK2_DIV4_DIV
] = &meson8b_vclk2_div4_div
.hw
,
2522 [CLKID_VCLK2_DIV4
] = &meson8b_vclk2_div4_div_gate
.hw
,
2523 [CLKID_VCLK2_DIV6_DIV
] = &meson8b_vclk2_div6_div
.hw
,
2524 [CLKID_VCLK2_DIV6
] = &meson8b_vclk2_div6_div_gate
.hw
,
2525 [CLKID_VCLK2_DIV12_DIV
] = &meson8b_vclk2_div12_div
.hw
,
2526 [CLKID_VCLK2_DIV12
] = &meson8b_vclk2_div12_div_gate
.hw
,
2527 [CLKID_CTS_ENCT_SEL
] = &meson8b_cts_enct_sel
.hw
,
2528 [CLKID_CTS_ENCT
] = &meson8b_cts_enct
.hw
,
2529 [CLKID_CTS_ENCP_SEL
] = &meson8b_cts_encp_sel
.hw
,
2530 [CLKID_CTS_ENCP
] = &meson8b_cts_encp
.hw
,
2531 [CLKID_CTS_ENCI_SEL
] = &meson8b_cts_enci_sel
.hw
,
2532 [CLKID_CTS_ENCI
] = &meson8b_cts_enci
.hw
,
2533 [CLKID_HDMI_TX_PIXEL_SEL
] = &meson8b_hdmi_tx_pixel_sel
.hw
,
2534 [CLKID_HDMI_TX_PIXEL
] = &meson8b_hdmi_tx_pixel
.hw
,
2535 [CLKID_CTS_ENCL_SEL
] = &meson8b_cts_encl_sel
.hw
,
2536 [CLKID_CTS_ENCL
] = &meson8b_cts_encl
.hw
,
2537 [CLKID_CTS_VDAC0_SEL
] = &meson8b_cts_vdac0_sel
.hw
,
2538 [CLKID_CTS_VDAC0
] = &meson8b_cts_vdac0
.hw
,
2539 [CLKID_HDMI_SYS_SEL
] = &meson8b_hdmi_sys_sel
.hw
,
2540 [CLKID_HDMI_SYS_DIV
] = &meson8b_hdmi_sys_div
.hw
,
2541 [CLKID_HDMI_SYS
] = &meson8b_hdmi_sys
.hw
,
2542 [CLKID_MALI_0_SEL
] = &meson8b_mali_0_sel
.hw
,
2543 [CLKID_MALI_0_DIV
] = &meson8b_mali_0_div
.hw
,
2544 [CLKID_MALI
] = &meson8b_mali_0
.hw
,
2545 [CLKID_VPU_0_SEL
] = &meson8b_vpu_0_sel
.hw
,
2546 [CLKID_VPU_0_DIV
] = &meson8b_vpu_0_div
.hw
,
2547 [CLKID_VPU
] = &meson8b_vpu_0
.hw
,
2548 [CLKID_VDEC_1_SEL
] = &meson8b_vdec_1_sel
.hw
,
2549 [CLKID_VDEC_1_1_DIV
] = &meson8b_vdec_1_1_div
.hw
,
2550 [CLKID_VDEC_1
] = &meson8b_vdec_1_1
.hw
,
2551 [CLKID_VDEC_HCODEC_SEL
] = &meson8b_vdec_hcodec_sel
.hw
,
2552 [CLKID_VDEC_HCODEC_DIV
] = &meson8b_vdec_hcodec_div
.hw
,
2553 [CLKID_VDEC_HCODEC
] = &meson8b_vdec_hcodec
.hw
,
2554 [CLKID_VDEC_2_SEL
] = &meson8b_vdec_2_sel
.hw
,
2555 [CLKID_VDEC_2_DIV
] = &meson8b_vdec_2_div
.hw
,
2556 [CLKID_VDEC_2
] = &meson8b_vdec_2
.hw
,
2557 [CLKID_VDEC_HEVC_SEL
] = &meson8b_vdec_hevc_sel
.hw
,
2558 [CLKID_VDEC_HEVC_DIV
] = &meson8b_vdec_hevc_div
.hw
,
2559 [CLKID_VDEC_HEVC_EN
] = &meson8b_vdec_hevc_en
.hw
,
2560 [CLKID_VDEC_HEVC
] = &meson8b_vdec_hevc
.hw
,
2561 [CLKID_CTS_AMCLK_SEL
] = &meson8b_cts_amclk_sel
.hw
,
2562 [CLKID_CTS_AMCLK_DIV
] = &meson8b_cts_amclk_div
.hw
,
2563 [CLKID_CTS_AMCLK
] = &meson8b_cts_amclk
.hw
,
2564 [CLKID_CTS_MCLK_I958_SEL
] = &meson8b_cts_mclk_i958_sel
.hw
,
2565 [CLKID_CTS_MCLK_I958_DIV
] = &meson8b_cts_mclk_i958_div
.hw
,
2566 [CLKID_CTS_MCLK_I958
] = &meson8b_cts_mclk_i958
.hw
,
2567 [CLKID_CTS_I958
] = &meson8b_cts_i958
.hw
,
2568 [CLK_NR_CLKS
] = NULL
,
2573 static struct clk_hw_onecell_data meson8b_hw_onecell_data
= {
2575 [CLKID_XTAL
] = &meson8b_xtal
.hw
,
2576 [CLKID_PLL_FIXED
] = &meson8b_fixed_pll
.hw
,
2577 [CLKID_PLL_VID
] = &meson8b_vid_pll
.hw
,
2578 [CLKID_PLL_SYS
] = &meson8b_sys_pll
.hw
,
2579 [CLKID_FCLK_DIV2
] = &meson8b_fclk_div2
.hw
,
2580 [CLKID_FCLK_DIV3
] = &meson8b_fclk_div3
.hw
,
2581 [CLKID_FCLK_DIV4
] = &meson8b_fclk_div4
.hw
,
2582 [CLKID_FCLK_DIV5
] = &meson8b_fclk_div5
.hw
,
2583 [CLKID_FCLK_DIV7
] = &meson8b_fclk_div7
.hw
,
2584 [CLKID_CPUCLK
] = &meson8b_cpu_clk
.hw
,
2585 [CLKID_MPEG_SEL
] = &meson8b_mpeg_clk_sel
.hw
,
2586 [CLKID_MPEG_DIV
] = &meson8b_mpeg_clk_div
.hw
,
2587 [CLKID_CLK81
] = &meson8b_clk81
.hw
,
2588 [CLKID_DDR
] = &meson8b_ddr
.hw
,
2589 [CLKID_DOS
] = &meson8b_dos
.hw
,
2590 [CLKID_ISA
] = &meson8b_isa
.hw
,
2591 [CLKID_PL301
] = &meson8b_pl301
.hw
,
2592 [CLKID_PERIPHS
] = &meson8b_periphs
.hw
,
2593 [CLKID_SPICC
] = &meson8b_spicc
.hw
,
2594 [CLKID_I2C
] = &meson8b_i2c
.hw
,
2595 [CLKID_SAR_ADC
] = &meson8b_sar_adc
.hw
,
2596 [CLKID_SMART_CARD
] = &meson8b_smart_card
.hw
,
2597 [CLKID_RNG0
] = &meson8b_rng0
.hw
,
2598 [CLKID_UART0
] = &meson8b_uart0
.hw
,
2599 [CLKID_SDHC
] = &meson8b_sdhc
.hw
,
2600 [CLKID_STREAM
] = &meson8b_stream
.hw
,
2601 [CLKID_ASYNC_FIFO
] = &meson8b_async_fifo
.hw
,
2602 [CLKID_SDIO
] = &meson8b_sdio
.hw
,
2603 [CLKID_ABUF
] = &meson8b_abuf
.hw
,
2604 [CLKID_HIU_IFACE
] = &meson8b_hiu_iface
.hw
,
2605 [CLKID_ASSIST_MISC
] = &meson8b_assist_misc
.hw
,
2606 [CLKID_SPI
] = &meson8b_spi
.hw
,
2607 [CLKID_I2S_SPDIF
] = &meson8b_i2s_spdif
.hw
,
2608 [CLKID_ETH
] = &meson8b_eth
.hw
,
2609 [CLKID_DEMUX
] = &meson8b_demux
.hw
,
2610 [CLKID_AIU_GLUE
] = &meson8b_aiu_glue
.hw
,
2611 [CLKID_IEC958
] = &meson8b_iec958
.hw
,
2612 [CLKID_I2S_OUT
] = &meson8b_i2s_out
.hw
,
2613 [CLKID_AMCLK
] = &meson8b_amclk
.hw
,
2614 [CLKID_AIFIFO2
] = &meson8b_aififo2
.hw
,
2615 [CLKID_MIXER
] = &meson8b_mixer
.hw
,
2616 [CLKID_MIXER_IFACE
] = &meson8b_mixer_iface
.hw
,
2617 [CLKID_ADC
] = &meson8b_adc
.hw
,
2618 [CLKID_BLKMV
] = &meson8b_blkmv
.hw
,
2619 [CLKID_AIU
] = &meson8b_aiu
.hw
,
2620 [CLKID_UART1
] = &meson8b_uart1
.hw
,
2621 [CLKID_G2D
] = &meson8b_g2d
.hw
,
2622 [CLKID_USB0
] = &meson8b_usb0
.hw
,
2623 [CLKID_USB1
] = &meson8b_usb1
.hw
,
2624 [CLKID_RESET
] = &meson8b_reset
.hw
,
2625 [CLKID_NAND
] = &meson8b_nand
.hw
,
2626 [CLKID_DOS_PARSER
] = &meson8b_dos_parser
.hw
,
2627 [CLKID_USB
] = &meson8b_usb
.hw
,
2628 [CLKID_VDIN1
] = &meson8b_vdin1
.hw
,
2629 [CLKID_AHB_ARB0
] = &meson8b_ahb_arb0
.hw
,
2630 [CLKID_EFUSE
] = &meson8b_efuse
.hw
,
2631 [CLKID_BOOT_ROM
] = &meson8b_boot_rom
.hw
,
2632 [CLKID_AHB_DATA_BUS
] = &meson8b_ahb_data_bus
.hw
,
2633 [CLKID_AHB_CTRL_BUS
] = &meson8b_ahb_ctrl_bus
.hw
,
2634 [CLKID_HDMI_INTR_SYNC
] = &meson8b_hdmi_intr_sync
.hw
,
2635 [CLKID_HDMI_PCLK
] = &meson8b_hdmi_pclk
.hw
,
2636 [CLKID_USB1_DDR_BRIDGE
] = &meson8b_usb1_ddr_bridge
.hw
,
2637 [CLKID_USB0_DDR_BRIDGE
] = &meson8b_usb0_ddr_bridge
.hw
,
2638 [CLKID_MMC_PCLK
] = &meson8b_mmc_pclk
.hw
,
2639 [CLKID_DVIN
] = &meson8b_dvin
.hw
,
2640 [CLKID_UART2
] = &meson8b_uart2
.hw
,
2641 [CLKID_SANA
] = &meson8b_sana
.hw
,
2642 [CLKID_VPU_INTR
] = &meson8b_vpu_intr
.hw
,
2643 [CLKID_SEC_AHB_AHB3_BRIDGE
] = &meson8b_sec_ahb_ahb3_bridge
.hw
,
2644 [CLKID_CLK81_A9
] = &meson8b_clk81_a9
.hw
,
2645 [CLKID_VCLK2_VENCI0
] = &meson8b_vclk2_venci0
.hw
,
2646 [CLKID_VCLK2_VENCI1
] = &meson8b_vclk2_venci1
.hw
,
2647 [CLKID_VCLK2_VENCP0
] = &meson8b_vclk2_vencp0
.hw
,
2648 [CLKID_VCLK2_VENCP1
] = &meson8b_vclk2_vencp1
.hw
,
2649 [CLKID_GCLK_VENCI_INT
] = &meson8b_gclk_venci_int
.hw
,
2650 [CLKID_GCLK_VENCP_INT
] = &meson8b_gclk_vencp_int
.hw
,
2651 [CLKID_DAC_CLK
] = &meson8b_dac_clk
.hw
,
2652 [CLKID_AOCLK_GATE
] = &meson8b_aoclk_gate
.hw
,
2653 [CLKID_IEC958_GATE
] = &meson8b_iec958_gate
.hw
,
2654 [CLKID_ENC480P
] = &meson8b_enc480p
.hw
,
2655 [CLKID_RNG1
] = &meson8b_rng1
.hw
,
2656 [CLKID_GCLK_VENCL_INT
] = &meson8b_gclk_vencl_int
.hw
,
2657 [CLKID_VCLK2_VENCLMCC
] = &meson8b_vclk2_venclmcc
.hw
,
2658 [CLKID_VCLK2_VENCL
] = &meson8b_vclk2_vencl
.hw
,
2659 [CLKID_VCLK2_OTHER
] = &meson8b_vclk2_other
.hw
,
2660 [CLKID_EDP
] = &meson8b_edp
.hw
,
2661 [CLKID_AO_MEDIA_CPU
] = &meson8b_ao_media_cpu
.hw
,
2662 [CLKID_AO_AHB_SRAM
] = &meson8b_ao_ahb_sram
.hw
,
2663 [CLKID_AO_AHB_BUS
] = &meson8b_ao_ahb_bus
.hw
,
2664 [CLKID_AO_IFACE
] = &meson8b_ao_iface
.hw
,
2665 [CLKID_MPLL0
] = &meson8b_mpll0
.hw
,
2666 [CLKID_MPLL1
] = &meson8b_mpll1
.hw
,
2667 [CLKID_MPLL2
] = &meson8b_mpll2
.hw
,
2668 [CLKID_MPLL0_DIV
] = &meson8b_mpll0_div
.hw
,
2669 [CLKID_MPLL1_DIV
] = &meson8b_mpll1_div
.hw
,
2670 [CLKID_MPLL2_DIV
] = &meson8b_mpll2_div
.hw
,
2671 [CLKID_CPU_IN_SEL
] = &meson8b_cpu_in_sel
.hw
,
2672 [CLKID_CPU_IN_DIV2
] = &meson8b_cpu_in_div2
.hw
,
2673 [CLKID_CPU_IN_DIV3
] = &meson8b_cpu_in_div3
.hw
,
2674 [CLKID_CPU_SCALE_DIV
] = &meson8b_cpu_scale_div
.hw
,
2675 [CLKID_CPU_SCALE_OUT_SEL
] = &meson8b_cpu_scale_out_sel
.hw
,
2676 [CLKID_MPLL_PREDIV
] = &meson8b_mpll_prediv
.hw
,
2677 [CLKID_FCLK_DIV2_DIV
] = &meson8b_fclk_div2_div
.hw
,
2678 [CLKID_FCLK_DIV3_DIV
] = &meson8b_fclk_div3_div
.hw
,
2679 [CLKID_FCLK_DIV4_DIV
] = &meson8b_fclk_div4_div
.hw
,
2680 [CLKID_FCLK_DIV5_DIV
] = &meson8b_fclk_div5_div
.hw
,
2681 [CLKID_FCLK_DIV7_DIV
] = &meson8b_fclk_div7_div
.hw
,
2682 [CLKID_NAND_SEL
] = &meson8b_nand_clk_sel
.hw
,
2683 [CLKID_NAND_DIV
] = &meson8b_nand_clk_div
.hw
,
2684 [CLKID_NAND_CLK
] = &meson8b_nand_clk_gate
.hw
,
2685 [CLKID_PLL_FIXED_DCO
] = &meson8b_fixed_pll_dco
.hw
,
2686 [CLKID_HDMI_PLL_DCO
] = &meson8b_hdmi_pll_dco
.hw
,
2687 [CLKID_PLL_SYS_DCO
] = &meson8b_sys_pll_dco
.hw
,
2688 [CLKID_CPU_CLK_DIV2
] = &meson8b_cpu_clk_div2
.hw
,
2689 [CLKID_CPU_CLK_DIV3
] = &meson8b_cpu_clk_div3
.hw
,
2690 [CLKID_CPU_CLK_DIV4
] = &meson8b_cpu_clk_div4
.hw
,
2691 [CLKID_CPU_CLK_DIV5
] = &meson8b_cpu_clk_div5
.hw
,
2692 [CLKID_CPU_CLK_DIV6
] = &meson8b_cpu_clk_div6
.hw
,
2693 [CLKID_CPU_CLK_DIV7
] = &meson8b_cpu_clk_div7
.hw
,
2694 [CLKID_CPU_CLK_DIV8
] = &meson8b_cpu_clk_div8
.hw
,
2695 [CLKID_APB_SEL
] = &meson8b_apb_clk_sel
.hw
,
2696 [CLKID_APB
] = &meson8b_apb_clk_gate
.hw
,
2697 [CLKID_PERIPH_SEL
] = &meson8b_periph_clk_sel
.hw
,
2698 [CLKID_PERIPH
] = &meson8b_periph_clk_gate
.hw
,
2699 [CLKID_AXI_SEL
] = &meson8b_axi_clk_sel
.hw
,
2700 [CLKID_AXI
] = &meson8b_axi_clk_gate
.hw
,
2701 [CLKID_L2_DRAM_SEL
] = &meson8b_l2_dram_clk_sel
.hw
,
2702 [CLKID_L2_DRAM
] = &meson8b_l2_dram_clk_gate
.hw
,
2703 [CLKID_HDMI_PLL_LVDS_OUT
] = &meson8b_hdmi_pll_lvds_out
.hw
,
2704 [CLKID_HDMI_PLL_HDMI_OUT
] = &meson8b_hdmi_pll_hdmi_out
.hw
,
2705 [CLKID_VID_PLL_IN_SEL
] = &meson8b_vid_pll_in_sel
.hw
,
2706 [CLKID_VID_PLL_IN_EN
] = &meson8b_vid_pll_in_en
.hw
,
2707 [CLKID_VID_PLL_PRE_DIV
] = &meson8b_vid_pll_pre_div
.hw
,
2708 [CLKID_VID_PLL_POST_DIV
] = &meson8b_vid_pll_post_div
.hw
,
2709 [CLKID_VID_PLL_FINAL_DIV
] = &meson8b_vid_pll_final_div
.hw
,
2710 [CLKID_VCLK_IN_SEL
] = &meson8b_vclk_in_sel
.hw
,
2711 [CLKID_VCLK_IN_EN
] = &meson8b_vclk_in_en
.hw
,
2712 [CLKID_VCLK_DIV1
] = &meson8b_vclk_div1_gate
.hw
,
2713 [CLKID_VCLK_DIV2_DIV
] = &meson8b_vclk_div2_div
.hw
,
2714 [CLKID_VCLK_DIV2
] = &meson8b_vclk_div2_div_gate
.hw
,
2715 [CLKID_VCLK_DIV4_DIV
] = &meson8b_vclk_div4_div
.hw
,
2716 [CLKID_VCLK_DIV4
] = &meson8b_vclk_div4_div_gate
.hw
,
2717 [CLKID_VCLK_DIV6_DIV
] = &meson8b_vclk_div6_div
.hw
,
2718 [CLKID_VCLK_DIV6
] = &meson8b_vclk_div6_div_gate
.hw
,
2719 [CLKID_VCLK_DIV12_DIV
] = &meson8b_vclk_div12_div
.hw
,
2720 [CLKID_VCLK_DIV12
] = &meson8b_vclk_div12_div_gate
.hw
,
2721 [CLKID_VCLK2_IN_SEL
] = &meson8b_vclk2_in_sel
.hw
,
2722 [CLKID_VCLK2_IN_EN
] = &meson8b_vclk2_clk_in_en
.hw
,
2723 [CLKID_VCLK2_DIV1
] = &meson8b_vclk2_div1_gate
.hw
,
2724 [CLKID_VCLK2_DIV2_DIV
] = &meson8b_vclk2_div2_div
.hw
,
2725 [CLKID_VCLK2_DIV2
] = &meson8b_vclk2_div2_div_gate
.hw
,
2726 [CLKID_VCLK2_DIV4_DIV
] = &meson8b_vclk2_div4_div
.hw
,
2727 [CLKID_VCLK2_DIV4
] = &meson8b_vclk2_div4_div_gate
.hw
,
2728 [CLKID_VCLK2_DIV6_DIV
] = &meson8b_vclk2_div6_div
.hw
,
2729 [CLKID_VCLK2_DIV6
] = &meson8b_vclk2_div6_div_gate
.hw
,
2730 [CLKID_VCLK2_DIV12_DIV
] = &meson8b_vclk2_div12_div
.hw
,
2731 [CLKID_VCLK2_DIV12
] = &meson8b_vclk2_div12_div_gate
.hw
,
2732 [CLKID_CTS_ENCT_SEL
] = &meson8b_cts_enct_sel
.hw
,
2733 [CLKID_CTS_ENCT
] = &meson8b_cts_enct
.hw
,
2734 [CLKID_CTS_ENCP_SEL
] = &meson8b_cts_encp_sel
.hw
,
2735 [CLKID_CTS_ENCP
] = &meson8b_cts_encp
.hw
,
2736 [CLKID_CTS_ENCI_SEL
] = &meson8b_cts_enci_sel
.hw
,
2737 [CLKID_CTS_ENCI
] = &meson8b_cts_enci
.hw
,
2738 [CLKID_HDMI_TX_PIXEL_SEL
] = &meson8b_hdmi_tx_pixel_sel
.hw
,
2739 [CLKID_HDMI_TX_PIXEL
] = &meson8b_hdmi_tx_pixel
.hw
,
2740 [CLKID_CTS_ENCL_SEL
] = &meson8b_cts_encl_sel
.hw
,
2741 [CLKID_CTS_ENCL
] = &meson8b_cts_encl
.hw
,
2742 [CLKID_CTS_VDAC0_SEL
] = &meson8b_cts_vdac0_sel
.hw
,
2743 [CLKID_CTS_VDAC0
] = &meson8b_cts_vdac0
.hw
,
2744 [CLKID_HDMI_SYS_SEL
] = &meson8b_hdmi_sys_sel
.hw
,
2745 [CLKID_HDMI_SYS_DIV
] = &meson8b_hdmi_sys_div
.hw
,
2746 [CLKID_HDMI_SYS
] = &meson8b_hdmi_sys
.hw
,
2747 [CLKID_MALI_0_SEL
] = &meson8b_mali_0_sel
.hw
,
2748 [CLKID_MALI_0_DIV
] = &meson8b_mali_0_div
.hw
,
2749 [CLKID_MALI_0
] = &meson8b_mali_0
.hw
,
2750 [CLKID_MALI_1_SEL
] = &meson8b_mali_1_sel
.hw
,
2751 [CLKID_MALI_1_DIV
] = &meson8b_mali_1_div
.hw
,
2752 [CLKID_MALI_1
] = &meson8b_mali_1
.hw
,
2753 [CLKID_MALI
] = &meson8b_mali
.hw
,
2754 [CLKID_VPU_0_SEL
] = &meson8b_vpu_0_sel
.hw
,
2755 [CLKID_VPU_0_DIV
] = &meson8b_vpu_0_div
.hw
,
2756 [CLKID_VPU_0
] = &meson8b_vpu_0
.hw
,
2757 [CLKID_VPU_1_SEL
] = &meson8b_vpu_1_sel
.hw
,
2758 [CLKID_VPU_1_DIV
] = &meson8b_vpu_1_div
.hw
,
2759 [CLKID_VPU_1
] = &meson8b_vpu_1
.hw
,
2760 [CLKID_VPU
] = &meson8b_vpu
.hw
,
2761 [CLKID_VDEC_1_SEL
] = &meson8b_vdec_1_sel
.hw
,
2762 [CLKID_VDEC_1_1_DIV
] = &meson8b_vdec_1_1_div
.hw
,
2763 [CLKID_VDEC_1_1
] = &meson8b_vdec_1_1
.hw
,
2764 [CLKID_VDEC_1_2_DIV
] = &meson8b_vdec_1_2_div
.hw
,
2765 [CLKID_VDEC_1_2
] = &meson8b_vdec_1_2
.hw
,
2766 [CLKID_VDEC_1
] = &meson8b_vdec_1
.hw
,
2767 [CLKID_VDEC_HCODEC_SEL
] = &meson8b_vdec_hcodec_sel
.hw
,
2768 [CLKID_VDEC_HCODEC_DIV
] = &meson8b_vdec_hcodec_div
.hw
,
2769 [CLKID_VDEC_HCODEC
] = &meson8b_vdec_hcodec
.hw
,
2770 [CLKID_VDEC_2_SEL
] = &meson8b_vdec_2_sel
.hw
,
2771 [CLKID_VDEC_2_DIV
] = &meson8b_vdec_2_div
.hw
,
2772 [CLKID_VDEC_2
] = &meson8b_vdec_2
.hw
,
2773 [CLKID_VDEC_HEVC_SEL
] = &meson8b_vdec_hevc_sel
.hw
,
2774 [CLKID_VDEC_HEVC_DIV
] = &meson8b_vdec_hevc_div
.hw
,
2775 [CLKID_VDEC_HEVC_EN
] = &meson8b_vdec_hevc_en
.hw
,
2776 [CLKID_VDEC_HEVC
] = &meson8b_vdec_hevc
.hw
,
2777 [CLKID_CTS_AMCLK_SEL
] = &meson8b_cts_amclk_sel
.hw
,
2778 [CLKID_CTS_AMCLK_DIV
] = &meson8b_cts_amclk_div
.hw
,
2779 [CLKID_CTS_AMCLK
] = &meson8b_cts_amclk
.hw
,
2780 [CLKID_CTS_MCLK_I958_SEL
] = &meson8b_cts_mclk_i958_sel
.hw
,
2781 [CLKID_CTS_MCLK_I958_DIV
] = &meson8b_cts_mclk_i958_div
.hw
,
2782 [CLKID_CTS_MCLK_I958
] = &meson8b_cts_mclk_i958
.hw
,
2783 [CLKID_CTS_I958
] = &meson8b_cts_i958
.hw
,
2784 [CLK_NR_CLKS
] = NULL
,
2789 static struct clk_hw_onecell_data meson8m2_hw_onecell_data
= {
2791 [CLKID_XTAL
] = &meson8b_xtal
.hw
,
2792 [CLKID_PLL_FIXED
] = &meson8b_fixed_pll
.hw
,
2793 [CLKID_PLL_VID
] = &meson8b_vid_pll
.hw
,
2794 [CLKID_PLL_SYS
] = &meson8b_sys_pll
.hw
,
2795 [CLKID_FCLK_DIV2
] = &meson8b_fclk_div2
.hw
,
2796 [CLKID_FCLK_DIV3
] = &meson8b_fclk_div3
.hw
,
2797 [CLKID_FCLK_DIV4
] = &meson8b_fclk_div4
.hw
,
2798 [CLKID_FCLK_DIV5
] = &meson8b_fclk_div5
.hw
,
2799 [CLKID_FCLK_DIV7
] = &meson8b_fclk_div7
.hw
,
2800 [CLKID_CPUCLK
] = &meson8b_cpu_clk
.hw
,
2801 [CLKID_MPEG_SEL
] = &meson8b_mpeg_clk_sel
.hw
,
2802 [CLKID_MPEG_DIV
] = &meson8b_mpeg_clk_div
.hw
,
2803 [CLKID_CLK81
] = &meson8b_clk81
.hw
,
2804 [CLKID_DDR
] = &meson8b_ddr
.hw
,
2805 [CLKID_DOS
] = &meson8b_dos
.hw
,
2806 [CLKID_ISA
] = &meson8b_isa
.hw
,
2807 [CLKID_PL301
] = &meson8b_pl301
.hw
,
2808 [CLKID_PERIPHS
] = &meson8b_periphs
.hw
,
2809 [CLKID_SPICC
] = &meson8b_spicc
.hw
,
2810 [CLKID_I2C
] = &meson8b_i2c
.hw
,
2811 [CLKID_SAR_ADC
] = &meson8b_sar_adc
.hw
,
2812 [CLKID_SMART_CARD
] = &meson8b_smart_card
.hw
,
2813 [CLKID_RNG0
] = &meson8b_rng0
.hw
,
2814 [CLKID_UART0
] = &meson8b_uart0
.hw
,
2815 [CLKID_SDHC
] = &meson8b_sdhc
.hw
,
2816 [CLKID_STREAM
] = &meson8b_stream
.hw
,
2817 [CLKID_ASYNC_FIFO
] = &meson8b_async_fifo
.hw
,
2818 [CLKID_SDIO
] = &meson8b_sdio
.hw
,
2819 [CLKID_ABUF
] = &meson8b_abuf
.hw
,
2820 [CLKID_HIU_IFACE
] = &meson8b_hiu_iface
.hw
,
2821 [CLKID_ASSIST_MISC
] = &meson8b_assist_misc
.hw
,
2822 [CLKID_SPI
] = &meson8b_spi
.hw
,
2823 [CLKID_I2S_SPDIF
] = &meson8b_i2s_spdif
.hw
,
2824 [CLKID_ETH
] = &meson8b_eth
.hw
,
2825 [CLKID_DEMUX
] = &meson8b_demux
.hw
,
2826 [CLKID_AIU_GLUE
] = &meson8b_aiu_glue
.hw
,
2827 [CLKID_IEC958
] = &meson8b_iec958
.hw
,
2828 [CLKID_I2S_OUT
] = &meson8b_i2s_out
.hw
,
2829 [CLKID_AMCLK
] = &meson8b_amclk
.hw
,
2830 [CLKID_AIFIFO2
] = &meson8b_aififo2
.hw
,
2831 [CLKID_MIXER
] = &meson8b_mixer
.hw
,
2832 [CLKID_MIXER_IFACE
] = &meson8b_mixer_iface
.hw
,
2833 [CLKID_ADC
] = &meson8b_adc
.hw
,
2834 [CLKID_BLKMV
] = &meson8b_blkmv
.hw
,
2835 [CLKID_AIU
] = &meson8b_aiu
.hw
,
2836 [CLKID_UART1
] = &meson8b_uart1
.hw
,
2837 [CLKID_G2D
] = &meson8b_g2d
.hw
,
2838 [CLKID_USB0
] = &meson8b_usb0
.hw
,
2839 [CLKID_USB1
] = &meson8b_usb1
.hw
,
2840 [CLKID_RESET
] = &meson8b_reset
.hw
,
2841 [CLKID_NAND
] = &meson8b_nand
.hw
,
2842 [CLKID_DOS_PARSER
] = &meson8b_dos_parser
.hw
,
2843 [CLKID_USB
] = &meson8b_usb
.hw
,
2844 [CLKID_VDIN1
] = &meson8b_vdin1
.hw
,
2845 [CLKID_AHB_ARB0
] = &meson8b_ahb_arb0
.hw
,
2846 [CLKID_EFUSE
] = &meson8b_efuse
.hw
,
2847 [CLKID_BOOT_ROM
] = &meson8b_boot_rom
.hw
,
2848 [CLKID_AHB_DATA_BUS
] = &meson8b_ahb_data_bus
.hw
,
2849 [CLKID_AHB_CTRL_BUS
] = &meson8b_ahb_ctrl_bus
.hw
,
2850 [CLKID_HDMI_INTR_SYNC
] = &meson8b_hdmi_intr_sync
.hw
,
2851 [CLKID_HDMI_PCLK
] = &meson8b_hdmi_pclk
.hw
,
2852 [CLKID_USB1_DDR_BRIDGE
] = &meson8b_usb1_ddr_bridge
.hw
,
2853 [CLKID_USB0_DDR_BRIDGE
] = &meson8b_usb0_ddr_bridge
.hw
,
2854 [CLKID_MMC_PCLK
] = &meson8b_mmc_pclk
.hw
,
2855 [CLKID_DVIN
] = &meson8b_dvin
.hw
,
2856 [CLKID_UART2
] = &meson8b_uart2
.hw
,
2857 [CLKID_SANA
] = &meson8b_sana
.hw
,
2858 [CLKID_VPU_INTR
] = &meson8b_vpu_intr
.hw
,
2859 [CLKID_SEC_AHB_AHB3_BRIDGE
] = &meson8b_sec_ahb_ahb3_bridge
.hw
,
2860 [CLKID_CLK81_A9
] = &meson8b_clk81_a9
.hw
,
2861 [CLKID_VCLK2_VENCI0
] = &meson8b_vclk2_venci0
.hw
,
2862 [CLKID_VCLK2_VENCI1
] = &meson8b_vclk2_venci1
.hw
,
2863 [CLKID_VCLK2_VENCP0
] = &meson8b_vclk2_vencp0
.hw
,
2864 [CLKID_VCLK2_VENCP1
] = &meson8b_vclk2_vencp1
.hw
,
2865 [CLKID_GCLK_VENCI_INT
] = &meson8b_gclk_venci_int
.hw
,
2866 [CLKID_GCLK_VENCP_INT
] = &meson8b_gclk_vencp_int
.hw
,
2867 [CLKID_DAC_CLK
] = &meson8b_dac_clk
.hw
,
2868 [CLKID_AOCLK_GATE
] = &meson8b_aoclk_gate
.hw
,
2869 [CLKID_IEC958_GATE
] = &meson8b_iec958_gate
.hw
,
2870 [CLKID_ENC480P
] = &meson8b_enc480p
.hw
,
2871 [CLKID_RNG1
] = &meson8b_rng1
.hw
,
2872 [CLKID_GCLK_VENCL_INT
] = &meson8b_gclk_vencl_int
.hw
,
2873 [CLKID_VCLK2_VENCLMCC
] = &meson8b_vclk2_venclmcc
.hw
,
2874 [CLKID_VCLK2_VENCL
] = &meson8b_vclk2_vencl
.hw
,
2875 [CLKID_VCLK2_OTHER
] = &meson8b_vclk2_other
.hw
,
2876 [CLKID_EDP
] = &meson8b_edp
.hw
,
2877 [CLKID_AO_MEDIA_CPU
] = &meson8b_ao_media_cpu
.hw
,
2878 [CLKID_AO_AHB_SRAM
] = &meson8b_ao_ahb_sram
.hw
,
2879 [CLKID_AO_AHB_BUS
] = &meson8b_ao_ahb_bus
.hw
,
2880 [CLKID_AO_IFACE
] = &meson8b_ao_iface
.hw
,
2881 [CLKID_MPLL0
] = &meson8b_mpll0
.hw
,
2882 [CLKID_MPLL1
] = &meson8b_mpll1
.hw
,
2883 [CLKID_MPLL2
] = &meson8b_mpll2
.hw
,
2884 [CLKID_MPLL0_DIV
] = &meson8b_mpll0_div
.hw
,
2885 [CLKID_MPLL1_DIV
] = &meson8b_mpll1_div
.hw
,
2886 [CLKID_MPLL2_DIV
] = &meson8b_mpll2_div
.hw
,
2887 [CLKID_CPU_IN_SEL
] = &meson8b_cpu_in_sel
.hw
,
2888 [CLKID_CPU_IN_DIV2
] = &meson8b_cpu_in_div2
.hw
,
2889 [CLKID_CPU_IN_DIV3
] = &meson8b_cpu_in_div3
.hw
,
2890 [CLKID_CPU_SCALE_DIV
] = &meson8b_cpu_scale_div
.hw
,
2891 [CLKID_CPU_SCALE_OUT_SEL
] = &meson8b_cpu_scale_out_sel
.hw
,
2892 [CLKID_MPLL_PREDIV
] = &meson8b_mpll_prediv
.hw
,
2893 [CLKID_FCLK_DIV2_DIV
] = &meson8b_fclk_div2_div
.hw
,
2894 [CLKID_FCLK_DIV3_DIV
] = &meson8b_fclk_div3_div
.hw
,
2895 [CLKID_FCLK_DIV4_DIV
] = &meson8b_fclk_div4_div
.hw
,
2896 [CLKID_FCLK_DIV5_DIV
] = &meson8b_fclk_div5_div
.hw
,
2897 [CLKID_FCLK_DIV7_DIV
] = &meson8b_fclk_div7_div
.hw
,
2898 [CLKID_NAND_SEL
] = &meson8b_nand_clk_sel
.hw
,
2899 [CLKID_NAND_DIV
] = &meson8b_nand_clk_div
.hw
,
2900 [CLKID_NAND_CLK
] = &meson8b_nand_clk_gate
.hw
,
2901 [CLKID_PLL_FIXED_DCO
] = &meson8b_fixed_pll_dco
.hw
,
2902 [CLKID_HDMI_PLL_DCO
] = &meson8b_hdmi_pll_dco
.hw
,
2903 [CLKID_PLL_SYS_DCO
] = &meson8b_sys_pll_dco
.hw
,
2904 [CLKID_CPU_CLK_DIV2
] = &meson8b_cpu_clk_div2
.hw
,
2905 [CLKID_CPU_CLK_DIV3
] = &meson8b_cpu_clk_div3
.hw
,
2906 [CLKID_CPU_CLK_DIV4
] = &meson8b_cpu_clk_div4
.hw
,
2907 [CLKID_CPU_CLK_DIV5
] = &meson8b_cpu_clk_div5
.hw
,
2908 [CLKID_CPU_CLK_DIV6
] = &meson8b_cpu_clk_div6
.hw
,
2909 [CLKID_CPU_CLK_DIV7
] = &meson8b_cpu_clk_div7
.hw
,
2910 [CLKID_CPU_CLK_DIV8
] = &meson8b_cpu_clk_div8
.hw
,
2911 [CLKID_APB_SEL
] = &meson8b_apb_clk_sel
.hw
,
2912 [CLKID_APB
] = &meson8b_apb_clk_gate
.hw
,
2913 [CLKID_PERIPH_SEL
] = &meson8b_periph_clk_sel
.hw
,
2914 [CLKID_PERIPH
] = &meson8b_periph_clk_gate
.hw
,
2915 [CLKID_AXI_SEL
] = &meson8b_axi_clk_sel
.hw
,
2916 [CLKID_AXI
] = &meson8b_axi_clk_gate
.hw
,
2917 [CLKID_L2_DRAM_SEL
] = &meson8b_l2_dram_clk_sel
.hw
,
2918 [CLKID_L2_DRAM
] = &meson8b_l2_dram_clk_gate
.hw
,
2919 [CLKID_HDMI_PLL_LVDS_OUT
] = &meson8b_hdmi_pll_lvds_out
.hw
,
2920 [CLKID_HDMI_PLL_HDMI_OUT
] = &meson8b_hdmi_pll_hdmi_out
.hw
,
2921 [CLKID_VID_PLL_IN_SEL
] = &meson8b_vid_pll_in_sel
.hw
,
2922 [CLKID_VID_PLL_IN_EN
] = &meson8b_vid_pll_in_en
.hw
,
2923 [CLKID_VID_PLL_PRE_DIV
] = &meson8b_vid_pll_pre_div
.hw
,
2924 [CLKID_VID_PLL_POST_DIV
] = &meson8b_vid_pll_post_div
.hw
,
2925 [CLKID_VID_PLL_FINAL_DIV
] = &meson8b_vid_pll_final_div
.hw
,
2926 [CLKID_VCLK_IN_SEL
] = &meson8b_vclk_in_sel
.hw
,
2927 [CLKID_VCLK_IN_EN
] = &meson8b_vclk_in_en
.hw
,
2928 [CLKID_VCLK_DIV1
] = &meson8b_vclk_div1_gate
.hw
,
2929 [CLKID_VCLK_DIV2_DIV
] = &meson8b_vclk_div2_div
.hw
,
2930 [CLKID_VCLK_DIV2
] = &meson8b_vclk_div2_div_gate
.hw
,
2931 [CLKID_VCLK_DIV4_DIV
] = &meson8b_vclk_div4_div
.hw
,
2932 [CLKID_VCLK_DIV4
] = &meson8b_vclk_div4_div_gate
.hw
,
2933 [CLKID_VCLK_DIV6_DIV
] = &meson8b_vclk_div6_div
.hw
,
2934 [CLKID_VCLK_DIV6
] = &meson8b_vclk_div6_div_gate
.hw
,
2935 [CLKID_VCLK_DIV12_DIV
] = &meson8b_vclk_div12_div
.hw
,
2936 [CLKID_VCLK_DIV12
] = &meson8b_vclk_div12_div_gate
.hw
,
2937 [CLKID_VCLK2_IN_SEL
] = &meson8b_vclk2_in_sel
.hw
,
2938 [CLKID_VCLK2_IN_EN
] = &meson8b_vclk2_clk_in_en
.hw
,
2939 [CLKID_VCLK2_DIV1
] = &meson8b_vclk2_div1_gate
.hw
,
2940 [CLKID_VCLK2_DIV2_DIV
] = &meson8b_vclk2_div2_div
.hw
,
2941 [CLKID_VCLK2_DIV2
] = &meson8b_vclk2_div2_div_gate
.hw
,
2942 [CLKID_VCLK2_DIV4_DIV
] = &meson8b_vclk2_div4_div
.hw
,
2943 [CLKID_VCLK2_DIV4
] = &meson8b_vclk2_div4_div_gate
.hw
,
2944 [CLKID_VCLK2_DIV6_DIV
] = &meson8b_vclk2_div6_div
.hw
,
2945 [CLKID_VCLK2_DIV6
] = &meson8b_vclk2_div6_div_gate
.hw
,
2946 [CLKID_VCLK2_DIV12_DIV
] = &meson8b_vclk2_div12_div
.hw
,
2947 [CLKID_VCLK2_DIV12
] = &meson8b_vclk2_div12_div_gate
.hw
,
2948 [CLKID_CTS_ENCT_SEL
] = &meson8b_cts_enct_sel
.hw
,
2949 [CLKID_CTS_ENCT
] = &meson8b_cts_enct
.hw
,
2950 [CLKID_CTS_ENCP_SEL
] = &meson8b_cts_encp_sel
.hw
,
2951 [CLKID_CTS_ENCP
] = &meson8b_cts_encp
.hw
,
2952 [CLKID_CTS_ENCI_SEL
] = &meson8b_cts_enci_sel
.hw
,
2953 [CLKID_CTS_ENCI
] = &meson8b_cts_enci
.hw
,
2954 [CLKID_HDMI_TX_PIXEL_SEL
] = &meson8b_hdmi_tx_pixel_sel
.hw
,
2955 [CLKID_HDMI_TX_PIXEL
] = &meson8b_hdmi_tx_pixel
.hw
,
2956 [CLKID_CTS_ENCL_SEL
] = &meson8b_cts_encl_sel
.hw
,
2957 [CLKID_CTS_ENCL
] = &meson8b_cts_encl
.hw
,
2958 [CLKID_CTS_VDAC0_SEL
] = &meson8b_cts_vdac0_sel
.hw
,
2959 [CLKID_CTS_VDAC0
] = &meson8b_cts_vdac0
.hw
,
2960 [CLKID_HDMI_SYS_SEL
] = &meson8b_hdmi_sys_sel
.hw
,
2961 [CLKID_HDMI_SYS_DIV
] = &meson8b_hdmi_sys_div
.hw
,
2962 [CLKID_HDMI_SYS
] = &meson8b_hdmi_sys
.hw
,
2963 [CLKID_MALI_0_SEL
] = &meson8b_mali_0_sel
.hw
,
2964 [CLKID_MALI_0_DIV
] = &meson8b_mali_0_div
.hw
,
2965 [CLKID_MALI_0
] = &meson8b_mali_0
.hw
,
2966 [CLKID_MALI_1_SEL
] = &meson8b_mali_1_sel
.hw
,
2967 [CLKID_MALI_1_DIV
] = &meson8b_mali_1_div
.hw
,
2968 [CLKID_MALI_1
] = &meson8b_mali_1
.hw
,
2969 [CLKID_MALI
] = &meson8b_mali
.hw
,
2970 [CLKID_GP_PLL_DCO
] = &meson8m2_gp_pll_dco
.hw
,
2971 [CLKID_GP_PLL
] = &meson8m2_gp_pll
.hw
,
2972 [CLKID_VPU_0_SEL
] = &meson8m2_vpu_0_sel
.hw
,
2973 [CLKID_VPU_0_DIV
] = &meson8b_vpu_0_div
.hw
,
2974 [CLKID_VPU_0
] = &meson8b_vpu_0
.hw
,
2975 [CLKID_VPU_1_SEL
] = &meson8m2_vpu_1_sel
.hw
,
2976 [CLKID_VPU_1_DIV
] = &meson8b_vpu_1_div
.hw
,
2977 [CLKID_VPU_1
] = &meson8b_vpu_1
.hw
,
2978 [CLKID_VPU
] = &meson8b_vpu
.hw
,
2979 [CLKID_VDEC_1_SEL
] = &meson8b_vdec_1_sel
.hw
,
2980 [CLKID_VDEC_1_1_DIV
] = &meson8b_vdec_1_1_div
.hw
,
2981 [CLKID_VDEC_1_1
] = &meson8b_vdec_1_1
.hw
,
2982 [CLKID_VDEC_1_2_DIV
] = &meson8b_vdec_1_2_div
.hw
,
2983 [CLKID_VDEC_1_2
] = &meson8b_vdec_1_2
.hw
,
2984 [CLKID_VDEC_1
] = &meson8b_vdec_1
.hw
,
2985 [CLKID_VDEC_HCODEC_SEL
] = &meson8b_vdec_hcodec_sel
.hw
,
2986 [CLKID_VDEC_HCODEC_DIV
] = &meson8b_vdec_hcodec_div
.hw
,
2987 [CLKID_VDEC_HCODEC
] = &meson8b_vdec_hcodec
.hw
,
2988 [CLKID_VDEC_2_SEL
] = &meson8b_vdec_2_sel
.hw
,
2989 [CLKID_VDEC_2_DIV
] = &meson8b_vdec_2_div
.hw
,
2990 [CLKID_VDEC_2
] = &meson8b_vdec_2
.hw
,
2991 [CLKID_VDEC_HEVC_SEL
] = &meson8b_vdec_hevc_sel
.hw
,
2992 [CLKID_VDEC_HEVC_DIV
] = &meson8b_vdec_hevc_div
.hw
,
2993 [CLKID_VDEC_HEVC_EN
] = &meson8b_vdec_hevc_en
.hw
,
2994 [CLKID_VDEC_HEVC
] = &meson8b_vdec_hevc
.hw
,
2995 [CLKID_CTS_AMCLK_SEL
] = &meson8b_cts_amclk_sel
.hw
,
2996 [CLKID_CTS_AMCLK_DIV
] = &meson8b_cts_amclk_div
.hw
,
2997 [CLKID_CTS_AMCLK
] = &meson8b_cts_amclk
.hw
,
2998 [CLKID_CTS_MCLK_I958_SEL
] = &meson8b_cts_mclk_i958_sel
.hw
,
2999 [CLKID_CTS_MCLK_I958_DIV
] = &meson8b_cts_mclk_i958_div
.hw
,
3000 [CLKID_CTS_MCLK_I958
] = &meson8b_cts_mclk_i958
.hw
,
3001 [CLKID_CTS_I958
] = &meson8b_cts_i958
.hw
,
3002 [CLK_NR_CLKS
] = NULL
,
3007 static struct clk_regmap
*const meson8b_clk_regmaps
[] = {
3017 &meson8b_smart_card
,
3022 &meson8b_async_fifo
,
3026 &meson8b_assist_misc
,
3037 &meson8b_mixer_iface
,
3047 &meson8b_dos_parser
,
3053 &meson8b_ahb_data_bus
,
3054 &meson8b_ahb_ctrl_bus
,
3055 &meson8b_hdmi_intr_sync
,
3057 &meson8b_usb1_ddr_bridge
,
3058 &meson8b_usb0_ddr_bridge
,
3064 &meson8b_sec_ahb_ahb3_bridge
,
3066 &meson8b_vclk2_venci0
,
3067 &meson8b_vclk2_venci1
,
3068 &meson8b_vclk2_vencp0
,
3069 &meson8b_vclk2_vencp1
,
3070 &meson8b_gclk_venci_int
,
3071 &meson8b_gclk_vencp_int
,
3073 &meson8b_aoclk_gate
,
3074 &meson8b_iec958_gate
,
3077 &meson8b_gclk_vencl_int
,
3078 &meson8b_vclk2_venclmcc
,
3079 &meson8b_vclk2_vencl
,
3080 &meson8b_vclk2_other
,
3082 &meson8b_ao_media_cpu
,
3083 &meson8b_ao_ahb_sram
,
3084 &meson8b_ao_ahb_bus
,
3086 &meson8b_mpeg_clk_div
,
3087 &meson8b_mpeg_clk_sel
,
3096 &meson8b_cpu_in_sel
,
3097 &meson8b_cpu_scale_div
,
3098 &meson8b_cpu_scale_out_sel
,
3100 &meson8b_mpll_prediv
,
3106 &meson8b_nand_clk_sel
,
3107 &meson8b_nand_clk_div
,
3108 &meson8b_nand_clk_gate
,
3109 &meson8b_fixed_pll_dco
,
3110 &meson8b_hdmi_pll_dco
,
3111 &meson8b_sys_pll_dco
,
3112 &meson8b_apb_clk_sel
,
3113 &meson8b_apb_clk_gate
,
3114 &meson8b_periph_clk_sel
,
3115 &meson8b_periph_clk_gate
,
3116 &meson8b_axi_clk_sel
,
3117 &meson8b_axi_clk_gate
,
3118 &meson8b_l2_dram_clk_sel
,
3119 &meson8b_l2_dram_clk_gate
,
3120 &meson8b_hdmi_pll_lvds_out
,
3121 &meson8b_hdmi_pll_hdmi_out
,
3122 &meson8b_vid_pll_in_sel
,
3123 &meson8b_vid_pll_in_en
,
3124 &meson8b_vid_pll_pre_div
,
3125 &meson8b_vid_pll_post_div
,
3127 &meson8b_vid_pll_final_div
,
3128 &meson8b_vclk_in_sel
,
3129 &meson8b_vclk_in_en
,
3130 &meson8b_vclk_div1_gate
,
3131 &meson8b_vclk_div2_div_gate
,
3132 &meson8b_vclk_div4_div_gate
,
3133 &meson8b_vclk_div6_div_gate
,
3134 &meson8b_vclk_div12_div_gate
,
3135 &meson8b_vclk2_in_sel
,
3136 &meson8b_vclk2_clk_in_en
,
3137 &meson8b_vclk2_div1_gate
,
3138 &meson8b_vclk2_div2_div_gate
,
3139 &meson8b_vclk2_div4_div_gate
,
3140 &meson8b_vclk2_div6_div_gate
,
3141 &meson8b_vclk2_div12_div_gate
,
3142 &meson8b_cts_enct_sel
,
3144 &meson8b_cts_encp_sel
,
3146 &meson8b_cts_enci_sel
,
3148 &meson8b_hdmi_tx_pixel_sel
,
3149 &meson8b_hdmi_tx_pixel
,
3150 &meson8b_cts_encl_sel
,
3152 &meson8b_cts_vdac0_sel
,
3154 &meson8b_hdmi_sys_sel
,
3155 &meson8b_hdmi_sys_div
,
3157 &meson8b_mali_0_sel
,
3158 &meson8b_mali_0_div
,
3160 &meson8b_mali_1_sel
,
3161 &meson8b_mali_1_div
,
3164 &meson8m2_gp_pll_dco
,
3167 &meson8m2_vpu_0_sel
,
3171 &meson8m2_vpu_1_sel
,
3175 &meson8b_vdec_1_sel
,
3176 &meson8b_vdec_1_1_div
,
3178 &meson8b_vdec_1_2_div
,
3181 &meson8b_vdec_hcodec_sel
,
3182 &meson8b_vdec_hcodec_div
,
3183 &meson8b_vdec_hcodec
,
3184 &meson8b_vdec_2_sel
,
3185 &meson8b_vdec_2_div
,
3187 &meson8b_vdec_hevc_sel
,
3188 &meson8b_vdec_hevc_div
,
3189 &meson8b_vdec_hevc_en
,
3192 &meson8b_cts_amclk_sel
,
3193 &meson8b_cts_amclk_div
,
3194 &meson8b_cts_mclk_i958_sel
,
3195 &meson8b_cts_mclk_i958_div
,
3196 &meson8b_cts_mclk_i958
,
3200 static const struct meson8b_clk_reset_line
{
3203 } meson8b_clk_reset_bits
[] = {
3204 [CLKC_RESET_L2_CACHE_SOFT_RESET
] = {
3205 .reg
= HHI_SYS_CPU_CLK_CNTL0
, .bit_idx
= 30
3207 [CLKC_RESET_AXI_64_TO_128_BRIDGE_A5_SOFT_RESET
] = {
3208 .reg
= HHI_SYS_CPU_CLK_CNTL0
, .bit_idx
= 29
3210 [CLKC_RESET_SCU_SOFT_RESET
] = {
3211 .reg
= HHI_SYS_CPU_CLK_CNTL0
, .bit_idx
= 28
3213 [CLKC_RESET_CPU3_SOFT_RESET
] = {
3214 .reg
= HHI_SYS_CPU_CLK_CNTL0
, .bit_idx
= 27
3216 [CLKC_RESET_CPU2_SOFT_RESET
] = {
3217 .reg
= HHI_SYS_CPU_CLK_CNTL0
, .bit_idx
= 26
3219 [CLKC_RESET_CPU1_SOFT_RESET
] = {
3220 .reg
= HHI_SYS_CPU_CLK_CNTL0
, .bit_idx
= 25
3222 [CLKC_RESET_CPU0_SOFT_RESET
] = {
3223 .reg
= HHI_SYS_CPU_CLK_CNTL0
, .bit_idx
= 24
3225 [CLKC_RESET_A5_GLOBAL_RESET
] = {
3226 .reg
= HHI_SYS_CPU_CLK_CNTL0
, .bit_idx
= 18
3228 [CLKC_RESET_A5_AXI_SOFT_RESET
] = {
3229 .reg
= HHI_SYS_CPU_CLK_CNTL0
, .bit_idx
= 17
3231 [CLKC_RESET_A5_ABP_SOFT_RESET
] = {
3232 .reg
= HHI_SYS_CPU_CLK_CNTL0
, .bit_idx
= 16
3234 [CLKC_RESET_AXI_64_TO_128_BRIDGE_MMC_SOFT_RESET
] = {
3235 .reg
= HHI_SYS_CPU_CLK_CNTL1
, .bit_idx
= 30
3237 [CLKC_RESET_VID_CLK_CNTL_SOFT_RESET
] = {
3238 .reg
= HHI_VID_CLK_CNTL
, .bit_idx
= 15
3240 [CLKC_RESET_VID_DIVIDER_CNTL_SOFT_RESET_POST
] = {
3241 .reg
= HHI_VID_DIVIDER_CNTL
, .bit_idx
= 7
3243 [CLKC_RESET_VID_DIVIDER_CNTL_SOFT_RESET_PRE
] = {
3244 .reg
= HHI_VID_DIVIDER_CNTL
, .bit_idx
= 3
3246 [CLKC_RESET_VID_DIVIDER_CNTL_RESET_N_POST
] = {
3247 .reg
= HHI_VID_DIVIDER_CNTL
, .bit_idx
= 1
3249 [CLKC_RESET_VID_DIVIDER_CNTL_RESET_N_PRE
] = {
3250 .reg
= HHI_VID_DIVIDER_CNTL
, .bit_idx
= 0
3254 static int meson8b_clk_reset_update(struct reset_controller_dev
*rcdev
,
3255 unsigned long id
, bool assert)
3257 struct meson8b_clk_reset
*meson8b_clk_reset
=
3258 container_of(rcdev
, struct meson8b_clk_reset
, reset
);
3259 unsigned long flags
;
3260 const struct meson8b_clk_reset_line
*reset
;
3262 if (id
>= ARRAY_SIZE(meson8b_clk_reset_bits
))
3265 reset
= &meson8b_clk_reset_bits
[id
];
3267 spin_lock_irqsave(&meson_clk_lock
, flags
);
3270 regmap_update_bits(meson8b_clk_reset
->regmap
, reset
->reg
,
3271 BIT(reset
->bit_idx
), BIT(reset
->bit_idx
));
3273 regmap_update_bits(meson8b_clk_reset
->regmap
, reset
->reg
,
3274 BIT(reset
->bit_idx
), 0);
3276 spin_unlock_irqrestore(&meson_clk_lock
, flags
);
3281 static int meson8b_clk_reset_assert(struct reset_controller_dev
*rcdev
,
3284 return meson8b_clk_reset_update(rcdev
, id
, true);
3287 static int meson8b_clk_reset_deassert(struct reset_controller_dev
*rcdev
,
3290 return meson8b_clk_reset_update(rcdev
, id
, false);
3293 static const struct reset_control_ops meson8b_clk_reset_ops
= {
3294 .assert = meson8b_clk_reset_assert
,
3295 .deassert
= meson8b_clk_reset_deassert
,
3298 struct meson8b_nb_data
{
3299 struct notifier_block nb
;
3300 struct clk_hw_onecell_data
*onecell_data
;
3303 static int meson8b_cpu_clk_notifier_cb(struct notifier_block
*nb
,
3304 unsigned long event
, void *data
)
3306 struct meson8b_nb_data
*nb_data
=
3307 container_of(nb
, struct meson8b_nb_data
, nb
);
3308 struct clk_hw
**hws
= nb_data
->onecell_data
->hws
;
3309 struct clk_hw
*cpu_clk_hw
, *parent_clk_hw
;
3310 struct clk
*cpu_clk
, *parent_clk
;
3314 case PRE_RATE_CHANGE
:
3315 parent_clk_hw
= hws
[CLKID_XTAL
];
3318 case POST_RATE_CHANGE
:
3319 parent_clk_hw
= hws
[CLKID_CPU_SCALE_OUT_SEL
];
3326 cpu_clk_hw
= hws
[CLKID_CPUCLK
];
3327 cpu_clk
= __clk_lookup(clk_hw_get_name(cpu_clk_hw
));
3329 parent_clk
= __clk_lookup(clk_hw_get_name(parent_clk_hw
));
3331 ret
= clk_set_parent(cpu_clk
, parent_clk
);
3333 return notifier_from_errno(ret
);
3340 static struct meson8b_nb_data meson8b_cpu_nb_data
= {
3341 .nb
.notifier_call
= meson8b_cpu_clk_notifier_cb
,
3344 static const struct regmap_config clkc_regmap_config
= {
3350 static void __init
meson8b_clkc_init_common(struct device_node
*np
,
3351 struct clk_hw_onecell_data
*clk_hw_onecell_data
)
3353 struct meson8b_clk_reset
*rstc
;
3354 const char *notifier_clk_name
;
3355 struct clk
*notifier_clk
;
3356 void __iomem
*clk_base
;
3360 map
= syscon_node_to_regmap(of_get_parent(np
));
3362 pr_info("failed to get HHI regmap - Trying obsolete regs\n");
3364 /* Generic clocks, PLLs and some of the reset-bits */
3365 clk_base
= of_iomap(np
, 1);
3367 pr_err("%s: Unable to map clk base\n", __func__
);
3371 map
= regmap_init_mmio(NULL
, clk_base
, &clkc_regmap_config
);
3376 rstc
= kzalloc(sizeof(*rstc
), GFP_KERNEL
);
3380 /* Reset Controller */
3382 rstc
->reset
.ops
= &meson8b_clk_reset_ops
;
3383 rstc
->reset
.nr_resets
= ARRAY_SIZE(meson8b_clk_reset_bits
);
3384 rstc
->reset
.of_node
= np
;
3385 ret
= reset_controller_register(&rstc
->reset
);
3387 pr_err("%s: Failed to register clkc reset controller: %d\n",
3392 /* Populate regmap for the regmap backed clocks */
3393 for (i
= 0; i
< ARRAY_SIZE(meson8b_clk_regmaps
); i
++)
3394 meson8b_clk_regmaps
[i
]->map
= map
;
3398 * CLKID_UNUSED = 0, so skip it and start with CLKID_XTAL = 1
3400 for (i
= CLKID_XTAL
; i
< CLK_NR_CLKS
; i
++) {
3401 /* array might be sparse */
3402 if (!clk_hw_onecell_data
->hws
[i
])
3405 ret
= clk_hw_register(NULL
, clk_hw_onecell_data
->hws
[i
]);
3410 meson8b_cpu_nb_data
.onecell_data
= clk_hw_onecell_data
;
3413 * FIXME we shouldn't program the muxes in notifier handlers. The
3414 * tricky programming sequence will be handled by the forthcoming
3415 * coordinated clock rates mechanism once that feature is released.
3417 notifier_clk_name
= clk_hw_get_name(&meson8b_cpu_scale_out_sel
.hw
);
3418 notifier_clk
= __clk_lookup(notifier_clk_name
);
3419 ret
= clk_notifier_register(notifier_clk
, &meson8b_cpu_nb_data
.nb
);
3421 pr_err("%s: failed to register the CPU clock notifier\n",
3426 ret
= of_clk_add_hw_provider(np
, of_clk_hw_onecell_get
,
3427 clk_hw_onecell_data
);
3429 pr_err("%s: failed to register clock provider\n", __func__
);
3432 static void __init
meson8_clkc_init(struct device_node
*np
)
3434 return meson8b_clkc_init_common(np
, &meson8_hw_onecell_data
);
3437 static void __init
meson8b_clkc_init(struct device_node
*np
)
3439 return meson8b_clkc_init_common(np
, &meson8b_hw_onecell_data
);
3442 static void __init
meson8m2_clkc_init(struct device_node
*np
)
3444 return meson8b_clkc_init_common(np
, &meson8m2_hw_onecell_data
);
3447 CLK_OF_DECLARE_DRIVER(meson8_clkc
, "amlogic,meson8-clkc",
3449 CLK_OF_DECLARE_DRIVER(meson8b_clkc
, "amlogic,meson8b-clkc",
3451 CLK_OF_DECLARE_DRIVER(meson8m2_clkc
, "amlogic,meson8m2-clkc",
3452 meson8m2_clkc_init
);