1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2016 AmLogic, Inc.
4 * Michael Turquette <mturquette@baylibre.com>
7 #include <linux/clk-provider.h>
8 #include <linux/init.h>
9 #include <linux/mod_devicetable.h>
10 #include <linux/platform_device.h>
11 #include <linux/module.h>
14 #include "clk-regmap.h"
17 #include "meson-eeclk.h"
18 #include "vid-pll-div.h"
20 #include <dt-bindings/clock/gxbb-clkc.h>
22 static DEFINE_SPINLOCK(meson_clk_lock);
24 static const struct pll_params_table gxbb_gp0_pll_params_table[] = {
59 static const struct pll_params_table gxl_gp0_pll_params_table[] = {
88 static struct clk_regmap gxbb_fixed_pll_dco = {
89 .data = &(struct meson_clk_pll_data){
91 .reg_off = HHI_MPLL_CNTL,
96 .reg_off = HHI_MPLL_CNTL,
101 .reg_off = HHI_MPLL_CNTL,
106 .reg_off = HHI_MPLL_CNTL2,
111 .reg_off = HHI_MPLL_CNTL,
116 .reg_off = HHI_MPLL_CNTL,
121 .hw.init = &(struct clk_init_data){
122 .name = "fixed_pll_dco",
123 .ops = &meson_clk_pll_ro_ops,
124 .parent_data = &(const struct clk_parent_data) {
131 static struct clk_regmap gxbb_fixed_pll = {
132 .data = &(struct clk_regmap_div_data){
133 .offset = HHI_MPLL_CNTL,
136 .flags = CLK_DIVIDER_POWER_OF_TWO,
138 .hw.init = &(struct clk_init_data){
140 .ops = &clk_regmap_divider_ro_ops,
141 .parent_hws = (const struct clk_hw *[]) {
142 &gxbb_fixed_pll_dco.hw
146 * This clock won't ever change at runtime so
147 * CLK_SET_RATE_PARENT is not required
152 static struct clk_fixed_factor gxbb_hdmi_pll_pre_mult = {
155 .hw.init = &(struct clk_init_data){
156 .name = "hdmi_pll_pre_mult",
157 .ops = &clk_fixed_factor_ops,
158 .parent_data = &(const struct clk_parent_data) {
165 static struct clk_regmap gxbb_hdmi_pll_dco = {
166 .data = &(struct meson_clk_pll_data){
168 .reg_off = HHI_HDMI_PLL_CNTL,
173 .reg_off = HHI_HDMI_PLL_CNTL,
178 .reg_off = HHI_HDMI_PLL_CNTL,
183 .reg_off = HHI_HDMI_PLL_CNTL2,
188 .reg_off = HHI_HDMI_PLL_CNTL,
193 .reg_off = HHI_HDMI_PLL_CNTL,
198 .hw.init = &(struct clk_init_data){
199 .name = "hdmi_pll_dco",
200 .ops = &meson_clk_pll_ro_ops,
201 .parent_hws = (const struct clk_hw *[]) {
202 &gxbb_hdmi_pll_pre_mult.hw
206 * Display directly handle hdmi pll registers ATM, we need
207 * NOCACHE to keep our view of the clock as accurate as possible
209 .flags = CLK_GET_RATE_NOCACHE,
213 static struct clk_regmap gxl_hdmi_pll_dco = {
214 .data = &(struct meson_clk_pll_data){
216 .reg_off = HHI_HDMI_PLL_CNTL,
221 .reg_off = HHI_HDMI_PLL_CNTL,
226 .reg_off = HHI_HDMI_PLL_CNTL,
231 * On gxl, there is a register shift due to
232 * HHI_HDMI_PLL_CNTL1 which does not exist on gxbb,
233 * so we use the HHI_HDMI_PLL_CNTL2 define from GXBB
234 * instead which is defined at the same offset.
237 .reg_off = HHI_HDMI_PLL_CNTL2,
242 .reg_off = HHI_HDMI_PLL_CNTL,
247 .reg_off = HHI_HDMI_PLL_CNTL,
252 .hw.init = &(struct clk_init_data){
253 .name = "hdmi_pll_dco",
254 .ops = &meson_clk_pll_ro_ops,
255 .parent_data = &(const struct clk_parent_data) {
260 * Display directly handle hdmi pll registers ATM, we need
261 * NOCACHE to keep our view of the clock as accurate as possible
263 .flags = CLK_GET_RATE_NOCACHE,
267 static struct clk_regmap gxbb_hdmi_pll_od = {
268 .data = &(struct clk_regmap_div_data){
269 .offset = HHI_HDMI_PLL_CNTL2,
272 .flags = CLK_DIVIDER_POWER_OF_TWO,
274 .hw.init = &(struct clk_init_data){
275 .name = "hdmi_pll_od",
276 .ops = &clk_regmap_divider_ro_ops,
277 .parent_hws = (const struct clk_hw *[]) {
278 &gxbb_hdmi_pll_dco.hw
281 .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
285 static struct clk_regmap gxbb_hdmi_pll_od2 = {
286 .data = &(struct clk_regmap_div_data){
287 .offset = HHI_HDMI_PLL_CNTL2,
290 .flags = CLK_DIVIDER_POWER_OF_TWO,
292 .hw.init = &(struct clk_init_data){
293 .name = "hdmi_pll_od2",
294 .ops = &clk_regmap_divider_ro_ops,
295 .parent_hws = (const struct clk_hw *[]) {
299 .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
303 static struct clk_regmap gxbb_hdmi_pll = {
304 .data = &(struct clk_regmap_div_data){
305 .offset = HHI_HDMI_PLL_CNTL2,
308 .flags = CLK_DIVIDER_POWER_OF_TWO,
310 .hw.init = &(struct clk_init_data){
312 .ops = &clk_regmap_divider_ro_ops,
313 .parent_hws = (const struct clk_hw *[]) {
314 &gxbb_hdmi_pll_od2.hw
317 .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
321 static struct clk_regmap gxl_hdmi_pll_od = {
322 .data = &(struct clk_regmap_div_data){
323 .offset = HHI_HDMI_PLL_CNTL + 8,
326 .flags = CLK_DIVIDER_POWER_OF_TWO,
328 .hw.init = &(struct clk_init_data){
329 .name = "hdmi_pll_od",
330 .ops = &clk_regmap_divider_ro_ops,
331 .parent_hws = (const struct clk_hw *[]) {
335 .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
339 static struct clk_regmap gxl_hdmi_pll_od2 = {
340 .data = &(struct clk_regmap_div_data){
341 .offset = HHI_HDMI_PLL_CNTL + 8,
344 .flags = CLK_DIVIDER_POWER_OF_TWO,
346 .hw.init = &(struct clk_init_data){
347 .name = "hdmi_pll_od2",
348 .ops = &clk_regmap_divider_ro_ops,
349 .parent_hws = (const struct clk_hw *[]) {
353 .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
357 static struct clk_regmap gxl_hdmi_pll = {
358 .data = &(struct clk_regmap_div_data){
359 .offset = HHI_HDMI_PLL_CNTL + 8,
362 .flags = CLK_DIVIDER_POWER_OF_TWO,
364 .hw.init = &(struct clk_init_data){
366 .ops = &clk_regmap_divider_ro_ops,
367 .parent_hws = (const struct clk_hw *[]) {
371 .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
375 static struct clk_regmap gxbb_sys_pll_dco = {
376 .data = &(struct meson_clk_pll_data){
378 .reg_off = HHI_SYS_PLL_CNTL,
383 .reg_off = HHI_SYS_PLL_CNTL,
388 .reg_off = HHI_SYS_PLL_CNTL,
393 .reg_off = HHI_SYS_PLL_CNTL,
398 .reg_off = HHI_SYS_PLL_CNTL,
403 .hw.init = &(struct clk_init_data){
404 .name = "sys_pll_dco",
405 .ops = &meson_clk_pll_ro_ops,
406 .parent_data = &(const struct clk_parent_data) {
413 static struct clk_regmap gxbb_sys_pll = {
414 .data = &(struct clk_regmap_div_data){
415 .offset = HHI_SYS_PLL_CNTL,
418 .flags = CLK_DIVIDER_POWER_OF_TWO,
420 .hw.init = &(struct clk_init_data){
422 .ops = &clk_regmap_divider_ro_ops,
423 .parent_hws = (const struct clk_hw *[]) {
427 .flags = CLK_SET_RATE_PARENT,
431 static const struct reg_sequence gxbb_gp0_init_regs[] = {
432 { .reg = HHI_GP0_PLL_CNTL2, .def = 0x69c80000 },
433 { .reg = HHI_GP0_PLL_CNTL3, .def = 0x0a5590c4 },
434 { .reg = HHI_GP0_PLL_CNTL4, .def = 0x0000500d },
437 static struct clk_regmap gxbb_gp0_pll_dco = {
438 .data = &(struct meson_clk_pll_data){
440 .reg_off = HHI_GP0_PLL_CNTL,
445 .reg_off = HHI_GP0_PLL_CNTL,
450 .reg_off = HHI_GP0_PLL_CNTL,
455 .reg_off = HHI_GP0_PLL_CNTL,
460 .reg_off = HHI_GP0_PLL_CNTL,
464 .table = gxbb_gp0_pll_params_table,
465 .init_regs = gxbb_gp0_init_regs,
466 .init_count = ARRAY_SIZE(gxbb_gp0_init_regs),
468 .hw.init = &(struct clk_init_data){
469 .name = "gp0_pll_dco",
470 .ops = &meson_clk_pll_ops,
471 .parent_data = &(const struct clk_parent_data) {
478 static const struct reg_sequence gxl_gp0_init_regs[] = {
479 { .reg = HHI_GP0_PLL_CNTL1, .def = 0xc084b000 },
480 { .reg = HHI_GP0_PLL_CNTL2, .def = 0xb75020be },
481 { .reg = HHI_GP0_PLL_CNTL3, .def = 0x0a59a288 },
482 { .reg = HHI_GP0_PLL_CNTL4, .def = 0xc000004d },
483 { .reg = HHI_GP0_PLL_CNTL5, .def = 0x00078000 },
486 static struct clk_regmap gxl_gp0_pll_dco = {
487 .data = &(struct meson_clk_pll_data){
489 .reg_off = HHI_GP0_PLL_CNTL,
494 .reg_off = HHI_GP0_PLL_CNTL,
499 .reg_off = HHI_GP0_PLL_CNTL,
504 .reg_off = HHI_GP0_PLL_CNTL1,
509 .reg_off = HHI_GP0_PLL_CNTL,
514 .reg_off = HHI_GP0_PLL_CNTL,
518 .table = gxl_gp0_pll_params_table,
519 .init_regs = gxl_gp0_init_regs,
520 .init_count = ARRAY_SIZE(gxl_gp0_init_regs),
522 .hw.init = &(struct clk_init_data){
523 .name = "gp0_pll_dco",
524 .ops = &meson_clk_pll_ops,
525 .parent_data = &(const struct clk_parent_data) {
532 static struct clk_regmap gxbb_gp0_pll = {
533 .data = &(struct clk_regmap_div_data){
534 .offset = HHI_GP0_PLL_CNTL,
537 .flags = CLK_DIVIDER_POWER_OF_TWO,
539 .hw.init = &(struct clk_init_data){
541 .ops = &clk_regmap_divider_ops,
542 .parent_data = &(const struct clk_parent_data) {
545 * GXL and GXBB have different gp0_pll_dco (with
546 * different struct clk_hw). We fallback to the global
547 * naming string mechanism so gp0_pll picks up the
550 .name = "gp0_pll_dco",
554 .flags = CLK_SET_RATE_PARENT,
558 static struct clk_fixed_factor gxbb_fclk_div2_div = {
561 .hw.init = &(struct clk_init_data){
562 .name = "fclk_div2_div",
563 .ops = &clk_fixed_factor_ops,
564 .parent_hws = (const struct clk_hw *[]) {
571 static struct clk_regmap gxbb_fclk_div2 = {
572 .data = &(struct clk_regmap_gate_data){
573 .offset = HHI_MPLL_CNTL6,
576 .hw.init = &(struct clk_init_data){
578 .ops = &clk_regmap_gate_ops,
579 .parent_hws = (const struct clk_hw *[]) {
580 &gxbb_fclk_div2_div.hw
583 .flags = CLK_IS_CRITICAL,
587 static struct clk_fixed_factor gxbb_fclk_div3_div = {
590 .hw.init = &(struct clk_init_data){
591 .name = "fclk_div3_div",
592 .ops = &clk_fixed_factor_ops,
593 .parent_hws = (const struct clk_hw *[]) { &gxbb_fixed_pll.hw },
598 static struct clk_regmap gxbb_fclk_div3 = {
599 .data = &(struct clk_regmap_gate_data){
600 .offset = HHI_MPLL_CNTL6,
603 .hw.init = &(struct clk_init_data){
605 .ops = &clk_regmap_gate_ops,
606 .parent_hws = (const struct clk_hw *[]) {
607 &gxbb_fclk_div3_div.hw
612 * This clock, as fdiv2, is used by the SCPI FW and is required
613 * by the platform to operate correctly.
614 * Until the following condition are met, we need this clock to
615 * be marked as critical:
616 * a) The SCPI generic driver claims and enable all the clocks
618 * b) CCF has a clock hand-off mechanism to make the sure the
619 * clock stays on until the proper driver comes along
621 .flags = CLK_IS_CRITICAL,
625 static struct clk_fixed_factor gxbb_fclk_div4_div = {
628 .hw.init = &(struct clk_init_data){
629 .name = "fclk_div4_div",
630 .ops = &clk_fixed_factor_ops,
631 .parent_hws = (const struct clk_hw *[]) { &gxbb_fixed_pll.hw },
636 static struct clk_regmap gxbb_fclk_div4 = {
637 .data = &(struct clk_regmap_gate_data){
638 .offset = HHI_MPLL_CNTL6,
641 .hw.init = &(struct clk_init_data){
643 .ops = &clk_regmap_gate_ops,
644 .parent_hws = (const struct clk_hw *[]) {
645 &gxbb_fclk_div4_div.hw
651 static struct clk_fixed_factor gxbb_fclk_div5_div = {
654 .hw.init = &(struct clk_init_data){
655 .name = "fclk_div5_div",
656 .ops = &clk_fixed_factor_ops,
657 .parent_hws = (const struct clk_hw *[]) { &gxbb_fixed_pll.hw },
662 static struct clk_regmap gxbb_fclk_div5 = {
663 .data = &(struct clk_regmap_gate_data){
664 .offset = HHI_MPLL_CNTL6,
667 .hw.init = &(struct clk_init_data){
669 .ops = &clk_regmap_gate_ops,
670 .parent_hws = (const struct clk_hw *[]) {
671 &gxbb_fclk_div5_div.hw
677 static struct clk_fixed_factor gxbb_fclk_div7_div = {
680 .hw.init = &(struct clk_init_data){
681 .name = "fclk_div7_div",
682 .ops = &clk_fixed_factor_ops,
683 .parent_hws = (const struct clk_hw *[]) { &gxbb_fixed_pll.hw },
688 static struct clk_regmap gxbb_fclk_div7 = {
689 .data = &(struct clk_regmap_gate_data){
690 .offset = HHI_MPLL_CNTL6,
693 .hw.init = &(struct clk_init_data){
695 .ops = &clk_regmap_gate_ops,
696 .parent_hws = (const struct clk_hw *[]) {
697 &gxbb_fclk_div7_div.hw
703 static struct clk_regmap gxbb_mpll_prediv = {
704 .data = &(struct clk_regmap_div_data){
705 .offset = HHI_MPLL_CNTL5,
709 .hw.init = &(struct clk_init_data){
710 .name = "mpll_prediv",
711 .ops = &clk_regmap_divider_ro_ops,
712 .parent_hws = (const struct clk_hw *[]) { &gxbb_fixed_pll.hw },
717 static struct clk_regmap gxbb_mpll0_div = {
718 .data = &(struct meson_clk_mpll_data){
720 .reg_off = HHI_MPLL_CNTL7,
725 .reg_off = HHI_MPLL_CNTL,
730 .reg_off = HHI_MPLL_CNTL7,
734 .lock = &meson_clk_lock,
736 .hw.init = &(struct clk_init_data){
738 .ops = &meson_clk_mpll_ops,
739 .parent_hws = (const struct clk_hw *[]) {
746 static struct clk_regmap gxl_mpll0_div = {
747 .data = &(struct meson_clk_mpll_data){
749 .reg_off = HHI_MPLL_CNTL7,
754 .reg_off = HHI_MPLL_CNTL7,
759 .reg_off = HHI_MPLL_CNTL7,
763 .lock = &meson_clk_lock,
765 .hw.init = &(struct clk_init_data){
767 .ops = &meson_clk_mpll_ops,
768 .parent_hws = (const struct clk_hw *[]) {
775 static struct clk_regmap gxbb_mpll0 = {
776 .data = &(struct clk_regmap_gate_data){
777 .offset = HHI_MPLL_CNTL7,
780 .hw.init = &(struct clk_init_data){
782 .ops = &clk_regmap_gate_ops,
783 .parent_data = &(const struct clk_parent_data) {
786 * GXL and GXBB have different SDM_EN registers. We
787 * fallback to the global naming string mechanism so
788 * mpll0_div picks up the appropriate one.
794 .flags = CLK_SET_RATE_PARENT,
798 static struct clk_regmap gxbb_mpll1_div = {
799 .data = &(struct meson_clk_mpll_data){
801 .reg_off = HHI_MPLL_CNTL8,
806 .reg_off = HHI_MPLL_CNTL8,
811 .reg_off = HHI_MPLL_CNTL8,
815 .lock = &meson_clk_lock,
817 .hw.init = &(struct clk_init_data){
819 .ops = &meson_clk_mpll_ops,
820 .parent_hws = (const struct clk_hw *[]) {
827 static struct clk_regmap gxbb_mpll1 = {
828 .data = &(struct clk_regmap_gate_data){
829 .offset = HHI_MPLL_CNTL8,
832 .hw.init = &(struct clk_init_data){
834 .ops = &clk_regmap_gate_ops,
835 .parent_hws = (const struct clk_hw *[]) { &gxbb_mpll1_div.hw },
837 .flags = CLK_SET_RATE_PARENT,
841 static struct clk_regmap gxbb_mpll2_div = {
842 .data = &(struct meson_clk_mpll_data){
844 .reg_off = HHI_MPLL_CNTL9,
849 .reg_off = HHI_MPLL_CNTL9,
854 .reg_off = HHI_MPLL_CNTL9,
858 .lock = &meson_clk_lock,
860 .hw.init = &(struct clk_init_data){
862 .ops = &meson_clk_mpll_ops,
863 .parent_hws = (const struct clk_hw *[]) {
870 static struct clk_regmap gxbb_mpll2 = {
871 .data = &(struct clk_regmap_gate_data){
872 .offset = HHI_MPLL_CNTL9,
875 .hw.init = &(struct clk_init_data){
877 .ops = &clk_regmap_gate_ops,
878 .parent_hws = (const struct clk_hw *[]) { &gxbb_mpll2_div.hw },
880 .flags = CLK_SET_RATE_PARENT,
884 static u32 mux_table_clk81[] = { 0, 2, 3, 4, 5, 6, 7 };
885 static const struct clk_parent_data clk81_parent_data[] = {
886 { .fw_name = "xtal", },
887 { .hw = &gxbb_fclk_div7.hw },
888 { .hw = &gxbb_mpll1.hw },
889 { .hw = &gxbb_mpll2.hw },
890 { .hw = &gxbb_fclk_div4.hw },
891 { .hw = &gxbb_fclk_div3.hw },
892 { .hw = &gxbb_fclk_div5.hw },
895 static struct clk_regmap gxbb_mpeg_clk_sel = {
896 .data = &(struct clk_regmap_mux_data){
897 .offset = HHI_MPEG_CLK_CNTL,
900 .table = mux_table_clk81,
902 .hw.init = &(struct clk_init_data){
903 .name = "mpeg_clk_sel",
904 .ops = &clk_regmap_mux_ro_ops,
906 * bits 14:12 selects from 8 possible parents:
907 * xtal, 1'b0 (wtf), fclk_div7, mpll_clkout1, mpll_clkout2,
908 * fclk_div4, fclk_div3, fclk_div5
910 .parent_data = clk81_parent_data,
911 .num_parents = ARRAY_SIZE(clk81_parent_data),
915 static struct clk_regmap gxbb_mpeg_clk_div = {
916 .data = &(struct clk_regmap_div_data){
917 .offset = HHI_MPEG_CLK_CNTL,
921 .hw.init = &(struct clk_init_data){
922 .name = "mpeg_clk_div",
923 .ops = &clk_regmap_divider_ro_ops,
924 .parent_hws = (const struct clk_hw *[]) {
925 &gxbb_mpeg_clk_sel.hw
931 /* the mother of dragons gates */
932 static struct clk_regmap gxbb_clk81 = {
933 .data = &(struct clk_regmap_gate_data){
934 .offset = HHI_MPEG_CLK_CNTL,
937 .hw.init = &(struct clk_init_data){
939 .ops = &clk_regmap_gate_ops,
940 .parent_hws = (const struct clk_hw *[]) {
941 &gxbb_mpeg_clk_div.hw
944 .flags = CLK_IS_CRITICAL,
948 static struct clk_regmap gxbb_sar_adc_clk_sel = {
949 .data = &(struct clk_regmap_mux_data){
950 .offset = HHI_SAR_CLK_CNTL,
954 .hw.init = &(struct clk_init_data){
955 .name = "sar_adc_clk_sel",
956 .ops = &clk_regmap_mux_ops,
957 /* NOTE: The datasheet doesn't list the parents for bit 10 */
958 .parent_data = (const struct clk_parent_data []) {
959 { .fw_name = "xtal", },
960 { .hw = &gxbb_clk81.hw },
966 static struct clk_regmap gxbb_sar_adc_clk_div = {
967 .data = &(struct clk_regmap_div_data){
968 .offset = HHI_SAR_CLK_CNTL,
972 .hw.init = &(struct clk_init_data){
973 .name = "sar_adc_clk_div",
974 .ops = &clk_regmap_divider_ops,
975 .parent_hws = (const struct clk_hw *[]) {
976 &gxbb_sar_adc_clk_sel.hw
979 .flags = CLK_SET_RATE_PARENT,
983 static struct clk_regmap gxbb_sar_adc_clk = {
984 .data = &(struct clk_regmap_gate_data){
985 .offset = HHI_SAR_CLK_CNTL,
988 .hw.init = &(struct clk_init_data){
989 .name = "sar_adc_clk",
990 .ops = &clk_regmap_gate_ops,
991 .parent_hws = (const struct clk_hw *[]) {
992 &gxbb_sar_adc_clk_div.hw
995 .flags = CLK_SET_RATE_PARENT,
1000 * The MALI IP is clocked by two identical clocks (mali_0 and mali_1)
1001 * muxed by a glitch-free switch. The CCF can manage this glitch-free
1002 * mux because it does top-to-bottom updates the each clock tree and
1003 * switches to the "inactive" one when CLK_SET_RATE_GATE is set.
1006 static const struct clk_parent_data gxbb_mali_0_1_parent_data[] = {
1007 { .fw_name = "xtal", },
1008 { .hw = &gxbb_gp0_pll.hw },
1009 { .hw = &gxbb_mpll2.hw },
1010 { .hw = &gxbb_mpll1.hw },
1011 { .hw = &gxbb_fclk_div7.hw },
1012 { .hw = &gxbb_fclk_div4.hw },
1013 { .hw = &gxbb_fclk_div3.hw },
1014 { .hw = &gxbb_fclk_div5.hw },
1017 static struct clk_regmap gxbb_mali_0_sel = {
1018 .data = &(struct clk_regmap_mux_data){
1019 .offset = HHI_MALI_CLK_CNTL,
1023 .hw.init = &(struct clk_init_data){
1024 .name = "mali_0_sel",
1025 .ops = &clk_regmap_mux_ops,
1026 .parent_data = gxbb_mali_0_1_parent_data,
1029 * Don't request the parent to change the rate because
1030 * all GPU frequencies can be derived from the fclk_*
1031 * clocks and one special GP0_PLL setting. This is
1032 * important because we need the MPLL clocks for audio.
1038 static struct clk_regmap gxbb_mali_0_div = {
1039 .data = &(struct clk_regmap_div_data){
1040 .offset = HHI_MALI_CLK_CNTL,
1044 .hw.init = &(struct clk_init_data){
1045 .name = "mali_0_div",
1046 .ops = &clk_regmap_divider_ops,
1047 .parent_hws = (const struct clk_hw *[]) {
1051 .flags = CLK_SET_RATE_PARENT,
1055 static struct clk_regmap gxbb_mali_0 = {
1056 .data = &(struct clk_regmap_gate_data){
1057 .offset = HHI_MALI_CLK_CNTL,
1060 .hw.init = &(struct clk_init_data){
1062 .ops = &clk_regmap_gate_ops,
1063 .parent_hws = (const struct clk_hw *[]) {
1067 .flags = CLK_SET_RATE_GATE | CLK_SET_RATE_PARENT,
1071 static struct clk_regmap gxbb_mali_1_sel = {
1072 .data = &(struct clk_regmap_mux_data){
1073 .offset = HHI_MALI_CLK_CNTL,
1077 .hw.init = &(struct clk_init_data){
1078 .name = "mali_1_sel",
1079 .ops = &clk_regmap_mux_ops,
1080 .parent_data = gxbb_mali_0_1_parent_data,
1083 * Don't request the parent to change the rate because
1084 * all GPU frequencies can be derived from the fclk_*
1085 * clocks and one special GP0_PLL setting. This is
1086 * important because we need the MPLL clocks for audio.
1092 static struct clk_regmap gxbb_mali_1_div = {
1093 .data = &(struct clk_regmap_div_data){
1094 .offset = HHI_MALI_CLK_CNTL,
1098 .hw.init = &(struct clk_init_data){
1099 .name = "mali_1_div",
1100 .ops = &clk_regmap_divider_ops,
1101 .parent_hws = (const struct clk_hw *[]) {
1105 .flags = CLK_SET_RATE_PARENT,
1109 static struct clk_regmap gxbb_mali_1 = {
1110 .data = &(struct clk_regmap_gate_data){
1111 .offset = HHI_MALI_CLK_CNTL,
1114 .hw.init = &(struct clk_init_data){
1116 .ops = &clk_regmap_gate_ops,
1117 .parent_hws = (const struct clk_hw *[]) {
1121 .flags = CLK_SET_RATE_GATE | CLK_SET_RATE_PARENT,
1125 static const struct clk_hw *gxbb_mali_parent_hws[] = {
1130 static struct clk_regmap gxbb_mali = {
1131 .data = &(struct clk_regmap_mux_data){
1132 .offset = HHI_MALI_CLK_CNTL,
1136 .hw.init = &(struct clk_init_data){
1138 .ops = &clk_regmap_mux_ops,
1139 .parent_hws = gxbb_mali_parent_hws,
1141 .flags = CLK_SET_RATE_PARENT,
1145 static struct clk_regmap gxbb_cts_amclk_sel = {
1146 .data = &(struct clk_regmap_mux_data){
1147 .offset = HHI_AUD_CLK_CNTL,
1150 .table = (u32[]){ 1, 2, 3 },
1151 .flags = CLK_MUX_ROUND_CLOSEST,
1153 .hw.init = &(struct clk_init_data){
1154 .name = "cts_amclk_sel",
1155 .ops = &clk_regmap_mux_ops,
1156 .parent_hws = (const struct clk_hw *[]) {
1165 static struct clk_regmap gxbb_cts_amclk_div = {
1166 .data = &(struct clk_regmap_div_data) {
1167 .offset = HHI_AUD_CLK_CNTL,
1170 .flags = CLK_DIVIDER_ROUND_CLOSEST,
1172 .hw.init = &(struct clk_init_data){
1173 .name = "cts_amclk_div",
1174 .ops = &clk_regmap_divider_ops,
1175 .parent_hws = (const struct clk_hw *[]) {
1176 &gxbb_cts_amclk_sel.hw
1179 .flags = CLK_SET_RATE_PARENT,
1183 static struct clk_regmap gxbb_cts_amclk = {
1184 .data = &(struct clk_regmap_gate_data){
1185 .offset = HHI_AUD_CLK_CNTL,
1188 .hw.init = &(struct clk_init_data){
1189 .name = "cts_amclk",
1190 .ops = &clk_regmap_gate_ops,
1191 .parent_hws = (const struct clk_hw *[]) {
1192 &gxbb_cts_amclk_div.hw
1195 .flags = CLK_SET_RATE_PARENT,
1199 static struct clk_regmap gxbb_cts_mclk_i958_sel = {
1200 .data = &(struct clk_regmap_mux_data){
1201 .offset = HHI_AUD_CLK_CNTL2,
1204 .table = (u32[]){ 1, 2, 3 },
1205 .flags = CLK_MUX_ROUND_CLOSEST,
1207 .hw.init = &(struct clk_init_data) {
1208 .name = "cts_mclk_i958_sel",
1209 .ops = &clk_regmap_mux_ops,
1210 .parent_hws = (const struct clk_hw *[]) {
1219 static struct clk_regmap gxbb_cts_mclk_i958_div = {
1220 .data = &(struct clk_regmap_div_data){
1221 .offset = HHI_AUD_CLK_CNTL2,
1224 .flags = CLK_DIVIDER_ROUND_CLOSEST,
1226 .hw.init = &(struct clk_init_data) {
1227 .name = "cts_mclk_i958_div",
1228 .ops = &clk_regmap_divider_ops,
1229 .parent_hws = (const struct clk_hw *[]) {
1230 &gxbb_cts_mclk_i958_sel.hw
1233 .flags = CLK_SET_RATE_PARENT,
1237 static struct clk_regmap gxbb_cts_mclk_i958 = {
1238 .data = &(struct clk_regmap_gate_data){
1239 .offset = HHI_AUD_CLK_CNTL2,
1242 .hw.init = &(struct clk_init_data){
1243 .name = "cts_mclk_i958",
1244 .ops = &clk_regmap_gate_ops,
1245 .parent_hws = (const struct clk_hw *[]) {
1246 &gxbb_cts_mclk_i958_div.hw
1249 .flags = CLK_SET_RATE_PARENT,
1253 static struct clk_regmap gxbb_cts_i958 = {
1254 .data = &(struct clk_regmap_mux_data){
1255 .offset = HHI_AUD_CLK_CNTL2,
1259 .hw.init = &(struct clk_init_data){
1261 .ops = &clk_regmap_mux_ops,
1262 .parent_hws = (const struct clk_hw *[]) {
1264 &gxbb_cts_mclk_i958.hw
1268 *The parent is specific to origin of the audio data. Let the
1269 * consumer choose the appropriate parent
1271 .flags = CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
1275 static const struct clk_parent_data gxbb_32k_clk_parent_data[] = {
1276 { .fw_name = "xtal", },
1278 * FIXME: This clock is provided by the ao clock controller but the
1279 * clock is not yet part of the binding of this controller, so string
1280 * name must be use to set this parent.
1282 { .name = "cts_slow_oscin", .index = -1 },
1283 { .hw = &gxbb_fclk_div3.hw },
1284 { .hw = &gxbb_fclk_div5.hw },
1287 static struct clk_regmap gxbb_32k_clk_sel = {
1288 .data = &(struct clk_regmap_mux_data){
1289 .offset = HHI_32K_CLK_CNTL,
1293 .hw.init = &(struct clk_init_data){
1294 .name = "32k_clk_sel",
1295 .ops = &clk_regmap_mux_ops,
1296 .parent_data = gxbb_32k_clk_parent_data,
1298 .flags = CLK_SET_RATE_PARENT,
1302 static struct clk_regmap gxbb_32k_clk_div = {
1303 .data = &(struct clk_regmap_div_data){
1304 .offset = HHI_32K_CLK_CNTL,
1308 .hw.init = &(struct clk_init_data){
1309 .name = "32k_clk_div",
1310 .ops = &clk_regmap_divider_ops,
1311 .parent_hws = (const struct clk_hw *[]) {
1312 &gxbb_32k_clk_sel.hw
1315 .flags = CLK_SET_RATE_PARENT | CLK_DIVIDER_ROUND_CLOSEST,
1319 static struct clk_regmap gxbb_32k_clk = {
1320 .data = &(struct clk_regmap_gate_data){
1321 .offset = HHI_32K_CLK_CNTL,
1324 .hw.init = &(struct clk_init_data){
1326 .ops = &clk_regmap_gate_ops,
1327 .parent_hws = (const struct clk_hw *[]) {
1328 &gxbb_32k_clk_div.hw
1331 .flags = CLK_SET_RATE_PARENT,
1335 static const struct clk_parent_data gxbb_sd_emmc_clk0_parent_data[] = {
1336 { .fw_name = "xtal", },
1337 { .hw = &gxbb_fclk_div2.hw },
1338 { .hw = &gxbb_fclk_div3.hw },
1339 { .hw = &gxbb_fclk_div5.hw },
1340 { .hw = &gxbb_fclk_div7.hw },
1342 * Following these parent clocks, we should also have had mpll2, mpll3
1343 * and gp0_pll but these clocks are too precious to be used here. All
1344 * the necessary rates for MMC and NAND operation can be acheived using
1345 * xtal or fclk_div clocks
1350 static struct clk_regmap gxbb_sd_emmc_a_clk0_sel = {
1351 .data = &(struct clk_regmap_mux_data){
1352 .offset = HHI_SD_EMMC_CLK_CNTL,
1356 .hw.init = &(struct clk_init_data) {
1357 .name = "sd_emmc_a_clk0_sel",
1358 .ops = &clk_regmap_mux_ops,
1359 .parent_data = gxbb_sd_emmc_clk0_parent_data,
1360 .num_parents = ARRAY_SIZE(gxbb_sd_emmc_clk0_parent_data),
1361 .flags = CLK_SET_RATE_PARENT,
1365 static struct clk_regmap gxbb_sd_emmc_a_clk0_div = {
1366 .data = &(struct clk_regmap_div_data){
1367 .offset = HHI_SD_EMMC_CLK_CNTL,
1370 .flags = CLK_DIVIDER_ROUND_CLOSEST,
1372 .hw.init = &(struct clk_init_data) {
1373 .name = "sd_emmc_a_clk0_div",
1374 .ops = &clk_regmap_divider_ops,
1375 .parent_hws = (const struct clk_hw *[]) {
1376 &gxbb_sd_emmc_a_clk0_sel.hw
1379 .flags = CLK_SET_RATE_PARENT,
1383 static struct clk_regmap gxbb_sd_emmc_a_clk0 = {
1384 .data = &(struct clk_regmap_gate_data){
1385 .offset = HHI_SD_EMMC_CLK_CNTL,
1388 .hw.init = &(struct clk_init_data){
1389 .name = "sd_emmc_a_clk0",
1390 .ops = &clk_regmap_gate_ops,
1391 .parent_hws = (const struct clk_hw *[]) {
1392 &gxbb_sd_emmc_a_clk0_div.hw
1395 .flags = CLK_SET_RATE_PARENT,
1400 static struct clk_regmap gxbb_sd_emmc_b_clk0_sel = {
1401 .data = &(struct clk_regmap_mux_data){
1402 .offset = HHI_SD_EMMC_CLK_CNTL,
1406 .hw.init = &(struct clk_init_data) {
1407 .name = "sd_emmc_b_clk0_sel",
1408 .ops = &clk_regmap_mux_ops,
1409 .parent_data = gxbb_sd_emmc_clk0_parent_data,
1410 .num_parents = ARRAY_SIZE(gxbb_sd_emmc_clk0_parent_data),
1411 .flags = CLK_SET_RATE_PARENT,
1415 static struct clk_regmap gxbb_sd_emmc_b_clk0_div = {
1416 .data = &(struct clk_regmap_div_data){
1417 .offset = HHI_SD_EMMC_CLK_CNTL,
1420 .flags = CLK_DIVIDER_ROUND_CLOSEST,
1422 .hw.init = &(struct clk_init_data) {
1423 .name = "sd_emmc_b_clk0_div",
1424 .ops = &clk_regmap_divider_ops,
1425 .parent_hws = (const struct clk_hw *[]) {
1426 &gxbb_sd_emmc_b_clk0_sel.hw
1429 .flags = CLK_SET_RATE_PARENT,
1433 static struct clk_regmap gxbb_sd_emmc_b_clk0 = {
1434 .data = &(struct clk_regmap_gate_data){
1435 .offset = HHI_SD_EMMC_CLK_CNTL,
1438 .hw.init = &(struct clk_init_data){
1439 .name = "sd_emmc_b_clk0",
1440 .ops = &clk_regmap_gate_ops,
1441 .parent_hws = (const struct clk_hw *[]) {
1442 &gxbb_sd_emmc_b_clk0_div.hw
1445 .flags = CLK_SET_RATE_PARENT,
1449 /* EMMC/NAND clock */
1450 static struct clk_regmap gxbb_sd_emmc_c_clk0_sel = {
1451 .data = &(struct clk_regmap_mux_data){
1452 .offset = HHI_NAND_CLK_CNTL,
1456 .hw.init = &(struct clk_init_data) {
1457 .name = "sd_emmc_c_clk0_sel",
1458 .ops = &clk_regmap_mux_ops,
1459 .parent_data = gxbb_sd_emmc_clk0_parent_data,
1460 .num_parents = ARRAY_SIZE(gxbb_sd_emmc_clk0_parent_data),
1461 .flags = CLK_SET_RATE_PARENT,
1465 static struct clk_regmap gxbb_sd_emmc_c_clk0_div = {
1466 .data = &(struct clk_regmap_div_data){
1467 .offset = HHI_NAND_CLK_CNTL,
1470 .flags = CLK_DIVIDER_ROUND_CLOSEST,
1472 .hw.init = &(struct clk_init_data) {
1473 .name = "sd_emmc_c_clk0_div",
1474 .ops = &clk_regmap_divider_ops,
1475 .parent_hws = (const struct clk_hw *[]) {
1476 &gxbb_sd_emmc_c_clk0_sel.hw
1479 .flags = CLK_SET_RATE_PARENT,
1483 static struct clk_regmap gxbb_sd_emmc_c_clk0 = {
1484 .data = &(struct clk_regmap_gate_data){
1485 .offset = HHI_NAND_CLK_CNTL,
1488 .hw.init = &(struct clk_init_data){
1489 .name = "sd_emmc_c_clk0",
1490 .ops = &clk_regmap_gate_ops,
1491 .parent_hws = (const struct clk_hw *[]) {
1492 &gxbb_sd_emmc_c_clk0_div.hw
1495 .flags = CLK_SET_RATE_PARENT,
1501 static const struct clk_hw *gxbb_vpu_parent_hws[] = {
1508 static struct clk_regmap gxbb_vpu_0_sel = {
1509 .data = &(struct clk_regmap_mux_data){
1510 .offset = HHI_VPU_CLK_CNTL,
1514 .hw.init = &(struct clk_init_data){
1515 .name = "vpu_0_sel",
1516 .ops = &clk_regmap_mux_ops,
1518 * bits 9:10 selects from 4 possible parents:
1519 * fclk_div4, fclk_div3, fclk_div5, fclk_div7,
1521 .parent_hws = gxbb_vpu_parent_hws,
1522 .num_parents = ARRAY_SIZE(gxbb_vpu_parent_hws),
1523 .flags = CLK_SET_RATE_NO_REPARENT,
1527 static struct clk_regmap gxbb_vpu_0_div = {
1528 .data = &(struct clk_regmap_div_data){
1529 .offset = HHI_VPU_CLK_CNTL,
1533 .hw.init = &(struct clk_init_data){
1534 .name = "vpu_0_div",
1535 .ops = &clk_regmap_divider_ops,
1536 .parent_hws = (const struct clk_hw *[]) { &gxbb_vpu_0_sel.hw },
1538 .flags = CLK_SET_RATE_PARENT,
1542 static struct clk_regmap gxbb_vpu_0 = {
1543 .data = &(struct clk_regmap_gate_data){
1544 .offset = HHI_VPU_CLK_CNTL,
1547 .hw.init = &(struct clk_init_data) {
1549 .ops = &clk_regmap_gate_ops,
1550 .parent_hws = (const struct clk_hw *[]) { &gxbb_vpu_0_div.hw },
1552 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1556 static struct clk_regmap gxbb_vpu_1_sel = {
1557 .data = &(struct clk_regmap_mux_data){
1558 .offset = HHI_VPU_CLK_CNTL,
1562 .hw.init = &(struct clk_init_data){
1563 .name = "vpu_1_sel",
1564 .ops = &clk_regmap_mux_ops,
1566 * bits 25:26 selects from 4 possible parents:
1567 * fclk_div4, fclk_div3, fclk_div5, fclk_div7,
1569 .parent_hws = gxbb_vpu_parent_hws,
1570 .num_parents = ARRAY_SIZE(gxbb_vpu_parent_hws),
1571 .flags = CLK_SET_RATE_NO_REPARENT,
1575 static struct clk_regmap gxbb_vpu_1_div = {
1576 .data = &(struct clk_regmap_div_data){
1577 .offset = HHI_VPU_CLK_CNTL,
1581 .hw.init = &(struct clk_init_data){
1582 .name = "vpu_1_div",
1583 .ops = &clk_regmap_divider_ops,
1584 .parent_hws = (const struct clk_hw *[]) { &gxbb_vpu_1_sel.hw },
1586 .flags = CLK_SET_RATE_PARENT,
1590 static struct clk_regmap gxbb_vpu_1 = {
1591 .data = &(struct clk_regmap_gate_data){
1592 .offset = HHI_VPU_CLK_CNTL,
1595 .hw.init = &(struct clk_init_data) {
1597 .ops = &clk_regmap_gate_ops,
1598 .parent_hws = (const struct clk_hw *[]) { &gxbb_vpu_1_div.hw },
1600 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1604 static struct clk_regmap gxbb_vpu = {
1605 .data = &(struct clk_regmap_mux_data){
1606 .offset = HHI_VPU_CLK_CNTL,
1610 .hw.init = &(struct clk_init_data){
1612 .ops = &clk_regmap_mux_ops,
1614 * bit 31 selects from 2 possible parents:
1617 .parent_hws = (const struct clk_hw *[]) {
1622 .flags = CLK_SET_RATE_NO_REPARENT,
1628 static const struct clk_hw *gxbb_vapb_parent_hws[] = {
1635 static struct clk_regmap gxbb_vapb_0_sel = {
1636 .data = &(struct clk_regmap_mux_data){
1637 .offset = HHI_VAPBCLK_CNTL,
1641 .hw.init = &(struct clk_init_data){
1642 .name = "vapb_0_sel",
1643 .ops = &clk_regmap_mux_ops,
1645 * bits 9:10 selects from 4 possible parents:
1646 * fclk_div4, fclk_div3, fclk_div5, fclk_div7,
1648 .parent_hws = gxbb_vapb_parent_hws,
1649 .num_parents = ARRAY_SIZE(gxbb_vapb_parent_hws),
1650 .flags = CLK_SET_RATE_NO_REPARENT,
1654 static struct clk_regmap gxbb_vapb_0_div = {
1655 .data = &(struct clk_regmap_div_data){
1656 .offset = HHI_VAPBCLK_CNTL,
1660 .hw.init = &(struct clk_init_data){
1661 .name = "vapb_0_div",
1662 .ops = &clk_regmap_divider_ops,
1663 .parent_hws = (const struct clk_hw *[]) {
1667 .flags = CLK_SET_RATE_PARENT,
1671 static struct clk_regmap gxbb_vapb_0 = {
1672 .data = &(struct clk_regmap_gate_data){
1673 .offset = HHI_VAPBCLK_CNTL,
1676 .hw.init = &(struct clk_init_data) {
1678 .ops = &clk_regmap_gate_ops,
1679 .parent_hws = (const struct clk_hw *[]) {
1683 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1687 static struct clk_regmap gxbb_vapb_1_sel = {
1688 .data = &(struct clk_regmap_mux_data){
1689 .offset = HHI_VAPBCLK_CNTL,
1693 .hw.init = &(struct clk_init_data){
1694 .name = "vapb_1_sel",
1695 .ops = &clk_regmap_mux_ops,
1697 * bits 25:26 selects from 4 possible parents:
1698 * fclk_div4, fclk_div3, fclk_div5, fclk_div7,
1700 .parent_hws = gxbb_vapb_parent_hws,
1701 .num_parents = ARRAY_SIZE(gxbb_vapb_parent_hws),
1702 .flags = CLK_SET_RATE_NO_REPARENT,
1706 static struct clk_regmap gxbb_vapb_1_div = {
1707 .data = &(struct clk_regmap_div_data){
1708 .offset = HHI_VAPBCLK_CNTL,
1712 .hw.init = &(struct clk_init_data){
1713 .name = "vapb_1_div",
1714 .ops = &clk_regmap_divider_ops,
1715 .parent_hws = (const struct clk_hw *[]) {
1719 .flags = CLK_SET_RATE_PARENT,
1723 static struct clk_regmap gxbb_vapb_1 = {
1724 .data = &(struct clk_regmap_gate_data){
1725 .offset = HHI_VAPBCLK_CNTL,
1728 .hw.init = &(struct clk_init_data) {
1730 .ops = &clk_regmap_gate_ops,
1731 .parent_hws = (const struct clk_hw *[]) {
1735 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1739 static struct clk_regmap gxbb_vapb_sel = {
1740 .data = &(struct clk_regmap_mux_data){
1741 .offset = HHI_VAPBCLK_CNTL,
1745 .hw.init = &(struct clk_init_data){
1747 .ops = &clk_regmap_mux_ops,
1749 * bit 31 selects from 2 possible parents:
1752 .parent_hws = (const struct clk_hw *[]) {
1757 .flags = CLK_SET_RATE_NO_REPARENT,
1761 static struct clk_regmap gxbb_vapb = {
1762 .data = &(struct clk_regmap_gate_data){
1763 .offset = HHI_VAPBCLK_CNTL,
1766 .hw.init = &(struct clk_init_data) {
1768 .ops = &clk_regmap_gate_ops,
1769 .parent_hws = (const struct clk_hw *[]) { &gxbb_vapb_sel.hw },
1771 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1777 static struct clk_regmap gxbb_vid_pll_div = {
1778 .data = &(struct meson_vid_pll_div_data){
1780 .reg_off = HHI_VID_PLL_CLK_DIV,
1785 .reg_off = HHI_VID_PLL_CLK_DIV,
1790 .hw.init = &(struct clk_init_data) {
1791 .name = "vid_pll_div",
1792 .ops = &meson_vid_pll_div_ro_ops,
1793 .parent_data = &(const struct clk_parent_data) {
1796 * GXL and GXBB have different hdmi_plls (with
1797 * different struct clk_hw). We fallback to the global
1798 * naming string mechanism so vid_pll_div picks up the
1805 .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
1809 static const struct clk_parent_data gxbb_vid_pll_parent_data[] = {
1810 { .hw = &gxbb_vid_pll_div.hw },
1813 * GXL and GXBB have different hdmi_plls (with
1814 * different struct clk_hw). We fallback to the global
1815 * naming string mechanism so vid_pll_div picks up the
1818 { .name = "hdmi_pll", .index = -1 },
1821 static struct clk_regmap gxbb_vid_pll_sel = {
1822 .data = &(struct clk_regmap_mux_data){
1823 .offset = HHI_VID_PLL_CLK_DIV,
1827 .hw.init = &(struct clk_init_data){
1828 .name = "vid_pll_sel",
1829 .ops = &clk_regmap_mux_ops,
1831 * bit 18 selects from 2 possible parents:
1832 * vid_pll_div or hdmi_pll
1834 .parent_data = gxbb_vid_pll_parent_data,
1835 .num_parents = ARRAY_SIZE(gxbb_vid_pll_parent_data),
1836 .flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
1840 static struct clk_regmap gxbb_vid_pll = {
1841 .data = &(struct clk_regmap_gate_data){
1842 .offset = HHI_VID_PLL_CLK_DIV,
1845 .hw.init = &(struct clk_init_data) {
1847 .ops = &clk_regmap_gate_ops,
1848 .parent_hws = (const struct clk_hw *[]) {
1849 &gxbb_vid_pll_sel.hw
1852 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1856 static const struct clk_hw *gxbb_vclk_parent_hws[] = {
1866 static struct clk_regmap gxbb_vclk_sel = {
1867 .data = &(struct clk_regmap_mux_data){
1868 .offset = HHI_VID_CLK_CNTL,
1872 .hw.init = &(struct clk_init_data){
1874 .ops = &clk_regmap_mux_ops,
1876 * bits 16:18 selects from 8 possible parents:
1877 * vid_pll, fclk_div4, fclk_div3, fclk_div5,
1878 * vid_pll, fclk_div7, mp1
1880 .parent_hws = gxbb_vclk_parent_hws,
1881 .num_parents = ARRAY_SIZE(gxbb_vclk_parent_hws),
1882 .flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
1886 static struct clk_regmap gxbb_vclk2_sel = {
1887 .data = &(struct clk_regmap_mux_data){
1888 .offset = HHI_VIID_CLK_CNTL,
1892 .hw.init = &(struct clk_init_data){
1893 .name = "vclk2_sel",
1894 .ops = &clk_regmap_mux_ops,
1896 * bits 16:18 selects from 8 possible parents:
1897 * vid_pll, fclk_div4, fclk_div3, fclk_div5,
1898 * vid_pll, fclk_div7, mp1
1900 .parent_hws = gxbb_vclk_parent_hws,
1901 .num_parents = ARRAY_SIZE(gxbb_vclk_parent_hws),
1902 .flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
1906 static struct clk_regmap gxbb_vclk_input = {
1907 .data = &(struct clk_regmap_gate_data){
1908 .offset = HHI_VID_CLK_DIV,
1911 .hw.init = &(struct clk_init_data) {
1912 .name = "vclk_input",
1913 .ops = &clk_regmap_gate_ops,
1914 .parent_hws = (const struct clk_hw *[]) { &gxbb_vclk_sel.hw },
1916 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1920 static struct clk_regmap gxbb_vclk2_input = {
1921 .data = &(struct clk_regmap_gate_data){
1922 .offset = HHI_VIID_CLK_DIV,
1925 .hw.init = &(struct clk_init_data) {
1926 .name = "vclk2_input",
1927 .ops = &clk_regmap_gate_ops,
1928 .parent_hws = (const struct clk_hw *[]) { &gxbb_vclk2_sel.hw },
1930 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1934 static struct clk_regmap gxbb_vclk_div = {
1935 .data = &(struct clk_regmap_div_data){
1936 .offset = HHI_VID_CLK_DIV,
1940 .hw.init = &(struct clk_init_data){
1942 .ops = &clk_regmap_divider_ops,
1943 .parent_hws = (const struct clk_hw *[]) {
1947 .flags = CLK_GET_RATE_NOCACHE,
1951 static struct clk_regmap gxbb_vclk2_div = {
1952 .data = &(struct clk_regmap_div_data){
1953 .offset = HHI_VIID_CLK_DIV,
1957 .hw.init = &(struct clk_init_data){
1958 .name = "vclk2_div",
1959 .ops = &clk_regmap_divider_ops,
1960 .parent_hws = (const struct clk_hw *[]) {
1961 &gxbb_vclk2_input.hw
1964 .flags = CLK_GET_RATE_NOCACHE,
1968 static struct clk_regmap gxbb_vclk = {
1969 .data = &(struct clk_regmap_gate_data){
1970 .offset = HHI_VID_CLK_CNTL,
1973 .hw.init = &(struct clk_init_data) {
1975 .ops = &clk_regmap_gate_ops,
1976 .parent_hws = (const struct clk_hw *[]) { &gxbb_vclk_div.hw },
1978 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1982 static struct clk_regmap gxbb_vclk2 = {
1983 .data = &(struct clk_regmap_gate_data){
1984 .offset = HHI_VIID_CLK_CNTL,
1987 .hw.init = &(struct clk_init_data) {
1989 .ops = &clk_regmap_gate_ops,
1990 .parent_hws = (const struct clk_hw *[]) { &gxbb_vclk2_div.hw },
1992 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1996 static struct clk_regmap gxbb_vclk_div1 = {
1997 .data = &(struct clk_regmap_gate_data){
1998 .offset = HHI_VID_CLK_CNTL,
2001 .hw.init = &(struct clk_init_data) {
2002 .name = "vclk_div1",
2003 .ops = &clk_regmap_gate_ops,
2004 .parent_hws = (const struct clk_hw *[]) { &gxbb_vclk.hw },
2006 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2010 static struct clk_regmap gxbb_vclk_div2_en = {
2011 .data = &(struct clk_regmap_gate_data){
2012 .offset = HHI_VID_CLK_CNTL,
2015 .hw.init = &(struct clk_init_data) {
2016 .name = "vclk_div2_en",
2017 .ops = &clk_regmap_gate_ops,
2018 .parent_hws = (const struct clk_hw *[]) { &gxbb_vclk.hw },
2020 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2024 static struct clk_regmap gxbb_vclk_div4_en = {
2025 .data = &(struct clk_regmap_gate_data){
2026 .offset = HHI_VID_CLK_CNTL,
2029 .hw.init = &(struct clk_init_data) {
2030 .name = "vclk_div4_en",
2031 .ops = &clk_regmap_gate_ops,
2032 .parent_hws = (const struct clk_hw *[]) { &gxbb_vclk.hw },
2034 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2038 static struct clk_regmap gxbb_vclk_div6_en = {
2039 .data = &(struct clk_regmap_gate_data){
2040 .offset = HHI_VID_CLK_CNTL,
2043 .hw.init = &(struct clk_init_data) {
2044 .name = "vclk_div6_en",
2045 .ops = &clk_regmap_gate_ops,
2046 .parent_hws = (const struct clk_hw *[]) { &gxbb_vclk.hw },
2048 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2052 static struct clk_regmap gxbb_vclk_div12_en = {
2053 .data = &(struct clk_regmap_gate_data){
2054 .offset = HHI_VID_CLK_CNTL,
2057 .hw.init = &(struct clk_init_data) {
2058 .name = "vclk_div12_en",
2059 .ops = &clk_regmap_gate_ops,
2060 .parent_hws = (const struct clk_hw *[]) { &gxbb_vclk.hw },
2062 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2066 static struct clk_regmap gxbb_vclk2_div1 = {
2067 .data = &(struct clk_regmap_gate_data){
2068 .offset = HHI_VIID_CLK_CNTL,
2071 .hw.init = &(struct clk_init_data) {
2072 .name = "vclk2_div1",
2073 .ops = &clk_regmap_gate_ops,
2074 .parent_hws = (const struct clk_hw *[]) { &gxbb_vclk2.hw },
2076 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2080 static struct clk_regmap gxbb_vclk2_div2_en = {
2081 .data = &(struct clk_regmap_gate_data){
2082 .offset = HHI_VIID_CLK_CNTL,
2085 .hw.init = &(struct clk_init_data) {
2086 .name = "vclk2_div2_en",
2087 .ops = &clk_regmap_gate_ops,
2088 .parent_hws = (const struct clk_hw *[]) { &gxbb_vclk2.hw },
2090 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2094 static struct clk_regmap gxbb_vclk2_div4_en = {
2095 .data = &(struct clk_regmap_gate_data){
2096 .offset = HHI_VIID_CLK_CNTL,
2099 .hw.init = &(struct clk_init_data) {
2100 .name = "vclk2_div4_en",
2101 .ops = &clk_regmap_gate_ops,
2102 .parent_hws = (const struct clk_hw *[]) { &gxbb_vclk2.hw },
2104 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2108 static struct clk_regmap gxbb_vclk2_div6_en = {
2109 .data = &(struct clk_regmap_gate_data){
2110 .offset = HHI_VIID_CLK_CNTL,
2113 .hw.init = &(struct clk_init_data) {
2114 .name = "vclk2_div6_en",
2115 .ops = &clk_regmap_gate_ops,
2116 .parent_hws = (const struct clk_hw *[]) { &gxbb_vclk2.hw },
2118 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2122 static struct clk_regmap gxbb_vclk2_div12_en = {
2123 .data = &(struct clk_regmap_gate_data){
2124 .offset = HHI_VIID_CLK_CNTL,
2127 .hw.init = &(struct clk_init_data) {
2128 .name = "vclk2_div12_en",
2129 .ops = &clk_regmap_gate_ops,
2130 .parent_hws = (const struct clk_hw *[]) { &gxbb_vclk2.hw },
2132 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2136 static struct clk_fixed_factor gxbb_vclk_div2 = {
2139 .hw.init = &(struct clk_init_data){
2140 .name = "vclk_div2",
2141 .ops = &clk_fixed_factor_ops,
2142 .parent_hws = (const struct clk_hw *[]) {
2143 &gxbb_vclk_div2_en.hw
2149 static struct clk_fixed_factor gxbb_vclk_div4 = {
2152 .hw.init = &(struct clk_init_data){
2153 .name = "vclk_div4",
2154 .ops = &clk_fixed_factor_ops,
2155 .parent_hws = (const struct clk_hw *[]) {
2156 &gxbb_vclk_div4_en.hw
2162 static struct clk_fixed_factor gxbb_vclk_div6 = {
2165 .hw.init = &(struct clk_init_data){
2166 .name = "vclk_div6",
2167 .ops = &clk_fixed_factor_ops,
2168 .parent_hws = (const struct clk_hw *[]) {
2169 &gxbb_vclk_div6_en.hw
2175 static struct clk_fixed_factor gxbb_vclk_div12 = {
2178 .hw.init = &(struct clk_init_data){
2179 .name = "vclk_div12",
2180 .ops = &clk_fixed_factor_ops,
2181 .parent_hws = (const struct clk_hw *[]) {
2182 &gxbb_vclk_div12_en.hw
2188 static struct clk_fixed_factor gxbb_vclk2_div2 = {
2191 .hw.init = &(struct clk_init_data){
2192 .name = "vclk2_div2",
2193 .ops = &clk_fixed_factor_ops,
2194 .parent_hws = (const struct clk_hw *[]) {
2195 &gxbb_vclk2_div2_en.hw
2201 static struct clk_fixed_factor gxbb_vclk2_div4 = {
2204 .hw.init = &(struct clk_init_data){
2205 .name = "vclk2_div4",
2206 .ops = &clk_fixed_factor_ops,
2207 .parent_hws = (const struct clk_hw *[]) {
2208 &gxbb_vclk2_div4_en.hw
2214 static struct clk_fixed_factor gxbb_vclk2_div6 = {
2217 .hw.init = &(struct clk_init_data){
2218 .name = "vclk2_div6",
2219 .ops = &clk_fixed_factor_ops,
2220 .parent_hws = (const struct clk_hw *[]) {
2221 &gxbb_vclk2_div6_en.hw
2227 static struct clk_fixed_factor gxbb_vclk2_div12 = {
2230 .hw.init = &(struct clk_init_data){
2231 .name = "vclk2_div12",
2232 .ops = &clk_fixed_factor_ops,
2233 .parent_hws = (const struct clk_hw *[]) {
2234 &gxbb_vclk2_div12_en.hw
2240 static u32 mux_table_cts_sel[] = { 0, 1, 2, 3, 4, 8, 9, 10, 11, 12 };
2241 static const struct clk_hw *gxbb_cts_parent_hws[] = {
2246 &gxbb_vclk_div12.hw,
2247 &gxbb_vclk2_div1.hw,
2248 &gxbb_vclk2_div2.hw,
2249 &gxbb_vclk2_div4.hw,
2250 &gxbb_vclk2_div6.hw,
2251 &gxbb_vclk2_div12.hw,
2254 static struct clk_regmap gxbb_cts_enci_sel = {
2255 .data = &(struct clk_regmap_mux_data){
2256 .offset = HHI_VID_CLK_DIV,
2259 .table = mux_table_cts_sel,
2261 .hw.init = &(struct clk_init_data){
2262 .name = "cts_enci_sel",
2263 .ops = &clk_regmap_mux_ops,
2264 .parent_hws = gxbb_cts_parent_hws,
2265 .num_parents = ARRAY_SIZE(gxbb_cts_parent_hws),
2266 .flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
2270 static struct clk_regmap gxbb_cts_encp_sel = {
2271 .data = &(struct clk_regmap_mux_data){
2272 .offset = HHI_VID_CLK_DIV,
2275 .table = mux_table_cts_sel,
2277 .hw.init = &(struct clk_init_data){
2278 .name = "cts_encp_sel",
2279 .ops = &clk_regmap_mux_ops,
2280 .parent_hws = gxbb_cts_parent_hws,
2281 .num_parents = ARRAY_SIZE(gxbb_cts_parent_hws),
2282 .flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
2286 static struct clk_regmap gxbb_cts_vdac_sel = {
2287 .data = &(struct clk_regmap_mux_data){
2288 .offset = HHI_VIID_CLK_DIV,
2291 .table = mux_table_cts_sel,
2293 .hw.init = &(struct clk_init_data){
2294 .name = "cts_vdac_sel",
2295 .ops = &clk_regmap_mux_ops,
2296 .parent_hws = gxbb_cts_parent_hws,
2297 .num_parents = ARRAY_SIZE(gxbb_cts_parent_hws),
2298 .flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
2302 /* TOFIX: add support for cts_tcon */
2303 static u32 mux_table_hdmi_tx_sel[] = { 0, 1, 2, 3, 4, 8, 9, 10, 11, 12 };
2304 static const struct clk_hw *gxbb_cts_hdmi_tx_parent_hws[] = {
2309 &gxbb_vclk_div12.hw,
2310 &gxbb_vclk2_div1.hw,
2311 &gxbb_vclk2_div2.hw,
2312 &gxbb_vclk2_div4.hw,
2313 &gxbb_vclk2_div6.hw,
2314 &gxbb_vclk2_div12.hw,
2317 static struct clk_regmap gxbb_hdmi_tx_sel = {
2318 .data = &(struct clk_regmap_mux_data){
2319 .offset = HHI_HDMI_CLK_CNTL,
2322 .table = mux_table_hdmi_tx_sel,
2324 .hw.init = &(struct clk_init_data){
2325 .name = "hdmi_tx_sel",
2326 .ops = &clk_regmap_mux_ops,
2328 * bits 31:28 selects from 12 possible parents:
2329 * vclk_div1, vclk_div2, vclk_div4, vclk_div6, vclk_div12
2330 * vclk2_div1, vclk2_div2, vclk2_div4, vclk2_div6, vclk2_div12,
2333 .parent_hws = gxbb_cts_hdmi_tx_parent_hws,
2334 .num_parents = ARRAY_SIZE(gxbb_cts_hdmi_tx_parent_hws),
2335 .flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
2339 static struct clk_regmap gxbb_cts_enci = {
2340 .data = &(struct clk_regmap_gate_data){
2341 .offset = HHI_VID_CLK_CNTL2,
2344 .hw.init = &(struct clk_init_data) {
2346 .ops = &clk_regmap_gate_ops,
2347 .parent_hws = (const struct clk_hw *[]) {
2348 &gxbb_cts_enci_sel.hw
2351 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2355 static struct clk_regmap gxbb_cts_encp = {
2356 .data = &(struct clk_regmap_gate_data){
2357 .offset = HHI_VID_CLK_CNTL2,
2360 .hw.init = &(struct clk_init_data) {
2362 .ops = &clk_regmap_gate_ops,
2363 .parent_hws = (const struct clk_hw *[]) {
2364 &gxbb_cts_encp_sel.hw
2367 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2371 static struct clk_regmap gxbb_cts_vdac = {
2372 .data = &(struct clk_regmap_gate_data){
2373 .offset = HHI_VID_CLK_CNTL2,
2376 .hw.init = &(struct clk_init_data) {
2378 .ops = &clk_regmap_gate_ops,
2379 .parent_hws = (const struct clk_hw *[]) {
2380 &gxbb_cts_vdac_sel.hw
2383 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2387 static struct clk_regmap gxbb_hdmi_tx = {
2388 .data = &(struct clk_regmap_gate_data){
2389 .offset = HHI_VID_CLK_CNTL2,
2392 .hw.init = &(struct clk_init_data) {
2394 .ops = &clk_regmap_gate_ops,
2395 .parent_hws = (const struct clk_hw *[]) {
2396 &gxbb_hdmi_tx_sel.hw
2399 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2405 static const struct clk_parent_data gxbb_hdmi_parent_data[] = {
2406 { .fw_name = "xtal", },
2407 { .hw = &gxbb_fclk_div4.hw },
2408 { .hw = &gxbb_fclk_div3.hw },
2409 { .hw = &gxbb_fclk_div5.hw },
2412 static struct clk_regmap gxbb_hdmi_sel = {
2413 .data = &(struct clk_regmap_mux_data){
2414 .offset = HHI_HDMI_CLK_CNTL,
2417 .flags = CLK_MUX_ROUND_CLOSEST,
2419 .hw.init = &(struct clk_init_data){
2421 .ops = &clk_regmap_mux_ops,
2422 .parent_data = gxbb_hdmi_parent_data,
2423 .num_parents = ARRAY_SIZE(gxbb_hdmi_parent_data),
2424 .flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
2428 static struct clk_regmap gxbb_hdmi_div = {
2429 .data = &(struct clk_regmap_div_data){
2430 .offset = HHI_HDMI_CLK_CNTL,
2434 .hw.init = &(struct clk_init_data){
2436 .ops = &clk_regmap_divider_ops,
2437 .parent_hws = (const struct clk_hw *[]) { &gxbb_hdmi_sel.hw },
2439 .flags = CLK_GET_RATE_NOCACHE,
2443 static struct clk_regmap gxbb_hdmi = {
2444 .data = &(struct clk_regmap_gate_data){
2445 .offset = HHI_HDMI_CLK_CNTL,
2448 .hw.init = &(struct clk_init_data) {
2450 .ops = &clk_regmap_gate_ops,
2451 .parent_hws = (const struct clk_hw *[]) { &gxbb_hdmi_div.hw },
2453 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2459 static const struct clk_hw *gxbb_vdec_parent_hws[] = {
2466 static struct clk_regmap gxbb_vdec_1_sel = {
2467 .data = &(struct clk_regmap_mux_data){
2468 .offset = HHI_VDEC_CLK_CNTL,
2471 .flags = CLK_MUX_ROUND_CLOSEST,
2473 .hw.init = &(struct clk_init_data){
2474 .name = "vdec_1_sel",
2475 .ops = &clk_regmap_mux_ops,
2476 .parent_hws = gxbb_vdec_parent_hws,
2477 .num_parents = ARRAY_SIZE(gxbb_vdec_parent_hws),
2478 .flags = CLK_SET_RATE_PARENT,
2482 static struct clk_regmap gxbb_vdec_1_div = {
2483 .data = &(struct clk_regmap_div_data){
2484 .offset = HHI_VDEC_CLK_CNTL,
2487 .flags = CLK_DIVIDER_ROUND_CLOSEST,
2489 .hw.init = &(struct clk_init_data){
2490 .name = "vdec_1_div",
2491 .ops = &clk_regmap_divider_ops,
2492 .parent_hws = (const struct clk_hw *[]) {
2496 .flags = CLK_SET_RATE_PARENT,
2500 static struct clk_regmap gxbb_vdec_1 = {
2501 .data = &(struct clk_regmap_gate_data){
2502 .offset = HHI_VDEC_CLK_CNTL,
2505 .hw.init = &(struct clk_init_data) {
2507 .ops = &clk_regmap_gate_ops,
2508 .parent_hws = (const struct clk_hw *[]) {
2512 .flags = CLK_SET_RATE_PARENT,
2516 static struct clk_regmap gxbb_vdec_hevc_sel = {
2517 .data = &(struct clk_regmap_mux_data){
2518 .offset = HHI_VDEC2_CLK_CNTL,
2521 .flags = CLK_MUX_ROUND_CLOSEST,
2523 .hw.init = &(struct clk_init_data){
2524 .name = "vdec_hevc_sel",
2525 .ops = &clk_regmap_mux_ops,
2526 .parent_hws = gxbb_vdec_parent_hws,
2527 .num_parents = ARRAY_SIZE(gxbb_vdec_parent_hws),
2528 .flags = CLK_SET_RATE_PARENT,
2532 static struct clk_regmap gxbb_vdec_hevc_div = {
2533 .data = &(struct clk_regmap_div_data){
2534 .offset = HHI_VDEC2_CLK_CNTL,
2537 .flags = CLK_DIVIDER_ROUND_CLOSEST,
2539 .hw.init = &(struct clk_init_data){
2540 .name = "vdec_hevc_div",
2541 .ops = &clk_regmap_divider_ops,
2542 .parent_hws = (const struct clk_hw *[]) {
2543 &gxbb_vdec_hevc_sel.hw
2546 .flags = CLK_SET_RATE_PARENT,
2550 static struct clk_regmap gxbb_vdec_hevc = {
2551 .data = &(struct clk_regmap_gate_data){
2552 .offset = HHI_VDEC2_CLK_CNTL,
2555 .hw.init = &(struct clk_init_data) {
2556 .name = "vdec_hevc",
2557 .ops = &clk_regmap_gate_ops,
2558 .parent_hws = (const struct clk_hw *[]) {
2559 &gxbb_vdec_hevc_div.hw
2562 .flags = CLK_SET_RATE_PARENT,
2566 static u32 mux_table_gen_clk[] = { 0, 4, 5, 6, 7, 8,
2567 9, 10, 11, 13, 14, };
2568 static const struct clk_parent_data gen_clk_parent_data[] = {
2569 { .fw_name = "xtal", },
2570 { .hw = &gxbb_vdec_1.hw },
2571 { .hw = &gxbb_vdec_hevc.hw },
2572 { .hw = &gxbb_mpll0.hw },
2573 { .hw = &gxbb_mpll1.hw },
2574 { .hw = &gxbb_mpll2.hw },
2575 { .hw = &gxbb_fclk_div4.hw },
2576 { .hw = &gxbb_fclk_div3.hw },
2577 { .hw = &gxbb_fclk_div5.hw },
2578 { .hw = &gxbb_fclk_div7.hw },
2579 { .hw = &gxbb_gp0_pll.hw },
2582 static struct clk_regmap gxbb_gen_clk_sel = {
2583 .data = &(struct clk_regmap_mux_data){
2584 .offset = HHI_GEN_CLK_CNTL,
2587 .table = mux_table_gen_clk,
2589 .hw.init = &(struct clk_init_data){
2590 .name = "gen_clk_sel",
2591 .ops = &clk_regmap_mux_ops,
2593 * bits 15:12 selects from 14 possible parents:
2594 * xtal, [rtc_oscin_i], [sys_cpu_div16], [ddr_dpll_pt],
2595 * vid_pll, vid2_pll (hevc), mpll0, mpll1, mpll2, fdiv4,
2596 * fdiv3, fdiv5, [cts_msr_clk], fdiv7, gp0_pll
2598 .parent_data = gen_clk_parent_data,
2599 .num_parents = ARRAY_SIZE(gen_clk_parent_data),
2603 static struct clk_regmap gxbb_gen_clk_div = {
2604 .data = &(struct clk_regmap_div_data){
2605 .offset = HHI_GEN_CLK_CNTL,
2609 .hw.init = &(struct clk_init_data){
2610 .name = "gen_clk_div",
2611 .ops = &clk_regmap_divider_ops,
2612 .parent_hws = (const struct clk_hw *[]) {
2613 &gxbb_gen_clk_sel.hw
2616 .flags = CLK_SET_RATE_PARENT,
2620 static struct clk_regmap gxbb_gen_clk = {
2621 .data = &(struct clk_regmap_gate_data){
2622 .offset = HHI_GEN_CLK_CNTL,
2625 .hw.init = &(struct clk_init_data){
2627 .ops = &clk_regmap_gate_ops,
2628 .parent_hws = (const struct clk_hw *[]) {
2629 &gxbb_gen_clk_div.hw
2632 .flags = CLK_SET_RATE_PARENT,
2636 #define MESON_GATE(_name, _reg, _bit) \
2637 MESON_PCLK(_name, _reg, _bit, &gxbb_clk81.hw)
2639 /* Everything Else (EE) domain gates */
2640 static MESON_GATE(gxbb_ddr, HHI_GCLK_MPEG0, 0);
2641 static MESON_GATE(gxbb_dos, HHI_GCLK_MPEG0, 1);
2642 static MESON_GATE(gxbb_isa, HHI_GCLK_MPEG0, 5);
2643 static MESON_GATE(gxbb_pl301, HHI_GCLK_MPEG0, 6);
2644 static MESON_GATE(gxbb_periphs, HHI_GCLK_MPEG0, 7);
2645 static MESON_GATE(gxbb_spicc, HHI_GCLK_MPEG0, 8);
2646 static MESON_GATE(gxbb_i2c, HHI_GCLK_MPEG0, 9);
2647 static MESON_GATE(gxbb_sana, HHI_GCLK_MPEG0, 10);
2648 static MESON_GATE(gxbb_smart_card, HHI_GCLK_MPEG0, 11);
2649 static MESON_GATE(gxbb_rng0, HHI_GCLK_MPEG0, 12);
2650 static MESON_GATE(gxbb_uart0, HHI_GCLK_MPEG0, 13);
2651 static MESON_GATE(gxbb_sdhc, HHI_GCLK_MPEG0, 14);
2652 static MESON_GATE(gxbb_stream, HHI_GCLK_MPEG0, 15);
2653 static MESON_GATE(gxbb_async_fifo, HHI_GCLK_MPEG0, 16);
2654 static MESON_GATE(gxbb_sdio, HHI_GCLK_MPEG0, 17);
2655 static MESON_GATE(gxbb_abuf, HHI_GCLK_MPEG0, 18);
2656 static MESON_GATE(gxbb_hiu_iface, HHI_GCLK_MPEG0, 19);
2657 static MESON_GATE(gxbb_assist_misc, HHI_GCLK_MPEG0, 23);
2658 static MESON_GATE(gxbb_emmc_a, HHI_GCLK_MPEG0, 24);
2659 static MESON_GATE(gxbb_emmc_b, HHI_GCLK_MPEG0, 25);
2660 static MESON_GATE(gxbb_emmc_c, HHI_GCLK_MPEG0, 26);
2661 static MESON_GATE(gxl_acodec, HHI_GCLK_MPEG0, 28);
2662 static MESON_GATE(gxbb_spi, HHI_GCLK_MPEG0, 30);
2664 static MESON_GATE(gxbb_i2s_spdif, HHI_GCLK_MPEG1, 2);
2665 static MESON_GATE(gxbb_eth, HHI_GCLK_MPEG1, 3);
2666 static MESON_GATE(gxbb_demux, HHI_GCLK_MPEG1, 4);
2667 static MESON_GATE(gxbb_blkmv, HHI_GCLK_MPEG1, 14);
2668 static MESON_GATE(gxbb_aiu, HHI_GCLK_MPEG1, 15);
2669 static MESON_GATE(gxbb_uart1, HHI_GCLK_MPEG1, 16);
2670 static MESON_GATE(gxbb_g2d, HHI_GCLK_MPEG1, 20);
2671 static MESON_GATE(gxbb_usb0, HHI_GCLK_MPEG1, 21);
2672 static MESON_GATE(gxbb_usb1, HHI_GCLK_MPEG1, 22);
2673 static MESON_GATE(gxbb_reset, HHI_GCLK_MPEG1, 23);
2674 static MESON_GATE(gxbb_nand, HHI_GCLK_MPEG1, 24);
2675 static MESON_GATE(gxbb_dos_parser, HHI_GCLK_MPEG1, 25);
2676 static MESON_GATE(gxbb_usb, HHI_GCLK_MPEG1, 26);
2677 static MESON_GATE(gxbb_vdin1, HHI_GCLK_MPEG1, 28);
2678 static MESON_GATE(gxbb_ahb_arb0, HHI_GCLK_MPEG1, 29);
2679 static MESON_GATE(gxbb_efuse, HHI_GCLK_MPEG1, 30);
2680 static MESON_GATE(gxbb_boot_rom, HHI_GCLK_MPEG1, 31);
2682 static MESON_GATE(gxbb_ahb_data_bus, HHI_GCLK_MPEG2, 1);
2683 static MESON_GATE(gxbb_ahb_ctrl_bus, HHI_GCLK_MPEG2, 2);
2684 static MESON_GATE(gxbb_hdmi_intr_sync, HHI_GCLK_MPEG2, 3);
2685 static MESON_GATE(gxbb_hdmi_pclk, HHI_GCLK_MPEG2, 4);
2686 static MESON_GATE(gxbb_usb1_ddr_bridge, HHI_GCLK_MPEG2, 8);
2687 static MESON_GATE(gxbb_usb0_ddr_bridge, HHI_GCLK_MPEG2, 9);
2688 static MESON_GATE(gxbb_mmc_pclk, HHI_GCLK_MPEG2, 11);
2689 static MESON_GATE(gxbb_dvin, HHI_GCLK_MPEG2, 12);
2690 static MESON_GATE(gxbb_uart2, HHI_GCLK_MPEG2, 15);
2691 static MESON_GATE(gxbb_sar_adc, HHI_GCLK_MPEG2, 22);
2692 static MESON_GATE(gxbb_vpu_intr, HHI_GCLK_MPEG2, 25);
2693 static MESON_GATE(gxbb_sec_ahb_ahb3_bridge, HHI_GCLK_MPEG2, 26);
2694 static MESON_GATE(gxbb_clk81_a53, HHI_GCLK_MPEG2, 29);
2696 static MESON_GATE(gxbb_vclk2_venci0, HHI_GCLK_OTHER, 1);
2697 static MESON_GATE(gxbb_vclk2_venci1, HHI_GCLK_OTHER, 2);
2698 static MESON_GATE(gxbb_vclk2_vencp0, HHI_GCLK_OTHER, 3);
2699 static MESON_GATE(gxbb_vclk2_vencp1, HHI_GCLK_OTHER, 4);
2700 static MESON_GATE(gxbb_gclk_venci_int0, HHI_GCLK_OTHER, 8);
2701 static MESON_GATE(gxbb_gclk_vencp_int, HHI_GCLK_OTHER, 9);
2702 static MESON_GATE(gxbb_dac_clk, HHI_GCLK_OTHER, 10);
2703 static MESON_GATE(gxbb_aoclk_gate, HHI_GCLK_OTHER, 14);
2704 static MESON_GATE(gxbb_iec958_gate, HHI_GCLK_OTHER, 16);
2705 static MESON_GATE(gxbb_enc480p, HHI_GCLK_OTHER, 20);
2706 static MESON_GATE(gxbb_rng1, HHI_GCLK_OTHER, 21);
2707 static MESON_GATE(gxbb_gclk_venci_int1, HHI_GCLK_OTHER, 22);
2708 static MESON_GATE(gxbb_vclk2_venclmcc, HHI_GCLK_OTHER, 24);
2709 static MESON_GATE(gxbb_vclk2_vencl, HHI_GCLK_OTHER, 25);
2710 static MESON_GATE(gxbb_vclk_other, HHI_GCLK_OTHER, 26);
2711 static MESON_GATE(gxbb_edp, HHI_GCLK_OTHER, 31);
2713 /* Always On (AO) domain gates */
2715 static MESON_GATE(gxbb_ao_media_cpu, HHI_GCLK_AO, 0);
2716 static MESON_GATE(gxbb_ao_ahb_sram, HHI_GCLK_AO, 1);
2717 static MESON_GATE(gxbb_ao_ahb_bus, HHI_GCLK_AO, 2);
2718 static MESON_GATE(gxbb_ao_iface, HHI_GCLK_AO, 3);
2719 static MESON_GATE(gxbb_ao_i2c, HHI_GCLK_AO, 4);
2722 static MESON_PCLK(gxbb_aiu_glue, HHI_GCLK_MPEG1, 6, &gxbb_aiu.hw);
2723 static MESON_PCLK(gxbb_iec958, HHI_GCLK_MPEG1, 7, &gxbb_aiu_glue.hw);
2724 static MESON_PCLK(gxbb_i2s_out, HHI_GCLK_MPEG1, 8, &gxbb_aiu_glue.hw);
2725 static MESON_PCLK(gxbb_amclk, HHI_GCLK_MPEG1, 9, &gxbb_aiu_glue.hw);
2726 static MESON_PCLK(gxbb_aififo2, HHI_GCLK_MPEG1, 10, &gxbb_aiu_glue.hw);
2727 static MESON_PCLK(gxbb_mixer, HHI_GCLK_MPEG1, 11, &gxbb_aiu_glue.hw);
2728 static MESON_PCLK(gxbb_mixer_iface, HHI_GCLK_MPEG1, 12, &gxbb_aiu_glue.hw);
2729 static MESON_PCLK(gxbb_adc, HHI_GCLK_MPEG1, 13, &gxbb_aiu_glue.hw);
2731 /* Array of all clocks provided by this provider */
2733 static struct clk_hw *gxbb_hw_clks[] = {
2734 [CLKID_SYS_PLL] = &gxbb_sys_pll.hw,
2735 [CLKID_HDMI_PLL] = &gxbb_hdmi_pll.hw,
2736 [CLKID_FIXED_PLL] = &gxbb_fixed_pll.hw,
2737 [CLKID_FCLK_DIV2] = &gxbb_fclk_div2.hw,
2738 [CLKID_FCLK_DIV3] = &gxbb_fclk_div3.hw,
2739 [CLKID_FCLK_DIV4] = &gxbb_fclk_div4.hw,
2740 [CLKID_FCLK_DIV5] = &gxbb_fclk_div5.hw,
2741 [CLKID_FCLK_DIV7] = &gxbb_fclk_div7.hw,
2742 [CLKID_GP0_PLL] = &gxbb_gp0_pll.hw,
2743 [CLKID_MPEG_SEL] = &gxbb_mpeg_clk_sel.hw,
2744 [CLKID_MPEG_DIV] = &gxbb_mpeg_clk_div.hw,
2745 [CLKID_CLK81] = &gxbb_clk81.hw,
2746 [CLKID_MPLL0] = &gxbb_mpll0.hw,
2747 [CLKID_MPLL1] = &gxbb_mpll1.hw,
2748 [CLKID_MPLL2] = &gxbb_mpll2.hw,
2749 [CLKID_DDR] = &gxbb_ddr.hw,
2750 [CLKID_DOS] = &gxbb_dos.hw,
2751 [CLKID_ISA] = &gxbb_isa.hw,
2752 [CLKID_PL301] = &gxbb_pl301.hw,
2753 [CLKID_PERIPHS] = &gxbb_periphs.hw,
2754 [CLKID_SPICC] = &gxbb_spicc.hw,
2755 [CLKID_I2C] = &gxbb_i2c.hw,
2756 [CLKID_SAR_ADC] = &gxbb_sar_adc.hw,
2757 [CLKID_SMART_CARD] = &gxbb_smart_card.hw,
2758 [CLKID_RNG0] = &gxbb_rng0.hw,
2759 [CLKID_UART0] = &gxbb_uart0.hw,
2760 [CLKID_SDHC] = &gxbb_sdhc.hw,
2761 [CLKID_STREAM] = &gxbb_stream.hw,
2762 [CLKID_ASYNC_FIFO] = &gxbb_async_fifo.hw,
2763 [CLKID_SDIO] = &gxbb_sdio.hw,
2764 [CLKID_ABUF] = &gxbb_abuf.hw,
2765 [CLKID_HIU_IFACE] = &gxbb_hiu_iface.hw,
2766 [CLKID_ASSIST_MISC] = &gxbb_assist_misc.hw,
2767 [CLKID_SPI] = &gxbb_spi.hw,
2768 [CLKID_I2S_SPDIF] = &gxbb_i2s_spdif.hw,
2769 [CLKID_ETH] = &gxbb_eth.hw,
2770 [CLKID_DEMUX] = &gxbb_demux.hw,
2771 [CLKID_AIU_GLUE] = &gxbb_aiu_glue.hw,
2772 [CLKID_IEC958] = &gxbb_iec958.hw,
2773 [CLKID_I2S_OUT] = &gxbb_i2s_out.hw,
2774 [CLKID_AMCLK] = &gxbb_amclk.hw,
2775 [CLKID_AIFIFO2] = &gxbb_aififo2.hw,
2776 [CLKID_MIXER] = &gxbb_mixer.hw,
2777 [CLKID_MIXER_IFACE] = &gxbb_mixer_iface.hw,
2778 [CLKID_ADC] = &gxbb_adc.hw,
2779 [CLKID_BLKMV] = &gxbb_blkmv.hw,
2780 [CLKID_AIU] = &gxbb_aiu.hw,
2781 [CLKID_UART1] = &gxbb_uart1.hw,
2782 [CLKID_G2D] = &gxbb_g2d.hw,
2783 [CLKID_USB0] = &gxbb_usb0.hw,
2784 [CLKID_USB1] = &gxbb_usb1.hw,
2785 [CLKID_RESET] = &gxbb_reset.hw,
2786 [CLKID_NAND] = &gxbb_nand.hw,
2787 [CLKID_DOS_PARSER] = &gxbb_dos_parser.hw,
2788 [CLKID_USB] = &gxbb_usb.hw,
2789 [CLKID_VDIN1] = &gxbb_vdin1.hw,
2790 [CLKID_AHB_ARB0] = &gxbb_ahb_arb0.hw,
2791 [CLKID_EFUSE] = &gxbb_efuse.hw,
2792 [CLKID_BOOT_ROM] = &gxbb_boot_rom.hw,
2793 [CLKID_AHB_DATA_BUS] = &gxbb_ahb_data_bus.hw,
2794 [CLKID_AHB_CTRL_BUS] = &gxbb_ahb_ctrl_bus.hw,
2795 [CLKID_HDMI_INTR_SYNC] = &gxbb_hdmi_intr_sync.hw,
2796 [CLKID_HDMI_PCLK] = &gxbb_hdmi_pclk.hw,
2797 [CLKID_USB1_DDR_BRIDGE] = &gxbb_usb1_ddr_bridge.hw,
2798 [CLKID_USB0_DDR_BRIDGE] = &gxbb_usb0_ddr_bridge.hw,
2799 [CLKID_MMC_PCLK] = &gxbb_mmc_pclk.hw,
2800 [CLKID_DVIN] = &gxbb_dvin.hw,
2801 [CLKID_UART2] = &gxbb_uart2.hw,
2802 [CLKID_SANA] = &gxbb_sana.hw,
2803 [CLKID_VPU_INTR] = &gxbb_vpu_intr.hw,
2804 [CLKID_SEC_AHB_AHB3_BRIDGE] = &gxbb_sec_ahb_ahb3_bridge.hw,
2805 [CLKID_CLK81_A53] = &gxbb_clk81_a53.hw,
2806 [CLKID_VCLK2_VENCI0] = &gxbb_vclk2_venci0.hw,
2807 [CLKID_VCLK2_VENCI1] = &gxbb_vclk2_venci1.hw,
2808 [CLKID_VCLK2_VENCP0] = &gxbb_vclk2_vencp0.hw,
2809 [CLKID_VCLK2_VENCP1] = &gxbb_vclk2_vencp1.hw,
2810 [CLKID_GCLK_VENCI_INT0] = &gxbb_gclk_venci_int0.hw,
2811 [CLKID_GCLK_VENCI_INT] = &gxbb_gclk_vencp_int.hw,
2812 [CLKID_DAC_CLK] = &gxbb_dac_clk.hw,
2813 [CLKID_AOCLK_GATE] = &gxbb_aoclk_gate.hw,
2814 [CLKID_IEC958_GATE] = &gxbb_iec958_gate.hw,
2815 [CLKID_ENC480P] = &gxbb_enc480p.hw,
2816 [CLKID_RNG1] = &gxbb_rng1.hw,
2817 [CLKID_GCLK_VENCI_INT1] = &gxbb_gclk_venci_int1.hw,
2818 [CLKID_VCLK2_VENCLMCC] = &gxbb_vclk2_venclmcc.hw,
2819 [CLKID_VCLK2_VENCL] = &gxbb_vclk2_vencl.hw,
2820 [CLKID_VCLK_OTHER] = &gxbb_vclk_other.hw,
2821 [CLKID_EDP] = &gxbb_edp.hw,
2822 [CLKID_AO_MEDIA_CPU] = &gxbb_ao_media_cpu.hw,
2823 [CLKID_AO_AHB_SRAM] = &gxbb_ao_ahb_sram.hw,
2824 [CLKID_AO_AHB_BUS] = &gxbb_ao_ahb_bus.hw,
2825 [CLKID_AO_IFACE] = &gxbb_ao_iface.hw,
2826 [CLKID_AO_I2C] = &gxbb_ao_i2c.hw,
2827 [CLKID_SD_EMMC_A] = &gxbb_emmc_a.hw,
2828 [CLKID_SD_EMMC_B] = &gxbb_emmc_b.hw,
2829 [CLKID_SD_EMMC_C] = &gxbb_emmc_c.hw,
2830 [CLKID_SAR_ADC_CLK] = &gxbb_sar_adc_clk.hw,
2831 [CLKID_SAR_ADC_SEL] = &gxbb_sar_adc_clk_sel.hw,
2832 [CLKID_SAR_ADC_DIV] = &gxbb_sar_adc_clk_div.hw,
2833 [CLKID_MALI_0_SEL] = &gxbb_mali_0_sel.hw,
2834 [CLKID_MALI_0_DIV] = &gxbb_mali_0_div.hw,
2835 [CLKID_MALI_0] = &gxbb_mali_0.hw,
2836 [CLKID_MALI_1_SEL] = &gxbb_mali_1_sel.hw,
2837 [CLKID_MALI_1_DIV] = &gxbb_mali_1_div.hw,
2838 [CLKID_MALI_1] = &gxbb_mali_1.hw,
2839 [CLKID_MALI] = &gxbb_mali.hw,
2840 [CLKID_CTS_AMCLK] = &gxbb_cts_amclk.hw,
2841 [CLKID_CTS_AMCLK_SEL] = &gxbb_cts_amclk_sel.hw,
2842 [CLKID_CTS_AMCLK_DIV] = &gxbb_cts_amclk_div.hw,
2843 [CLKID_CTS_MCLK_I958] = &gxbb_cts_mclk_i958.hw,
2844 [CLKID_CTS_MCLK_I958_SEL] = &gxbb_cts_mclk_i958_sel.hw,
2845 [CLKID_CTS_MCLK_I958_DIV] = &gxbb_cts_mclk_i958_div.hw,
2846 [CLKID_CTS_I958] = &gxbb_cts_i958.hw,
2847 [CLKID_32K_CLK] = &gxbb_32k_clk.hw,
2848 [CLKID_32K_CLK_SEL] = &gxbb_32k_clk_sel.hw,
2849 [CLKID_32K_CLK_DIV] = &gxbb_32k_clk_div.hw,
2850 [CLKID_SD_EMMC_A_CLK0_SEL] = &gxbb_sd_emmc_a_clk0_sel.hw,
2851 [CLKID_SD_EMMC_A_CLK0_DIV] = &gxbb_sd_emmc_a_clk0_div.hw,
2852 [CLKID_SD_EMMC_A_CLK0] = &gxbb_sd_emmc_a_clk0.hw,
2853 [CLKID_SD_EMMC_B_CLK0_SEL] = &gxbb_sd_emmc_b_clk0_sel.hw,
2854 [CLKID_SD_EMMC_B_CLK0_DIV] = &gxbb_sd_emmc_b_clk0_div.hw,
2855 [CLKID_SD_EMMC_B_CLK0] = &gxbb_sd_emmc_b_clk0.hw,
2856 [CLKID_SD_EMMC_C_CLK0_SEL] = &gxbb_sd_emmc_c_clk0_sel.hw,
2857 [CLKID_SD_EMMC_C_CLK0_DIV] = &gxbb_sd_emmc_c_clk0_div.hw,
2858 [CLKID_SD_EMMC_C_CLK0] = &gxbb_sd_emmc_c_clk0.hw,
2859 [CLKID_VPU_0_SEL] = &gxbb_vpu_0_sel.hw,
2860 [CLKID_VPU_0_DIV] = &gxbb_vpu_0_div.hw,
2861 [CLKID_VPU_0] = &gxbb_vpu_0.hw,
2862 [CLKID_VPU_1_SEL] = &gxbb_vpu_1_sel.hw,
2863 [CLKID_VPU_1_DIV] = &gxbb_vpu_1_div.hw,
2864 [CLKID_VPU_1] = &gxbb_vpu_1.hw,
2865 [CLKID_VPU] = &gxbb_vpu.hw,
2866 [CLKID_VAPB_0_SEL] = &gxbb_vapb_0_sel.hw,
2867 [CLKID_VAPB_0_DIV] = &gxbb_vapb_0_div.hw,
2868 [CLKID_VAPB_0] = &gxbb_vapb_0.hw,
2869 [CLKID_VAPB_1_SEL] = &gxbb_vapb_1_sel.hw,
2870 [CLKID_VAPB_1_DIV] = &gxbb_vapb_1_div.hw,
2871 [CLKID_VAPB_1] = &gxbb_vapb_1.hw,
2872 [CLKID_VAPB_SEL] = &gxbb_vapb_sel.hw,
2873 [CLKID_VAPB] = &gxbb_vapb.hw,
2874 [CLKID_HDMI_PLL_PRE_MULT] = &gxbb_hdmi_pll_pre_mult.hw,
2875 [CLKID_MPLL0_DIV] = &gxbb_mpll0_div.hw,
2876 [CLKID_MPLL1_DIV] = &gxbb_mpll1_div.hw,
2877 [CLKID_MPLL2_DIV] = &gxbb_mpll2_div.hw,
2878 [CLKID_MPLL_PREDIV] = &gxbb_mpll_prediv.hw,
2879 [CLKID_FCLK_DIV2_DIV] = &gxbb_fclk_div2_div.hw,
2880 [CLKID_FCLK_DIV3_DIV] = &gxbb_fclk_div3_div.hw,
2881 [CLKID_FCLK_DIV4_DIV] = &gxbb_fclk_div4_div.hw,
2882 [CLKID_FCLK_DIV5_DIV] = &gxbb_fclk_div5_div.hw,
2883 [CLKID_FCLK_DIV7_DIV] = &gxbb_fclk_div7_div.hw,
2884 [CLKID_VDEC_1_SEL] = &gxbb_vdec_1_sel.hw,
2885 [CLKID_VDEC_1_DIV] = &gxbb_vdec_1_div.hw,
2886 [CLKID_VDEC_1] = &gxbb_vdec_1.hw,
2887 [CLKID_VDEC_HEVC_SEL] = &gxbb_vdec_hevc_sel.hw,
2888 [CLKID_VDEC_HEVC_DIV] = &gxbb_vdec_hevc_div.hw,
2889 [CLKID_VDEC_HEVC] = &gxbb_vdec_hevc.hw,
2890 [CLKID_GEN_CLK_SEL] = &gxbb_gen_clk_sel.hw,
2891 [CLKID_GEN_CLK_DIV] = &gxbb_gen_clk_div.hw,
2892 [CLKID_GEN_CLK] = &gxbb_gen_clk.hw,
2893 [CLKID_FIXED_PLL_DCO] = &gxbb_fixed_pll_dco.hw,
2894 [CLKID_HDMI_PLL_DCO] = &gxbb_hdmi_pll_dco.hw,
2895 [CLKID_HDMI_PLL_OD] = &gxbb_hdmi_pll_od.hw,
2896 [CLKID_HDMI_PLL_OD2] = &gxbb_hdmi_pll_od2.hw,
2897 [CLKID_SYS_PLL_DCO] = &gxbb_sys_pll_dco.hw,
2898 [CLKID_GP0_PLL_DCO] = &gxbb_gp0_pll_dco.hw,
2899 [CLKID_VID_PLL_DIV] = &gxbb_vid_pll_div.hw,
2900 [CLKID_VID_PLL_SEL] = &gxbb_vid_pll_sel.hw,
2901 [CLKID_VID_PLL] = &gxbb_vid_pll.hw,
2902 [CLKID_VCLK_SEL] = &gxbb_vclk_sel.hw,
2903 [CLKID_VCLK2_SEL] = &gxbb_vclk2_sel.hw,
2904 [CLKID_VCLK_INPUT] = &gxbb_vclk_input.hw,
2905 [CLKID_VCLK2_INPUT] = &gxbb_vclk2_input.hw,
2906 [CLKID_VCLK_DIV] = &gxbb_vclk_div.hw,
2907 [CLKID_VCLK2_DIV] = &gxbb_vclk2_div.hw,
2908 [CLKID_VCLK] = &gxbb_vclk.hw,
2909 [CLKID_VCLK2] = &gxbb_vclk2.hw,
2910 [CLKID_VCLK_DIV1] = &gxbb_vclk_div1.hw,
2911 [CLKID_VCLK_DIV2_EN] = &gxbb_vclk_div2_en.hw,
2912 [CLKID_VCLK_DIV2] = &gxbb_vclk_div2.hw,
2913 [CLKID_VCLK_DIV4_EN] = &gxbb_vclk_div4_en.hw,
2914 [CLKID_VCLK_DIV4] = &gxbb_vclk_div4.hw,
2915 [CLKID_VCLK_DIV6_EN] = &gxbb_vclk_div6_en.hw,
2916 [CLKID_VCLK_DIV6] = &gxbb_vclk_div6.hw,
2917 [CLKID_VCLK_DIV12_EN] = &gxbb_vclk_div12_en.hw,
2918 [CLKID_VCLK_DIV12] = &gxbb_vclk_div12.hw,
2919 [CLKID_VCLK2_DIV1] = &gxbb_vclk2_div1.hw,
2920 [CLKID_VCLK2_DIV2_EN] = &gxbb_vclk2_div2_en.hw,
2921 [CLKID_VCLK2_DIV2] = &gxbb_vclk2_div2.hw,
2922 [CLKID_VCLK2_DIV4_EN] = &gxbb_vclk2_div4_en.hw,
2923 [CLKID_VCLK2_DIV4] = &gxbb_vclk2_div4.hw,
2924 [CLKID_VCLK2_DIV6_EN] = &gxbb_vclk2_div6_en.hw,
2925 [CLKID_VCLK2_DIV6] = &gxbb_vclk2_div6.hw,
2926 [CLKID_VCLK2_DIV12_EN] = &gxbb_vclk2_div12_en.hw,
2927 [CLKID_VCLK2_DIV12] = &gxbb_vclk2_div12.hw,
2928 [CLKID_CTS_ENCI_SEL] = &gxbb_cts_enci_sel.hw,
2929 [CLKID_CTS_ENCP_SEL] = &gxbb_cts_encp_sel.hw,
2930 [CLKID_CTS_VDAC_SEL] = &gxbb_cts_vdac_sel.hw,
2931 [CLKID_HDMI_TX_SEL] = &gxbb_hdmi_tx_sel.hw,
2932 [CLKID_CTS_ENCI] = &gxbb_cts_enci.hw,
2933 [CLKID_CTS_ENCP] = &gxbb_cts_encp.hw,
2934 [CLKID_CTS_VDAC] = &gxbb_cts_vdac.hw,
2935 [CLKID_HDMI_TX] = &gxbb_hdmi_tx.hw,
2936 [CLKID_HDMI_SEL] = &gxbb_hdmi_sel.hw,
2937 [CLKID_HDMI_DIV] = &gxbb_hdmi_div.hw,
2938 [CLKID_HDMI] = &gxbb_hdmi.hw,
2941 static struct clk_hw *gxl_hw_clks[] = {
2942 [CLKID_SYS_PLL] = &gxbb_sys_pll.hw,
2943 [CLKID_HDMI_PLL] = &gxl_hdmi_pll.hw,
2944 [CLKID_FIXED_PLL] = &gxbb_fixed_pll.hw,
2945 [CLKID_FCLK_DIV2] = &gxbb_fclk_div2.hw,
2946 [CLKID_FCLK_DIV3] = &gxbb_fclk_div3.hw,
2947 [CLKID_FCLK_DIV4] = &gxbb_fclk_div4.hw,
2948 [CLKID_FCLK_DIV5] = &gxbb_fclk_div5.hw,
2949 [CLKID_FCLK_DIV7] = &gxbb_fclk_div7.hw,
2950 [CLKID_GP0_PLL] = &gxbb_gp0_pll.hw,
2951 [CLKID_MPEG_SEL] = &gxbb_mpeg_clk_sel.hw,
2952 [CLKID_MPEG_DIV] = &gxbb_mpeg_clk_div.hw,
2953 [CLKID_CLK81] = &gxbb_clk81.hw,
2954 [CLKID_MPLL0] = &gxbb_mpll0.hw,
2955 [CLKID_MPLL1] = &gxbb_mpll1.hw,
2956 [CLKID_MPLL2] = &gxbb_mpll2.hw,
2957 [CLKID_DDR] = &gxbb_ddr.hw,
2958 [CLKID_DOS] = &gxbb_dos.hw,
2959 [CLKID_ISA] = &gxbb_isa.hw,
2960 [CLKID_PL301] = &gxbb_pl301.hw,
2961 [CLKID_PERIPHS] = &gxbb_periphs.hw,
2962 [CLKID_SPICC] = &gxbb_spicc.hw,
2963 [CLKID_I2C] = &gxbb_i2c.hw,
2964 [CLKID_SAR_ADC] = &gxbb_sar_adc.hw,
2965 [CLKID_SMART_CARD] = &gxbb_smart_card.hw,
2966 [CLKID_RNG0] = &gxbb_rng0.hw,
2967 [CLKID_UART0] = &gxbb_uart0.hw,
2968 [CLKID_SDHC] = &gxbb_sdhc.hw,
2969 [CLKID_STREAM] = &gxbb_stream.hw,
2970 [CLKID_ASYNC_FIFO] = &gxbb_async_fifo.hw,
2971 [CLKID_SDIO] = &gxbb_sdio.hw,
2972 [CLKID_ABUF] = &gxbb_abuf.hw,
2973 [CLKID_HIU_IFACE] = &gxbb_hiu_iface.hw,
2974 [CLKID_ASSIST_MISC] = &gxbb_assist_misc.hw,
2975 [CLKID_SPI] = &gxbb_spi.hw,
2976 [CLKID_I2S_SPDIF] = &gxbb_i2s_spdif.hw,
2977 [CLKID_ETH] = &gxbb_eth.hw,
2978 [CLKID_DEMUX] = &gxbb_demux.hw,
2979 [CLKID_AIU_GLUE] = &gxbb_aiu_glue.hw,
2980 [CLKID_IEC958] = &gxbb_iec958.hw,
2981 [CLKID_I2S_OUT] = &gxbb_i2s_out.hw,
2982 [CLKID_AMCLK] = &gxbb_amclk.hw,
2983 [CLKID_AIFIFO2] = &gxbb_aififo2.hw,
2984 [CLKID_MIXER] = &gxbb_mixer.hw,
2985 [CLKID_MIXER_IFACE] = &gxbb_mixer_iface.hw,
2986 [CLKID_ADC] = &gxbb_adc.hw,
2987 [CLKID_BLKMV] = &gxbb_blkmv.hw,
2988 [CLKID_AIU] = &gxbb_aiu.hw,
2989 [CLKID_UART1] = &gxbb_uart1.hw,
2990 [CLKID_G2D] = &gxbb_g2d.hw,
2991 [CLKID_USB0] = &gxbb_usb0.hw,
2992 [CLKID_USB1] = &gxbb_usb1.hw,
2993 [CLKID_RESET] = &gxbb_reset.hw,
2994 [CLKID_NAND] = &gxbb_nand.hw,
2995 [CLKID_DOS_PARSER] = &gxbb_dos_parser.hw,
2996 [CLKID_USB] = &gxbb_usb.hw,
2997 [CLKID_VDIN1] = &gxbb_vdin1.hw,
2998 [CLKID_AHB_ARB0] = &gxbb_ahb_arb0.hw,
2999 [CLKID_EFUSE] = &gxbb_efuse.hw,
3000 [CLKID_BOOT_ROM] = &gxbb_boot_rom.hw,
3001 [CLKID_AHB_DATA_BUS] = &gxbb_ahb_data_bus.hw,
3002 [CLKID_AHB_CTRL_BUS] = &gxbb_ahb_ctrl_bus.hw,
3003 [CLKID_HDMI_INTR_SYNC] = &gxbb_hdmi_intr_sync.hw,
3004 [CLKID_HDMI_PCLK] = &gxbb_hdmi_pclk.hw,
3005 [CLKID_USB1_DDR_BRIDGE] = &gxbb_usb1_ddr_bridge.hw,
3006 [CLKID_USB0_DDR_BRIDGE] = &gxbb_usb0_ddr_bridge.hw,
3007 [CLKID_MMC_PCLK] = &gxbb_mmc_pclk.hw,
3008 [CLKID_DVIN] = &gxbb_dvin.hw,
3009 [CLKID_UART2] = &gxbb_uart2.hw,
3010 [CLKID_SANA] = &gxbb_sana.hw,
3011 [CLKID_VPU_INTR] = &gxbb_vpu_intr.hw,
3012 [CLKID_SEC_AHB_AHB3_BRIDGE] = &gxbb_sec_ahb_ahb3_bridge.hw,
3013 [CLKID_CLK81_A53] = &gxbb_clk81_a53.hw,
3014 [CLKID_VCLK2_VENCI0] = &gxbb_vclk2_venci0.hw,
3015 [CLKID_VCLK2_VENCI1] = &gxbb_vclk2_venci1.hw,
3016 [CLKID_VCLK2_VENCP0] = &gxbb_vclk2_vencp0.hw,
3017 [CLKID_VCLK2_VENCP1] = &gxbb_vclk2_vencp1.hw,
3018 [CLKID_GCLK_VENCI_INT0] = &gxbb_gclk_venci_int0.hw,
3019 [CLKID_GCLK_VENCI_INT] = &gxbb_gclk_vencp_int.hw,
3020 [CLKID_DAC_CLK] = &gxbb_dac_clk.hw,
3021 [CLKID_AOCLK_GATE] = &gxbb_aoclk_gate.hw,
3022 [CLKID_IEC958_GATE] = &gxbb_iec958_gate.hw,
3023 [CLKID_ENC480P] = &gxbb_enc480p.hw,
3024 [CLKID_RNG1] = &gxbb_rng1.hw,
3025 [CLKID_GCLK_VENCI_INT1] = &gxbb_gclk_venci_int1.hw,
3026 [CLKID_VCLK2_VENCLMCC] = &gxbb_vclk2_venclmcc.hw,
3027 [CLKID_VCLK2_VENCL] = &gxbb_vclk2_vencl.hw,
3028 [CLKID_VCLK_OTHER] = &gxbb_vclk_other.hw,
3029 [CLKID_EDP] = &gxbb_edp.hw,
3030 [CLKID_AO_MEDIA_CPU] = &gxbb_ao_media_cpu.hw,
3031 [CLKID_AO_AHB_SRAM] = &gxbb_ao_ahb_sram.hw,
3032 [CLKID_AO_AHB_BUS] = &gxbb_ao_ahb_bus.hw,
3033 [CLKID_AO_IFACE] = &gxbb_ao_iface.hw,
3034 [CLKID_AO_I2C] = &gxbb_ao_i2c.hw,
3035 [CLKID_SD_EMMC_A] = &gxbb_emmc_a.hw,
3036 [CLKID_SD_EMMC_B] = &gxbb_emmc_b.hw,
3037 [CLKID_SD_EMMC_C] = &gxbb_emmc_c.hw,
3038 [CLKID_SAR_ADC_CLK] = &gxbb_sar_adc_clk.hw,
3039 [CLKID_SAR_ADC_SEL] = &gxbb_sar_adc_clk_sel.hw,
3040 [CLKID_SAR_ADC_DIV] = &gxbb_sar_adc_clk_div.hw,
3041 [CLKID_MALI_0_SEL] = &gxbb_mali_0_sel.hw,
3042 [CLKID_MALI_0_DIV] = &gxbb_mali_0_div.hw,
3043 [CLKID_MALI_0] = &gxbb_mali_0.hw,
3044 [CLKID_MALI_1_SEL] = &gxbb_mali_1_sel.hw,
3045 [CLKID_MALI_1_DIV] = &gxbb_mali_1_div.hw,
3046 [CLKID_MALI_1] = &gxbb_mali_1.hw,
3047 [CLKID_MALI] = &gxbb_mali.hw,
3048 [CLKID_CTS_AMCLK] = &gxbb_cts_amclk.hw,
3049 [CLKID_CTS_AMCLK_SEL] = &gxbb_cts_amclk_sel.hw,
3050 [CLKID_CTS_AMCLK_DIV] = &gxbb_cts_amclk_div.hw,
3051 [CLKID_CTS_MCLK_I958] = &gxbb_cts_mclk_i958.hw,
3052 [CLKID_CTS_MCLK_I958_SEL] = &gxbb_cts_mclk_i958_sel.hw,
3053 [CLKID_CTS_MCLK_I958_DIV] = &gxbb_cts_mclk_i958_div.hw,
3054 [CLKID_CTS_I958] = &gxbb_cts_i958.hw,
3055 [CLKID_32K_CLK] = &gxbb_32k_clk.hw,
3056 [CLKID_32K_CLK_SEL] = &gxbb_32k_clk_sel.hw,
3057 [CLKID_32K_CLK_DIV] = &gxbb_32k_clk_div.hw,
3058 [CLKID_SD_EMMC_A_CLK0_SEL] = &gxbb_sd_emmc_a_clk0_sel.hw,
3059 [CLKID_SD_EMMC_A_CLK0_DIV] = &gxbb_sd_emmc_a_clk0_div.hw,
3060 [CLKID_SD_EMMC_A_CLK0] = &gxbb_sd_emmc_a_clk0.hw,
3061 [CLKID_SD_EMMC_B_CLK0_SEL] = &gxbb_sd_emmc_b_clk0_sel.hw,
3062 [CLKID_SD_EMMC_B_CLK0_DIV] = &gxbb_sd_emmc_b_clk0_div.hw,
3063 [CLKID_SD_EMMC_B_CLK0] = &gxbb_sd_emmc_b_clk0.hw,
3064 [CLKID_SD_EMMC_C_CLK0_SEL] = &gxbb_sd_emmc_c_clk0_sel.hw,
3065 [CLKID_SD_EMMC_C_CLK0_DIV] = &gxbb_sd_emmc_c_clk0_div.hw,
3066 [CLKID_SD_EMMC_C_CLK0] = &gxbb_sd_emmc_c_clk0.hw,
3067 [CLKID_VPU_0_SEL] = &gxbb_vpu_0_sel.hw,
3068 [CLKID_VPU_0_DIV] = &gxbb_vpu_0_div.hw,
3069 [CLKID_VPU_0] = &gxbb_vpu_0.hw,
3070 [CLKID_VPU_1_SEL] = &gxbb_vpu_1_sel.hw,
3071 [CLKID_VPU_1_DIV] = &gxbb_vpu_1_div.hw,
3072 [CLKID_VPU_1] = &gxbb_vpu_1.hw,
3073 [CLKID_VPU] = &gxbb_vpu.hw,
3074 [CLKID_VAPB_0_SEL] = &gxbb_vapb_0_sel.hw,
3075 [CLKID_VAPB_0_DIV] = &gxbb_vapb_0_div.hw,
3076 [CLKID_VAPB_0] = &gxbb_vapb_0.hw,
3077 [CLKID_VAPB_1_SEL] = &gxbb_vapb_1_sel.hw,
3078 [CLKID_VAPB_1_DIV] = &gxbb_vapb_1_div.hw,
3079 [CLKID_VAPB_1] = &gxbb_vapb_1.hw,
3080 [CLKID_VAPB_SEL] = &gxbb_vapb_sel.hw,
3081 [CLKID_VAPB] = &gxbb_vapb.hw,
3082 [CLKID_MPLL0_DIV] = &gxl_mpll0_div.hw,
3083 [CLKID_MPLL1_DIV] = &gxbb_mpll1_div.hw,
3084 [CLKID_MPLL2_DIV] = &gxbb_mpll2_div.hw,
3085 [CLKID_MPLL_PREDIV] = &gxbb_mpll_prediv.hw,
3086 [CLKID_FCLK_DIV2_DIV] = &gxbb_fclk_div2_div.hw,
3087 [CLKID_FCLK_DIV3_DIV] = &gxbb_fclk_div3_div.hw,
3088 [CLKID_FCLK_DIV4_DIV] = &gxbb_fclk_div4_div.hw,
3089 [CLKID_FCLK_DIV5_DIV] = &gxbb_fclk_div5_div.hw,
3090 [CLKID_FCLK_DIV7_DIV] = &gxbb_fclk_div7_div.hw,
3091 [CLKID_VDEC_1_SEL] = &gxbb_vdec_1_sel.hw,
3092 [CLKID_VDEC_1_DIV] = &gxbb_vdec_1_div.hw,
3093 [CLKID_VDEC_1] = &gxbb_vdec_1.hw,
3094 [CLKID_VDEC_HEVC_SEL] = &gxbb_vdec_hevc_sel.hw,
3095 [CLKID_VDEC_HEVC_DIV] = &gxbb_vdec_hevc_div.hw,
3096 [CLKID_VDEC_HEVC] = &gxbb_vdec_hevc.hw,
3097 [CLKID_GEN_CLK_SEL] = &gxbb_gen_clk_sel.hw,
3098 [CLKID_GEN_CLK_DIV] = &gxbb_gen_clk_div.hw,
3099 [CLKID_GEN_CLK] = &gxbb_gen_clk.hw,
3100 [CLKID_FIXED_PLL_DCO] = &gxbb_fixed_pll_dco.hw,
3101 [CLKID_HDMI_PLL_DCO] = &gxl_hdmi_pll_dco.hw,
3102 [CLKID_HDMI_PLL_OD] = &gxl_hdmi_pll_od.hw,
3103 [CLKID_HDMI_PLL_OD2] = &gxl_hdmi_pll_od2.hw,
3104 [CLKID_SYS_PLL_DCO] = &gxbb_sys_pll_dco.hw,
3105 [CLKID_GP0_PLL_DCO] = &gxl_gp0_pll_dco.hw,
3106 [CLKID_VID_PLL_DIV] = &gxbb_vid_pll_div.hw,
3107 [CLKID_VID_PLL_SEL] = &gxbb_vid_pll_sel.hw,
3108 [CLKID_VID_PLL] = &gxbb_vid_pll.hw,
3109 [CLKID_VCLK_SEL] = &gxbb_vclk_sel.hw,
3110 [CLKID_VCLK2_SEL] = &gxbb_vclk2_sel.hw,
3111 [CLKID_VCLK_INPUT] = &gxbb_vclk_input.hw,
3112 [CLKID_VCLK2_INPUT] = &gxbb_vclk2_input.hw,
3113 [CLKID_VCLK_DIV] = &gxbb_vclk_div.hw,
3114 [CLKID_VCLK2_DIV] = &gxbb_vclk2_div.hw,
3115 [CLKID_VCLK] = &gxbb_vclk.hw,
3116 [CLKID_VCLK2] = &gxbb_vclk2.hw,
3117 [CLKID_VCLK_DIV1] = &gxbb_vclk_div1.hw,
3118 [CLKID_VCLK_DIV2_EN] = &gxbb_vclk_div2_en.hw,
3119 [CLKID_VCLK_DIV2] = &gxbb_vclk_div2.hw,
3120 [CLKID_VCLK_DIV4_EN] = &gxbb_vclk_div4_en.hw,
3121 [CLKID_VCLK_DIV4] = &gxbb_vclk_div4.hw,
3122 [CLKID_VCLK_DIV6_EN] = &gxbb_vclk_div6_en.hw,
3123 [CLKID_VCLK_DIV6] = &gxbb_vclk_div6.hw,
3124 [CLKID_VCLK_DIV12_EN] = &gxbb_vclk_div12_en.hw,
3125 [CLKID_VCLK_DIV12] = &gxbb_vclk_div12.hw,
3126 [CLKID_VCLK2_DIV1] = &gxbb_vclk2_div1.hw,
3127 [CLKID_VCLK2_DIV2_EN] = &gxbb_vclk2_div2_en.hw,
3128 [CLKID_VCLK2_DIV2] = &gxbb_vclk2_div2.hw,
3129 [CLKID_VCLK2_DIV4_EN] = &gxbb_vclk2_div4_en.hw,
3130 [CLKID_VCLK2_DIV4] = &gxbb_vclk2_div4.hw,
3131 [CLKID_VCLK2_DIV6_EN] = &gxbb_vclk2_div6_en.hw,
3132 [CLKID_VCLK2_DIV6] = &gxbb_vclk2_div6.hw,
3133 [CLKID_VCLK2_DIV12_EN] = &gxbb_vclk2_div12_en.hw,
3134 [CLKID_VCLK2_DIV12] = &gxbb_vclk2_div12.hw,
3135 [CLKID_CTS_ENCI_SEL] = &gxbb_cts_enci_sel.hw,
3136 [CLKID_CTS_ENCP_SEL] = &gxbb_cts_encp_sel.hw,
3137 [CLKID_CTS_VDAC_SEL] = &gxbb_cts_vdac_sel.hw,
3138 [CLKID_HDMI_TX_SEL] = &gxbb_hdmi_tx_sel.hw,
3139 [CLKID_CTS_ENCI] = &gxbb_cts_enci.hw,
3140 [CLKID_CTS_ENCP] = &gxbb_cts_encp.hw,
3141 [CLKID_CTS_VDAC] = &gxbb_cts_vdac.hw,
3142 [CLKID_HDMI_TX] = &gxbb_hdmi_tx.hw,
3143 [CLKID_HDMI_SEL] = &gxbb_hdmi_sel.hw,
3144 [CLKID_HDMI_DIV] = &gxbb_hdmi_div.hw,
3145 [CLKID_HDMI] = &gxbb_hdmi.hw,
3146 [CLKID_ACODEC] = &gxl_acodec.hw,
3149 static struct clk_regmap *const gxbb_clk_regmaps[] = {
3197 &gxbb_hdmi_intr_sync,
3199 &gxbb_usb1_ddr_bridge,
3200 &gxbb_usb0_ddr_bridge,
3206 &gxbb_sec_ahb_ahb3_bridge,
3212 &gxbb_gclk_venci_int0,
3213 &gxbb_gclk_vencp_int,
3219 &gxbb_gclk_venci_int1,
3220 &gxbb_vclk2_venclmcc,
3236 &gxbb_cts_mclk_i958,
3238 &gxbb_sd_emmc_a_clk0,
3239 &gxbb_sd_emmc_b_clk0,
3240 &gxbb_sd_emmc_c_clk0,
3247 &gxbb_sar_adc_clk_div,
3250 &gxbb_cts_mclk_i958_div,
3252 &gxbb_sd_emmc_a_clk0_div,
3253 &gxbb_sd_emmc_b_clk0_div,
3254 &gxbb_sd_emmc_c_clk0_div,
3260 &gxbb_sar_adc_clk_sel,
3264 &gxbb_cts_amclk_sel,
3265 &gxbb_cts_mclk_i958_sel,
3268 &gxbb_sd_emmc_a_clk0_sel,
3269 &gxbb_sd_emmc_b_clk0_sel,
3270 &gxbb_sd_emmc_c_clk0_sel,
3283 &gxbb_cts_amclk_div,
3295 &gxbb_vdec_hevc_sel,
3296 &gxbb_vdec_hevc_div,
3301 &gxbb_fixed_pll_dco,
3315 &gxbb_vclk_div12_en,
3321 &gxbb_vclk2_div2_en,
3322 &gxbb_vclk2_div4_en,
3323 &gxbb_vclk2_div6_en,
3324 &gxbb_vclk2_div12_en,
3343 static struct clk_regmap *const gxl_clk_regmaps[] = {
3391 &gxbb_hdmi_intr_sync,
3393 &gxbb_usb1_ddr_bridge,
3394 &gxbb_usb0_ddr_bridge,
3400 &gxbb_sec_ahb_ahb3_bridge,
3406 &gxbb_gclk_venci_int0,
3407 &gxbb_gclk_vencp_int,
3413 &gxbb_gclk_venci_int1,
3414 &gxbb_vclk2_venclmcc,
3430 &gxbb_cts_mclk_i958,
3432 &gxbb_sd_emmc_a_clk0,
3433 &gxbb_sd_emmc_b_clk0,
3434 &gxbb_sd_emmc_c_clk0,
3441 &gxbb_sar_adc_clk_div,
3444 &gxbb_cts_mclk_i958_div,
3446 &gxbb_sd_emmc_a_clk0_div,
3447 &gxbb_sd_emmc_b_clk0_div,
3448 &gxbb_sd_emmc_c_clk0_div,
3454 &gxbb_sar_adc_clk_sel,
3458 &gxbb_cts_amclk_sel,
3459 &gxbb_cts_mclk_i958_sel,
3462 &gxbb_sd_emmc_a_clk0_sel,
3463 &gxbb_sd_emmc_b_clk0_sel,
3464 &gxbb_sd_emmc_c_clk0_sel,
3477 &gxbb_cts_amclk_div,
3489 &gxbb_vdec_hevc_sel,
3490 &gxbb_vdec_hevc_div,
3495 &gxbb_fixed_pll_dco,
3509 &gxbb_vclk_div12_en,
3515 &gxbb_vclk2_div2_en,
3516 &gxbb_vclk2_div4_en,
3517 &gxbb_vclk2_div6_en,
3518 &gxbb_vclk2_div12_en,
3538 static const struct meson_eeclkc_data gxbb_clkc_data = {
3539 .regmap_clks = gxbb_clk_regmaps,
3540 .regmap_clk_num = ARRAY_SIZE(gxbb_clk_regmaps),
3542 .hws = gxbb_hw_clks,
3543 .num = ARRAY_SIZE(gxbb_hw_clks),
3547 static const struct meson_eeclkc_data gxl_clkc_data = {
3548 .regmap_clks = gxl_clk_regmaps,
3549 .regmap_clk_num = ARRAY_SIZE(gxl_clk_regmaps),
3552 .num = ARRAY_SIZE(gxl_hw_clks),
3556 static const struct of_device_id clkc_match_table[] = {
3557 { .compatible = "amlogic,gxbb-clkc", .data = &gxbb_clkc_data },
3558 { .compatible = "amlogic,gxl-clkc", .data = &gxl_clkc_data },
3561 MODULE_DEVICE_TABLE(of, clkc_match_table);
3563 static struct platform_driver gxbb_driver = {
3564 .probe = meson_eeclkc_probe,
3566 .name = "gxbb-clkc",
3567 .of_match_table = clkc_match_table,
3571 module_platform_driver(gxbb_driver);
3572 MODULE_LICENSE("GPL v2");