clk: thead: Enable LicheePi 4A clock drivers 88/310988/2
authorMichal Wilczynski <m.wilczynski@samsung.com>
Fri, 10 May 2024 11:00:13 +0000 (13:00 +0200)
committerMichal Wilczynski <m.wilczynski@samsung.com>
Mon, 13 May 2024 12:11:59 +0000 (14:11 +0200)
Ported from vendor kernel [1].

[1] https://gitee.com/thead-yocto/kernel.git

Change-Id: I2151bedd0e7d3c18d6ad940cdbcec400234b9015
Signed-off-by: Michal Wilczynski <m.wilczynski@samsung.com>
25 files changed:
drivers/clk/Kconfig
drivers/clk/Makefile
drivers/clk/thead/Kconfig [new file with mode: 0644]
drivers/clk/thead/Makefile [new file with mode: 0644]
drivers/clk/thead/clk-light-fm.c [new file with mode: 0644]
drivers/clk/thead/clk-light-mpw.c [new file with mode: 0644]
drivers/clk/thead/clk.c [new file with mode: 0644]
drivers/clk/thead/clk.h [new file with mode: 0644]
drivers/clk/thead/gate/Makefile [new file with mode: 0644]
drivers/clk/thead/gate/audiosys-gate.c [new file with mode: 0644]
drivers/clk/thead/gate/clk-gate.h [new file with mode: 0644]
drivers/clk/thead/gate/dspsys-gate.c [new file with mode: 0644]
drivers/clk/thead/gate/miscsys-gate.c [new file with mode: 0644]
drivers/clk/thead/gate/thead-gate.c [new file with mode: 0644]
drivers/clk/thead/gate/visys-gate.c [new file with mode: 0644]
drivers/clk/thead/gate/vosys-gate.c [new file with mode: 0644]
drivers/clk/thead/gate/vpsys-gate.c [new file with mode: 0644]
include/dt-bindings/clock/light-audiosys.h [new file with mode: 0644]
include/dt-bindings/clock/light-dspsys.h [new file with mode: 0644]
include/dt-bindings/clock/light-fm-ap-clock.h [new file with mode: 0644]
include/dt-bindings/clock/light-miscsys.h [new file with mode: 0644]
include/dt-bindings/clock/light-mpw-clock.h [new file with mode: 0644]
include/dt-bindings/clock/light-visys.h [new file with mode: 0644]
include/dt-bindings/clock/light-vosys.h [new file with mode: 0644]
include/dt-bindings/clock/light-vpsys.h [new file with mode: 0644]

index c30099866174d3d9e20f425726180f9f49ea746f..1578cc32432dca34e1a227003cd8852814526ae2 100644 (file)
@@ -501,6 +501,7 @@ source "drivers/clk/visconti/Kconfig"
 source "drivers/clk/x86/Kconfig"
 source "drivers/clk/xilinx/Kconfig"
 source "drivers/clk/zynqmp/Kconfig"
+source "drivers/clk/thead/Kconfig"
 
 # Kunit test cases
 config CLK_KUNIT_TEST
index 18969cbd4bb1e862d352eda0012f9d5f86e2d0d6..25517a2c3c47c8f0e18b96b226eba7723c4503fc 100644 (file)
@@ -136,3 +136,4 @@ endif
 obj-y                                  += xilinx/
 obj-$(CONFIG_ARCH_ZYNQ)                        += zynq/
 obj-$(CONFIG_COMMON_CLK_ZYNQMP)         += zynqmp/
