1 // SPDX-License-Identifier: GPL-2.0+
3 * AmLogic Meson-AXG Clock Controller Driver
5 * Copyright (c) 2016 Baylibre SAS.
6 * Author: Michael Turquette <mturquette@baylibre.com>
8 * Copyright (c) 2017 Amlogic, inc.
9 * Author: Qiufang Dai <qiufang.dai@amlogic.com>
12 #include <linux/clk-provider.h>
13 #include <linux/init.h>
14 #include <linux/mod_devicetable.h>
15 #include <linux/platform_device.h>
16 #include <linux/module.h>
18 #include "clk-regmap.h"
22 #include "meson-eeclk.h"
24 #include <dt-bindings/clock/axg-clkc.h>
26 static struct clk_regmap axg_fixed_pll_dco
= {
27 .data
= &(struct meson_clk_pll_data
){
29 .reg_off
= HHI_MPLL_CNTL
,
34 .reg_off
= HHI_MPLL_CNTL
,
39 .reg_off
= HHI_MPLL_CNTL
,
44 .reg_off
= HHI_MPLL_CNTL2
,
49 .reg_off
= HHI_MPLL_CNTL
,
54 .reg_off
= HHI_MPLL_CNTL
,
59 .hw
.init
= &(struct clk_init_data
){
60 .name
= "fixed_pll_dco",
61 .ops
= &meson_clk_pll_ro_ops
,
62 .parent_data
= &(const struct clk_parent_data
) {
69 static struct clk_regmap axg_fixed_pll
= {
70 .data
= &(struct clk_regmap_div_data
){
71 .offset
= HHI_MPLL_CNTL
,
74 .flags
= CLK_DIVIDER_POWER_OF_TWO
,
76 .hw
.init
= &(struct clk_init_data
){
78 .ops
= &clk_regmap_divider_ro_ops
,
79 .parent_hws
= (const struct clk_hw
*[]) {
84 * This clock won't ever change at runtime so
85 * CLK_SET_RATE_PARENT is not required
90 static struct clk_regmap axg_sys_pll_dco
= {
91 .data
= &(struct meson_clk_pll_data
){
93 .reg_off
= HHI_SYS_PLL_CNTL
,
98 .reg_off
= HHI_SYS_PLL_CNTL
,
103 .reg_off
= HHI_SYS_PLL_CNTL
,
108 .reg_off
= HHI_SYS_PLL_CNTL
,
113 .reg_off
= HHI_SYS_PLL_CNTL
,
118 .hw
.init
= &(struct clk_init_data
){
119 .name
= "sys_pll_dco",
120 .ops
= &meson_clk_pll_ro_ops
,
121 .parent_data
= &(const struct clk_parent_data
) {
128 static struct clk_regmap axg_sys_pll
= {
129 .data
= &(struct clk_regmap_div_data
){
130 .offset
= HHI_SYS_PLL_CNTL
,
133 .flags
= CLK_DIVIDER_POWER_OF_TWO
,
135 .hw
.init
= &(struct clk_init_data
){
137 .ops
= &clk_regmap_divider_ro_ops
,
138 .parent_hws
= (const struct clk_hw
*[]) {
142 .flags
= CLK_SET_RATE_PARENT
,
146 static const struct pll_params_table axg_gp0_pll_params_table
[] = {
179 static const struct reg_sequence axg_gp0_init_regs
[] = {
180 { .reg
= HHI_GP0_PLL_CNTL1
, .def
= 0xc084b000 },
181 { .reg
= HHI_GP0_PLL_CNTL2
, .def
= 0xb75020be },
182 { .reg
= HHI_GP0_PLL_CNTL3
, .def
= 0x0a59a288 },
183 { .reg
= HHI_GP0_PLL_CNTL4
, .def
= 0xc000004d },
184 { .reg
= HHI_GP0_PLL_CNTL5
, .def
= 0x00078000 },
187 static struct clk_regmap axg_gp0_pll_dco
= {
188 .data
= &(struct meson_clk_pll_data
){
190 .reg_off
= HHI_GP0_PLL_CNTL
,
195 .reg_off
= HHI_GP0_PLL_CNTL
,
200 .reg_off
= HHI_GP0_PLL_CNTL
,
205 .reg_off
= HHI_GP0_PLL_CNTL1
,
210 .reg_off
= HHI_GP0_PLL_CNTL
,
215 .reg_off
= HHI_GP0_PLL_CNTL
,
219 .table
= axg_gp0_pll_params_table
,
220 .init_regs
= axg_gp0_init_regs
,
221 .init_count
= ARRAY_SIZE(axg_gp0_init_regs
),
223 .hw
.init
= &(struct clk_init_data
){
224 .name
= "gp0_pll_dco",
225 .ops
= &meson_clk_pll_ops
,
226 .parent_data
= &(const struct clk_parent_data
) {
233 static struct clk_regmap axg_gp0_pll
= {
234 .data
= &(struct clk_regmap_div_data
){
235 .offset
= HHI_GP0_PLL_CNTL
,
238 .flags
= CLK_DIVIDER_POWER_OF_TWO
,
240 .hw
.init
= &(struct clk_init_data
){
242 .ops
= &clk_regmap_divider_ops
,
243 .parent_hws
= (const struct clk_hw
*[]) {
247 .flags
= CLK_SET_RATE_PARENT
,
251 static const struct reg_sequence axg_hifi_init_regs
[] = {
252 { .reg
= HHI_HIFI_PLL_CNTL1
, .def
= 0xc084b000 },
253 { .reg
= HHI_HIFI_PLL_CNTL2
, .def
= 0xb75020be },
254 { .reg
= HHI_HIFI_PLL_CNTL3
, .def
= 0x0a6a3a88 },
255 { .reg
= HHI_HIFI_PLL_CNTL4
, .def
= 0xc000004d },
256 { .reg
= HHI_HIFI_PLL_CNTL5
, .def
= 0x00058000 },
259 static struct clk_regmap axg_hifi_pll_dco
= {
260 .data
= &(struct meson_clk_pll_data
){
262 .reg_off
= HHI_HIFI_PLL_CNTL
,
267 .reg_off
= HHI_HIFI_PLL_CNTL
,
272 .reg_off
= HHI_HIFI_PLL_CNTL
,
277 .reg_off
= HHI_HIFI_PLL_CNTL5
,
282 .reg_off
= HHI_HIFI_PLL_CNTL
,
287 .reg_off
= HHI_HIFI_PLL_CNTL
,
291 .table
= axg_gp0_pll_params_table
,
292 .init_regs
= axg_hifi_init_regs
,
293 .init_count
= ARRAY_SIZE(axg_hifi_init_regs
),
294 .flags
= CLK_MESON_PLL_ROUND_CLOSEST
,
296 .hw
.init
= &(struct clk_init_data
){
297 .name
= "hifi_pll_dco",
298 .ops
= &meson_clk_pll_ops
,
299 .parent_data
= &(const struct clk_parent_data
) {
306 static struct clk_regmap axg_hifi_pll
= {
307 .data
= &(struct clk_regmap_div_data
){
308 .offset
= HHI_HIFI_PLL_CNTL
,
311 .flags
= CLK_DIVIDER_POWER_OF_TWO
,
313 .hw
.init
= &(struct clk_init_data
){
315 .ops
= &clk_regmap_divider_ops
,
316 .parent_hws
= (const struct clk_hw
*[]) {
320 .flags
= CLK_SET_RATE_PARENT
,
324 static struct clk_fixed_factor axg_fclk_div2_div
= {
327 .hw
.init
= &(struct clk_init_data
){
328 .name
= "fclk_div2_div",
329 .ops
= &clk_fixed_factor_ops
,
330 .parent_hws
= (const struct clk_hw
*[]) { &axg_fixed_pll
.hw
},
335 static struct clk_regmap axg_fclk_div2
= {
336 .data
= &(struct clk_regmap_gate_data
){
337 .offset
= HHI_MPLL_CNTL6
,
340 .hw
.init
= &(struct clk_init_data
){
342 .ops
= &clk_regmap_gate_ops
,
343 .parent_hws
= (const struct clk_hw
*[]) {
344 &axg_fclk_div2_div
.hw
347 .flags
= CLK_IS_CRITICAL
,
351 static struct clk_fixed_factor axg_fclk_div3_div
= {
354 .hw
.init
= &(struct clk_init_data
){
355 .name
= "fclk_div3_div",
356 .ops
= &clk_fixed_factor_ops
,
357 .parent_hws
= (const struct clk_hw
*[]) { &axg_fixed_pll
.hw
},
362 static struct clk_regmap axg_fclk_div3
= {
363 .data
= &(struct clk_regmap_gate_data
){
364 .offset
= HHI_MPLL_CNTL6
,
367 .hw
.init
= &(struct clk_init_data
){
369 .ops
= &clk_regmap_gate_ops
,
370 .parent_hws
= (const struct clk_hw
*[]) {
371 &axg_fclk_div3_div
.hw
376 * This clock, as fdiv2, is used by the SCPI FW and is required
377 * by the platform to operate correctly.
378 * Until the following condition are met, we need this clock to
379 * be marked as critical:
380 * a) The SCPI generic driver claims and enable all the clocks
382 * b) CCF has a clock hand-off mechanism to make the sure the
383 * clock stays on until the proper driver comes along
385 .flags
= CLK_IS_CRITICAL
,
389 static struct clk_fixed_factor axg_fclk_div4_div
= {
392 .hw
.init
= &(struct clk_init_data
){
393 .name
= "fclk_div4_div",
394 .ops
= &clk_fixed_factor_ops
,
395 .parent_hws
= (const struct clk_hw
*[]) { &axg_fixed_pll
.hw
},
400 static struct clk_regmap axg_fclk_div4
= {
401 .data
= &(struct clk_regmap_gate_data
){
402 .offset
= HHI_MPLL_CNTL6
,
405 .hw
.init
= &(struct clk_init_data
){
407 .ops
= &clk_regmap_gate_ops
,
408 .parent_hws
= (const struct clk_hw
*[]) {
409 &axg_fclk_div4_div
.hw
415 static struct clk_fixed_factor axg_fclk_div5_div
= {
418 .hw
.init
= &(struct clk_init_data
){
419 .name
= "fclk_div5_div",
420 .ops
= &clk_fixed_factor_ops
,
421 .parent_hws
= (const struct clk_hw
*[]) { &axg_fixed_pll
.hw
},
426 static struct clk_regmap axg_fclk_div5
= {
427 .data
= &(struct clk_regmap_gate_data
){
428 .offset
= HHI_MPLL_CNTL6
,
431 .hw
.init
= &(struct clk_init_data
){
433 .ops
= &clk_regmap_gate_ops
,
434 .parent_hws
= (const struct clk_hw
*[]) {
435 &axg_fclk_div5_div
.hw
441 static struct clk_fixed_factor axg_fclk_div7_div
= {
444 .hw
.init
= &(struct clk_init_data
){
445 .name
= "fclk_div7_div",
446 .ops
= &clk_fixed_factor_ops
,
447 .parent_hws
= (const struct clk_hw
*[]) {
454 static struct clk_regmap axg_fclk_div7
= {
455 .data
= &(struct clk_regmap_gate_data
){
456 .offset
= HHI_MPLL_CNTL6
,
459 .hw
.init
= &(struct clk_init_data
){
461 .ops
= &clk_regmap_gate_ops
,
462 .parent_hws
= (const struct clk_hw
*[]) {
463 &axg_fclk_div7_div
.hw
469 static struct clk_regmap axg_mpll_prediv
= {
470 .data
= &(struct clk_regmap_div_data
){
471 .offset
= HHI_MPLL_CNTL5
,
475 .hw
.init
= &(struct clk_init_data
){
476 .name
= "mpll_prediv",
477 .ops
= &clk_regmap_divider_ro_ops
,
478 .parent_hws
= (const struct clk_hw
*[]) {
485 static struct clk_regmap axg_mpll0_div
= {
486 .data
= &(struct meson_clk_mpll_data
){
488 .reg_off
= HHI_MPLL_CNTL7
,
493 .reg_off
= HHI_MPLL_CNTL7
,
498 .reg_off
= HHI_MPLL_CNTL7
,
503 .reg_off
= HHI_PLL_TOP_MISC
,
507 .flags
= CLK_MESON_MPLL_ROUND_CLOSEST
,
509 .hw
.init
= &(struct clk_init_data
){
511 .ops
= &meson_clk_mpll_ops
,
512 .parent_hws
= (const struct clk_hw
*[]) {
519 static struct clk_regmap axg_mpll0
= {
520 .data
= &(struct clk_regmap_gate_data
){
521 .offset
= HHI_MPLL_CNTL7
,
524 .hw
.init
= &(struct clk_init_data
){
526 .ops
= &clk_regmap_gate_ops
,
527 .parent_hws
= (const struct clk_hw
*[]) {
531 .flags
= CLK_SET_RATE_PARENT
,
535 static struct clk_regmap axg_mpll1_div
= {
536 .data
= &(struct meson_clk_mpll_data
){
538 .reg_off
= HHI_MPLL_CNTL8
,
543 .reg_off
= HHI_MPLL_CNTL8
,
548 .reg_off
= HHI_MPLL_CNTL8
,
553 .reg_off
= HHI_PLL_TOP_MISC
,
557 .flags
= CLK_MESON_MPLL_ROUND_CLOSEST
,
559 .hw
.init
= &(struct clk_init_data
){
561 .ops
= &meson_clk_mpll_ops
,
562 .parent_hws
= (const struct clk_hw
*[]) {
569 static struct clk_regmap axg_mpll1
= {
570 .data
= &(struct clk_regmap_gate_data
){
571 .offset
= HHI_MPLL_CNTL8
,
574 .hw
.init
= &(struct clk_init_data
){
576 .ops
= &clk_regmap_gate_ops
,
577 .parent_hws
= (const struct clk_hw
*[]) {
581 .flags
= CLK_SET_RATE_PARENT
,
585 static struct clk_regmap axg_mpll2_div
= {
586 .data
= &(struct meson_clk_mpll_data
){
588 .reg_off
= HHI_MPLL_CNTL9
,
593 .reg_off
= HHI_MPLL_CNTL9
,
598 .reg_off
= HHI_MPLL_CNTL9
,
603 .reg_off
= HHI_MPLL_CNTL
,
608 .reg_off
= HHI_PLL_TOP_MISC
,
612 .flags
= CLK_MESON_MPLL_ROUND_CLOSEST
,
614 .hw
.init
= &(struct clk_init_data
){
616 .ops
= &meson_clk_mpll_ops
,
617 .parent_hws
= (const struct clk_hw
*[]) {
624 static struct clk_regmap axg_mpll2
= {
625 .data
= &(struct clk_regmap_gate_data
){
626 .offset
= HHI_MPLL_CNTL9
,
629 .hw
.init
= &(struct clk_init_data
){
631 .ops
= &clk_regmap_gate_ops
,
632 .parent_hws
= (const struct clk_hw
*[]) {
636 .flags
= CLK_SET_RATE_PARENT
,
640 static struct clk_regmap axg_mpll3_div
= {
641 .data
= &(struct meson_clk_mpll_data
){
643 .reg_off
= HHI_MPLL3_CNTL0
,
648 .reg_off
= HHI_MPLL3_CNTL0
,
653 .reg_off
= HHI_MPLL3_CNTL0
,
658 .reg_off
= HHI_PLL_TOP_MISC
,
662 .flags
= CLK_MESON_MPLL_ROUND_CLOSEST
,
664 .hw
.init
= &(struct clk_init_data
){
666 .ops
= &meson_clk_mpll_ops
,
667 .parent_hws
= (const struct clk_hw
*[]) {
674 static struct clk_regmap axg_mpll3
= {
675 .data
= &(struct clk_regmap_gate_data
){
676 .offset
= HHI_MPLL3_CNTL0
,
679 .hw
.init
= &(struct clk_init_data
){
681 .ops
= &clk_regmap_gate_ops
,
682 .parent_hws
= (const struct clk_hw
*[]) {
686 .flags
= CLK_SET_RATE_PARENT
,
690 static const struct pll_params_table axg_pcie_pll_params_table
[] = {
698 static const struct reg_sequence axg_pcie_init_regs
[] = {
699 { .reg
= HHI_PCIE_PLL_CNTL1
, .def
= 0x0084a2aa },
700 { .reg
= HHI_PCIE_PLL_CNTL2
, .def
= 0xb75020be },
701 { .reg
= HHI_PCIE_PLL_CNTL3
, .def
= 0x0a47488e },
702 { .reg
= HHI_PCIE_PLL_CNTL4
, .def
= 0xc000004d },
703 { .reg
= HHI_PCIE_PLL_CNTL5
, .def
= 0x00078000 },
704 { .reg
= HHI_PCIE_PLL_CNTL6
, .def
= 0x002323c6 },
705 { .reg
= HHI_PCIE_PLL_CNTL
, .def
= 0x400106c8 },
708 static struct clk_regmap axg_pcie_pll_dco
= {
709 .data
= &(struct meson_clk_pll_data
){
711 .reg_off
= HHI_PCIE_PLL_CNTL
,
716 .reg_off
= HHI_PCIE_PLL_CNTL
,
721 .reg_off
= HHI_PCIE_PLL_CNTL
,
726 .reg_off
= HHI_PCIE_PLL_CNTL1
,
731 .reg_off
= HHI_PCIE_PLL_CNTL
,
736 .reg_off
= HHI_PCIE_PLL_CNTL
,
740 .table
= axg_pcie_pll_params_table
,
741 .init_regs
= axg_pcie_init_regs
,
742 .init_count
= ARRAY_SIZE(axg_pcie_init_regs
),
744 .hw
.init
= &(struct clk_init_data
){
745 .name
= "pcie_pll_dco",
746 .ops
= &meson_clk_pll_ops
,
747 .parent_data
= &(const struct clk_parent_data
) {
754 static struct clk_regmap axg_pcie_pll_od
= {
755 .data
= &(struct clk_regmap_div_data
){
756 .offset
= HHI_PCIE_PLL_CNTL
,
759 .flags
= CLK_DIVIDER_POWER_OF_TWO
,
761 .hw
.init
= &(struct clk_init_data
){
762 .name
= "pcie_pll_od",
763 .ops
= &clk_regmap_divider_ops
,
764 .parent_hws
= (const struct clk_hw
*[]) {
768 .flags
= CLK_SET_RATE_PARENT
,
772 static struct clk_regmap axg_pcie_pll
= {
773 .data
= &(struct clk_regmap_div_data
){
774 .offset
= HHI_PCIE_PLL_CNTL6
,
777 .flags
= CLK_DIVIDER_POWER_OF_TWO
,
779 .hw
.init
= &(struct clk_init_data
){
781 .ops
= &clk_regmap_divider_ops
,
782 .parent_hws
= (const struct clk_hw
*[]) {
786 .flags
= CLK_SET_RATE_PARENT
,
790 static struct clk_regmap axg_pcie_mux
= {
791 .data
= &(struct clk_regmap_mux_data
){
792 .offset
= HHI_PCIE_PLL_CNTL6
,
795 /* skip the parent mpll3, reserved for debug */
796 .table
= (u32
[]){ 1 },
798 .hw
.init
= &(struct clk_init_data
){
800 .ops
= &clk_regmap_mux_ops
,
801 .parent_hws
= (const struct clk_hw
*[]) { &axg_pcie_pll
.hw
},
803 .flags
= CLK_SET_RATE_PARENT
,
807 static struct clk_regmap axg_pcie_ref
= {
808 .data
= &(struct clk_regmap_mux_data
){
809 .offset
= HHI_PCIE_PLL_CNTL6
,
812 /* skip the parent 0, reserved for debug */
813 .table
= (u32
[]){ 1 },
815 .hw
.init
= &(struct clk_init_data
){
817 .ops
= &clk_regmap_mux_ops
,
818 .parent_hws
= (const struct clk_hw
*[]) { &axg_pcie_mux
.hw
},
820 .flags
= CLK_SET_RATE_PARENT
,
824 static struct clk_regmap axg_pcie_cml_en0
= {
825 .data
= &(struct clk_regmap_gate_data
){
826 .offset
= HHI_PCIE_PLL_CNTL6
,
829 .hw
.init
= &(struct clk_init_data
) {
830 .name
= "pcie_cml_en0",
831 .ops
= &clk_regmap_gate_ops
,
832 .parent_hws
= (const struct clk_hw
*[]) { &axg_pcie_ref
.hw
},
834 .flags
= CLK_SET_RATE_PARENT
,
839 static struct clk_regmap axg_pcie_cml_en1
= {
840 .data
= &(struct clk_regmap_gate_data
){
841 .offset
= HHI_PCIE_PLL_CNTL6
,
844 .hw
.init
= &(struct clk_init_data
) {
845 .name
= "pcie_cml_en1",
846 .ops
= &clk_regmap_gate_ops
,
847 .parent_hws
= (const struct clk_hw
*[]) { &axg_pcie_ref
.hw
},
849 .flags
= CLK_SET_RATE_PARENT
,
853 static u32 mux_table_clk81
[] = { 0, 2, 3, 4, 5, 6, 7 };
854 static const struct clk_parent_data clk81_parent_data
[] = {
855 { .fw_name
= "xtal", },
856 { .hw
= &axg_fclk_div7
.hw
},
857 { .hw
= &axg_mpll1
.hw
},
858 { .hw
= &axg_mpll2
.hw
},
859 { .hw
= &axg_fclk_div4
.hw
},
860 { .hw
= &axg_fclk_div3
.hw
},
861 { .hw
= &axg_fclk_div5
.hw
},
864 static struct clk_regmap axg_mpeg_clk_sel
= {
865 .data
= &(struct clk_regmap_mux_data
){
866 .offset
= HHI_MPEG_CLK_CNTL
,
869 .table
= mux_table_clk81
,
871 .hw
.init
= &(struct clk_init_data
){
872 .name
= "mpeg_clk_sel",
873 .ops
= &clk_regmap_mux_ro_ops
,
874 .parent_data
= clk81_parent_data
,
875 .num_parents
= ARRAY_SIZE(clk81_parent_data
),
879 static struct clk_regmap axg_mpeg_clk_div
= {
880 .data
= &(struct clk_regmap_div_data
){
881 .offset
= HHI_MPEG_CLK_CNTL
,
885 .hw
.init
= &(struct clk_init_data
){
886 .name
= "mpeg_clk_div",
887 .ops
= &clk_regmap_divider_ops
,
888 .parent_hws
= (const struct clk_hw
*[]) {
892 .flags
= CLK_SET_RATE_PARENT
,
896 static struct clk_regmap axg_clk81
= {
897 .data
= &(struct clk_regmap_gate_data
){
898 .offset
= HHI_MPEG_CLK_CNTL
,
901 .hw
.init
= &(struct clk_init_data
){
903 .ops
= &clk_regmap_gate_ops
,
904 .parent_hws
= (const struct clk_hw
*[]) {
908 .flags
= (CLK_SET_RATE_PARENT
| CLK_IS_CRITICAL
),
912 static const struct clk_parent_data axg_sd_emmc_clk0_parent_data
[] = {
913 { .fw_name
= "xtal", },
914 { .hw
= &axg_fclk_div2
.hw
},
915 { .hw
= &axg_fclk_div3
.hw
},
916 { .hw
= &axg_fclk_div5
.hw
},
917 { .hw
= &axg_fclk_div7
.hw
},
919 * Following these parent clocks, we should also have had mpll2, mpll3
920 * and gp0_pll but these clocks are too precious to be used here. All
921 * the necessary rates for MMC and NAND operation can be acheived using
922 * xtal or fclk_div clocks
927 static struct clk_regmap axg_sd_emmc_b_clk0_sel
= {
928 .data
= &(struct clk_regmap_mux_data
){
929 .offset
= HHI_SD_EMMC_CLK_CNTL
,
933 .hw
.init
= &(struct clk_init_data
) {
934 .name
= "sd_emmc_b_clk0_sel",
935 .ops
= &clk_regmap_mux_ops
,
936 .parent_data
= axg_sd_emmc_clk0_parent_data
,
937 .num_parents
= ARRAY_SIZE(axg_sd_emmc_clk0_parent_data
),
938 .flags
= CLK_SET_RATE_PARENT
,
942 static struct clk_regmap axg_sd_emmc_b_clk0_div
= {
943 .data
= &(struct clk_regmap_div_data
){
944 .offset
= HHI_SD_EMMC_CLK_CNTL
,
947 .flags
= CLK_DIVIDER_ROUND_CLOSEST
,
949 .hw
.init
= &(struct clk_init_data
) {
950 .name
= "sd_emmc_b_clk0_div",
951 .ops
= &clk_regmap_divider_ops
,
952 .parent_hws
= (const struct clk_hw
*[]) {
953 &axg_sd_emmc_b_clk0_sel
.hw
956 .flags
= CLK_SET_RATE_PARENT
,
960 static struct clk_regmap axg_sd_emmc_b_clk0
= {
961 .data
= &(struct clk_regmap_gate_data
){
962 .offset
= HHI_SD_EMMC_CLK_CNTL
,
965 .hw
.init
= &(struct clk_init_data
){
966 .name
= "sd_emmc_b_clk0",
967 .ops
= &clk_regmap_gate_ops
,
968 .parent_hws
= (const struct clk_hw
*[]) {
969 &axg_sd_emmc_b_clk0_div
.hw
972 .flags
= CLK_SET_RATE_PARENT
,
976 /* EMMC/NAND clock */
977 static struct clk_regmap axg_sd_emmc_c_clk0_sel
= {
978 .data
= &(struct clk_regmap_mux_data
){
979 .offset
= HHI_NAND_CLK_CNTL
,
983 .hw
.init
= &(struct clk_init_data
) {
984 .name
= "sd_emmc_c_clk0_sel",
985 .ops
= &clk_regmap_mux_ops
,
986 .parent_data
= axg_sd_emmc_clk0_parent_data
,
987 .num_parents
= ARRAY_SIZE(axg_sd_emmc_clk0_parent_data
),
988 .flags
= CLK_SET_RATE_PARENT
,
992 static struct clk_regmap axg_sd_emmc_c_clk0_div
= {
993 .data
= &(struct clk_regmap_div_data
){
994 .offset
= HHI_NAND_CLK_CNTL
,
997 .flags
= CLK_DIVIDER_ROUND_CLOSEST
,
999 .hw
.init
= &(struct clk_init_data
) {
1000 .name
= "sd_emmc_c_clk0_div",
1001 .ops
= &clk_regmap_divider_ops
,
1002 .parent_hws
= (const struct clk_hw
*[]) {
1003 &axg_sd_emmc_c_clk0_sel
.hw
1006 .flags
= CLK_SET_RATE_PARENT
,
1010 static struct clk_regmap axg_sd_emmc_c_clk0
= {
1011 .data
= &(struct clk_regmap_gate_data
){
1012 .offset
= HHI_NAND_CLK_CNTL
,
1015 .hw
.init
= &(struct clk_init_data
){
1016 .name
= "sd_emmc_c_clk0",
1017 .ops
= &clk_regmap_gate_ops
,
1018 .parent_hws
= (const struct clk_hw
*[]) {
1019 &axg_sd_emmc_c_clk0_div
.hw
1022 .flags
= CLK_SET_RATE_PARENT
,
1028 static const struct clk_hw
*axg_vpu_parent_hws
[] = {
1035 static struct clk_regmap axg_vpu_0_sel
= {
1036 .data
= &(struct clk_regmap_mux_data
){
1037 .offset
= HHI_VPU_CLK_CNTL
,
1041 .hw
.init
= &(struct clk_init_data
){
1042 .name
= "vpu_0_sel",
1043 .ops
= &clk_regmap_mux_ops
,
1044 .parent_hws
= axg_vpu_parent_hws
,
1045 .num_parents
= ARRAY_SIZE(axg_vpu_parent_hws
),
1046 /* We need a specific parent for VPU clock source, let it be set in DT */
1047 .flags
= CLK_SET_RATE_NO_REPARENT
,
1051 static struct clk_regmap axg_vpu_0_div
= {
1052 .data
= &(struct clk_regmap_div_data
){
1053 .offset
= HHI_VPU_CLK_CNTL
,
1057 .hw
.init
= &(struct clk_init_data
){
1058 .name
= "vpu_0_div",
1059 .ops
= &clk_regmap_divider_ops
,
1060 .parent_hws
= (const struct clk_hw
*[]) { &axg_vpu_0_sel
.hw
},
1062 .flags
= CLK_SET_RATE_PARENT
,
1066 static struct clk_regmap axg_vpu_0
= {
1067 .data
= &(struct clk_regmap_gate_data
){
1068 .offset
= HHI_VPU_CLK_CNTL
,
1071 .hw
.init
= &(struct clk_init_data
) {
1073 .ops
= &clk_regmap_gate_ops
,
1074 .parent_hws
= (const struct clk_hw
*[]) { &axg_vpu_0_div
.hw
},
1077 * We want to avoid CCF to disable the VPU clock if
1078 * display has been set by Bootloader
1080 .flags
= CLK_SET_RATE_PARENT
| CLK_IGNORE_UNUSED
,
1084 static struct clk_regmap axg_vpu_1_sel
= {
1085 .data
= &(struct clk_regmap_mux_data
){
1086 .offset
= HHI_VPU_CLK_CNTL
,
1090 .hw
.init
= &(struct clk_init_data
){
1091 .name
= "vpu_1_sel",
1092 .ops
= &clk_regmap_mux_ops
,
1093 .parent_hws
= axg_vpu_parent_hws
,
1094 .num_parents
= ARRAY_SIZE(axg_vpu_parent_hws
),
1095 /* We need a specific parent for VPU clock source, let it be set in DT */
1096 .flags
= CLK_SET_RATE_NO_REPARENT
,
1100 static struct clk_regmap axg_vpu_1_div
= {
1101 .data
= &(struct clk_regmap_div_data
){
1102 .offset
= HHI_VPU_CLK_CNTL
,
1106 .hw
.init
= &(struct clk_init_data
){
1107 .name
= "vpu_1_div",
1108 .ops
= &clk_regmap_divider_ops
,
1109 .parent_hws
= (const struct clk_hw
*[]) { &axg_vpu_1_sel
.hw
},
1111 .flags
= CLK_SET_RATE_PARENT
,
1115 static struct clk_regmap axg_vpu_1
= {
1116 .data
= &(struct clk_regmap_gate_data
){
1117 .offset
= HHI_VPU_CLK_CNTL
,
1120 .hw
.init
= &(struct clk_init_data
) {
1122 .ops
= &clk_regmap_gate_ops
,
1123 .parent_hws
= (const struct clk_hw
*[]) { &axg_vpu_1_div
.hw
},
1126 * We want to avoid CCF to disable the VPU clock if
1127 * display has been set by Bootloader
1129 .flags
= CLK_SET_RATE_PARENT
| CLK_IGNORE_UNUSED
,
1133 static struct clk_regmap axg_vpu
= {
1134 .data
= &(struct clk_regmap_mux_data
){
1135 .offset
= HHI_VPU_CLK_CNTL
,
1139 .hw
.init
= &(struct clk_init_data
){
1141 .ops
= &clk_regmap_mux_ops
,
1142 .parent_hws
= (const struct clk_hw
*[]) {
1147 .flags
= CLK_SET_RATE_NO_REPARENT
,
1153 static struct clk_regmap axg_vapb_0_sel
= {
1154 .data
= &(struct clk_regmap_mux_data
){
1155 .offset
= HHI_VAPBCLK_CNTL
,
1159 .hw
.init
= &(struct clk_init_data
){
1160 .name
= "vapb_0_sel",
1161 .ops
= &clk_regmap_mux_ops
,
1162 .parent_hws
= axg_vpu_parent_hws
,
1163 .num_parents
= ARRAY_SIZE(axg_vpu_parent_hws
),
1164 .flags
= CLK_SET_RATE_NO_REPARENT
,
1168 static struct clk_regmap axg_vapb_0_div
= {
1169 .data
= &(struct clk_regmap_div_data
){
1170 .offset
= HHI_VAPBCLK_CNTL
,
1174 .hw
.init
= &(struct clk_init_data
){
1175 .name
= "vapb_0_div",
1176 .ops
= &clk_regmap_divider_ops
,
1177 .parent_hws
= (const struct clk_hw
*[]) {
1181 .flags
= CLK_SET_RATE_PARENT
,
1185 static struct clk_regmap axg_vapb_0
= {
1186 .data
= &(struct clk_regmap_gate_data
){
1187 .offset
= HHI_VAPBCLK_CNTL
,
1190 .hw
.init
= &(struct clk_init_data
) {
1192 .ops
= &clk_regmap_gate_ops
,
1193 .parent_hws
= (const struct clk_hw
*[]) {
1197 .flags
= CLK_SET_RATE_PARENT
| CLK_IGNORE_UNUSED
,
1201 static struct clk_regmap axg_vapb_1_sel
= {
1202 .data
= &(struct clk_regmap_mux_data
){
1203 .offset
= HHI_VAPBCLK_CNTL
,
1207 .hw
.init
= &(struct clk_init_data
){
1208 .name
= "vapb_1_sel",
1209 .ops
= &clk_regmap_mux_ops
,
1210 .parent_hws
= axg_vpu_parent_hws
,
1211 .num_parents
= ARRAY_SIZE(axg_vpu_parent_hws
),
1212 .flags
= CLK_SET_RATE_NO_REPARENT
,
1216 static struct clk_regmap axg_vapb_1_div
= {
1217 .data
= &(struct clk_regmap_div_data
){
1218 .offset
= HHI_VAPBCLK_CNTL
,
1222 .hw
.init
= &(struct clk_init_data
){
1223 .name
= "vapb_1_div",
1224 .ops
= &clk_regmap_divider_ops
,
1225 .parent_hws
= (const struct clk_hw
*[]) {
1229 .flags
= CLK_SET_RATE_PARENT
,
1233 static struct clk_regmap axg_vapb_1
= {
1234 .data
= &(struct clk_regmap_gate_data
){
1235 .offset
= HHI_VAPBCLK_CNTL
,
1238 .hw
.init
= &(struct clk_init_data
) {
1240 .ops
= &clk_regmap_gate_ops
,
1241 .parent_hws
= (const struct clk_hw
*[]) {
1245 .flags
= CLK_SET_RATE_PARENT
| CLK_IGNORE_UNUSED
,
1249 static struct clk_regmap axg_vapb_sel
= {
1250 .data
= &(struct clk_regmap_mux_data
){
1251 .offset
= HHI_VAPBCLK_CNTL
,
1255 .hw
.init
= &(struct clk_init_data
){
1257 .ops
= &clk_regmap_mux_ops
,
1258 .parent_hws
= (const struct clk_hw
*[]) {
1263 .flags
= CLK_SET_RATE_NO_REPARENT
,
1267 static struct clk_regmap axg_vapb
= {
1268 .data
= &(struct clk_regmap_gate_data
){
1269 .offset
= HHI_VAPBCLK_CNTL
,
1272 .hw
.init
= &(struct clk_init_data
) {
1274 .ops
= &clk_regmap_gate_ops
,
1275 .parent_hws
= (const struct clk_hw
*[]) { &axg_vapb_sel
.hw
},
1277 .flags
= CLK_SET_RATE_PARENT
| CLK_IGNORE_UNUSED
,
1283 static const struct clk_hw
*axg_vclk_parent_hws
[] = {
1293 static struct clk_regmap axg_vclk_sel
= {
1294 .data
= &(struct clk_regmap_mux_data
){
1295 .offset
= HHI_VID_CLK_CNTL
,
1299 .hw
.init
= &(struct clk_init_data
){
1301 .ops
= &clk_regmap_mux_ops
,
1302 .parent_hws
= axg_vclk_parent_hws
,
1303 .num_parents
= ARRAY_SIZE(axg_vclk_parent_hws
),
1304 .flags
= CLK_SET_RATE_NO_REPARENT
| CLK_GET_RATE_NOCACHE
,
1308 static struct clk_regmap axg_vclk2_sel
= {
1309 .data
= &(struct clk_regmap_mux_data
){
1310 .offset
= HHI_VIID_CLK_CNTL
,
1314 .hw
.init
= &(struct clk_init_data
){
1315 .name
= "vclk2_sel",
1316 .ops
= &clk_regmap_mux_ops
,
1317 .parent_hws
= axg_vclk_parent_hws
,
1318 .num_parents
= ARRAY_SIZE(axg_vclk_parent_hws
),
1319 .flags
= CLK_SET_RATE_NO_REPARENT
| CLK_GET_RATE_NOCACHE
,
1323 static struct clk_regmap axg_vclk_input
= {
1324 .data
= &(struct clk_regmap_gate_data
){
1325 .offset
= HHI_VID_CLK_DIV
,
1328 .hw
.init
= &(struct clk_init_data
) {
1329 .name
= "vclk_input",
1330 .ops
= &clk_regmap_gate_ops
,
1331 .parent_hws
= (const struct clk_hw
*[]) { &axg_vclk_sel
.hw
},
1333 .flags
= CLK_SET_RATE_PARENT
| CLK_IGNORE_UNUSED
,
1337 static struct clk_regmap axg_vclk2_input
= {
1338 .data
= &(struct clk_regmap_gate_data
){
1339 .offset
= HHI_VIID_CLK_DIV
,
1342 .hw
.init
= &(struct clk_init_data
) {
1343 .name
= "vclk2_input",
1344 .ops
= &clk_regmap_gate_ops
,
1345 .parent_hws
= (const struct clk_hw
*[]) { &axg_vclk2_sel
.hw
},
1347 .flags
= CLK_SET_RATE_PARENT
| CLK_IGNORE_UNUSED
,
1351 static struct clk_regmap axg_vclk_div
= {
1352 .data
= &(struct clk_regmap_div_data
){
1353 .offset
= HHI_VID_CLK_DIV
,
1357 .hw
.init
= &(struct clk_init_data
){
1359 .ops
= &clk_regmap_divider_ops
,
1360 .parent_hws
= (const struct clk_hw
*[]) {
1364 .flags
= CLK_GET_RATE_NOCACHE
,
1368 static struct clk_regmap axg_vclk2_div
= {
1369 .data
= &(struct clk_regmap_div_data
){
1370 .offset
= HHI_VIID_CLK_DIV
,
1374 .hw
.init
= &(struct clk_init_data
){
1375 .name
= "vclk2_div",
1376 .ops
= &clk_regmap_divider_ops
,
1377 .parent_hws
= (const struct clk_hw
*[]) {
1381 .flags
= CLK_GET_RATE_NOCACHE
,
1385 static struct clk_regmap axg_vclk
= {
1386 .data
= &(struct clk_regmap_gate_data
){
1387 .offset
= HHI_VID_CLK_CNTL
,
1390 .hw
.init
= &(struct clk_init_data
) {
1392 .ops
= &clk_regmap_gate_ops
,
1393 .parent_hws
= (const struct clk_hw
*[]) { &axg_vclk_div
.hw
},
1395 .flags
= CLK_SET_RATE_PARENT
| CLK_IGNORE_UNUSED
,
1399 static struct clk_regmap axg_vclk2
= {
1400 .data
= &(struct clk_regmap_gate_data
){
1401 .offset
= HHI_VIID_CLK_CNTL
,
1404 .hw
.init
= &(struct clk_init_data
) {
1406 .ops
= &clk_regmap_gate_ops
,
1407 .parent_hws
= (const struct clk_hw
*[]) { &axg_vclk2_div
.hw
},
1409 .flags
= CLK_SET_RATE_PARENT
| CLK_IGNORE_UNUSED
,
1413 static struct clk_regmap axg_vclk_div1
= {
1414 .data
= &(struct clk_regmap_gate_data
){
1415 .offset
= HHI_VID_CLK_CNTL
,
1418 .hw
.init
= &(struct clk_init_data
) {
1419 .name
= "vclk_div1",
1420 .ops
= &clk_regmap_gate_ops
,
1421 .parent_hws
= (const struct clk_hw
*[]) { &axg_vclk
.hw
},
1423 .flags
= CLK_SET_RATE_PARENT
| CLK_IGNORE_UNUSED
,
1427 static struct clk_regmap axg_vclk_div2_en
= {
1428 .data
= &(struct clk_regmap_gate_data
){
1429 .offset
= HHI_VID_CLK_CNTL
,
1432 .hw
.init
= &(struct clk_init_data
) {
1433 .name
= "vclk_div2_en",
1434 .ops
= &clk_regmap_gate_ops
,
1435 .parent_hws
= (const struct clk_hw
*[]) { &axg_vclk
.hw
},
1437 .flags
= CLK_SET_RATE_PARENT
| CLK_IGNORE_UNUSED
,
1441 static struct clk_regmap axg_vclk_div4_en
= {
1442 .data
= &(struct clk_regmap_gate_data
){
1443 .offset
= HHI_VID_CLK_CNTL
,
1446 .hw
.init
= &(struct clk_init_data
) {
1447 .name
= "vclk_div4_en",
1448 .ops
= &clk_regmap_gate_ops
,
1449 .parent_hws
= (const struct clk_hw
*[]) { &axg_vclk
.hw
},
1451 .flags
= CLK_SET_RATE_PARENT
| CLK_IGNORE_UNUSED
,
1455 static struct clk_regmap axg_vclk_div6_en
= {
1456 .data
= &(struct clk_regmap_gate_data
){
1457 .offset
= HHI_VID_CLK_CNTL
,
1460 .hw
.init
= &(struct clk_init_data
) {
1461 .name
= "vclk_div6_en",
1462 .ops
= &clk_regmap_gate_ops
,
1463 .parent_hws
= (const struct clk_hw
*[]) { &axg_vclk
.hw
},
1465 .flags
= CLK_SET_RATE_PARENT
| CLK_IGNORE_UNUSED
,
1469 static struct clk_regmap axg_vclk_div12_en
= {
1470 .data
= &(struct clk_regmap_gate_data
){
1471 .offset
= HHI_VID_CLK_CNTL
,
1474 .hw
.init
= &(struct clk_init_data
) {
1475 .name
= "vclk_div12_en",
1476 .ops
= &clk_regmap_gate_ops
,
1477 .parent_hws
= (const struct clk_hw
*[]) { &axg_vclk
.hw
},
1479 .flags
= CLK_SET_RATE_PARENT
| CLK_IGNORE_UNUSED
,
1483 static struct clk_regmap axg_vclk2_div1
= {
1484 .data
= &(struct clk_regmap_gate_data
){
1485 .offset
= HHI_VIID_CLK_CNTL
,
1488 .hw
.init
= &(struct clk_init_data
) {
1489 .name
= "vclk2_div1",
1490 .ops
= &clk_regmap_gate_ops
,
1491 .parent_hws
= (const struct clk_hw
*[]) { &axg_vclk2
.hw
},
1493 .flags
= CLK_SET_RATE_PARENT
| CLK_IGNORE_UNUSED
,
1497 static struct clk_regmap axg_vclk2_div2_en
= {
1498 .data
= &(struct clk_regmap_gate_data
){
1499 .offset
= HHI_VIID_CLK_CNTL
,
1502 .hw
.init
= &(struct clk_init_data
) {
1503 .name
= "vclk2_div2_en",
1504 .ops
= &clk_regmap_gate_ops
,
1505 .parent_hws
= (const struct clk_hw
*[]) { &axg_vclk2
.hw
},
1507 .flags
= CLK_SET_RATE_PARENT
| CLK_IGNORE_UNUSED
,
1511 static struct clk_regmap axg_vclk2_div4_en
= {
1512 .data
= &(struct clk_regmap_gate_data
){
1513 .offset
= HHI_VIID_CLK_CNTL
,
1516 .hw
.init
= &(struct clk_init_data
) {
1517 .name
= "vclk2_div4_en",
1518 .ops
= &clk_regmap_gate_ops
,
1519 .parent_hws
= (const struct clk_hw
*[]) { &axg_vclk2
.hw
},
1521 .flags
= CLK_SET_RATE_PARENT
| CLK_IGNORE_UNUSED
,
1525 static struct clk_regmap axg_vclk2_div6_en
= {
1526 .data
= &(struct clk_regmap_gate_data
){
1527 .offset
= HHI_VIID_CLK_CNTL
,
1530 .hw
.init
= &(struct clk_init_data
) {
1531 .name
= "vclk2_div6_en",
1532 .ops
= &clk_regmap_gate_ops
,
1533 .parent_hws
= (const struct clk_hw
*[]) { &axg_vclk2
.hw
},
1535 .flags
= CLK_SET_RATE_PARENT
| CLK_IGNORE_UNUSED
,
1539 static struct clk_regmap axg_vclk2_div12_en
= {
1540 .data
= &(struct clk_regmap_gate_data
){
1541 .offset
= HHI_VIID_CLK_CNTL
,
1544 .hw
.init
= &(struct clk_init_data
) {
1545 .name
= "vclk2_div12_en",
1546 .ops
= &clk_regmap_gate_ops
,
1547 .parent_hws
= (const struct clk_hw
*[]) { &axg_vclk2
.hw
},
1549 .flags
= CLK_SET_RATE_PARENT
| CLK_IGNORE_UNUSED
,
1553 static struct clk_fixed_factor axg_vclk_div2
= {
1556 .hw
.init
= &(struct clk_init_data
){
1557 .name
= "vclk_div2",
1558 .ops
= &clk_fixed_factor_ops
,
1559 .parent_hws
= (const struct clk_hw
*[]) {
1560 &axg_vclk_div2_en
.hw
1566 static struct clk_fixed_factor axg_vclk_div4
= {
1569 .hw
.init
= &(struct clk_init_data
){
1570 .name
= "vclk_div4",
1571 .ops
= &clk_fixed_factor_ops
,
1572 .parent_hws
= (const struct clk_hw
*[]) {
1573 &axg_vclk_div4_en
.hw
1579 static struct clk_fixed_factor axg_vclk_div6
= {
1582 .hw
.init
= &(struct clk_init_data
){
1583 .name
= "vclk_div6",
1584 .ops
= &clk_fixed_factor_ops
,
1585 .parent_hws
= (const struct clk_hw
*[]) {
1586 &axg_vclk_div6_en
.hw
1592 static struct clk_fixed_factor axg_vclk_div12
= {
1595 .hw
.init
= &(struct clk_init_data
){
1596 .name
= "vclk_div12",
1597 .ops
= &clk_fixed_factor_ops
,
1598 .parent_hws
= (const struct clk_hw
*[]) {
1599 &axg_vclk_div12_en
.hw
1605 static struct clk_fixed_factor axg_vclk2_div2
= {
1608 .hw
.init
= &(struct clk_init_data
){
1609 .name
= "vclk2_div2",
1610 .ops
= &clk_fixed_factor_ops
,
1611 .parent_hws
= (const struct clk_hw
*[]) {
1612 &axg_vclk2_div2_en
.hw
1618 static struct clk_fixed_factor axg_vclk2_div4
= {
1621 .hw
.init
= &(struct clk_init_data
){
1622 .name
= "vclk2_div4",
1623 .ops
= &clk_fixed_factor_ops
,
1624 .parent_hws
= (const struct clk_hw
*[]) {
1625 &axg_vclk2_div4_en
.hw
1631 static struct clk_fixed_factor axg_vclk2_div6
= {
1634 .hw
.init
= &(struct clk_init_data
){
1635 .name
= "vclk2_div6",
1636 .ops
= &clk_fixed_factor_ops
,
1637 .parent_hws
= (const struct clk_hw
*[]) {
1638 &axg_vclk2_div6_en
.hw
1644 static struct clk_fixed_factor axg_vclk2_div12
= {
1647 .hw
.init
= &(struct clk_init_data
){
1648 .name
= "vclk2_div12",
1649 .ops
= &clk_fixed_factor_ops
,
1650 .parent_hws
= (const struct clk_hw
*[]) {
1651 &axg_vclk2_div12_en
.hw
1657 static u32 mux_table_cts_sel
[] = { 0, 1, 2, 3, 4, 8, 9, 10, 11, 12 };
1658 static const struct clk_hw
*axg_cts_parent_hws
[] = {
1668 &axg_vclk2_div12
.hw
,
1671 static struct clk_regmap axg_cts_encl_sel
= {
1672 .data
= &(struct clk_regmap_mux_data
){
1673 .offset
= HHI_VIID_CLK_DIV
,
1676 .table
= mux_table_cts_sel
,
1678 .hw
.init
= &(struct clk_init_data
){
1679 .name
= "cts_encl_sel",
1680 .ops
= &clk_regmap_mux_ops
,
1681 .parent_hws
= axg_cts_parent_hws
,
1682 .num_parents
= ARRAY_SIZE(axg_cts_parent_hws
),
1683 .flags
= CLK_SET_RATE_NO_REPARENT
| CLK_GET_RATE_NOCACHE
,
1687 static struct clk_regmap axg_cts_encl
= {
1688 .data
= &(struct clk_regmap_gate_data
){
1689 .offset
= HHI_VID_CLK_CNTL2
,
1692 .hw
.init
= &(struct clk_init_data
) {
1694 .ops
= &clk_regmap_gate_ops
,
1695 .parent_hws
= (const struct clk_hw
*[]) {
1696 &axg_cts_encl_sel
.hw
1699 .flags
= CLK_SET_RATE_PARENT
| CLK_IGNORE_UNUSED
,
1703 /* MIPI DSI Host Clock */
1705 static u32 mux_table_axg_vdin_meas
[] = { 0, 1, 2, 3, 6, 7 };
1706 static const struct clk_parent_data axg_vdin_meas_parent_data
[] = {
1707 { .fw_name
= "xtal", },
1708 { .hw
= &axg_fclk_div4
.hw
},
1709 { .hw
= &axg_fclk_div3
.hw
},
1710 { .hw
= &axg_fclk_div5
.hw
},
1711 { .hw
= &axg_fclk_div2
.hw
},
1712 { .hw
= &axg_fclk_div7
.hw
},
1715 static struct clk_regmap axg_vdin_meas_sel
= {
1716 .data
= &(struct clk_regmap_mux_data
){
1717 .offset
= HHI_VDIN_MEAS_CLK_CNTL
,
1720 .flags
= CLK_MUX_ROUND_CLOSEST
,
1721 .table
= mux_table_axg_vdin_meas
,
1723 .hw
.init
= &(struct clk_init_data
){
1724 .name
= "vdin_meas_sel",
1725 .ops
= &clk_regmap_mux_ops
,
1726 .parent_data
= axg_vdin_meas_parent_data
,
1727 .num_parents
= ARRAY_SIZE(axg_vdin_meas_parent_data
),
1728 .flags
= CLK_SET_RATE_PARENT
,
1732 static struct clk_regmap axg_vdin_meas_div
= {
1733 .data
= &(struct clk_regmap_div_data
){
1734 .offset
= HHI_VDIN_MEAS_CLK_CNTL
,
1738 .hw
.init
= &(struct clk_init_data
){
1739 .name
= "vdin_meas_div",
1740 .ops
= &clk_regmap_divider_ops
,
1741 .parent_hws
= (const struct clk_hw
*[]) {
1742 &axg_vdin_meas_sel
.hw
},
1744 .flags
= CLK_SET_RATE_PARENT
,
1748 static struct clk_regmap axg_vdin_meas
= {
1749 .data
= &(struct clk_regmap_gate_data
){
1750 .offset
= HHI_VDIN_MEAS_CLK_CNTL
,
1753 .hw
.init
= &(struct clk_init_data
) {
1754 .name
= "vdin_meas",
1755 .ops
= &clk_regmap_gate_ops
,
1756 .parent_hws
= (const struct clk_hw
*[]) {
1757 &axg_vdin_meas_div
.hw
},
1759 .flags
= CLK_SET_RATE_PARENT
,
1763 static u32 mux_table_gen_clk
[] = { 0, 4, 5, 6, 7, 8,
1764 9, 10, 11, 13, 14, };
1765 static const struct clk_parent_data gen_clk_parent_data
[] = {
1766 { .fw_name
= "xtal", },
1767 { .hw
= &axg_hifi_pll
.hw
},
1768 { .hw
= &axg_mpll0
.hw
},
1769 { .hw
= &axg_mpll1
.hw
},
1770 { .hw
= &axg_mpll2
.hw
},
1771 { .hw
= &axg_mpll3
.hw
},
1772 { .hw
= &axg_fclk_div4
.hw
},
1773 { .hw
= &axg_fclk_div3
.hw
},
1774 { .hw
= &axg_fclk_div5
.hw
},
1775 { .hw
= &axg_fclk_div7
.hw
},
1776 { .hw
= &axg_gp0_pll
.hw
},
1779 static struct clk_regmap axg_gen_clk_sel
= {
1780 .data
= &(struct clk_regmap_mux_data
){
1781 .offset
= HHI_GEN_CLK_CNTL
,
1784 .table
= mux_table_gen_clk
,
1786 .hw
.init
= &(struct clk_init_data
){
1787 .name
= "gen_clk_sel",
1788 .ops
= &clk_regmap_mux_ops
,
1790 * bits 15:12 selects from 14 possible parents:
1791 * xtal, [rtc_oscin_i], [sys_cpu_div16], [ddr_dpll_pt],
1792 * hifi_pll, mpll0, mpll1, mpll2, mpll3, fdiv4,
1793 * fdiv3, fdiv5, [cts_msr_clk], fdiv7, gp0_pll
1795 .parent_data
= gen_clk_parent_data
,
1796 .num_parents
= ARRAY_SIZE(gen_clk_parent_data
),
1800 static struct clk_regmap axg_gen_clk_div
= {
1801 .data
= &(struct clk_regmap_div_data
){
1802 .offset
= HHI_GEN_CLK_CNTL
,
1806 .hw
.init
= &(struct clk_init_data
){
1807 .name
= "gen_clk_div",
1808 .ops
= &clk_regmap_divider_ops
,
1809 .parent_hws
= (const struct clk_hw
*[]) {
1813 .flags
= CLK_SET_RATE_PARENT
,
1817 static struct clk_regmap axg_gen_clk
= {
1818 .data
= &(struct clk_regmap_gate_data
){
1819 .offset
= HHI_GEN_CLK_CNTL
,
1822 .hw
.init
= &(struct clk_init_data
){
1824 .ops
= &clk_regmap_gate_ops
,
1825 .parent_hws
= (const struct clk_hw
*[]) {
1829 .flags
= CLK_SET_RATE_PARENT
,
1833 #define MESON_GATE(_name, _reg, _bit) \
1834 MESON_PCLK(_name, _reg, _bit, &axg_clk81.hw)
1836 /* Everything Else (EE) domain gates */
1837 static MESON_GATE(axg_ddr
, HHI_GCLK_MPEG0
, 0);
1838 static MESON_GATE(axg_audio_locker
, HHI_GCLK_MPEG0
, 2);
1839 static MESON_GATE(axg_mipi_dsi_host
, HHI_GCLK_MPEG0
, 3);
1840 static MESON_GATE(axg_isa
, HHI_GCLK_MPEG0
, 5);
1841 static MESON_GATE(axg_pl301
, HHI_GCLK_MPEG0
, 6);
1842 static MESON_GATE(axg_periphs
, HHI_GCLK_MPEG0
, 7);
1843 static MESON_GATE(axg_spicc_0
, HHI_GCLK_MPEG0
, 8);
1844 static MESON_GATE(axg_i2c
, HHI_GCLK_MPEG0
, 9);
1845 static MESON_GATE(axg_rng0
, HHI_GCLK_MPEG0
, 12);
1846 static MESON_GATE(axg_uart0
, HHI_GCLK_MPEG0
, 13);
1847 static MESON_GATE(axg_mipi_dsi_phy
, HHI_GCLK_MPEG0
, 14);
1848 static MESON_GATE(axg_spicc_1
, HHI_GCLK_MPEG0
, 15);
1849 static MESON_GATE(axg_pcie_a
, HHI_GCLK_MPEG0
, 16);
1850 static MESON_GATE(axg_pcie_b
, HHI_GCLK_MPEG0
, 17);
1851 static MESON_GATE(axg_hiu_reg
, HHI_GCLK_MPEG0
, 19);
1852 static MESON_GATE(axg_assist_misc
, HHI_GCLK_MPEG0
, 23);
1853 static MESON_GATE(axg_emmc_b
, HHI_GCLK_MPEG0
, 25);
1854 static MESON_GATE(axg_emmc_c
, HHI_GCLK_MPEG0
, 26);
1855 static MESON_GATE(axg_dma
, HHI_GCLK_MPEG0
, 27);
1856 static MESON_GATE(axg_spi
, HHI_GCLK_MPEG0
, 30);
1858 static MESON_GATE(axg_audio
, HHI_GCLK_MPEG1
, 0);
1859 static MESON_GATE(axg_eth_core
, HHI_GCLK_MPEG1
, 3);
1860 static MESON_GATE(axg_uart1
, HHI_GCLK_MPEG1
, 16);
1861 static MESON_GATE(axg_g2d
, HHI_GCLK_MPEG1
, 20);
1862 static MESON_GATE(axg_usb0
, HHI_GCLK_MPEG1
, 21);
1863 static MESON_GATE(axg_usb1
, HHI_GCLK_MPEG1
, 22);
1864 static MESON_GATE(axg_reset
, HHI_GCLK_MPEG1
, 23);
1865 static MESON_GATE(axg_usb_general
, HHI_GCLK_MPEG1
, 26);
1866 static MESON_GATE(axg_ahb_arb0
, HHI_GCLK_MPEG1
, 29);
1867 static MESON_GATE(axg_efuse
, HHI_GCLK_MPEG1
, 30);
1868 static MESON_GATE(axg_boot_rom
, HHI_GCLK_MPEG1
, 31);
1870 static MESON_GATE(axg_ahb_data_bus
, HHI_GCLK_MPEG2
, 1);
1871 static MESON_GATE(axg_ahb_ctrl_bus
, HHI_GCLK_MPEG2
, 2);
1872 static MESON_GATE(axg_usb1_to_ddr
, HHI_GCLK_MPEG2
, 8);
1873 static MESON_GATE(axg_usb0_to_ddr
, HHI_GCLK_MPEG2
, 9);
1874 static MESON_GATE(axg_mmc_pclk
, HHI_GCLK_MPEG2
, 11);
1875 static MESON_GATE(axg_vpu_intr
, HHI_GCLK_MPEG2
, 25);
1876 static MESON_GATE(axg_sec_ahb_ahb3_bridge
, HHI_GCLK_MPEG2
, 26);
1877 static MESON_GATE(axg_gic
, HHI_GCLK_MPEG2
, 30);
1879 /* Always On (AO) domain gates */
1881 static MESON_GATE(axg_ao_media_cpu
, HHI_GCLK_AO
, 0);
1882 static MESON_GATE(axg_ao_ahb_sram
, HHI_GCLK_AO
, 1);
1883 static MESON_GATE(axg_ao_ahb_bus
, HHI_GCLK_AO
, 2);
1884 static MESON_GATE(axg_ao_iface
, HHI_GCLK_AO
, 3);
1885 static MESON_GATE(axg_ao_i2c
, HHI_GCLK_AO
, 4);
1887 /* Array of all clocks provided by this provider */
1889 static struct clk_hw
*axg_hw_clks
[] = {
1890 [CLKID_SYS_PLL
] = &axg_sys_pll
.hw
,
1891 [CLKID_FIXED_PLL
] = &axg_fixed_pll
.hw
,
1892 [CLKID_FCLK_DIV2
] = &axg_fclk_div2
.hw
,
1893 [CLKID_FCLK_DIV3
] = &axg_fclk_div3
.hw
,
1894 [CLKID_FCLK_DIV4
] = &axg_fclk_div4
.hw
,
1895 [CLKID_FCLK_DIV5
] = &axg_fclk_div5
.hw
,
1896 [CLKID_FCLK_DIV7
] = &axg_fclk_div7
.hw
,
1897 [CLKID_GP0_PLL
] = &axg_gp0_pll
.hw
,
1898 [CLKID_MPEG_SEL
] = &axg_mpeg_clk_sel
.hw
,
1899 [CLKID_MPEG_DIV
] = &axg_mpeg_clk_div
.hw
,
1900 [CLKID_CLK81
] = &axg_clk81
.hw
,
1901 [CLKID_MPLL0
] = &axg_mpll0
.hw
,
1902 [CLKID_MPLL1
] = &axg_mpll1
.hw
,
1903 [CLKID_MPLL2
] = &axg_mpll2
.hw
,
1904 [CLKID_MPLL3
] = &axg_mpll3
.hw
,
1905 [CLKID_DDR
] = &axg_ddr
.hw
,
1906 [CLKID_AUDIO_LOCKER
] = &axg_audio_locker
.hw
,
1907 [CLKID_MIPI_DSI_HOST
] = &axg_mipi_dsi_host
.hw
,
1908 [CLKID_ISA
] = &axg_isa
.hw
,
1909 [CLKID_PL301
] = &axg_pl301
.hw
,
1910 [CLKID_PERIPHS
] = &axg_periphs
.hw
,
1911 [CLKID_SPICC0
] = &axg_spicc_0
.hw
,
1912 [CLKID_I2C
] = &axg_i2c
.hw
,
1913 [CLKID_RNG0
] = &axg_rng0
.hw
,
1914 [CLKID_UART0
] = &axg_uart0
.hw
,
1915 [CLKID_MIPI_DSI_PHY
] = &axg_mipi_dsi_phy
.hw
,
1916 [CLKID_SPICC1
] = &axg_spicc_1
.hw
,
1917 [CLKID_PCIE_A
] = &axg_pcie_a
.hw
,
1918 [CLKID_PCIE_B
] = &axg_pcie_b
.hw
,
1919 [CLKID_HIU_IFACE
] = &axg_hiu_reg
.hw
,
1920 [CLKID_ASSIST_MISC
] = &axg_assist_misc
.hw
,
1921 [CLKID_SD_EMMC_B
] = &axg_emmc_b
.hw
,
1922 [CLKID_SD_EMMC_C
] = &axg_emmc_c
.hw
,
1923 [CLKID_DMA
] = &axg_dma
.hw
,
1924 [CLKID_SPI
] = &axg_spi
.hw
,
1925 [CLKID_AUDIO
] = &axg_audio
.hw
,
1926 [CLKID_ETH
] = &axg_eth_core
.hw
,
1927 [CLKID_UART1
] = &axg_uart1
.hw
,
1928 [CLKID_G2D
] = &axg_g2d
.hw
,
1929 [CLKID_USB0
] = &axg_usb0
.hw
,
1930 [CLKID_USB1
] = &axg_usb1
.hw
,
1931 [CLKID_RESET
] = &axg_reset
.hw
,
1932 [CLKID_USB
] = &axg_usb_general
.hw
,
1933 [CLKID_AHB_ARB0
] = &axg_ahb_arb0
.hw
,
1934 [CLKID_EFUSE
] = &axg_efuse
.hw
,
1935 [CLKID_BOOT_ROM
] = &axg_boot_rom
.hw
,
1936 [CLKID_AHB_DATA_BUS
] = &axg_ahb_data_bus
.hw
,
1937 [CLKID_AHB_CTRL_BUS
] = &axg_ahb_ctrl_bus
.hw
,
1938 [CLKID_USB1_DDR_BRIDGE
] = &axg_usb1_to_ddr
.hw
,
1939 [CLKID_USB0_DDR_BRIDGE
] = &axg_usb0_to_ddr
.hw
,
1940 [CLKID_MMC_PCLK
] = &axg_mmc_pclk
.hw
,
1941 [CLKID_VPU_INTR
] = &axg_vpu_intr
.hw
,
1942 [CLKID_SEC_AHB_AHB3_BRIDGE
] = &axg_sec_ahb_ahb3_bridge
.hw
,
1943 [CLKID_GIC
] = &axg_gic
.hw
,
1944 [CLKID_AO_MEDIA_CPU
] = &axg_ao_media_cpu
.hw
,
1945 [CLKID_AO_AHB_SRAM
] = &axg_ao_ahb_sram
.hw
,
1946 [CLKID_AO_AHB_BUS
] = &axg_ao_ahb_bus
.hw
,
1947 [CLKID_AO_IFACE
] = &axg_ao_iface
.hw
,
1948 [CLKID_AO_I2C
] = &axg_ao_i2c
.hw
,
1949 [CLKID_SD_EMMC_B_CLK0_SEL
] = &axg_sd_emmc_b_clk0_sel
.hw
,
1950 [CLKID_SD_EMMC_B_CLK0_DIV
] = &axg_sd_emmc_b_clk0_div
.hw
,
1951 [CLKID_SD_EMMC_B_CLK0
] = &axg_sd_emmc_b_clk0
.hw
,
1952 [CLKID_SD_EMMC_C_CLK0_SEL
] = &axg_sd_emmc_c_clk0_sel
.hw
,
1953 [CLKID_SD_EMMC_C_CLK0_DIV
] = &axg_sd_emmc_c_clk0_div
.hw
,
1954 [CLKID_SD_EMMC_C_CLK0
] = &axg_sd_emmc_c_clk0
.hw
,
1955 [CLKID_MPLL0_DIV
] = &axg_mpll0_div
.hw
,
1956 [CLKID_MPLL1_DIV
] = &axg_mpll1_div
.hw
,
1957 [CLKID_MPLL2_DIV
] = &axg_mpll2_div
.hw
,
1958 [CLKID_MPLL3_DIV
] = &axg_mpll3_div
.hw
,
1959 [CLKID_HIFI_PLL
] = &axg_hifi_pll
.hw
,
1960 [CLKID_MPLL_PREDIV
] = &axg_mpll_prediv
.hw
,
1961 [CLKID_FCLK_DIV2_DIV
] = &axg_fclk_div2_div
.hw
,
1962 [CLKID_FCLK_DIV3_DIV
] = &axg_fclk_div3_div
.hw
,
1963 [CLKID_FCLK_DIV4_DIV
] = &axg_fclk_div4_div
.hw
,
1964 [CLKID_FCLK_DIV5_DIV
] = &axg_fclk_div5_div
.hw
,
1965 [CLKID_FCLK_DIV7_DIV
] = &axg_fclk_div7_div
.hw
,
1966 [CLKID_PCIE_PLL
] = &axg_pcie_pll
.hw
,
1967 [CLKID_PCIE_MUX
] = &axg_pcie_mux
.hw
,
1968 [CLKID_PCIE_REF
] = &axg_pcie_ref
.hw
,
1969 [CLKID_PCIE_CML_EN0
] = &axg_pcie_cml_en0
.hw
,
1970 [CLKID_PCIE_CML_EN1
] = &axg_pcie_cml_en1
.hw
,
1971 [CLKID_GEN_CLK_SEL
] = &axg_gen_clk_sel
.hw
,
1972 [CLKID_GEN_CLK_DIV
] = &axg_gen_clk_div
.hw
,
1973 [CLKID_GEN_CLK
] = &axg_gen_clk
.hw
,
1974 [CLKID_SYS_PLL_DCO
] = &axg_sys_pll_dco
.hw
,
1975 [CLKID_FIXED_PLL_DCO
] = &axg_fixed_pll_dco
.hw
,
1976 [CLKID_GP0_PLL_DCO
] = &axg_gp0_pll_dco
.hw
,
1977 [CLKID_HIFI_PLL_DCO
] = &axg_hifi_pll_dco
.hw
,
1978 [CLKID_PCIE_PLL_DCO
] = &axg_pcie_pll_dco
.hw
,
1979 [CLKID_PCIE_PLL_OD
] = &axg_pcie_pll_od
.hw
,
1980 [CLKID_VPU_0_DIV
] = &axg_vpu_0_div
.hw
,
1981 [CLKID_VPU_0_SEL
] = &axg_vpu_0_sel
.hw
,
1982 [CLKID_VPU_0
] = &axg_vpu_0
.hw
,
1983 [CLKID_VPU_1_DIV
] = &axg_vpu_1_div
.hw
,
1984 [CLKID_VPU_1_SEL
] = &axg_vpu_1_sel
.hw
,
1985 [CLKID_VPU_1
] = &axg_vpu_1
.hw
,
1986 [CLKID_VPU
] = &axg_vpu
.hw
,
1987 [CLKID_VAPB_0_DIV
] = &axg_vapb_0_div
.hw
,
1988 [CLKID_VAPB_0_SEL
] = &axg_vapb_0_sel
.hw
,
1989 [CLKID_VAPB_0
] = &axg_vapb_0
.hw
,
1990 [CLKID_VAPB_1_DIV
] = &axg_vapb_1_div
.hw
,
1991 [CLKID_VAPB_1_SEL
] = &axg_vapb_1_sel
.hw
,
1992 [CLKID_VAPB_1
] = &axg_vapb_1
.hw
,
1993 [CLKID_VAPB_SEL
] = &axg_vapb_sel
.hw
,
1994 [CLKID_VAPB
] = &axg_vapb
.hw
,
1995 [CLKID_VCLK
] = &axg_vclk
.hw
,
1996 [CLKID_VCLK2
] = &axg_vclk2
.hw
,
1997 [CLKID_VCLK_SEL
] = &axg_vclk_sel
.hw
,
1998 [CLKID_VCLK2_SEL
] = &axg_vclk2_sel
.hw
,
1999 [CLKID_VCLK_INPUT
] = &axg_vclk_input
.hw
,
2000 [CLKID_VCLK2_INPUT
] = &axg_vclk2_input
.hw
,
2001 [CLKID_VCLK_DIV
] = &axg_vclk_div
.hw
,
2002 [CLKID_VCLK2_DIV
] = &axg_vclk2_div
.hw
,
2003 [CLKID_VCLK_DIV2_EN
] = &axg_vclk_div2_en
.hw
,
2004 [CLKID_VCLK_DIV4_EN
] = &axg_vclk_div4_en
.hw
,
2005 [CLKID_VCLK_DIV6_EN
] = &axg_vclk_div6_en
.hw
,
2006 [CLKID_VCLK_DIV12_EN
] = &axg_vclk_div12_en
.hw
,
2007 [CLKID_VCLK2_DIV2_EN
] = &axg_vclk2_div2_en
.hw
,
2008 [CLKID_VCLK2_DIV4_EN
] = &axg_vclk2_div4_en
.hw
,
2009 [CLKID_VCLK2_DIV6_EN
] = &axg_vclk2_div6_en
.hw
,
2010 [CLKID_VCLK2_DIV12_EN
] = &axg_vclk2_div12_en
.hw
,
2011 [CLKID_VCLK_DIV1
] = &axg_vclk_div1
.hw
,
2012 [CLKID_VCLK_DIV2
] = &axg_vclk_div2
.hw
,
2013 [CLKID_VCLK_DIV4
] = &axg_vclk_div4
.hw
,
2014 [CLKID_VCLK_DIV6
] = &axg_vclk_div6
.hw
,
2015 [CLKID_VCLK_DIV12
] = &axg_vclk_div12
.hw
,
2016 [CLKID_VCLK2_DIV1
] = &axg_vclk2_div1
.hw
,
2017 [CLKID_VCLK2_DIV2
] = &axg_vclk2_div2
.hw
,
2018 [CLKID_VCLK2_DIV4
] = &axg_vclk2_div4
.hw
,
2019 [CLKID_VCLK2_DIV6
] = &axg_vclk2_div6
.hw
,
2020 [CLKID_VCLK2_DIV12
] = &axg_vclk2_div12
.hw
,
2021 [CLKID_CTS_ENCL_SEL
] = &axg_cts_encl_sel
.hw
,
2022 [CLKID_CTS_ENCL
] = &axg_cts_encl
.hw
,
2023 [CLKID_VDIN_MEAS_SEL
] = &axg_vdin_meas_sel
.hw
,
2024 [CLKID_VDIN_MEAS_DIV
] = &axg_vdin_meas_div
.hw
,
2025 [CLKID_VDIN_MEAS
] = &axg_vdin_meas
.hw
,
2028 /* Convenience table to populate regmap in .probe */
2029 static struct clk_regmap
*const axg_clk_regmaps
[] = {
2068 &axg_sec_ahb_ahb3_bridge
,
2075 &axg_sd_emmc_b_clk0
,
2076 &axg_sd_emmc_c_clk0
,
2078 &axg_sd_emmc_b_clk0_div
,
2079 &axg_sd_emmc_c_clk0_div
,
2081 &axg_sd_emmc_b_clk0_sel
,
2082 &axg_sd_emmc_c_clk0_sel
,
2149 &axg_vclk2_div12_en
,
2157 static const struct meson_eeclkc_data axg_clkc_data
= {
2158 .regmap_clks
= axg_clk_regmaps
,
2159 .regmap_clk_num
= ARRAY_SIZE(axg_clk_regmaps
),
2162 .num
= ARRAY_SIZE(axg_hw_clks
),
2167 static const struct of_device_id clkc_match_table
[] = {
2168 { .compatible
= "amlogic,axg-clkc", .data
= &axg_clkc_data
},
2171 MODULE_DEVICE_TABLE(of
, clkc_match_table
);
2173 static struct platform_driver axg_driver
= {
2174 .probe
= meson_eeclkc_probe
,
2177 .of_match_table
= clkc_match_table
,
2180 module_platform_driver(axg_driver
);
2182 MODULE_DESCRIPTION("Amlogic AXG Main Clock Controller driver");
2183 MODULE_LICENSE("GPL");
2184 MODULE_IMPORT_NS("CLK_MESON");