+obj-$(CONFIG_ARCH_THEAD)               += thead/
diff --git a/drivers/clk/thead/Kconfig b/drivers/clk/thead/Kconfig
new file mode 100644 (file)
index 0000000..4fa0021
--- /dev/null
@@ -0,0 +1,19 @@
+# SPDX-License-Identifier: GPL-2.0
+
+config THEAD_CLK
+       bool
+       def_bool ARCH_THEAD
+
+config CLK_LIGHT_MPW
+       bool "Thead Light MPW Clock Driver"
+       depends on ARCH_THEAD
+       default n
+       help
+           Build the driver for light mpw Clock Driver
+
+config CLK_LIGHT_FM
+       bool "Thead Light Fullmask Clock Driver"
+       depends on ARCH_THEAD
+       default n
+       help
+           Build the driver for light fullmask Clock Driver
diff --git a/drivers/clk/thead/Makefile b/drivers/clk/thead/Makefile
new file mode 100644 (file)
index 0000000..24a349f
--- /dev/null
@@ -0,0 +1,8 @@
+# SPDX-License-Identifier: GPL-2.0
+
+obj-$(CONFIG_THEAD_CLK) += \
+       clk.o
+
+obj-$(CONFIG_CLK_LIGHT_MPW)  += clk-light-mpw.o
+obj-$(CONFIG_CLK_LIGHT_FM)  += clk-light-fm.o
+obj-$(CONFIG_CLK_LIGHT_FM)  += gate/
diff --git a/drivers/clk/thead/clk-light-fm.c b/drivers/clk/thead/clk-light-fm.c
new file mode 100644 (file)
index 0000000..fb33e75
--- /dev/null
@@ -0,0 +1,647 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2021 Alibaba Group Holding Limited.
+ */
+
+#include <dt-bindings/clock/light-fm-ap-clock.h>
+#include <linux/clk.h>
+#include <linux/delay.h>
+#include <linux/err.h>
+#include <linux/init.h>
+#include <linux/io.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+#include <linux/of_address.h>
+#include <linux/platform_device.h>
+#include <linux/types.h>
+
+#include "clk.h"
+
+static struct clk *clks[CLK_END];
+static struct clk_onecell_data clk_data;
+
+/* Light Fullmask */
+static u32 share_cnt_x2h_cpusys_clk_en;
+static u32 share_cnt_dmac_cpusys_clk_en;
+static u32 share_cnt_timer0_clk_en;
+static u32 share_cnt_timer1_clk_en;
+static u32 share_cnt_axi4_cpusys2_clk_en;
+static u32 share_cnt_bmu_c910_clk_en;
+static u32 share_cnt_aon2cpu_a2x_clk_en;
+static u32 share_cnt_chip_dbg_clk_en;
+static u32 share_cnt_x2x_cpusys_clk_en;
+static u32 share_cnt_cfg2tee_x2h_clk_en;
+static u32 share_cnt_cpu2aon_x2h_clk_en;
+static u32 share_cnt_cpu2vp_x2p_clk_en;
+static u32 share_cnt_npu_core_clk_en;
+static u32 share_cnt_cpu2peri_x2h_clk_en;
+static u32 share_cnt_cpu2vi_x2h_clk_en;
+static u32 share_cnt_vpsys_axi_aclk_en;
+static u32 share_cnt_gmac1_clk_en;
+static u32 share_cnt_gmac0_clk_en;
+static u32 share_cnt_perisys_apb3_hclk_en;
+static u32 share_cnt_qspi0_clk_en;
+static u32 share_cnt_gmac_axi_clk_en;
+static u32 share_cnt_gpio0_clk_en;
+static u32 share_cnt_gpio1_clk_en;
+static u32 share_cnt_pwm_clk_en;
+static u32 share_cnt_spi_clk_en;
+static u32 share_cnt_uart0_clk_en;
+static u32 share_cnt_uart2_clk_en;
+static u32 share_cnt_i2c2_clk_en;
+static u32 share_cnt_i2c3_clk_en;
+static u32 share_cnt_peri_i2s_clk_en;
+static u32 share_cnt_qspi1_clk_en;
+static u32 share_cnt_uart1_clk_en;
+static u32 share_cnt_uart3_clk_en;
+static u32 share_cnt_uart4_clk_en;
+static u32 share_cnt_uart5_clk_en;
+static u32 share_cnt_i2c0_clk_en;
+static u32 share_cnt_i2c1_clk_en;
+static u32 share_cnt_i2c4_clk_en;
+static u32 share_cnt_i2c5_clk_en;
+static u32 share_cnt_gpio2_clk_en;
+static u32 share_cnt_gpio3_clk_en;
+static u32 share_cnt_vosys_axi_aclk_en;
+
+/* Light Fullmask PLL Bypass */
+static const char * const cpu_pll0_bypass_sels[] = {"cpu_pll0_foutpostdiv", "osc_24m", };
+static const char * const cpu_pll1_bypass_sels[] = {"cpu_pll1_foutpostdiv", "osc_24m", };
+static const char * const gmac_pll_bypass_sels[] = {"gmac_pll_foutpostdiv", "osc_24m", };
+static const char * const video_pll_bypass_sels[] = {"video_pll_foutpostdiv", "osc_24m", };
+static const char * const tee_pll_bypass_sels[] = {"tee_pll_foutpostdiv", "osc_24m"};
+static const char * const dpu0_pll_bypass_sels[] = {"dpu0_pll_foutpostdiv", "osc_24m"};
+static const char * const dpu1_pll_bypass_sels[] = {"dpu1_pll_foutpostdiv", "osc_24m"};
+
+/* light fullmask mux */
+static const char * const ahb2_cpusys_hclk_sels[] = {"ahb2_cpusys_hclk_out_div", "osc_24m"};
+static const char * const c910_cclk_i0_sels[] = {"cpu_pll0_foutpostdiv", "osc_24m"};
+static const char * const c910_cclk_sels[] = {"c910_cclk_i0", "cpu_pll1_foutpostdiv"};
+static const char * const cfg_axi_aclk_sels[] = {"cfg_axi_aclk_out_div", "osc_24m"};
+static const char * const teesys_hclk_sels[] = {"teesys_i1_hclk", "teesys_i0_hclk"};
+static const char * const perisys_ahb_hclk_sels[] = {"perisys_ahb_hclk_out_div", "osc_24m"};
+static const char * const clk_out_1_sels[] = {"osc_24m", "clk_out_1_out_div"};
+static const char * const clk_out_2_sels[] = {"osc_24m", "clk_out_2_out_div"};
+static const char * const clk_out_3_sels[] = {"osc_24m", "clk_out_3_out_div"};
+static const char * const clk_out_4_sels[] = {"osc_24m", "clk_out_4_out_div"};
+static const char * const peri_i2s_src_clk_sels[] = {"clkgen_peri_i2s_src_clk_0", "clkgen_peri_i2s_src_clk_1"};
+static const char * const npu_cclk_sels[] = {"gmac_pll_foutpostdiv", "npu_cclk_out_div"};
+static const char * const cfg_apb_pclk_sels[] = {"cfg_apb_pclk_out_div", "osc_24m"};
+static const char * const uart_sclk_sels[] = {"clk_100m", "osc_24m"};
+
+static const struct light_pll_rate_table light_cpupll_tbl[] = {
+       LIGHT_PLL_RATE(2616000000U, 2616000000U, 1, 109, 0, 1, 1),
+       LIGHT_PLL_RATE(2592000000U, 2592000000U, 1, 108, 0, 1, 1),
+       LIGHT_PLL_RATE(2568000000U, 2568000000U, 1, 107, 0, 1, 1),
+       LIGHT_PLL_RATE(2544000000U, 2544000000U, 1, 106, 0, 1, 1),
+       LIGHT_PLL_RATE(2520000000U, 2520000000U, 1, 105, 0, 1, 1),
+       LIGHT_PLL_RATE(2496000000U, 2496000000U, 1, 104, 0, 1, 1),
+       LIGHT_PLL_RATE(2472000000U, 2472000000U, 1, 103, 0, 1, 1),
+       LIGHT_PLL_RATE(2448000000U, 2448000000U, 1, 102, 0, 1, 1),
+       LIGHT_PLL_RATE(2424000000U, 2424000000U, 1, 101, 0, 1, 1),
+       LIGHT_PLL_RATE(2400000000U, 2400000000U, 1, 100, 0, 1, 1),
+       LIGHT_PLL_RATE(2376000000U, 2376000000U, 1, 99,  0, 1, 1),
+       LIGHT_PLL_RATE(2352000000U, 2352000000U, 1, 98,  0, 1, 1),
+       LIGHT_PLL_RATE(2328000000U, 2328000000U, 1, 97,  0, 1, 1),
+       LIGHT_PLL_RATE(2304000000U, 2304000000U, 1, 96,  0, 1, 1),
+       LIGHT_PLL_RATE(2280000000U, 2280000000U, 1, 95,  0, 1, 1),
+       LIGHT_PLL_RATE(2256000000U, 2256000000U, 1, 94,  0, 1, 1),
+       LIGHT_PLL_RATE(2232000000U, 2232000000U, 1, 93,  0, 1, 1),
+       LIGHT_PLL_RATE(2208000000U, 2208000000U, 1, 92,  0, 1, 1),
+       LIGHT_PLL_RATE(2184000000U, 2184000000U, 1, 91,  0, 1, 1),
+       LIGHT_PLL_RATE(2160000000U, 2160000000U, 1, 90,  0, 1, 1),
+       LIGHT_PLL_RATE(2136000000U, 2136000000U, 1, 89,  0, 1, 1),
+       LIGHT_PLL_RATE(2112000000U, 2112000000U, 1, 88,  0, 1, 1),
+       LIGHT_PLL_RATE(2088000000U, 2088000000U, 1, 87,  0, 1, 1),
+       LIGHT_PLL_RATE(2064000000U, 2064000000U, 1, 86,  0, 1, 1),
+       LIGHT_PLL_RATE(2040000000U, 2040000000U, 1, 85,  0, 1, 1),
+       LIGHT_PLL_RATE(2016000000U, 2016000000U, 1, 84,  0, 1, 1),
+       LIGHT_PLL_RATE(1992000000U, 1992000000U, 1, 83,  0, 1, 1),
+       LIGHT_PLL_RATE(1968000000U, 1968000000U, 1, 82,  0, 1, 1),
+       LIGHT_PLL_RATE(1944000000U, 1944000000U, 1, 81,  0, 1, 1),
+       LIGHT_PLL_RATE(1920000000U, 1920000000U, 1, 80,  0, 1, 1),
+       LIGHT_PLL_RATE(1896000000U, 1896000000U, 1, 79,  0, 1, 1),
+       LIGHT_PLL_RATE(1872000000U, 1872000000U, 1, 78,  0, 1, 1),
+       LIGHT_PLL_RATE(1848000000U, 1848000000U, 1, 77,  0, 1, 1),
+       LIGHT_PLL_RATE(1824000000U, 1824000000U, 1, 76,  0, 1, 1),
+       LIGHT_PLL_RATE(1800000000U, 1800000000U, 1, 75,  0, 1, 1),
+       LIGHT_PLL_RATE(1776000000U, 1776000000U, 1, 74,  0, 1, 1),
+       LIGHT_PLL_RATE(1752000000U, 1752000000U, 1, 73,  0, 1, 1),
+       LIGHT_PLL_RATE(1728000000U, 1728000000U, 1, 72,  0, 1, 1),
+       LIGHT_PLL_RATE(1704000000U, 1704000000U, 1, 71,  0, 1, 1),
+       LIGHT_PLL_RATE(1680000000U, 1680000000U, 1, 70,  0, 1, 1),
+       LIGHT_PLL_RATE(1656000000U, 1656000000U, 1, 69,  0, 1, 1),
+       LIGHT_PLL_RATE(1632000000U, 1632000000U, 1, 68,  0, 1, 1),
+       LIGHT_PLL_RATE(1608000000U, 1608000000U, 1, 67,  0, 1, 1),
+       LIGHT_PLL_RATE(1584000000U, 1584000000U, 1, 66,  0, 1, 1),
+       LIGHT_PLL_RATE(1560000000U, 1560000000U, 1, 65,  0, 1, 1),
+       LIGHT_PLL_RATE(1536000000U, 1536000000U, 1, 64,  0, 1, 1),
+       LIGHT_PLL_RATE(1512000000U, 1512000000U, 1, 63,  0, 1, 1),
+       LIGHT_PLL_RATE(3000000000U, 1500000000U, 1, 125, 0, 2, 1),
+       LIGHT_PLL_RATE(2976000000U, 1488000000U, 1, 124, 0, 2, 1),
+       LIGHT_PLL_RATE(2952000000U, 1476000000U, 1, 123, 0, 2, 1),
+       LIGHT_PLL_RATE(2928000000U, 1464000000U, 1, 122, 0, 2, 1),
+       LIGHT_PLL_RATE(2904000000U, 1452000000U, 1, 121, 0, 2, 1),
+       LIGHT_PLL_RATE(2880000000U, 1440000000U, 1, 120, 0, 2, 1),
+       LIGHT_PLL_RATE(2856000000U, 1428000000U, 1, 119, 0, 2, 1),
+       LIGHT_PLL_RATE(2832000000U, 1416000000U, 1, 118, 0, 2, 1),
+       LIGHT_PLL_RATE(2808000000U, 1404000000U, 1, 117, 0, 2, 1),
+       LIGHT_PLL_RATE(2784000000U, 1392000000U, 1, 116, 0, 2, 1),
+       LIGHT_PLL_RATE(2760000000U, 1380000000U, 1, 115, 0, 2, 1),
+       LIGHT_PLL_RATE(2736000000U, 1368000000U, 1, 114, 0, 2, 1),
+       LIGHT_PLL_RATE(2712000000U, 1356000000U, 1, 113, 0, 2, 1),
+       LIGHT_PLL_RATE(2688000000U, 1344000000U, 1, 112, 0, 2, 1),
+       LIGHT_PLL_RATE(2664000000U, 1332000000U, 1, 111, 0, 2, 1),
+       LIGHT_PLL_RATE(2640000000U, 1320000000U, 1, 110, 0, 2, 1),
+       LIGHT_PLL_RATE(2616000000U, 1308000000U, 1, 109, 0, 2, 1),
+       LIGHT_PLL_RATE(2592000000U, 1296000000U, 1, 108, 0, 2, 1),
+       LIGHT_PLL_RATE(2568000000U, 1284000000U, 1, 107, 0, 2, 1),
+       LIGHT_PLL_RATE(2544000000U, 1272000000U, 1, 106, 0, 2, 1),
+       LIGHT_PLL_RATE(2520000000U, 1260000000U, 1, 105, 0, 2, 1),
+       LIGHT_PLL_RATE(2496000000U, 1248000000U, 1, 104, 0, 2, 1),
+       LIGHT_PLL_RATE(2472000000U, 1236000000U, 1, 103, 0, 2, 1),
+       LIGHT_PLL_RATE(2448000000U, 1224000000U, 1, 102, 0, 2, 1),
+       LIGHT_PLL_RATE(2424000000U, 1212000000U, 1, 101, 0, 2, 1),
+       LIGHT_PLL_RATE(2400000000U, 1200000000U, 1, 100, 0, 2, 1),
+       LIGHT_PLL_RATE(2376000000U, 1188000000U, 1, 99,  0, 2, 1),
+       LIGHT_PLL_RATE(2352000000U, 1176000000U, 1, 98,  0, 2, 1),
+       LIGHT_PLL_RATE(2328000000U, 1164000000U, 1, 97,  0, 2, 1),
+       LIGHT_PLL_RATE(2304000000U, 1152000000U, 1, 96,  0, 2, 1),
+       LIGHT_PLL_RATE(2280000000U, 1140000000U, 1, 95,  0, 2, 1),
+       LIGHT_PLL_RATE(2256000000U, 1128000000U, 1, 94,  0, 2, 1),
+       LIGHT_PLL_RATE(2232000000U, 1116000000U, 1, 93,  0, 2, 1),
+       LIGHT_PLL_RATE(2208000000U, 1104000000U, 1, 92,  0, 2, 1),
+       LIGHT_PLL_RATE(2184000000U, 1092000000U, 1, 91,  0, 2, 1),
+       LIGHT_PLL_RATE(2160000000U, 1080000000U, 1, 90,  0, 2, 1),
+       LIGHT_PLL_RATE(2136000000U, 1068000000U, 1, 89,  0, 2, 1),
+       LIGHT_PLL_RATE(2112000000U, 1056000000U, 1, 88,  0, 2, 1),
+       LIGHT_PLL_RATE(2088000000U, 1044000000U, 1, 87,  0, 2, 1),
+       LIGHT_PLL_RATE(2064000000U, 1032000000U, 1, 86,  0, 2, 1),
+       LIGHT_PLL_RATE(2040000000U, 1020000000U, 1, 85,  0, 2, 1),
+       LIGHT_PLL_RATE(2016000000U, 1008000000U, 1, 84,  0, 2, 1),
+       LIGHT_PLL_RATE(3000000000U, 1000000000U, 1, 125, 0, 3, 1),
+       LIGHT_PLL_RATE(2976000000U, 992000000U,  1, 124, 0, 3, 1),
+       LIGHT_PLL_RATE(2952000000U, 984000000U,  1, 123, 0, 3, 1),
+       LIGHT_PLL_RATE(2928000000U, 976000000U,  1, 122, 0, 3, 1),
+       LIGHT_PLL_RATE(2904000000U, 968000000U,  1, 121, 0, 3, 1),
+       LIGHT_PLL_RATE(2880000000U, 960000000U,  1, 120, 0, 3, 1),
+       LIGHT_PLL_RATE(2856000000U, 952000000U,  1, 119, 0, 3, 1),
+       LIGHT_PLL_RATE(2832000000U, 944000000U,  1, 118, 0, 3, 1),
+       LIGHT_PLL_RATE(2808000000U, 936000000U,  1, 117, 0, 3, 1),
+       LIGHT_PLL_RATE(2784000000U, 928000000U,  1, 116, 0, 3, 1),
+       LIGHT_PLL_RATE(2760000000U, 920000000U,  1, 115, 0, 3, 1),
+       LIGHT_PLL_RATE(2736000000U, 912000000U,  1, 114, 0, 3, 1),
+       LIGHT_PLL_RATE(2712000000U, 904000000U,  1, 113, 0, 3, 1),
+       LIGHT_PLL_RATE(1800000000U, 900000000U,  1, 75,  0, 2, 1),
+       LIGHT_PLL_RATE(2688000000U, 896000000U,  1, 112, 0, 3, 1),
+       LIGHT_PLL_RATE(2664000000U, 888000000U,  1, 111, 0, 3, 1),
+       LIGHT_PLL_RATE(2640000000U, 880000000U,  1, 110, 0, 3, 1),
+       LIGHT_PLL_RATE(2616000000U, 872000000U,  1, 109, 0, 3, 1),
+       LIGHT_PLL_RATE(2592000000U, 864000000U,  1, 108, 0, 3, 1),
+       LIGHT_PLL_RATE(2568000000U, 856000000U,  1, 107, 0, 3, 1),
+       LIGHT_PLL_RATE(2544000000U, 848000000U,  1, 106, 0, 3, 1),
+       LIGHT_PLL_RATE(2520000000U, 840000000U,  1, 105, 0, 3, 1),
+       LIGHT_PLL_RATE(2496000000U, 832000000U,  1, 104, 0, 3, 1),
+       LIGHT_PLL_RATE(2472000000U, 824000000U,  1, 103, 0, 3, 1),
+       LIGHT_PLL_RATE(2448000000U, 816000000U,  1, 102, 0, 3, 1),
+       LIGHT_PLL_RATE(2424000000U, 808000000U,  1, 101, 0, 3, 1),
+       LIGHT_PLL_RATE(2400000000U, 800000000U,  1, 100, 0, 3, 1),
+       LIGHT_PLL_RATE(2376000000U, 792000000U,  1, 99,  0, 3, 1),
+       LIGHT_PLL_RATE(2352000000U, 784000000U,  1, 98,  0, 3, 1),
+       LIGHT_PLL_RATE(2328000000U, 776000000U,  1, 97,  0, 3, 1),
+       LIGHT_PLL_RATE(2304000000U, 768000000U,  1, 96,  0, 3, 1),
+       LIGHT_PLL_RATE(2280000000U, 760000000U,  1, 95,  0, 3, 1),
+       LIGHT_PLL_RATE(2256000000U, 752000000U,  1, 94,  0, 3, 1),
+       LIGHT_PLL_RATE(2232000000U, 744000000U,  1, 93,  0, 3, 1),
+       LIGHT_PLL_RATE(2208000000U, 736000000U,  1, 92,  0, 3, 1),
+       LIGHT_PLL_RATE(2184000000U, 728000000U,  1, 91,  0, 3, 1),
+       LIGHT_PLL_RATE(2160000000U, 720000000U,  1, 90,  0, 3, 1),
+       LIGHT_PLL_RATE(2136000000U, 712000000U,  1, 89,  0, 3, 1),
+       LIGHT_PLL_RATE(2808000000U, 702000000U,  1, 117, 0, 4, 1),
+       LIGHT_PLL_RATE(2760000000U, 690000000U,  1, 115, 0, 4, 1),
+       LIGHT_PLL_RATE(2712000000U, 678000000U,  1, 113, 0, 4, 1),
+       LIGHT_PLL_RATE(2664000000U, 666000000U,  1, 111, 0, 4, 1),
+       LIGHT_PLL_RATE(2616000000U, 654000000U,  1, 109, 0, 4, 1),
+       LIGHT_PLL_RATE(2568000000U, 642000000U,  1, 107, 0, 4, 1),
+       LIGHT_PLL_RATE(2520000000U, 630000000U,  1, 105, 0, 4, 1),
+       LIGHT_PLL_RATE(2472000000U, 618000000U,  1, 103, 0, 4, 1),
+       LIGHT_PLL_RATE(2424000000U, 606000000U,  1, 101, 0, 4, 1),
+       LIGHT_PLL_RATE(3000000000U, 600000000U,  1, 125, 0, 5, 1),
+       LIGHT_PLL_RATE(2952000000U, 590400000U,  1, 123, 0, 5, 1),
+       LIGHT_PLL_RATE(2904000000U, 580800000U,  1, 121, 0, 5, 1),
+       LIGHT_PLL_RATE(2856000000U, 571200000U,  1, 119, 0, 5, 1),
+       LIGHT_PLL_RATE(2808000000U, 561600000U,  1, 117, 0, 5, 1),
+       LIGHT_PLL_RATE(2760000000U, 552000000U,  1, 115, 0, 5, 1),
+       LIGHT_PLL_RATE(2712000000U, 542400000U,  1, 113, 0, 5, 1),
+       LIGHT_PLL_RATE(2664000000U, 532800000U,  1, 111, 0, 5, 1),
+       LIGHT_PLL_RATE(2616000000U, 523200000U,  1, 109, 0, 5, 1),
+       LIGHT_PLL_RATE(2568000000U, 513600000U,  1, 107, 0, 5, 1),
+       LIGHT_PLL_RATE(2520000000U, 504000000U,  1, 105, 0, 5, 1),
+       LIGHT_PLL_RATE(3000000000U, 500000000U,  1, 125, 0, 6, 1),
+       LIGHT_PLL_RATE(2952000000U, 492000000U,  1, 123, 0, 6, 1),
+       LIGHT_PLL_RATE(2904000000U, 484000000U,  1, 121, 0, 6, 1),
+       LIGHT_PLL_RATE(2856000000U, 476000000U,  1, 119, 0, 6, 1),
+       LIGHT_PLL_RATE(2808000000U, 468000000U,  1, 117, 0, 6, 1),
+       LIGHT_PLL_RATE(2760000000U, 460000000U,  1, 115, 0, 6, 1),
+       LIGHT_PLL_RATE(2712000000U, 452000000U,  1, 113, 0, 6, 1),
+       LIGHT_PLL_RATE(2664000000U, 444000000U,  1, 111, 0, 6, 1),
+       LIGHT_PLL_RATE(2616000000U, 436000000U,  1, 109, 0, 6, 1),
+       LIGHT_PLL_RATE(2568000000U, 428000000U,  1, 107, 0, 6, 1),
+       LIGHT_PLL_RATE(2520000000U, 420000000U,  1, 105, 0, 6, 1),
+       LIGHT_PLL_RATE(2472000000U, 412000000U,  1, 103, 0, 6, 1),
+       LIGHT_PLL_RATE(2400000000U, 400000000U,  1, 100, 0, 3, 2),
+       LIGHT_PLL_RATE(2352000000U, 392000000U,  1, 98,  0, 3, 2),
+       LIGHT_PLL_RATE(2304000000U, 384000000U,  1, 96,  0, 3, 2),
+       LIGHT_PLL_RATE(2256000000U, 376000000U,  1, 94,  0, 3, 2),
+       LIGHT_PLL_RATE(2208000000U, 368000000U,  1, 92,  0, 3, 2),
+       LIGHT_PLL_RATE(2160000000U, 360000000U,  1, 90,  0, 3, 2),
+       LIGHT_PLL_RATE(2112000000U, 352000000U,  1, 88,  0, 3, 2),
+       LIGHT_PLL_RATE(2064000000U, 344000000U,  1, 86,  0, 3, 2),
+       LIGHT_PLL_RATE(2016000000U, 336000000U,  1, 84,  0, 3, 2),
+       LIGHT_PLL_RATE(1968000000U, 328000000U,  1, 82,  0, 3, 2),
+       LIGHT_PLL_RATE(1920000000U, 320000000U,  1, 80,  0, 3, 2),
+       LIGHT_PLL_RATE(1872000000U, 312000000U,  1, 78,  0, 3, 2),
+       LIGHT_PLL_RATE(1824000000U, 304000000U,  1, 76,  0, 3, 2),
+       LIGHT_PLL_RATE(3000000000U, 300000000U,  1, 125, 0, 5, 2),
+       LIGHT_PLL_RATE(2880000000U, 288000000U,  1, 120, 0, 5, 2),
+       LIGHT_PLL_RATE(2760000000U, 276000000U,  1, 115, 0, 5, 2),
+       LIGHT_PLL_RATE(2640000000U, 264000000U,  1, 110, 0, 5, 2),
+       LIGHT_PLL_RATE(2520000000U, 252000000U,  1, 105, 0, 5, 2),
+       LIGHT_PLL_RATE(2400000000U, 240000000U,  1, 100, 0, 5, 2),
+       LIGHT_PLL_RATE(2280000000U, 228000000U,  1, 95,  0, 5, 2),
+       LIGHT_PLL_RATE(2160000000U, 216000000U,  1, 90,  0, 5, 2),
+       LIGHT_PLL_RATE(2040000000U, 204000000U,  1, 85,  0, 5, 2),
+       LIGHT_PLL_RATE(3000000000U, 200000000U,  1, 125, 0, 5, 3),
+       LIGHT_PLL_RATE(2880000000U, 192000000U,  1, 120, 0, 5, 3),
+       LIGHT_PLL_RATE(2760000000U, 184000000U,  1, 115, 0, 5, 3),
+       LIGHT_PLL_RATE(2640000000U, 176000000U,  1, 110, 0, 5, 3),
+       LIGHT_PLL_RATE(2520000000U, 168000000U,  1, 105, 0, 5, 3),
+       LIGHT_PLL_RATE(2400000000U, 160000000U,  1, 100, 0, 5, 3),
+       LIGHT_PLL_RATE(2280000000U, 152000000U,  1, 95,  0, 5, 3),
+       LIGHT_PLL_RATE(2160000000U, 144000000U,  1, 90,  0, 5, 3),
+       LIGHT_PLL_RATE(2040000000U, 136000000U,  1, 85,  0, 5, 3),
+       LIGHT_PLL_RATE(1920000000U, 128000000U,  1, 80,  0, 5, 3),
+       LIGHT_PLL_RATE(3000000000U, 125000000U,  1, 125, 0, 6, 4),
+       LIGHT_PLL_RATE(2760000000U, 115000000U,  1, 115, 0, 6, 4),
+       LIGHT_PLL_RATE(2520000000U, 105000000U,  1, 105, 0, 6, 4),
+       LIGHT_PLL_RATE(2280000000U, 95000000U,   1, 95,  0, 6, 4),
+       LIGHT_PLL_RATE(2040000000U, 85000000U,   1, 85,  0, 6, 4),
+       LIGHT_PLL_RATE(1800000000U, 75000000U,   1, 75,  0, 6, 4),
+       LIGHT_PLL_RATE(1560000000U, 65000000U,   1, 65,  0, 6, 4),
+       LIGHT_PLL_RATE(1320000000U, 55000000U,   1, 55,  0, 6, 4),
+};
+
+static const struct light_pll_rate_table light_dpupll_tbl[] = {
+       LIGHT_PLL_RATE(2376000000U, 1188000000U, 1, 99, 0, 2, 1),
+       LIGHT_PLL_RATE(1980000000U, 990000000U, 2, 165, 0, 2, 1),
+       LIGHT_PLL_RATE(2970000000U, 742500000U, 4, 495, 0, 4, 1),
+       LIGHT_PLL_RATE(2304000000U, 1152000000U, 1, 96, 0, 2, 1),
+       LIGHT_PLL_RATE(1512000000U, 504000000U, 1, 63, 0, 3, 1),
+       LIGHT_PLL_RATE(1512000000U, 503500000U, 1, 63, 0, 3, 1),
+       LIGHT_PLL_RATE(2898000000U, 483000000U, 4, 483, 0, 6, 1),
+       LIGHT_PLL_RATE(2592000000U, 648000000U, 1, 108, 0, 4, 1),
+       LIGHT_PLL_RATE(2772000000U, 924000000U, 2, 231, 0, 3, 1),
+       LIGHT_PLL_RATE(2856000000U, 476000000U, 1, 119, 0, 6, 1),
+       LIGHT_PLL_RATE(2130000000U, 355000000U, 4, 355, 0, 6, 1),
+       LIGHT_PLL_RATE(3192000000U, 456000000U, 1, 133, 0, 7, 1),
+       LIGHT_PLL_RATE(2730000000U, 390000000U, 4, 455, 0, 7, 1),
+       LIGHT_PLL_RATE(1680000000U, 240000000U, 1, 70, 0, 7, 1),
+       LIGHT_PLL_RATE(2832000000U, 708000000U, 1, 118, 0, 4, 1),
+       LIGHT_PLL_RATE(1026000000U, 342000000U, 4, 171, 0, 3, 1),
+       LIGHT_PLL_RATE(1260000000U, 630000000U, 4, 210, 0, 2, 1),
+};
+
+static struct light_pll_clk light_cpu_pll0div = {
+       .out_type = LIGHT_PLL_DIV,
+       .clk_type = LIGHT_CPU_PLL0,
+       .rate_table = light_cpupll_tbl,
+       .rate_count = ARRAY_SIZE(light_cpupll_tbl),
+};
+
+static struct light_pll_clk light_cpu_pll1div = {
+       .out_type = LIGHT_PLL_DIV,
+       .clk_type = LIGHT_CPU_PLL1,
+       .rate_table = light_cpupll_tbl,
+       .rate_count = ARRAY_SIZE(light_cpupll_tbl),
+};
+
+static struct light_pll_clk light_dpu0_plldiv = {
+       .out_type = LIGHT_PLL_DIV,
+       .clk_type = LIGHT_DPU0_PLL,
+       .rate_table = light_dpupll_tbl,
+       .rate_count = ARRAY_SIZE(light_dpupll_tbl),
+};
+
+static struct light_pll_clk light_dpu1_plldiv = {
+       .out_type = LIGHT_PLL_DIV,
+       .clk_type = LIGHT_DPU1_PLL,
+       .rate_table = light_dpupll_tbl,
+       .rate_count = ARRAY_SIZE(light_dpupll_tbl),
+};
+
+static int light_clocks_probe(struct platform_device *pdev)
+{
+       struct device *dev = &pdev->dev;
+       struct device_node *np = dev->of_node;
+       void __iomem *ap_base;
+       int ret;
+       const bool *teesys = of_device_get_match_data(dev);
+
+       /* Clock source */
+       clks[CLK_DUMMY] = thead_clk_fixed("dummy", 0);
+       clks[OSC_32K] = of_clk_get_by_name(np, "osc_32k");
+       clks[OSC_24M] = of_clk_get_by_name(np, "osc_24m");
+       clks[RC_24M] = of_clk_get_by_name(np, "rc_24m");
+
+       np = dev->of_node;
+       ap_base = devm_platform_ioremap_resource(pdev, 0);
+       if (WARN_ON(IS_ERR(ap_base))) {
+               ret = PTR_ERR(ap_base);
+               goto unregister_clks;
+       }
+
+       /* Light Fullmask AP PLL clocks */
+       clks[CPU_PLL0_FOUTPOSTDIV] = thead_light_pll("cpu_pll0_foutpostdiv", "osc_24m", ap_base, &light_cpu_pll0div);
+       clks[CPU_PLL1_FOUTPOSTDIV] = thead_light_pll("cpu_pll1_foutpostdiv", "osc_24m", ap_base, &light_cpu_pll1div);
+
+       clks[DPU0_PLL_FOUTPOSTDIV] = thead_light_pll("dpu0_pll_foutpostdiv", "osc_24m", ap_base, &light_dpu0_plldiv);
+       clks[DPU1_PLL_FOUTPOSTDIV] = thead_light_pll("dpu1_pll_foutpostdiv", "osc_24m", ap_base, &light_dpu1_plldiv);
+
+       /* Light Fullmask AP Fixed PLL */
+       clks[GMAC_PLL_FOUTPOSTDIV] = thead_clk_fixed("gmac_pll_foutpostdiv", 1000000000);
+       clks[VIDEO_PLL_FOUTPOSTDIV] = thead_clk_fixed("video_pll_foutpostdiv", 792000000);
+       clks[VIDEO_PLL_FOUTVCO] = thead_clk_fixed("video_pll_foutvco", 2376000000);
+       clks[TEE_PLL_FOUTPOSTDIV] = thead_clk_fixed("tee_pll_foutpostdiv", 792000000);
+       clks[CLKGEN_PERI_I2S_SRC_CLK_0] = thead_clk_fixed("clkgen_peri_i2s_src_clk_0", 294912000);      //from audio_pll_foutpostdiv
+       clks[CLKGEN_PERI_I2S_SRC_CLK_1] = thead_clk_fixed("clkgen_peri_i2s_src_clk_1", 135475200);      //from sys_pll_foutpostdiv
+       clks[CLKGEN_C910_BUS_CLK_NO_ICG] = thead_clk_fixed("clkgen_c910_bus_clk_no_icg", 750000000);
+       clks[AONSYS_BUS_CLK] = thead_clk_fixed("aonsys_hclk", 101606400);       //from sys_pll, maybe change ?
+
+       /* Light Fullmask AP MUX */
+       clks[CPU_PLL0_BYPASS] = thead_light_clk_mux_flags("cpu_pll0_bypass", ap_base + 0x4, 30, 1, cpu_pll0_bypass_sels, ARRAY_SIZE(cpu_pll0_bypass_sels), CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT);
+       clks[CPU_PLL1_BYPASS] = thead_light_clk_mux_flags("cpu_pll1_bypass", ap_base + 0x14, 30, 1, cpu_pll1_bypass_sels, ARRAY_SIZE(cpu_pll1_bypass_sels), CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT);
+       clks[GMAC_PLL_BYPASS] = thead_light_clk_mux_flags("gmac_pll_bypass", ap_base + 0x24, 30, 1, gmac_pll_bypass_sels, ARRAY_SIZE(gmac_pll_bypass_sels), CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT);
+       clks[VIDEO_PLL_BYPASS] = thead_light_clk_mux_flags("video_pll_bypass", ap_base + 0x34, 30, 1, video_pll_bypass_sels, ARRAY_SIZE(video_pll_bypass_sels), CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT);
+       clks[TEE_PLL_BYPASS] = thead_light_clk_mux_flags("tee_pll_bypass", ap_base + 0x64, 30, 1, tee_pll_bypass_sels, ARRAY_SIZE(tee_pll_bypass_sels), CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT);
+       clks[DPU0_PLL_BYPASS] = thead_light_clk_mux_flags("dpu0_pll_bypass", ap_base + 0x44, 30, 1, dpu0_pll_bypass_sels, ARRAY_SIZE(dpu0_pll_bypass_sels), CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT);
+       clks[DPU1_PLL_BYPASS] = thead_light_clk_mux_flags("dpu1_pll_bypass", ap_base + 0x54, 30, 1, dpu1_pll_bypass_sels, ARRAY_SIZE(dpu1_pll_bypass_sels), CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT);
+
+       clks[AHB2_CPUSYS_HCLK] = thead_light_clk_mux_flags("ahb2_cpusys_hclk", ap_base + 0x120, 5, 1, ahb2_cpusys_hclk_sels, ARRAY_SIZE(ahb2_cpusys_hclk_sels), CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT);
+       clks[C910_CCLK_I0] = thead_light_clk_mux_flags("c910_cclk_i0", ap_base + 0x100, 1, 1, c910_cclk_i0_sels, ARRAY_SIZE(c910_cclk_i0_sels), CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT);
+       clks[C910_CCLK] = thead_light_clk_mux_flags("c910_cclk", ap_base + 0x100, 0, 1, c910_cclk_sels, ARRAY_SIZE(c910_cclk_sels), CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT);
+       clks[CFG_AXI_ACLK] = thead_light_clk_mux_flags("cfg_axi_aclk", ap_base + 0x138, 5, 1, cfg_axi_aclk_sels, ARRAY_SIZE(cfg_axi_aclk_sels), CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT);
+
+       if (teesys)
+               clks[TEESYS_HCLK] = thead_light_clk_mux_flags("teesys_hclk", ap_base + 0x1cc, 13, 1, teesys_hclk_sels, ARRAY_SIZE(teesys_hclk_sels), CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT); //just for teesys!!!
+
+       clks[PERISYS_AHB_HCLK] = thead_light_clk_mux_flags("perisys_ahb_hclk", ap_base + 0x140, 5, 1, perisys_ahb_hclk_sels, ARRAY_SIZE(perisys_ahb_hclk_sels), CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT);
+       clks[CLK_OUT_1] = thead_light_clk_mux_flags("clk_out_1", ap_base + 0x1b4, 4, 1, clk_out_1_sels, ARRAY_SIZE(clk_out_1_sels), CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT);
+       clks[CLK_OUT_2] = thead_light_clk_mux_flags("clk_out_2", ap_base + 0x1b8, 4, 1, clk_out_2_sels, ARRAY_SIZE(clk_out_2_sels), CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT);
+       clks[CLK_OUT_3] = thead_light_clk_mux_flags("clk_out_3", ap_base + 0x1bc, 4, 1, clk_out_3_sels, ARRAY_SIZE(clk_out_3_sels), CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT);
+       clks[CLK_OUT_4] = thead_light_clk_mux_flags("clk_out_4", ap_base + 0x1c0, 4, 1, clk_out_4_sels, ARRAY_SIZE(clk_out_4_sels), CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT);
+       clks[PERI_I2S_SRC_CLK] = thead_light_clk_mux_flags("peri_i2s_src_clk", ap_base + 0x1f0, 0, 1, peri_i2s_src_clk_sels, ARRAY_SIZE(peri_i2s_src_clk_sels), CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT);
+       clks[NPU_CCLK] = thead_light_clk_mux_flags("npu_cclk", ap_base + 0x1c8, 6, 1, npu_cclk_sels, ARRAY_SIZE(npu_cclk_sels), CLK_SET_RATE_PARENT);
+       clks[CFG_APB_PCLK] = thead_light_clk_mux_flags("cfg_apb_pclk", ap_base + 0x1c4, 7, 1, cfg_apb_pclk_sels, ARRAY_SIZE(cfg_apb_pclk_sels), CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT);
+       clks[UART_SCLK] = thead_light_clk_mux_flags("uart_sclk", ap_base + 0x210, 0, 1, uart_sclk_sels, ARRAY_SIZE(uart_sclk_sels), CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT);
+
+       /* Light Fullmask AP Divider */
+       clks[AHB2_CPUSYS_HCLK_OUT_DIV] = thead_clk_light_divider("ahb2_cpusys_hclk_out_div", "gmac_pll_fout1ph0", ap_base + 0x120, 0, 3, 4, MUX_TYPE_DIV, 2, 7);
+       clks[APB3_CPUSYS_PCLK] = thead_clk_light_divider("apb3_cpusys_pclk", "ahb2_cpusys_hclk", ap_base + 0x130, 0, 3, 3, MUX_TYPE_CDE, 1, 7);
+       clks[AXI4_CPUSYS2_ACLK] = thead_clk_light_divider("axi4_cpusys2_aclk", "gmac_pll_foutpostdiv", ap_base + 0x134, 0, 3, 4, MUX_TYPE_DIV, 2, 7);
+       clks[CFG_AXI_ACLK_OUT_DIV] = thead_clk_light_divider("cfg_axi_aclk_out_div", "video_pll_foutpostdiv", ap_base + 0x138, 0, 4, 4, MUX_TYPE_DIV, 2, 15);
+
+       if (teesys) {
+               clks[TEESYS_I0_HCLK] = thead_clk_light_divider("teesys_i0_hclk", "tee_pll_foutpostdiv", ap_base + 0x1cc, 0, 4, 4, MUX_TYPE_DIV, 2, 15); //just for teesys!!!
+               clks[TEESYS_I1_HCLK] = thead_clk_light_divider("teesys_i1_hclk", "video_pll_foutpostdiv", ap_base + 0x1cc, 8, 4, 12, MUX_TYPE_DIV, 2, 15); //just for teesys!!!
+       }
+
+       clks[PERISYS_AHB_HCLK_OUT_DIV] = thead_clk_light_divider("perisys_ahb_hclk_out_div", "gmac_pll_fout1ph0", ap_base + 0x140, 0, 4, 4, MUX_TYPE_DIV, 2, 7);
+       clks[PERISYS_APB_PCLK] = thead_clk_light_divider("perisys_apb_pclk", "perisys_ahb_hclk", ap_base + 0x150, 0, 3, 3, MUX_TYPE_CDE, 3, 7);
+       clks[PERI2SYS_APB_PCLK] = thead_clk_light_divider("peri2sys_apb_pclk", "gmac_pll_fout4", ap_base + 0x150, 4, 3, 8, MUX_TYPE_DIV, 2, 7);
+       clks[CLK_OUT_1_OUT_DIV] = thead_clk_light_divider("clk_out_1_out_div", "osc_24m", ap_base + 0x1b4, 0, 3, 3, MUX_TYPE_DIV, 2, 4);
+       clks[CLK_OUT_2_OUT_DIV] = thead_clk_light_divider("clk_out_2_out_div", "osc_24m", ap_base + 0x1b8, 0, 3, 3, MUX_TYPE_DIV, 2, 4);
+       clks[CLK_OUT_3_OUT_DIV] = thead_clk_light_divider("clk_out_3_out_div", "osc_24m", ap_base + 0x1bc, 0, 3, 3, MUX_TYPE_DIV, 2, 4);
+       clks[CLK_OUT_4_OUT_DIV] = thead_clk_light_divider("clk_out_4_out_div", "osc_24m", ap_base + 0x1c0, 0, 3, 3, MUX_TYPE_DIV, 2, 4);
+       clks[VOSYS_ACLK_M] = thead_clk_light_divider("vosys_aclk_m", "video_pll_foutvco", ap_base + 0x1dc, 0, 4, 4, MUX_TYPE_DIV, 3, 15);
+       clks[NPU_CCLK_OUT_DIV] = thead_clk_light_divider("npu_cclk_out_div", "video_pll_foutvco", ap_base + 0x1c8, 0, 3, 3, MUX_TYPE_DIV, 3, 7);
+       clks[CFG_APB_PCLK_OUT_DIV] = thead_clk_light_divider("cfg_apb_pclk_out_div", "gmac_pll_foutpostdiv", ap_base + 0x1c4, 0, 4, 4, MUX_TYPE_DIV, 4, 15);
+       clks[VISYS_ACLK_M] = thead_clk_light_divider("visys_aclk_m", "video_pll_foutvco", ap_base + 0x1d0, 16, 4, 20, MUX_TYPE_DIV, 3, 15);
+       clks[VISYS_AHB_HCLK] = thead_clk_light_divider("visys_ahb_hclk", "video_pll_foutvco", ap_base + 0x1d0, 0, 4, 4, MUX_TYPE_DIV, 6, 15);
+       clks[VPSYS_APB_PCLK] = thead_clk_light_divider("vpsys_apb_pclk", "gmac_pll_fout1ph0", ap_base + 0x1e0, 0, 3, 4, MUX_TYPE_DIV, 2, 7);
+       clks[VPSYS_AXI_ACLK] = thead_clk_light_divider("vpsys_axi_aclk", "video_pll_foutvco", ap_base + 0x1e0, 8, 4, 12, MUX_TYPE_DIV, 3, 15);
+       clks[VENC_CCLK] = thead_clk_light_divider("venc_cclk", "gmac_pll_foutpostdiv", ap_base + 0x1e4, 0, 3, 4, MUX_TYPE_DIV, 2, 7);
+       clks[DPU0_PLL_DIV_CLK] = thead_clk_light_divider("dpu0_pll_div_clk", "dpu0_pll_foutpostdiv", ap_base + 0x1e8, 0, 8, 8, MUX_TYPE_DIV, 2, 214);
+       clks[DPU1_PLL_DIV_CLK] = thead_clk_light_divider("dpu1_pll_div_clk", "dpu1_pll_foutpostdiv", ap_base + 0x1ec, 0, 8, 8, MUX_TYPE_DIV, 2, 214);
+
+       /* Light Fullmask PLL FOUT */
+       clks[GMAC_PLL_FOUT1PH0] = thead_light_clk_fixed_factor("gmac_pll_fout1ph0", "gmac_pll_bypass", 1, 2);
+       clks[GMAC_PLL_FOUT4] = thead_light_clk_fixed_factor("gmac_pll_fout4", "gmac_pll_bypass", 1, 8);
+       clks[VIDEO_PLL_FOUT1PH0] = thead_light_clk_fixed_factor("video_pll_fout1ph0", "video_pll_bypass", 1, 2);
+       clks[VIDEO_PLL_FOUT4] = thead_light_clk_fixed_factor("video_pll_fout4", "video_pll_bypass", 1, 8);
+       clks[TEE_PLL_FOUT4] = thead_light_clk_fixed_factor("tee_pll_fout4", "tee_pll_bypass", 1, 8);
+       clks[CPU_PLL0_FOUT4] = thead_light_clk_fixed_factor("cpu_pll0_fout4", "cpu_pll0_bypass", 1, 8);
+       clks[CPU_PLL1_FOUT4] = thead_light_clk_fixed_factor("cpu_pll1_fout4", "cpu_pll1_bypass", 1, 8);
+       clks[DPU0_PLL_FOUT4] = thead_light_clk_fixed_factor("dpu0_pll_fout4", "dpu0_pll_bypass", 1, 8);
+       clks[DPU1_PLL_FOUT4] = thead_light_clk_fixed_factor("dpu1_pll_fout4", "dpu1_pll_bypass", 1, 8);
+
+       /* Light Fullmask Fixed Factor */
+       clks[C910_OSC_CLK] = thead_light_clk_fixed_factor("c910_osc_clk", "osc_24m", 1, 1);
+       clks[QSPI_SSI_CLK] = thead_light_clk_fixed_factor("qspi_ssi_clk", "video_pll_foutpostdiv", 1, 1);               /* Note: no mux to select, use default value */
+       clks[QSPI0_SSI_CLK] = thead_light_clk_fixed_factor("qspi0_ssi_clk", "qspi_ssi_clk", 1, 1);
+       clks[QSPI1_SSI_CLK] = thead_light_clk_fixed_factor("qspi1_ssi_clk", "video_pll_fout1ph0", 1, 1);
+       clks[SPI_SSI_CLK] = thead_light_clk_fixed_factor("spi_ssi_clk", "video_pll_fout1ph0", 1, 1);
+       clks[EMMC_SDIO_REF_CLK] = thead_light_clk_fixed_factor("emmc_sdio_ref_clk", "video_pll_foutpostdiv", 1, 4);     /* Note: base clk is div 4 to 198M*/
+       clks[PWM_CCLK] = thead_light_clk_fixed_factor("pwm_cclk", "osc_24m", 1, 1);
+       clks[CHIP_DBG_CCLK] = thead_light_clk_fixed_factor("chip_dbg_cclk", "osc_24m", 1, 1);
+       clks[GMAC_CCLK] = thead_light_clk_fixed_factor("gmac_cclk", "gmac_pll_fout1ph0", 1, 1);
+       clks[GPIO0_DBCLK] = thead_light_clk_fixed_factor("gpio0_dbclk", "pad_rtc_clk", 1, 1);
+       clks[GPIO1_DBCLK] = thead_light_clk_fixed_factor("gpio1_dbclk", "pad_rtc_clk", 1, 1);
+       clks[GPIO2_DBCLK] = thead_light_clk_fixed_factor("gpio2_dbclk", "pad_rtc_clk", 1, 1);
+       clks[GPIO3_DBCLK] = thead_light_clk_fixed_factor("gpio3_dbclk", "pad_rtc_clk", 1, 1);
+       clks[CLK_100M] = thead_light_clk_fixed_factor("clk_100m", "gmac_pll_foutpostdiv", 1, 10);
+       clks[I2C_IC_CLK] = thead_light_clk_fixed_factor("i2c_ic_clk", "clk_100m", 1, 2);
+       clks[TIMER_CCLK] = thead_light_clk_fixed_factor("timer_cclk", "osc_24m", 1, 1);
+       clks[AXI4_CPUSYS1_ACLK] = thead_light_clk_fixed_factor("axi4_cpusys1_aclk", "clkgen_c910_bus_clk_no_icg", 1, 1);
+       clks[CPU_BUS_DFTCLK] = thead_light_clk_fixed_factor("cpu_bus_dftclk", "cpu_pll0_foutpostdiv", 1, 2);
+       clks[CPU_PLL0_TEST_CLK] = thead_light_clk_fixed_factor("cpu_pll0_test_clk", "cpu_pll0_fout4", 1, 8);
+       clks[CPU_PLL1_TEST_CLK] = thead_light_clk_fixed_factor("cpu_pll1_test_clk", "cpu_pll1_fout4", 1, 8);
+       clks[DPU0_PLL_TEST_CLK] = thead_light_clk_fixed_factor("dpu0_pll_test_clk", "dpu0_pll_fout4", 1, 8);
+       clks[DPU1_PLL_TEST_CLK] = thead_light_clk_fixed_factor("dpu1_pll_test_clk", "dpu1_pll_fout4", 1, 8);
+       clks[GMAC_PLL_TEST_CLK] = thead_light_clk_fixed_factor("gmac_pll_test_clk", "gmac_pll_fout4", 1, 8);
+       clks[VIDEO_PLL_TEST_CLK] = thead_light_clk_fixed_factor("video_pll_test_clk", "video_pll_fout4", 1, 8);
+       clks[TEE_PLL_TEST_CLK] = thead_light_clk_fixed_factor("tee_pll_test_clk", "tee_pll_fout4", 1, 8);
+       clks[AONSYS_BUS_CLK] = thead_light_clk_fixed_factor("aonsys_bus_clk", "aonsys_hclk", 1, 1);
+
+       /* Light Fullmask Clock Gate */
+       clks[CLKGEN_AHB2_CPUSYS_HCLK] = thead_clk_light_gate("clkgen_ahb2_cpusys_hclk", "ahb2_cpusys_hclk", ap_base + 0x120, 6);
+       clks[CLKGEN_APB3_CPUSYS_HCLK] = thead_clk_light_gate("clkgen_apb3_cpusys_hclk", "ahb2_cpusys_hclk", ap_base + 0x130, 4);
+       clks[CLKGEN_C910_BROM_HCLK] = thead_clk_light_gate("clkgen_c910_brom_hclk", "ahb2_cpusys_hclk", ap_base + 0x100, 4);
+       clks[CLKGEN_SPINLOCK_HCLK] = thead_clk_light_gate("clkgen_spinlock_hclk", "ahb2_cpusys_hclk", ap_base + 0x208, 10);
+       clks[CLKGEN_MBOX0_PCLK] = thead_clk_light_gate("clkgen_mbox0_pclk", "apb3_cpusys_pclk", ap_base + 0x208, 7);
+       clks[CLKGEN_MBOX1_PCLK] = thead_clk_light_gate("clkgen_mbox1_pclk", "apb3_cpusys_pclk", ap_base + 0x208, 6);
+       clks[CLKGEN_MBOX2_PCLK] = thead_clk_light_gate("clkgen_mbox2_pclk", "apb3_cpusys_pclk", ap_base + 0x208, 5);
+       clks[CLKGEN_MBOX3_PCLK] = thead_clk_light_gate("clkgen_mbox3_pclk", "apb3_cpusys_pclk", ap_base + 0x208, 4);
+       clks[CLKGEN_WDT0_PCLK] = thead_clk_light_gate("clkgen_wdt0_pclk", "apb3_cpusys_pclk", ap_base + 0x208, 3);
+       clks[CLKGEN_WDT1_PCLK] = thead_clk_light_gate("clkgen_wdt1_pclk", "apb3_cpusys_pclk", ap_base + 0x208, 2);
+
+       if (teesys)
+               clks[CLKGEN_MISCSYS_TEE_CCLK] = thead_clk_light_gate("clkgen_miscsys_tee_cclk", "teesys_hclk", ap_base + 0x1cc, 25); //just for teesys!!!
+
+       clks[CLKGEN_SRAM_AXI_ACLK_2] = thead_clk_light_gate("clkgen_sram_axi_aclk_2", "axi4_cpusys1_aclk", ap_base + 0x20c, 2);
+       clks[CLKGEN_PERISYS_AHB_HCLK] = thead_clk_light_gate("clkgen_perisys_ahb_hclk", "perisys_ahb_hclk", ap_base + 0x140, 6);
+       clks[CLKGEN_PERISYS_APB1_HCLK] = thead_clk_light_gate("clkgen_perisys_apb1_hclk", "perisys_ahb_hclk", ap_base + 0x150, 9);
+       clks[CLKGEN_PERISYS_APB2_HCLK] = thead_clk_light_gate("clkgen_perisys_apb2_hclk", "perisys_ahb_hclk", ap_base + 0x150, 10);
+       clks[CLKGEN_PERISYS_APB4_HCLK] = thead_clk_light_gate("clkgen_perisys_apb4_hclk", "perisys_ahb_hclk", ap_base + 0x150, 12);
+       clks[CLKGEN_PADCTRL0_APSYS_PCLK] = thead_clk_light_gate("clkgen_padctrl0_apsys_pclk", "perisys_ahb_hclk", ap_base + 0x204, 22);
+       clks[CLKGEN_DSMART_PCLK] = thead_clk_light_gate("clkgen_dsmart_pclk", "peri2sys_apb_pclk", ap_base + 0x204, 23);
+       clks[CLKGEN_PADCTRL1_APSYS_PCLK] = thead_clk_light_gate("clkgen_padctrl1_apsys_pclk", "peri2sys_apb_pclk", ap_base + 0x204, 24);
+       clks[CLKGEN_CLK_OUT_1_CLK] = thead_clk_light_gate("clkgen_clk_out_1_clk", "clk_out_1", ap_base + 0x1b4, 5);
+       clks[CLKGEN_CLK_OUT_2_CLK] = thead_clk_light_gate("clkgen_clk_out_2_clk", "clk_out_2", ap_base + 0x1b8, 5);
+       clks[CLKGEN_CLK_OUT_3_CLK] = thead_clk_light_gate("clkgen_clk_out_3_clk", "clk_out_3", ap_base + 0x1bc, 5);
+       clks[CLKGEN_CLK_OUT_4_CLK] = thead_clk_light_gate("clkgen_clk_out_4_clk", "clk_out_4", ap_base + 0x1c0, 5);
+       clks[CLKGEN_NPUSYS_AXI_ACLK] = thead_clk_light_gate("clkgen_npusys_axi_aclk", "npu_cclk", ap_base + 0x1c8, 5);
+       clks[CLKGEN_SRAM_AXI_ACLK_0] = thead_clk_light_gate("clkgen_sram_axi_aclk_0", "npu_cclk", ap_base + 0x20c, 4);
+       clks[CLKGEN_APB_CPU2CFG_HCLK] = thead_clk_light_gate("clkgen_apb_cpu2cfg_hclk", "cfg_apb_pclk", ap_base + 0x1c4, 5);
+       clks[CLKGEN_SRAM_AXI_ACLK_1] = thead_clk_light_gate("clkgen_sram_axi_aclk_1", "visys_aclk_m", ap_base + 0x20c, 3);
+       clks[CLKGEN_SRAM_AXI_ACLK_3] = thead_clk_light_gate("clkgen_sram_axi_aclk_3", "vpsys_axi_aclk", ap_base + 0x20c, 1);
+       clks[CLKGEN_VPSYS_VENC_CCLK] = thead_clk_light_gate("clkgen_vpsys_venc_cclk", "venc_cclk", ap_base + 0x1e4, 5);
+       clks[CLKGEN_EMMC_SDIO_REF_CLK] = thead_clk_light_gate("clkgen_emmc_sdio_ref_clk", "emmc_sdio_ref_clk", ap_base + 0x204, 30);
+
+       clks[CLKGEN_X2H_CPUSYS_MHCLK] = thead_clk_light_gate_shared("clkgen_x2h_cpusys_mhclk", "ahb2_cpusys_hclk", ap_base + 0x120, 7, &share_cnt_x2h_cpusys_clk_en);
+       clks[CLKGEN_X2H_CPUSYS_ACLK] = thead_clk_light_gate_shared("clkgen_x2h_cpusys_aclk", "cfg_axi_aclk", ap_base + 0x120, 7, &share_cnt_x2h_cpusys_clk_en);
+       clks[CLKGEN_DMAC_CPUSYS_HCLK] = thead_clk_light_gate_shared("clkgen_dmac_cpusys_hclk", "ahb2_cpusys_hclk", ap_base + 0x208, 8, &share_cnt_dmac_cpusys_clk_en);
+       clks[CLKGEN_IOPMP_DMAC_CPUSYS_PCLK] = thead_clk_light_gate_shared("clkgen_iopmp_dmac_cpusys_pclk", "apb3_cpusys_pclk", ap_base + 0x208, 8, &share_cnt_dmac_cpusys_clk_en);
+       clks[CLKGEN_DMAC_CPUSYS_ACLK] = thead_clk_light_gate_shared("clkgen_dmac_cpusys_aclk", "axi4_cpusys2_aclk", ap_base + 0x208, 8, &share_cnt_dmac_cpusys_clk_en);
+       clks[CLKGEN_TIMER0_PCLK] = thead_clk_light_gate_shared("clkgen_timer0_pclk", "apb3_cpusys_pclk", ap_base + 0x208, 1, &share_cnt_timer0_clk_en);
+       clks[CLKGEN_TIMER0_CCLK] = thead_clk_light_gate_shared("clkgen_timer0_cclk", "timer_cclk", ap_base + 0x208, 1, &share_cnt_timer0_clk_en);
+       clks[CLKGEN_TIMER1_PCLK] = thead_clk_light_gate_shared("clkgen_timer1_pclk", "apb3_cpusys_pclk", ap_base + 0x208, 0, &share_cnt_timer1_clk_en);
+       clks[CLKGEN_TIMER1_CCLK] = thead_clk_light_gate_shared("clkgen_timer1_cclk", "timer_cclk", ap_base + 0x208, 0, &share_cnt_timer1_clk_en);
+       clks[CLKGEN_AXI4_CPUSYS2_PCLK] = thead_clk_light_gate_shared("clkgen_axi4_cpusys2_pclk", "apb3_cpusys_pclk", ap_base + 0x134, 5, &share_cnt_axi4_cpusys2_clk_en);
+       clks[CLKGEN_AXI4_CPUSYS2_ACLK] = thead_clk_light_gate_shared("clkgen_axi4_cpusys2_aclk", "axi4_cpusys2_aclk", ap_base + 0x134, 5, &share_cnt_axi4_cpusys2_clk_en);
+       clks[CLKGEN_BMU_C910_PCLK] = thead_clk_light_gate_shared("clkgen_bmu_c910_pclk", "apb3_cpusys_pclk", ap_base + 0x100, 5, &share_cnt_bmu_c910_clk_en);
+       clks[CLKGEN_BMU_C910_ACLK] = thead_clk_light_gate_shared("clkgen_bmu_c910_aclk", "axi4_cpusys1_aclk", ap_base + 0x100, 5, &share_cnt_bmu_c910_clk_en);
+       clks[CLKGEN_IOPMP_AON_PCLK] = thead_clk_light_gate_shared("clkgen_iopmp_aon_pclk", "apb3_cpusys_pclk", ap_base + 0x134, 8, &share_cnt_aon2cpu_a2x_clk_en);
+       clks[CLKGEN_AON2CPU_A2X_ACLK] = thead_clk_light_gate_shared("clkgen_aon2cpu_a2x_aclk", "axi4_cpusys2_aclk", ap_base + 0x134, 8, &share_cnt_aon2cpu_a2x_clk_en);
+       clks[CLKGEN_AON2CPU_A2X_HCLK] = thead_clk_light_gate_shared("clkgen_aon2cpu_a2x_hclk", "aonsys_bus_clk", ap_base + 0x134, 8, &share_cnt_aon2cpu_a2x_clk_en);
+       clks[CLKGEN_IOPMP_CHIP_DBG_PCLK] = thead_clk_light_gate_shared("clkgen_iopmp_chip_dbg_pclk", "apb3_cpusys_pclk", ap_base + 0x208, 9, &share_cnt_chip_dbg_clk_en);
+       clks[CLKGEN_CHIP_DBG_ACLK] = thead_clk_light_gate_shared("clkgen_chip_dbg_aclk", "axi4_cpusys2_aclk", ap_base + 0x208, 9, &share_cnt_chip_dbg_clk_en);
+       clks[CLKGEN_CHIP_DBG_CCLK] = thead_clk_light_gate_shared("clkgen_chip_dbg_cclk", "chip_dbg_cclk", ap_base + 0x208, 9, &share_cnt_chip_dbg_clk_en);
+       clks[CLKGEN_X2X_CPUSYS_ACLK_M] = thead_clk_light_gate_shared("clkgen_x2x_cpusys_aclk_m", "axi4_cpusys2_aclk", ap_base + 0x134, 7, &share_cnt_x2x_cpusys_clk_en);
+       clks[CLKGEN_X2X_CPUSYS_ACLK_S] = thead_clk_light_gate_shared("clkgen_x2x_cpusys_aclk_s", "axi4_cpusys1_aclk", ap_base + 0x134, 7, &share_cnt_x2x_cpusys_clk_en);
+       clks[CLKGEN_CPU2PERI_X2H_ACLK] = thead_clk_light_gate_shared("clkgen_cpu2peri_x2h_aclk", "axi4_cpusys1_aclk", ap_base + 0x140, 9, &share_cnt_cpu2peri_x2h_clk_en);
+       clks[CLKGEN_CPU2PERI_X2H_MHCLK] = thead_clk_light_gate_shared("clkgen_cpu2peri_x2h_mhclk", "perisys_ahb_hclk", ap_base + 0x140, 9, &share_cnt_cpu2peri_x2h_clk_en);
+       clks[CLKGEN_CPU2VI_X2H_ACLK] = thead_clk_light_gate_shared("clkgen_cpu2vi_x2h_aclk", "axi4_cpusys1_aclk", ap_base + 0x1d0, 21, &share_cnt_cpu2vi_x2h_clk_en);
+       clks[CLKGEN_CPU2VI_X2H_MHCLK] = thead_clk_light_gate_shared("clkgen_cpu2vi_x2h_mhclk", "visys_ahb_hclk", ap_base + 0x1d0, 21, &share_cnt_cpu2vi_x2h_clk_en);
+       clks[CLKGEN_CFG2TEE_X2H_ACLK] = thead_clk_light_gate_shared("clkgen_cfg2tee_x2h_aclk", "cfg_axi_aclk", ap_base + 0x1cc, 24, &share_cnt_cfg2tee_x2h_clk_en); // just for teesys!!!
+       clks[CLKGEN_CFG2TEE_X2H_MHCLK] = thead_clk_light_gate_shared("clkgen_cfg2tee_x2h_mhclk", "teesys_hclk", ap_base + 0x1cc, 24, &share_cnt_cfg2tee_x2h_clk_en); // just for teesys!!!
+       clks[CLKGEN_CPU2AON_X2H_ACLK] = thead_clk_light_gate_shared("clkgen_cpu2aon_x2h_aclk", "cfg_axi_aclk", ap_base + 0x138, 8, &share_cnt_cpu2aon_x2h_clk_en);
+       clks[CLKGEN_CPU2AON_X2H_MHCLK] = thead_clk_light_gate_shared("clkgen_cpu2aon_x2h_mhclk", "aonsys_bus_clk", ap_base + 0x138, 8, &share_cnt_cpu2aon_x2h_clk_en);
+       clks[CLKGEN_CPU2VP_X2P_ACLK] = thead_clk_light_gate_shared("clkgen_cpu2vp_x2p_aclk", "cfg_axi_aclk", ap_base + 0x1e0, 13, &share_cnt_cpu2vp_x2p_clk_en);
+       clks[CLKGEN_CPU2VP_X2P_PCLK] = thead_clk_light_gate_shared("clkgen_cpu2vp_x2p_pclk", "vpsys_apb_pclk", ap_base + 0x1e0, 13, &share_cnt_cpu2vp_x2p_clk_en);
+       clks[CLKGEN_TOP_AXI4S_ACLK] = thead_clk_light_gate_shared("clkgen_top_axi4s_aclk", "cfg_axi_aclk", ap_base + 0x1c8, 4, &share_cnt_npu_core_clk_en);
+       clks[CLKGEN_TOP_APB_SX_PCLK] = thead_clk_light_gate_shared("clkgen_top_apb_sx_pclk", "cfg_apb_pclk", ap_base + 0x1c8, 4, &share_cnt_npu_core_clk_en);
+       clks[CLKGEN_MISC2VP_X2X_ACLK_M] = thead_clk_light_gate_shared("clkgen_misc2vp_x2x_aclk_m", "perisys_ahb_hclk", ap_base + 0x1e0, 15, &share_cnt_vpsys_axi_aclk_en);
+       clks[CLKGEN_VPSYS_ACLK] = thead_clk_light_gate_shared("clkgen_vpsys_aclk", "vpsys_axi_aclk", ap_base + 0x1e0, 15, &share_cnt_vpsys_axi_aclk_en);
+       clks[CLKGEN_GMAC1_HCLK] = thead_clk_light_gate_shared("clkgen_gmac1_hclk", "perisys_ahb_hclk", ap_base + 0x204, 26, &share_cnt_gmac1_clk_en);
+       clks[CLKGEN_GMAC1_PCLK] = thead_clk_light_gate_shared("clkgen_gmac1_pclk", "perisys_ahb_hclk", ap_base + 0x204, 26, &share_cnt_gmac1_clk_en);
+       clks[CLKGEN_GMAC1_CCLK] = thead_clk_light_gate_shared("clkgen_gmac1_cclk", "gmac_cclk", ap_base + 0x204, 26, &share_cnt_gmac1_clk_en);
+       clks[CLKGEN_GMAC0_HCLK] = thead_clk_light_gate_shared("clkgen_gmac0_hclk", "perisys_ahb_hclk", ap_base + 0x204, 19, &share_cnt_gmac0_clk_en);
+       clks[CLKGEN_GMAC0_PCLK] = thead_clk_light_gate_shared("clkgen_gmac0_pclk", "perisys_ahb_hclk", ap_base + 0x204, 19, &share_cnt_gmac0_clk_en);
+       clks[CLKGEN_GMAC0_CCLK] = thead_clk_light_gate_shared("clkgen_gmac0_cclk", "gmac_cclk", ap_base + 0x204, 19, &share_cnt_gmac0_clk_en);
+       clks[CLKGEN_PERI2PERI1_APB_HCLK] = thead_clk_light_gate_shared("clkgen_peri2peri1_apb_hclk", "perisys_ahb_hclk", ap_base + 0x150, 11, &share_cnt_perisys_apb3_hclk_en);
+       clks[CLKGEN_PERI2PERI1_APB_PCLK] = thead_clk_light_gate_shared("clkgen_peri2peri1_apb_pclk", "peri2sys_apb_pclk", ap_base + 0x150, 11, &share_cnt_perisys_apb3_hclk_en);
+       clks[CLKGEN_QSPI0_PCLK] = thead_clk_light_gate_shared("clkgen_qspi0_pclk", "perisys_ahb_hclk", ap_base + 0x204, 17, &share_cnt_qspi0_clk_en);
+       clks[CLKGEN_QSPI0_SSI_CLK] = thead_clk_light_gate_shared("clkgen_qspi0_ssi_clk", "qspi0_ssi_clk", ap_base + 0x204, 17, &share_cnt_qspi0_clk_en);
+       clks[CLKGEN_GMAC_AXI_ACLK] = thead_clk_light_gate_shared("clkgen_gmac_axi_aclk", "perisys_ahb_hclk", ap_base + 0x204, 21, &share_cnt_gmac_axi_clk_en);
+       clks[CLKGEN_GMAC_AXI_PCLK] = thead_clk_light_gate_shared("clkgen_gmac_axi_pclk", "perisys_ahb_hclk", ap_base + 0x204, 21, &share_cnt_gmac_axi_clk_en);
+       clks[CLKGEN_GPIO0_PCLK] = thead_clk_light_gate_shared("clkgen_gpio0_pclk", "perisys_ahb_hclk", ap_base + 0x204, 8, &share_cnt_gpio0_clk_en);
+       clks[CLKGEN_GPIO0_DBCLK] = thead_clk_light_gate_shared("clkgen_gpio0_dbclk", "gpio0_dbclk", ap_base + 0x204, 8, &share_cnt_gpio0_clk_en);
+       clks[CLKGEN_GPIO1_PCLK] = thead_clk_light_gate_shared("clkgen_gpio1_pclk", "perisys_ahb_hclk", ap_base + 0x204, 7, &share_cnt_gpio0_clk_en);
+       clks[CLKGEN_GPIO1_DBCLK] = thead_clk_light_gate_shared("clkgen_gpio1_dbclk", "gpio1_dbclk", ap_base + 0x204, 7, &share_cnt_gpio1_clk_en);
+       clks[CLKGEN_PWM_PCLK] = thead_clk_light_gate_shared("clkgen_pwm_pclk", "perisys_apb_pclk", ap_base + 0x204, 18, &share_cnt_pwm_clk_en);
+       clks[CLKGEN_PWM_CCLK] = thead_clk_light_gate_shared("clkgen_pwm_cclk", "pwm_cclk", ap_base + 0x204, 18, &share_cnt_pwm_clk_en);
+       clks[CLKGEN_SPI_PCLK] = thead_clk_light_gate_shared("clkgen_spi_pclk", "perisys_apb_pclk", ap_base + 0x204, 15, &share_cnt_spi_clk_en);
+       clks[CLKGEN_SPI_SSI_CLK] = thead_clk_light_gate_shared("clkgen_spi_ssi_clk", "spi_ssi_clk", ap_base + 0x204, 15, &share_cnt_spi_clk_en);
+       clks[CLKGEN_UART0_PCLK] = thead_clk_light_gate_shared("clkgen_uart0_pclk", "perisys_apb_pclk", ap_base + 0x204, 14, &share_cnt_uart0_clk_en);
+       clks[CLKGEN_UART0_SCLK] = thead_clk_light_gate_shared("clkgen_uart0_sclk", "uart_sclk", ap_base + 0x204, 14, &share_cnt_uart0_clk_en);
+       clks[CLKGEN_UART2_PCLK] = thead_clk_light_gate_shared("clkgen_uart2_pclk", "perisys_apb_pclk", ap_base + 0x204, 12, &share_cnt_uart2_clk_en);
+       clks[CLKGEN_UART2_SCLK] = thead_clk_light_gate_shared("clkgen_uart2_sclk", "uart_sclk", ap_base + 0x204, 12, &share_cnt_uart2_clk_en);
+       clks[CLKGEN_I2C2_PCLK] = thead_clk_light_gate_shared("clkgen_i2c2_pclk", "perisys_apb_pclk", ap_base + 0x204, 3, &share_cnt_i2c2_clk_en);
+       clks[CLKGEN_I2C2_IC_CLK] = thead_clk_light_gate_shared("clkgen_i2c2_ic_clk", "i2c_ic_clk", ap_base + 0x204, 3, &share_cnt_i2c2_clk_en);
+       clks[CLKGEN_I2C3_PCLK] = thead_clk_light_gate_shared("clkgen_i2c3_pclk", "perisys_apb_pclk", ap_base + 0x204, 2, &share_cnt_i2c3_clk_en);
+       clks[CLKGEN_I2C3_IC_CLK] = thead_clk_light_gate_shared("clkgen_i2c3_ic_clk", "i2c_ic_clk", ap_base + 0x204, 2, &share_cnt_i2c3_clk_en);
+       clks[CLKGEN_I2S_PCLK] = thead_clk_light_gate_shared("clkgen_i2s_pclk", "perisys_apb_pclk", ap_base + 0x1f0, 1, &share_cnt_peri_i2s_clk_en);
+       clks[CLKGEN_I2S_SRC_CLK] = thead_clk_light_gate_shared("clkgen_i2s_src_clk", "peri_i2s_src_clk", ap_base + 0x1f0, 1, &share_cnt_peri_i2s_clk_en);
+       clks[CLKGEN_QSPI1_PCLK] = thead_clk_light_gate_shared("clkgen_qspi1_pclk", "peri2sys_apb_pclk", ap_base + 0x204, 16, &share_cnt_qspi1_clk_en);
+       clks[CLKGEN_QSPI1_SSI_CLK] = thead_clk_light_gate_shared("clkgen_qspi1_ssi_clk", "qspi1_ssi_clk", ap_base + 0x204, 16, &share_cnt_qspi1_clk_en);
+       clks[CLKGEN_UART1_PCLK] = thead_clk_light_gate_shared("clkgen_uart1_pclk", "per2sys_apb_pclk", ap_base + 0x204, 13, &share_cnt_uart1_clk_en);
+       clks[CLKGEN_UART1_SCLK] = thead_clk_light_gate_shared("clkgen_uart1_sclk", "uart_sclk", ap_base + 0x204, 13, &share_cnt_uart1_clk_en);
+       clks[CLKGEN_UART3_PCLK] = thead_clk_light_gate_shared("clkgen_uart3_pclk", "peri2sys_apb_pclk", ap_base + 0x204, 11, &share_cnt_uart3_clk_en);
+       clks[CLKGEN_UART3_SCLK] = thead_clk_light_gate_shared("clkgen_uart3_sclk", "uart_sclk", ap_base + 0x204, 11, &share_cnt_uart3_clk_en);
+       clks[CLKGEN_UART4_PCLK] = thead_clk_light_gate_shared("clkgen_uart4_pclk", "peri2sys_apb_pclk", ap_base + 0x204, 10, &share_cnt_uart4_clk_en);
+       clks[CLKGEN_UART4_SCLK] = thead_clk_light_gate_shared("clkgen_uart4_sclk", "uart_sclk", ap_base + 0x204, 10, &share_cnt_uart4_clk_en);
+       clks[CLKGEN_UART5_PCLK] = thead_clk_light_gate_shared("clkgen_uart5_pclk", "peri2sys_apb_pclk", ap_base + 0x204, 9, &share_cnt_uart5_clk_en);
+       clks[CLKGEN_UART5_SCLK] = thead_clk_light_gate_shared("clkgen_uart5_sclk", "uart_sclk", ap_base + 0x204, 9, &share_cnt_uart5_clk_en);
+       clks[CLKGEN_I2C0_PCLK] = thead_clk_light_gate_shared("clkgen_i2c0_pclk", "peri2sys_apb_pclk", ap_base + 0x204, 5, &share_cnt_i2c0_clk_en);
+       clks[CLKGEN_I2C0_IC_CLK] = thead_clk_light_gate_shared("clkgen_i2c0_ic_clk", "i2c_ic_clk", ap_base + 0x204, 5, &share_cnt_i2c0_clk_en);
+       clks[CLKGEN_I2C1_PCLK] = thead_clk_light_gate_shared("clkgen_i2c1_pclk", "peri2sys_apb_pclk", ap_base + 0x204, 4, &share_cnt_i2c1_clk_en);
+       clks[CLKGEN_I2C1_IC_CLK] = thead_clk_light_gate_shared("clkgen_i2c1_ic_clk", "i2c_ic_clk", ap_base + 0x204, 4, &share_cnt_i2c1_clk_en);
+       clks[CLKGEN_I2C4_PCLK] = thead_clk_light_gate_shared("clkgen_i2c4_pclk", "peri2sys_apb_pclk", ap_base + 0x204, 1, &share_cnt_i2c4_clk_en);
+       clks[CLKGEN_I2C4_IC_CLK] = thead_clk_light_gate_shared("clkgen_i2c4_ic_clk", "i2c_ic_clk", ap_base + 0x204, 1, &share_cnt_i2c4_clk_en);
+       clks[CLKGEN_I2C5_PCLK] = thead_clk_light_gate_shared("clkgen_i2c5_pclk", "peri2sys_apb_pclk", ap_base + 0x204, 0, &share_cnt_i2c5_clk_en);
+       clks[CLKGEN_I2C5_IC_CLK] = thead_clk_light_gate_shared("clkgen_i2c5_ic_clk", "i2c_ic_clk", ap_base + 0x204, 0, &share_cnt_i2c5_clk_en);
+       clks[CLKGEN_GPIO2_PCLK] = thead_clk_light_gate_shared("clkgen_gpio2_pclk", "peri2sys_apb_pclk", ap_base + 0x204, 6, &share_cnt_gpio2_clk_en);
+       clks[CLKGEN_GPIO2_DBCLK] = thead_clk_light_gate_shared("clkgen_gpio2_dbclk", "gpio2_dbclk", ap_base + 0x204, 6, &share_cnt_gpio2_clk_en);
+       clks[CLKGEN_GPIO3_PCLK] = thead_clk_light_gate_shared("clkgen_gpio3_pclk", "peri2sys_apb_pclk", ap_base + 0x204, 6, &share_cnt_gpio2_clk_en); //!!! gpio3 pclk is controlled by gpio2_clk_en
+       clks[CLKGEN_GPIO3_DBCLK] = thead_clk_light_gate_shared("clkgen_gpio3_dbclk", "gpio3_dbclk", ap_base + 0x204, 20, &share_cnt_gpio3_clk_en);
+       clks[CLKGEN_VOSYS_AXI_ACLK] = thead_clk_light_gate_shared("clkgen_vosys_axi_aclk", "vosys_aclk_m", ap_base + 0x1dc, 5, &share_cnt_vosys_axi_aclk_en);
+       clks[CLKGEN_VOSYS_X2X_ACLK_S] = thead_clk_light_gate_shared("clkgen_vosys_x2x_aclk_s", "npu_cclk", ap_base + 0x1dc, 5, &share_cnt_vosys_axi_aclk_en);
+
+       clk_data.clks = clks;
+       clk_data.clk_num = ARRAY_SIZE(clks);
+
+       ret = of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data);
+       if (ret < 0) {
+               dev_err(dev, "failed to register clks for light\n");
+               goto unregister_clks;
+       }
+
+#ifndef FPGA_EMU
+       /* HW defalut */
+       clk_set_parent(clks[C910_CCLK], clks[CPU_PLL1_FOUTPOSTDIV]);
+#else
+       clk_set_parent(clks[C910_CCLK_I0], clks[OSC_24M]);
+       clk_set_parent(clks[C910_CCLK], clks[C910_CCLK_I0]);
+#endif
+       dev_info(dev, "succeed to register light fullmask clock driver\n");
+
+       return 0;
+
+unregister_clks:
+       thead_unregister_clocks(clks, ARRAY_SIZE(clks));
+       return ret;
+}
+
+
+const bool tee_sys_flag;
+
+static const struct of_device_id light_clk_of_match[] = {
+       { .compatible = "thead,light-fm-ree-clk" },
+       { .compatible = "thead,light-fm-tee-clk", .data = &tee_sys_flag,},
+       { /* Sentinel */ },
+};
+MODULE_DEVICE_TABLE(of, light_clk_of_match);
+
+static struct platform_driver light_clk_driver = {
+       .probe = light_clocks_probe,
+       .driver = {
+               .name = "light-fm-clk",
+               .of_match_table = of_match_ptr(light_clk_of_match),
+       },
+};
+
+module_platform_driver(light_clk_driver);
+MODULE_AUTHOR("wei.liu <lw312886@linux.alibaba.com>");
+MODULE_DESCRIPTION("Thead Light Fullmask clock driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/clk/thead/clk-light-mpw.c b/drivers/clk/thead/clk-light-mpw.c
new file mode 100644 (file)
index 0000000..f7356dd
--- /dev/null
@@ -0,0 +1,492 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2021 Alibaba Group Holding Limited.
+ */
+
+#include <dt-bindings/clock/light-mpw-clock.h>
+#include <linux/clk.h>
+#include <linux/err.h>
+#include <linux/init.h>
+#include <linux/io.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/platform_device.h>
+#include <linux/types.h>
+
+#include "clk.h"
+
+static struct clk *clks[LIGHT_CLK_END];
+static struct clk_onecell_data clk_data;
+
+static u32 share_cnt_cpu2cfg_x2x_clk_en;
+static u32 share_cnt_cpu2peri_x2h_clk_en;
+static u32 share_cnt_aon2cpu_a2x_clk_en;
+static u32 share_cnt_dmac_clk_en;
+static u32 share_cnt_x2h_cpusys_clk_en;
+static u32 share_cnt_cpu2tee_x2h_clk_en;
+static u32 share_cnt_cpu2aon_x2h_clk_en;
+static u32 share_cnt_cpu2cfg_x2h_clk_en;
+static u32 share_cnt_timer0_clk_en;
+static u32 share_cnt_timer1_clk_en;
+static u32 share_cnt_peri2ddr_x2x_clk_en;
+static u32 share_cnt_usb3_drd_clk_en;
+static u32 share_cnt_gmac_clk_en;
+static u32 share_cnt_emmc0_clk_en;
+static u32 share_cnt_emmc1_clk_en;
+static u32 share_cnt_pwm_clk_en;
+static u32 share_cnt_qspi0_clk_en;
+static u32 share_cnt_qspi1_clk_en;
+static u32 share_cnt_spi_clk_en;
+static u32 share_cnt_gpio0_clk_en;
+static u32 share_cnt_gpio1_clk_en;
+static u32 share_cnt_gpio2_clk_en;
+static u32 share_cnt_dmac_1_clk_en;
+static u32 share_cnt_dmac_2_clk_en;
+static u32 share_cnt_dmac_3_clk_en;
+
+#ifdef THEAD_LIGHT_AON_CLK
+static const char * const audio_pll_bypass_sels[] = {"audio_pll_foutpostdiv", "osc_24m", };
+static const char * const sys_pll_bypass_sels[] = {"sys_pll_foutpostdiv", "osc_24m", };
+#endif
+#ifdef THEAD_LIGHT_DDR_CLK
+static const char * const ddr_pll_bypass_sels[] = {"ddr_pll_foutpostdiv", "osc_24m", };
+#endif
+static const char * const cpu_pll0_bypass_sels[] = {"cpu_pll0_foutpostdiv", "osc_24m", };
+static const char * const cpu_pll1_bypass_sels[] = {"cpu_pll1_foutpostdiv", "osc_24m", };
+static const char * const gmac_pll_bypass_sels[] = {"gmac_pll_foutpostdiv", "osc_24m", };
+static const char * const video_pll_bypass_sels[] = {"video_pll_foutpostdiv", "osc_24m", };
+
+#ifdef THEAD_LIGHT_AON_CLK
+static const char * const aonsys_clk_switch_0_sels[] = {"audio_pll_fout3", "osc_24m", };
+static const char * const aonsys_clk_switch_1_sels[] = {"aonsys_clk_switch_0", "rc_24m", };
+#endif
+
+static const char * const c910_cclk_i0_sels[] = {"cpu_pll0_bypass", "osc_24m", };
+static const char * const c910_cclk_sels[] = {"c910_cclk_i0", "cpu_pll1_foutpostdiv", };
+static const char * const cpusys_ahb_hclk_sel[] = {"cpusys_ahb_hclk_div", "osc_24m"};
+static const char * const cpusys_cfg_axi_aclk_sel[] = {"cpusys_cfg_axi_aclk_div", "osc_24m"};
+static const char * const perisys_ahb_hclk_sel[] = {"perisys_ahb_hclk_div", "osc_24m"};
+static const char * const clk_out_1_sel[] = {"clk_out_1_div", "osc_24m"};
+static const char * const clk_out_2_sel[] = {"clk_out_2_div", "osc_24m"};
+static const char * const clk_out_3_sel[] = {"clk_out_3_div", "osc_24m"};
+static const char * const clk_out_4_sel[] = {"clk_out_4_div", "osc_24m"};
+
+static const struct light_pll_rate_table light_audiopll_tbl[] = {
+       LIGHT_PLL_RATE(2654208000U, 147456000U, 1, 110, 9932112,  6, 3),
+       LIGHT_PLL_RATE(884736000U,  294912000U, 1, 36,  14495600, 3, 1),
+};
+
+static const struct light_pll_rate_table light_syspll_tbl[] = {
+       LIGHT_PLL_RATE(2438553600U, 812851200U, 1, 101, 10173704, 3, 1),
+       LIGHT_PLL_RATE(884736000U,  294912000U, 1, 36,  14495600, 3, 1),
+};
+
+static const struct light_pll_rate_table light_cpupll_tbl[] = {
+       LIGHT_PLL_RATE(1800000000U, 1800000000U, 1, 75,  0, 1, 1),
+       LIGHT_PLL_RATE(3000000000U, 1500000000U, 1, 125, 0, 2, 1),
+       LIGHT_PLL_RATE(3000000000U, 1000000000U, 1, 125, 0, 3, 1),
+       LIGHT_PLL_RATE(3000000000U, 125000000U, 1, 125,  0, 6, 4),
+};
+
+#ifdef THEAD_LIGHT_DDR_CLK
+static const struct light_pll_rate_table light_ddrpll_tbl[] = {
+       LIGHT_PLL_RATE(3192000000U, 798000000U, 1, 133, 0, 4, 1),
+       LIGHT_PLL_RATE(3192000000U, 532000000U, 1, 133, 0, 6, 1),
+       LIGHT_PLL_RATE(2112000000U, 1056000000U, 1, 88, 0, 2, 1),
+};
+#endif
+
+#ifdef THEAD_LIGHT_AON_CLK
+static struct light_pll_clk light_audio_pllvco = {
+       .out_type = LIGHT_PLL_VCO,
+       .clk_type = LIGHT_AUDIO_PLL,
+       .rate_table = light_audiopll_tbl,
+       .rate_count = ARRAY_SIZE(light_audiopll_tbl),
+};
+
+static struct light_pll_clk light_audio_plldiv = {
+       .out_type = LIGHT_PLL_DIV,
+       .clk_type = LIGHT_AUDIO_PLL,
+       .rate_table = light_audiopll_tbl,
+       .rate_count = ARRAY_SIZE(light_audiopll_tbl),
+};
+
+static struct light_pll_clk light_sys_pllvco = {
+       .out_type = LIGHT_PLL_VCO,
+       .clk_type = LIGHT_SYS_PLL,
+       .rate_table = light_syspll_tbl,
+       .rate_count = ARRAY_SIZE(light_syspll_tbl),
+};
+
+static struct light_pll_clk light_sys_plldiv = {
+       .out_type = LIGHT_PLL_DIV,
+       .clk_type = LIGHT_SYS_PLL,
+       .rate_table = light_syspll_tbl,
+       .rate_count = ARRAY_SIZE(light_syspll_tbl),
+};
+#endif
+
+static struct light_pll_clk light_cpu_pll0vco = {
+       .out_type = LIGHT_PLL_VCO,
+       .clk_type = LIGHT_CPU_PLL0,
+       .rate_table = light_cpupll_tbl,
+       .rate_count = ARRAY_SIZE(light_cpupll_tbl),
+};
+
+static struct light_pll_clk light_cpu_pll0div = {
+       .out_type = LIGHT_PLL_DIV,
+       .clk_type = LIGHT_CPU_PLL0,
+       .rate_table = light_cpupll_tbl,
+       .rate_count = ARRAY_SIZE(light_cpupll_tbl),
+};
+
+static struct light_pll_clk light_cpu_pll1vco = {
+       .out_type = LIGHT_PLL_VCO,
+       .clk_type = LIGHT_CPU_PLL1,
+       .rate_table = light_cpupll_tbl,
+       .rate_count = ARRAY_SIZE(light_cpupll_tbl),
+};
+
+static struct light_pll_clk light_cpu_pll1div = {
+       .out_type = LIGHT_PLL_DIV,
+       .clk_type = LIGHT_CPU_PLL1,
+       .rate_table = light_cpupll_tbl,
+       .rate_count = ARRAY_SIZE(light_cpupll_tbl),
+};
+
+#ifdef THEAD_LIGHT_DDR_CLK
+static struct light_pll_clk light_ddr_pllvco = {
+       .out_type = LIGHT_PLL_VCO,
+       .clk_type = LIGHT_DDR_PLL,
+       .rate_table = light_ddrpll_tbl,
+       .rate_count = ARRAY_SIZE(light_ddrpll_tbl),
+};
+
+static struct light_pll_clk light_ddr_plldiv = {
+       .out_type = LIGHT_PLL_DIV,
+       .clk_type = LIGHT_DDR_PLL,
+       .rate_table = light_ddrpll_tbl,
+       .rate_count = ARRAY_SIZE(light_ddrpll_tbl),
+};
+#endif
+
+static int light_clocks_probe(struct platform_device *pdev)
+{
+       struct device *dev = &pdev->dev;
+       struct device_node *np = dev->of_node;
+       void __iomem *ap_base;
+#ifdef THEAD_LIGHT_DDR_CLK
+       void __iomem *ddr_base;
+#endif
+#ifdef THEAD_LIGHT_AON_CLK
+       void __iomem *aon_base;
+#endif
+       int ret;
+
+#ifdef THEAD_LIGHT_AON_CLK
+       np = of_find_compatible_node(NULL, NULL, "thead,light-aon-clk");
+       aon_base = of_iomap(np, 0);
+       if (WARN_ON(!aon_base)) {
+               ret = -ENOMEM;
+               goto unregister_clks;
+       }
+       of_node_put(np);
+#endif
+
+       /* Clock source */
+       clks[LIGHT_CLK_DUMMY] = thead_clk_fixed("dummy", 0);
+       clks[LIGHT_CLK_32K] = of_clk_get_by_name(np, "osc_32k");
+       clks[LIGHT_CLK_24M] = of_clk_get_by_name(np, "osc_24m");
+       clks[LIGHT_RC_24M] = of_clk_get_by_name(np, "rc_24m");
+
+       /* AP Fixed PLL */
+       clks[LIGHT_VIDEO_PLL_FOUTVCO] = thead_clk_fixed("video_pll_foutvco", 2376000000);
+       clks[LIGHT_VIDEO_PLL_FOUTPOSTDIV] = thead_clk_fixed("video_pll_foutpostdiv", 796000000);
+       clks[LIGHT_GMAC_PLL_FOUTVCO] = thead_clk_fixed("gmac_pll_foutvco", 2000000000);
+       clks[LIGHT_GMAC_PLL_FOUTPOSTDIV] = thead_clk_fixed("gmac_pll_foutpostdiv", 1000000000);
+
+#ifdef THEAD_LIGHT_AON_CLK
+       /* Aon PLL clocks */
+       clks[LIGHT_AUDIO_PLL_FOUTVCO] = thead_light_pll("audio_pll_foutvco", "osc_24m", aon_base, &light_audio_pllvco);
+       clks[LIGHT_AUDIO_PLL_FOUTPOSTDIV] = thead_light_pll("audio_pll_foutpostdiv", "osc_24m", aon_base, &light_audio_plldiv);
+       clks[LIGHT_SYS_PLL_FOUTVCO] = thead_light_pll("sys_pll_foutvco", "osc_24m", aon_base, &light_sys_pllvco);
+       clks[LIGHT_SYS_PLL_FOUTPOSTDIV] = thead_light_pll("sys_pll_foutpostdiv", "osc_24m", aon_base, &light_sys_plldiv);
+#endif
+
+#ifdef THEAD_LIGHT_DDR_CLK
+       np = of_find_compatible_node(NULL, NULL, "thead,light-ddr-clk");
+       ddr_base = of_iomap(np, 0);
+       if (WARN_ON(!ddr_base)) {
+               ret = -ENOMEM;
+               goto unregister_clks;
+       }
+       of_node_put(np);
+
+       /* DDR PLL */
+       clks[LIGHT_DDR_PLL_FOUTVCO] = thead_light_pll("ddr_pll_foutvco", "osc_24m", ddr_base, &light_ddr_pllvco);
+       clks[LIGHT_DDR_PLL_FOUTPOSTDIV] = thead_light_pll("ddr_pll_foutpostdiv", "osc_24m", ddr_base, &light_ddr_plldiv);
+#endif
+
+       np = dev->of_node;
+       ap_base = devm_platform_ioremap_resource(pdev, 0);
+       if (WARN_ON(IS_ERR(ap_base))) {
+               ret = PTR_ERR(ap_base);
+               goto unregister_clks;
+       }
+
+       /* AP PLL clocks */
+       clks[LIGHT_CPU_PLL0_FOUTVCO] = thead_light_pll("cpu_pll0_foutvco", "osc_24m", ap_base, &light_cpu_pll0vco);
+       clks[LIGHT_CPU_PLL0_FOUTPOSTDIV] = thead_light_pll("cpu_pll0_foutpostdiv", "osc_24m", ap_base, &light_cpu_pll0div);
+       clks[LIGHT_CPU_PLL1_FOUTVCO] = thead_light_pll("cpu_pll1_foutvco", "osc_24m", ap_base, &light_cpu_pll1vco);
+       clks[LIGHT_CPU_PLL1_FOUTPOSTDIV] = thead_light_pll("cpu_pll1_foutpostdiv", "osc_24m", ap_base, &light_cpu_pll1div);
+
+       /* PLL bypass */
+#ifdef THEAD_LIGHT_AON_CLK
+       clks[LIGHT_AUDIO_PLL_BYPASS] = thead_light_clk_mux_flags("audio_pll_bypass", aon_base + 0x4, 31, 1, audio_pll_bypass_sels, ARRAY_SIZE(audio_pll_bypass_sels), CLK_SET_RATE_PARENT);
+       clks[LIGHT_SYS_PLL_BYPASS] = thead_light_clk_mux_flags("sys_pll_bypass", aon_base + 0x14, 31, 1, sys_pll_bypass_sels, ARRAY_SIZE(sys_pll_bypass_sels), CLK_SET_RATE_PARENT);
+#endif
+#ifdef THEAD_LIGHT_DDR_CLK
+       clks[LIGHT_DDR_PLL_BYPASS] = thead_light_clk_mux_flags("ddr_pll_bypass", ddr_base + 0xc, 31, 1, ddr_pll_bypass_sels, ARRAY_SIZE(ddr_pll_bypass_sels), CLK_SET_RATE_PARENT);
+#endif
+       clks[LIGHT_CPU_PLL0_BYPASS] = thead_light_clk_mux_flags("cpu_pll0_bypass", ap_base + 0x4, 31, 1, cpu_pll0_bypass_sels, ARRAY_SIZE(cpu_pll0_bypass_sels), CLK_SET_RATE_PARENT);
+       clks[LIGHT_CPU_PLL1_BYPASS] = thead_light_clk_mux_flags("cpu_pll1_bypass", ap_base + 0x14, 31, 1, cpu_pll1_bypass_sels, ARRAY_SIZE(cpu_pll1_bypass_sels), CLK_SET_RATE_PARENT);
+       clks[LIGHT_GMAC_PLL_BYPASS] = thead_light_clk_mux_flags("gmac_pll_bypass", ap_base + 0x24, 31, 1, gmac_pll_bypass_sels, ARRAY_SIZE(gmac_pll_bypass_sels), CLK_SET_RATE_PARENT);
+       clks[LIGHT_VIDEO_PLL_BYPASS] = thead_light_clk_mux_flags("video_pll_bypass", ap_base + 0x34, 31, 1, video_pll_bypass_sels, ARRAY_SIZE(video_pll_bypass_sels), CLK_SET_RATE_PARENT);
+
+       /* PLL FOUT */
+#ifdef THEAD_LIGHT_AON_CLK
+       clks[LIGHT_AUDIO_PLL_FOUT3] = thead_light_clk_fixed_factor("audio_pll_fout3", "audio_pll_bypass", 1, 6);
+       clks[LIGHT_SYS_PLL_FOUT4] = thead_light_clk_fixed_factor("sys_pll_fout4", "sys_pll_bypass", 1, 8);
+#endif
+#ifdef THEAD_LIGHT_DDR_CLK
+       clks[LIGHT_DDR_PLL_FOUT4] = thead_light_clk_fixed_factor("ddr_pll_fout4", "ddr_pll_bypass", 1, 8);
+#endif
+       clks[LIGHT_CPU_PLL0_FOUT4] = thead_light_clk_fixed_factor("cpu_pll0_fout4", "cpu_pll0_bypass", 1, 8);
+       clks[LIGHT_CPU_PLL1_FOUT4] = thead_light_clk_fixed_factor("cpu_pll1_fout4", "cpu_pll1_bypass", 1, 8);
+       clks[LIGHT_GMAC_PLL_FOUT1PH0] = thead_light_clk_fixed_factor("gmac_pll_fout1ph0", "gmac_pll_bypass", 1, 2);
+       clks[LIGHT_GMAC_CORECLK] = thead_light_clk_fixed_factor("gmac_coreclk", "gmac_pll_fout1ph0", 1, 1);
+       clks[LIGHT_GMAC_PLL_FOUT4] = thead_light_clk_fixed_factor("gmac_pll_fout4", "gmac_pll_bypass", 1, 8);
+       clks[LIGHT_VIDEO_PLL_FOUT4] = thead_light_clk_fixed_factor("video_pll_fout4", "video_pll_bypass", 1, 8);
+       clks[LIGHT_GMAC_PLL_FOUTVCO_DIV5] = thead_light_clk_fixed_factor("gmac_pll_foutvco_div5", "gmac_pll_foutvco", 1, 5);
+       clks[LIGHT_OSC_CLK_DIV24] = thead_light_clk_fixed_factor("osc_clk_div24", "osc_24m", 1, 24);
+       clks[LIGHT_CHIP_DBG_CCLK] = thead_light_clk_fixed_factor("chip_dbg_cclk", "osc_24m", 1, 1);
+       clks[LIGHT_AXI_ACLK] = thead_light_clk_fixed_factor("cpusys_axi_aclk", "cpu_pll0_bypass", 1, 2);
+       clks[LIGHT_X2H_HCLK] = thead_light_clk_fixed_factor("aonsys_x2h_hclk", "osc_24m", 1, 1);
+       clks[LIGHT_EMMC_CLK_DIV] = thead_light_clk_fixed_factor("emmc_clk_div", "video_pll_bypass", 1, 4);
+       clks[LIGHT_EMMC0_OSC_CLK] = thead_light_clk_fixed_factor("emmc0_osc_clk", "osc_24m", 1, 1);
+       clks[LIGHT_EMMC1_OSC_CLK] = thead_light_clk_fixed_factor("emmc1_osc_clk", "osc_24m", 1, 1);
+       clks[LIGHT_PWM_CCLK] = thead_light_clk_fixed_factor("pwm_cclk", "osc_24m", 1, 1);
+       clks[LIGHT_USB3_PHY_REF_CLK] = thead_light_clk_fixed_factor("usb3_phy_ref_clk", "osc_24m", 1, 1);
+       clks[LIGHT_SPI_CLK] = thead_light_clk_fixed_factor("spi_clk", "gmac_pll_foutvco_div5", 1, 1);
+       clks[LIGHT_GPIO_DBCLK] = thead_light_clk_fixed_factor("gpio_dbclk", "osc_32k", 1, 1);
+
+#ifdef THEAD_LIGHT_AON_CLK
+       /* Aon sys mux tree */
+       clks[LIGHT_AONSYS_CLK_SWITCH_0] = thead_light_clk_mux_flags("aonsys_clk_switch_0", aon_base + 0x100, 4, 1, aonsys_clk_switch_0_sels, ARRAY_SIZE(aonsys_clk_switch_0_sels), CLK_SET_RATE_PARENT);
+       clks[LIGHT_AONSYS_CLK_SWITCH_1] = thead_light_clk_mux_flags("aonsys_clk_switch_1", aon_base + 0x100, 5, 1, aonsys_clk_switch_1_sels, ARRAY_SIZE(aonsys_clk_switch_1_sels), CLK_SET_RATE_PARENT);
+
+       /* Aon sys div tree */
+       clks[LIGHT_AONSYS_CLK] = thead_clk_light_divider("aonsys_clk", "aonsys_clk_switch_1", aon_base + 0x100, 0, 3, 3, MUX_TYPE_CDE, 0, 7);
+       clks[LIGHT_SHARE_SRAM_CLK] = thead_clk_light_divider("share_sram_clk", "sys_pll_foutvco", aon_base + 0x104, 0, 4, 4, MUX_TYPE_DIV, 3, 12);
+
+       /* Aon sys gate tree */
+       clks[LIGHT_CLKGEN_RTC_PCLK] = thead_clk_light_gate("rtc_pclk_en", "aonsys_clk", aon_base + 0x120, 0);
+       clks[LIGHT_CLKGEN_AOGPIO_PCLK] = thead_clk_light_gate("aogpio_pclk_en", "aonsys_clk", aon_base + 0x120, 1);
+       clks[LIGHT_CLKGEN_AOI2C_PCLK] = thead_clk_light_gate("aoi2c_pclk_en", "aonsys_clk", aon_base + 0x120, 2);
+       clks[LIGHT_CLKGEN_PVTC_PCLK] = thead_clk_light_gate("pvtc_pclk_en", "aonsys_clk", aon_base + 0x120, 3);
+       clks[LIGHT_CLKGEN_SRAM_AXI_ACLK] = thead_clk_light_gate("share_sram_clk_en", "aonsys_clk", aon_base + 0x120, 4);
+       clks[LIGHT_CLKGEN_AOPAD_PCLK] = thead_clk_light_gate("aopad_pclk_en", "aonsys_clk", aon_base + 0x120, 5);
+       clks[LIGHT_CLKGEN_AOAPB_HCLK] = thead_clk_light_gate("aoapb_hclk_en", "aonsys_clk", aon_base + 0x120, 6);
+       clks[LIGHT_CLKGEN_AOSRAM_HCLK] = thead_clk_light_gate("aosram_hclk_en", "aonsys_clk", aon_base + 0x120, 7);
+       clks[LIGHT_CLKGEN_AOAHB_HCLK] = thead_clk_light_gate("aoahb_hclk_en", "aonsys_clk", aon_base + 0x120, 8);
+       clks[LIGHT_CLKGEN_AOGPIO_DBCLK] = thead_clk_light_gate("aogpio_dbclk_en", "aonsys_clk", aon_base + 0x120, 9);
+       clks[LIGHT_CLKGEN_AOTIMER_PCLK] = thead_clk_light_gate("aotimer_pclk_en", "aonsys_clk", aon_base + 0x120, 10);
+       clks[LIGHT_CLKGEN_AOTIMER_CCLK] = thead_clk_light_gate("aotimer_cclk_en", "aonsys_clk", aon_base + 0x120, 11);
+       clks[LIGHT_CLKGEN_CPU2RAM_X2X_ACLK_S] = thead_clk_light_gate("apsys_clk_en", "aonsys_clk", aon_base + 0x130, 0);
+#endif
+
+       /* AP sys mux tree */
+       clks[LIGHT_C910_CCLK_I0] = thead_light_clk_mux_flags("c910_cclk_i0", ap_base + 0x100, 1, 1, c910_cclk_i0_sels, ARRAY_SIZE(c910_cclk_i0_sels), CLK_SET_RATE_PARENT);
+       clks[LIGHT_C910_CCLK] = thead_light_clk_mux_flags("c910_cclk", ap_base + 0x100, 0, 1, c910_cclk_sels, ARRAY_SIZE(c910_cclk_sels), CLK_SET_RATE_PARENT);
+       clks[LIGHT_CPUSYS_AHB_HCLK] = thead_light_clk_mux_flags("cpusys_ahb_hclk", ap_base + 0x120, 5, 1, cpusys_ahb_hclk_sel, ARRAY_SIZE(cpusys_ahb_hclk_sel), CLK_SET_RATE_PARENT);
+       clks[LIGHT_CPUSYS_CFG_AXI_ACLK] = thead_light_clk_mux_flags("cpusys_cfg_axi_aclk", ap_base + 0x138, 5, 1, cpusys_cfg_axi_aclk_sel, ARRAY_SIZE(cpusys_cfg_axi_aclk_sel), CLK_SET_RATE_PARENT);
+       clks[LIGHT_PERISYS_AHB_HCLK] = thead_light_clk_mux_flags("perisys_ahb_hclk", ap_base + 0x40, 5, 1, perisys_ahb_hclk_sel, ARRAY_SIZE(perisys_ahb_hclk_sel), CLK_SET_RATE_PARENT);
+       clks[LIGHT_CLK_OUT_1] = thead_light_clk_mux_flags("clk_out_1", ap_base + 0x1b4, 4, 1, clk_out_1_sel, ARRAY_SIZE(clk_out_1_sel), CLK_SET_RATE_PARENT);
+       clks[LIGHT_CLK_OUT_2] = thead_light_clk_mux_flags("clk_out_2", ap_base + 0x1b8, 4, 1, clk_out_2_sel, ARRAY_SIZE(clk_out_2_sel), CLK_SET_RATE_PARENT);
+       clks[LIGHT_CLK_OUT_3] = thead_light_clk_mux_flags("clk_out_3", ap_base + 0x1bc, 4, 1, clk_out_3_sel, ARRAY_SIZE(clk_out_3_sel), CLK_SET_RATE_PARENT);
+       clks[LIGHT_CLK_OUT_4] = thead_light_clk_mux_flags("clk_out_4", ap_base + 0x1c0, 4, 1, clk_out_4_sel, ARRAY_SIZE(clk_out_4_sel), CLK_SET_RATE_PARENT);
+
+       /* AP sys div tree */
+       clks[LIGHT_CPUSYS_AHB_HCLK_DIV] = thead_clk_light_divider("cpusys_ahb_hclk_div", "gmac_pll_fout1ph0", ap_base + 0x120, 0, 4, 4, MUX_TYPE_DIV, 2, 8);
+       clks[LIGHT_APB3_CPUSYS_PCLK] = thead_clk_light_divider("apb3_cpusys_pclk", "cpusys_ahb_hclk", ap_base + 0x130, 0, 3, 3, MUX_TYPE_CDE, 1, 7);
+       clks[LIGHT_CPUSYS_SUB_AXI_ACLK] = thead_clk_light_divider("cpusys_sub_axi_aclk", "gmac_pll_bypass", ap_base + 0x134, 0, 4, 4, MUX_TYPE_DIV, 2, 8);
+       clks[LIGHT_CPUSYS_CFG_AXI_ACLK_DIV] = thead_clk_light_divider("cpusys_cfg_axi_aclk_div", "gmac_pll_bypass", ap_base + 0x138, 0, 4, 4, MUX_TYPE_DIV, 8, 15);
+       clks[LIGHT_TEESYS_HCLK] = thead_clk_light_divider("teesys_hclk", "gmac_pll_fout1ph0", ap_base + 0x154, 0, 2, 2, MUX_TYPE_DIV, 2, 3);
+       clks[LIGHT_DMAC_1_CLK] = thead_clk_light_divider("dmac_1_clk", "video_pll_bypass", ap_base + 0x158, 0, 2, 2, MUX_TYPE_CDE, 0, 7);
+       clks[LIGHT_DMAC_2_CLK] = thead_clk_light_divider("dmac_2_clk", "video_pll_bypass", ap_base + 0x16c, 0, 2, 2, MUX_TYPE_CDE, 0, 7);
+       clks[LIGHT_DMAC_3_CLK] = thead_clk_light_divider("dmac_3_clk", "gmac_pll_bypass", ap_base + 0x160, 0, 2, 2, MUX_TYPE_CDE, 0, 7);
+       clks[LIGHT_AXI_PORT4_CLK] = thead_clk_light_divider("axi_port4_clk", "video_pll_bypass", ap_base + 0x164, 0, 2, 2, MUX_TYPE_CDE, 0, 7);
+       clks[LIGHT_PERISYS_AHB_HCLK_DIV] = thead_clk_light_divider("perisys_ahb_hclk_div", "gmac_pll_fout1ph0", ap_base + 0x140, 0, 4, 4, MUX_TYPE_DIV, 2, 8);
+       clks[LIGHT_PERISYS_APB_PCLK] = thead_clk_light_divider("perisys_apb_pclk", "perisys_ahb_hclk", ap_base + 0x150, 0, 3, 3, MUX_TYPE_CDE, 3, 7);
+       clks[LIGHT_CLK_OUT_1_DIV] = thead_clk_light_divider("clk_out_1_div", "osc_24m", ap_base + 0x1b4, 0, 3, 3, MUX_TYPE_DIV, 2, 7);
+       clks[LIGHT_CLK_OUT_2_DIV] = thead_clk_light_divider("clk_out_2_div", "osc_24m", ap_base + 0x1b8, 0, 3, 3, MUX_TYPE_DIV, 2, 7);
+       clks[LIGHT_CLK_OUT_3_DIV] = thead_clk_light_divider("clk_out_3_div", "osc_24m", ap_base + 0x1bc, 0, 3, 3, MUX_TYPE_DIV, 2, 7);
+       clks[LIGHT_CLK_OUT_4_DIV] = thead_clk_light_divider("clk_out_4_div", "osc_24m", ap_base + 0x1c0, 0, 3, 3, MUX_TYPE_DIV, 2, 7);
+
+       /* AP sys gate tree */
+       clks[LIGHT_CLKGEN_PERISYS_AXI_ACLK] = thead_clk_light_gate("clkgen_perisys_axi_aclk", "perisys_ahb_hclk", ap_base + 0x200, 31);
+       clks[LIGHT_CLKGEN_PERISYS_AHB_HCLK] = thead_clk_light_gate("clkgen_perisys_ahb_hclk", "perisys_ahb_hclk", ap_base + 0x200, 30);
+       clks[LIGHT_CLKGEN_PERISYS_APB1_HCLK] = thead_clk_light_gate("clkgen_perisys_apb1_hclk", "perisys_ahb_hclk", ap_base + 0x200, 29);
+       clks[LIGHT_CLKGEN_PERISYS_APB2_HCLK] = thead_clk_light_gate("clkgen_perisys_apb2_hclk", "perisys_ahb_hclk", ap_base + 0x200, 28);
+       clks[LIGHT_CLKGEN_USB3_DRD_PHY_REF_CLK] = thead_clk_light_gate("clkgen_usb3_drd_phy_ref_clk", "usb3_phy_ref_clk", ap_base + 0x200, 27);
+       clks[LIGHT_CLKGEN_USB3_DRD_CTRL_REF_CLK] = thead_clk_light_gate("clkgen_usb3_drd_ctrl_ref_clk", "usb3_ctrl_ref_clk", ap_base + 0x200, 26);
+       clks[LIGHT_CLKGEN_USB3_DRD_SPDCLK] = thead_clk_light_gate("clkgen_usb3_drd_spdclk", "osc_clk_div24", ap_base + 0x200, 25);
+       clks[LIGHT_CLKGEN_EMMC1_X2X_ACLK] = thead_clk_light_gate("clkgen_emmc1_x2x_aclk", "perisys_ahb_hclk", ap_base + 0x200, 23);
+       clks[LIGHT_CLKGEN_EMMC0_X2X_ACLK] = thead_clk_light_gate("clkgen_emmc0_x2x_aclk", "perisys_ahb_hclk", ap_base + 0x200, 22);
+       clks[LIGHT_CLKGEN_UART0_PCLK] = thead_clk_light_gate("clkgen_uart0_pclk", "perisys_apb_pclk", ap_base + 0x200, 14);
+       clks[LIGHT_CLKGEN_UART1_PCLK] = thead_clk_light_gate("clkgen_uart1_pclk", "perisys_apb_pclk", ap_base + 0x200, 13);
+       clks[LIGHT_CLKGEN_UART2_PCLK] = thead_clk_light_gate("clkgen_uart2_pclk", "perisys_apb_pclk", ap_base + 0x200, 12);
+       clks[LIGHT_CLKGEN_UART3_PCLK] = thead_clk_light_gate("clkgen_uart3_pclk", "perisys_apb_pclk", ap_base + 0x200, 11);
+       clks[LIGHT_CLKGEN_UART4_PCLK] = thead_clk_light_gate("clkgen_uart4_pclk", "perisys_apb_pclk", ap_base + 0x200, 10);
+       clks[LIGHT_CLKGEN_UART5_PCLK] = thead_clk_light_gate("clkgen_uart5_pclk", "perisys_apb_pclk", ap_base + 0x200, 9);
+       clks[LIGHT_CLKGEN_I2C0_IC_CLK] = thead_clk_light_gate("clkgen_i2c0_ic_clk", "perisys_apb_pclk", ap_base + 0x200, 5);
+       clks[LIGHT_CLKGEN_I2C1_IC_CLK] = thead_clk_light_gate("clkgen_i2c1_ic_clk", "perisys_apb_pclk", ap_base + 0x200, 4);
+       clks[LIGHT_CLKGEN_I2C2_IC_CLK] = thead_clk_light_gate("clkgen_i2c2_ic_clk", "perisys_apb_pclk", ap_base + 0x200, 3);
+       clks[LIGHT_CLKGEN_I2C3_IC_CLK] = thead_clk_light_gate("clkgen_i2c3_ic_clk", "perisys_apb_pclk", ap_base + 0x200, 2);
+       clks[LIGHT_CLKGEN_I2C4_IC_CLK] = thead_clk_light_gate("clkgen_i2c4_ic_clk", "perisys_apb_pclk", ap_base + 0x200, 1);
+       clks[LIGHT_CLKGEN_I2C5_IC_CLK] = thead_clk_light_gate("clkgen_i2c5_ic_clk", "perisys_apb_pclk", ap_base + 0x200, 0);
+
+       clks[LIGHT_CLKGEN_AXI_DUMMY_SLV_4_ACLK] = thead_clk_light_gate("clkgen_axi_dummy_slv_4_aclk", "cpusys_cfg_axi_aclk", ap_base + 0x204, 28);
+       clks[LIGHT_CLKGEN_AXI_DUMMY_SLV_3_ACLK] = thead_clk_light_gate("clkgen_axi_dummy_slv_3_aclk", "cpusys_cfg_axi_aclk", ap_base + 0x204, 27);
+       clks[LIGHT_CLKGEN_AXI_DUMMY_SLV_2_ACLK] = thead_clk_light_gate("clkgen_axi_dummy_slv_2_aclk", "cpusys_cfg_axi_aclk", ap_base + 0x204, 26);
+       clks[LIGHT_CLKGEN_AXI_DUMMY_SLV_1_ACLK] = thead_clk_light_gate("clkgen_axi_dummy_slv_1_aclk", "cpusys_cfg_axi_aclk", ap_base + 0x204, 25);
+       clks[LIGHT_CLKGEN_APB_CPU2FG_HCLK] = thead_clk_light_gate("clkgen_apb_cpu2cfg_hclk", "cpusys_cfg_axi_aclk", ap_base + 0x204, 24);
+       clks[LIGHT_CLKGEN_CPU2RAM_X2X_ACLK_M] = thead_clk_light_gate("clkgen_cpu2ram_x2x_aclk_m", "cpusys_axi_aclk", ap_base + 0x204, 21);
+       clks[LIGHT_CLKGEN_AXI4_CPUSYS2_ACLK] = thead_clk_light_gate("clkgen_axi4_cpusys2_aclk", "cpusys_sub_axi_aclk", ap_base + 0x204, 20);
+       clks[LIGHT_CLKGEN_X2X_CPUSYS_ACLK_M] = thead_clk_light_gate("clkgen_x2x_cpusys_aclk_m", "cpusys_sub_axi_aclk", ap_base + 0x204, 19);
+       clks[LIGHT_CLKGEN_CHIP_DBG_ACLK] = thead_clk_light_gate("clkgen_chip_dbg_aclk", "cpusys_sub_axi_aclk", ap_base + 0x204, 18);
+       clks[LIGHT_CLKGEN_AXI4_CFG_BUS_ACLK] = thead_clk_light_gate("clkgen_axi4_cfg_bus_aclk", "cpusys_cfg_axi_aclk", ap_base + 0x204, 17);
+       clks[LIGHT_CLKGEN_AHB2_CPUSYS_HCLK] = thead_clk_light_gate("clkgen_ahb2_cpusys_hclk", "cpusys_ahb_hclk", ap_base + 0x204, 11);
+       clks[LIGHT_CLKGEN_APB3_CPUSYS_HCLK] = thead_clk_light_gate("clkgen_apb3_cpusys_hclk", "cpusys_ahb_hclk", ap_base + 0x204, 10);
+       clks[LIGHT_CLKGEN_C910_BROM_HCLK] = thead_clk_light_gate("clkgen_c910_brom_hclk", "cpusys_ahb_hclk", ap_base + 0x204, 9);
+       clks[LIGHT_CLKGEN_MBOX0_PCLK] = thead_clk_light_gate("clkgen_mbox0_pclk", "apb3_cpusys_pclk", ap_base + 0x204, 7);
+       clks[LIGHT_CLKGEN_MBOX1_PCLK] = thead_clk_light_gate("clkgen_mbox1_pclk", "apb3_cpusys_pclk", ap_base + 0x204, 6);
+       clks[LIGHT_CLKGEN_MBOX2_PCLK] = thead_clk_light_gate("clkgen_mbox2_pclk", "apb3_cpusys_pclk", ap_base + 0x204, 5);
+       clks[LIGHT_CLKGEN_MBOX3_PCLK] = thead_clk_light_gate("clkgen_mbox3_pclk", "apb3_cpusys_pclk", ap_base + 0x204, 4);
+       clks[LIGHT_CLKGEN_WDT0_PCLK] = thead_clk_light_gate("clkgen_wdt0_pclk", "apb3_cpusys_pclk", ap_base + 0x204, 3);
+       clks[LIGHT_CLKGEN_WDT1_PCLK] = thead_clk_light_gate("clkgen_wdt1_pclk", "apb3_cpusys_pclk", ap_base + 0x204, 2);
+
+       clks[LIGHT_CLKGEN_TRNG_RB_HCLK] = thead_clk_light_gate("clkgen_trng_rb_hclk", "teesys_hclk", ap_base + 0x208, 19);
+       clks[LIGHT_CLKGEN_ADC_PCLK] = thead_clk_light_gate("clkgen_adc_pclk", "perisys_apb_pclk", ap_base + 0x208, 18);
+       clks[LIGHT_CLKGEN_AXI_ACLK_4] = thead_clk_light_gate("axi_aclk_4", "axi_port4_clk", ap_base + 0x208, 17);
+       clks[LIGHT_CLKGEN_AXI_ACLK_3] = thead_clk_light_gate("axi_aclk_3", "dmac_3_clk", ap_base + 0x208, 16);
+       clks[LIGHT_CLKGEN_AXI_ACLK_2] = thead_clk_light_gate("axi_aclk_2", "dmac_2_clk", ap_base + 0x208, 15);
+       clks[LIGHT_CLKGEN_AXI_ACLK_1] = thead_clk_light_gate("axi_aclk_1", "dmac_1_clk", ap_base + 0x208, 14);
+       clks[LIGHT_CLKGEN_AXI_ACLK_0] = thead_clk_light_gate("axi_aclk_0", "cpusys_axi_aclk", ap_base + 0x208, 13);
+       clks[LIGHT_CLKGEN_SRAM_AXI_PCLK] = thead_clk_light_gate("clkgen_sram_axi_pclk", "cpusys_cfg_axi_aclk", ap_base + 0x208, 9);
+       clks[LIGHT_CLKGEN_AHB2_TEESYS_HCLK] = thead_clk_light_gate("clkgen_ahb2_teesys_hclk", "teesys_hclk", ap_base + 0x208, 8);
+       clks[LIGHT_CLKGEN_EFUSE_MPW_PCLK] = thead_clk_light_gate("clkgen_efuse_mpw_pclk", "perisys_apb_pclk", ap_base + 0x208, 7);
+       clks[LIGHT_CLKGEN_CLK_OUT_4_CLK] = thead_clk_light_gate("clkgen_clk_out_4_clk", "clk_out_4", ap_base + 0x208, 6);
+       clks[LIGHT_CLKGEN_CLK_OUT_3_CLK] = thead_clk_light_gate("clkgen_clk_out_3_clk", "clk_out_3", ap_base + 0x208, 5);
+       clks[LIGHT_CLKGEN_CLK_OUT_2_CLK] = thead_clk_light_gate("clkgen_clk_out_2_clk", "clk_out_2", ap_base + 0x208, 4);
+       clks[LIGHT_CLKGEN_CLK_OUT_1_CLK] = thead_clk_light_gate("clkgen_clk_out_1_clk", "clk_out_1", ap_base + 0x208, 3);
+       clks[LIGHT_CLKGEN_DDR_APB_PCLK] = thead_clk_light_gate("clkgen_ddr_apb_pclk", "cpusys_cfg_axi_aclk", ap_base + 0x208, 2);
+       clks[LIGHT_CLKGEN_PADCTRL_APSYS_PCLK] = thead_clk_light_gate("clkgen_padctrl_apsys_pclk", "cpusys_cfg_axi_aclk", ap_base + 0x208, 1);
+       clks[LIGHT_CLKGEN_CHIP_DBG_CCLK] = thead_clk_light_gate("clkgen_chip_dbg_cclk", "chip_dbg_cclk", ap_base + 0x208, 0);
+
+       /* register AP shared gate */
+       clks[LIGHT_CLKGEN_CPU2CFG_X2X_ACLK_M] = thead_clk_light_gate_shared("clkgen_cpu2cfg_x2x_aclk_m", "cpusys_axi_aclk", ap_base + 0x204, 22, &share_cnt_cpu2cfg_x2x_clk_en);
+       clks[LIGHT_CLKGEN_CPU2CFG_X2X_ACLK_S] = thead_clk_light_gate_shared("clkgen_cpu2cfg_x2x_aclk_s", "cpusys_cfg_axi_aclk", ap_base + 0x204, 22, &share_cnt_cpu2cfg_x2x_clk_en);
+       clks[LIGHT_CLKGEN_CPU2PERI_X2H_MHCLK] = thead_clk_light_gate_shared("clkgen_cpu2peri_x2h_mhclk", "perisys_ahb_hclk", ap_base + 0x204, 12, &share_cnt_cpu2peri_x2h_clk_en);
+       clks[LIGHT_CLKGEN_CPU2CFG_X2H_ACLK_S] = thead_clk_light_gate_shared("clkgen_cpu2peri_x2h_aclk", "cpusys_axi_aclk", ap_base + 0x204, 12, &share_cnt_cpu2peri_x2h_clk_en);
+       clks[LIGHT_CLKGEN_AON2CPU_A2X_ACLK] = thead_clk_light_gate_shared("clkgen_aon2cpu_a2x_aclk", "cpusys_sub_axi_aclk", ap_base + 0x204, 23, &share_cnt_aon2cpu_a2x_clk_en);
+       clks[LIGHT_CLKGEN_AON2CPU_A2X_HCLK] = thead_clk_light_gate_shared("clkgen_aon2cpu_a2x_hclk", "aonsys_x2h_hclk", ap_base + 0x204, 23, &share_cnt_aon2cpu_a2x_clk_en);
+       clks[LIGHT_CLKGEN_DMAC_ACLK] = thead_clk_light_gate_shared("clkgen_dmac_aclk", "cpusys_sub_axi_aclk", ap_base + 0x204, 8, &share_cnt_dmac_clk_en);
+       clks[LIGHT_CLKGEN_DMAC_HCLK] = thead_clk_light_gate_shared("clkgen_dmac_hclk", "cpusys_ahb_hclk", ap_base + 0x204, 8, &share_cnt_dmac_clk_en);
+       clks[LIGHT_CLKGEN_X2H_CPUSYS_ACLK] = thead_clk_light_gate_shared("clkgen_x2h_cpusys_aclk", "cpusys_cfg_axi_aclk", ap_base + 0x204, 16, &share_cnt_x2h_cpusys_clk_en);
+       clks[LIGHT_CLKGEN_X2H_CPUSYS_MHCLK] = thead_clk_light_gate_shared("clkgen_x2h_cpusys_mhclk", "cpusys_ahb_hclk", ap_base + 0x204, 16, &share_cnt_x2h_cpusys_clk_en);
+       clks[LIGHT_CLKGEN_CPU2TEE_X2H_ACLK] = thead_clk_light_gate_shared("clkgen_cpu2tee_x2h_aclk", "cpusys_cfg_axi_aclk", ap_base + 0x204, 15, &share_cnt_cpu2tee_x2h_clk_en);
+       clks[LIGHT_CLKGEN_CPU2TEE_X2H_MHCLK] = thead_clk_light_gate_shared("clkgen_cpu2tee_x2h_mhclk", "teesys_hclk", ap_base + 0x204, 15, &share_cnt_cpu2tee_x2h_clk_en);
+       clks[LIGHT_CLKGEN_CPU2AON_X2H_ACLK] = thead_clk_light_gate_shared("clkgen_cpu2aon_x2h_aclk", "cpusys_cfg_axi_aclk", ap_base + 0x204, 14, &share_cnt_cpu2aon_x2h_clk_en);
+       clks[LIGHT_CLKGEN_CPU2AON_X2H_MHCLK] = thead_clk_light_gate_shared("clkgen_cpu2aon_x2h_mhclk", "aonsys_x2h_hclk", ap_base + 0x204, 14, &share_cnt_cpu2aon_x2h_clk_en);
+       clks[LIGHT_CLKGEN_CPU2CFG_X2H_ACLK] = thead_clk_light_gate_shared("clkgen_cpu2cfg_x2h_aclk", "cpusys_cfg_axi_aclk", ap_base + 0x204, 13, &share_cnt_cpu2cfg_x2h_clk_en);
+       clks[LIGHT_CLKGEN_CPU2CFG_X2H_MHCLK] = thead_clk_light_gate_shared("clkgen_cpu2cfg_x2h_mhclk", "cpusys_cfg_axi_aclk", ap_base + 0x204, 13, &share_cnt_cpu2cfg_x2h_clk_en);
+       clks[LIGHT_CLKGEN_TIMER0_CCLK] = thead_clk_light_gate_shared("clkgen_timer0_cclk", "apb3_cpusys_pclk", ap_base + 0x204, 1, &share_cnt_timer0_clk_en);
+       clks[LIGHT_CLKGEN_TIMER0_PCLK] = thead_clk_light_gate_shared("clkgen_timer0_pclk", "apb3_cpusys_pclk", ap_base + 0x204, 1, &share_cnt_timer0_clk_en);
+       clks[LIGHT_CLKGEN_TIMER1_CCLK] = thead_clk_light_gate_shared("clkgen_timer1_cclk", "apb3_cpusys_pclk", ap_base + 0x204, 0, &share_cnt_timer1_clk_en);
+       clks[LIGHT_CLKGEN_TIMER1_PCLK] = thead_clk_light_gate_shared("clkgen_timer1_pclk", "apb3_cpusys_pclk", ap_base + 0x204, 0, &share_cnt_timer1_clk_en);
+       clks[LIGHT_CLKGEN_PERI2DDR_X2X_ACLK_M] = thead_clk_light_gate_shared("clkgen_peri2ddr_x2x_aclk_m", "perisys_ahb_hclk", ap_base + 0x204, 29, &share_cnt_peri2ddr_x2x_clk_en);
+       clks[LIGHT_CLKGEN_PERI2DDR_X2X_ACLK_S] = thead_clk_light_gate_shared("clkgen_peri2ddr_x2x_aclk_s", "axi_port4_clk", ap_base + 0x204, 29, &share_cnt_peri2ddr_x2x_clk_en);
+       clks[LIGHT_CLKGEN_USB3_DRD_ACLK] = thead_clk_light_gate_shared("clkgen_usb3_drd_aclk", "perisys_ahb_hclk", ap_base + 0x200, 24, &share_cnt_usb3_drd_clk_en);
+       clks[LIGHT_CLKGEN_USB3_DRD_PCLK] = thead_clk_light_gate_shared("clkgen_usb3_drd_pclk", "perisys_apb_pclk", ap_base + 0x200, 24, &share_cnt_usb3_drd_clk_en);
+       clks[LIGHT_CLKGEN_GMAC_HCLK] = thead_clk_light_gate_shared("clkgen_gmac_hclk", "perisys_ahb_hclk", ap_base + 0x200, 19, &share_cnt_gmac_clk_en);
+       clks[LIGHT_CLKGEN_GMAC_ACLK] = thead_clk_light_gate_shared("clkgen_gmac_aclk", "perisys_ahb_hclk", ap_base + 0x200, 19, &share_cnt_gmac_clk_en);
+       clks[LIGHT_CLKGEN_GMAC_PCLK] = thead_clk_light_gate_shared("clkgen_gmac_pclk", "perisys_apb_pclk", ap_base + 0x200, 19, &share_cnt_gmac_clk_en);
+       clks[LIGHT_CLKGEN_GMAC_CCLK] = thead_clk_light_gate_shared("clkgen_gmac_cclk", "gmac_coreclk", ap_base + 0x200, 19, &share_cnt_gmac_clk_en);
+       clks[LIGHT_CLKGEN_EMMC0_HCLK] = thead_clk_light_gate_shared("clkgen_emmc0_hclk", "perisys_ahb_hclk", ap_base + 0x200, 21, &share_cnt_emmc0_clk_en);
+       clks[LIGHT_CLKGEN_EMMC0_ACLK] = thead_clk_light_gate_shared("clkgen_emmc0_aclk", "perisys_ahb_hclk", ap_base + 0x200, 21, &share_cnt_emmc0_clk_en);
+       clks[LIGHT_CLKGEN_EMMC0_REF_CLK] = thead_clk_light_gate_shared("clkgen_emmc0_ref_clk", "emmc_clk_div", ap_base + 0x200, 21, &share_cnt_emmc0_clk_en);
+       clks[LIGHT_CLKGEN_EMMC0_OSC_CLK] = thead_clk_light_gate_shared("clkgen_emmc0_osc_clk", "emmc0_osc_clk", ap_base + 0x200, 21, &share_cnt_emmc0_clk_en);
+       clks[LIGHT_CLKGEN_EMMC1_HCLK] = thead_clk_light_gate_shared("clkgen_emmc1_hclk", "perisys_ahb_hclk", ap_base + 0x200, 20, &share_cnt_emmc1_clk_en);
+       clks[LIGHT_CLKGEN_EMMC1_ACLK] = thead_clk_light_gate_shared("clkgen_emmc1_aclk", "perisys_ahb_hclk", ap_base + 0x200, 20, &share_cnt_emmc1_clk_en);
+       clks[LIGHT_CLKGEN_EMMC1_REF_CLK] = thead_clk_light_gate_shared("clkgen_emmc1_ref_clk", "emmc_clk_div", ap_base + 0x200, 20, &share_cnt_emmc1_clk_en);
+       clks[LIGHT_CLKGEN_EMMC1_OSC_CLK] = thead_clk_light_gate_shared("clkgen_emmc1_osc_clk", "emmc1_osc_clk", ap_base + 0x200, 20, &share_cnt_emmc1_clk_en);
+       clks[LIGHT_CLKGEN_PWM_PCLK] = thead_clk_light_gate_shared("clkgen_pwm_pclk", "perisys_ahb_hclk", ap_base + 0x200, 18, &share_cnt_pwm_clk_en);
+       clks[LIGHT_CLKGEN_PWM_CCLK] = thead_clk_light_gate_shared("clkgen_pwm_cclk", "pwm_cclk", ap_base + 0x200, 18, &share_cnt_pwm_clk_en);
+       clks[LIGHT_CLKGEN_QSPI0_PCLK] = thead_clk_light_gate_shared("clkgen_qspi0_pclk", "perisys_apb_pclk", ap_base + 0x200, 17, &share_cnt_qspi0_clk_en);
+       clks[LIGHT_CLKGEN_QSPI0_SSI_CLK] = thead_clk_light_gate_shared("clkgen_qspi0_ssi_clk", "spi_clk", ap_base + 0x200, 17, &share_cnt_qspi0_clk_en);
+       clks[LIGHT_CLKGEN_QSPI1_PCLK] = thead_clk_light_gate_shared("clkgen_qspi1_pclk", "perisys_apb_pclk", ap_base + 0x200, 16, &share_cnt_qspi1_clk_en);
+       clks[LIGHT_CLKGEN_QSPI1_SSI_CLK] = thead_clk_light_gate_shared("clkgen_qspi1_ssi_clk", "spi_clk", ap_base + 0x200, 16, &share_cnt_qspi0_clk_en);
+       clks[LIGHT_CLKGEN_SPI_PCLK] = thead_clk_light_gate_shared("clkgen_spi_pclk", "perisys_apb_pclk", ap_base + 0x200, 15, &share_cnt_spi_clk_en);
+       clks[LIGHT_CLKGEN_SPI_SSI_CLK] = thead_clk_light_gate_shared("clkgen_spi_ssi_clk", "spi_clk", ap_base + 0x200, 15, &share_cnt_spi_clk_en);
+       clks[LIGHT_CLKGEN_GPIO0_PCLK] = thead_clk_light_gate_shared("clkgen_gpio0_pclk", "perisys_apb_pclk", ap_base + 0x200, 8, &share_cnt_gpio0_clk_en);
+       clks[LIGHT_CLKGEN_GPIO0_DBCLK] = thead_clk_light_gate_shared("clkgen_gpio0_dbclk", "gpio_dbclk", ap_base + 0x200, 8, &share_cnt_gpio0_clk_en);
+       clks[LIGHT_CLKGEN_GPIO1_PCLK] = thead_clk_light_gate_shared("clkgen_gpio1_pclk", "perisys_apb_pclk", ap_base + 0x200, 7, &share_cnt_gpio1_clk_en);
+       clks[LIGHT_CLKGEN_GPIO1_DBCLK] = thead_clk_light_gate_shared("clkgen_gpio1_dbclk", "gpio_dbclk", ap_base + 0x200, 7, &share_cnt_gpio1_clk_en);
+       clks[LIGHT_CLKGEN_GPIO2_PCLK] = thead_clk_light_gate_shared("clkgen_gpio2_pclk", "perisys_apb_pclk", ap_base + 0x200, 6, &share_cnt_gpio2_clk_en);
+       clks[LIGHT_CLKGEN_GPIO2_DBCLK] = thead_clk_light_gate_shared("clkgen_gpio2_dbclk", "gpio_dbclk", ap_base + 0x200, 6, &share_cnt_gpio2_clk_en);
+       clks[LIGHT_CLKGEN_DMAC_1_ACLK] = thead_clk_light_gate_shared("clkgen_dmac_1_aclk", "dmac_1_clk", ap_base + 0x208, 12, &share_cnt_dmac_1_clk_en);
+       clks[LIGHT_CLKGEN_DMAC_1_HCLK] = thead_clk_light_gate_shared("clkgen_dmac_1_hclk", "teesys_hclk", ap_base + 0x208, 12, &share_cnt_dmac_1_clk_en);
+       clks[LIGHT_CLKGEN_DMAC_2_ACLK] = thead_clk_light_gate_shared("clkgen_dmac_2_aclk", "dmac_2_clk", ap_base + 0x208, 11, &share_cnt_dmac_2_clk_en);
+       clks[LIGHT_CLKGEN_DMAC_2_HCLK] = thead_clk_light_gate_shared("clkgen_dmac_2_hclk", "teesys_hclk", ap_base + 0x208, 11, &share_cnt_dmac_2_clk_en);
+       clks[LIGHT_CLKGEN_DMAC_3_ACLK] = thead_clk_light_gate_shared("clkgen_dmac_3_aclk", "dmac_3_clk", ap_base + 0x208, 10, &share_cnt_dmac_3_clk_en);
+       clks[LIGHT_CLKGEN_DMAC_3_HCLK] = thead_clk_light_gate_shared("clkgen_dmac_3_hclk", "teesys_hclk", ap_base + 0x208, 10, &share_cnt_dmac_3_clk_en);
+
+       clk_data.clks = clks;
+       clk_data.clk_num = ARRAY_SIZE(clks);
+       ret = of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data);
+
+       if (ret < 0) {
+               dev_err(dev, "failed to register clks for light\n");
+               goto unregister_clks;
+       }
+
+       /* HW defalut */
+       clk_set_parent(clks[LIGHT_C910_CCLK], clks[LIGHT_CPU_PLL1_FOUTPOSTDIV]);
+
+       return 0;
+
+unregister_clks:
+       thead_unregister_clocks(clks, ARRAY_SIZE(clks));
+       return ret;
+}
+
+static const struct of_device_id light_clk_of_match[] = {
+       { .compatible = "thead,light-mpw-clk" },
+       { /* Sentinel */ },
+};
+MODULE_DEVICE_TABLE(of, light_clk_of_match);
+
+static struct platform_driver light_clk_driver = {
+       .probe = light_clocks_probe,
+       .driver = {
+               .name = "light-mpw-clk",
+               .of_match_table = of_match_ptr(light_clk_of_match),
+       },
+};
+
+module_platform_driver(light_clk_driver);
+MODULE_AUTHOR("fugang.duan <duanfugang.dfg@linux.alibaba.com>");
+MODULE_DESCRIPTION("Thead Light MPW clock driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/clk/thead/clk.c b/drivers/clk/thead/clk.c
new file mode 100644 (file)
index 0000000..2e181a9
--- /dev/null
@@ -0,0 +1,739 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2021 Alibaba Group Holding Limited.
+ */
+#include <linux/clk.h>
+#include <linux/clk-provider.h>
+#include <linux/err.h>
+#include <linux/io.h>
+#include <linux/iopoll.h>
+#include <linux/of.h>
+#include <linux/slab.h>
+#include <linux/spinlock.h>
+
+#include "clk.h"
+
+#define LIGHT_PLL_CFG0         0x0
+#define LIGHT_PLL_CFG1         0x04
+#define LIGHT_PLL_CFG2         0x8
+#define LIGHT_POSTDIV2_SHIFT   24
+#define LIGHT_POSTDIV2_MASK    GENMASK(26, 24)
+#define LIGHT_POSTDIV1_SHIFT   20
+#define LIGHT_POSTDIV1_MASK    GENMASK(22, 20)
+#define LIGHT_FBDIV_SHIFT      8
+#define LIGHT_FBDIV_MASK       GENMASK(19, 8)
+#define LIGHT_REFDIV_SHIFT     0
+#define LIGHT_REFDIV_MASK      GENMASK(5, 0)
+#define LIGHT_BYPASS_MASK      BIT(30)
+#define LIGHT_RST_MASK         BIT(29)
+#define LIGHT_DSMPD_MASK       BIT(24)
+#define LIGHT_DACPD_MASK       BIT(25)
+#define LIGHT_FRAC_MASK                GENMASK(23, 0)
+#define LIGHT_FRAC_SHIFT       0
+#define LIGHT_FRAC_DIV         BIT(24)
+
+#define LOCK_TIMEOUT_US                10000
+
+#define div_mask(d)    ((1 << (d->width)) - 1)
+
+DEFINE_SPINLOCK(thead_light_clk_lock);
+
+enum light_pll_mode {
+        PLL_MODE_FRAC,
+        PLL_MODE_INT,
+};
+
+struct clk_lightpll {
+       struct clk_hw                   hw;
+       void __iomem                    *base;
+       enum light_pll_clktype          clk_type;
+       enum light_pll_outtype          out_type;
+       enum light_pll_mode             pll_mode;
+       const struct light_pll_rate_table *rate_table;
+       int rate_count;
+
+       u32 cfg0_reg_off;
+       u32 pll_sts_off;
+       int pll_lock_bit;
+
+       /* Light MPW Aon/ddr pll define bypass:rst bits as: 31:30
+        * but AP pll define bypass:rst bits as: 30:29
+        *
+        * Light Fullmask align these register field define, all pll
+        * define bypss:rst bits as: 30:29
+        */
+       int pll_rst_bit;
+       int pll_bypass_bit;
+};
+
+struct clk_lightdiv {
+       struct clk_divider divider;
+       enum light_div_type div_type;
+       u16 min_div;
+       u16 max_div;
+       u8 sync_en;
+       const struct clk_ops *ops;
+};
+
+struct clk_lightgate {
+       struct clk_gate gate;
+       unsigned int *share_count;
+       const struct clk_ops *ops;
+};
+
+#define to_clk_lightpll(_hw) container_of(_hw, struct clk_lightpll, hw)
+
+void thead_unregister_clocks(struct clk *clks[], unsigned int count)
+{
+        unsigned int i;
+
+        for (i = 0; i < count; i++)
+                clk_unregister(clks[i]);
+}
+
+static void clk_light_pll_cfg_init(struct clk_lightpll *pll)
+{
+       switch (pll->clk_type) {
+       case LIGHT_AUDIO_PLL:
+               pll->cfg0_reg_off = 0x0;
+               pll->pll_sts_off = 0x90;
+               pll->pll_lock_bit = BIT(0);
+               pll->pll_bypass_bit = BIT(31);
+               pll->pll_rst_bit = BIT(30);
+               pll->pll_mode = PLL_MODE_FRAC;
+               break;
+       case LIGHT_SYS_PLL:
+               pll->cfg0_reg_off = 0x10;
+               pll->pll_sts_off = 0x90;
+               pll->pll_lock_bit = BIT(1);
+               pll->pll_bypass_bit = BIT(31);
+               pll->pll_rst_bit = BIT(30);
+               pll->pll_mode = PLL_MODE_FRAC;
+               break;
+       case LIGHT_CPU_PLL0:
+               pll->cfg0_reg_off = 0x0;
+               pll->pll_sts_off = 0x80;
+               pll->pll_lock_bit = BIT(1);
+               pll->pll_bypass_bit = BIT(30);
+               pll->pll_rst_bit = BIT(29);
+               pll->pll_mode = PLL_MODE_INT;
+               break;
+       case LIGHT_CPU_PLL1:
+               pll->cfg0_reg_off = 0x10;
+               pll->pll_sts_off = 0x80;
+               pll->pll_lock_bit = BIT(4);
+               pll->pll_bypass_bit = BIT(30);
+               pll->pll_rst_bit = BIT(29);
+               pll->pll_mode = PLL_MODE_INT;
+               break;
+       case LIGHT_GMAC_PLL:
+               pll->cfg0_reg_off = 0x20;
+               pll->pll_sts_off = 0x80;
+               pll->pll_lock_bit = BIT(3);
+               pll->pll_bypass_bit = BIT(30);
+               pll->pll_rst_bit = BIT(29);
+               pll->pll_mode = PLL_MODE_INT;
+               break;
+       case LIGHT_VIDEO_PLL:
+               pll->cfg0_reg_off = 0x30;
+               pll->pll_sts_off = 0x80;
+               pll->pll_lock_bit = BIT(7);
+               pll->pll_bypass_bit = BIT(30);
+               pll->pll_rst_bit = BIT(29);
+               pll->pll_mode = PLL_MODE_INT;
+               break;
+       case LIGHT_DDR_PLL:
+               pll->cfg0_reg_off = 0x8;
+               pll->pll_sts_off = 0x18;
+               pll->pll_lock_bit = BIT(0);
+               pll->pll_bypass_bit = BIT(31);
+               pll->pll_rst_bit = BIT(30);
+               pll->pll_mode = PLL_MODE_INT;
+               break;
+       case LIGHT_DPU0_PLL:
+               pll->cfg0_reg_off = 0x40;
+               pll->pll_sts_off = 0x80;
+               pll->pll_lock_bit = BIT(8);
+               pll->pll_bypass_bit = BIT(30);
+               pll->pll_rst_bit = BIT(29);
+               pll->pll_mode = PLL_MODE_INT;
+               break;
+       case LIGHT_DPU1_PLL:
+               pll->cfg0_reg_off = 0x50;
+               pll->pll_sts_off = 0x80;
+               pll->pll_lock_bit = BIT(9);
+               pll->pll_bypass_bit = BIT(30);
+               pll->pll_rst_bit = BIT(29);
+               pll->pll_mode = PLL_MODE_INT;
+               break;
+       default:
+               pr_err("%s: Unknown pll type\n", __func__);
+       };
+}
+
+static int clk_light_pll_wait_lock(struct clk_lightpll *pll)
+{
+       u32 val;
+
+       return readl_poll_timeout(pll->base + pll->pll_sts_off, val,
+                                 val & pll->pll_lock_bit, 0,
+                                 LOCK_TIMEOUT_US);
+}
+
+static int clk_light_pll_prepare(struct clk_hw *hw)
+{
+       struct clk_lightpll *pll = to_clk_lightpll(hw);
+       void __iomem *cfg1_off;
+       u32 val;
+       int ret;
+
+       cfg1_off = pll->base + pll->cfg0_reg_off + LIGHT_PLL_CFG1;
+       val = readl_relaxed(cfg1_off);
+       if (!(val & pll->pll_rst_bit))
+               return 0;
+
+       /* Enable RST */
+       val |= pll->pll_rst_bit;
+       writel_relaxed(val, cfg1_off);
+
+       udelay(3);
+
+       /* Disable RST */
+       val &= ~pll->pll_rst_bit;
+       writel_relaxed(val, cfg1_off);
+
+       ret = clk_light_pll_wait_lock(pll);
+       if (ret)
+               return ret;
+
+       return 0;
+}
+
+static int clk_light_pll_is_prepared(struct clk_hw *hw)
+{
+       struct clk_lightpll *pll = to_clk_lightpll(hw);
+       u32 val;
+
+       val = readl_relaxed(pll->base + pll->cfg0_reg_off + LIGHT_PLL_CFG1);
+
+       return (val & pll->pll_rst_bit) ? 0 : 1;
+}
+
+static void clk_light_pll_unprepare(struct clk_hw *hw)
+{
+       struct clk_lightpll *pll = to_clk_lightpll(hw);
+       u32 val;
+
+       val = readl_relaxed(pll->base + pll->cfg0_reg_off + LIGHT_PLL_CFG1);
+       val |= pll->pll_rst_bit;
+       writel_relaxed(val, pll->base + pll->cfg0_reg_off + LIGHT_PLL_CFG1);
+}
+
+static unsigned long clk_light_pll_recalc_rate(struct clk_hw *hw,
+                                              unsigned long parent_rate)
+{
+#ifndef CONFIG_LIGHT_CLK_EMU
+       struct clk_lightpll *pll = to_clk_lightpll(hw);
+       u32 refdiv, fbdiv, postdiv1, postdiv2, frac;
+       u32 pll_cfg0, pll_cfg1;
+       u64 fvco = 0;
+
+       pll_cfg0 = readl_relaxed(pll->base + pll->cfg0_reg_off);
+       pll_cfg1 = readl_relaxed(pll->base + pll->cfg0_reg_off + LIGHT_PLL_CFG1);
+       refdiv = (pll_cfg0 & LIGHT_REFDIV_MASK) >> LIGHT_REFDIV_SHIFT;
+       fbdiv = (pll_cfg0 & LIGHT_FBDIV_MASK) >> LIGHT_FBDIV_SHIFT;
+       postdiv1 = (pll_cfg0 & LIGHT_POSTDIV1_MASK) >> LIGHT_POSTDIV1_SHIFT;
+       postdiv2 = (pll_cfg0 & LIGHT_POSTDIV2_MASK) >> LIGHT_POSTDIV2_SHIFT;
+       frac = (pll_cfg1 & LIGHT_FRAC_MASK) >> LIGHT_FRAC_SHIFT;
+
+       /* rate calculation:
+        * INT mode: FOUTVCO = FREE * FBDIV / REFDIV
+        * FRAC mode:FOUTVCO = (FREE * FBDIV + FREE * FRAC/BIT(24)) / REFDIV
+        */
+       if (pll->pll_mode == PLL_MODE_FRAC)
+               fvco = (parent_rate * frac) / LIGHT_FRAC_DIV;
+
+       fvco += (parent_rate * fbdiv);
+       do_div(fvco, refdiv);
+
+       if (pll->out_type == LIGHT_PLL_DIV)
+               do_div(fvco, postdiv1 * postdiv2);
+
+       return fvco;
+#else
+
+       struct clk_lightpll *pll = to_clk_lightpll(hw);
+       const struct light_pll_rate_table *rate_table = pll->rate_table;
+
+       /* return minimum supported value */
+       if (pll->out_type == LIGHT_PLL_DIV)
+               return rate_table[0].rate;
+
+       return rate_table[0].vco_rate;
+#endif
+}
+
+static const struct light_pll_rate_table *light_get_pll_div_settings(
+               struct clk_lightpll *pll, unsigned long rate)
+{
+       const struct light_pll_rate_table *rate_table = pll->rate_table;
+       int i;
+
+       for (i = 0; i < pll->rate_count; i++)
+               if (rate == rate_table[i].rate)
+                       return &rate_table[i];
+
+       return NULL;
+}
+
+static const struct light_pll_rate_table *light_get_pll_vco_settings(
+               struct clk_lightpll *pll, unsigned long rate)
+{
+       const struct light_pll_rate_table *rate_table = pll->rate_table;
+       int i;
+
+       for (i = 0; i < pll->rate_count; i++)
+               if (rate == rate_table[i].vco_rate)
+                       return &rate_table[i];
+
+       return NULL;
+}
+
+static inline bool clk_light_pll_change(struct clk_lightpll *pll,
+                                       const struct light_pll_rate_table *rate)
+{
+       u32 refdiv_old, fbdiv_old, postdiv1_old, postdiv2_old, frac_old;
+       u32 cfg0, cfg1;
+       bool pll_changed;
+
+       cfg0 = readl_relaxed(pll->base + pll->cfg0_reg_off);
+       cfg1 = readl_relaxed(pll->base + pll->cfg0_reg_off + LIGHT_PLL_CFG1);
+
+       refdiv_old = (cfg0 & LIGHT_REFDIV_MASK) >> LIGHT_REFDIV_SHIFT;
+       fbdiv_old = (cfg0 & LIGHT_FBDIV_MASK) >> LIGHT_FBDIV_SHIFT;
+       postdiv1_old = (cfg0 & LIGHT_POSTDIV1_MASK) >> LIGHT_POSTDIV1_SHIFT;
+       postdiv2_old = (cfg0 & LIGHT_POSTDIV2_MASK) >> LIGHT_POSTDIV2_SHIFT;
+       frac_old = (cfg1 & LIGHT_FRAC_MASK) >> LIGHT_FRAC_SHIFT;
+
+       pll_changed = rate->refdiv != refdiv_old || rate->fbdiv != fbdiv_old ||
+                     rate->postdiv1 != postdiv1_old || rate->postdiv2 != postdiv2_old;
+       if (pll->pll_mode == PLL_MODE_FRAC)
+               pll_changed |= (rate->frac != frac_old);
+
+       return pll_changed;
+}
+
+static int clk_light_pll_set_rate(struct clk_hw *hw, unsigned long drate,
+                                unsigned long prate)
+{
+       struct clk_lightpll *pll = to_clk_lightpll(hw);
+       const struct light_pll_rate_table *rate;
+       void __iomem *cfg1_off;
+       u32 tmp, div_val;
+       int ret;
+
+       if (pll->out_type == LIGHT_PLL_VCO) {
+               rate = light_get_pll_vco_settings(pll, drate);
+               if (!rate) {
+                       pr_err("%s: Invalid rate : %lu for pll clk %s\n", __func__,
+                               drate, clk_hw_get_name(hw));
+                       return -EINVAL;
+               }
+       } else {
+               rate = light_get_pll_div_settings(pll, drate);
+               if (!rate) {
+                       pr_err("%s: Invalid rate : %lu for pll clk %s\n", __func__,
+                               drate, clk_hw_get_name(hw));
+                       return -EINVAL;
+               }
+       }
+
+       if (!clk_light_pll_change(pll, rate))
+               return 0;
+
+       /* Enable RST */
+       cfg1_off = pll->base + pll->cfg0_reg_off + LIGHT_PLL_CFG1;
+       tmp = readl_relaxed(cfg1_off);
+       tmp |= pll->pll_rst_bit;
+       writel_relaxed(tmp, cfg1_off);
+
+       div_val = (rate->refdiv << LIGHT_REFDIV_SHIFT) |
+                 (rate->fbdiv << LIGHT_FBDIV_SHIFT) |
+                 (rate->postdiv1 << LIGHT_POSTDIV1_SHIFT) |
+                 (rate->postdiv2 << LIGHT_POSTDIV2_SHIFT);
+       writel_relaxed(div_val, pll->base + pll->cfg0_reg_off);
+
+       if (pll->pll_mode == PLL_MODE_FRAC) {
+               tmp &= ~(LIGHT_FRAC_MASK << LIGHT_FRAC_SHIFT);
+               tmp |= rate->frac;
+               writel_relaxed(tmp, cfg1_off);
+       }
+
+       udelay(3);
+
+       /* Disable RST */
+       tmp &= ~pll->pll_rst_bit;
+       writel_relaxed(tmp, cfg1_off);
+
+       /* Wait Lock, ~20us cost */
+       ret = clk_light_pll_wait_lock(pll);
+       if (ret)
+               return ret;
+
+       /* HW requires 30us for pll stable */
+       udelay(30);
+
+       return 0;
+}
+
+static long clk_light_pllvco_round_rate(struct clk_hw *hw, unsigned long rate,
+                                       unsigned long *prate)
+{
+       struct clk_lightpll *pll = to_clk_lightpll(hw);
+       const struct light_pll_rate_table *rate_table = pll->rate_table;
+       unsigned long best = 0, now = 0;
+       unsigned int i, best_i = 0;
+
+       for (i = 0; i < pll->rate_count; i++) {
+               now = rate_table[i].vco_rate;
+
+               if (rate == now) {
+                       return rate_table[i].vco_rate;
+               } else if (abs(now - rate) < abs(best - rate)) {
+                       best = now;
+                       best_i = i;
+               }
+       }
+
+       /* return minimum supported value */
+       return rate_table[best_i].vco_rate;
+}
+
+static long clk_light_plldiv_round_rate(struct clk_hw *hw, unsigned long rate,
+                                       unsigned long *prate)
+{
+       struct clk_lightpll *pll = to_clk_lightpll(hw);
+       const struct light_pll_rate_table *rate_table = pll->rate_table;
+       unsigned long best = 0, now = 0;
+       unsigned int i, best_i = 0;
+
+       for (i = 0; i < pll->rate_count; i++) {
+               now = rate_table[i].rate;
+
+               if (rate == now) {
+                       return rate_table[i].rate;
+               } else if (abs(now - rate) < abs(best - rate)) {
+                       best = now;
+                       best_i = i;
+               }
+       }
+
+       /* return minimum supported value */
+       return rate_table[best_i].rate;
+}
+
+static const struct clk_ops clk_light_pll_def_ops = {
+       .recalc_rate    = clk_light_pll_recalc_rate,
+};
+
+static const struct clk_ops clk_light_pllvco_ops = {
+       .prepare        = clk_light_pll_prepare,
+       .unprepare      = clk_light_pll_unprepare,
+       .is_prepared    = clk_light_pll_is_prepared,
+       .recalc_rate    = clk_light_pll_recalc_rate,
+       .round_rate     = clk_light_pllvco_round_rate,
+       .set_rate       = clk_light_pll_set_rate,
+};
+
+static const struct clk_ops clk_light_plldiv_ops = {
+       .prepare        = clk_light_pll_prepare,
+       .unprepare      = clk_light_pll_unprepare,
+       .is_prepared    = clk_light_pll_is_prepared,
+       .recalc_rate    = clk_light_pll_recalc_rate,
+       .round_rate     = clk_light_plldiv_round_rate,
+       .set_rate       = clk_light_pll_set_rate,
+};
+
+struct clk *thead_light_pll(const char *name, const char *parent_name,
+                           void __iomem *base,
+                           const struct light_pll_clk *pll_clk)
+{
+       struct clk_lightpll *pll;
+       struct clk *clk;
+       struct clk_init_data init;
+       u32 val;
+
+       pll = kzalloc(sizeof(*pll), GFP_KERNEL);
+       if (!pll)
+               return ERR_PTR(-ENOMEM);
+
+       init.name = name;
+       init.flags = pll_clk->flags;
+       init.parent_names = &parent_name;
+       init.num_parents = 1;
+
+       switch (pll_clk->out_type) {
+       case LIGHT_PLL_VCO:
+               if (pll_clk->rate_table)
+                       init.ops = &clk_light_pllvco_ops;
+               break;
+       case LIGHT_PLL_DIV:
+               if (pll_clk->rate_table)
+                       init.ops = &clk_light_plldiv_ops;
+               break;
+       default:
+               pr_err("%s: Unknown pll out type for pll clk %s\n",
+                      __func__, name);
+       };
+
+       if (!pll_clk->rate_table)
+               init.ops = &clk_light_pll_def_ops;
+
+       pll->base = base;
+       pll->hw.init = &init;
+       pll->out_type = pll_clk->out_type;
+       pll->clk_type = pll_clk->clk_type;
+       pll->rate_table = pll_clk->rate_table;
+       pll->rate_count = pll_clk->rate_count;
+
+       clk_light_pll_cfg_init(pll);
+
+       val = readl_relaxed(pll->base + pll->cfg0_reg_off + LIGHT_PLL_CFG1);
+       val &= ~pll->pll_bypass_bit;
+       val |= LIGHT_DACPD_MASK;
+       val |= LIGHT_DSMPD_MASK;
+       if (pll->pll_mode == PLL_MODE_FRAC) {
+               val &= ~LIGHT_DSMPD_MASK;
+               val &= ~LIGHT_DACPD_MASK;
+       }
+       writel_relaxed(val, pll->base + pll->cfg0_reg_off + LIGHT_PLL_CFG1);
+
+       clk = clk_register(NULL, &pll->hw);
+       if (IS_ERR(clk)) {
+               pr_err("%s: failed to register pll %s %lu\n",
+                       __func__, name, PTR_ERR(clk));
+               kfree(pll);
+       }
+
+       return clk;
+}
+
+static inline struct clk_lightdiv *to_clk_lightdiv(struct clk_hw *hw)
+{
+       struct clk_divider *divider = to_clk_divider(hw);
+
+       return container_of(divider, struct clk_lightdiv, divider);
+}
+
+static unsigned long clk_lightdiv_recalc_rate(struct clk_hw *hw,
+                                        unsigned long parent_rate)
+{
+       struct clk_lightdiv *light_div = to_clk_lightdiv(hw);
+
+       return light_div->ops->recalc_rate(&light_div->divider.hw, parent_rate);
+}
+
+static long clk_lightdiv_round_rate(struct clk_hw *hw, unsigned long rate,
+                              unsigned long *prate)
+{
+       struct clk_lightdiv *light_div = to_clk_lightdiv(hw);
+
+       return light_div->ops->round_rate(&light_div->divider.hw, rate, prate);
+}
+
+static int clk_lightdiv_set_rate(struct clk_hw *hw, unsigned long rate,
+                                unsigned long parent_rate)
+{
+       struct clk_lightdiv *light_div = to_clk_lightdiv(hw);
+       struct clk_divider *div = to_clk_divider(hw);
+       unsigned int divider, value;
+       unsigned long flags = 0;
+       u32 val;
+
+       divider = parent_rate / rate;
+
+       /* DIV is zero based divider, but CDE is not */
+       if (light_div->div_type == MUX_TYPE_DIV)
+               value = divider;
+       else
+               value = divider - 1;
+
+       /* handle the div valid range */
+       if (value > light_div->max_div)
+               value = light_div->max_div;
+       if (value < light_div->min_div)
+               value = light_div->min_div;
+
+       spin_lock_irqsave(div->lock, flags);
+
+       val = readl(div->reg);
+       val &= ~BIT(light_div->sync_en);
+       writel(val, div->reg);
+
+       udelay(1);
+
+       val &= ~(div_mask(div) << div->shift);
+       val |= value << div->shift;
+       writel(val, div->reg);
+
+       udelay(1);
+
+       val |= BIT(light_div->sync_en);
+       writel(val, div->reg);
+
+       spin_unlock_irqrestore(div->lock, flags);
+
+       return 0;
+}
+
+static const struct clk_ops clk_lightdiv_ops = {
+       .recalc_rate = clk_lightdiv_recalc_rate,
+       .round_rate = clk_lightdiv_round_rate,
+       .set_rate = clk_lightdiv_set_rate,
+};
+
+struct clk *thead_clk_light_divider(const char *name, const char *parent,
+                                      void __iomem *reg, u8 shift, u8 width,
+                                      u8 sync, enum light_div_type div_type,
+                                      u16 min, u16 max)
+{
+       struct clk_lightdiv *light_div;
+       struct clk_hw *hw;
+       struct clk_init_data init;
+       int ret;
+
+       light_div = kzalloc(sizeof(*light_div), GFP_KERNEL);
+       if (!light_div)
+               return ERR_PTR(-ENOMEM);
+
+       init.name = name;
+       init.ops = &clk_lightdiv_ops;
+       init.flags = CLK_SET_RATE_PARENT;
+       init.parent_names = parent ? &parent : NULL;
+       init.num_parents = parent ? 1 : 0;
+
+       light_div->divider.reg = reg;
+       light_div->divider.shift = shift;
+       light_div->divider.width = width;
+       light_div->divider.lock = &thead_light_clk_lock;
+       light_div->divider.hw.init = &init;
+       light_div->ops = &clk_divider_ops;
+       light_div->sync_en = sync;
+       light_div->div_type = div_type;
+       if (light_div->div_type == MUX_TYPE_DIV)
+               light_div->divider.flags = CLK_DIVIDER_ONE_BASED;
+       light_div->min_div = min > ((1 << width) - 1) ?
+                            ((1 << width) - 1) : min;
+       light_div->max_div = max > ((1 << width) - 1) ?
+                            ((1 << width) - 1) : max;
+
+       hw = &light_div->divider.hw;
+
+       ret = clk_hw_register(NULL, hw);
+       if (ret) {
+               kfree(light_div);
+               return ERR_PTR(ret);
+       }
+
+       return hw->clk;
+}
+
+static inline struct clk_lightgate *to_clk_lightgate(struct clk_hw *hw)
+{
+       struct clk_gate *gate = to_clk_gate(hw);
+
+       return container_of(gate, struct clk_lightgate, gate);
+}
+
+static int clk_light_gate_share_is_enabled(struct clk_hw *hw)
+{
+       struct clk_lightgate *light_gate = to_clk_lightgate(hw);
+
+       return light_gate->ops->is_enabled(hw);
+}
+
+static int clk_light_gate_share_enable(struct clk_hw *hw)
+{
+       struct clk_lightgate *light_gate = to_clk_lightgate(hw);
+
+       if (light_gate->share_count && (*light_gate->share_count)++ > 0) {
+               pr_debug("[%s,%d]share_count = %d\n", __func__, __LINE__, (*light_gate->share_count));
+               return 0;
+       }
+
+       pr_debug("[%s,%d]share_count = %d\n", __func__, __LINE__, (*light_gate->share_count));
+
+       return light_gate->ops->enable(hw);
+}
+
+static void clk_light_gate_share_disable(struct clk_hw *hw)
+{
+       struct clk_lightgate *light_gate = to_clk_lightgate(hw);
+
+       if (light_gate->share_count) {
+               if (WARN_ON(*light_gate->share_count == 0))
+                       return;
+               else if (--(*light_gate->share_count) > 0) {
+                       pr_debug("[%s,%d]share_count = %d\n", __func__, __LINE__, (*light_gate->share_count));
+                       return;
+               }
+       }
+
+       pr_debug("[%s,%d]share_count = %d\n", __func__, __LINE__, (*light_gate->share_count));
+
+       light_gate->ops->disable(hw);
+}
+
+static void clk_light_gate_share_disable_unused(struct clk_hw *hw)
+{
+       struct clk_lightgate *light_gate = to_clk_lightgate(hw);
+
+       if (!light_gate->share_count || *light_gate->share_count == 0)
+               return light_gate->ops->disable(hw);
+}
+
+static const struct clk_ops clk_lightgate_share_ops = {
+       .enable = clk_light_gate_share_enable,
+       .disable = clk_light_gate_share_disable,
+       .disable_unused = clk_light_gate_share_disable_unused,
+       .is_enabled = clk_light_gate_share_is_enabled,
+};
+
+struct clk *thead_clk_light_register_gate_shared(const char *name, const char *parent,
+                                                unsigned long flags, void __iomem *reg,
+                                                u8 shift, spinlock_t *lock,
+                                                unsigned int *share_count)
+{
+       struct clk_lightgate *light_gate;
+       struct clk_hw *hw;
+       struct clk_init_data init;
+       int ret;
+
+       light_gate = kzalloc(sizeof(*light_gate), GFP_KERNEL);
+       if (!light_gate)
+               return ERR_PTR(-ENOMEM);
+
+       light_gate->gate.reg = reg;
+       light_gate->gate.bit_idx = shift;
+       light_gate->gate.flags = 0;
+       light_gate->gate.lock = lock;
+       light_gate->gate.hw.init = &init;
+       light_gate->ops = &clk_gate_ops;
+       light_gate->share_count = share_count;
+
+       init.name = name;
+       init.ops = &clk_lightgate_share_ops;
+       init.flags = flags;
+       init.parent_names = parent ? &parent : NULL;
+       init.num_parents = parent ? 1 : 0;
+
+       hw = &light_gate->gate.hw;
+
+       ret = clk_hw_register(NULL, hw);
+       if (ret) {
+               kfree(light_gate);
+               return ERR_PTR(ret);
+       }
+
+       return hw->clk;
+}
diff --git a/drivers/clk/thead/clk.h b/drivers/clk/thead/clk.h
new file mode 100644 (file)
index 0000000..6b6368a
--- /dev/null
@@ -0,0 +1,117 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2021 Alibaba Group Holding Limited.
+ */
+
+#ifndef __MACH_THEAD_CLK_H
+#define __MACH_THEAD_CLK_H
+
+#include <linux/spinlock.h>
+#include <linux/clk-provider.h>
+
+extern spinlock_t thead_light_clk_lock;
+
+#define LIGHT_PLL_RATE(_vco, _rate, _r, _b, _f, _p, _k)        \
+       {                                               \
+               .vco_rate       =       (_vco),         \
+               .rate           =       (_rate),        \
+               .refdiv         =       (_r),           \
+               .fbdiv          =       (_b),           \
+               .frac           =       (_f),           \
+               .postdiv1       =       (_p),           \
+               .postdiv2       =       (_k),           \
+       }
+
+enum light_pll_outtype {
+       LIGHT_PLL_VCO,
+       LIGHT_PLL_DIV,
+};
+
+enum light_div_type {
+        MUX_TYPE_DIV,
+        MUX_TYPE_CDE,
+};
+
+enum light_pll_clktype {
+       LIGHT_AUDIO_PLL,
+       LIGHT_SYS_PLL,
+       LIGHT_CPU_PLL0,
+       LIGHT_CPU_PLL1,
+       LIGHT_GMAC_PLL,
+       LIGHT_VIDEO_PLL,
+       LIGHT_DDR_PLL,
+       LIGHT_DPU0_PLL,
+       LIGHT_DPU1_PLL,
+};
+
+struct light_pll_rate_table {
+       unsigned long vco_rate;
+       unsigned long rate;
+       unsigned int refdiv;
+       unsigned int fbdiv;
+       unsigned int frac;
+       unsigned int postdiv1;
+       unsigned int postdiv2;
+};
+
+struct light_pll_clk {
+       enum light_pll_outtype out_type;
+       enum light_pll_clktype clk_type;
+       const struct light_pll_rate_table *rate_table;
+       int rate_count;
+       int flags;
+};
+
+static inline struct clk *thead_light_clk_fixed_factor(const char *name,
+               const char *parent, unsigned int mult, unsigned int div)
+{
+       return clk_register_fixed_factor(NULL, name, parent,
+                       CLK_SET_RATE_PARENT, mult, div);
+}
+
+struct clk *thead_light_pll(const char *name, const char *parent_name,
+                           void __iomem *base,
+                           const struct light_pll_clk *pll_clk);
+
+static inline struct clk *thead_clk_light_gate(const char *name, const char *parent,
+                                              void __iomem *reg, u8 shift)
+{
+       return clk_register_gate(NULL, name, parent, CLK_SET_RATE_PARENT, reg,
+                       shift, 0, &thead_light_clk_lock);
+}
+
+struct clk *thead_clk_light_register_gate_shared(const char *name, const char *parent,
+                                                unsigned long flags, void __iomem *reg,
+                                                u8 shift, spinlock_t *lock,
+                                                unsigned int *share_count);
+
+struct clk *thead_clk_light_divider(const char *name, const char *parent,
+                                   void __iomem *reg, u8 shift, u8 width,
+                                   u8 sync, enum light_div_type div_type,
+                                   u16 min, u16 max);
+
+void thead_unregister_clocks(struct clk *clks[], unsigned int count);
+
+static inline struct clk *thead_clk_fixed(const char *name, unsigned long rate)
+{
+       return clk_register_fixed_rate(NULL, name, NULL, 0, rate);
+}
+
+static inline struct clk *thead_clk_light_gate_shared(const char *name, const char *parent,
+                                       void __iomem *reg, u8 shift,
+                                       unsigned int *share_count)
+{
+       return thead_clk_light_register_gate_shared(name, parent, CLK_SET_RATE_PARENT, reg,
+                                                   shift, &thead_light_clk_lock, share_count);
+}
+
+static inline struct clk *thead_light_clk_mux_flags(const char *name,
+                       void __iomem *reg, u8 shift, u8 width,
+                       const char * const *parents, int num_parents,
+                       unsigned long flags)
+{
+       return clk_register_mux(NULL, name, parents, num_parents,
+                       flags , reg, shift, width, 0,
+                       &thead_light_clk_lock);
+}
+#endif
diff --git a/drivers/clk/thead/gate/Makefile b/drivers/clk/thead/gate/Makefile
new file mode 100644 (file)
index 0000000..03db9d4
--- /dev/null
@@ -0,0 +1,3 @@
+# SPDX-License-Identifier: GPL-2.0
+
+obj-$(CONFIG_CLK_LIGHT_FM) += thead-gate.o visys-gate.o vpsys-gate.o vosys-gate.o dspsys-gate.o audiosys-gate.o miscsys-gate.o
diff --git a/drivers/clk/thead/gate/audiosys-gate.c b/drivers/clk/thead/gate/audiosys-gate.c
new file mode 100644 (file)
index 0000000..55320c0
--- /dev/null
@@ -0,0 +1,124 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2022 Alibaba Group Holding Limited.
+ */
+
+#include <dt-bindings/clock/light-fm-ap-clock.h>
+#include <dt-bindings/clock/light-audiosys.h>
+#include <linux/clk.h>
+#include <linux/err.h>
+#include <linux/init.h>
+#include <linux/io.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+#include <linux/of_address.h>
+#include <linux/platform_device.h>
+#include <linux/types.h>
+#include "clk-gate.h"
+#include "../clk.h"
+
+static struct clk *gates[LIGHT_CLKGEN_AUDIO_CLK_END];
+static struct clk_onecell_data clk_gate_data;
+
+static int light_audiosys_clk_probe(struct platform_device *pdev)
+{
+       struct regmap *audiosys_regmap;
+       struct device *dev = &pdev->dev;
+       struct device_node *np = dev->of_node;
+       int ret;
+
+       audiosys_regmap = syscon_regmap_lookup_by_phandle(np, "audiosys-regmap");
+       if (IS_ERR(audiosys_regmap)) {
+               dev_err(&pdev->dev, "cannot find regmap for vi system register\n");
+               return PTR_ERR(audiosys_regmap);
+       }
+
+       printk("%s audiosys_regmap=0x%px\n", __func__, audiosys_regmap);
+
+       /* we assume that the gate clock is a root clock  */
+       gates[LIGHT_CLKGEN_AUDIO_CPU] = thead_gate_clk_register("clkgen_audiosys_cpu_clk", NULL,
+                                                                       audiosys_regmap, 0x10, 0, GATE_NOT_SHARED, NULL, dev);
+       gates[LIGHT_CLKGEN_AUDIO_SRAM0] = thead_gate_clk_register("clkgen_audiosys_sram0_clk", NULL,
+                                                                       audiosys_regmap, 0x10, 1, GATE_NOT_SHARED, NULL, dev);
+       gates[LIGHT_CLKGEN_AUDIO_SRAM1] = thead_gate_clk_register("clkgen_audiosys_sram1_clk", NULL,
+                                                                       audiosys_regmap, 0x10, 2, GATE_NOT_SHARED, NULL, dev);
+       gates[LIGHT_CLKGEN_AUDIO_DMA] = thead_gate_clk_register("clkgen_audiosys_dma_clk", NULL,
+                                                                       audiosys_regmap, 0x10, 3, GATE_NOT_SHARED, NULL, dev);
+       gates[LIGHT_CLKGEN_AUDIO_BSM] = thead_gate_clk_register("clkgen_audiosys_bsm_clk", NULL,
+                                                                       audiosys_regmap, 0x10, 4, GATE_NOT_SHARED, NULL, dev);
+       gates[LIGHT_CLKGEN_AUDIO_TIMER] = thead_gate_clk_register("clkgen_audiosys_timer_clk", NULL,
+                                                                       audiosys_regmap, 0x10, 8, GATE_NOT_SHARED, NULL, dev);
+       gates[LIGHT_CLKGEN_AUDIO_TIMER_CNT1] = thead_gate_clk_register("clkgen_audiosys_timer_cnt1_clk", NULL,
+                                                                       audiosys_regmap, 0x10, 9, GATE_NOT_SHARED, NULL, dev);
+       gates[LIGHT_CLKGEN_AUDIO_TIMER_CNT2] = thead_gate_clk_register("clkgen_audiosys_timer_cnt2_clk", NULL,
+                                                                       audiosys_regmap, 0x10, 10, GATE_NOT_SHARED, NULL, dev);
+       gates[LIGHT_CLKGEN_AUDIO_TIMER_CNT3] = thead_gate_clk_register("clkgen_audiosys_timer_cnt3_clk", NULL,
+                                                                       audiosys_regmap, 0x10, 11, GATE_NOT_SHARED, NULL, dev);
+       gates[LIGHT_CLKGEN_AUDIO_TIMER_CNT4] = thead_gate_clk_register("clkgen_audiosys_timer_cnt4_clk", NULL,
+                                                                       audiosys_regmap, 0x10, 12, GATE_NOT_SHARED, NULL, dev);
+       gates[LIGHT_CLKGEN_AUDIO_WDR] = thead_gate_clk_register("clkgen_audiosys_wdr_clk", NULL,
+                                                                       audiosys_regmap, 0x10, 13, GATE_NOT_SHARED, NULL, dev);
+       gates[LIGHT_CLKGEN_AUDIO_I2C0] = thead_gate_clk_register("clkgen_audiosys_i2c0_clk", NULL,
+                                                                       audiosys_regmap, 0x10, 14, GATE_NOT_SHARED, NULL, dev);
+       gates[LIGHT_CLKGEN_AUDIO_I2C1] = thead_gate_clk_register("clkgen_audiosys_i2c1_clk", NULL,
+                                                                       audiosys_regmap, 0x10, 15, GATE_NOT_SHARED, NULL, dev);
+       gates[LIGHT_CLKGEN_AUDIO_UART] = thead_gate_clk_register("clkgen_audiosys_uart_clk", NULL,
+                                                                       audiosys_regmap, 0x10, 16, GATE_NOT_SHARED, NULL, dev);
+       gates[LIGHT_CLKGEN_AUDIO_I2S0] = thead_gate_clk_register("clkgen_audiosys_i2s0_clk", NULL,
+                                                                       audiosys_regmap, 0x10, 17, GATE_NOT_SHARED, NULL, dev);
+       gates[LIGHT_CLKGEN_AUDIO_I2S1] = thead_gate_clk_register("clkgen_audiosys_i2s1_clk", NULL,
+                                                                       audiosys_regmap, 0x10, 18, GATE_NOT_SHARED, NULL, dev);
+       gates[LIGHT_CLKGEN_AUDIO_I2S2] = thead_gate_clk_register("clkgen_audiosys_i2s2_clk", NULL,
+                                                                       audiosys_regmap, 0x10, 19, GATE_NOT_SHARED, NULL, dev);
+       gates[LIGHT_CLKGEN_AUDIO_I2S8CH] = thead_gate_clk_register("clkgen_audiosys_i2s8ch_clk", NULL,
+                                                                       audiosys_regmap, 0x10, 20, GATE_NOT_SHARED, NULL, dev);
+       gates[LIGHT_CLKGEN_AUDIO_TDM] = thead_gate_clk_register("clkgen_audiosys_tdm_clk", NULL,
+                                                                       audiosys_regmap, 0x10, 21, GATE_NOT_SHARED, NULL, dev);
+       gates[LIGHT_CLKGEN_AUDIO_GPIO] = thead_gate_clk_register("clkgen_audiosys_gpio_clk", NULL,
+                                                                       audiosys_regmap, 0x10, 22, GATE_NOT_SHARED, NULL, dev);
+       gates[LIGHT_CLKGEN_AUDIO_SPDIF0] = thead_gate_clk_register("clkgen_audiosys_spdif0_clk", NULL,
+                                                                       audiosys_regmap, 0x10, 23, GATE_NOT_SHARED, NULL, dev);
+       gates[LIGHT_CLKGEN_AUDIO_SPDIF1] = thead_gate_clk_register("clkgen_audiosys_spdif1_clk", NULL,
+                                                                       audiosys_regmap, 0x10, 24, GATE_NOT_SHARED, NULL, dev);
+       gates[LIGHT_CLKGEN_AUDIO_VAD] = thead_gate_clk_register("clkgen_audiosys_vad_clk", NULL,
+                                                                       audiosys_regmap, 0x10, 25, GATE_NOT_SHARED, NULL, dev);
+       gates[LIGHT_CLKGEN_AUDIO_IOMUX] = thead_gate_clk_register("clkgen_audiosys_iomux_clk", NULL,
+                                                                       audiosys_regmap, 0x10, 26, GATE_NOT_SHARED, NULL, dev);
+
+       clk_gate_data.clks = gates;
+       clk_gate_data.clk_num = ARRAY_SIZE(gates);
+
+       ret = of_clk_add_provider(np, of_clk_src_onecell_get, &clk_gate_data);
+       if (ret < 0) {
+               dev_err(dev, "failed to register gate clks for light audiosys\n");
+               goto unregister_clks;
+       }
+
+       dev_info(dev, "succeed to register audiosys gate clock provider\n");
+
+       return 0;
+
+unregister_clks:
+       thead_unregister_clocks(gates, ARRAY_SIZE(gates));
+       return ret;
+}
+
+static const struct of_device_id audiosys_clk_gate_of_match[] = {
+       { .compatible = "thead,audiosys-gate-controller" },
+       { /* sentinel */ },
+};
+MODULE_DEVICE_TABLE(of, audiosys_clk_gate_of_match);
+
+static struct platform_driver light_audiosys_clk_driver = {
+       .probe = light_audiosys_clk_probe,
+       .driver = {
+               .name = "audiosys-clk-gate-provider",
+               .of_match_table = of_match_ptr(audiosys_clk_gate_of_match),
+       },
+};
+
+module_platform_driver(light_audiosys_clk_driver);
+MODULE_AUTHOR("nanli.yd <nanli.yd@linux.alibaba.com>");
+MODULE_DESCRIPTION("Thead Light Fullmask audiosys clock gate provider");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/clk/thead/gate/clk-gate.h b/drivers/clk/thead/gate/clk-gate.h
new file mode 100644 (file)
index 0000000..ebb1903
--- /dev/null
@@ -0,0 +1,35 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2022 Alibaba Group Holding Limited.
+ */
+
+#ifndef CLK_GATE_H
+#define CLK_GATE_H
+
+#include <linux/clk-provider.h>
+#include <linux/mfd/syscon.h>
+
+enum clk_gate_type {
+       GATE_NOT_SHARED,
+       GATE_SHARED,
+};
+
+struct thead_clk_gate {
+       struct clk_hw hw;
+       struct regmap *regmap;
+       u32 offset;
+       u8 bit;
+       bool shared;
+       u32 *share_count;
+};
+
+struct clk *thead_gate_clk_register(const char *name,
+                                   const char *parent_name,
+                                   struct regmap *regmap,
+                                   int offset,
+                                   u8 bit,
+                                   bool shared,
+                                   u32 *share_count,
+                                   struct device *dev);
+
+#endif
diff --git a/drivers/clk/thead/gate/dspsys-gate.c b/drivers/clk/thead/gate/dspsys-gate.c
new file mode 100644 (file)
index 0000000..54cb544
--- /dev/null
@@ -0,0 +1,123 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2022 Alibaba Group Holding Limited.
+ */
+
+#include <dt-bindings/clock/light-dspsys.h>
+#include <linux/clk.h>
+#include <linux/err.h>
+#include <linux/init.h>
+#include <linux/io.h>
+#include <linux/module.h>
+#include <linux/mfd/syscon.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+#include <linux/of_address.h>
+#include <linux/platform_device.h>
+#include <linux/types.h>
+#include "clk-gate.h"
+#include "../clk.h"
+
+static struct clk *gates[LIGHT_CLKGEN_DSPSYS_CLK_END];
+static struct clk_onecell_data clk_gate_data;
+static const char * const dsp0_cclk_sels[] = {"gmac_pll_foutpostdiv", "dspsys_dsp_clk"};
+static const char * const dsp1_cclk_sels[] = {"gmac_pll_foutpostdiv", "dspsys_dsp_clk"};
+
+static int light_dspsys_clk_probe(struct platform_device *pdev)
+{
+       struct regmap *dspsys_regmap, *tee_dspsys_regmap;
+       struct device *dev = &pdev->dev;
+       struct device_node *np = dev->of_node;
+       struct device_node *np_reg = of_parse_phandle(np, "dspsys-regmap", 0);
+       void __iomem *gate_base;
+       int ret;
+
+       dspsys_regmap = syscon_regmap_lookup_by_phandle(np, "dspsys-regmap");
+       if (IS_ERR(dspsys_regmap)) {
+               dev_err(&pdev->dev, "cannot find regmap for dsp system register\n");
+               return PTR_ERR(dspsys_regmap);
+       }
+
+       tee_dspsys_regmap = syscon_regmap_lookup_by_phandle(np, "tee-dspsys-regmap");
+       if (IS_ERR(tee_dspsys_regmap)) {
+               dev_warn(&pdev->dev, "cannot find regmap for tee dsp system register\n");
+               tee_dspsys_regmap = NULL;
+       }
+       gate_base = of_iomap(np_reg,0);
+       // MUX 
+       gates[DSPSYS_DSP0_CLK_SWITCH] = thead_light_clk_mux_flags("dspsys_dsp0_clk_switch", gate_base + 0x1c, 0, 1, dsp0_cclk_sels, ARRAY_SIZE(dsp0_cclk_sels), 0);
+       gates[DSPSYS_DSP1_CLK_SWITCH] = thead_light_clk_mux_flags("dspsys_dsp1_clk_switch", gate_base + 0x20, 0, 1, dsp1_cclk_sels, ARRAY_SIZE(dsp1_cclk_sels), 0);
+
+       // DIV & CDE
+       gates[DSPSYS_DSP_CLK] = thead_light_clk_fixed_factor("dspsys_dsp_clk", "video_pll_foutvco", 1, 3);
+       gates[DSPSYS_DSP0_CLK_CDE] = thead_clk_light_divider("dspsys_dsp0_clk_cde", "dspsys_dsp0_clk_switch", gate_base + 0x0, 0, 3, 4, MUX_TYPE_CDE, 0, 7);
+       gates[DSPSYS_DSP1_CLK_CDE] = thead_clk_light_divider("dspsys_dsp1_clk_cde", "dspsys_dsp1_clk_switch", gate_base + 0x4, 0, 3, 4, MUX_TYPE_CDE, 0, 7);
+
+       // gate
+       gates[CLKGEN_DSP0_PCLK] = thead_gate_clk_register("clkgen_dsp0_pclk", NULL, dspsys_regmap,
+                                                         0x24, 0, GATE_NOT_SHARED, NULL, dev);
+       gates[CLKGEN_DSP1_PCLK] = thead_gate_clk_register("clkgen_dsp1_pclk", NULL, dspsys_regmap,
+                                                         0x24, 1, GATE_NOT_SHARED, NULL, dev);
+       gates[CLKGEN_DSP1_CCLK] = thead_gate_clk_register("clkgen_dsp1_cclk", "dspsys_dsp1_clk_cde", dspsys_regmap,
+                                                         0x24, 2, GATE_NOT_SHARED, NULL, dev);
+       gates[CLKGEN_DSP0_CCLK] = thead_gate_clk_register("clkgen_dsp0_cclk", "dspsys_dsp0_clk_cde", dspsys_regmap,
+                                                         0x24, 3, GATE_NOT_SHARED, NULL, dev);
+       gates[CLKGEN_X2X_DSP2_ACLK_S] = thead_gate_clk_register("clkgen_x2x_dsp2_aclk_s", NULL, dspsys_regmap,
+                                                         0x24, 4, GATE_NOT_SHARED, NULL, dev);
+       gates[CLKGEN_X2X_DSP0_ACLK_S] = thead_gate_clk_register("clkgen_x2x_dsp0_aclk_s", NULL, dspsys_regmap,
+                                                         0x24, 5, GATE_NOT_SHARED, NULL, dev);
+       gates[CLKGEN_X2X_X4_DSPSLV_DSP1_ACLK_M] = thead_gate_clk_register("clkgen_x2x_x4_dspslv_dsp1_aclk_m",
+                                                         NULL, dspsys_regmap, 0x24, 6, GATE_NOT_SHARED, NULL, dev);
+       gates[CLKGEN_X2X_X4_DSPSLV_DSP0_ACLK_M] = thead_gate_clk_register("clkgen_x2x_x4_dspslv_dsp0_aclk_m",
+                                                         NULL, dspsys_regmap, 0x24, 7, GATE_NOT_SHARED, NULL, dev);
+       gates[CLKGEN_AXI4_DSPSYS_SLV_ACLK] = thead_gate_clk_register("clkgen_axi4_dspsys_slv_aclk", NULL, dspsys_regmap,
+                                                         0x24, 20, GATE_NOT_SHARED, NULL, dev);
+       gates[CLKGEN_AXI4_DSPSYS_SLV_PCLK] = thead_gate_clk_register("clkgen_axi4_dspsys_slv_pclk", NULL, dspsys_regmap,
+                                                         0x24, 21, GATE_NOT_SHARED, NULL, dev);
+       gates[CLKGEN_AXI4_DSPSYS_ACLK] = thead_gate_clk_register("clkgen_axi4_dspsys_aclk", NULL, dspsys_regmap,
+                                                         0x24, 23, GATE_NOT_SHARED, NULL, dev);
+       gates[CLKGEN_AXI4_DSPSYS_PCLK] = thead_gate_clk_register("clkgen_axi4_dspsys_pclk", NULL, dspsys_regmap,
+                                                         0x24, 24, GATE_NOT_SHARED, NULL, dev);
+       if (tee_dspsys_regmap) {
+               gates[CLKGEN_IOPMP_DSP1_PCLK] = thead_gate_clk_register("clkgen_iopmp_dsp1_pclk", NULL, tee_dspsys_regmap,
+                                                         0x24, 25, GATE_NOT_SHARED, NULL, dev);
+               gates[CLKGEN_IOPMP_DSP0_PCLK] = thead_gate_clk_register("clkgen_iopmp_dsp0_pclk", NULL, tee_dspsys_regmap,
+                                                         0x24, 26, GATE_NOT_SHARED, NULL, dev);
+       }
+
+       clk_gate_data.clks = gates;
+       clk_gate_data.clk_num = ARRAY_SIZE(gates);
+
+       ret = of_clk_add_provider(np, of_clk_src_onecell_get, &clk_gate_data);
+       if (ret < 0) {
+               dev_err(dev, "failed to register gate clks for light dspsys\n");
+               goto unregister_clks;
+       }
+
+       dev_info(dev, "succeed to register dspsys gate clock provider\n");
+
+       return 0;
+
+unregister_clks:
+       thead_unregister_clocks(gates, ARRAY_SIZE(gates));
+       return ret;
+}
+
+static const struct of_device_id dspsys_clk_gate_of_match[] = {
+       { .compatible = "thead,dspsys-gate-controller" },
+       { /* sentinel */ },
+};
+MODULE_DEVICE_TABLE(of, dspsys_clk_gate_of_match);
+
+static struct platform_driver light_dspsys_clk_driver = {
+       .probe = light_dspsys_clk_probe,
+       .driver = {
+               .name = "dspsys-clk-gate-provider",
+               .of_match_table = of_match_ptr(dspsys_clk_gate_of_match),
+       },
+};
+
+module_platform_driver(light_dspsys_clk_driver);
+MODULE_AUTHOR("wei.liu <lw312886@linux.alibaba.com>");
+MODULE_DESCRIPTION("Thead Light Fullmask dspsys clock gate provider");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/clk/thead/gate/miscsys-gate.c b/drivers/clk/thead/gate/miscsys-gate.c
new file mode 100644 (file)
index 0000000..37a000f
--- /dev/null
@@ -0,0 +1,108 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2022 Alibaba Group Holding Limited.
+ */
+#include <dt-bindings/clock/light-miscsys.h>
+#include <linux/clk.h>
+#include <linux/err.h>
+#include <linux/init.h>
+#include <linux/io.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+#include <linux/of_address.h>
+#include <linux/platform_device.h>
+#include <linux/types.h>
+#include "clk-gate.h"
+#include "../clk.h"
+static struct clk *gates[CLKGEN_MISCSYS_CLK_END];
+static struct clk_onecell_data clk_gate_data;
+static int light_miscsys_clk_probe(struct platform_device *pdev)
+{
+       struct regmap *miscsys_regmap, *tee_miscsys_regmap = NULL;
+       struct device *dev = &pdev->dev;
+       struct device_node *np = dev->of_node;
+       int ret;
+
+       miscsys_regmap = syscon_regmap_lookup_by_phandle(np, "miscsys-regmap");
+       if (IS_ERR(miscsys_regmap)) {
+               dev_err(&pdev->dev, "cannot find regmap for misc system register\n");
+               return PTR_ERR(miscsys_regmap);
+       }
+       tee_miscsys_regmap = syscon_regmap_lookup_by_phandle(np, "tee-miscsys-regmap");
+       if (IS_ERR(tee_miscsys_regmap)) {
+               dev_err(&pdev->dev, "cannot find regmap for tee misc system register\n");
+               return PTR_ERR(tee_miscsys_regmap);
+       }
+       /* we assume that the gate clock is a root clock  */
+       gates[CLKGEN_MISCSYS_MISCSYS_ACLK] = thead_gate_clk_register("clkgen_missys_aclk", NULL,
+                                                               miscsys_regmap, 0x100, 0, GATE_NOT_SHARED, NULL, dev);
+       gates[CLKGEN_MISCSYS_USB3_DRD_CLK] = thead_gate_clk_register("clkgen_usb3_drd_clk", NULL,
+                                                               miscsys_regmap, 0x104, 0, GATE_NOT_SHARED, NULL, dev);
+       gates[CLKGEN_MISCSYS_USB3_DRD_CTRL_REF_CLK] = thead_gate_clk_register("clkgen_usb3_drd_ctrl_ref_clk", "osc_24m",
+                                                               miscsys_regmap, 0x104, 1, GATE_NOT_SHARED, NULL, dev);
+       gates[CLKGEN_MISCSYS_USB3_DRD_PHY_REF_CLK] = thead_gate_clk_register("clkgen_usb3_drd_phy_ref_clk", "osc_24m",
+                                                               miscsys_regmap, 0x104, 2, GATE_NOT_SHARED, NULL, dev);
+       gates[CLKGEN_MISCSYS_USB3_DRD_SUSPEND_CLK] = thead_gate_clk_register("clkgen_usb3_drd_suspend_clk", NULL,
+                                                               miscsys_regmap, 0x104, 3, GATE_NOT_SHARED, NULL, dev);
+       gates[CLKGEN_MISCSYS_EMMC_CLK] = thead_gate_clk_register("clkgen_emmc_clk", "osc_24m",
+                                                               miscsys_regmap, 0x108, 0, GATE_NOT_SHARED, NULL, dev);
+       gates[CLKGEN_MISCSYS_SDIO0_CLK] = thead_gate_clk_register("clkgen_sdio0_clk", "osc_24m",
+                                                               miscsys_regmap, 0x10c, 0, GATE_NOT_SHARED, NULL, dev);
+       gates[CLKGEN_MISCSYS_SDIO1_CLK] = thead_gate_clk_register("clkgen_sdio1_clk", "osc_24m",
+                                                               miscsys_regmap, 0x110, 0, GATE_NOT_SHARED, NULL, dev);
+       if (tee_miscsys_regmap) {
+               gates[CLKGEN_MISCSYS_AHB2_TEESYS_HCLK] = thead_gate_clk_register("clkgen_ahb2_teesys_hclk", NULL,
+                                                               tee_miscsys_regmap, 0x120, 0, GATE_NOT_SHARED, NULL, dev);
+               gates[CLKGEN_MISCSYS_APB3_TEESYS_HCLK] = thead_gate_clk_register("clkgen_apb3_teesys_hclk", NULL,
+                                                               tee_miscsys_regmap, 0x120, 1, GATE_NOT_SHARED, NULL, dev);
+               gates[CLKGEN_MISCSYS_AXI4_TEESYS_ACLK] = thead_gate_clk_register("clkgen_axi4_teesys_aclk", NULL,
+                                                               tee_miscsys_regmap, 0x120, 2, GATE_NOT_SHARED, NULL, dev);
+               gates[CLKGEN_MISCSYS_EIP120SI_CLK] = thead_gate_clk_register("clkgen_eip120si_clk", NULL,
+                                                               tee_miscsys_regmap, 0x120, 3, GATE_NOT_SHARED, NULL, dev);
+               gates[CLKGEN_MISCSYS_EIP120SII_CLK] = thead_gate_clk_register("clkgen_eip120sii_clk", NULL,
+                                                               tee_miscsys_regmap, 0x120, 4, GATE_NOT_SHARED, NULL, dev);
+               gates[CLKGEN_MISCSYS_EIP120SIII_CLK] = thead_gate_clk_register("clkgen_eip120siii_clk", NULL,
+                                                               tee_miscsys_regmap, 0x120, 5, GATE_NOT_SHARED, NULL, dev);
+               gates[CLKGEN_MISCSYS_TEEDMAC_CLK] = thead_gate_clk_register("clkgen_teedmac_clk", NULL,
+                                                               tee_miscsys_regmap, 0x120, 6, GATE_NOT_SHARED, NULL, dev);
+               gates[CLKGEN_MISCSYS_EIP150B_HCLK] = thead_gate_clk_register("clkgen_eip150b_hclk", NULL,
+                                                               tee_miscsys_regmap, 0x120, 7, GATE_NOT_SHARED, NULL, dev);
+               gates[CLKGEN_MISCSYS_OCRAM_HCLK] = thead_gate_clk_register("clkgen_ocram_hclk", NULL,
+                                                               tee_miscsys_regmap, 0x120, 8, GATE_NOT_SHARED, NULL, dev);
+               gates[CLKGEN_MISCSYS_EFUSE_PCLK] = thead_gate_clk_register("clkgen_efuse_pclk", NULL,
+                                                               tee_miscsys_regmap, 0x120, 9, GATE_NOT_SHARED, NULL, dev);
+               gates[CLKGEN_MISCSYS_TEE_SYSREG_PCLK] = thead_gate_clk_register("clkgen_tee_sysreg_pclk", NULL,
+                                                               tee_miscsys_regmap, 0x120, 10, GATE_NOT_SHARED, NULL, dev);
+       }
+       clk_gate_data.clks = gates;
+       clk_gate_data.clk_num = ARRAY_SIZE(gates);
+       ret = of_clk_add_provider(np, of_clk_src_onecell_get, &clk_gate_data);
+       if (ret < 0) {
+               dev_err(dev, "failed to register gate clks for light miscsys\n");
+               goto unregister_clks;
+       }
+       dev_info(dev, "succeed to register miscsys gate clock provider\n");
+       return 0;
+unregister_clks:
+       thead_unregister_clocks(gates, ARRAY_SIZE(gates));
+       return ret;
+}
+static const struct of_device_id miscsys_clk_gate_of_match[] = {
+       { .compatible = "thead,miscsys-gate-controller" },
+       { /* sentinel */ },
+};
+MODULE_DEVICE_TABLE(of, miscsys_clk_gate_of_match);
+static struct platform_driver light_miscsys_clk_driver = {
+       .probe = light_miscsys_clk_probe,
+       .driver = {
+               .name = "miscsys-clk-gate-provider",
+               .owner = THIS_MODULE,
+               .of_match_table = of_match_ptr(miscsys_clk_gate_of_match),
+       },
+};
+module_platform_driver(light_miscsys_clk_driver);
+MODULE_AUTHOR("wei.liu <lw312886@linux.alibaba.com>");
+MODULE_AUTHOR("Esther.Z <Esther.Z@linux.alibaba.com>");
+MODULE_DESCRIPTION("Thead Light Fullmask miscsys clock gate provider");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/clk/thead/gate/thead-gate.c b/drivers/clk/thead/gate/thead-gate.c
new file mode 100644 (file)
index 0000000..372c11d
--- /dev/null
@@ -0,0 +1,114 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2022 Alibaba Group Holding Limited.
+ */
+
+#include <linux/clk.h>
+#include <linux/err.h>
+#include <linux/init.h>
+#include <linux/io.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+#include <linux/of_address.h>
+#include <linux/platform_device.h>
+#include <linux/slab.h>
+#include <linux/types.h>
+#include <linux/regmap.h>
+#include "clk-gate.h"
+
+#define to_thead_clk_gate(_hw) container_of(_hw, struct thead_clk_gate, hw)
+
+static int thead_clk_gate_is_enabled(struct clk_hw *hw)
+{
+       struct thead_clk_gate *tcg = to_thead_clk_gate(hw);
+       u32 val;
+
+       regmap_read(tcg->regmap, tcg->offset, &val);
+
+       val &= BIT(tcg->bit);
+
+       return val != 0;
+}
+
+static void thead_clk_gate_disable(struct clk_hw *hw)
+{
+       struct thead_clk_gate *tcg = to_thead_clk_gate(hw);
+
+       if (!tcg->shared)
+               goto out;
+
+       if (tcg->share_count) {
+               if (WARN_ON(*tcg->share_count == 0))
+                       return;
+               else if (--(*tcg->share_count) > 0) {
+                       pr_info("[%s,%d]share_count = %d\n", __func__, __LINE__,
+                                       (*tcg->share_count));
+                       return;
+               }
+       }
+
+out:
+       regmap_update_bits(tcg->regmap, tcg->offset,
+                          BIT(tcg->bit), 0);
+}
+
+static int thead_clk_gate_enable(struct clk_hw *hw)
+{
+       struct thead_clk_gate *tcg = to_thead_clk_gate(hw);
+
+       if (!tcg->shared)
+               goto out;
+
+       if (tcg->share_count && (*tcg->share_count)++ > 0) {
+               pr_info("[%s,%d]share_count = %d\n", __func__, __LINE__, (*tcg->share_count));
+               return 0;
+       }
+
+out:
+       return regmap_update_bits(tcg->regmap, tcg->offset,
+                                 BIT(tcg->bit), BIT(tcg->bit));
+}
+
+const struct clk_ops thead_gate_clk_ops = {
+       .enable = thead_clk_gate_enable,
+       .disable = thead_clk_gate_disable,
+       .is_enabled = thead_clk_gate_is_enabled,
+};
+
+struct clk *thead_gate_clk_register(const char *name,
+                                   const char *parent_name,
+                                   struct regmap *regmap,
+                                   int offset,
+                                   u8 bit,
+                                   bool shared,
+                                   u32 *share_count,
+                                   struct device *dev)
+{
+       struct thead_clk_gate *tcg;
+       struct clk *clk;
+       struct clk_init_data init = {};
+
+       tcg = kzalloc(sizeof(*tcg), GFP_KERNEL);
+       if (!tcg)
+               return ERR_PTR(-ENOMEM);
+
+       tcg->regmap = regmap;
+       tcg->offset = offset;
+       tcg->bit = bit;
+       tcg->shared = shared;
+       tcg->share_count = share_count;
+
+       init.name = name;
+       init.flags = CLK_SET_RATE_PARENT;
+       init.parent_names = parent_name ? &parent_name : NULL;
+       init.num_parents = parent_name ? 1 : 0;
+       init.ops = &thead_gate_clk_ops;
+
+       tcg->hw.init = &init;
+
+       clk = clk_register(dev, &tcg->hw);
+       if (IS_ERR(clk))
+               kfree(tcg);
+
+       return clk;
+}
diff --git a/drivers/clk/thead/gate/visys-gate.c b/drivers/clk/thead/gate/visys-gate.c
new file mode 100644 (file)
index 0000000..b023e42
--- /dev/null
@@ -0,0 +1,144 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2022 Alibaba Group Holding Limited.
+ */
+
+#include <dt-bindings/clock/light-fm-ap-clock.h>
+#include <dt-bindings/clock/light-visys.h>
+#include <linux/clk.h>
+#include <linux/err.h>
+#include <linux/init.h>
+#include <linux/io.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+#include <linux/of_address.h>
+#include <linux/platform_device.h>
+#include <linux/types.h>
+#include "clk-gate.h"
+#include "../clk.h"
+
+static struct clk *gates[LIGHT_CLKGEN_VISYS_CLK_END];
+static struct clk_onecell_data clk_gate_data;
+
+static u32 share_cnt_isp0_hclk_en;
+static u32 share_cnt_isp0_aclk_en;
+
+static int light_visys_clk_probe(struct platform_device *pdev)
+{
+       struct regmap *visys_regmap;
+       struct device *dev = &pdev->dev;
+       struct device_node *np = dev->of_node;
+       int ret;
+
+       visys_regmap = syscon_regmap_lookup_by_phandle(np, "visys-regmap");
+       if (IS_ERR(visys_regmap)) {
+               dev_err(&pdev->dev, "cannot find regmap for vi system register\n");
+               return PTR_ERR(visys_regmap);
+       }
+
+       /* we assume that the gate clock is a root clock  */
+       gates[LIGHT_CLKGEN_DW200_ACLK] = thead_gate_clk_register("clkgen_dw200_aclk", NULL,
+                                                                       visys_regmap, 0xa0, 27, GATE_NOT_SHARED, NULL, dev);
+       gates[LIGHT_CLKGEN_AXI4_VISYS1_ACLK] = thead_gate_clk_register("clkgen_axi4_visys1_aclk", NULL,
+                                                                       visys_regmap, 0xa0, 26, GATE_NOT_SHARED, NULL, dev);
+       gates[LIGHT_CLKGEN_AXI4_VISYS2_ACLK] = thead_gate_clk_register("clkgen_axi4_visys2_aclk", NULL,
+                                                                       visys_regmap, 0xa0, 25, GATE_NOT_SHARED, NULL, dev);
+       gates[LIGHT_CLKGEN_AXI4_VISYS3_ACLK] = thead_gate_clk_register("clkgen_axi4_visys3_aclk", NULL,
+                                                                       visys_regmap, 0xa0, 24, GATE_NOT_SHARED, NULL, dev);
+       gates[LIGHT_CLKGEN_ISP_RY_ACLK] = thead_gate_clk_register("clkgen_isp_ry_aclk", NULL,
+                                                                       visys_regmap, 0xa0, 22, GATE_NOT_SHARED, NULL, dev);
+       gates[LIGHT_CLKGEN_ISP_VENC_SHAKE_ACLK] = thead_gate_clk_register("clkgen_isp_venc_shake_aclk", NULL,
+                                                                       visys_regmap, 0xa0, 30, GATE_NOT_SHARED, NULL, dev);
+
+       gates[LIGHT_CLKGEN_VIPRE_ACLK] = thead_gate_clk_register("clkgen_vipre_aclk", NULL,
+                                                                       visys_regmap, 0xa0, 31, GATE_NOT_SHARED, NULL, dev);
+       gates[LIGHT_CLKGEN_DW200_HCLK] = thead_gate_clk_register("clkgen_dw200_hclk", NULL,
+                                                                       visys_regmap, 0xa0, 13, GATE_NOT_SHARED, NULL, dev);
+       gates[LIGHT_CLKGEN_ISP_RY_HCLK] = thead_gate_clk_register("clkgen_isp_ry_hclk", NULL,
+                                                                       visys_regmap, 0xa0, 12, GATE_NOT_SHARED, NULL, dev);
+       gates[LIGHT_CLKGEN_MIPI_CSI0_PCLK] = thead_gate_clk_register("clkgen_mipi_csi0_pclk", NULL,
+                                                                       visys_regmap, 0xa0, 18, GATE_NOT_SHARED, NULL, dev);
+       gates[LIGHT_CLKGEN_MIPI_CSI1_PCLK] = thead_gate_clk_register("clkgen_mipi_csi1_pclk", NULL,
+                                                                       visys_regmap, 0xa0, 17, GATE_NOT_SHARED, NULL, dev);
+
+       gates[LIGHT_CLKGEN_MIPI_CSI2_PCLK] = thead_gate_clk_register("clkgen_mipi_csi2_pclk", NULL,
+                                                                       visys_regmap, 0xa0, 16, GATE_NOT_SHARED, NULL, dev);
+       gates[LIGHT_CLKGEN_VIPRE_PCLK] = thead_gate_clk_register("clkgen_vipre_pclk", NULL,
+                                                                       visys_regmap, 0xa0, 15, GATE_NOT_SHARED, NULL, dev);
+       gates[LIGHT_CLKGEN_ISP_VENC_SHAKE_PCLK] = thead_gate_clk_register("clkgen_isp_venc_shake_pclk", NULL,
+                                                                       visys_regmap, 0xa0, 29, GATE_NOT_SHARED, NULL, dev);
+       gates[LIGHT_CLKGEN_MIPI_CSI0_PIXCLK] = thead_gate_clk_register("clkgen_mipi_csi0_pixclk", NULL,
+                                                                       visys_regmap, 0xa0, 11, GATE_NOT_SHARED, NULL, dev);
+       gates[LIGHT_CLKGEN_MIPI_CSI1_PIXCLK] = thead_gate_clk_register("clkgen_mipi_csi1_pixclk", NULL,
+                                                                       visys_regmap, 0xa0, 10, GATE_NOT_SHARED, NULL, dev);
+       gates[LIGHT_CLKGEN_MIPI_CSI2_PIXCLK] = thead_gate_clk_register("clkgen_mipi_csi2_pixclk", NULL,
+                                                                       visys_regmap, 0xa0, 9, GATE_NOT_SHARED, NULL, dev);
+
+       gates[LIGHT_CLKGEN_VIPRE_PIXELCLK] = thead_gate_clk_register("clkgen_vipre_pixelclk", NULL,
+                                                                       visys_regmap, 0xa4, 23, GATE_NOT_SHARED, NULL, dev);
+       gates[LIGHT_CLKGEN_MIPI_CSI0_CFG_CLK] = thead_gate_clk_register("clkgen_mipi_csi0_cfg_clk", NULL,
+                                                                       visys_regmap, 0xa0, 8, GATE_NOT_SHARED, NULL, dev);
+       gates[LIGHT_CLKGEN_MIPI_CSI1_CFG_CLK] = thead_gate_clk_register("clkgen_mipi_csi1_cfg_clk", NULL,
+                                                                       visys_regmap, 0xa0, 6, GATE_NOT_SHARED, NULL, dev);
+       gates[LIGHT_CLKGEN_MIPI_CSI2_CFG_CLK] = thead_gate_clk_register("clkgen_mipi_csi2_cfg_clk", NULL,
+                                                                       visys_regmap, 0xa0, 7, GATE_NOT_SHARED, NULL, dev);
+       gates[LIGHT_CLKGEN_DW200_CLK_VSE] = thead_gate_clk_register("clkgen_dw200_clk_vse", NULL,
+                                                                       visys_regmap, 0xa0, 5, GATE_NOT_SHARED, NULL, dev);
+       gates[LIGHT_CLKGEN_DW200_CLK_DWE] = thead_gate_clk_register("clkgen_dw200_clk_dwe", NULL,
+                                                                       visys_regmap, 0xa0, 4, GATE_NOT_SHARED, NULL, dev);
+       gates[LIGHT_CLKGEN_ISP0_CLK] = thead_gate_clk_register("clkgen_isp_clk_0", NULL,
+                                                                       visys_regmap, 0xa4, 31, GATE_NOT_SHARED, NULL, dev);
+       gates[LIGHT_CLKGEN_ISP1_CLK] = thead_gate_clk_register("clkgen_isp_clk_1", NULL,
+                                                                       visys_regmap, 0xa4, 30, GATE_NOT_SHARED, NULL, dev);
+       gates[LIGHT_CLKGEN_ISP_RY_CCLK] = thead_gate_clk_register("clkgen_isp_ry_cclk", NULL,
+                                                                       visys_regmap, 0xa0, 21, GATE_NOT_SHARED, NULL, dev);
+       gates[LIGHT_CLKGEN_ISP1_PIXELCLK] = thead_gate_clk_register("clkgen_isp1_pixelclk", NULL,
+                                                                       visys_regmap, 0xa4, 28, GATE_NOT_SHARED, NULL, dev);
+       gates[LIGHT_CLKGEN_ISP0_PIXELCLK] = thead_gate_clk_register("clkgen_isp0_pixelclk", NULL,
+                                                                       visys_regmap, 0xa4, 29, GATE_NOT_SHARED, NULL, dev);
+       gates[LIGHT_CLKGEN_ISP1_HCLK] = thead_gate_clk_register("clkgen_isp1_hclk", NULL,
+                                                                       visys_regmap, 0xa0, 1, GATE_SHARED, &share_cnt_isp0_hclk_en, dev);
+       gates[LIGHT_CLKGEN_ISP0_HCLK] = thead_gate_clk_register("clkgen_isp0_hclk", NULL,
+                                                                       visys_regmap, 0xa0, 1, GATE_SHARED, &share_cnt_isp0_hclk_en, dev);
+       gates[LIGHT_CLKGEN_ISP1_ACLK] = thead_gate_clk_register("clkgen_isp1_aclk", NULL,
+                                                                       visys_regmap, 0xa0, 3, GATE_SHARED, &share_cnt_isp0_aclk_en, dev);
+       gates[LIGHT_CLKGEN_ISP0_ACLK] = thead_gate_clk_register("clkgen_isp0_aclk", NULL,
+                                                                       visys_regmap, 0xa0, 3, GATE_SHARED, &share_cnt_isp0_aclk_en, dev);
+
+       clk_gate_data.clks = gates;
+       clk_gate_data.clk_num = ARRAY_SIZE(gates);
+
+       ret = of_clk_add_provider(np, of_clk_src_onecell_get, &clk_gate_data);
+       if (ret < 0) {
+               dev_err(dev, "failed to register gate clks for light visys\n");
+               goto unregister_clks;
+       }
+
+       dev_info(dev, "succeed to register visys gate clock provider\n");
+
+       return 0;
+
+unregister_clks:
+       thead_unregister_clocks(gates, ARRAY_SIZE(gates));
+       return ret;
+}
+
+static const struct of_device_id visys_clk_gate_of_match[] = {
+       { .compatible = "thead,visys-gate-controller" },
+       { /* sentinel */ },
+};
+MODULE_DEVICE_TABLE(of, visys_clk_gate_of_match);
+
+static struct platform_driver light_visys_clk_driver = {
+       .probe = light_visys_clk_probe,
+       .driver = {
+               .name = "visys-clk-gate-provider",
+               .of_match_table = of_match_ptr(visys_clk_gate_of_match),
+       },
+};
+
+module_platform_driver(light_visys_clk_driver);
+MODULE_AUTHOR("wei.liu <lw312886@linux.alibaba.com>");
+MODULE_DESCRIPTION("Thead Light Fullmask visys clock gate provider");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/clk/thead/gate/vosys-gate.c b/drivers/clk/thead/gate/vosys-gate.c
new file mode 100644 (file)
index 0000000..7584b9f
--- /dev/null
@@ -0,0 +1,111 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2022 Alibaba Group Holding Limited.
+ */
+
+#include <dt-bindings/clock/light-fm-ap-clock.h>
+#include <dt-bindings/clock/light-vosys.h>
+#include <linux/clk.h>
+#include <linux/err.h>
+#include <linux/init.h>
+#include <linux/io.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+#include <linux/of_address.h>
+#include <linux/platform_device.h>
+#include <linux/types.h>
+#include "../clk.h"
+
+static struct clk *gates[LIGHT_CLKGEN_VOSYS_CLK_END];
+static struct clk_onecell_data clk_gate_data;
+
+static int light_vosys_clk_probe(struct platform_device *pdev)
+{
+       struct device *dev = &pdev->dev;
+       struct device_node *np = dev->of_node;
+       void __iomem *gate_base;
+       int ret;
+
+       gate_base = devm_platform_ioremap_resource(pdev, 0);
+       if (WARN_ON(IS_ERR(gate_base)))
+               return PTR_ERR(gate_base);
+
+       /* we assume that the gate clock is a root clock  */
+       gates[LIGHT_CLKGEN_AXI4_VO_PCLK] = thead_clk_light_gate("clkgen_axi4_vo_pclk", NULL,
+                                                               gate_base + 0x50, 22);
+       gates[LIGHT_CLKGEN_IOPMP_VOSYS_DPU_PCLK] = thead_clk_light_gate("clkgen_iopmp_dpu_pclk", NULL,
+                                                               gate_base + 0x50, 23);
+       gates[LIGHT_CLKGEN_IOPMP_VOSYS_DPU1_PCLK] = thead_clk_light_gate("clkgen_iopmp_dpu1_pclk", NULL,
+                                                               gate_base + 0x50, 24);
+       gates[LIGHT_CLKGEN_IOPMP_VOSYS_GPU_PCLK] = thead_clk_light_gate("clkgen_iopmp_gpu_pclk", NULL,
+                                                               gate_base + 0x50, 25);
+       gates[LIGHT_CLKGEN_HDMI_PCLK] = thead_clk_light_gate("clkgen_hdmi_pclk", NULL, gate_base + 0x50, 11);
+       gates[LIGHT_CLKGEN_MIPIDSI0_PCLK] = thead_clk_light_gate("clkgen_mipidsi0_pclk", NULL,
+                                                                 gate_base + 0x50, 13);
+       gates[LIGHT_CLKGEN_MIPIDSI1_PCLK] = thead_clk_light_gate("clkgen_mipidsi1_pclk", NULL,
+                                                                 gate_base + 0x50, 14);
+       gates[LIGHT_CLKGEN_AXI4_VO_ACLK] = thead_clk_light_gate("clkgen_axi4_vo_aclk", NULL,
+                                                                 gate_base + 0x50, 0);
+       gates[LIGHT_CLKGEN_IOPMP_GPU_ACLK] = thead_clk_light_gate("clkgen_iopmp_gpu_aclk", NULL,
+                                                                 gate_base + 0x50, 29);
+       gates[LIGHT_CLKGEN_IOPMP_DPU_ACLK] = thead_clk_light_gate("clkgen_iopmp_dpu_aclk", NULL,
+                                                                 gate_base + 0x50, 28);
+       gates[LIGHT_CLKGEN_IOPMP_DPU1_ACLK] = thead_clk_light_gate("clkgen_iopmp_dpu1_aclk", NULL,
+                                                                 gate_base + 0x50, 27);
+       gates[LIGHT_CLKGEN_X2H_DPU_ACLK] = thead_clk_light_gate("clkgen_x2h_dpu_aclk", NULL, gate_base + 0x50, 21);
+       gates[LIGHT_CLKGEN_X2H_DPU1_ACLK] = thead_clk_light_gate("clkgen_x2h_dpu1_aclk", NULL, gate_base + 0x50, 20);
+       gates[LIGHT_CLKGEN_MIPIDSI0_PIXCLK] = thead_clk_light_gate("clkgen_mipidsi0_pixclk", NULL, gate_base + 0x50, 30);
+       gates[LIGHT_CLKGEN_HDMI_PIXCLK] = thead_clk_light_gate("clkgen_hdmi_pixclk", NULL, gate_base + 0x54, 0);
+       gates[LIGHT_CLKGEN_MIPIDSI1_PIXCLK] = thead_clk_light_gate("clkgen_mipidsi1_pixclk", NULL, gate_base + 0x50, 31);
+       gates[LIGHT_CLKGEN_HDMI_SFR_CLK] = thead_clk_light_gate("clkgen_hdmi_sfr_clk", NULL, gate_base + 0x50, 10);
+       gates[LIGHT_CLKGEN_HDMI_CEC_CLK] = thead_clk_light_gate("clkgen_hdmi_cec_cclk", NULL, gate_base + 0x50, 12);
+       gates[LIGHT_CLKGEN_HDMI_I2S_CLK] = thead_clk_light_gate("clkgen_hdmi_i2s_clk", NULL, gate_base + 0x50, 19);
+       gates[LIGHT_CLKGEN_MIPIDSI0_CFG_CLK] = thead_clk_light_gate("clkgen_mipidsi0_cfg_clk", NULL, gate_base + 0x50, 15);
+       gates[LIGHT_CLKGEN_MIPIDSI1_CFG_CLK] = thead_clk_light_gate("clkgen_mipidsi1_cfg_clk", NULL, gate_base + 0x50, 16);
+       gates[LIGHT_CLKGEN_MIPIDSI0_REFCLK] = thead_clk_light_gate("clkgen_mipidsi0_refclk", NULL, gate_base + 0x50, 17);
+       gates[LIGHT_CLKGEN_MIPIDSI1_REFCLK] = thead_clk_light_gate("clkgen_mipidsi1_refclk", NULL, gate_base + 0x50, 18);
+       gates[LIGHT_CLKGEN_GPU_CORE_CLK] = thead_clk_light_gate("clkgen_gpu_core_clk", "vosys_aclk_m", gate_base + 0x50, 3);
+       gates[LIGHT_CLKGEN_GPU_CFG_ACLK] = thead_clk_light_gate("clkgen_gpu_cfg_aclk", NULL, gate_base + 0x50, 4);
+       gates[LIGHT_CLKGEN_DPU_HCLK] = thead_clk_light_gate("clkgen_dpu_hclk", NULL, gate_base + 0x50, 7);
+       gates[LIGHT_CLKGEN_DPU_ACLK] = thead_clk_light_gate("clkgen_dpu_aclk", NULL, gate_base + 0x50, 8);
+       gates[LIGHT_CLKGEN_DPU_CCLK] = thead_clk_light_gate("clkgen_dpu_cclk", NULL, gate_base + 0x50, 9);
+       gates[LIGHT_CLKGEN_DPU_PIXCLK0] = thead_clk_light_gate("clkgen_dpu_pixclk0", NULL, gate_base + 0x50, 5);
+       gates[LIGHT_CLKGEN_DPU_PIXCLK1] = thead_clk_light_gate("clkgen_dpu_pixclk1", NULL, gate_base + 0x50, 6);
+
+       clk_gate_data.clks = gates;
+       clk_gate_data.clk_num = ARRAY_SIZE(gates);
+
+       ret = of_clk_add_provider(np, of_clk_src_onecell_get, &clk_gate_data);
+       if (ret < 0) {
+               dev_err(dev, "failed to register gate clks for light vosys\n");
+               goto unregister_clks;
+       }
+
+       dev_info(dev, "succeed to register vosys gate clock provider\n");
+
+       return 0;
+
+unregister_clks:
+       thead_unregister_clocks(gates, ARRAY_SIZE(gates));
+       return ret;
+}
+
+static const struct of_device_id vosys_clk_gate_of_match[] = {
+       { .compatible = "thead,vosys-gate-controller" },
+       { /* sentinel */ },
+};
+MODULE_DEVICE_TABLE(of, vosys_clk_gate_of_match);
+
+static struct platform_driver light_vosys_clk_driver = {
+       .probe = light_vosys_clk_probe,
+       .driver = {
+               .name = "vosys-clk-gate-provider",
+               .of_match_table = of_match_ptr(vosys_clk_gate_of_match),
+       },
+};
+
+module_platform_driver(light_vosys_clk_driver);
+MODULE_AUTHOR("wei.liu <lw312886@linux.alibaba.com>");
+MODULE_DESCRIPTION("Thead Light Fullmask vosys clock gate provider");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/clk/thead/gate/vpsys-gate.c b/drivers/clk/thead/gate/vpsys-gate.c
new file mode 100644 (file)
index 0000000..57b868c
--- /dev/null
@@ -0,0 +1,99 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2022 Alibaba Group Holding Limited.
+ */
+
+#include <dt-bindings/clock/light-fm-ap-clock.h>
+#include <dt-bindings/clock/light-vpsys.h>
+#include <linux/clk.h>
+#include <linux/err.h>
+#include <linux/init.h>
+#include <linux/io.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+#include <linux/of_address.h>
+#include <linux/platform_device.h>
+#include <linux/types.h>
+#include "../clk.h"
+
+static struct clk *gates[LIGHT_VPSYS_CLK_END];
+static struct clk_onecell_data clk_gate_data;
+
+static u32 share_cnt_g2d_clk_en;
+static u32 share_cnt_fce_clk_en;
+
+static int light_vpsys_clk_probe(struct platform_device *pdev)
+{
+       struct device *dev = &pdev->dev;
+       struct device_node *np = dev->of_node;
+       void __iomem *gate_base;
+       int ret;
+
+       gate_base = devm_platform_ioremap_resource(pdev, 0);
+       if (WARN_ON(IS_ERR(gate_base)))
+               return PTR_ERR(gate_base);
+
+       // DIV & CDE
+       gates[LIGHT_VPSYS_G2D_CCLK_DIV] = thead_clk_light_divider("light_vpsys_g2d_cclk_div", "video_pll_foutvco", gate_base + 0x30, 0, 4, 4, MUX_TYPE_DIV, 3, 15);
+       gates[LIGHT_VPSYS_DEC_CCLK_DIV] = thead_clk_light_divider("light_vpsys_dec_cclk_div", "video_pll_foutvco", gate_base + 0x24, 0, 4, 4, MUX_TYPE_DIV, 4, 15);
+
+       /* G2D clock configuration : Completed the upward configuration of CCLK */
+       gates[LIGHT_VPSYS_G2D_PCLK] = thead_clk_light_gate_shared("clkgen_vpsys_g2d_pclk", NULL,
+                                                                  gate_base + 0x20, 3, &share_cnt_g2d_clk_en);
+       gates[LIGHT_VPSYS_G2D_ACLK] = thead_clk_light_gate_shared("clkgen_vpsys_g2d_aclk", NULL,
+                                                                  gate_base + 0x20, 3, &share_cnt_g2d_clk_en);
+       gates[LIGHT_VPSYS_G2D_CCLK] = thead_clk_light_gate_shared("clkgen_vpsys_g2d_cclk", "light_vpsys_g2d_cclk_div",
+                                                                  gate_base + 0x20, 3, &share_cnt_g2d_clk_en);
+
+       /* we assume that the gate clock is a root clock  */
+       gates[LIGHT_VPSYS_FCE_PCLK] = thead_clk_light_gate_shared("clkgen_vpsys_fce_pclk", NULL,
+                                                                  gate_base + 0x20, 2, &share_cnt_fce_clk_en);
+       gates[LIGHT_VPSYS_FCE_ACLK] = thead_clk_light_gate_shared("clkgen_vpsys_fce_aclk", NULL,
+                                                                  gate_base + 0x20, 2, &share_cnt_fce_clk_en);
+
+       /* VENC&VDEC clock configuration : Completed the upward configuration of CCLK */
+       gates[LIGHT_VPSYS_VDEC_ACLK] = thead_clk_light_gate("clkgen_vdec_aclk", NULL, gate_base + 0x20, 4);
+       gates[LIGHT_VPSYS_VDEC_CCLK] = thead_clk_light_gate("clkgen_vdec_cclk", "light_vpsys_dec_cclk_div", gate_base + 0x20, 5);
+       gates[LIGHT_VPSYS_VDEC_PCLK] = thead_clk_light_gate("clkgen_vdec_pclk", NULL, gate_base + 0x20, 6);
+
+       gates[LIGHT_VPSYS_VENC_CCLK] = thead_clk_light_gate("clkgen_venc_cclk", "clkgen_vpsys_venc_cclk", gate_base + 0x20, 8);
+       gates[LIGHT_VPSYS_VENC_PCLK] = thead_clk_light_gate("clkgen_venc_pclk", NULL, gate_base + 0x20, 9);
+       gates[LIGHT_VPSYS_VENC_ACLK] = thead_clk_light_gate("clkgen_venc_aclk", NULL, gate_base + 0x20, 7);
+
+       clk_gate_data.clks = gates;
+       clk_gate_data.clk_num = ARRAY_SIZE(gates);
+
+       ret = of_clk_add_provider(np, of_clk_src_onecell_get, &clk_gate_data);
+       if (ret < 0) {
+               dev_err(dev, "failed to register gate clks for light vpsys\n");
+               goto unregister_clks;
+       }
+
+       dev_info(dev, "succeed to register vpsys gate clock provider\n");
+
+       return 0;
+
+unregister_clks:
+       thead_unregister_clocks(gates, ARRAY_SIZE(gates));
+       return ret;
+}
+
+static const struct of_device_id vpsys_clk_gate_of_match[] = {
+       { .compatible = "thead,vpsys-gate-controller" },
+       { /* sentinel */ },
+};
+MODULE_DEVICE_TABLE(of, vpsys_clk_gate_of_match);
+
+static struct platform_driver light_vpsys_clk_driver = {
+       .probe = light_vpsys_clk_probe,
+       .driver = {
+               .name = "vpsys-clk-gate-provider",
+               .of_match_table = of_match_ptr(vpsys_clk_gate_of_match),
+       },
+};
+
+module_platform_driver(light_vpsys_clk_driver);
+MODULE_AUTHOR("wei.liu <lw312886@linux.alibaba.com>");
+MODULE_DESCRIPTION("Thead Light Fullmask vpsys clock gate provider");
+MODULE_LICENSE("GPL v2");
diff --git a/include/dt-bindings/clock/light-audiosys.h b/include/dt-bindings/clock/light-audiosys.h
new file mode 100644 (file)
index 0000000..3a0ba5d
--- /dev/null
@@ -0,0 +1,35 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2022 Alibaba Group Holding Limited.
+ */
+
+#ifndef _LIGHT_AUDIOSYS_H_
+#define _LIGHT_AUDIOSYS_H_
+
+#define LIGHT_CLKGEN_AUDIO_CPU                       0
+#define LIGHT_CLKGEN_AUDIO_SRAM0                             1
+#define LIGHT_CLKGEN_AUDIO_SRAM1                     2
+#define LIGHT_CLKGEN_AUDIO_DMA                 3
+#define LIGHT_CLKGEN_AUDIO_BSM                 4
+#define LIGHT_CLKGEN_AUDIO_TIMER                        5
+#define LIGHT_CLKGEN_AUDIO_TIMER_CNT1                      6
+#define LIGHT_CLKGEN_AUDIO_TIMER_CNT2              7
+#define LIGHT_CLKGEN_AUDIO_TIMER_CNT3                       8
+#define LIGHT_CLKGEN_AUDIO_TIMER_CNT4                 9
+#define LIGHT_CLKGEN_AUDIO_WDR                      10
+#define LIGHT_CLKGEN_AUDIO_I2C0                       11
+#define LIGHT_CLKGEN_AUDIO_I2C1                      12
+#define LIGHT_CLKGEN_AUDIO_UART                   13
+#define LIGHT_CLKGEN_AUDIO_I2S0                  14
+#define LIGHT_CLKGEN_AUDIO_I2S1                   15
+#define LIGHT_CLKGEN_AUDIO_I2S2                  16
+#define LIGHT_CLKGEN_AUDIO_I2S8CH                   17
+#define LIGHT_CLKGEN_AUDIO_TDM                  18
+#define LIGHT_CLKGEN_AUDIO_GPIO                       19
+#define LIGHT_CLKGEN_AUDIO_SPDIF0                       20
+#define LIGHT_CLKGEN_AUDIO_SPDIF1                21
+#define LIGHT_CLKGEN_AUDIO_VAD              22
+#define LIGHT_CLKGEN_AUDIO_IOMUX                 23
+#define LIGHT_CLKGEN_AUDIO_CLK_END                   24
+
+#endif
diff --git a/include/dt-bindings/clock/light-dspsys.h b/include/dt-bindings/clock/light-dspsys.h
new file mode 100644 (file)
index 0000000..5e6cc3c
--- /dev/null
@@ -0,0 +1,33 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2022 Alibaba Group Holding Limited.
+ */
+
+#ifndef _LIGHT_DSPSYS_H
+#define _LIGHT_DSPSYS_H
+// gate
+#define CLKGEN_DSP0_PCLK                       0
+#define CLKGEN_DSP0_CCLK                        1
+#define CLKGEN_DSP1_PCLK                        2
+#define CLKGEN_DSP1_CCLK                        3
+#define CLKGEN_X2X_X4_DSPSLV_DSP0_ACLK_M        4
+#define CLKGEN_X2X_X4_DSPSLV_DSP1_ACLK_M        5
+#define CLKGEN_AXI4_DSPSYS_SLV_ACLK             6
+#define CLKGEN_AXI4_DSPSYS_ACLK                 7
+#define CLKGEN_IOPMP_DSP0_PCLK                  8
+#define CLKGEN_IOPMP_DSP1_PCLK                  9
+#define CLKGEN_AXI4_DSPSYS_SLV_PCLK             10
+#define CLKGEN_AXI4_DSPSYS_PCLK                 11
+#define CLKGEN_X2X_DSP0_ACLK_S                 12
+#define CLKGEN_X2X_DSP2_ACLK_S                 13
+// MUX
+#define DSPSYS_DSP0_CLK_SWITCH          14
+#define DSPSYS_DSP1_CLK_SWITCH          15
+// DIV
+#define DSPSYS_DSP_CLK              16
+#define DSPSYS_DSP0_CLK_CDE         17
+#define DSPSYS_DSP1_CLK_CDE         18
+
+#define LIGHT_CLKGEN_DSPSYS_CLK_END            19
+
+#endif
diff --git a/include/dt-bindings/clock/light-fm-ap-clock.h b/include/dt-bindings/clock/light-fm-ap-clock.h
new file mode 100644 (file)
index 0000000..8bb23b6
--- /dev/null
@@ -0,0 +1,513 @@
+#ifndef _APSYS_CLKGEN_H
+#define _APSYS_CLKGEN_H
+
+#define C910_CCLK_I0                                       0
+#define AXI4_CPUSYS1_ACLK                                  1
+#define CLKGEN_GPIO2_DBCLK                                 2
+#define CLKGEN_MBOX0_PCLK                                  3
+#define CLKGEN_GMAC0_CCLK                                  4
+#define CLKGEN_SPI_PCLK                                    5
+#define CLKGEN_CLK_OUT_1_CLK                               6
+#define PAD_RTC_CLK                                        7
+#define CLKGEN_SPINLOCK_HCLK                               8
+#define CLKGEN_QSPI1_PCLK                                  9
+#define CLKGEN_HDMI_ISCAN_CK_REF_CLK                       10
+#define CLKGEN_IOPMP_AON_PCLK                              11
+#define CLKGEN_ISP_RY_ACLK                                 12
+#define CLKGEN_MIPIDSI0_SCANRXCLKESC                       13
+#define CLKGEN_EIP120SII_HCLK                              14
+#define CLKGEN_MIPI_CSI0_PIXCLK                            15
+#define CLKGEN_SRAM_AXI_ACLK_3                             16
+#define CLKGEN_PERISYS_AHB_HCLK                            17
+#define VOSYS_HDMI_ISCAN_RX_WORD_CLK0_CLK                  18
+#define CLKGEN_QSPI0_SSI_CLK                               19
+#define CLKGEN_DW200_ACLK                                  20
+#define CLKGEN_IOPMP_EIP120SIII_PCLK                       21
+#define VISYS_MIPI_CSI2_CFGCLK                             22
+#define CLKGEN_APB3_CPUSYS_HCLK                            23
+#define CLKGEN_PERISYS_APB1_HCLK                           24
+#define CLKGEN_GPU_CORE_CLK                                25
+#define CLKGEN_USB3_DRD_ACLK                               26
+#define CLKGEN_VISYS_ACLK                                  27
+#define CLKGEN_USB3_DRD_CTRL_REF_CLK                       28
+#define CLKGEN_TEE_DMAC_ACLK                               29
+#define CLKGEN_AUDIO_SUBSYS_ACLK_CP2AP                     30
+#define CLKGEN_SRAM_AXI_ACLK_2                             31
+#define CLKGEN_IOPMP_VOSYS_GPU_PCLK                        32
+#define CLKGEN_CFG2TEE_X2H_ACLK                            33
+#define CLKGEN_SRAM_AXI_ACLK_1                             34
+#define MISC_SDIO0_OSC_CLK                                 35
+#define CLKGEN_SDIO0_ACLK                                  36
+#define CLKGEN_MIPI_DSI1_CFGCLK                            37
+#define APB3_CPUSYS_PCLK                                   38
+#define CLKGEN_TEE_DMAC_HCLK                               39
+#define VOSYS_DPU0_PIXELCLK                                40
+#define CLKGEN_CPU2CFG_X2H_MHCLK                           41
+#define CLKGEN_VPSYS_ACLK                                  42
+#define CLKGEN_MIPIDSI1_SCANRXCLKESC                       43
+#define CLKGEN_MISC2VP_X2X_ACLK_S                          44
+#define CLKGEN_MIPI_CSI_SCANBYTECLK                        45
+#define CLKGEN_APB3_TEESYS_HCLK                            46
+#define VENC_CCLK                                          47
+#define VPSYS_VDEC_CCLK                                    48
+#define CLKGEN_MIPI_CSI0_CFG_CLK                           49
+#define CLKGEN_MISCSYS_BUS_CLK                             50
+#define CLKGEN_DPU_HCLK                                    51
+#define CLKGEN_UART1_SCLK                                  52
+#define GMAC_PLL_FOUTPOSTDIV                               53
+#define MISC_BUS_CLK                                       54
+#define CLKGEN_USB3_DRD_SPDCLK                             55
+#define CLKGEN_MIPI_CSI2_CFG_CLK                           56
+#define CLKGEN_TOP_AXI4S_ACLK                              57
+#define CLKGEN_IOPMP_EIP120SII_ACLK                        58
+#define CORE_CLK                                           59
+#define CLKGEN_VPSYS_FCE_ACLK                              60
+#define CLKGEN_I2C3_PCLK                                   61
+#define DPU1_PLL_DIV_CLK                                   62
+#define CLKGEN_USB3_DRD_PHY_REF_CLK                        63
+#define CLKGEN_AON2CPU_A2X_ACLK                            64
+#define CLKGEN_QSPI1_SSI_CLK                               65
+#define CLKGEN_DPU_CCLK                                    66
+#define VISYS_MASTER_BUS_ACLK                              67
+#define CLKGEN_PERI_I2S_SRC_CLK_0                          68
+#define VOSYS_ACLK_M                                       69
+#define TEESYS_I0_HCLK                                     70
+#define CLKGEN_MIPI_DSI1_REFCLK                            71
+#define CLKGEN_MIPI_DSI0_PCLK                              72
+#define CLKGEN_VOSYS_ACLK_S                                73
+#define CLKGEN_CPU2VP_X2P_PCLK                             74
+#define CLKGEN_X2X_CPUSYS_ACLK_S                           75
+#define CLKGEN_HDMI_ISCAN_RX_WORD_CLK1_CLK                 76
+#define CLKGEN_IOPMP_VOSYS_DPU1_PCLK                       77
+#define CLKGEN_MISC2VP_X2X_ACLK_M                          78
+#define CLKGEN_WDT0_PCLK                                   79
+#define VOSYS_MIPIDSI0_SCANTXCLKESC                        80
+#define VISYS_MIPI_CSI1_CFGCLK                             81
+#define AHB2_CPUSYS_HCLK                                   82
+#define CLKGEN_SDIO1_HCLK                                  83
+#define CLKGEN_SDIO0_HCLK                                  84
+#define CLKGEN_CLK_OUT_3_CLK                               85
+#define CLKGEN_GMAC_AXI_ACLK                               86
+#define GMAC_CCLK                                          87
+#define CLKGEN_VIPRE_PCLK                                  88
+#define CLKGEN_HDMI_ISCAN_TX_CK_OUT2_CLK                   89
+#define CLKGEN_MIPIDSI1_SCANTXCLKESC                       90
+#define CLKGEN_VISYS_SLAVE_HCLK                            91
+#define VOSYS_HDMI_ISCAN_TX_CK_OUT1_CLK                    92
+#define CLKGEN_X2X_CPUSYS_ACLK_M                           93
+#define CLKGEN_CPU2CFG_X2X_ACLK_S                          94
+#define C910_OSC_CLK                                       95
+#define CLKGEN_X2H_DPU1_ACLK                               96
+#define CLKGEN_I2C4_PCLK                                   97
+#define CLKGEN_GMAC0_ACLK                                  98
+#define MISC_USB3_PHY_REF_CLK                              99
+#define VOSYS_MIPIDSI0_CFG_CLK                             100
+#define CLKGEN_VPSYS_VDEC_CCLK                             101
+#define VOSYS_MIPIDSI1_CFG_CLK                             102
+#define CLKGEN_I2S_PCLK                                    103
+#define CLKGEN_DMAC_CPUSYS_ACLK                            104
+#define VISYS_DW200_CLK_DWE                                105
+#define CLKGEN_OCRAM_HCLK                                  106
+#define CLKGEN_EFUSE_PCLK                                  107
+#define CLKGEN_X2H_DPU_ACLK                                108
+#define CLKGEN_IOPMP_SDIO0_ACLK                            109
+#define VOSYS_DPU1_PIXELCLK                                110
+#define CPU_PLL1_FOUT4                                     111
+#define CLKGEN_GPIO2_PCLK                                  112
+#define CLKGEN_GMAC1_CCLK                                  113
+#define CPU_PLL1_FOUTPOSTDIV                               114
+#define VOSYS_HDMI_ISCAN_40M_CLK                           115
+#define CLKGEN_VOSYS_X2X_ACLK_S                            116
+#define CLKGEN_PERISYS_APB2_HCLK                           117
+#define VOSYS_OSC_CLK_MUX_I2S_CLK_OCCBUF                   118
+#define CLKGEN_HDMI_CEC_CLK                                119
+#define CLKGEN_X2P_X4_VOSYS_PCLK                           120
+#define CLKGEN_VOSYS_ACLK_M                                121
+#define CLKGEN_EMMC_SDIO_REF_CLK                           122
+#define CLKGEN_IOPMP_EMMC_ACLK                             123
+#define VIDEO_PLL_FOUTVCO                                  124
+#define CLKGEN_HDMI_ISCAN_CKO_WORD_CLK                     125
+#define CLKGEN_IOPMP_VOSYS_DPU_PCLK                        126
+#define CLKGEN_AXI4_VISYS3_ACLK                            127
+#define CLKGEN_VISYS_SYSREG_PCLK                           128
+#define CLKGEN_MIPIDSI0_SCANTXCLKESC                       129
+#define CLKGEN_HDMI_ISCAN_TX_CK_OUT1_CLK                   130
+#define CLKGEN_IOPMP_EIP120SIII_ACLK                       131
+#define CLKGEN_EIP120SII_ACLK                              132
+#define CLKGEN_MBOX2_PCLK                                  133
+#define CLKGEN_AXI4_VISYS1_ACLK                            134
+#define CLKGEN_UART1_PCLK                                  135
+#define CLK_OUT_3                                          136
+#define CLKGEN_UART5_SCLK                                  137
+#define CLKGEN_HDMI_ISCAN_RX_WORD_CLK2_CLK                 138
+#define CLKGEN_MBOX3_PCLK                                  139
+#define QSPI1_SSI_CLK                                      140
+#define CLKGEN_I2C1_PCLK                                   141
+#define CLKGEN_HDMI_I2S_CLK                                142
+#define CLKGEN_AXI4_CPUSYS2_PCLK                           143
+#define CLKGEN_CFG2TEE_X2H_MHCLK                           144
+#define CLKGEN_C910_CPU_CLK                                145
+#define VOSYS_HDMI_ISCAN_TX_CK_OUT2_CLK                    146
+#define CLKGEN_HDMI_PCLK                                   147
+#define CLKGEN_IOPMP_EIP120SII_PCLK                        148
+#define CLKGEN_MISCSYS_AXI_PCLK                            149
+#define CLKGEN_EIP120SI_ACLK                               150
+#define TEESYS_I1_HCLK                                     151
+#define PERISYS_APB_PCLK                                   152
+#define VOSYS_HDMI_ISCAN_RX_WORD_CLK0_DIV2_CLK             153
+#define CLKGEN_TIMER0_CCLK                                 154
+#define CLKGEN_IOPMP_USB3_ACLK                             155
+#define CLKGEN_UART2_PCLK                                  156
+#define CLK_OUT_4                                          157
+#define AXI4_CPUSYS2_ACLK                                  158
+#define CLKGEN_AUDIO_SUBSYS_ACLK_AP2CP                     159
+#define CLKGEN_I2C3_IC_CLK                                 160
+#define CLKGEN_IOPMP_GPU_ACLK                              161
+#define CLKGEN_TIMER1_CCLK                                 162
+#define VOSYS_I2S_CLK                                      163
+#define CLKGEN_I2C5_IC_CLK                                 164
+#define VOSYS_OSC_CLK_MUX_I2S_CLK                          165
+#define CLKGEN_DDR_SUBSYS_ACLK_0                           166
+#define CLKGEN_TIMER1_PCLK                                 167
+#define CLKGEN_I2C1_IC_CLK                                 168
+#define CLKGEN_I2S_SRC_CLK                                 169
+#define VISYS_DW200_CLK_VSE                                170
+#define CLKGEN_MIPIDSI1_PIXCLK                             171
+#define VOSYS_RTC_CLK                                      172
+#define CLK_OUT_1                                          173
+#define CLKGEN_PERISYS_APB4_HCLK                           174
+#define MISC_USB3_CTRL_REF_CLK                             175
+#define CLKGEN_TEE_SYSREG_PCLK                             176
+#define CLKGEN_MISCSYS_AXI_ACLK                            177
+#define CLKGEN_MIPIDSI1_SCANCLK                            178
+#define CLKGEN_GPIO3_DBCLK                                 179
+#define CLKGEN_HDMI_ISCAN_40M_CLK                          180
+#define CLKGEN_PERI2PERI1_APB_HCLK                         181
+#define CLKGEN_GMAC0_HCLK                                  182
+#define CLKGEN_DDR_SUBSYS_PCLK                             183
+#define VOSYS_PCLK                                         184
+#define CLKGEN_MIPIDSI1_SCANBYTECLK                        185
+#define CLKGEN_VPSYS_G2D_ACLK                              186
+#define CLKGEN_EIP150B_HCLK                                187
+#define CLKGEN_UART4_SCLK                                  188
+#define DPU1_PLL_TEST_CLK                                  189
+#define CLKGEN_VOSYS_X2X_ACLK_M                            190
+#define CLKGEN_IOPMP_EIP120SI_ACLK                         191
+#define CLKGEN_CLK_OUT_4_CLK                               192
+#define CLKGEN_GPIO0_FPCLK                                 193
+#define PAD_OSC_CLK                                        194
+#define CLKGEN_C910_BUS_CLK_NO_ICG                         195
+#define CLKGEN_TIMER0_PCLK                                 196
+#define CLKGEN_AHB2_CPUSYS_HCLK                            197
+#define EMMC_SDIO_REF_CLK                                  198
+#define CLKGEN_IOPMP_CHIP_DBG_PCLK                         199
+#define CLKGEN_BMU_C910_PCLK                               200
+#define CLKGEN_IOPMP_DPU1_ACLK                             201
+#define CLKGEN_PADCTRL0_APSYS_PCLK                         202
+#define MISC_SDIO1_OSC_CLK                                 203
+#define CLKGEN_C910_OSC_CLK                                204
+#define VISYS_ISP_RY_CCLK                                  205
+#define CLKGEN_VPSYS_PCLK                                  206
+#define VISYS_MIPI_CSI0_PIXELCLK                           207
+#define NPU_CCLK                                           208
+#define CLKGEN_AXI4_TEESYS_ACLK                            209
+#define PERI2SYS_APB_PCLK                                  210
+#define CLKGEN_IOPMP_GMAC0_PCLK                            211
+#define CLKGEN_VPSYS_G2D_PCLK                              212
+#define CLKGEN_EMMC_ACLK                                   213
+#define CLKGEN_UART3_SCLK                                  214
+#define AONSYS_BUS_CLK                                     215
+#define DPU0_PLL_FOUT4                                     216
+#define VOSYS_MIPIDSI1_SCANCLK                             217
+#define CLKGEN_UART4_PCLK                                  218
+#define CLKGEN_HDMI_ISCAN_SCL                              219
+#define CLKGEN_MIPI_CSI1_PIXCLK                            220
+#define CLKGEN_APSYS_CLKGEN_PCLK                           221
+#define CLKGEN_GPU_TIMER_REFCLK                            222
+#define GMAC_PLL_FOUT1PH0                                  223
+#define VOSYS_MIPIDSI1_SCANBYTECLK                         224
+#define CLKGEN_GPIO3_FPCLK                                 225
+#define CLKGEN_SDIO1_OSC_CLK                               226
+#define CLKGEN_GPIO3_PCLK                                  227
+#define CLKGEN_VPSYS_AXI_ACLK                              228
+#define CLKGEN_HDMI_ISCAN_TX_CK_20B_CLK                    229
+#define CLKGEN_VOSYSREG_PCLK                               230
+#define VIDEO_PLL_TEST_CLK                                 231
+#define CLKGEN_MBOX1_PCLK                                  232
+#define CLKGEN_I2C2_IC_CLK                                 233
+#define VOSYS_MIPIDSI0_PLL_SCANCLK                         234
+#define VOSYS_MIPIDSI1_SCANTXCLKESC                        235
+#define VOSYS_HDMI_ISCAN_RX_WORD_CLK1_DIV2_CLK             236
+#define CLKGEN_UART2_SCLK                                  237
+#define MISC_TEESYS_PCLK                                   238
+#define AUDIO_PLL_TEST_CLK                                 239
+#define CLKGEN_DPU_PIXELCLK1                               240
+#define CLKGEN_IOPMP_TEEDMAC_PCLK                          241
+#define CLKGEN_TOP_APB_SX_PCLK                             242
+#define CLKGEN_I2C4_IC_CLK                                 243
+#define GMAC_PLL_TEST_CLK                                  244
+#define CLKGEN_HDMI_JTAG_TCLK                              245
+#define VISYS_MIPI_CSI0_CFGCLK                             246
+#define CLKGEN_CPU2AON_X2H_ACLK                            247
+#define VOSYS_HDMI_ISCAN_TX_CK_OUT0_CLK                    248
+#define QSPI_SSI_CLK                                       249
+#define VOSYS_DPU_CCLK                                     250
+#define CLKGEN_CPU2VI_X2H_MHCLK                            251
+#define CLKGEN_MIPI_DSI0_REFCLK                            252
+#define CLKGEN_DSPSYS_HCLK                                 253
+#define CLKGEN_IOPMP_AUD_PCLK                              254
+#define CLKGEN_PERI2PERI1_APB_PCLK                         255
+#define CFG_AXI_ACLK                                       256
+#define VPSYS_FCE_CCLK                                     257
+#define CLKGEN_HDMI_ISCAN_CLK                              258
+#define CPU_PLL0_TEST_CLK                                  259
+#define CLKGEN_CPU2PERI_X2H_MHCLK                          260
+#define VISYS_ACLK_M                                       261
+#define VOSYS_HDMI_JTAG_TCLK                               262
+#define CLKGEN_IOPMP_AUD_ACLK                              263
+#define CLKGEN_HDMI_ISCAN_RX_WORD_CLK1_DIV2_CLK            264
+#define VOSYS_HDMI_ISCAN_RX_WORD_CLK1_CLK                  265
+#define VOSYS_MIPIDSI0_REFCLK                              266
+#define CLKGEN_VISYS_ACLK_M                                267
+#define VOSYS_MIPIDSI0_SCANRXCLKESC                        268
+#define CLKGEN_SDIO1_ACLK                                  269
+#define CFG_APB_PCLK                                       270
+#define CLKGEN_PADCTRL1_APSYS_PCLK                         271
+#define VOSYS_MIPIDSI0_SCANCLK                             272
+#define CLKGEN_I2C0_IC_CLK                                 273
+#define CLKGEN_VPSYS_APB_PCLK                              274
+#define CLKGEN_VPSYS_VENC_CCLK                             275
+#define CLKGEN_AXI4_CFG_BUS_ACLK                           276
+#define CLKGEN_MIPIDSI0_SCANBYTECLK                        277
+#define GPIO3_DBCLK                                        278
+#define CLKGEN_HDMI_ISCAN_RX_WORD_CLK0_CLK                 279
+#define CLKGEN_UART5_PCLK                                  280
+#define DPU0_PLL_FOUTPOSTDIV_ICG                           281
+#define CPU_PLL0_FOUT4                                     282
+#define CLKGEN_GPIO2_FPCLK                                 283
+#define CLKGEN_DPU_ACLK                                    284
+#define CLKGEN_AXI4_CPUSYS2_ACLK                           285
+#define CLKGEN_DSPSYS_PCLK                                 286
+#define TEE_PLL_FOUTPOSTDIV                                287
+#define TIMER_CCLK                                         288
+#define VOSYS_MIPIDSI1_PLL_SCANCLK                         289
+#define CLKGEN_GMAC_AXI_PCLK                               290
+#define CLKGEN_USB3_DRD_PCLK                               291
+#define CLKGEN_AXI4_CPUSYS1_PCLK                           292
+#define VOSYS_ACLK                                         293
+#define CLKGEN_IOPMP_EIP120SI_PCLK                         294
+#define VOSYS_HDMI_ISCAN_TMDSCLKIN_CLK                     295
+#define VOSYS_HDMI_ISCAN_CKO_WORD_CLK                      296
+#define CLKGEN_NPUSYS_AXI_ACLK                             297
+#define CLKGEN_IOPMP_SDIO0_PCLK                            298
+#define CLKGEN_DW200_HCLK                                  299
+#define VOSYS_HDMI_ISCAN_RX_WORD_CLK2_CLK                  300
+#define CLKGEN_UART0_PCLK                                  301
+#define CLKGEN_CLK_OUT_2_CLK                               302
+#define CLKGEN_GPIO0_PCLK                                  303
+#define CLKGEN_EMMC_OSC_CLK                                304
+#define VPSYS_APB_PCLK                                     305
+#define CLKGEN_HDMI_PIXCLK                                 306
+#define CLKGEN_IOPMP_TEEDMAC_ACLK                          307
+#define AUDIO_PLL_FOUT4                                    308
+#define CLKGEN_MIPI_CSI2_PCLK                              309
+#define CLKGEN_MIPI_DSI1_PCLK                              310
+#define CLKGEN_MIPI_DSI0_CFGCLK                            311
+#define VISYS_ISP0_CLK                                     312
+#define VISYS_ISP1_CLK                                     313
+#define MISC_EMMC_OSC_CLK                                  314
+#define DPU0_PLL_FOUTPOSTDIV                               315
+#define VISYS_AHB_HCLK                                     316
+#define CLKGEN_IOPMP_SDIO1_ACLK                            317
+#define CLKGEN_EMMC_HCLK                                   318
+#define I2S_CLK                                            319
+#define CLKGEN_CPU2PERI_X2H_ACLK                           320
+#define VPSYS_AXI_ACLK                                     321
+#define CLKGEN_IOPMP_SDIO1_PCLK                            322
+#define CLKGEN_EIP120SIII_HCLK                             323
+#define CLKGEN_BMU_C910_ACLK                               324
+#define CLKGEN_IOPMP_DMAC_CPUSYS_PCLK                      325
+#define GPIO2_DBCLK                                        326
+#define CHIP_DBG_CCLK                                      327
+#define CLKGEN_MISCSYS_TEE_CCLK                            328
+#define CLKGEN_I2C5_PCLK                                   329
+#define CLKGEN_X2H_CPUSYS_MHCLK                            330
+#define CLKGEN_PWM_CCLK                                    331
+#define DPU0_PLL_TEST_CLK                                  332
+#define CLKGEN_VISYS_PCLK                                  333
+#define MISC_TEESYS_HCLK                                   334
+#define SPI_SSI_CLK                                        335
+#define CLKGEN_PWM_PCLK                                    336
+#define VOSYS_MIPIDSI1_SCANRXCLKESC                        337
+#define QSPI0_SSI_CLK                                      338
+#define CLKGEN_HDMI_ISCAN_TMDSCLKIN_CLK                    339
+#define CLKGEN_SPI_SSI_CLK                                 340
+#define VIDEO_PLL_FOUT4                                    341
+#define CLKGEN_IOPMP_GMAC0_ACLK                            342
+#define CLKGEN_VIPRE_ACLK                                  343
+#define MISC_OSC_CLK_DIV24                                 344
+#define CLKGEN_ISP_VENC_SHAKE_PCLK                         345
+#define CLKGEN_HDMI_ISCAN_TX_CK_OUT0_CLK                   346
+#define CLKGEN_VPSYS_G2D_CCLK                              347
+#define CLKGEN_CPU2CFG_X2X_ACLK_M                          348
+#define CLKGEN_GMAC1_PCLK                                  349
+#define CLKGEN_MIPIDSI0_PLL_SCANCLK                        350
+#define CLKGEN_HDMI_ISCAN_RX_WORD_CLK0_DIV2_CLK            351
+#define TEE_PLL_FOUT4                                      352
+#define PERISYS_AHB_HCLK                                   353
+#define VIDEO_PLL_FOUT1PH0                                 354
+#define CLKGEN_MIPIDSI0_PIXCLK                             355
+#define CLKGEN_PERI_I2S_SRC_CLK_1                          356
+#define CLKGEN_MIPI_CSI0_PCLK                              357
+#define CLKGEN_DDR_SUBSYS_ACLK_1                           358
+#define CLKGEN_GMAC0_PCLK                                  359
+#define CLK_OUT_2                                          360
+#define CLKGEN_EIP120SIII_ACLK                             361
+#define AONSYS_HCLK                                        362
+#define CLKGEN_ISP0_CLK                                    363
+#define CLKGEN_C910_BROM_HCLK                              364
+#define DPU1_PLL_FOUT4                                     365
+#define PERI_I2S_SRC_CLK                                   366
+#define CPU_PLL1_TEST_CLK                                  367
+#define CLKGEN_DDR_SUBSYS_ACLK_2                           368
+#define CLKGEN_MIPIDSI0_SCANCLK                            369
+#define I2C_IC_CLK                                         370
+#define CLKGEN_DPU_PIXELCLK0                               371
+#define CLKGEN_GPIO1_DBCLK                                 372
+#define CLKGEN_C910_TOP_DS_PCLK                            373
+#define CLKGEN_DSPSYS_ACLK_M                               374
+#define CLKGEN_AON2CPU_A2X_HCLK                            375
+#define VOSYS_HDMI_ISCAN_CK_REF_CLK                        376
+#define CLKGEN_IOPMP_EMMC_PCLK                             377
+#define NPU_CORE_CLK                                       378
+#define CLKGEN_IOPMP_USB3_PCLK                             379
+#define VPSYS_PCLK                                         380
+#define VIDEO_PLL_FOUTPOSTDIV                              381
+#define CLKGEN_CPU2VP_X2P_ACLK                             382
+#define CLKGEN_APB_CPU2CFG_HCLK                            383
+#define VOSYS_OSC_CLK_MUX_CEC_CLK_OCCBUF                   384
+#define CLKGEN_GPIO1_PCLK                                  385
+#define CLKGEN_APSYS_SYSREG_PCLK                           386
+#define CLKGEN_VISYS_HCLK                                  387
+#define CLKGEN_MIPI_CSI1_PCLK                              388
+#define CLKGEN_AHB2_TEESYS_HCLK                            389
+#define CLKGEN_DDR_SUBSYS_ACLK_4                           390
+#define SYS_PLL_TEST_CLK                                   391
+#define VISYS_MIPI_CSI_SCANCLK                             392
+#define CPU_PLL0_FOUTPOSTDIV                               393
+#define CLKGEN_UART3_PCLK                                  394
+#define CLKGEN_X2H_CPUSYS_ACLK                             395
+#define CLKGEN_MIPI_CSI1_CFG_CLK                           396
+#define CLKGEN_HDMI_ISCAN_RX_WORD_CLK2_DIV2_CLK            397
+#define CLKGEN_MISCSYS_APB_HCLK                            398
+#define CLKGEN_CPU2CFG_X2H_ACLK                            399
+#define CLKGEN_MIPI_CSI2_FPCLK                             400
+#define CLKGEN_ISP_RY_CCLK                                 401
+#define CLKGEN_X2P_VOSYS_ACLK                              402
+#define CLKGEN_VIPRE_PIXELCLK                              403
+#define VOSYS_GPU_TIMER_REFCLK                             404
+#define VOSYS_OSC_CLK_MUX_CEC_CLK                          405
+#define CLKGEN_APSYS_RSTGEN_PCLK                           406
+#define VOSYS_HDMI_ISCAN_SCL                               407
+#define CLKGEN_ISP_RY_HCLK                                 408
+#define VOSYS_OSC_CLK                                      409
+#define VISYS_PCLK                                         410
+#define CLKGEN_AXI4_VO_ACLK                                411
+#define CLKGEN_MIPIDSI1_PLL_SCANCLK                        412
+#define GPIO1_DBCLK                                        413
+#define CLKGEN_AXI4_VISYS2_ACLK                            414
+#define CLKGEN_EIP120SI_HCLK                               415
+#define CLKGEN_IOPMP_CHIP_DBG_ACLK                         416
+#define VOSYS_HDMI_ISCAN_TX_CK_20B_CLK                     417
+#define VOSYS_MIPIDSI1_REFCLK                              418
+#define CLKGEN_CHIP_DBG_ACLK                               419
+#define VOSYS_CFG_ACLK                                     420
+#define CLKGEN_VOSYS_AXI_ACLK                              421
+#define CPU_BUS_DFTCLK                                     422
+#define VOSYS_HDMI_ISCAN_CLK                               423
+#define VISYS_SLAVE_BUS_HCLK                               424
+#define CLKGEN_VPSYS_VDEC_PCLK                             425
+#define GMAC_PLL_FOUT4                                     426
+#define CLKGEN_QSPI0_PCLK                                  427
+#define CLKGEN_ISP1_CLK                                    428
+#define CLKGEN_MIPI_CSI0_FPCLK                             429
+#define CLKGEN_ISP0_ACLK                                   430
+#define CLKGEN_CPU2VI_X2H_ACLK                             431
+#define C910_CCLK                                          432
+#define CLKGEN_DW200_CLK_VSE                               433
+#define CLKGEN_AXI4_CPUSYS1_ACLK                           434
+#define CLKGEN_GPU_CFG_ACLK                                435
+#define CLKGEN_GPIO1_FPCLK                                 436
+#define CLKGEN_SRAM_AXI_ACLK_0                             437
+#define CLKGEN_I2C2_PCLK                                   438
+#define CLKGEN_IOPMP_GMAC1_PCLK                            439
+#define CLKGEN_ISP0_S_HCLK                                 440
+#define GPIO0_DBCLK                                        441
+#define CLKGEN_AXI4_VO_CFG_ACLK                            442
+#define CLKGEN_NPU_CORE_CLK                                443
+#define DPU0_PLL_DIV_CLK                                   444
+#define VOSYS_MIPIDSI0_SCANBYTECLK                         445
+#define CLKGEN_CHIP_DBG_CCLK                               446
+#define CLKGEN_DMAC_CPUSYS_HCLK                            447
+#define CLKGEN_IOPMP_DPU_ACLK                              448
+#define CLKGEN_DDR_SUBSYS_ACLK_3                           449
+#define CLK_100M                                           450
+#define CLKGEN_DSMART_PCLK                                 451
+#define CLKGEN_DW200_CLK_DWE                               452
+#define VPSYS_G2D_CCLK                                     453
+#define CLKGEN_WDT1_PCLK                                   454
+#define DPU1_PLL_FOUTPOSTDIV                               455
+#define CLKGEN_IOPMP_GMAC1_ACLK                            456
+#define CLKGEN_VPSYS_FCE_PCLK                              457
+#define CLKGEN_MIPI_CSI_SCANCLK                            458
+#define CLKGEN_MIPI_CSI2_PIXCLK                            459
+#define CLKGEN_I2C0_PCLK                                   460
+#define VOSYS_HDMI_ISCAN_RX_WORD_CLK2_DIV2_CLK             461
+#define CLKGEN_HDMI_SFR_CLK                                462
+#define TEE_PLL_TEST_CLK                                   463
+#define CLKGEN_IOPMP_DMAC_CPUSYS_ACLK                      464
+#define CLKGEN_ISP_PIXELCLK                                465
+#define CLKGEN_MIPI_CSI1_FPCLK                             466
+#define SYS_PLL_FOUT4                                      467
+#define CLKGEN_AXI4_VO_PCLK                                468
+#define CLKGEN_UART0_SCLK                                  469
+#define CLKGEN_CPU2AON_X2H_MHCLK                           470
+#define VISYS_MIPI_CSI_SCANBYTECLK                         471
+#define UART_SCLK                                          472
+#define CLKGEN_IOPMP_AON_ACLK                              473
+#define CLKGEN_VPSYS_VDEC_ACLK                             474
+#define CLKGEN_GMAC1_HCLK                                  475
+#define CLKGEN_ISP_VENC_SHAKE_ACLK                         476
+#define TEESYS_HCLK                                        477
+#define PWM_CCLK                                           478
+#define CLKGEN_GPIO0_DBCLK                                 479
+#define CLKGEN_SDIO0_OSC_CLK                               480
+#define CLKGEN_GMAC1_ACLK                                  481
+#define VPSYS_ACLK                                         482
+
+#define AHB2_CPUSYS_HCLK_OUT_DIV                          483
+#define APB3_CPUSYS_PCLK_DIV                              484
+#define CFG_AXI_ACLK_OUT_DIV                              485
+#define PERISYS_AHB_HCLK_OUT_DIV                          486
+#define CLK_OUT_1_OUT_DIV                                 487
+#define CLK_OUT_2_OUT_DIV                                  488
+#define CLK_OUT_3_OUT_DIV                                  489
+#define CLK_OUT_4_OUT_DIV                                  490
+#define NPU_CCLK_OUT_DIV                                  491
+#define CFG_APB_PCLK_OUT_DIV                              492
+#define CPU_PLL0_BYPASS                                           493
+#define CPU_PLL1_BYPASS                                           494
+#define GMAC_PLL_BYPASS                                           495
+#define VIDEO_PLL_BYPASS                                  496
+#define TEE_PLL_BYPASS                                    497
+#define DPU0_PLL_BYPASS                                           498
+#define DPU1_PLL_BYPASS                                           499
+
+#define CLK_DUMMY                                         500
+#define OSC_32K                                                   501
+#define OSC_24M                                                   502
+#define RC_24M                                            503
+
+#define CLK_END                                                   504
+
+#endif
diff --git a/include/dt-bindings/clock/light-miscsys.h b/include/dt-bindings/clock/light-miscsys.h
new file mode 100644 (file)
index 0000000..8b00cb3
--- /dev/null
@@ -0,0 +1,28 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2022 Alibaba Group Holding Limited.
+ */
+#ifndef _LIGHT_MISCSYS_H
+#define _LIGHT_MISCSYS_H
+#define CLKGEN_MISCSYS_MISCSYS_ACLK                    0
+#define CLKGEN_MISCSYS_USB3_DRD_CLK                    1
+#define CLKGEN_MISCSYS_USB3_DRD_CTRL_REF_CLK           2
+#define CLKGEN_MISCSYS_USB3_DRD_PHY_REF_CLK            3
+#define CLKGEN_MISCSYS_USB3_DRD_SUSPEND_CLK            4
+#define CLKGEN_MISCSYS_EMMC_CLK                                5
+#define CLKGEN_MISCSYS_SDIO0_CLK                       6
+#define CLKGEN_MISCSYS_SDIO1_CLK                       7
+#define CLKGEN_MISCSYS_AHB2_TEESYS_HCLK                        8
+#define CLKGEN_MISCSYS_APB3_TEESYS_HCLK                        9
+#define CLKGEN_MISCSYS_AXI4_TEESYS_ACLK                        10
+#define CLKGEN_MISCSYS_EIP120SI_CLK                    11
+#define CLKGEN_MISCSYS_EIP120SII_CLK                   12
+#define CLKGEN_MISCSYS_EIP120SIII_CLK                  13
+#define CLKGEN_MISCSYS_TEEDMAC_CLK                     14
+#define CLKGEN_MISCSYS_EIP150B_HCLK                    15
+#define CLKGEN_MISCSYS_OCRAM_HCLK                      16
+#define CLKGEN_MISCSYS_EFUSE_PCLK                      17
+#define CLKGEN_MISCSYS_TEE_SYSREG_PCLK                 18
+#define CLKGEN_MISCSYS_CLK_END                         19
+#endif
+
diff --git a/include/dt-bindings/clock/light-mpw-clock.h b/include/dt-bindings/clock/light-mpw-clock.h
new file mode 100644 (file)
index 0000000..46c2a05
--- /dev/null
@@ -0,0 +1,222 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2021 Alibaba Group Holding Limited.
+ */
+
+#ifndef __DT_BINDINGS_CLOCK_LIGHT_H
+#define __DT_BINDINGS_CLOCK_LIGHT_H
+
+#define LIGHT_CLK_DUMMY                                0
+#define LIGHT_CLK_32K                          1
+#define LIGHT_CLK_24M                          2
+#define LIGHT_RC_24M                           3
+
+#define LIGHT_VIDEO_PLL_FOUTVCO                        4
+#define LIGHT_VIDEO_PLL_FOUTPOSTDIV            5
+#define LIGHT_VIDEO_PLL_FOUT4                  6
+#define LIGHT_VIDEO_PLL_BYPASS                 7
+
+#define LIGHT_GMAC_PLL_FOUTVCO                 8
+#define LIGHT_GMAC_PLL_FOUTPOSTDIV             9
+#define LIGHT_GMAC_PLL_FOUT1PH0                        10
+#define LIGHT_GMAC_PLL_FOUT4                   11
+#define LIGHT_GMAC_PLL_BYPASS                  12
+
+#define LIGHT_AUDIO_PLL_FOUTVCO                        13
+#define LIGHT_AUDIO_PLL_FOUTPOSTDIV            14
+#define LIGHT_AUDIO_PLL_FOUT3                  15
+#define LIGHT_AUDIO_PLL_BYPASS                 16
+
+#define LIGHT_SYS_PLL_FOUTVCO                  17
+#define LIGHT_SYS_PLL_FOUTPOSTDIV              18
+#define LIGHT_SYS_PLL_FOUT4                    19
+#define LIGHT_SYS_PLL_BYPASS                   20
+
+#define LIGHT_CPU_PLL0_FOUTVCO                 21
+#define LIGHT_CPU_PLL0_FOUTPOSTDIV             22
+#define LIGHT_CPU_PLL0_FOUT4                   23
+#define LIGHT_CPU_PLL0_BYPASS                  24
+
+#define LIGHT_CPU_PLL1_FOUTVCO                 25
+#define LIGHT_CPU_PLL1_FOUTPOSTDIV             26
+#define LIGHT_CPU_PLL1_FOUT4                   27
+#define LIGHT_CPU_PLL1_BYPASS                  28
+
+#define LIGHT_DDR_PLL_FOUTVCO                  29
+#define LIGHT_DDR_PLL_FOUTPOSTDIV              30
+#define LIGHT_DDR_PLL_FOUT4                    31
+#define LIGHT_DDR_PLL_BYPASS                   32
+
+#define LIGHT_AONSYS_CLK_SWITCH_0              33
+#define LIGHT_AONSYS_CLK_SWITCH_1              34
+#define LIGHT_AONSYS_CLK                       35
+#define LIGHT_SHARE_SRAM_CLK                   36
+#define LIGHT_CLKGEN_RTC_PCLK                  37
+#define LIGHT_CLKGEN_AOGPIO_PCLK               38
+#define LIGHT_CLKGEN_AOI2C_PCLK                        39
+#define LIGHT_CLKGEN_PVTC_PCLK                 40
+#define LIGHT_CLKGEN_AOAHB_HCLK                        41
+#define LIGHT_CLKGEN_AOSRAM_HCLK               42
+#define LIGHT_CLKGEN_AOAPB_HCLK                        43
+#define LIGHT_CLKGEN_AOPAD_PCLK                        44
+#define LIGHT_CLKGEN_AOTIMER_PCLK              45
+#define LIGHT_CLKGEN_AOTIMER_CCLK              46
+#define LIGHT_CLKGEN_SRAM_AXI_ACLK             47
+#define LIGHT_CLKGEN_CPU2RAM_X2X_ACLK_S                48
+#define LIGHT_CLKGEN_AOGPIO_DBCLK              49
+
+#define LIGHT_GMAC_CORECLK                     50
+#define LIGHT_OSC_CLK_DIV24                    51
+#define LIGHT_GMAC_PLL_FOUTVCO_DIV5            52
+#define LIGHT_C910_CCLK_I0                     53
+#define LIGHT_C910_CCLK                                54
+#define LIGHT_CPUSYS_AHB_HCLK                  55
+#define LIGHT_CPUSYS_CFG_AXI_ACLK              56
+#define LIGHT_PERISYS_AHB_HCLK                 57
+#define LIGHT_CLK_OUT_1                                58
+#define LIGHT_CLK_OUT_2                                59
+#define LIGHT_CLK_OUT_3                                60
+#define LIGHT_CLK_OUT_4                                61
+#define LIGHT_CPUSYS_AHB_HCLK_DIV              62
+#define LIGHT_APB3_CPUSYS_PCLK                 63
+#define LIGHT_CPUSYS_SUB_AXI_ACLK              64
+#define LIGHT_CPUSYS_CFG_AXI_ACLK_DIV          65
+#define LIGHT_TEESYS_HCLK                      66
+#define LIGHT_DMAC_1_CLK                       67
+#define LIGHT_DMAC_2_CLK                       68
+#define LIGHT_DMAC_3_CLK                       69
+#define LIGHT_AXI_PORT4_CLK                    70
+#define LIGHT_PERISYS_AHB_HCLK_DIV             71
+#define LIGHT_PERISYS_APB_PCLK                 72
+#define LIGHT_CLK_OUT_1_DIV                    73
+#define LIGHT_CLK_OUT_2_DIV                    74
+#define LIGHT_CLK_OUT_3_DIV                    75
+#define LIGHT_CLK_OUT_4_DIV                    76
+#define LIGHT_CLKGEN_PERISYS_AXI_ACLK          77
+#define LIGHT_CLKGEN_PERISYS_AHB_HCLK          78
+#define LIGHT_CLKGEN_PERISYS_APB1_HCLK         79
+#define LIGHT_CLKGEN_PERISYS_APB2_HCLK         80
+#define LIGHT_CLKGEN_USB3_DRD_PHY_REF_CLK      81
+#define LIGHT_CLKGEN_USB3_DRD_CTRL_REF_CLK     82
+#define LIGHT_CLKGEN_USB3_DRD_SPDCLK           83
+#define LIGHT_CLKGEN_USB3_DRD_ACLK             84
+#define LIGHT_CLKGEN_EMMC1_X2X_ACLK            85
+#define LIGHT_CLKGEN_EMMC0_X2X_ACLK            86
+#define LIGHT_CLKGEN_EMMC0_HCLK                        87
+#define LIGHT_CLKGEN_EMMC1_HCLK                        88
+#define LIGHT_CLKGEN_GMAC_ACLK                 89
+#define LIGHT_CLKGEN_PWM_PCLK                  90
+#define LIGHT_CLKGEN_QSPI0_PCLK                        91
+#define LIGHT_CLKGEN_QSPI1_PCLK                        92
+#define LIGHT_CLKGEN_SPI_PCLK                  93
+#define LIGHT_CLKGEN_UART0_PCLK                        94
+#define LIGHT_CLKGEN_UART1_PCLK                        95
+#define LIGHT_CLKGEN_UART2_PCLK                        96
+#define LIGHT_CLKGEN_UART3_PCLK                        97
+#define LIGHT_CLKGEN_UART4_PCLK                        98
+#define LIGHT_CLKGEN_UART5_PCLK                        99
+#define LIGHT_CLKGEN_GPIO0_PCLK                        100
+#define LIGHT_CLKGEN_GPIO1_PCLK                        101
+#define LIGHT_CLKGEN_GPIO2_PCLK                        102
+#define LIGHT_CLKGEN_I2C0_IC_CLK               103
+#define LIGHT_CLKGEN_I2C1_IC_CLK               104
+#define LIGHT_CLKGEN_I2C2_IC_CLK               105
+#define LIGHT_CLKGEN_I2C3_IC_CLK               106
+#define LIGHT_CLKGEN_I2C4_IC_CLK               107
+#define LIGHT_CLKGEN_I2C5_IC_CLK               108
+#define LIGHT_CLKGEN_PERI2DDR_X2X_ACLK_M       109
+#define LIGHT_CLKGEN_AXI_DUMMY_SLV_4_ACLK      110
+#define LIGHT_CLKGEN_AXI_DUMMY_SLV_3_ACLK      111
+#define LIGHT_CLKGEN_AXI_DUMMY_SLV_2_ACLK      112
+#define LIGHT_CLKGEN_AXI_DUMMY_SLV_1_ACLK      113
+#define LIGHT_CLKGEN_APB_CPU2FG_HCLK           114
+#define LIGHT_CLKGEN_AON2CPU_A2X_ACLK          115
+#define LIGHT_CLKGEN_CPU2CFG_X2X_ACLK_M                116
+#define LIGHT_CLKGEN_CPU2RAM_X2X_ACLK_M                117
+#define LIGHT_CLKGEN_AXI4_CPUSYS2_ACLK         118
+#define LIGHT_CLKGEN_X2X_CPUSYS_ACLK_M         119
+#define LIGHT_CLKGEN_CHIP_DBG_ACLK             120
+#define LIGHT_CLKGEN_AXI4_CFG_BUS_ACLK         121
+#define LIGHT_CLKGEN_X2H_CPUSYS_ACLK           122
+#define LIGHT_CLKGEN_CPU2TEE_X2H_ACLK          123
+#define LIGHT_CLKGEN_CPU2AON_X2H_ACLK          124
+#define LIGHT_CLKGEN_CPU2CFG_X2H_ACLK          125
+#define LIGHT_CLKGEN_CPU2PERI_X2H_MHCLK                126
+#define LIGHT_CLKGEN_AHB2_CPUSYS_HCLK          127
+#define LIGHT_CLKGEN_APB3_CPUSYS_HCLK          128
+#define LIGHT_CLKGEN_C910_BROM_HCLK            129
+#define LIGHT_CLKGEN_DMAC_ACLK                 130
+#define LIGHT_CLKGEN_MBOX0_PCLK                        131
+#define LIGHT_CLKGEN_MBOX1_PCLK                        132
+#define LIGHT_CLKGEN_MBOX2_PCLK                        133
+#define LIGHT_CLKGEN_MBOX3_PCLK                        134
+#define LIGHT_CLKGEN_WDT0_PCLK                 135
+#define LIGHT_CLKGEN_WDT1_PCLK                 136
+#define LIGHT_CLKGEN_TIMER0_CCLK               137
+#define LIGHT_CLKGEN_TIMER1_CCLK               138
+#define LIGHT_CLKGEN_TRNG_RB_HCLK              139
+#define LIGHT_CLKGEN_ADC_PCLK                  140
+#define LIGHT_CLKGEN_AXI_ACLK_4                        141
+#define LIGHT_CLKGEN_AXI_ACLK_3                        142
+#define LIGHT_CLKGEN_AXI_ACLK_2                        143
+#define LIGHT_CLKGEN_AXI_ACLK_1                        145
+#define LIGHT_CLKGEN_AXI_ACLK_0                        146
+#define LIGHT_CLKGEN_DMAC_1_ACLK               147
+#define LIGHT_CLKGEN_DMAC_2_ACLK               148
+#define LIGHT_CLKGEN_DMAC_3_ACLK               149
+#define LIGHT_CLKGEN_SRAM_AXI_PCLK             150
+#define LIGHT_CLKGEN_AHB2_TEESYS_HCLK          151
+#define LIGHT_CLKGEN_EFUSE_MPW_PCLK            152
+#define LIGHT_CLKGEN_CLK_OUT_4_CLK             153
+#define LIGHT_CLKGEN_CLK_OUT_3_CLK             154
+#define LIGHT_CLKGEN_CLK_OUT_2_CLK             155
+#define LIGHT_CLKGEN_CLK_OUT_1_CLK             156
+#define LIGHT_CLKGEN_DDR_APB_PCLK              157
+#define LIGHT_CLKGEN_PADCTRL_APSYS_PCLK                158
+#define LIGHT_CLKGEN_CHIP_DBG_CCLK             159
+#define LIGHT_CHIP_DBG_CCLK                    160
+#define LIGHT_AXI_ACLK                         161
+
+#define LIGHT_CLKGEN_CPU2CFG_X2X_ACLK_S                162
+#define LIGHT_CLKGEN_CPU2CFG_X2H_ACLK_S                163
+#define LIGHT_CLKGEN_AON2CPU_A2X_HCLK          164
+#define LIGHT_CLKGEN_DMAC_HCLK                 165
+#define LIGHT_CLKGEN_X2H_CPUSYS_MHCLK          166
+#define LIGHT_CLKGEN_CPU2TEE_X2H_MHCLK         167
+#define LIGHT_CLKGEN_CPU2AON_X2H_MHCLK         168
+#define LIGHT_AXI_HCLK                         169
+#define LIGHT_CLKGEN_CPU2CFG_X2H_MHCLK         170
+#define LIGHT_CLKGEN_TIMER0_PCLK               171
+#define LIGHT_CLKGEN_TIMER1_PCLK               172
+#define LIGHT_CLKGEN_PERI2DDR_X2X_ACLK_S       173
+#define LIGHT_CLKGEN_USB3_DRD_PCLK             174
+#define LIGHT_CLKGEN_GMAC_HCLK                 175
+#define LIGHT_CLKGEN_GMAC_PCLK                 176
+#define LIGHT_CLKGEN_GMAC_CCLK                 177
+#define LIGHT_CLKGEN_EMMC0_ACLK                        178
+#define LIGHT_CLKGEN_EMMC0_REF_CLK             179
+#define LIGHT_CLKGEN_EMMC0_OSC_CLK             180
+#define LIGHT_CLKGEN_EMMC1_ACLK                        181
+#define LIGHT_CLKGEN_EMMC1_REF_CLK             182
+#define LIGHT_CLKGEN_EMMC1_OSC_CLK             183
+#define LIGHT_CLKGEN_PWM_CCLK                  184
+#define LIGHT_CLKGEN_QSPI0_SSI_CLK             185
+#define LIGHT_CLKGEN_QSPI1_SSI_CLK             186
+#define LIGHT_CLKGEN_SPI_SSI_CLK               187
+#define LIGHT_CLKGEN_GPIO0_DBCLK               188
+#define LIGHT_CLKGEN_GPIO1_DBCLK               189
+#define LIGHT_CLKGEN_GPIO2_DBCLK               190
+#define LIGHT_CLKGEN_DMAC_1_HCLK               191
+#define LIGHT_CLKGEN_DMAC_2_HCLK               192
+#define LIGHT_CLKGEN_DMAC_3_HCLK               193
+#define LIGHT_EMMC_CLK_DIV                     194
+#define LIGHT_EMMC0_OSC_CLK                    195
+#define LIGHT_EMMC1_OSC_CLK                    196
+#define LIGHT_PWM_CCLK                         197
+#define LIGHT_USB3_PHY_REF_CLK                 198
+#define LIGHT_SPI_CLK                          199
+#define LIGHT_GPIO_DBCLK                       200
+#define LIGHT_X2H_HCLK                         201
+
+#define LIGHT_CLK_END                          202
+#endif
diff --git a/include/dt-bindings/clock/light-visys.h b/include/dt-bindings/clock/light-visys.h
new file mode 100644 (file)
index 0000000..53fed0b
--- /dev/null
@@ -0,0 +1,54 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2022 Alibaba Group Holding Limited.
+ */
+
+#ifndef _LIGHT_VISYS_H
+#define _LIGHT_VISYS_H
+
+#define LIGHT_CLKGEN_VISYS_ACLK                              0
+#define LIGHT_CLKGEN_DW200_ACLK                              1
+#define LIGHT_CLKGEN_AXI4_VISYS1_ACLK                2
+#define LIGHT_CLKGEN_AXI4_VISYS2_ACLK                 3
+#define LIGHT_CLKGEN_AXI4_VISYS3_ACLK                 4
+#define LIGHT_CLKGEN_ISP0_ACLK                        5
+#define LIGHT_CLKGEN_ISP_RY_ACLK                      6
+#define LIGHT_CLKGEN_ISP_VENC_SHAKE_ACLK              7
+#define LIGHT_CLKGEN_VIPRE_ACLK                       8
+#define LIGHT_CLKGEN_VISYS_SLAVE_HCLK                 9
+#define LIGHT_CLKGEN_ISP0_S_HCLK                      10
+#define LIGHT_CLKGEN_DW200_HCLK                       11
+#define LIGHT_CLKGEN_ISP_RY_HCLK                      12
+#define LIGHT_CLKGEN_MIPI_CSI0_PCLK                   13
+#define LIGHT_CLKGEN_MIPI_CSI0_FPCLK                  14
+#define LIGHT_CLKGEN_MIPI_CSI1_PCLK                   15
+#define LIGHT_CLKGEN_MIPI_CSI1_FPCLK                  16
+#define LIGHT_CLKGEN_MIPI_CSI2_PCLK                   17
+#define LIGHT_CLKGEN_MIPI_CSI2_FPCLK                  18
+#define LIGHT_CLKGEN_VIPRE_PCLK                       19
+#define LIGHT_CLKGEN_VISYS_PCLK                       20
+#define LIGHT_CLKGEN_VISYS_SYSREG_PCLK                21
+#define LIGHT_CLKGEN_ISP_VENC_SHAKE_PCLK              22
+#define LIGHT_CLKGEN_MIPI_CSI0_PIXCLK                 23
+#define LIGHT_CLKGEN_MIPI_CSI1_PIXCLK                 24
+#define LIGHT_CLKGEN_MIPI_CSI2_PIXCLK                 25
+#define LIGHT_CLKGEN_VIPRE_PIXELCLK                   26
+#define LIGHT_CLKGEN_ISP_PIXELCLK                     27
+#define LIGHT_CLKGEN_MIPI_CSI0_CFG_CLK                28
+#define LIGHT_CLKGEN_MIPI_CSI1_CFG_CLK                29
+#define LIGHT_CLKGEN_MIPI_CSI2_CFG_CLK                30
+#define LIGHT_CLKGEN_DW200_CLK_VSE                    31
+#define LIGHT_CLKGEN_DW200_CLK_DWE                    32
+#define LIGHT_CLKGEN_ISP0_CLK                         33
+#define LIGHT_CLKGEN_ISP1_CLK                         34
+#define LIGHT_CLKGEN_ISP_RY_CCLK                      35
+#define LIGHT_CLKGEN_MIPI_CSI_SCANBYTECLK             36
+#define LIGHT_CLKGEN_MIPI_CSI_SCANCLK                 37
+#define LIGHT_CLKGEN_ISP1_PIXELCLK                   38
+#define LIGHT_CLKGEN_ISP0_PIXELCLK                   39
+#define LIGHT_CLKGEN_ISP1_HCLK                       40
+#define LIGHT_CLKGEN_ISP0_HCLK                       41
+#define LIGHT_CLKGEN_ISP1_ACLK                       42
+#define LIGHT_CLKGEN_VISYS_CLK_END                   43
+
+#endif
diff --git a/include/dt-bindings/clock/light-vosys.h b/include/dt-bindings/clock/light-vosys.h
new file mode 100644 (file)
index 0000000..dbdd7fa
--- /dev/null
@@ -0,0 +1,41 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2022 Alibaba Group Holding Limited.
+ */
+
+#ifndef LIGHT_VOSYS_H
+#define LIGHT_VOSYS_H
+
+#define LIGHT_CLKGEN_AXI4_VO_PCLK                      0
+#define LIGHT_CLKGEN_IOPMP_VOSYS_DPU_PCLK              1
+#define LIGHT_CLKGEN_IOPMP_VOSYS_DPU1_PCLK             2
+#define LIGHT_CLKGEN_IOPMP_VOSYS_GPU_PCLK              3
+#define LIGHT_CLKGEN_HDMI_PCLK                         4
+#define LIGHT_CLKGEN_MIPIDSI0_PCLK                     5
+#define LIGHT_CLKGEN_MIPIDSI1_PCLK                     6
+#define LIGHT_CLKGEN_AXI4_VO_ACLK                      7
+#define LIGHT_CLKGEN_IOPMP_GPU_ACLK                    8
+#define LIGHT_CLKGEN_IOPMP_DPU_ACLK                    9
+#define LIGHT_CLKGEN_IOPMP_DPU1_ACLK                   10
+#define LIGHT_CLKGEN_X2H_DPU_ACLK                      11
+#define LIGHT_CLKGEN_X2H_DPU1_ACLK                     12
+#define LIGHT_CLKGEN_MIPIDSI0_PIXCLK                   13
+#define LIGHT_CLKGEN_HDMI_PIXCLK                       14
+#define LIGHT_CLKGEN_MIPIDSI1_PIXCLK                   15
+#define LIGHT_CLKGEN_HDMI_SFR_CLK                      16
+#define LIGHT_CLKGEN_HDMI_CEC_CLK                      17
+#define LIGHT_CLKGEN_HDMI_I2S_CLK                      18
+#define LIGHT_CLKGEN_MIPIDSI0_CFG_CLK                  19
+#define LIGHT_CLKGEN_MIPIDSI1_CFG_CLK                  20
+#define LIGHT_CLKGEN_MIPIDSI0_REFCLK                   21
+#define LIGHT_CLKGEN_MIPIDSI1_REFCLK                   22
+#define LIGHT_CLKGEN_GPU_CORE_CLK                      23
+#define LIGHT_CLKGEN_GPU_CFG_ACLK                      24
+#define LIGHT_CLKGEN_DPU_HCLK                          25
+#define LIGHT_CLKGEN_DPU_ACLK                          26
+#define LIGHT_CLKGEN_DPU_CCLK                          27
+#define LIGHT_CLKGEN_DPU_PIXCLK0                       28
+#define LIGHT_CLKGEN_DPU_PIXCLK1                        29
+#define LIGHT_CLKGEN_VOSYS_CLK_END                     30
+
+#endif
diff --git a/include/dt-bindings/clock/light-vpsys.h b/include/dt-bindings/clock/light-vpsys.h
new file mode 100644 (file)
index 0000000..70d18bb
--- /dev/null
@@ -0,0 +1,26 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2022 Alibaba Group Holding Limited.
+ */
+
+#ifndef _LIGHT_VPSYS_H
+#define _LIGHT_VPSYS_H
+
+#define LIGHT_VPSYS_G2D_PCLK           0
+#define LIGHT_VPSYS_G2D_ACLK           1
+#define LIGHT_VPSYS_G2D_CCLK           2
+#define LIGHT_VPSYS_FCE_PCLK           3
+#define LIGHT_VPSYS_FCE_ACLK           4
+#define LIGHT_VPSYS_VDEC_PCLK          5
+#define LIGHT_VPSYS_VDEC_ACLK          6
+#define LIGHT_VPSYS_VDEC_CCLK          7
+#define LIGHT_VPSYS_AXI_ACLK           8
+#define LIGHT_VPSYS_VENC_CCLK          9
+#define LIGHT_VPSYS_VENC_PCLK          10
+#define LIGHT_VPSYS_VENC_ACLK          11
+#define LIGHT_VPSYS_G2D_CCLK_DIV    12
+#define LIGHT_VPSYS_DEC_CCLK_DIV    13
+#define LIGHT_VPSYS_CLK_END            14
+
+#endif
+