xref: /linux/drivers/clk/meson/s4-peripherals.c (revision 3a39d672e7f48b8d6b91a09afa4b55352773b4b5)
157b55c76SYu Tu // SPDX-License-Identifier: (GPL-2.0-only OR MIT)
257b55c76SYu Tu /*
357b55c76SYu Tu  * Amlogic S4 Peripherals Clock Controller Driver
457b55c76SYu Tu  *
557b55c76SYu Tu  * Copyright (c) 2022-2023 Amlogic, inc. All rights reserved
657b55c76SYu Tu  * Author: Yu Tu <yu.tu@amlogic.com>
757b55c76SYu Tu  */
857b55c76SYu Tu 
957b55c76SYu Tu #include <linux/clk-provider.h>
1057b55c76SYu Tu #include <linux/of_device.h>
1157b55c76SYu Tu #include <linux/platform_device.h>
1257b55c76SYu Tu 
1357b55c76SYu Tu #include "clk-regmap.h"
1457b55c76SYu Tu #include "vid-pll-div.h"
1557b55c76SYu Tu #include "clk-dualdiv.h"
1657b55c76SYu Tu #include "s4-peripherals.h"
1757b55c76SYu Tu #include "meson-clkc-utils.h"
1857b55c76SYu Tu #include <dt-bindings/clock/amlogic,s4-peripherals-clkc.h>
1957b55c76SYu Tu 
2057b55c76SYu Tu static struct clk_regmap s4_rtc_32k_by_oscin_clkin = {
2157b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
2257b55c76SYu Tu 		.offset = CLKCTRL_RTC_BY_OSCIN_CTRL0,
2357b55c76SYu Tu 		.bit_idx = 31,
2457b55c76SYu Tu 	},
2557b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
2657b55c76SYu Tu 		.name = "rtc_32k_by_oscin_clkin",
2757b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
2857b55c76SYu Tu 		.parent_data = (const struct clk_parent_data []) {
2957b55c76SYu Tu 			{ .fw_name = "xtal", }
3057b55c76SYu Tu 		},
3157b55c76SYu Tu 		.num_parents = 1,
3257b55c76SYu Tu 	},
3357b55c76SYu Tu };
3457b55c76SYu Tu 
3557b55c76SYu Tu static const struct meson_clk_dualdiv_param s4_32k_div_table[] = {
3657b55c76SYu Tu 	{
3757b55c76SYu Tu 		.dual	= 1,
3857b55c76SYu Tu 		.n1	= 733,
3957b55c76SYu Tu 		.m1	= 8,
4057b55c76SYu Tu 		.n2	= 732,
4157b55c76SYu Tu 		.m2	= 11,
4257b55c76SYu Tu 	},
4357b55c76SYu Tu 	{}
4457b55c76SYu Tu };
4557b55c76SYu Tu 
4657b55c76SYu Tu static struct clk_regmap s4_rtc_32k_by_oscin_div = {
4757b55c76SYu Tu 	.data = &(struct meson_clk_dualdiv_data){
4857b55c76SYu Tu 		.n1 = {
4957b55c76SYu Tu 			.reg_off = CLKCTRL_RTC_BY_OSCIN_CTRL0,
5057b55c76SYu Tu 			.shift   = 0,
5157b55c76SYu Tu 			.width   = 12,
5257b55c76SYu Tu 		},
5357b55c76SYu Tu 		.n2 = {
5457b55c76SYu Tu 			.reg_off = CLKCTRL_RTC_BY_OSCIN_CTRL0,
5557b55c76SYu Tu 			.shift   = 12,
5657b55c76SYu Tu 			.width   = 12,
5757b55c76SYu Tu 		},
5857b55c76SYu Tu 		.m1 = {
5957b55c76SYu Tu 			.reg_off = CLKCTRL_RTC_BY_OSCIN_CTRL1,
6057b55c76SYu Tu 			.shift   = 0,
6157b55c76SYu Tu 			.width   = 12,
6257b55c76SYu Tu 		},
6357b55c76SYu Tu 		.m2 = {
6457b55c76SYu Tu 			.reg_off = CLKCTRL_RTC_BY_OSCIN_CTRL1,
6557b55c76SYu Tu 			.shift   = 12,
6657b55c76SYu Tu 			.width   = 12,
6757b55c76SYu Tu 		},
6857b55c76SYu Tu 		.dual = {
6957b55c76SYu Tu 			.reg_off = CLKCTRL_RTC_BY_OSCIN_CTRL0,
7057b55c76SYu Tu 			.shift   = 28,
7157b55c76SYu Tu 			.width   = 1,
7257b55c76SYu Tu 		},
7357b55c76SYu Tu 		.table = s4_32k_div_table,
7457b55c76SYu Tu 	},
7557b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
7657b55c76SYu Tu 		.name = "rtc_32k_by_oscin_div",
7757b55c76SYu Tu 		.ops = &meson_clk_dualdiv_ops,
7857b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
7957b55c76SYu Tu 			&s4_rtc_32k_by_oscin_clkin.hw
8057b55c76SYu Tu 		},
8157b55c76SYu Tu 		.num_parents = 1,
8257b55c76SYu Tu 	},
8357b55c76SYu Tu };
8457b55c76SYu Tu 
8557b55c76SYu Tu static struct clk_regmap s4_rtc_32k_by_oscin_sel = {
8657b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data) {
8757b55c76SYu Tu 		.offset = CLKCTRL_RTC_BY_OSCIN_CTRL1,
8857b55c76SYu Tu 		.mask = 0x1,
8957b55c76SYu Tu 		.shift = 24,
9057b55c76SYu Tu 		.flags = CLK_MUX_ROUND_CLOSEST,
9157b55c76SYu Tu 	},
9257b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
9357b55c76SYu Tu 		.name = "rtc_32k_by_oscin_sel",
9457b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
9557b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
9657b55c76SYu Tu 			&s4_rtc_32k_by_oscin_div.hw,
9757b55c76SYu Tu 			&s4_rtc_32k_by_oscin_clkin.hw,
9857b55c76SYu Tu 		},
9957b55c76SYu Tu 		.num_parents = 2,
10057b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
10157b55c76SYu Tu 	},
10257b55c76SYu Tu };
10357b55c76SYu Tu 
10457b55c76SYu Tu static struct clk_regmap s4_rtc_32k_by_oscin = {
10557b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
10657b55c76SYu Tu 		.offset = CLKCTRL_RTC_BY_OSCIN_CTRL0,
10757b55c76SYu Tu 		.bit_idx = 30,
10857b55c76SYu Tu 	},
10957b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
11057b55c76SYu Tu 		.name = "rtc_32k_by_oscin",
11157b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
11257b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
11357b55c76SYu Tu 			&s4_rtc_32k_by_oscin_sel.hw
11457b55c76SYu Tu 		},
11557b55c76SYu Tu 		.num_parents = 1,
11657b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
11757b55c76SYu Tu 	},
11857b55c76SYu Tu };
11957b55c76SYu Tu 
12057b55c76SYu Tu static struct clk_regmap s4_rtc_clk = {
12157b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data) {
12257b55c76SYu Tu 		.offset = CLKCTRL_RTC_CTRL,
12357b55c76SYu Tu 		.mask = 0x3,
12457b55c76SYu Tu 		.shift = 0,
12557b55c76SYu Tu 		.flags = CLK_MUX_ROUND_CLOSEST,
12657b55c76SYu Tu 	},
12757b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
12857b55c76SYu Tu 		.name = "rtc_clk_sel",
12957b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
13057b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
13157b55c76SYu Tu 			&s4_rtc_32k_by_oscin.hw,
13257b55c76SYu Tu 			&s4_rtc_32k_by_oscin_div.hw,
13357b55c76SYu Tu 		},
13457b55c76SYu Tu 		.num_parents = 2,
13557b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
13657b55c76SYu Tu 	},
13757b55c76SYu Tu };
13857b55c76SYu Tu 
13957b55c76SYu Tu /* The index 5 is AXI_CLK, which is dedicated to AXI. So skip it. */
14057b55c76SYu Tu static u32 mux_table_sys_ab_clk_sel[] = { 0, 1, 2, 3, 4, 6, 7 };
14157b55c76SYu Tu static const struct clk_parent_data sys_ab_clk_parent_data[] = {
14257b55c76SYu Tu 	{ .fw_name = "xtal" },
14357b55c76SYu Tu 	{ .fw_name = "fclk_div2" },
14457b55c76SYu Tu 	{ .fw_name = "fclk_div3" },
14557b55c76SYu Tu 	{ .fw_name = "fclk_div4" },
14657b55c76SYu Tu 	{ .fw_name = "fclk_div5" },
14757b55c76SYu Tu 	{ .fw_name = "fclk_div7" },
14857b55c76SYu Tu 	{ .hw = &s4_rtc_clk.hw }
14957b55c76SYu Tu };
15057b55c76SYu Tu 
15157b55c76SYu Tu /*
15257b55c76SYu Tu  * This clock is initialized by ROMcode.
15357b55c76SYu Tu  * The chip was changed SYS CLK for security reasons. SYS CLK registers are not writable
15457b55c76SYu Tu  * in the kernel phase. Write of SYS related register will cause the system to crash.
15557b55c76SYu Tu  * Meanwhile, these clock won't ever change at runtime.
15657b55c76SYu Tu  * For the above reasons, we can only use ro_ops for SYS related clocks.
15757b55c76SYu Tu  */
15857b55c76SYu Tu static struct clk_regmap s4_sysclk_b_sel = {
15957b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data){
16057b55c76SYu Tu 		.offset = CLKCTRL_SYS_CLK_CTRL0,
16157b55c76SYu Tu 		.mask = 0x7,
16257b55c76SYu Tu 		.shift = 26,
16357b55c76SYu Tu 		.table = mux_table_sys_ab_clk_sel,
16457b55c76SYu Tu 	},
16557b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
16657b55c76SYu Tu 		.name = "sysclk_b_sel",
16757b55c76SYu Tu 		.ops = &clk_regmap_mux_ro_ops,
16857b55c76SYu Tu 		.parent_data = sys_ab_clk_parent_data,
16957b55c76SYu Tu 		.num_parents = ARRAY_SIZE(sys_ab_clk_parent_data),
17057b55c76SYu Tu 	},
17157b55c76SYu Tu };
17257b55c76SYu Tu 
17357b55c76SYu Tu static struct clk_regmap s4_sysclk_b_div = {
17457b55c76SYu Tu 	.data = &(struct clk_regmap_div_data){
17557b55c76SYu Tu 		.offset = CLKCTRL_SYS_CLK_CTRL0,
17657b55c76SYu Tu 		.shift = 16,
17757b55c76SYu Tu 		.width = 10,
17857b55c76SYu Tu 	},
17957b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
18057b55c76SYu Tu 		.name = "sysclk_b_div",
18157b55c76SYu Tu 		.ops = &clk_regmap_divider_ro_ops,
18257b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
18357b55c76SYu Tu 			&s4_sysclk_b_sel.hw
18457b55c76SYu Tu 		},
18557b55c76SYu Tu 		.num_parents = 1,
18657b55c76SYu Tu 	},
18757b55c76SYu Tu };
18857b55c76SYu Tu 
18957b55c76SYu Tu static struct clk_regmap s4_sysclk_b = {
19057b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
19157b55c76SYu Tu 		.offset = CLKCTRL_SYS_CLK_CTRL0,
19257b55c76SYu Tu 		.bit_idx = 29,
19357b55c76SYu Tu 	},
19457b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
19557b55c76SYu Tu 		.name = "sysclk_b",
19657b55c76SYu Tu 		.ops = &clk_regmap_gate_ro_ops,
19757b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
19857b55c76SYu Tu 			&s4_sysclk_b_div.hw
19957b55c76SYu Tu 		},
20057b55c76SYu Tu 		.num_parents = 1,
20157b55c76SYu Tu 	},
20257b55c76SYu Tu };
20357b55c76SYu Tu 
20457b55c76SYu Tu static struct clk_regmap s4_sysclk_a_sel = {
20557b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data){
20657b55c76SYu Tu 		.offset = CLKCTRL_SYS_CLK_CTRL0,
20757b55c76SYu Tu 		.mask = 0x7,
20857b55c76SYu Tu 		.shift = 10,
20957b55c76SYu Tu 		.table = mux_table_sys_ab_clk_sel,
21057b55c76SYu Tu 	},
21157b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
21257b55c76SYu Tu 		.name = "sysclk_a_sel",
21357b55c76SYu Tu 		.ops = &clk_regmap_mux_ro_ops,
21457b55c76SYu Tu 		.parent_data = sys_ab_clk_parent_data,
21557b55c76SYu Tu 		.num_parents = ARRAY_SIZE(sys_ab_clk_parent_data),
21657b55c76SYu Tu 	},
21757b55c76SYu Tu };
21857b55c76SYu Tu 
21957b55c76SYu Tu static struct clk_regmap s4_sysclk_a_div = {
22057b55c76SYu Tu 	.data = &(struct clk_regmap_div_data){
22157b55c76SYu Tu 		.offset = CLKCTRL_SYS_CLK_CTRL0,
22257b55c76SYu Tu 		.shift = 0,
22357b55c76SYu Tu 		.width = 10,
22457b55c76SYu Tu 	},
22557b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
22657b55c76SYu Tu 		.name = "sysclk_a_div",
22757b55c76SYu Tu 		.ops = &clk_regmap_divider_ro_ops,
22857b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
22957b55c76SYu Tu 			&s4_sysclk_a_sel.hw
23057b55c76SYu Tu 		},
23157b55c76SYu Tu 		.num_parents = 1,
23257b55c76SYu Tu 	},
23357b55c76SYu Tu };
23457b55c76SYu Tu 
23557b55c76SYu Tu static struct clk_regmap s4_sysclk_a = {
23657b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
23757b55c76SYu Tu 		.offset = CLKCTRL_SYS_CLK_CTRL0,
23857b55c76SYu Tu 		.bit_idx = 13,
23957b55c76SYu Tu 	},
24057b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
24157b55c76SYu Tu 		.name = "sysclk_a",
24257b55c76SYu Tu 		.ops = &clk_regmap_gate_ro_ops,
24357b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
24457b55c76SYu Tu 			&s4_sysclk_a_div.hw
24557b55c76SYu Tu 		},
24657b55c76SYu Tu 		.num_parents = 1,
24757b55c76SYu Tu 	},
24857b55c76SYu Tu };
24957b55c76SYu Tu 
25057b55c76SYu Tu static struct clk_regmap s4_sys_clk = {
25157b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data){
25257b55c76SYu Tu 		.offset = CLKCTRL_SYS_CLK_CTRL0,
25357b55c76SYu Tu 		.mask = 0x1,
25457b55c76SYu Tu 		.shift = 31,
25557b55c76SYu Tu 	},
25657b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
25757b55c76SYu Tu 		.name = "sys_clk",
25857b55c76SYu Tu 		.ops = &clk_regmap_mux_ro_ops,
25957b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
26057b55c76SYu Tu 			&s4_sysclk_a.hw,
26157b55c76SYu Tu 			&s4_sysclk_b.hw
26257b55c76SYu Tu 		},
26357b55c76SYu Tu 		.num_parents = 2,
26457b55c76SYu Tu 	},
26557b55c76SYu Tu };
26657b55c76SYu Tu 
26757b55c76SYu Tu static struct clk_regmap s4_ceca_32k_clkin = {
26857b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
26957b55c76SYu Tu 		.offset = CLKCTRL_CECA_CTRL0,
27057b55c76SYu Tu 		.bit_idx = 31,
27157b55c76SYu Tu 	},
27257b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
27357b55c76SYu Tu 		.name = "ceca_32k_clkin",
27457b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
27557b55c76SYu Tu 		.parent_data = (const struct clk_parent_data []) {
27657b55c76SYu Tu 			{ .fw_name = "xtal", }
27757b55c76SYu Tu 		},
27857b55c76SYu Tu 		.num_parents = 1,
27957b55c76SYu Tu 	},
28057b55c76SYu Tu };
28157b55c76SYu Tu 
28257b55c76SYu Tu static struct clk_regmap s4_ceca_32k_div = {
28357b55c76SYu Tu 	.data = &(struct meson_clk_dualdiv_data){
28457b55c76SYu Tu 		.n1 = {
28557b55c76SYu Tu 			.reg_off = CLKCTRL_CECA_CTRL0,
28657b55c76SYu Tu 			.shift   = 0,
28757b55c76SYu Tu 			.width   = 12,
28857b55c76SYu Tu 		},
28957b55c76SYu Tu 		.n2 = {
29057b55c76SYu Tu 			.reg_off = CLKCTRL_CECA_CTRL0,
29157b55c76SYu Tu 			.shift   = 12,
29257b55c76SYu Tu 			.width   = 12,
29357b55c76SYu Tu 		},
29457b55c76SYu Tu 		.m1 = {
29557b55c76SYu Tu 			.reg_off = CLKCTRL_CECA_CTRL1,
29657b55c76SYu Tu 			.shift   = 0,
29757b55c76SYu Tu 			.width   = 12,
29857b55c76SYu Tu 		},
29957b55c76SYu Tu 		.m2 = {
30057b55c76SYu Tu 			.reg_off = CLKCTRL_CECA_CTRL1,
30157b55c76SYu Tu 			.shift   = 12,
30257b55c76SYu Tu 			.width   = 12,
30357b55c76SYu Tu 		},
30457b55c76SYu Tu 		.dual = {
30557b55c76SYu Tu 			.reg_off = CLKCTRL_CECA_CTRL0,
30657b55c76SYu Tu 			.shift   = 28,
30757b55c76SYu Tu 			.width   = 1,
30857b55c76SYu Tu 		},
30957b55c76SYu Tu 		.table = s4_32k_div_table,
31057b55c76SYu Tu 	},
31157b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
31257b55c76SYu Tu 		.name = "ceca_32k_div",
31357b55c76SYu Tu 		.ops = &meson_clk_dualdiv_ops,
31457b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
31557b55c76SYu Tu 			&s4_ceca_32k_clkin.hw
31657b55c76SYu Tu 		},
31757b55c76SYu Tu 		.num_parents = 1,
31857b55c76SYu Tu 	},
31957b55c76SYu Tu };
32057b55c76SYu Tu 
32157b55c76SYu Tu static struct clk_regmap s4_ceca_32k_sel_pre = {
32257b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data) {
32357b55c76SYu Tu 		.offset = CLKCTRL_CECA_CTRL1,
32457b55c76SYu Tu 		.mask = 0x1,
32557b55c76SYu Tu 		.shift = 24,
32657b55c76SYu Tu 		.flags = CLK_MUX_ROUND_CLOSEST,
32757b55c76SYu Tu 	},
32857b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
32957b55c76SYu Tu 		.name = "ceca_32k_sel_pre",
33057b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
33157b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
33257b55c76SYu Tu 			&s4_ceca_32k_div.hw,
33357b55c76SYu Tu 			&s4_ceca_32k_clkin.hw
33457b55c76SYu Tu 		},
33557b55c76SYu Tu 		.num_parents = 2,
33657b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
33757b55c76SYu Tu 	},
33857b55c76SYu Tu };
33957b55c76SYu Tu 
34057b55c76SYu Tu static struct clk_regmap s4_ceca_32k_sel = {
34157b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data) {
34257b55c76SYu Tu 		.offset = CLKCTRL_CECA_CTRL1,
34357b55c76SYu Tu 		.mask = 0x1,
34457b55c76SYu Tu 		.shift = 31,
34557b55c76SYu Tu 		.flags = CLK_MUX_ROUND_CLOSEST,
34657b55c76SYu Tu 	},
34757b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
34857b55c76SYu Tu 		.name = "ceca_32k_sel",
34957b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
35057b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
35157b55c76SYu Tu 			&s4_ceca_32k_sel_pre.hw,
35257b55c76SYu Tu 			&s4_rtc_clk.hw
35357b55c76SYu Tu 		},
35457b55c76SYu Tu 		.num_parents = 2,
35557b55c76SYu Tu 	},
35657b55c76SYu Tu };
35757b55c76SYu Tu 
35857b55c76SYu Tu static struct clk_regmap s4_ceca_32k_clkout = {
35957b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
36057b55c76SYu Tu 		.offset = CLKCTRL_CECA_CTRL0,
36157b55c76SYu Tu 		.bit_idx = 30,
36257b55c76SYu Tu 	},
36357b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
36457b55c76SYu Tu 		.name = "ceca_32k_clkout",
36557b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
36657b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
36757b55c76SYu Tu 			&s4_ceca_32k_sel.hw
36857b55c76SYu Tu 		},
36957b55c76SYu Tu 		.num_parents = 1,
37057b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
37157b55c76SYu Tu 	},
37257b55c76SYu Tu };
37357b55c76SYu Tu 
37457b55c76SYu Tu static struct clk_regmap s4_cecb_32k_clkin = {
37557b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
37657b55c76SYu Tu 		.offset = CLKCTRL_CECB_CTRL0,
37757b55c76SYu Tu 		.bit_idx = 31,
37857b55c76SYu Tu 	},
37957b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
38057b55c76SYu Tu 		.name = "cecb_32k_clkin",
38157b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
38257b55c76SYu Tu 		.parent_data = (const struct clk_parent_data []) {
38357b55c76SYu Tu 			{ .fw_name = "xtal", }
38457b55c76SYu Tu 		},
38557b55c76SYu Tu 		.num_parents = 1,
38657b55c76SYu Tu 	},
38757b55c76SYu Tu };
38857b55c76SYu Tu 
38957b55c76SYu Tu static struct clk_regmap s4_cecb_32k_div = {
39057b55c76SYu Tu 	.data = &(struct meson_clk_dualdiv_data){
39157b55c76SYu Tu 		.n1 = {
39257b55c76SYu Tu 			.reg_off = CLKCTRL_CECB_CTRL0,
39357b55c76SYu Tu 			.shift   = 0,
39457b55c76SYu Tu 			.width   = 12,
39557b55c76SYu Tu 		},
39657b55c76SYu Tu 		.n2 = {
39757b55c76SYu Tu 			.reg_off = CLKCTRL_CECB_CTRL0,
39857b55c76SYu Tu 			.shift   = 12,
39957b55c76SYu Tu 			.width   = 12,
40057b55c76SYu Tu 		},
40157b55c76SYu Tu 		.m1 = {
40257b55c76SYu Tu 			.reg_off = CLKCTRL_CECB_CTRL1,
40357b55c76SYu Tu 			.shift   = 0,
40457b55c76SYu Tu 			.width   = 12,
40557b55c76SYu Tu 		},
40657b55c76SYu Tu 		.m2 = {
40757b55c76SYu Tu 			.reg_off = CLKCTRL_CECB_CTRL1,
40857b55c76SYu Tu 			.shift   = 12,
40957b55c76SYu Tu 			.width   = 12,
41057b55c76SYu Tu 		},
41157b55c76SYu Tu 		.dual = {
41257b55c76SYu Tu 			.reg_off = CLKCTRL_CECB_CTRL0,
41357b55c76SYu Tu 			.shift   = 28,
41457b55c76SYu Tu 			.width   = 1,
41557b55c76SYu Tu 		},
41657b55c76SYu Tu 		.table = s4_32k_div_table,
41757b55c76SYu Tu 	},
41857b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
41957b55c76SYu Tu 		.name = "cecb_32k_div",
42057b55c76SYu Tu 		.ops = &meson_clk_dualdiv_ops,
42157b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
42257b55c76SYu Tu 			&s4_cecb_32k_clkin.hw
42357b55c76SYu Tu 		},
42457b55c76SYu Tu 		.num_parents = 1,
42557b55c76SYu Tu 	},
42657b55c76SYu Tu };
42757b55c76SYu Tu 
42857b55c76SYu Tu static struct clk_regmap s4_cecb_32k_sel_pre = {
42957b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data) {
43057b55c76SYu Tu 		.offset = CLKCTRL_CECB_CTRL1,
43157b55c76SYu Tu 		.mask = 0x1,
43257b55c76SYu Tu 		.shift = 24,
43357b55c76SYu Tu 		.flags = CLK_MUX_ROUND_CLOSEST,
43457b55c76SYu Tu 	},
43557b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
43657b55c76SYu Tu 		.name = "cecb_32k_sel_pre",
43757b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
43857b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
43957b55c76SYu Tu 			&s4_cecb_32k_div.hw,
44057b55c76SYu Tu 			&s4_cecb_32k_clkin.hw
44157b55c76SYu Tu 		},
44257b55c76SYu Tu 		.num_parents = 2,
44357b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
44457b55c76SYu Tu 	},
44557b55c76SYu Tu };
44657b55c76SYu Tu 
44757b55c76SYu Tu static struct clk_regmap s4_cecb_32k_sel = {
44857b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data) {
44957b55c76SYu Tu 		.offset = CLKCTRL_CECB_CTRL1,
45057b55c76SYu Tu 		.mask = 0x1,
45157b55c76SYu Tu 		.shift = 31,
45257b55c76SYu Tu 		.flags = CLK_MUX_ROUND_CLOSEST,
45357b55c76SYu Tu 	},
45457b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
45557b55c76SYu Tu 		.name = "cecb_32k_sel",
45657b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
45757b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
45857b55c76SYu Tu 			&s4_cecb_32k_sel_pre.hw,
45957b55c76SYu Tu 			&s4_rtc_clk.hw
46057b55c76SYu Tu 		},
46157b55c76SYu Tu 		.num_parents = 2,
46257b55c76SYu Tu 	},
46357b55c76SYu Tu };
46457b55c76SYu Tu 
46557b55c76SYu Tu static struct clk_regmap s4_cecb_32k_clkout = {
46657b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
46757b55c76SYu Tu 		.offset = CLKCTRL_CECB_CTRL0,
46857b55c76SYu Tu 		.bit_idx = 30,
46957b55c76SYu Tu 	},
47057b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
47157b55c76SYu Tu 		.name = "cecb_32k_clkout",
47257b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
47357b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
47457b55c76SYu Tu 			&s4_cecb_32k_sel.hw
47557b55c76SYu Tu 		},
47657b55c76SYu Tu 		.num_parents = 1,
47757b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
47857b55c76SYu Tu 	},
47957b55c76SYu Tu };
48057b55c76SYu Tu 
48157b55c76SYu Tu static const struct clk_parent_data s4_sc_parent_data[] = {
48257b55c76SYu Tu 	{ .fw_name = "fclk_div4" },
48357b55c76SYu Tu 	{ .fw_name = "fclk_div3" },
48457b55c76SYu Tu 	{ .fw_name = "fclk_div5" },
48557b55c76SYu Tu 	{ .fw_name = "xtal", }
48657b55c76SYu Tu };
48757b55c76SYu Tu 
48857b55c76SYu Tu static struct clk_regmap s4_sc_clk_mux = {
48957b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data){
49057b55c76SYu Tu 		.offset = CLKCTRL_SC_CLK_CTRL,
49157b55c76SYu Tu 		.mask = 0x3,
49257b55c76SYu Tu 		.shift = 9,
49357b55c76SYu Tu 	},
49457b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
49557b55c76SYu Tu 		.name = "sc_clk_mux",
49657b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
49757b55c76SYu Tu 		.parent_data = s4_sc_parent_data,
49857b55c76SYu Tu 		.num_parents = ARRAY_SIZE(s4_sc_parent_data),
49957b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
50057b55c76SYu Tu 	},
50157b55c76SYu Tu };
50257b55c76SYu Tu 
50357b55c76SYu Tu static struct clk_regmap s4_sc_clk_div = {
50457b55c76SYu Tu 	.data = &(struct clk_regmap_div_data){
50557b55c76SYu Tu 		.offset = CLKCTRL_SC_CLK_CTRL,
50657b55c76SYu Tu 		.shift = 0,
50757b55c76SYu Tu 		.width = 8,
50857b55c76SYu Tu 	},
50957b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
51057b55c76SYu Tu 		.name = "sc_clk_div",
51157b55c76SYu Tu 		.ops = &clk_regmap_divider_ops,
51257b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
51357b55c76SYu Tu 			&s4_sc_clk_mux.hw
51457b55c76SYu Tu 		},
51557b55c76SYu Tu 		.num_parents = 1,
51657b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
51757b55c76SYu Tu 	},
51857b55c76SYu Tu };
51957b55c76SYu Tu 
52057b55c76SYu Tu static struct clk_regmap s4_sc_clk_gate = {
52157b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
52257b55c76SYu Tu 		.offset = CLKCTRL_SC_CLK_CTRL,
52357b55c76SYu Tu 		.bit_idx = 8,
52457b55c76SYu Tu 	},
52557b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
52657b55c76SYu Tu 		.name = "sc_clk_gate",
52757b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
52857b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
52957b55c76SYu Tu 			&s4_sc_clk_div.hw
53057b55c76SYu Tu 		},
53157b55c76SYu Tu 		.num_parents = 1,
53257b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
53357b55c76SYu Tu 	},
53457b55c76SYu Tu };
53557b55c76SYu Tu 
53657b55c76SYu Tu static struct clk_regmap s4_12_24M_clk_gate = {
53757b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
53857b55c76SYu Tu 		.offset = CLKCTRL_CLK12_24_CTRL,
53957b55c76SYu Tu 		.bit_idx = 11,
54057b55c76SYu Tu 	},
54157b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
54257b55c76SYu Tu 		.name = "12_24m_gate",
54357b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
54457b55c76SYu Tu 		.parent_data = (const struct clk_parent_data []) {
54557b55c76SYu Tu 			{ .fw_name = "xtal", }
54657b55c76SYu Tu 		},
54757b55c76SYu Tu 		.num_parents = 1,
54857b55c76SYu Tu 	},
54957b55c76SYu Tu };
55057b55c76SYu Tu 
55157b55c76SYu Tu static struct clk_fixed_factor s4_12M_clk_div = {
55257b55c76SYu Tu 	.mult = 1,
55357b55c76SYu Tu 	.div = 2,
55457b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
55557b55c76SYu Tu 		.name = "12M",
55657b55c76SYu Tu 		.ops = &clk_fixed_factor_ops,
55757b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
55857b55c76SYu Tu 			&s4_12_24M_clk_gate.hw
55957b55c76SYu Tu 		},
56057b55c76SYu Tu 		.num_parents = 1,
56157b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
56257b55c76SYu Tu 	},
56357b55c76SYu Tu };
56457b55c76SYu Tu 
56557b55c76SYu Tu static struct clk_regmap s4_12_24M_clk = {
56657b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data){
56757b55c76SYu Tu 		.offset = CLKCTRL_CLK12_24_CTRL,
56857b55c76SYu Tu 		.mask = 0x1,
56957b55c76SYu Tu 		.shift = 10,
57057b55c76SYu Tu 	},
57157b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
57257b55c76SYu Tu 		.name = "12_24m",
57357b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
57457b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
57557b55c76SYu Tu 			&s4_12_24M_clk_gate.hw,
57657b55c76SYu Tu 			&s4_12M_clk_div.hw,
57757b55c76SYu Tu 		},
57857b55c76SYu Tu 		.num_parents = 2,
57957b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
58057b55c76SYu Tu 	},
58157b55c76SYu Tu };
58257b55c76SYu Tu 
58357b55c76SYu Tu /* Video Clocks */
58457b55c76SYu Tu static struct clk_regmap s4_vid_pll_div = {
58557b55c76SYu Tu 	.data = &(struct meson_vid_pll_div_data){
58657b55c76SYu Tu 		.val = {
58757b55c76SYu Tu 			.reg_off = CLKCTRL_VID_PLL_CLK_DIV,
58857b55c76SYu Tu 			.shift   = 0,
58957b55c76SYu Tu 			.width   = 15,
59057b55c76SYu Tu 		},
59157b55c76SYu Tu 		.sel = {
59257b55c76SYu Tu 			.reg_off = CLKCTRL_VID_PLL_CLK_DIV,
59357b55c76SYu Tu 			.shift   = 16,
59457b55c76SYu Tu 			.width   = 2,
59557b55c76SYu Tu 		},
59657b55c76SYu Tu 	},
59757b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
59857b55c76SYu Tu 		.name = "vid_pll_div",
59957b55c76SYu Tu 		/*
60057b55c76SYu Tu 		 * TODO meson_vid_pll_div_ro_ops to meson_vid_pll_div_ops
60157b55c76SYu Tu 		 */
60257b55c76SYu Tu 		.ops = &meson_vid_pll_div_ro_ops,
60357b55c76SYu Tu 		.parent_data = (const struct clk_parent_data []) {
60457b55c76SYu Tu 			{ .fw_name = "hdmi_pll", }
60557b55c76SYu Tu 		},
60657b55c76SYu Tu 		.num_parents = 1,
60757b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
60857b55c76SYu Tu 	},
60957b55c76SYu Tu };
61057b55c76SYu Tu 
61157b55c76SYu Tu static struct clk_regmap s4_vid_pll_sel = {
61257b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data){
61357b55c76SYu Tu 		.offset = CLKCTRL_VID_PLL_CLK_DIV,
61457b55c76SYu Tu 		.mask = 0x1,
61557b55c76SYu Tu 		.shift = 18,
61657b55c76SYu Tu 	},
61757b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
61857b55c76SYu Tu 		.name = "vid_pll_sel",
61957b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
62057b55c76SYu Tu 		.parent_data = (const struct clk_parent_data []) {
62157b55c76SYu Tu 			{ .hw = &s4_vid_pll_div.hw },
62257b55c76SYu Tu 			{ .fw_name = "hdmi_pll", }
62357b55c76SYu Tu 		},
62457b55c76SYu Tu 		.num_parents = 2,
62557b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
62657b55c76SYu Tu 	},
62757b55c76SYu Tu };
62857b55c76SYu Tu 
62957b55c76SYu Tu static struct clk_regmap s4_vid_pll = {
63057b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
63157b55c76SYu Tu 		.offset = CLKCTRL_VID_PLL_CLK_DIV,
63257b55c76SYu Tu 		.bit_idx = 19,
63357b55c76SYu Tu 	},
63457b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
63557b55c76SYu Tu 		.name = "vid_pll",
63657b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
63757b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
63857b55c76SYu Tu 			&s4_vid_pll_sel.hw
63957b55c76SYu Tu 		},
64057b55c76SYu Tu 		.num_parents = 1,
64157b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
64257b55c76SYu Tu 	},
64357b55c76SYu Tu };
64457b55c76SYu Tu 
64557b55c76SYu Tu static const struct clk_parent_data s4_vclk_parent_data[] = {
64657b55c76SYu Tu 	{ .hw = &s4_vid_pll.hw },
64757b55c76SYu Tu 	{ .fw_name = "gp0_pll", },
64857b55c76SYu Tu 	{ .fw_name = "hifi_pll", },
64957b55c76SYu Tu 	{ .fw_name = "mpll1", },
65057b55c76SYu Tu 	{ .fw_name = "fclk_div3", },
65157b55c76SYu Tu 	{ .fw_name = "fclk_div4", },
65257b55c76SYu Tu 	{ .fw_name = "fclk_div5", },
65357b55c76SYu Tu 	{ .fw_name = "fclk_div7", },
65457b55c76SYu Tu };
65557b55c76SYu Tu 
65657b55c76SYu Tu static struct clk_regmap s4_vclk_sel = {
65757b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data){
65857b55c76SYu Tu 		.offset = CLKCTRL_VID_CLK_CTRL,
65957b55c76SYu Tu 		.mask = 0x7,
66057b55c76SYu Tu 		.shift = 16,
66157b55c76SYu Tu 	},
66257b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
66357b55c76SYu Tu 		.name = "vclk_sel",
66457b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
66557b55c76SYu Tu 		.parent_data = s4_vclk_parent_data,
66657b55c76SYu Tu 		.num_parents = ARRAY_SIZE(s4_vclk_parent_data),
66757b55c76SYu Tu 		.flags = 0,
66857b55c76SYu Tu 	},
66957b55c76SYu Tu };
67057b55c76SYu Tu 
67157b55c76SYu Tu static struct clk_regmap s4_vclk2_sel = {
67257b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data){
67357b55c76SYu Tu 		.offset = CLKCTRL_VIID_CLK_CTRL,
67457b55c76SYu Tu 		.mask = 0x7,
67557b55c76SYu Tu 		.shift = 16,
67657b55c76SYu Tu 	},
67757b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
67857b55c76SYu Tu 		.name = "vclk2_sel",
67957b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
68057b55c76SYu Tu 		.parent_data = s4_vclk_parent_data,
68157b55c76SYu Tu 		.num_parents = ARRAY_SIZE(s4_vclk_parent_data),
68257b55c76SYu Tu 		.flags = 0,
68357b55c76SYu Tu 	},
68457b55c76SYu Tu };
68557b55c76SYu Tu 
68657b55c76SYu Tu static struct clk_regmap s4_vclk_input = {
68757b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
68857b55c76SYu Tu 		.offset = CLKCTRL_VID_CLK_DIV,
68957b55c76SYu Tu 		.bit_idx = 16,
69057b55c76SYu Tu 	},
69157b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
69257b55c76SYu Tu 		.name = "vclk_input",
69357b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
69457b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) { &s4_vclk_sel.hw },
69557b55c76SYu Tu 		.num_parents = 1,
69657b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
69757b55c76SYu Tu 	},
69857b55c76SYu Tu };
69957b55c76SYu Tu 
70057b55c76SYu Tu static struct clk_regmap s4_vclk2_input = {
70157b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
70257b55c76SYu Tu 		.offset = CLKCTRL_VIID_CLK_DIV,
70357b55c76SYu Tu 		.bit_idx = 16,
70457b55c76SYu Tu 	},
70557b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
70657b55c76SYu Tu 		.name = "vclk2_input",
70757b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
70857b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) { &s4_vclk2_sel.hw },
70957b55c76SYu Tu 		.num_parents = 1,
71057b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
71157b55c76SYu Tu 	},
71257b55c76SYu Tu };
71357b55c76SYu Tu 
71457b55c76SYu Tu static struct clk_regmap s4_vclk_div = {
71557b55c76SYu Tu 	.data = &(struct clk_regmap_div_data){
71657b55c76SYu Tu 		.offset = CLKCTRL_VID_CLK_DIV,
71757b55c76SYu Tu 		.shift = 0,
71857b55c76SYu Tu 		.width = 8,
71957b55c76SYu Tu 	},
72057b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
72157b55c76SYu Tu 		.name = "vclk_div",
72257b55c76SYu Tu 		.ops = &clk_regmap_divider_ops,
72357b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
72457b55c76SYu Tu 			&s4_vclk_input.hw
72557b55c76SYu Tu 		},
72657b55c76SYu Tu 		.num_parents = 1,
72757b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
72857b55c76SYu Tu 	},
72957b55c76SYu Tu };
73057b55c76SYu Tu 
73157b55c76SYu Tu static struct clk_regmap s4_vclk2_div = {
73257b55c76SYu Tu 	.data = &(struct clk_regmap_div_data){
73357b55c76SYu Tu 		.offset = CLKCTRL_VIID_CLK_DIV,
73457b55c76SYu Tu 		.shift = 0,
73557b55c76SYu Tu 		.width = 8,
73657b55c76SYu Tu 	},
73757b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
73857b55c76SYu Tu 		.name = "vclk2_div",
73957b55c76SYu Tu 		.ops = &clk_regmap_divider_ops,
74057b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
74157b55c76SYu Tu 			&s4_vclk2_input.hw
74257b55c76SYu Tu 		},
74357b55c76SYu Tu 		.num_parents = 1,
74457b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
74557b55c76SYu Tu 	},
74657b55c76SYu Tu };
74757b55c76SYu Tu 
74857b55c76SYu Tu static struct clk_regmap s4_vclk = {
74957b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
75057b55c76SYu Tu 		.offset = CLKCTRL_VID_CLK_CTRL,
75157b55c76SYu Tu 		.bit_idx = 19,
75257b55c76SYu Tu 	},
75357b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
75457b55c76SYu Tu 		.name = "vclk",
75557b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
75657b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) { &s4_vclk_div.hw },
75757b55c76SYu Tu 		.num_parents = 1,
75857b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
75957b55c76SYu Tu 	},
76057b55c76SYu Tu };
76157b55c76SYu Tu 
76257b55c76SYu Tu static struct clk_regmap s4_vclk2 = {
76357b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
76457b55c76SYu Tu 		.offset = CLKCTRL_VIID_CLK_CTRL,
76557b55c76SYu Tu 		.bit_idx = 19,
76657b55c76SYu Tu 	},
76757b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
76857b55c76SYu Tu 		.name = "vclk2",
76957b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
77057b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) { &s4_vclk2_div.hw },
77157b55c76SYu Tu 		.num_parents = 1,
77257b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
77357b55c76SYu Tu 	},
77457b55c76SYu Tu };
77557b55c76SYu Tu 
77657b55c76SYu Tu static struct clk_regmap s4_vclk_div1 = {
77757b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
77857b55c76SYu Tu 		.offset = CLKCTRL_VID_CLK_CTRL,
77957b55c76SYu Tu 		.bit_idx = 0,
78057b55c76SYu Tu 	},
78157b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
78257b55c76SYu Tu 		.name = "vclk_div1",
78357b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
78457b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) { &s4_vclk.hw },
78557b55c76SYu Tu 		.num_parents = 1,
78657b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
78757b55c76SYu Tu 	},
78857b55c76SYu Tu };
78957b55c76SYu Tu 
79057b55c76SYu Tu static struct clk_regmap s4_vclk_div2_en = {
79157b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
79257b55c76SYu Tu 		.offset = CLKCTRL_VID_CLK_CTRL,
79357b55c76SYu Tu 		.bit_idx = 1,
79457b55c76SYu Tu 	},
79557b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
79657b55c76SYu Tu 		.name = "vclk_div2_en",
79757b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
79857b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) { &s4_vclk.hw },
79957b55c76SYu Tu 		.num_parents = 1,
80057b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
80157b55c76SYu Tu 	},
80257b55c76SYu Tu };
80357b55c76SYu Tu 
80457b55c76SYu Tu static struct clk_regmap s4_vclk_div4_en = {
80557b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
80657b55c76SYu Tu 		.offset = CLKCTRL_VID_CLK_CTRL,
80757b55c76SYu Tu 		.bit_idx = 2,
80857b55c76SYu Tu 	},
80957b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
81057b55c76SYu Tu 		.name = "vclk_div4_en",
81157b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
81257b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) { &s4_vclk.hw },
81357b55c76SYu Tu 		.num_parents = 1,
81457b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
81557b55c76SYu Tu 	},
81657b55c76SYu Tu };
81757b55c76SYu Tu 
81857b55c76SYu Tu static struct clk_regmap s4_vclk_div6_en = {
81957b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
82057b55c76SYu Tu 		.offset = CLKCTRL_VID_CLK_CTRL,
82157b55c76SYu Tu 		.bit_idx = 3,
82257b55c76SYu Tu 	},
82357b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
82457b55c76SYu Tu 		.name = "vclk_div6_en",
82557b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
82657b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) { &s4_vclk.hw },
82757b55c76SYu Tu 		.num_parents = 1,
82857b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
82957b55c76SYu Tu 	},
83057b55c76SYu Tu };
83157b55c76SYu Tu 
83257b55c76SYu Tu static struct clk_regmap s4_vclk_div12_en = {
83357b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
83457b55c76SYu Tu 		.offset = CLKCTRL_VID_CLK_CTRL,
83557b55c76SYu Tu 		.bit_idx = 4,
83657b55c76SYu Tu 	},
83757b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
83857b55c76SYu Tu 		.name = "vclk_div12_en",
83957b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
84057b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) { &s4_vclk.hw },
84157b55c76SYu Tu 		.num_parents = 1,
84257b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
84357b55c76SYu Tu 	},
84457b55c76SYu Tu };
84557b55c76SYu Tu 
84657b55c76SYu Tu static struct clk_regmap s4_vclk2_div1 = {
84757b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
84857b55c76SYu Tu 		.offset = CLKCTRL_VIID_CLK_CTRL,
84957b55c76SYu Tu 		.bit_idx = 0,
85057b55c76SYu Tu 	},
85157b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
85257b55c76SYu Tu 		.name = "vclk2_div1",
85357b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
85457b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) { &s4_vclk2.hw },
85557b55c76SYu Tu 		.num_parents = 1,
85657b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
85757b55c76SYu Tu 	},
85857b55c76SYu Tu };
85957b55c76SYu Tu 
86057b55c76SYu Tu static struct clk_regmap s4_vclk2_div2_en = {
86157b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
86257b55c76SYu Tu 		.offset = CLKCTRL_VIID_CLK_CTRL,
86357b55c76SYu Tu 		.bit_idx = 1,
86457b55c76SYu Tu 	},
86557b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
86657b55c76SYu Tu 		.name = "vclk2_div2_en",
86757b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
86857b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) { &s4_vclk2.hw },
86957b55c76SYu Tu 		.num_parents = 1,
87057b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
87157b55c76SYu Tu 	},
87257b55c76SYu Tu };
87357b55c76SYu Tu 
87457b55c76SYu Tu static struct clk_regmap s4_vclk2_div4_en = {
87557b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
87657b55c76SYu Tu 		.offset = CLKCTRL_VIID_CLK_CTRL,
87757b55c76SYu Tu 		.bit_idx = 2,
87857b55c76SYu Tu 	},
87957b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
88057b55c76SYu Tu 		.name = "vclk2_div4_en",
88157b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
88257b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) { &s4_vclk2.hw },
88357b55c76SYu Tu 		.num_parents = 1,
88457b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
88557b55c76SYu Tu 	},
88657b55c76SYu Tu };
88757b55c76SYu Tu 
88857b55c76SYu Tu static struct clk_regmap s4_vclk2_div6_en = {
88957b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
89057b55c76SYu Tu 		.offset = CLKCTRL_VIID_CLK_CTRL,
89157b55c76SYu Tu 		.bit_idx = 3,
89257b55c76SYu Tu 	},
89357b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
89457b55c76SYu Tu 		.name = "vclk2_div6_en",
89557b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
89657b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) { &s4_vclk2.hw },
89757b55c76SYu Tu 		.num_parents = 1,
89857b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
89957b55c76SYu Tu 	},
90057b55c76SYu Tu };
90157b55c76SYu Tu 
90257b55c76SYu Tu static struct clk_regmap s4_vclk2_div12_en = {
90357b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
90457b55c76SYu Tu 		.offset = CLKCTRL_VIID_CLK_CTRL,
90557b55c76SYu Tu 		.bit_idx = 4,
90657b55c76SYu Tu 	},
90757b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
90857b55c76SYu Tu 		.name = "vclk2_div12_en",
90957b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
91057b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) { &s4_vclk2.hw },
91157b55c76SYu Tu 		.num_parents = 1,
91257b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
91357b55c76SYu Tu 	},
91457b55c76SYu Tu };
91557b55c76SYu Tu 
91657b55c76SYu Tu static struct clk_fixed_factor s4_vclk_div2 = {
91757b55c76SYu Tu 	.mult = 1,
91857b55c76SYu Tu 	.div = 2,
91957b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
92057b55c76SYu Tu 		.name = "vclk_div2",
92157b55c76SYu Tu 		.ops = &clk_fixed_factor_ops,
92257b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
92357b55c76SYu Tu 			&s4_vclk_div2_en.hw
92457b55c76SYu Tu 		},
92557b55c76SYu Tu 		.num_parents = 1,
92657b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
92757b55c76SYu Tu 	},
92857b55c76SYu Tu };
92957b55c76SYu Tu 
93057b55c76SYu Tu static struct clk_fixed_factor s4_vclk_div4 = {
93157b55c76SYu Tu 	.mult = 1,
93257b55c76SYu Tu 	.div = 4,
93357b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
93457b55c76SYu Tu 		.name = "vclk_div4",
93557b55c76SYu Tu 		.ops = &clk_fixed_factor_ops,
93657b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
93757b55c76SYu Tu 			&s4_vclk_div4_en.hw
93857b55c76SYu Tu 		},
93957b55c76SYu Tu 		.num_parents = 1,
94057b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
94157b55c76SYu Tu 	},
94257b55c76SYu Tu };
94357b55c76SYu Tu 
94457b55c76SYu Tu static struct clk_fixed_factor s4_vclk_div6 = {
94557b55c76SYu Tu 	.mult = 1,
94657b55c76SYu Tu 	.div = 6,
94757b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
94857b55c76SYu Tu 		.name = "vclk_div6",
94957b55c76SYu Tu 		.ops = &clk_fixed_factor_ops,
95057b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
95157b55c76SYu Tu 			&s4_vclk_div6_en.hw
95257b55c76SYu Tu 		},
95357b55c76SYu Tu 		.num_parents = 1,
95457b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
95557b55c76SYu Tu 	},
95657b55c76SYu Tu };
95757b55c76SYu Tu 
95857b55c76SYu Tu static struct clk_fixed_factor s4_vclk_div12 = {
95957b55c76SYu Tu 	.mult = 1,
96057b55c76SYu Tu 	.div = 12,
96157b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
96257b55c76SYu Tu 		.name = "vclk_div12",
96357b55c76SYu Tu 		.ops = &clk_fixed_factor_ops,
96457b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
96557b55c76SYu Tu 			&s4_vclk_div12_en.hw
96657b55c76SYu Tu 		},
96757b55c76SYu Tu 		.num_parents = 1,
96857b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
96957b55c76SYu Tu 	},
97057b55c76SYu Tu };
97157b55c76SYu Tu 
97257b55c76SYu Tu static struct clk_fixed_factor s4_vclk2_div2 = {
97357b55c76SYu Tu 	.mult = 1,
97457b55c76SYu Tu 	.div = 2,
97557b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
97657b55c76SYu Tu 		.name = "vclk2_div2",
97757b55c76SYu Tu 		.ops = &clk_fixed_factor_ops,
97857b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
97957b55c76SYu Tu 			&s4_vclk2_div2_en.hw
98057b55c76SYu Tu 		},
98157b55c76SYu Tu 		.num_parents = 1,
98257b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
98357b55c76SYu Tu 	},
98457b55c76SYu Tu };
98557b55c76SYu Tu 
98657b55c76SYu Tu static struct clk_fixed_factor s4_vclk2_div4 = {
98757b55c76SYu Tu 	.mult = 1,
98857b55c76SYu Tu 	.div = 4,
98957b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
99057b55c76SYu Tu 		.name = "vclk2_div4",
99157b55c76SYu Tu 		.ops = &clk_fixed_factor_ops,
99257b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
99357b55c76SYu Tu 			&s4_vclk2_div4_en.hw
99457b55c76SYu Tu 		},
99557b55c76SYu Tu 		.num_parents = 1,
99657b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
99757b55c76SYu Tu 	},
99857b55c76SYu Tu };
99957b55c76SYu Tu 
100057b55c76SYu Tu static struct clk_fixed_factor s4_vclk2_div6 = {
100157b55c76SYu Tu 	.mult = 1,
100257b55c76SYu Tu 	.div = 6,
100357b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
100457b55c76SYu Tu 		.name = "vclk2_div6",
100557b55c76SYu Tu 		.ops = &clk_fixed_factor_ops,
100657b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
100757b55c76SYu Tu 			&s4_vclk2_div6_en.hw
100857b55c76SYu Tu 		},
100957b55c76SYu Tu 		.num_parents = 1,
101057b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
101157b55c76SYu Tu 	},
101257b55c76SYu Tu };
101357b55c76SYu Tu 
101457b55c76SYu Tu static struct clk_fixed_factor s4_vclk2_div12 = {
101557b55c76SYu Tu 	.mult = 1,
101657b55c76SYu Tu 	.div = 12,
101757b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
101857b55c76SYu Tu 		.name = "vclk2_div12",
101957b55c76SYu Tu 		.ops = &clk_fixed_factor_ops,
102057b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
102157b55c76SYu Tu 			&s4_vclk2_div12_en.hw
102257b55c76SYu Tu 		},
102357b55c76SYu Tu 		.num_parents = 1,
102457b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
102557b55c76SYu Tu 	},
102657b55c76SYu Tu };
102757b55c76SYu Tu 
102857b55c76SYu Tu /* The 5,6,7 indexes corresponds to no real clock, so there are not used. */
102957b55c76SYu Tu static u32 mux_table_cts_sel[] = { 0, 1, 2, 3, 4, 8, 9, 10, 11, 12 };
103057b55c76SYu Tu static const struct clk_hw *s4_cts_parent_hws[] = {
103157b55c76SYu Tu 	&s4_vclk_div1.hw,
103257b55c76SYu Tu 	&s4_vclk_div2.hw,
103357b55c76SYu Tu 	&s4_vclk_div4.hw,
103457b55c76SYu Tu 	&s4_vclk_div6.hw,
103557b55c76SYu Tu 	&s4_vclk_div12.hw,
103657b55c76SYu Tu 	&s4_vclk2_div1.hw,
103757b55c76SYu Tu 	&s4_vclk2_div2.hw,
103857b55c76SYu Tu 	&s4_vclk2_div4.hw,
103957b55c76SYu Tu 	&s4_vclk2_div6.hw,
104057b55c76SYu Tu 	&s4_vclk2_div12.hw
104157b55c76SYu Tu };
104257b55c76SYu Tu 
104357b55c76SYu Tu static struct clk_regmap s4_cts_enci_sel = {
104457b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data){
104557b55c76SYu Tu 		.offset = CLKCTRL_VID_CLK_DIV,
104657b55c76SYu Tu 		.mask = 0xf,
104757b55c76SYu Tu 		.shift = 28,
104857b55c76SYu Tu 		.table = mux_table_cts_sel,
104957b55c76SYu Tu 	},
105057b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
105157b55c76SYu Tu 		.name = "cts_enci_sel",
105257b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
105357b55c76SYu Tu 		.parent_hws = s4_cts_parent_hws,
105457b55c76SYu Tu 		.num_parents = ARRAY_SIZE(s4_cts_parent_hws),
105557b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
105657b55c76SYu Tu 	},
105757b55c76SYu Tu };
105857b55c76SYu Tu 
105957b55c76SYu Tu static struct clk_regmap s4_cts_encp_sel = {
106057b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data){
106157b55c76SYu Tu 		.offset = CLKCTRL_VID_CLK_DIV,
106257b55c76SYu Tu 		.mask = 0xf,
106357b55c76SYu Tu 		.shift = 20,
106457b55c76SYu Tu 		.table = mux_table_cts_sel,
106557b55c76SYu Tu 	},
106657b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
106757b55c76SYu Tu 		.name = "cts_encp_sel",
106857b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
106957b55c76SYu Tu 		.parent_hws = s4_cts_parent_hws,
107057b55c76SYu Tu 		.num_parents = ARRAY_SIZE(s4_cts_parent_hws),
107157b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
107257b55c76SYu Tu 	},
107357b55c76SYu Tu };
107457b55c76SYu Tu 
107557b55c76SYu Tu static struct clk_regmap s4_cts_vdac_sel = {
107657b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data){
107757b55c76SYu Tu 		.offset = CLKCTRL_VIID_CLK_DIV,
107857b55c76SYu Tu 		.mask = 0xf,
107957b55c76SYu Tu 		.shift = 28,
108057b55c76SYu Tu 		.table = mux_table_cts_sel,
108157b55c76SYu Tu 	},
108257b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
108357b55c76SYu Tu 		.name = "cts_vdac_sel",
108457b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
108557b55c76SYu Tu 		.parent_hws = s4_cts_parent_hws,
108657b55c76SYu Tu 		.num_parents = ARRAY_SIZE(s4_cts_parent_hws),
108757b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
108857b55c76SYu Tu 	},
108957b55c76SYu Tu };
109057b55c76SYu Tu 
109157b55c76SYu Tu /* The 5,6,7 indexes corresponds to no real clock, so there are not used. */
109257b55c76SYu Tu static u32 mux_table_hdmi_tx_sel[] = { 0, 1, 2, 3, 4, 8, 9, 10, 11, 12 };
109357b55c76SYu Tu static const struct clk_hw *s4_cts_hdmi_tx_parent_hws[] = {
109457b55c76SYu Tu 	&s4_vclk_div1.hw,
109557b55c76SYu Tu 	&s4_vclk_div2.hw,
109657b55c76SYu Tu 	&s4_vclk_div4.hw,
109757b55c76SYu Tu 	&s4_vclk_div6.hw,
109857b55c76SYu Tu 	&s4_vclk_div12.hw,
109957b55c76SYu Tu 	&s4_vclk2_div1.hw,
110057b55c76SYu Tu 	&s4_vclk2_div2.hw,
110157b55c76SYu Tu 	&s4_vclk2_div4.hw,
110257b55c76SYu Tu 	&s4_vclk2_div6.hw,
110357b55c76SYu Tu 	&s4_vclk2_div12.hw
110457b55c76SYu Tu };
110557b55c76SYu Tu 
110657b55c76SYu Tu static struct clk_regmap s4_hdmi_tx_sel = {
110757b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data){
110857b55c76SYu Tu 		.offset = CLKCTRL_HDMI_CLK_CTRL,
110957b55c76SYu Tu 		.mask = 0xf,
111057b55c76SYu Tu 		.shift = 16,
111157b55c76SYu Tu 		.table = mux_table_hdmi_tx_sel,
111257b55c76SYu Tu 	},
111357b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
111457b55c76SYu Tu 		.name = "hdmi_tx_sel",
111557b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
111657b55c76SYu Tu 		.parent_hws = s4_cts_hdmi_tx_parent_hws,
111757b55c76SYu Tu 		.num_parents = ARRAY_SIZE(s4_cts_hdmi_tx_parent_hws),
111857b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
111957b55c76SYu Tu 	},
112057b55c76SYu Tu };
112157b55c76SYu Tu 
112257b55c76SYu Tu static struct clk_regmap s4_cts_enci = {
112357b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
112457b55c76SYu Tu 		.offset = CLKCTRL_VID_CLK_CTRL2,
112557b55c76SYu Tu 		.bit_idx = 0,
112657b55c76SYu Tu 	},
112757b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
112857b55c76SYu Tu 		.name = "cts_enci",
112957b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
113057b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
113157b55c76SYu Tu 			&s4_cts_enci_sel.hw
113257b55c76SYu Tu 		},
113357b55c76SYu Tu 		.num_parents = 1,
113457b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
113557b55c76SYu Tu 	},
113657b55c76SYu Tu };
113757b55c76SYu Tu 
113857b55c76SYu Tu static struct clk_regmap s4_cts_encp = {
113957b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
114057b55c76SYu Tu 		.offset = CLKCTRL_VID_CLK_CTRL2,
114157b55c76SYu Tu 		.bit_idx = 2,
114257b55c76SYu Tu 	},
114357b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
114457b55c76SYu Tu 		.name = "cts_encp",
114557b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
114657b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
114757b55c76SYu Tu 			&s4_cts_encp_sel.hw
114857b55c76SYu Tu 		},
114957b55c76SYu Tu 		.num_parents = 1,
115057b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
115157b55c76SYu Tu 	},
115257b55c76SYu Tu };
115357b55c76SYu Tu 
115457b55c76SYu Tu static struct clk_regmap s4_cts_vdac = {
115557b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
115657b55c76SYu Tu 		.offset = CLKCTRL_VID_CLK_CTRL2,
115757b55c76SYu Tu 		.bit_idx = 4,
115857b55c76SYu Tu 	},
115957b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
116057b55c76SYu Tu 		.name = "cts_vdac",
116157b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
116257b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
116357b55c76SYu Tu 			&s4_cts_vdac_sel.hw
116457b55c76SYu Tu 		},
116557b55c76SYu Tu 		.num_parents = 1,
116657b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
116757b55c76SYu Tu 	},
116857b55c76SYu Tu };
116957b55c76SYu Tu 
117057b55c76SYu Tu static struct clk_regmap s4_hdmi_tx = {
117157b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
117257b55c76SYu Tu 		.offset = CLKCTRL_VID_CLK_CTRL2,
117357b55c76SYu Tu 		.bit_idx = 5,
117457b55c76SYu Tu 	},
117557b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
117657b55c76SYu Tu 		.name = "hdmi_tx",
117757b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
117857b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
117957b55c76SYu Tu 			&s4_hdmi_tx_sel.hw
118057b55c76SYu Tu 		},
118157b55c76SYu Tu 		.num_parents = 1,
118257b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
118357b55c76SYu Tu 	},
118457b55c76SYu Tu };
118557b55c76SYu Tu 
118657b55c76SYu Tu /* HDMI Clocks */
118757b55c76SYu Tu static const struct clk_parent_data s4_hdmi_parent_data[] = {
118857b55c76SYu Tu 	{ .fw_name = "xtal", },
118957b55c76SYu Tu 	{ .fw_name = "fclk_div4", },
119057b55c76SYu Tu 	{ .fw_name = "fclk_div3", },
119157b55c76SYu Tu 	{ .fw_name = "fclk_div5", }
119257b55c76SYu Tu };
119357b55c76SYu Tu 
119457b55c76SYu Tu static struct clk_regmap s4_hdmi_sel = {
119557b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data){
119657b55c76SYu Tu 		.offset = CLKCTRL_HDMI_CLK_CTRL,
119757b55c76SYu Tu 		.mask = 0x3,
119857b55c76SYu Tu 		.shift = 9,
119957b55c76SYu Tu 		.flags = CLK_MUX_ROUND_CLOSEST,
120057b55c76SYu Tu 	},
120157b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
120257b55c76SYu Tu 		.name = "hdmi_sel",
120357b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
120457b55c76SYu Tu 		.parent_data = s4_hdmi_parent_data,
120557b55c76SYu Tu 		.num_parents = ARRAY_SIZE(s4_hdmi_parent_data),
120657b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
120757b55c76SYu Tu 	},
120857b55c76SYu Tu };
120957b55c76SYu Tu 
121057b55c76SYu Tu static struct clk_regmap s4_hdmi_div = {
121157b55c76SYu Tu 	.data = &(struct clk_regmap_div_data){
121257b55c76SYu Tu 		.offset = CLKCTRL_HDMI_CLK_CTRL,
121357b55c76SYu Tu 		.shift = 0,
121457b55c76SYu Tu 		.width = 7,
121557b55c76SYu Tu 	},
121657b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
121757b55c76SYu Tu 		.name = "hdmi_div",
121857b55c76SYu Tu 		.ops = &clk_regmap_divider_ops,
121957b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) { &s4_hdmi_sel.hw },
122057b55c76SYu Tu 		.num_parents = 1,
122157b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
122257b55c76SYu Tu 	},
122357b55c76SYu Tu };
122457b55c76SYu Tu 
122557b55c76SYu Tu static struct clk_regmap s4_hdmi = {
122657b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
122757b55c76SYu Tu 		.offset = CLKCTRL_HDMI_CLK_CTRL,
122857b55c76SYu Tu 		.bit_idx = 8,
122957b55c76SYu Tu 	},
123057b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
123157b55c76SYu Tu 		.name = "hdmi",
123257b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
123357b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) { &s4_hdmi_div.hw },
123457b55c76SYu Tu 		.num_parents = 1,
123557b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
123657b55c76SYu Tu 	},
123757b55c76SYu Tu };
123857b55c76SYu Tu 
123957b55c76SYu Tu static struct clk_regmap s4_ts_clk_div = {
124057b55c76SYu Tu 	.data = &(struct clk_regmap_div_data){
124157b55c76SYu Tu 		.offset = CLKCTRL_TS_CLK_CTRL,
124257b55c76SYu Tu 		.shift = 0,
124357b55c76SYu Tu 		.width = 8,
124457b55c76SYu Tu 	},
124557b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
124657b55c76SYu Tu 		.name = "ts_clk_div",
124757b55c76SYu Tu 		.ops = &clk_regmap_divider_ops,
124857b55c76SYu Tu 		.parent_data = &(const struct clk_parent_data) {
124957b55c76SYu Tu 			.fw_name = "xtal",
125057b55c76SYu Tu 		},
125157b55c76SYu Tu 		.num_parents = 1,
125257b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
125357b55c76SYu Tu 	},
125457b55c76SYu Tu };
125557b55c76SYu Tu 
125657b55c76SYu Tu static struct clk_regmap s4_ts_clk_gate = {
125757b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
125857b55c76SYu Tu 		.offset = CLKCTRL_TS_CLK_CTRL,
125957b55c76SYu Tu 		.bit_idx = 8,
126057b55c76SYu Tu 	},
126157b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
126257b55c76SYu Tu 		.name = "ts_clk",
126357b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
126457b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
126557b55c76SYu Tu 			&s4_ts_clk_div.hw
126657b55c76SYu Tu 		},
126757b55c76SYu Tu 		.num_parents = 1,
126857b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
126957b55c76SYu Tu 	},
127057b55c76SYu Tu };
127157b55c76SYu Tu 
127257b55c76SYu Tu /*
127357b55c76SYu Tu  * The MALI IP is clocked by two identical clocks (mali_0 and mali_1)
127457b55c76SYu Tu  * muxed by a glitch-free switch. The CCF can manage this glitch-free
127557b55c76SYu Tu  * mux because it does top-to-bottom updates the each clock tree and
127657b55c76SYu Tu  * switches to the "inactive" one when CLK_SET_RATE_GATE is set.
127757b55c76SYu Tu  */
127857b55c76SYu Tu static const struct clk_parent_data s4_mali_0_1_parent_data[] = {
127957b55c76SYu Tu 	{ .fw_name = "xtal", },
128057b55c76SYu Tu 	{ .fw_name = "gp0_pll", },
128157b55c76SYu Tu 	{ .fw_name = "hifi_pll", },
128257b55c76SYu Tu 	{ .fw_name = "fclk_div2p5", },
128357b55c76SYu Tu 	{ .fw_name = "fclk_div3", },
128457b55c76SYu Tu 	{ .fw_name = "fclk_div4", },
128557b55c76SYu Tu 	{ .fw_name = "fclk_div5", },
128657b55c76SYu Tu 	{ .fw_name = "fclk_div7", }
128757b55c76SYu Tu };
128857b55c76SYu Tu 
128957b55c76SYu Tu static struct clk_regmap s4_mali_0_sel = {
129057b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data){
129157b55c76SYu Tu 		.offset = CLKCTRL_MALI_CLK_CTRL,
129257b55c76SYu Tu 		.mask = 0x7,
129357b55c76SYu Tu 		.shift = 9,
129457b55c76SYu Tu 	},
129557b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
129657b55c76SYu Tu 		.name = "mali_0_sel",
129757b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
129857b55c76SYu Tu 		.parent_data = s4_mali_0_1_parent_data,
129957b55c76SYu Tu 		.num_parents = ARRAY_SIZE(s4_mali_0_1_parent_data),
130057b55c76SYu Tu 		/*
130157b55c76SYu Tu 		 * Don't request the parent to change the rate because
130257b55c76SYu Tu 		 * all GPU frequencies can be derived from the fclk_*
130357b55c76SYu Tu 		 * clocks and one special GP0_PLL setting. This is
130457b55c76SYu Tu 		 * important because we need the HIFI PLL clock for audio.
130557b55c76SYu Tu 		 */
130657b55c76SYu Tu 		.flags = 0,
130757b55c76SYu Tu 	},
130857b55c76SYu Tu };
130957b55c76SYu Tu 
131057b55c76SYu Tu static struct clk_regmap s4_mali_0_div = {
131157b55c76SYu Tu 	.data = &(struct clk_regmap_div_data){
131257b55c76SYu Tu 		.offset = CLKCTRL_MALI_CLK_CTRL,
131357b55c76SYu Tu 		.shift = 0,
131457b55c76SYu Tu 		.width = 7,
131557b55c76SYu Tu 	},
131657b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
131757b55c76SYu Tu 		.name = "mali_0_div",
131857b55c76SYu Tu 		.ops = &clk_regmap_divider_ops,
131957b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
132057b55c76SYu Tu 			&s4_mali_0_sel.hw
132157b55c76SYu Tu 		},
132257b55c76SYu Tu 		.num_parents = 1,
132357b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
132457b55c76SYu Tu 	},
132557b55c76SYu Tu };
132657b55c76SYu Tu 
132757b55c76SYu Tu static struct clk_regmap s4_mali_0 = {
132857b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
132957b55c76SYu Tu 		.offset = CLKCTRL_MALI_CLK_CTRL,
133057b55c76SYu Tu 		.bit_idx = 8,
133157b55c76SYu Tu 	},
133257b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
133357b55c76SYu Tu 		.name = "mali_0",
133457b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
133557b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
133657b55c76SYu Tu 			&s4_mali_0_div.hw
133757b55c76SYu Tu 		},
133857b55c76SYu Tu 		.num_parents = 1,
133957b55c76SYu Tu 		.flags = CLK_SET_RATE_GATE | CLK_SET_RATE_PARENT,
134057b55c76SYu Tu 	},
134157b55c76SYu Tu };
134257b55c76SYu Tu 
134357b55c76SYu Tu static struct clk_regmap s4_mali_1_sel = {
134457b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data){
134557b55c76SYu Tu 		.offset = CLKCTRL_MALI_CLK_CTRL,
134657b55c76SYu Tu 		.mask = 0x7,
134757b55c76SYu Tu 		.shift = 25,
134857b55c76SYu Tu 	},
134957b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
135057b55c76SYu Tu 		.name = "mali_1_sel",
135157b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
135257b55c76SYu Tu 		.parent_data = s4_mali_0_1_parent_data,
135357b55c76SYu Tu 		.num_parents = ARRAY_SIZE(s4_mali_0_1_parent_data),
135457b55c76SYu Tu 		.flags = 0,
135557b55c76SYu Tu 	},
135657b55c76SYu Tu };
135757b55c76SYu Tu 
135857b55c76SYu Tu static struct clk_regmap s4_mali_1_div = {
135957b55c76SYu Tu 	.data = &(struct clk_regmap_div_data){
136057b55c76SYu Tu 		.offset = CLKCTRL_MALI_CLK_CTRL,
136157b55c76SYu Tu 		.shift = 16,
136257b55c76SYu Tu 		.width = 7,
136357b55c76SYu Tu 	},
136457b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
136557b55c76SYu Tu 		.name = "mali_1_div",
136657b55c76SYu Tu 		.ops = &clk_regmap_divider_ops,
136757b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
136857b55c76SYu Tu 			&s4_mali_1_sel.hw
136957b55c76SYu Tu 		},
137057b55c76SYu Tu 		.num_parents = 1,
137157b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
137257b55c76SYu Tu 	},
137357b55c76SYu Tu };
137457b55c76SYu Tu 
137557b55c76SYu Tu static struct clk_regmap s4_mali_1 = {
137657b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
137757b55c76SYu Tu 		.offset = CLKCTRL_MALI_CLK_CTRL,
137857b55c76SYu Tu 		.bit_idx = 24,
137957b55c76SYu Tu 	},
138057b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
138157b55c76SYu Tu 		.name = "mali_1",
138257b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
138357b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
138457b55c76SYu Tu 			&s4_mali_1_div.hw
138557b55c76SYu Tu 		},
138657b55c76SYu Tu 		.num_parents = 1,
138757b55c76SYu Tu 		.flags = CLK_SET_RATE_GATE | CLK_SET_RATE_PARENT,
138857b55c76SYu Tu 	},
138957b55c76SYu Tu };
139057b55c76SYu Tu 
139157b55c76SYu Tu static const struct clk_hw *s4_mali_parent_hws[] = {
139257b55c76SYu Tu 	&s4_mali_0.hw,
139357b55c76SYu Tu 	&s4_mali_1.hw
139457b55c76SYu Tu };
139557b55c76SYu Tu 
139657b55c76SYu Tu static struct clk_regmap s4_mali_mux = {
139757b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data){
139857b55c76SYu Tu 		.offset = CLKCTRL_MALI_CLK_CTRL,
139957b55c76SYu Tu 		.mask = 1,
140057b55c76SYu Tu 		.shift = 31,
140157b55c76SYu Tu 	},
140257b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
140357b55c76SYu Tu 		.name = "mali",
140457b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
140557b55c76SYu Tu 		.parent_hws = s4_mali_parent_hws,
140657b55c76SYu Tu 		.num_parents = 2,
140757b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
140857b55c76SYu Tu 	},
140957b55c76SYu Tu };
141057b55c76SYu Tu 
141157b55c76SYu Tu /* VDEC clocks */
141257b55c76SYu Tu static const struct clk_parent_data s4_dec_parent_data[] = {
141357b55c76SYu Tu 	{ .fw_name = "fclk_div2p5", },
141457b55c76SYu Tu 	{ .fw_name = "fclk_div3", },
141557b55c76SYu Tu 	{ .fw_name = "fclk_div4", },
141657b55c76SYu Tu 	{ .fw_name = "fclk_div5", },
141757b55c76SYu Tu 	{ .fw_name = "fclk_div7", },
141857b55c76SYu Tu 	{ .fw_name = "hifi_pll", },
141957b55c76SYu Tu 	{ .fw_name = "gp0_pll", },
142057b55c76SYu Tu 	{ .fw_name = "xtal", }
142157b55c76SYu Tu };
142257b55c76SYu Tu 
142357b55c76SYu Tu static struct clk_regmap s4_vdec_p0_mux = {
142457b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data){
142557b55c76SYu Tu 		.offset = CLKCTRL_VDEC_CLK_CTRL,
142657b55c76SYu Tu 		.mask = 0x7,
142757b55c76SYu Tu 		.shift = 9,
142857b55c76SYu Tu 		.flags = CLK_MUX_ROUND_CLOSEST,
142957b55c76SYu Tu 	},
143057b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
143157b55c76SYu Tu 		.name = "vdec_p0_mux",
143257b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
143357b55c76SYu Tu 		.parent_data = s4_dec_parent_data,
143457b55c76SYu Tu 		.num_parents = ARRAY_SIZE(s4_dec_parent_data),
143557b55c76SYu Tu 		.flags = 0,
143657b55c76SYu Tu 	},
143757b55c76SYu Tu };
143857b55c76SYu Tu 
143957b55c76SYu Tu static struct clk_regmap s4_vdec_p0_div = {
144057b55c76SYu Tu 	.data = &(struct clk_regmap_div_data){
144157b55c76SYu Tu 		.offset = CLKCTRL_VDEC_CLK_CTRL,
144257b55c76SYu Tu 		.shift = 0,
144357b55c76SYu Tu 		.width = 7,
144457b55c76SYu Tu 		.flags = CLK_DIVIDER_ROUND_CLOSEST,
144557b55c76SYu Tu 	},
144657b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
144757b55c76SYu Tu 		.name = "vdec_p0_div",
144857b55c76SYu Tu 		.ops = &clk_regmap_divider_ops,
144957b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
145057b55c76SYu Tu 			&s4_vdec_p0_mux.hw
145157b55c76SYu Tu 		},
145257b55c76SYu Tu 		.num_parents = 1,
145357b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
145457b55c76SYu Tu 	},
145557b55c76SYu Tu };
145657b55c76SYu Tu 
145757b55c76SYu Tu static struct clk_regmap s4_vdec_p0 = {
145857b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
145957b55c76SYu Tu 		.offset = CLKCTRL_VDEC_CLK_CTRL,
146057b55c76SYu Tu 		.bit_idx = 8,
146157b55c76SYu Tu 	},
146257b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
146357b55c76SYu Tu 		.name = "vdec_p0",
146457b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
146557b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
146657b55c76SYu Tu 			&s4_vdec_p0_div.hw
146757b55c76SYu Tu 		},
146857b55c76SYu Tu 		.num_parents = 1,
146957b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
147057b55c76SYu Tu 	},
147157b55c76SYu Tu };
147257b55c76SYu Tu 
147357b55c76SYu Tu static struct clk_regmap s4_vdec_p1_mux = {
147457b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data){
147557b55c76SYu Tu 		.offset = CLKCTRL_VDEC3_CLK_CTRL,
147657b55c76SYu Tu 		.mask = 0x7,
147757b55c76SYu Tu 		.shift = 9,
147857b55c76SYu Tu 		.flags = CLK_MUX_ROUND_CLOSEST,
147957b55c76SYu Tu 	},
148057b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
148157b55c76SYu Tu 		.name = "vdec_p1_mux",
148257b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
148357b55c76SYu Tu 		.parent_data = s4_dec_parent_data,
148457b55c76SYu Tu 		.num_parents = ARRAY_SIZE(s4_dec_parent_data),
148557b55c76SYu Tu 		.flags = 0,
148657b55c76SYu Tu 	},
148757b55c76SYu Tu };
148857b55c76SYu Tu 
148957b55c76SYu Tu static struct clk_regmap s4_vdec_p1_div = {
149057b55c76SYu Tu 	.data = &(struct clk_regmap_div_data){
149157b55c76SYu Tu 		.offset = CLKCTRL_VDEC3_CLK_CTRL,
149257b55c76SYu Tu 		.shift = 0,
149357b55c76SYu Tu 		.width = 7,
149457b55c76SYu Tu 		.flags = CLK_DIVIDER_ROUND_CLOSEST,
149557b55c76SYu Tu 	},
149657b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
149757b55c76SYu Tu 		.name = "vdec_p1_div",
149857b55c76SYu Tu 		.ops = &clk_regmap_divider_ops,
149957b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
150057b55c76SYu Tu 			&s4_vdec_p1_mux.hw
150157b55c76SYu Tu 		},
150257b55c76SYu Tu 		.num_parents = 1,
150357b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
150457b55c76SYu Tu 	},
150557b55c76SYu Tu };
150657b55c76SYu Tu 
150757b55c76SYu Tu static struct clk_regmap s4_vdec_p1 = {
150857b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
150957b55c76SYu Tu 		.offset = CLKCTRL_VDEC3_CLK_CTRL,
151057b55c76SYu Tu 		.bit_idx = 8,
151157b55c76SYu Tu 	},
151257b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
151357b55c76SYu Tu 		.name = "vdec_p1",
151457b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
151557b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
151657b55c76SYu Tu 			&s4_vdec_p1_div.hw
151757b55c76SYu Tu 		},
151857b55c76SYu Tu 		.num_parents = 1,
151957b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
152057b55c76SYu Tu 	},
152157b55c76SYu Tu };
152257b55c76SYu Tu 
152357b55c76SYu Tu static const struct clk_hw *s4_vdec_mux_parent_hws[] = {
152457b55c76SYu Tu 	&s4_vdec_p0.hw,
152557b55c76SYu Tu 	&s4_vdec_p1.hw
152657b55c76SYu Tu };
152757b55c76SYu Tu 
152857b55c76SYu Tu static struct clk_regmap s4_vdec_mux = {
152957b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data){
153057b55c76SYu Tu 		.offset = CLKCTRL_VDEC3_CLK_CTRL,
153157b55c76SYu Tu 		.mask = 0x1,
153257b55c76SYu Tu 		.shift = 15,
153357b55c76SYu Tu 	},
153457b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
153557b55c76SYu Tu 		.name = "vdec_mux",
153657b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
153757b55c76SYu Tu 		.parent_hws = s4_vdec_mux_parent_hws,
153857b55c76SYu Tu 		.num_parents = ARRAY_SIZE(s4_vdec_mux_parent_hws),
153957b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
154057b55c76SYu Tu 	},
154157b55c76SYu Tu };
154257b55c76SYu Tu 
154357b55c76SYu Tu static struct clk_regmap s4_hevcf_p0_mux = {
154457b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data){
154557b55c76SYu Tu 		.offset = CLKCTRL_VDEC2_CLK_CTRL,
154657b55c76SYu Tu 		.mask = 0x7,
154757b55c76SYu Tu 		.shift = 9,
154857b55c76SYu Tu 		.flags = CLK_MUX_ROUND_CLOSEST,
154957b55c76SYu Tu 	},
155057b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
155157b55c76SYu Tu 		.name = "hevcf_p0_mux",
155257b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
155357b55c76SYu Tu 		.parent_data = s4_dec_parent_data,
155457b55c76SYu Tu 		.num_parents = ARRAY_SIZE(s4_dec_parent_data),
155557b55c76SYu Tu 		.flags = 0,
155657b55c76SYu Tu 	},
155757b55c76SYu Tu };
155857b55c76SYu Tu 
155957b55c76SYu Tu static struct clk_regmap s4_hevcf_p0_div = {
156057b55c76SYu Tu 	.data = &(struct clk_regmap_div_data){
156157b55c76SYu Tu 		.offset = CLKCTRL_VDEC2_CLK_CTRL,
156257b55c76SYu Tu 		.shift = 0,
156357b55c76SYu Tu 		.width = 7,
156457b55c76SYu Tu 		.flags = CLK_DIVIDER_ROUND_CLOSEST,
156557b55c76SYu Tu 	},
156657b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
156757b55c76SYu Tu 		.name = "hevcf_p0_div",
156857b55c76SYu Tu 		.ops = &clk_regmap_divider_ops,
156957b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
157057b55c76SYu Tu 			&s4_hevcf_p0_mux.hw
157157b55c76SYu Tu 		},
157257b55c76SYu Tu 		.num_parents = 1,
157357b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
157457b55c76SYu Tu 	},
157557b55c76SYu Tu };
157657b55c76SYu Tu 
157757b55c76SYu Tu static struct clk_regmap s4_hevcf_p0 = {
157857b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
157957b55c76SYu Tu 		.offset = CLKCTRL_VDEC2_CLK_CTRL,
158057b55c76SYu Tu 		.bit_idx = 8,
158157b55c76SYu Tu 	},
158257b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
158357b55c76SYu Tu 		.name = "hevcf_p0_gate",
158457b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
158557b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
158657b55c76SYu Tu 			&s4_hevcf_p0_div.hw
158757b55c76SYu Tu 		},
158857b55c76SYu Tu 		.num_parents = 1,
158957b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
159057b55c76SYu Tu 	},
159157b55c76SYu Tu };
159257b55c76SYu Tu 
159357b55c76SYu Tu static struct clk_regmap s4_hevcf_p1_mux = {
159457b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data){
159557b55c76SYu Tu 		.offset = CLKCTRL_VDEC4_CLK_CTRL,
159657b55c76SYu Tu 		.mask = 0x7,
159757b55c76SYu Tu 		.shift = 9,
159857b55c76SYu Tu 		.flags = CLK_MUX_ROUND_CLOSEST,
159957b55c76SYu Tu 	},
160057b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
160157b55c76SYu Tu 		.name = "hevcf_p1_mux",
160257b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
160357b55c76SYu Tu 		.parent_data = s4_dec_parent_data,
160457b55c76SYu Tu 		.num_parents = ARRAY_SIZE(s4_dec_parent_data),
160557b55c76SYu Tu 		.flags = 0,
160657b55c76SYu Tu 	},
160757b55c76SYu Tu };
160857b55c76SYu Tu 
160957b55c76SYu Tu static struct clk_regmap s4_hevcf_p1_div = {
161057b55c76SYu Tu 	.data = &(struct clk_regmap_div_data){
161157b55c76SYu Tu 		.offset = CLKCTRL_VDEC4_CLK_CTRL,
161257b55c76SYu Tu 		.shift = 0,
161357b55c76SYu Tu 		.width = 7,
161457b55c76SYu Tu 		.flags = CLK_DIVIDER_ROUND_CLOSEST,
161557b55c76SYu Tu 	},
161657b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
161757b55c76SYu Tu 		.name = "hevcf_p1_div",
161857b55c76SYu Tu 		.ops = &clk_regmap_divider_ops,
161957b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
162057b55c76SYu Tu 			&s4_hevcf_p1_mux.hw
162157b55c76SYu Tu 		},
162257b55c76SYu Tu 		.num_parents = 1,
162357b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
162457b55c76SYu Tu 	},
162557b55c76SYu Tu };
162657b55c76SYu Tu 
162757b55c76SYu Tu static struct clk_regmap s4_hevcf_p1 = {
162857b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
162957b55c76SYu Tu 		.offset = CLKCTRL_VDEC4_CLK_CTRL,
163057b55c76SYu Tu 		.bit_idx = 8,
163157b55c76SYu Tu 	},
163257b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
163357b55c76SYu Tu 		.name = "hevcf_p1",
163457b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
163557b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
163657b55c76SYu Tu 			&s4_hevcf_p1_div.hw
163757b55c76SYu Tu 		},
163857b55c76SYu Tu 		.num_parents = 1,
163957b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
164057b55c76SYu Tu 	},
164157b55c76SYu Tu };
164257b55c76SYu Tu 
164357b55c76SYu Tu static const struct clk_hw *s4_hevcf_mux_parent_hws[] = {
164457b55c76SYu Tu 	&s4_hevcf_p0.hw,
164557b55c76SYu Tu 	&s4_hevcf_p1.hw
164657b55c76SYu Tu };
164757b55c76SYu Tu 
164857b55c76SYu Tu static struct clk_regmap s4_hevcf_mux = {
164957b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data){
165057b55c76SYu Tu 		.offset = CLKCTRL_VDEC4_CLK_CTRL,
165157b55c76SYu Tu 		.mask = 0x1,
165257b55c76SYu Tu 		.shift = 15,
165357b55c76SYu Tu 	},
165457b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
165557b55c76SYu Tu 		.name = "hevcf",
165657b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
165757b55c76SYu Tu 		.parent_hws = s4_hevcf_mux_parent_hws,
165857b55c76SYu Tu 		.num_parents = ARRAY_SIZE(s4_hevcf_mux_parent_hws),
165957b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
166057b55c76SYu Tu 	},
166157b55c76SYu Tu };
166257b55c76SYu Tu 
166357b55c76SYu Tu /* VPU Clock */
166457b55c76SYu Tu static const struct clk_parent_data s4_vpu_parent_data[] = {
166557b55c76SYu Tu 	{ .fw_name = "fclk_div3", },
166657b55c76SYu Tu 	{ .fw_name = "fclk_div4", },
166757b55c76SYu Tu 	{ .fw_name = "fclk_div5", },
166857b55c76SYu Tu 	{ .fw_name = "fclk_div7", },
166957b55c76SYu Tu 	{ .fw_name = "mpll1", },
167057b55c76SYu Tu 	{ .hw = &s4_vid_pll.hw },
167157b55c76SYu Tu 	{ .fw_name = "hifi_pll", },
167257b55c76SYu Tu 	{ .fw_name = "gp0_pll", },
167357b55c76SYu Tu };
167457b55c76SYu Tu 
167557b55c76SYu Tu static struct clk_regmap s4_vpu_0_sel = {
167657b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data){
167757b55c76SYu Tu 		.offset = CLKCTRL_VPU_CLK_CTRL,
167857b55c76SYu Tu 		.mask = 0x7,
167957b55c76SYu Tu 		.shift = 9,
168057b55c76SYu Tu 	},
168157b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
168257b55c76SYu Tu 		.name = "vpu_0_sel",
168357b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
168457b55c76SYu Tu 		.parent_data = s4_vpu_parent_data,
168557b55c76SYu Tu 		.num_parents = ARRAY_SIZE(s4_vpu_parent_data),
168657b55c76SYu Tu 		.flags = 0,
168757b55c76SYu Tu 	},
168857b55c76SYu Tu };
168957b55c76SYu Tu 
169057b55c76SYu Tu static struct clk_regmap s4_vpu_0_div = {
169157b55c76SYu Tu 	.data = &(struct clk_regmap_div_data){
169257b55c76SYu Tu 		.offset = CLKCTRL_VPU_CLK_CTRL,
169357b55c76SYu Tu 		.shift = 0,
169457b55c76SYu Tu 		.width = 7,
169557b55c76SYu Tu 	},
169657b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
169757b55c76SYu Tu 		.name = "vpu_0_div",
169857b55c76SYu Tu 		.ops = &clk_regmap_divider_ops,
169957b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) { &s4_vpu_0_sel.hw },
170057b55c76SYu Tu 		.num_parents = 1,
170157b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
170257b55c76SYu Tu 	},
170357b55c76SYu Tu };
170457b55c76SYu Tu 
170557b55c76SYu Tu static struct clk_regmap s4_vpu_0 = {
170657b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
170757b55c76SYu Tu 		.offset = CLKCTRL_VPU_CLK_CTRL,
170857b55c76SYu Tu 		.bit_idx = 8,
170957b55c76SYu Tu 	},
171057b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
171157b55c76SYu Tu 		.name = "vpu_0",
171257b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
171357b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) { &s4_vpu_0_div.hw },
171457b55c76SYu Tu 		.num_parents = 1,
171557b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
171657b55c76SYu Tu 	},
171757b55c76SYu Tu };
171857b55c76SYu Tu 
171957b55c76SYu Tu static struct clk_regmap s4_vpu_1_sel = {
172057b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data){
172157b55c76SYu Tu 		.offset = CLKCTRL_VPU_CLK_CTRL,
172257b55c76SYu Tu 		.mask = 0x7,
172357b55c76SYu Tu 		.shift = 25,
172457b55c76SYu Tu 	},
172557b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
172657b55c76SYu Tu 		.name = "vpu_1_sel",
172757b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
172857b55c76SYu Tu 		.parent_data = s4_vpu_parent_data,
172957b55c76SYu Tu 		.num_parents = ARRAY_SIZE(s4_vpu_parent_data),
173057b55c76SYu Tu 		.flags = 0,
173157b55c76SYu Tu 	},
173257b55c76SYu Tu };
173357b55c76SYu Tu 
173457b55c76SYu Tu static struct clk_regmap s4_vpu_1_div = {
173557b55c76SYu Tu 	.data = &(struct clk_regmap_div_data){
173657b55c76SYu Tu 		.offset = CLKCTRL_VPU_CLK_CTRL,
173757b55c76SYu Tu 		.shift = 16,
173857b55c76SYu Tu 		.width = 7,
173957b55c76SYu Tu 	},
174057b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
174157b55c76SYu Tu 		.name = "vpu_1_div",
174257b55c76SYu Tu 		.ops = &clk_regmap_divider_ops,
174357b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) { &s4_vpu_1_sel.hw },
174457b55c76SYu Tu 		.num_parents = 1,
174557b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
174657b55c76SYu Tu 	},
174757b55c76SYu Tu };
174857b55c76SYu Tu 
174957b55c76SYu Tu static struct clk_regmap s4_vpu_1 = {
175057b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
175157b55c76SYu Tu 		.offset = CLKCTRL_VPU_CLK_CTRL,
175257b55c76SYu Tu 		.bit_idx = 24,
175357b55c76SYu Tu 	},
175457b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
175557b55c76SYu Tu 		.name = "vpu_1",
175657b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
175757b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) { &s4_vpu_1_div.hw },
175857b55c76SYu Tu 		.num_parents = 1,
175957b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
176057b55c76SYu Tu 	},
176157b55c76SYu Tu };
176257b55c76SYu Tu 
176357b55c76SYu Tu static struct clk_regmap s4_vpu = {
176457b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data){
176557b55c76SYu Tu 		.offset = CLKCTRL_VPU_CLK_CTRL,
176657b55c76SYu Tu 		.mask = 1,
176757b55c76SYu Tu 		.shift = 31,
176857b55c76SYu Tu 	},
176957b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
177057b55c76SYu Tu 		.name = "vpu",
177157b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
177257b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
177357b55c76SYu Tu 			&s4_vpu_0.hw,
177457b55c76SYu Tu 			&s4_vpu_1.hw,
177557b55c76SYu Tu 		},
177657b55c76SYu Tu 		.num_parents = 2,
177757b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
177857b55c76SYu Tu 	},
177957b55c76SYu Tu };
178057b55c76SYu Tu 
178157b55c76SYu Tu static const struct clk_parent_data vpu_clkb_tmp_parent_data[] = {
178257b55c76SYu Tu 	{ .hw = &s4_vpu.hw },
178357b55c76SYu Tu 	{ .fw_name = "fclk_div4", },
178457b55c76SYu Tu 	{ .fw_name = "fclk_div5", },
178557b55c76SYu Tu 	{ .fw_name = "fclk_div7", }
178657b55c76SYu Tu };
178757b55c76SYu Tu 
178857b55c76SYu Tu static struct clk_regmap s4_vpu_clkb_tmp_mux = {
178957b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data){
179057b55c76SYu Tu 		.offset = CLKCTRL_VPU_CLKB_CTRL,
179157b55c76SYu Tu 		.mask = 0x3,
179257b55c76SYu Tu 		.shift = 20,
179357b55c76SYu Tu 	},
179457b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
179557b55c76SYu Tu 		.name = "vpu_clkb_tmp_mux",
179657b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
179757b55c76SYu Tu 		.parent_data = vpu_clkb_tmp_parent_data,
179857b55c76SYu Tu 		.num_parents = ARRAY_SIZE(vpu_clkb_tmp_parent_data),
179957b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
180057b55c76SYu Tu 	},
180157b55c76SYu Tu };
180257b55c76SYu Tu 
180357b55c76SYu Tu static struct clk_regmap s4_vpu_clkb_tmp_div = {
180457b55c76SYu Tu 	.data = &(struct clk_regmap_div_data){
180557b55c76SYu Tu 		.offset = CLKCTRL_VPU_CLKB_CTRL,
180657b55c76SYu Tu 		.shift = 16,
180757b55c76SYu Tu 		.width = 4,
180857b55c76SYu Tu 	},
180957b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
181057b55c76SYu Tu 		.name = "vpu_clkb_tmp_div",
181157b55c76SYu Tu 		.ops = &clk_regmap_divider_ops,
181257b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
181357b55c76SYu Tu 			&s4_vpu_clkb_tmp_mux.hw
181457b55c76SYu Tu 		},
181557b55c76SYu Tu 		.num_parents = 1,
181657b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
181757b55c76SYu Tu 	},
181857b55c76SYu Tu };
181957b55c76SYu Tu 
182057b55c76SYu Tu static struct clk_regmap s4_vpu_clkb_tmp = {
182157b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
182257b55c76SYu Tu 		.offset = CLKCTRL_VPU_CLKB_CTRL,
182357b55c76SYu Tu 		.bit_idx = 24,
182457b55c76SYu Tu 	},
182557b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
182657b55c76SYu Tu 		.name = "vpu_clkb_tmp",
182757b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
182857b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
182957b55c76SYu Tu 			&s4_vpu_clkb_tmp_div.hw
183057b55c76SYu Tu 		},
183157b55c76SYu Tu 		.num_parents = 1,
183257b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
183357b55c76SYu Tu 	},
183457b55c76SYu Tu };
183557b55c76SYu Tu 
183657b55c76SYu Tu static struct clk_regmap s4_vpu_clkb_div = {
183757b55c76SYu Tu 	.data = &(struct clk_regmap_div_data){
183857b55c76SYu Tu 		.offset = CLKCTRL_VPU_CLKB_CTRL,
183957b55c76SYu Tu 		.shift = 0,
184057b55c76SYu Tu 		.width = 8,
184157b55c76SYu Tu 	},
184257b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
184357b55c76SYu Tu 		.name = "vpu_clkb_div",
184457b55c76SYu Tu 		.ops = &clk_regmap_divider_ops,
184557b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
184657b55c76SYu Tu 			&s4_vpu_clkb_tmp.hw
184757b55c76SYu Tu 		},
184857b55c76SYu Tu 		.num_parents = 1,
184957b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
185057b55c76SYu Tu 	},
185157b55c76SYu Tu };
185257b55c76SYu Tu 
185357b55c76SYu Tu static struct clk_regmap s4_vpu_clkb = {
185457b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
185557b55c76SYu Tu 		.offset = CLKCTRL_VPU_CLKB_CTRL,
185657b55c76SYu Tu 		.bit_idx = 8,
185757b55c76SYu Tu 	},
185857b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
185957b55c76SYu Tu 		.name = "vpu_clkb",
186057b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
186157b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
186257b55c76SYu Tu 			&s4_vpu_clkb_div.hw
186357b55c76SYu Tu 		},
186457b55c76SYu Tu 		.num_parents = 1,
186557b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
186657b55c76SYu Tu 	},
186757b55c76SYu Tu };
186857b55c76SYu Tu 
186957b55c76SYu Tu static const struct clk_parent_data s4_vpu_clkc_parent_data[] = {
187057b55c76SYu Tu 	{ .fw_name = "fclk_div4", },
187157b55c76SYu Tu 	{ .fw_name = "fclk_div3", },
187257b55c76SYu Tu 	{ .fw_name = "fclk_div5", },
187357b55c76SYu Tu 	{ .fw_name = "fclk_div7", },
187457b55c76SYu Tu 	{ .fw_name = "mpll1", },
187557b55c76SYu Tu 	{ .hw = &s4_vid_pll.hw },
187657b55c76SYu Tu 	{ .fw_name = "mpll2", },
187757b55c76SYu Tu 	{ .fw_name = "gp0_pll", },
187857b55c76SYu Tu };
187957b55c76SYu Tu 
188057b55c76SYu Tu static struct clk_regmap s4_vpu_clkc_p0_mux  = {
188157b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data){
188257b55c76SYu Tu 		.offset = CLKCTRL_VPU_CLKC_CTRL,
188357b55c76SYu Tu 		.mask = 0x7,
188457b55c76SYu Tu 		.shift = 9,
188557b55c76SYu Tu 	},
188657b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
188757b55c76SYu Tu 		.name = "vpu_clkc_p0_mux",
188857b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
188957b55c76SYu Tu 		.parent_data = s4_vpu_clkc_parent_data,
189057b55c76SYu Tu 		.num_parents = ARRAY_SIZE(s4_vpu_clkc_parent_data),
189157b55c76SYu Tu 		.flags = 0,
189257b55c76SYu Tu 	},
189357b55c76SYu Tu };
189457b55c76SYu Tu 
189557b55c76SYu Tu static struct clk_regmap s4_vpu_clkc_p0_div = {
189657b55c76SYu Tu 	.data = &(struct clk_regmap_div_data){
189757b55c76SYu Tu 		.offset = CLKCTRL_VPU_CLKC_CTRL,
189857b55c76SYu Tu 		.shift = 0,
189957b55c76SYu Tu 		.width = 7,
190057b55c76SYu Tu 	},
190157b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
190257b55c76SYu Tu 		.name = "vpu_clkc_p0_div",
190357b55c76SYu Tu 		.ops = &clk_regmap_divider_ops,
190457b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
190557b55c76SYu Tu 			&s4_vpu_clkc_p0_mux.hw
190657b55c76SYu Tu 		},
190757b55c76SYu Tu 		.num_parents = 1,
190857b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
190957b55c76SYu Tu 	},
191057b55c76SYu Tu };
191157b55c76SYu Tu 
191257b55c76SYu Tu static struct clk_regmap s4_vpu_clkc_p0 = {
191357b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
191457b55c76SYu Tu 		.offset = CLKCTRL_VPU_CLKC_CTRL,
191557b55c76SYu Tu 		.bit_idx = 8,
191657b55c76SYu Tu 	},
191757b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
191857b55c76SYu Tu 		.name = "vpu_clkc_p0",
191957b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
192057b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
192157b55c76SYu Tu 			&s4_vpu_clkc_p0_div.hw
192257b55c76SYu Tu 		},
192357b55c76SYu Tu 		.num_parents = 1,
192457b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
192557b55c76SYu Tu 	},
192657b55c76SYu Tu };
192757b55c76SYu Tu 
192857b55c76SYu Tu static struct clk_regmap s4_vpu_clkc_p1_mux = {
192957b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data){
193057b55c76SYu Tu 		.offset = CLKCTRL_VPU_CLKC_CTRL,
193157b55c76SYu Tu 		.mask = 0x7,
193257b55c76SYu Tu 		.shift = 25,
193357b55c76SYu Tu 	},
193457b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
193557b55c76SYu Tu 		.name = "vpu_clkc_p1_mux",
193657b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
193757b55c76SYu Tu 		.parent_data = s4_vpu_clkc_parent_data,
193857b55c76SYu Tu 		.num_parents = ARRAY_SIZE(s4_vpu_clkc_parent_data),
193957b55c76SYu Tu 		.flags = 0,
194057b55c76SYu Tu 	},
194157b55c76SYu Tu };
194257b55c76SYu Tu 
194357b55c76SYu Tu static struct clk_regmap s4_vpu_clkc_p1_div = {
194457b55c76SYu Tu 	.data = &(struct clk_regmap_div_data){
194557b55c76SYu Tu 		.offset = CLKCTRL_VPU_CLKC_CTRL,
194657b55c76SYu Tu 		.shift = 16,
194757b55c76SYu Tu 		.width = 7,
194857b55c76SYu Tu 	},
194957b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
195057b55c76SYu Tu 		.name = "vpu_clkc_p1_div",
195157b55c76SYu Tu 		.ops = &clk_regmap_divider_ops,
195257b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
195357b55c76SYu Tu 			&s4_vpu_clkc_p1_mux.hw
195457b55c76SYu Tu 		},
195557b55c76SYu Tu 		.num_parents = 1,
195657b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
195757b55c76SYu Tu 	},
195857b55c76SYu Tu };
195957b55c76SYu Tu 
196057b55c76SYu Tu static struct clk_regmap s4_vpu_clkc_p1 = {
196157b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
196257b55c76SYu Tu 		.offset = CLKCTRL_VPU_CLKC_CTRL,
196357b55c76SYu Tu 		.bit_idx = 24,
196457b55c76SYu Tu 	},
196557b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
196657b55c76SYu Tu 		.name = "vpu_clkc_p1",
196757b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
196857b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
196957b55c76SYu Tu 			&s4_vpu_clkc_p1_div.hw
197057b55c76SYu Tu 		},
197157b55c76SYu Tu 		.num_parents = 1,
197257b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
197357b55c76SYu Tu 	},
197457b55c76SYu Tu };
197557b55c76SYu Tu 
197657b55c76SYu Tu static const struct clk_hw *s4_vpu_mux_parent_hws[] = {
197757b55c76SYu Tu 	&s4_vpu_clkc_p0.hw,
197857b55c76SYu Tu 	&s4_vpu_clkc_p1.hw
197957b55c76SYu Tu };
198057b55c76SYu Tu 
198157b55c76SYu Tu static struct clk_regmap s4_vpu_clkc_mux = {
198257b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data){
198357b55c76SYu Tu 		.offset = CLKCTRL_VPU_CLKC_CTRL,
198457b55c76SYu Tu 		.mask = 0x1,
198557b55c76SYu Tu 		.shift = 31,
198657b55c76SYu Tu 	},
198757b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
198857b55c76SYu Tu 		.name = "vpu_clkc_mux",
198957b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
199057b55c76SYu Tu 		.parent_hws = s4_vpu_mux_parent_hws,
199157b55c76SYu Tu 		.num_parents = ARRAY_SIZE(s4_vpu_mux_parent_hws),
199257b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
199357b55c76SYu Tu 	},
199457b55c76SYu Tu };
199557b55c76SYu Tu 
199657b55c76SYu Tu /* VAPB Clock */
199757b55c76SYu Tu static const struct clk_parent_data s4_vapb_parent_data[] = {
199857b55c76SYu Tu 	{ .fw_name = "fclk_div4", },
199957b55c76SYu Tu 	{ .fw_name = "fclk_div3", },
200057b55c76SYu Tu 	{ .fw_name = "fclk_div5", },
200157b55c76SYu Tu 	{ .fw_name = "fclk_div7", },
200257b55c76SYu Tu 	{ .fw_name = "mpll1", },
200357b55c76SYu Tu 	{ .hw = &s4_vid_pll.hw },
200457b55c76SYu Tu 	{ .fw_name = "mpll2", },
200557b55c76SYu Tu 	{ .fw_name = "fclk_div2p5", },
200657b55c76SYu Tu };
200757b55c76SYu Tu 
200857b55c76SYu Tu static struct clk_regmap s4_vapb_0_sel = {
200957b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data){
201057b55c76SYu Tu 		.offset = CLKCTRL_VAPBCLK_CTRL,
201157b55c76SYu Tu 		.mask = 0x7,
201257b55c76SYu Tu 		.shift = 9,
201357b55c76SYu Tu 	},
201457b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
201557b55c76SYu Tu 		.name = "vapb_0_sel",
201657b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
201757b55c76SYu Tu 		.parent_data = s4_vapb_parent_data,
201857b55c76SYu Tu 		.num_parents = ARRAY_SIZE(s4_vapb_parent_data),
201957b55c76SYu Tu 		.flags = 0,
202057b55c76SYu Tu 	},
202157b55c76SYu Tu };
202257b55c76SYu Tu 
202357b55c76SYu Tu static struct clk_regmap s4_vapb_0_div = {
202457b55c76SYu Tu 	.data = &(struct clk_regmap_div_data){
202557b55c76SYu Tu 		.offset = CLKCTRL_VAPBCLK_CTRL,
202657b55c76SYu Tu 		.shift = 0,
202757b55c76SYu Tu 		.width = 7,
202857b55c76SYu Tu 	},
202957b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
203057b55c76SYu Tu 		.name = "vapb_0_div",
203157b55c76SYu Tu 		.ops = &clk_regmap_divider_ops,
203257b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
203357b55c76SYu Tu 			&s4_vapb_0_sel.hw
203457b55c76SYu Tu 		},
203557b55c76SYu Tu 		.num_parents = 1,
203657b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
203757b55c76SYu Tu 	},
203857b55c76SYu Tu };
203957b55c76SYu Tu 
204057b55c76SYu Tu static struct clk_regmap s4_vapb_0 = {
204157b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
204257b55c76SYu Tu 		.offset = CLKCTRL_VAPBCLK_CTRL,
204357b55c76SYu Tu 		.bit_idx = 8,
204457b55c76SYu Tu 	},
204557b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
204657b55c76SYu Tu 		.name = "vapb_0",
204757b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
204857b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
204957b55c76SYu Tu 			&s4_vapb_0_div.hw
205057b55c76SYu Tu 		},
205157b55c76SYu Tu 		.num_parents = 1,
205257b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
205357b55c76SYu Tu 	},
205457b55c76SYu Tu };
205557b55c76SYu Tu 
205657b55c76SYu Tu static struct clk_regmap s4_vapb_1_sel = {
205757b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data){
205857b55c76SYu Tu 		.offset = CLKCTRL_VAPBCLK_CTRL,
205957b55c76SYu Tu 		.mask = 0x7,
206057b55c76SYu Tu 		.shift = 25,
206157b55c76SYu Tu 	},
206257b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
206357b55c76SYu Tu 		.name = "vapb_1_sel",
206457b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
206557b55c76SYu Tu 		.parent_data = s4_vapb_parent_data,
206657b55c76SYu Tu 		.num_parents = ARRAY_SIZE(s4_vapb_parent_data),
206757b55c76SYu Tu 		.flags = 0,
206857b55c76SYu Tu 	},
206957b55c76SYu Tu };
207057b55c76SYu Tu 
207157b55c76SYu Tu static struct clk_regmap s4_vapb_1_div = {
207257b55c76SYu Tu 	.data = &(struct clk_regmap_div_data){
207357b55c76SYu Tu 		.offset = CLKCTRL_VAPBCLK_CTRL,
207457b55c76SYu Tu 		.shift = 16,
207557b55c76SYu Tu 		.width = 7,
207657b55c76SYu Tu 	},
207757b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
207857b55c76SYu Tu 		.name = "vapb_1_div",
207957b55c76SYu Tu 		.ops = &clk_regmap_divider_ops,
208057b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
208157b55c76SYu Tu 			&s4_vapb_1_sel.hw
208257b55c76SYu Tu 		},
208357b55c76SYu Tu 		.num_parents = 1,
208457b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
208557b55c76SYu Tu 	},
208657b55c76SYu Tu };
208757b55c76SYu Tu 
208857b55c76SYu Tu static struct clk_regmap s4_vapb_1 = {
208957b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
209057b55c76SYu Tu 		.offset = CLKCTRL_VAPBCLK_CTRL,
209157b55c76SYu Tu 		.bit_idx = 24,
209257b55c76SYu Tu 	},
209357b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
209457b55c76SYu Tu 		.name = "vapb_1",
209557b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
209657b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
209757b55c76SYu Tu 			&s4_vapb_1_div.hw
209857b55c76SYu Tu 		},
209957b55c76SYu Tu 		.num_parents = 1,
210057b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
210157b55c76SYu Tu 	},
210257b55c76SYu Tu };
210357b55c76SYu Tu 
210457b55c76SYu Tu static struct clk_regmap s4_vapb = {
210557b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data){
210657b55c76SYu Tu 		.offset = CLKCTRL_VAPBCLK_CTRL,
210757b55c76SYu Tu 		.mask = 1,
210857b55c76SYu Tu 		.shift = 31,
210957b55c76SYu Tu 	},
211057b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
211157b55c76SYu Tu 		.name = "vapb_sel",
211257b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
211357b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
211457b55c76SYu Tu 			&s4_vapb_0.hw,
211557b55c76SYu Tu 			&s4_vapb_1.hw
211657b55c76SYu Tu 		},
211757b55c76SYu Tu 		.num_parents = 2,
211857b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
211957b55c76SYu Tu 	},
212057b55c76SYu Tu };
212157b55c76SYu Tu 
212257b55c76SYu Tu static struct clk_regmap s4_ge2d_gate = {
212357b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
212457b55c76SYu Tu 		.offset = CLKCTRL_VAPBCLK_CTRL,
212557b55c76SYu Tu 		.bit_idx = 30,
212657b55c76SYu Tu 	},
212757b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
212857b55c76SYu Tu 		.name = "ge2d_clk",
212957b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
213057b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) { &s4_vapb.hw },
213157b55c76SYu Tu 		.num_parents = 1,
213257b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
213357b55c76SYu Tu 	},
213457b55c76SYu Tu };
213557b55c76SYu Tu 
213657b55c76SYu Tu static const struct clk_parent_data s4_esmclk_parent_data[] = {
213757b55c76SYu Tu 	{ .fw_name = "fclk_div7", },
213857b55c76SYu Tu 	{ .fw_name = "fclk_div4", },
213957b55c76SYu Tu 	{ .fw_name = "fclk_div3", },
214057b55c76SYu Tu 	{ .fw_name = "fclk_div5", },
214157b55c76SYu Tu };
214257b55c76SYu Tu 
214357b55c76SYu Tu static struct clk_regmap s4_hdcp22_esmclk_mux = {
214457b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data){
214557b55c76SYu Tu 		.offset = CLKCTRL_HDCP22_CTRL,
214657b55c76SYu Tu 		.mask = 0x3,
214757b55c76SYu Tu 		.shift = 9,
214857b55c76SYu Tu 	},
214957b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
215057b55c76SYu Tu 		.name = "hdcp22_esmclk_mux",
215157b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
215257b55c76SYu Tu 		.parent_data = s4_esmclk_parent_data,
215357b55c76SYu Tu 		.num_parents = ARRAY_SIZE(s4_esmclk_parent_data),
215457b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
215557b55c76SYu Tu 	},
215657b55c76SYu Tu };
215757b55c76SYu Tu 
215857b55c76SYu Tu static struct clk_regmap s4_hdcp22_esmclk_div = {
215957b55c76SYu Tu 	.data = &(struct clk_regmap_div_data){
216057b55c76SYu Tu 		.offset = CLKCTRL_HDCP22_CTRL,
216157b55c76SYu Tu 		.shift = 0,
216257b55c76SYu Tu 		.width = 7,
216357b55c76SYu Tu 	},
216457b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
216557b55c76SYu Tu 		.name = "hdcp22_esmclk_div",
216657b55c76SYu Tu 		.ops = &clk_regmap_divider_ops,
216757b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
216857b55c76SYu Tu 			&s4_hdcp22_esmclk_mux.hw
216957b55c76SYu Tu 		},
217057b55c76SYu Tu 		.num_parents = 1,
217157b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
217257b55c76SYu Tu 	},
217357b55c76SYu Tu };
217457b55c76SYu Tu 
217557b55c76SYu Tu static struct clk_regmap s4_hdcp22_esmclk_gate = {
217657b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
217757b55c76SYu Tu 		.offset = CLKCTRL_HDCP22_CTRL,
217857b55c76SYu Tu 		.bit_idx = 8,
217957b55c76SYu Tu 	},
218057b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
218157b55c76SYu Tu 		.name = "hdcp22_esmclk_gate",
218257b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
218357b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
218457b55c76SYu Tu 			&s4_hdcp22_esmclk_div.hw
218557b55c76SYu Tu 		},
218657b55c76SYu Tu 		.num_parents = 1,
218757b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
218857b55c76SYu Tu 	},
218957b55c76SYu Tu };
219057b55c76SYu Tu 
219157b55c76SYu Tu static const struct clk_parent_data s4_skpclk_parent_data[] = {
219257b55c76SYu Tu 	{ .fw_name = "xtal", },
219357b55c76SYu Tu 	{ .fw_name = "fclk_div4", },
219457b55c76SYu Tu 	{ .fw_name = "fclk_div3", },
219557b55c76SYu Tu 	{ .fw_name = "fclk_div5", },
219657b55c76SYu Tu };
219757b55c76SYu Tu 
219857b55c76SYu Tu static struct clk_regmap s4_hdcp22_skpclk_mux = {
219957b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data){
220057b55c76SYu Tu 		.offset = CLKCTRL_HDCP22_CTRL,
220157b55c76SYu Tu 		.mask = 0x3,
220257b55c76SYu Tu 		.shift = 25,
220357b55c76SYu Tu 	},
220457b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
220557b55c76SYu Tu 		.name = "hdcp22_skpclk_mux",
220657b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
220757b55c76SYu Tu 		.parent_data = s4_skpclk_parent_data,
220857b55c76SYu Tu 		.num_parents = ARRAY_SIZE(s4_skpclk_parent_data),
220957b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
221057b55c76SYu Tu 	},
221157b55c76SYu Tu };
221257b55c76SYu Tu 
221357b55c76SYu Tu static struct clk_regmap s4_hdcp22_skpclk_div = {
221457b55c76SYu Tu 	.data = &(struct clk_regmap_div_data){
221557b55c76SYu Tu 		.offset = CLKCTRL_HDCP22_CTRL,
221657b55c76SYu Tu 		.shift = 16,
221757b55c76SYu Tu 		.width = 7,
221857b55c76SYu Tu 	},
221957b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
222057b55c76SYu Tu 		.name = "hdcp22_skpclk_div",
222157b55c76SYu Tu 		.ops = &clk_regmap_divider_ops,
222257b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
222357b55c76SYu Tu 			&s4_hdcp22_skpclk_mux.hw
222457b55c76SYu Tu 		},
222557b55c76SYu Tu 		.num_parents = 1,
222657b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
222757b55c76SYu Tu 	},
222857b55c76SYu Tu };
222957b55c76SYu Tu 
223057b55c76SYu Tu static struct clk_regmap s4_hdcp22_skpclk_gate = {
223157b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
223257b55c76SYu Tu 		.offset = CLKCTRL_HDCP22_CTRL,
223357b55c76SYu Tu 		.bit_idx = 24,
223457b55c76SYu Tu 	},
223557b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
223657b55c76SYu Tu 		.name = "hdcp22_skpclk_gate",
223757b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
223857b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
223957b55c76SYu Tu 			&s4_hdcp22_skpclk_div.hw
224057b55c76SYu Tu 		},
224157b55c76SYu Tu 		.num_parents = 1,
224257b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
224357b55c76SYu Tu 	},
224457b55c76SYu Tu };
224557b55c76SYu Tu 
224657b55c76SYu Tu static const struct clk_parent_data s4_vdin_parent_data[]  = {
224757b55c76SYu Tu 	{ .fw_name = "xtal", },
224857b55c76SYu Tu 	{ .fw_name = "fclk_div4", },
224957b55c76SYu Tu 	{ .fw_name = "fclk_div3", },
225057b55c76SYu Tu 	{ .fw_name = "fclk_div5", },
225157b55c76SYu Tu 	{ .hw = &s4_vid_pll.hw }
225257b55c76SYu Tu };
225357b55c76SYu Tu 
225457b55c76SYu Tu static struct clk_regmap s4_vdin_meas_mux = {
225557b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data){
225657b55c76SYu Tu 		.offset = CLKCTRL_VDIN_MEAS_CLK_CTRL,
225757b55c76SYu Tu 		.mask = 0x7,
225857b55c76SYu Tu 		.shift = 9,
225957b55c76SYu Tu 	},
226057b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
226157b55c76SYu Tu 		.name = "vdin_meas_mux",
226257b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
226357b55c76SYu Tu 		.parent_data = s4_vdin_parent_data,
226457b55c76SYu Tu 		.num_parents = ARRAY_SIZE(s4_vdin_parent_data),
226557b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
226657b55c76SYu Tu 	},
226757b55c76SYu Tu };
226857b55c76SYu Tu 
226957b55c76SYu Tu static struct clk_regmap s4_vdin_meas_div = {
227057b55c76SYu Tu 	.data = &(struct clk_regmap_div_data){
227157b55c76SYu Tu 		.offset = CLKCTRL_VDIN_MEAS_CLK_CTRL,
227257b55c76SYu Tu 		.shift = 0,
227357b55c76SYu Tu 		.width = 7,
227457b55c76SYu Tu 	},
227557b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
227657b55c76SYu Tu 		.name = "vdin_meas_div",
227757b55c76SYu Tu 		.ops = &clk_regmap_divider_ops,
227857b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
227957b55c76SYu Tu 			&s4_vdin_meas_mux.hw
228057b55c76SYu Tu 		},
228157b55c76SYu Tu 		.num_parents = 1,
228257b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
228357b55c76SYu Tu 	},
228457b55c76SYu Tu };
228557b55c76SYu Tu 
228657b55c76SYu Tu static struct clk_regmap s4_vdin_meas_gate = {
228757b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
228857b55c76SYu Tu 		.offset = CLKCTRL_VDIN_MEAS_CLK_CTRL,
228957b55c76SYu Tu 		.bit_idx = 8,
229057b55c76SYu Tu 	},
229157b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
229257b55c76SYu Tu 		.name = "vdin_meas_gate",
229357b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
229457b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
229557b55c76SYu Tu 			&s4_vdin_meas_div.hw
229657b55c76SYu Tu 		},
229757b55c76SYu Tu 		.num_parents = 1,
229857b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
229957b55c76SYu Tu 	},
230057b55c76SYu Tu };
230157b55c76SYu Tu 
230257b55c76SYu Tu /* EMMC/NAND clock */
230357b55c76SYu Tu static const struct clk_parent_data s4_sd_emmc_clk0_parent_data[] = {
230457b55c76SYu Tu 	{ .fw_name = "xtal", },
230557b55c76SYu Tu 	{ .fw_name = "fclk_div2", },
230657b55c76SYu Tu 	{ .fw_name = "fclk_div3", },
230757b55c76SYu Tu 	{ .fw_name = "hifi_pll", },
230857b55c76SYu Tu 	{ .fw_name = "fclk_div2p5", },
230957b55c76SYu Tu 	{ .fw_name = "mpll2", },
231057b55c76SYu Tu 	{ .fw_name = "mpll3", },
231157b55c76SYu Tu 	{ .fw_name = "gp0_pll", },
231257b55c76SYu Tu };
231357b55c76SYu Tu 
231457b55c76SYu Tu static struct clk_regmap s4_sd_emmc_c_clk0_sel = {
231557b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data){
231657b55c76SYu Tu 		.offset = CLKCTRL_NAND_CLK_CTRL,
231757b55c76SYu Tu 		.mask = 0x7,
231857b55c76SYu Tu 		.shift = 9,
231957b55c76SYu Tu 	},
232057b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
232157b55c76SYu Tu 		.name = "sd_emmc_c_clk0_sel",
232257b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
232357b55c76SYu Tu 		.parent_data = s4_sd_emmc_clk0_parent_data,
232457b55c76SYu Tu 		.num_parents = ARRAY_SIZE(s4_sd_emmc_clk0_parent_data),
232557b55c76SYu Tu 		.flags = 0,
232657b55c76SYu Tu 	},
232757b55c76SYu Tu };
232857b55c76SYu Tu 
232957b55c76SYu Tu static struct clk_regmap s4_sd_emmc_c_clk0_div = {
233057b55c76SYu Tu 	.data = &(struct clk_regmap_div_data){
233157b55c76SYu Tu 		.offset = CLKCTRL_NAND_CLK_CTRL,
233257b55c76SYu Tu 		.shift = 0,
233357b55c76SYu Tu 		.width = 7,
233457b55c76SYu Tu 	},
233557b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
233657b55c76SYu Tu 		.name = "sd_emmc_c_clk0_div",
233757b55c76SYu Tu 		.ops = &clk_regmap_divider_ops,
233857b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
233957b55c76SYu Tu 			&s4_sd_emmc_c_clk0_sel.hw
234057b55c76SYu Tu 		},
234157b55c76SYu Tu 		.num_parents = 1,
234257b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
234357b55c76SYu Tu 	},
234457b55c76SYu Tu };
234557b55c76SYu Tu 
234657b55c76SYu Tu static struct clk_regmap s4_sd_emmc_c_clk0 = {
234757b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
234857b55c76SYu Tu 		.offset = CLKCTRL_NAND_CLK_CTRL,
234957b55c76SYu Tu 		.bit_idx = 7,
235057b55c76SYu Tu 	},
235157b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
235257b55c76SYu Tu 		.name = "sd_emmc_c_clk0",
235357b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
235457b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
235557b55c76SYu Tu 			&s4_sd_emmc_c_clk0_div.hw
235657b55c76SYu Tu 		},
235757b55c76SYu Tu 		.num_parents = 1,
235857b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
235957b55c76SYu Tu 	},
236057b55c76SYu Tu };
236157b55c76SYu Tu 
236257b55c76SYu Tu static struct clk_regmap s4_sd_emmc_a_clk0_sel = {
236357b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data){
236457b55c76SYu Tu 		.offset = CLKCTRL_SD_EMMC_CLK_CTRL,
236557b55c76SYu Tu 		.mask = 0x7,
236657b55c76SYu Tu 		.shift = 9,
236757b55c76SYu Tu 	},
236857b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
236957b55c76SYu Tu 		.name = "sd_emmc_a_clk0_sel",
237057b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
237157b55c76SYu Tu 		.parent_data = s4_sd_emmc_clk0_parent_data,
237257b55c76SYu Tu 		.num_parents = ARRAY_SIZE(s4_sd_emmc_clk0_parent_data),
237357b55c76SYu Tu 		.flags = 0,
237457b55c76SYu Tu 	},
237557b55c76SYu Tu };
237657b55c76SYu Tu 
237757b55c76SYu Tu static struct clk_regmap s4_sd_emmc_a_clk0_div = {
237857b55c76SYu Tu 	.data = &(struct clk_regmap_div_data){
237957b55c76SYu Tu 		.offset = CLKCTRL_SD_EMMC_CLK_CTRL,
238057b55c76SYu Tu 		.shift = 0,
238157b55c76SYu Tu 		.width = 7,
238257b55c76SYu Tu 	},
238357b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
238457b55c76SYu Tu 		.name = "sd_emmc_a_clk0_div",
238557b55c76SYu Tu 		.ops = &clk_regmap_divider_ops,
238657b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
238757b55c76SYu Tu 			&s4_sd_emmc_a_clk0_sel.hw
238857b55c76SYu Tu 		},
238957b55c76SYu Tu 		.num_parents = 1,
239057b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
239157b55c76SYu Tu 	},
239257b55c76SYu Tu };
239357b55c76SYu Tu 
239457b55c76SYu Tu static struct clk_regmap s4_sd_emmc_a_clk0 = {
239557b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
239657b55c76SYu Tu 		.offset = CLKCTRL_SD_EMMC_CLK_CTRL,
239757b55c76SYu Tu 		.bit_idx = 7,
239857b55c76SYu Tu 	},
239957b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
240057b55c76SYu Tu 		.name = "sd_emmc_a_clk0",
240157b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
240257b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
240357b55c76SYu Tu 			&s4_sd_emmc_a_clk0_div.hw
240457b55c76SYu Tu 		},
240557b55c76SYu Tu 		.num_parents = 1,
240657b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
240757b55c76SYu Tu 	},
240857b55c76SYu Tu };
240957b55c76SYu Tu 
241057b55c76SYu Tu static struct clk_regmap s4_sd_emmc_b_clk0_sel = {
241157b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data){
241257b55c76SYu Tu 		.offset = CLKCTRL_SD_EMMC_CLK_CTRL,
241357b55c76SYu Tu 		.mask = 0x7,
241457b55c76SYu Tu 		.shift = 25,
241557b55c76SYu Tu 	},
241657b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
241757b55c76SYu Tu 		.name = "sd_emmc_b_clk0_sel",
241857b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
241957b55c76SYu Tu 		.parent_data = s4_sd_emmc_clk0_parent_data,
242057b55c76SYu Tu 		.num_parents = ARRAY_SIZE(s4_sd_emmc_clk0_parent_data),
242157b55c76SYu Tu 		.flags = 0,
242257b55c76SYu Tu 	},
242357b55c76SYu Tu };
242457b55c76SYu Tu 
242557b55c76SYu Tu static struct clk_regmap s4_sd_emmc_b_clk0_div = {
242657b55c76SYu Tu 	.data = &(struct clk_regmap_div_data){
242757b55c76SYu Tu 		.offset = CLKCTRL_SD_EMMC_CLK_CTRL,
242857b55c76SYu Tu 		.shift = 16,
242957b55c76SYu Tu 		.width = 7,
243057b55c76SYu Tu 	},
243157b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
243257b55c76SYu Tu 		.name = "sd_emmc_b_clk0_div",
243357b55c76SYu Tu 		.ops = &clk_regmap_divider_ops,
243457b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
243557b55c76SYu Tu 			&s4_sd_emmc_b_clk0_sel.hw
243657b55c76SYu Tu 		},
243757b55c76SYu Tu 		.num_parents = 1,
243857b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
243957b55c76SYu Tu 	},
244057b55c76SYu Tu };
244157b55c76SYu Tu 
244257b55c76SYu Tu static struct clk_regmap s4_sd_emmc_b_clk0 = {
244357b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
244457b55c76SYu Tu 		.offset = CLKCTRL_SD_EMMC_CLK_CTRL,
244557b55c76SYu Tu 		.bit_idx = 23,
244657b55c76SYu Tu 	},
244757b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
244857b55c76SYu Tu 		.name = "sd_emmc_b_clk0",
244957b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
245057b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
245157b55c76SYu Tu 			&s4_sd_emmc_b_clk0_div.hw
245257b55c76SYu Tu 		},
245357b55c76SYu Tu 		.num_parents = 1,
245457b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
245557b55c76SYu Tu 	},
245657b55c76SYu Tu };
245757b55c76SYu Tu 
245857b55c76SYu Tu /* SPICC Clock */
245957b55c76SYu Tu static const struct clk_parent_data s4_spicc_parent_data[] = {
246057b55c76SYu Tu 	{ .fw_name = "xtal", },
246157b55c76SYu Tu 	{ .hw = &s4_sys_clk.hw },
246257b55c76SYu Tu 	{ .fw_name = "fclk_div4", },
246357b55c76SYu Tu 	{ .fw_name = "fclk_div3", },
246457b55c76SYu Tu 	{ .fw_name = "fclk_div2", },
246557b55c76SYu Tu 	{ .fw_name = "fclk_div5", },
246657b55c76SYu Tu 	{ .fw_name = "fclk_div7", },
246757b55c76SYu Tu };
246857b55c76SYu Tu 
246957b55c76SYu Tu static struct clk_regmap s4_spicc0_mux = {
247057b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data){
247157b55c76SYu Tu 		.offset = CLKCTRL_SPICC_CLK_CTRL,
247257b55c76SYu Tu 		.mask = 0x7,
247357b55c76SYu Tu 		.shift = 7,
247457b55c76SYu Tu 	},
247557b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
247657b55c76SYu Tu 		.name = "spicc0_mux",
247757b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
247857b55c76SYu Tu 		.parent_data = s4_spicc_parent_data,
247957b55c76SYu Tu 		.num_parents = ARRAY_SIZE(s4_spicc_parent_data),
248057b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
248157b55c76SYu Tu 	},
248257b55c76SYu Tu };
248357b55c76SYu Tu 
248457b55c76SYu Tu static struct clk_regmap s4_spicc0_div = {
248557b55c76SYu Tu 	.data = &(struct clk_regmap_div_data){
248657b55c76SYu Tu 		.offset = CLKCTRL_SPICC_CLK_CTRL,
248757b55c76SYu Tu 		.shift = 0,
248857b55c76SYu Tu 		.width = 6,
248957b55c76SYu Tu 	},
249057b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
249157b55c76SYu Tu 		.name = "spicc0_div",
249257b55c76SYu Tu 		.ops = &clk_regmap_divider_ops,
249357b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
249457b55c76SYu Tu 			&s4_spicc0_mux.hw
249557b55c76SYu Tu 		},
249657b55c76SYu Tu 		.num_parents = 1,
249757b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
249857b55c76SYu Tu 	},
249957b55c76SYu Tu };
250057b55c76SYu Tu 
250157b55c76SYu Tu static struct clk_regmap s4_spicc0_gate = {
250257b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
250357b55c76SYu Tu 		.offset = CLKCTRL_SPICC_CLK_CTRL,
250457b55c76SYu Tu 		.bit_idx = 6,
250557b55c76SYu Tu 	},
250657b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
250757b55c76SYu Tu 		.name = "spicc0",
250857b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
250957b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
251057b55c76SYu Tu 			&s4_spicc0_div.hw
251157b55c76SYu Tu 		},
251257b55c76SYu Tu 		.num_parents = 1,
251357b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
251457b55c76SYu Tu 	},
251557b55c76SYu Tu };
251657b55c76SYu Tu 
251757b55c76SYu Tu /* PWM Clock */
251857b55c76SYu Tu static const struct clk_parent_data s4_pwm_parent_data[] = {
251957b55c76SYu Tu 	{ .fw_name = "xtal", },
252057b55c76SYu Tu 	{ .hw = &s4_vid_pll.hw },
252157b55c76SYu Tu 	{ .fw_name = "fclk_div4", },
252257b55c76SYu Tu 	{ .fw_name = "fclk_div3", },
252357b55c76SYu Tu };
252457b55c76SYu Tu 
252557b55c76SYu Tu static struct clk_regmap s4_pwm_a_mux = {
252657b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data) {
252757b55c76SYu Tu 		.offset = CLKCTRL_PWM_CLK_AB_CTRL,
252857b55c76SYu Tu 		.mask = 0x3,
252957b55c76SYu Tu 		.shift = 9,
253057b55c76SYu Tu 	},
253157b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
253257b55c76SYu Tu 		.name = "pwm_a_mux",
253357b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
253457b55c76SYu Tu 		.parent_data = s4_pwm_parent_data,
253557b55c76SYu Tu 		.num_parents = ARRAY_SIZE(s4_pwm_parent_data),
253657b55c76SYu Tu 		.flags = 0,
253757b55c76SYu Tu 	},
253857b55c76SYu Tu };
253957b55c76SYu Tu 
254057b55c76SYu Tu static struct clk_regmap s4_pwm_a_div = {
254157b55c76SYu Tu 	.data = &(struct clk_regmap_div_data) {
254257b55c76SYu Tu 		.offset = CLKCTRL_PWM_CLK_AB_CTRL,
254357b55c76SYu Tu 		.shift = 0,
254457b55c76SYu Tu 		.width = 8,
254557b55c76SYu Tu 	},
254657b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
254757b55c76SYu Tu 		.name = "pwm_a_div",
254857b55c76SYu Tu 		.ops = &clk_regmap_divider_ops,
254957b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
255057b55c76SYu Tu 			&s4_pwm_a_mux.hw
255157b55c76SYu Tu 		},
255257b55c76SYu Tu 		.num_parents = 1,
255357b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
255457b55c76SYu Tu 	},
255557b55c76SYu Tu };
255657b55c76SYu Tu 
255757b55c76SYu Tu static struct clk_regmap s4_pwm_a_gate = {
255857b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data) {
255957b55c76SYu Tu 		.offset = CLKCTRL_PWM_CLK_AB_CTRL,
256057b55c76SYu Tu 		.bit_idx = 8,
256157b55c76SYu Tu 	},
256257b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
256357b55c76SYu Tu 		.name = "pwm_a_gate",
256457b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
256557b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
256657b55c76SYu Tu 			&s4_pwm_a_div.hw
256757b55c76SYu Tu 		},
256857b55c76SYu Tu 		.num_parents = 1,
256957b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
257057b55c76SYu Tu 	},
257157b55c76SYu Tu };
257257b55c76SYu Tu 
257357b55c76SYu Tu static struct clk_regmap s4_pwm_b_mux = {
257457b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data) {
257557b55c76SYu Tu 		.offset = CLKCTRL_PWM_CLK_AB_CTRL,
257657b55c76SYu Tu 		.mask = 0x3,
257757b55c76SYu Tu 		.shift = 25,
257857b55c76SYu Tu 	},
257957b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
258057b55c76SYu Tu 		.name = "pwm_b_mux",
258157b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
258257b55c76SYu Tu 		.parent_data = s4_pwm_parent_data,
258357b55c76SYu Tu 		.num_parents = ARRAY_SIZE(s4_pwm_parent_data),
258457b55c76SYu Tu 		.flags = 0,
258557b55c76SYu Tu 	},
258657b55c76SYu Tu };
258757b55c76SYu Tu 
258857b55c76SYu Tu static struct clk_regmap s4_pwm_b_div = {
258957b55c76SYu Tu 	.data = &(struct clk_regmap_div_data) {
259057b55c76SYu Tu 		.offset = CLKCTRL_PWM_CLK_AB_CTRL,
259157b55c76SYu Tu 		.shift = 16,
259257b55c76SYu Tu 		.width = 8,
259357b55c76SYu Tu 	},
259457b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
259557b55c76SYu Tu 		.name = "pwm_b_div",
259657b55c76SYu Tu 		.ops = &clk_regmap_divider_ops,
259757b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
259857b55c76SYu Tu 			&s4_pwm_b_mux.hw
259957b55c76SYu Tu 		},
260057b55c76SYu Tu 		.num_parents = 1,
260157b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
260257b55c76SYu Tu 	},
260357b55c76SYu Tu };
260457b55c76SYu Tu 
260557b55c76SYu Tu static struct clk_regmap s4_pwm_b_gate = {
260657b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data) {
260757b55c76SYu Tu 		.offset = CLKCTRL_PWM_CLK_AB_CTRL,
260857b55c76SYu Tu 		.bit_idx = 24,
260957b55c76SYu Tu 	},
261057b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
261157b55c76SYu Tu 		.name = "pwm_b_gate",
261257b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
261357b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
261457b55c76SYu Tu 			&s4_pwm_b_div.hw
261557b55c76SYu Tu 		},
261657b55c76SYu Tu 		.num_parents = 1,
261757b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
261857b55c76SYu Tu 	},
261957b55c76SYu Tu };
262057b55c76SYu Tu 
262157b55c76SYu Tu static struct clk_regmap s4_pwm_c_mux = {
262257b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data) {
262357b55c76SYu Tu 		.offset = CLKCTRL_PWM_CLK_CD_CTRL,
262457b55c76SYu Tu 		.mask = 0x3,
262557b55c76SYu Tu 		.shift = 9,
262657b55c76SYu Tu 	},
262757b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
262857b55c76SYu Tu 		.name = "pwm_c_mux",
262957b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
263057b55c76SYu Tu 		.parent_data = s4_pwm_parent_data,
263157b55c76SYu Tu 		.num_parents = ARRAY_SIZE(s4_pwm_parent_data),
263257b55c76SYu Tu 		.flags = 0,
263357b55c76SYu Tu 	},
263457b55c76SYu Tu };
263557b55c76SYu Tu 
263657b55c76SYu Tu static struct clk_regmap s4_pwm_c_div = {
263757b55c76SYu Tu 	.data = &(struct clk_regmap_div_data) {
263857b55c76SYu Tu 		.offset = CLKCTRL_PWM_CLK_CD_CTRL,
263957b55c76SYu Tu 		.shift = 0,
264057b55c76SYu Tu 		.width = 8,
264157b55c76SYu Tu 	},
264257b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
264357b55c76SYu Tu 		.name = "pwm_c_div",
264457b55c76SYu Tu 		.ops = &clk_regmap_divider_ops,
264557b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
264657b55c76SYu Tu 			&s4_pwm_c_mux.hw
264757b55c76SYu Tu 		},
264857b55c76SYu Tu 		.num_parents = 1,
264957b55c76SYu Tu 	},
265057b55c76SYu Tu };
265157b55c76SYu Tu 
265257b55c76SYu Tu static struct clk_regmap s4_pwm_c_gate = {
265357b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data) {
265457b55c76SYu Tu 		.offset = CLKCTRL_PWM_CLK_CD_CTRL,
265557b55c76SYu Tu 		.bit_idx = 8,
265657b55c76SYu Tu 	},
265757b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
265857b55c76SYu Tu 		.name = "pwm_c_gate",
265957b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
266057b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
266157b55c76SYu Tu 			&s4_pwm_c_div.hw
266257b55c76SYu Tu 		},
266357b55c76SYu Tu 		.num_parents = 1,
266457b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
266557b55c76SYu Tu 	},
266657b55c76SYu Tu };
266757b55c76SYu Tu 
266857b55c76SYu Tu static struct clk_regmap s4_pwm_d_mux = {
266957b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data) {
267057b55c76SYu Tu 		.offset = CLKCTRL_PWM_CLK_CD_CTRL,
267157b55c76SYu Tu 		.mask = 0x3,
267257b55c76SYu Tu 		.shift = 25,
267357b55c76SYu Tu 	},
267457b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
267557b55c76SYu Tu 		.name = "pwm_d_mux",
267657b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
267757b55c76SYu Tu 		.parent_data = s4_pwm_parent_data,
267857b55c76SYu Tu 		.num_parents = ARRAY_SIZE(s4_pwm_parent_data),
267957b55c76SYu Tu 		.flags = 0,
268057b55c76SYu Tu 	},
268157b55c76SYu Tu };
268257b55c76SYu Tu 
268357b55c76SYu Tu static struct clk_regmap s4_pwm_d_div = {
268457b55c76SYu Tu 	.data = &(struct clk_regmap_div_data) {
268557b55c76SYu Tu 		.offset = CLKCTRL_PWM_CLK_CD_CTRL,
268657b55c76SYu Tu 		.shift = 16,
268757b55c76SYu Tu 		.width = 8,
268857b55c76SYu Tu 	},
268957b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
269057b55c76SYu Tu 		.name = "pwm_d_div",
269157b55c76SYu Tu 		.ops = &clk_regmap_divider_ops,
269257b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
269357b55c76SYu Tu 			&s4_pwm_d_mux.hw
269457b55c76SYu Tu 		},
269557b55c76SYu Tu 		.num_parents = 1,
269657b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
269757b55c76SYu Tu 	},
269857b55c76SYu Tu };
269957b55c76SYu Tu 
270057b55c76SYu Tu static struct clk_regmap s4_pwm_d_gate = {
270157b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data) {
270257b55c76SYu Tu 		.offset = CLKCTRL_PWM_CLK_CD_CTRL,
270357b55c76SYu Tu 		.bit_idx = 24,
270457b55c76SYu Tu 	},
270557b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
270657b55c76SYu Tu 		.name = "pwm_d_gate",
270757b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
270857b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
270957b55c76SYu Tu 			&s4_pwm_d_div.hw
271057b55c76SYu Tu 		},
271157b55c76SYu Tu 		.num_parents = 1,
271257b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
271357b55c76SYu Tu 	},
271457b55c76SYu Tu };
271557b55c76SYu Tu 
271657b55c76SYu Tu static struct clk_regmap s4_pwm_e_mux = {
271757b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data) {
271857b55c76SYu Tu 		.offset = CLKCTRL_PWM_CLK_EF_CTRL,
271957b55c76SYu Tu 		.mask = 0x3,
272057b55c76SYu Tu 		.shift = 9,
272157b55c76SYu Tu 	},
272257b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
272357b55c76SYu Tu 		.name = "pwm_e_mux",
272457b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
272557b55c76SYu Tu 		.parent_data = s4_pwm_parent_data,
272657b55c76SYu Tu 		.num_parents = ARRAY_SIZE(s4_pwm_parent_data),
272757b55c76SYu Tu 		.flags = 0,
272857b55c76SYu Tu 	},
272957b55c76SYu Tu };
273057b55c76SYu Tu 
273157b55c76SYu Tu static struct clk_regmap s4_pwm_e_div = {
273257b55c76SYu Tu 	.data = &(struct clk_regmap_div_data) {
273357b55c76SYu Tu 		.offset = CLKCTRL_PWM_CLK_EF_CTRL,
273457b55c76SYu Tu 		.shift = 0,
273557b55c76SYu Tu 		.width = 8,
273657b55c76SYu Tu 	},
273757b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
273857b55c76SYu Tu 		.name = "pwm_e_div",
273957b55c76SYu Tu 		.ops = &clk_regmap_divider_ops,
274057b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
274157b55c76SYu Tu 			&s4_pwm_e_mux.hw
274257b55c76SYu Tu 		},
274357b55c76SYu Tu 		.num_parents = 1,
274457b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
274557b55c76SYu Tu 	},
274657b55c76SYu Tu };
274757b55c76SYu Tu 
274857b55c76SYu Tu static struct clk_regmap s4_pwm_e_gate = {
274957b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data) {
275057b55c76SYu Tu 		.offset = CLKCTRL_PWM_CLK_EF_CTRL,
275157b55c76SYu Tu 		.bit_idx = 8,
275257b55c76SYu Tu 	},
275357b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
275457b55c76SYu Tu 		.name = "pwm_e_gate",
275557b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
275657b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
275757b55c76SYu Tu 			&s4_pwm_e_div.hw
275857b55c76SYu Tu 		},
275957b55c76SYu Tu 		.num_parents = 1,
276057b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
276157b55c76SYu Tu 	},
276257b55c76SYu Tu };
276357b55c76SYu Tu 
276457b55c76SYu Tu static struct clk_regmap s4_pwm_f_mux = {
276557b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data) {
276657b55c76SYu Tu 		.offset = CLKCTRL_PWM_CLK_EF_CTRL,
276757b55c76SYu Tu 		.mask = 0x3,
276857b55c76SYu Tu 		.shift = 25,
276957b55c76SYu Tu 	},
277057b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
277157b55c76SYu Tu 		.name = "pwm_f_mux",
277257b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
277357b55c76SYu Tu 		.parent_data = s4_pwm_parent_data,
277457b55c76SYu Tu 		.num_parents = ARRAY_SIZE(s4_pwm_parent_data),
277557b55c76SYu Tu 		.flags = 0,
277657b55c76SYu Tu 	},
277757b55c76SYu Tu };
277857b55c76SYu Tu 
277957b55c76SYu Tu static struct clk_regmap s4_pwm_f_div = {
278057b55c76SYu Tu 	.data = &(struct clk_regmap_div_data) {
278157b55c76SYu Tu 		.offset = CLKCTRL_PWM_CLK_EF_CTRL,
278257b55c76SYu Tu 		.shift = 16,
278357b55c76SYu Tu 		.width = 8,
278457b55c76SYu Tu 	},
278557b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
278657b55c76SYu Tu 		.name = "pwm_f_div",
278757b55c76SYu Tu 		.ops = &clk_regmap_divider_ops,
278857b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
278957b55c76SYu Tu 			&s4_pwm_f_mux.hw
279057b55c76SYu Tu 		},
279157b55c76SYu Tu 		.num_parents = 1,
279257b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
279357b55c76SYu Tu 	},
279457b55c76SYu Tu };
279557b55c76SYu Tu 
279657b55c76SYu Tu static struct clk_regmap s4_pwm_f_gate = {
279757b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data) {
279857b55c76SYu Tu 		.offset = CLKCTRL_PWM_CLK_EF_CTRL,
279957b55c76SYu Tu 		.bit_idx = 24,
280057b55c76SYu Tu 	},
280157b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
280257b55c76SYu Tu 		.name = "pwm_f_gate",
280357b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
280457b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
280557b55c76SYu Tu 			&s4_pwm_f_div.hw
280657b55c76SYu Tu 		},
280757b55c76SYu Tu 		.num_parents = 1,
280857b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
280957b55c76SYu Tu 	},
281057b55c76SYu Tu };
281157b55c76SYu Tu 
281257b55c76SYu Tu static struct clk_regmap s4_pwm_g_mux = {
281357b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data) {
281457b55c76SYu Tu 		.offset = CLKCTRL_PWM_CLK_GH_CTRL,
281557b55c76SYu Tu 		.mask = 0x3,
281657b55c76SYu Tu 		.shift = 9,
281757b55c76SYu Tu 	},
281857b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
281957b55c76SYu Tu 		.name = "pwm_g_mux",
282057b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
282157b55c76SYu Tu 		.parent_data = s4_pwm_parent_data,
282257b55c76SYu Tu 		.num_parents = ARRAY_SIZE(s4_pwm_parent_data),
282357b55c76SYu Tu 		.flags = 0,
282457b55c76SYu Tu 	},
282557b55c76SYu Tu };
282657b55c76SYu Tu 
282757b55c76SYu Tu static struct clk_regmap s4_pwm_g_div = {
282857b55c76SYu Tu 	.data = &(struct clk_regmap_div_data) {
282957b55c76SYu Tu 		.offset = CLKCTRL_PWM_CLK_GH_CTRL,
283057b55c76SYu Tu 		.shift = 0,
283157b55c76SYu Tu 		.width = 8,
283257b55c76SYu Tu 	},
283357b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
283457b55c76SYu Tu 		.name = "pwm_g_div",
283557b55c76SYu Tu 		.ops = &clk_regmap_divider_ops,
283657b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
283757b55c76SYu Tu 			&s4_pwm_g_mux.hw
283857b55c76SYu Tu 		},
283957b55c76SYu Tu 		.num_parents = 1,
284057b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
284157b55c76SYu Tu 	},
284257b55c76SYu Tu };
284357b55c76SYu Tu 
284457b55c76SYu Tu static struct clk_regmap s4_pwm_g_gate = {
284557b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data) {
284657b55c76SYu Tu 		.offset = CLKCTRL_PWM_CLK_GH_CTRL,
284757b55c76SYu Tu 		.bit_idx = 8,
284857b55c76SYu Tu 	},
284957b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
285057b55c76SYu Tu 		.name = "pwm_g_gate",
285157b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
285257b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
285357b55c76SYu Tu 			&s4_pwm_g_div.hw
285457b55c76SYu Tu 		},
285557b55c76SYu Tu 		.num_parents = 1,
285657b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
285757b55c76SYu Tu 	},
285857b55c76SYu Tu };
285957b55c76SYu Tu 
286057b55c76SYu Tu static struct clk_regmap s4_pwm_h_mux = {
286157b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data) {
286257b55c76SYu Tu 		.offset = CLKCTRL_PWM_CLK_GH_CTRL,
286357b55c76SYu Tu 		.mask = 0x3,
286457b55c76SYu Tu 		.shift = 25,
286557b55c76SYu Tu 	},
286657b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
286757b55c76SYu Tu 		.name = "pwm_h_mux",
286857b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
286957b55c76SYu Tu 		.parent_data = s4_pwm_parent_data,
287057b55c76SYu Tu 		.num_parents = ARRAY_SIZE(s4_pwm_parent_data),
287157b55c76SYu Tu 		.flags = 0,
287257b55c76SYu Tu 	},
287357b55c76SYu Tu };
287457b55c76SYu Tu 
287557b55c76SYu Tu static struct clk_regmap s4_pwm_h_div = {
287657b55c76SYu Tu 	.data = &(struct clk_regmap_div_data) {
287757b55c76SYu Tu 		.offset = CLKCTRL_PWM_CLK_GH_CTRL,
287857b55c76SYu Tu 		.shift = 16,
287957b55c76SYu Tu 		.width = 8,
288057b55c76SYu Tu 	},
288157b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
288257b55c76SYu Tu 		.name = "pwm_h_div",
288357b55c76SYu Tu 		.ops = &clk_regmap_divider_ops,
288457b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
288557b55c76SYu Tu 			&s4_pwm_h_mux.hw
288657b55c76SYu Tu 		},
288757b55c76SYu Tu 		.num_parents = 1,
288857b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
288957b55c76SYu Tu 	},
289057b55c76SYu Tu };
289157b55c76SYu Tu 
289257b55c76SYu Tu static struct clk_regmap s4_pwm_h_gate = {
289357b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data) {
289457b55c76SYu Tu 		.offset = CLKCTRL_PWM_CLK_GH_CTRL,
289557b55c76SYu Tu 		.bit_idx = 24,
289657b55c76SYu Tu 	},
289757b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
289857b55c76SYu Tu 		.name = "pwm_h_gate",
289957b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
290057b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
290157b55c76SYu Tu 			&s4_pwm_h_div.hw
290257b55c76SYu Tu 		},
290357b55c76SYu Tu 		.num_parents = 1,
290457b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
290557b55c76SYu Tu 	},
290657b55c76SYu Tu };
290757b55c76SYu Tu 
290857b55c76SYu Tu static struct clk_regmap s4_pwm_i_mux = {
290957b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data) {
291057b55c76SYu Tu 		.offset = CLKCTRL_PWM_CLK_IJ_CTRL,
291157b55c76SYu Tu 		.mask = 0x3,
291257b55c76SYu Tu 		.shift = 9,
291357b55c76SYu Tu 	},
291457b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
291557b55c76SYu Tu 		.name = "pwm_i_mux",
291657b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
291757b55c76SYu Tu 		.parent_data = s4_pwm_parent_data,
291857b55c76SYu Tu 		.num_parents = ARRAY_SIZE(s4_pwm_parent_data),
291957b55c76SYu Tu 		.flags = 0,
292057b55c76SYu Tu 	},
292157b55c76SYu Tu };
292257b55c76SYu Tu 
292357b55c76SYu Tu static struct clk_regmap s4_pwm_i_div = {
292457b55c76SYu Tu 	.data = &(struct clk_regmap_div_data) {
292557b55c76SYu Tu 		.offset = CLKCTRL_PWM_CLK_IJ_CTRL,
292657b55c76SYu Tu 		.shift = 0,
292757b55c76SYu Tu 		.width = 8,
292857b55c76SYu Tu 	},
292957b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
293057b55c76SYu Tu 		.name = "pwm_i_div",
293157b55c76SYu Tu 		.ops = &clk_regmap_divider_ops,
293257b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
293357b55c76SYu Tu 			&s4_pwm_i_mux.hw
293457b55c76SYu Tu 		},
293557b55c76SYu Tu 		.num_parents = 1,
293657b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
293757b55c76SYu Tu 	},
293857b55c76SYu Tu };
293957b55c76SYu Tu 
294057b55c76SYu Tu static struct clk_regmap s4_pwm_i_gate = {
294157b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data) {
294257b55c76SYu Tu 		.offset = CLKCTRL_PWM_CLK_IJ_CTRL,
294357b55c76SYu Tu 		.bit_idx = 8,
294457b55c76SYu Tu 	},
294557b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
294657b55c76SYu Tu 		.name = "pwm_i_gate",
294757b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
294857b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
294957b55c76SYu Tu 			&s4_pwm_i_div.hw
295057b55c76SYu Tu 		},
295157b55c76SYu Tu 		.num_parents = 1,
295257b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
295357b55c76SYu Tu 	},
295457b55c76SYu Tu };
295557b55c76SYu Tu 
295657b55c76SYu Tu static struct clk_regmap s4_pwm_j_mux = {
295757b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data) {
295857b55c76SYu Tu 		.offset = CLKCTRL_PWM_CLK_IJ_CTRL,
295957b55c76SYu Tu 		.mask = 0x3,
296057b55c76SYu Tu 		.shift = 25,
296157b55c76SYu Tu 	},
296257b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
296357b55c76SYu Tu 		.name = "pwm_j_mux",
296457b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
296557b55c76SYu Tu 		.parent_data = s4_pwm_parent_data,
296657b55c76SYu Tu 		.num_parents = ARRAY_SIZE(s4_pwm_parent_data),
296757b55c76SYu Tu 		.flags = 0,
296857b55c76SYu Tu 	},
296957b55c76SYu Tu };
297057b55c76SYu Tu 
297157b55c76SYu Tu static struct clk_regmap s4_pwm_j_div = {
297257b55c76SYu Tu 	.data = &(struct clk_regmap_div_data) {
297357b55c76SYu Tu 		.offset = CLKCTRL_PWM_CLK_IJ_CTRL,
297457b55c76SYu Tu 		.shift = 16,
297557b55c76SYu Tu 		.width = 8,
297657b55c76SYu Tu 	},
297757b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
297857b55c76SYu Tu 		.name = "pwm_j_div",
297957b55c76SYu Tu 		.ops = &clk_regmap_divider_ops,
298057b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
2981c5917458SXianwei Zhao 			&s4_pwm_j_mux.hw
298257b55c76SYu Tu 		},
298357b55c76SYu Tu 		.num_parents = 1,
298457b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
298557b55c76SYu Tu 	},
298657b55c76SYu Tu };
298757b55c76SYu Tu 
298857b55c76SYu Tu static struct clk_regmap s4_pwm_j_gate = {
298957b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data) {
299057b55c76SYu Tu 		.offset = CLKCTRL_PWM_CLK_IJ_CTRL,
299157b55c76SYu Tu 		.bit_idx = 24,
299257b55c76SYu Tu 	},
299357b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
299457b55c76SYu Tu 		.name = "pwm_j_gate",
299557b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
299657b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
299757b55c76SYu Tu 			&s4_pwm_j_div.hw
299857b55c76SYu Tu 		},
299957b55c76SYu Tu 		.num_parents = 1,
300057b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
300157b55c76SYu Tu 	},
300257b55c76SYu Tu };
300357b55c76SYu Tu 
300457b55c76SYu Tu static struct clk_regmap s4_saradc_mux = {
300557b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data) {
300657b55c76SYu Tu 		.offset = CLKCTRL_SAR_CLK_CTRL,
300757b55c76SYu Tu 		.mask = 0x3,
300857b55c76SYu Tu 		.shift = 9,
300957b55c76SYu Tu 	},
301057b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
301157b55c76SYu Tu 		.name = "saradc_mux",
301257b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
301357b55c76SYu Tu 		.parent_data = (const struct clk_parent_data []) {
301457b55c76SYu Tu 			{ .fw_name = "xtal", },
301557b55c76SYu Tu 			{ .hw = &s4_sys_clk.hw },
301657b55c76SYu Tu 		},
301757b55c76SYu Tu 		.num_parents = 2,
301857b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
301957b55c76SYu Tu 	},
302057b55c76SYu Tu };
302157b55c76SYu Tu 
302257b55c76SYu Tu static struct clk_regmap s4_saradc_div = {
302357b55c76SYu Tu 	.data = &(struct clk_regmap_div_data) {
302457b55c76SYu Tu 		.offset = CLKCTRL_SAR_CLK_CTRL,
302557b55c76SYu Tu 		.shift = 0,
302657b55c76SYu Tu 		.width = 8,
302757b55c76SYu Tu 	},
302857b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
302957b55c76SYu Tu 		.name = "saradc_div",
303057b55c76SYu Tu 		.ops = &clk_regmap_divider_ops,
303157b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
303257b55c76SYu Tu 			&s4_saradc_mux.hw
303357b55c76SYu Tu 		},
303457b55c76SYu Tu 		.num_parents = 1,
303557b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
303657b55c76SYu Tu 	},
303757b55c76SYu Tu };
303857b55c76SYu Tu 
303957b55c76SYu Tu static struct clk_regmap s4_saradc_gate = {
304057b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data) {
304157b55c76SYu Tu 		.offset = CLKCTRL_SAR_CLK_CTRL,
304257b55c76SYu Tu 		.bit_idx = 8,
304357b55c76SYu Tu 	},
304457b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
304557b55c76SYu Tu 		.name = "saradc_clk",
304657b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
304757b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
304857b55c76SYu Tu 			&s4_saradc_div.hw
304957b55c76SYu Tu 		},
305057b55c76SYu Tu 		.num_parents = 1,
305157b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
305257b55c76SYu Tu 	},
305357b55c76SYu Tu };
305457b55c76SYu Tu 
305557b55c76SYu Tu /*
305657b55c76SYu Tu  * gen clk is designed for debug/monitor some internal clock quality. Some of the
305757b55c76SYu Tu  * corresponding clock sources are not described in the clock tree and internal clock
305857b55c76SYu Tu  * for debug, so they are skipped.
305957b55c76SYu Tu  */
306057b55c76SYu Tu static u32 s4_gen_clk_mux_table[] = { 0, 4, 5, 7, 19, 21, 22,
306157b55c76SYu Tu 				      23, 24, 25, 26, 27, 28 };
306257b55c76SYu Tu static const struct clk_parent_data s4_gen_clk_parent_data[] = {
306357b55c76SYu Tu 	{ .fw_name = "xtal", },
306457b55c76SYu Tu 	{ .hw = &s4_vid_pll.hw },
306557b55c76SYu Tu 	{ .fw_name = "gp0_pll", },
306657b55c76SYu Tu 	{ .fw_name = "hifi_pll", },
306757b55c76SYu Tu 	{ .fw_name = "fclk_div2", },
306857b55c76SYu Tu 	{ .fw_name = "fclk_div3", },
306957b55c76SYu Tu 	{ .fw_name = "fclk_div4", },
307057b55c76SYu Tu 	{ .fw_name = "fclk_div5", },
307157b55c76SYu Tu 	{ .fw_name = "fclk_div7", },
307257b55c76SYu Tu 	{ .fw_name = "mpll0", },
307357b55c76SYu Tu 	{ .fw_name = "mpll1", },
307457b55c76SYu Tu 	{ .fw_name = "mpll2", },
307557b55c76SYu Tu 	{ .fw_name = "mpll3", },
307657b55c76SYu Tu };
307757b55c76SYu Tu 
307857b55c76SYu Tu static struct clk_regmap s4_gen_clk_sel = {
307957b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data){
308057b55c76SYu Tu 		.offset = CLKCTRL_GEN_CLK_CTRL,
308157b55c76SYu Tu 		.mask = 0x1f,
308257b55c76SYu Tu 		.shift = 12,
308357b55c76SYu Tu 		.table = s4_gen_clk_mux_table,
308457b55c76SYu Tu 	},
308557b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
308657b55c76SYu Tu 		.name = "gen_clk_sel",
308757b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
308857b55c76SYu Tu 		.parent_data = s4_gen_clk_parent_data,
308957b55c76SYu Tu 		.num_parents = ARRAY_SIZE(s4_gen_clk_parent_data),
309057b55c76SYu Tu 		/*
309157b55c76SYu Tu 		 *  Because the GEN clock can be connected to an external pad
309257b55c76SYu Tu 		 *  and may be set up directly from the device tree. Don't
309357b55c76SYu Tu 		 *  really want to automatically reparent.
309457b55c76SYu Tu 		 */
309557b55c76SYu Tu 		.flags = CLK_SET_RATE_NO_REPARENT,
309657b55c76SYu Tu 	},
309757b55c76SYu Tu };
309857b55c76SYu Tu 
309957b55c76SYu Tu static struct clk_regmap s4_gen_clk_div = {
310057b55c76SYu Tu 	.data = &(struct clk_regmap_div_data){
310157b55c76SYu Tu 		.offset = CLKCTRL_GEN_CLK_CTRL,
310257b55c76SYu Tu 		.shift = 0,
310357b55c76SYu Tu 		.width = 11,
310457b55c76SYu Tu 	},
310557b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
310657b55c76SYu Tu 		.name = "gen_clk_div",
310757b55c76SYu Tu 		.ops = &clk_regmap_divider_ops,
310857b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
310957b55c76SYu Tu 			&s4_gen_clk_sel.hw
311057b55c76SYu Tu 		},
311157b55c76SYu Tu 		.num_parents = 1,
311257b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
311357b55c76SYu Tu 	},
311457b55c76SYu Tu };
311557b55c76SYu Tu 
311657b55c76SYu Tu static struct clk_regmap s4_gen_clk = {
311757b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data){
311857b55c76SYu Tu 		.offset = CLKCTRL_GEN_CLK_CTRL,
311957b55c76SYu Tu 		.bit_idx = 11,
312057b55c76SYu Tu 	},
312157b55c76SYu Tu 	.hw.init = &(struct clk_init_data) {
312257b55c76SYu Tu 		.name = "gen_clk",
312357b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
312457b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
312557b55c76SYu Tu 			&s4_gen_clk_div.hw
312657b55c76SYu Tu 		},
312757b55c76SYu Tu 		.num_parents = 1,
312857b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
312957b55c76SYu Tu 	},
313057b55c76SYu Tu };
313157b55c76SYu Tu 
313257b55c76SYu Tu static const struct clk_parent_data s4_adc_extclk_in_parent_data[]  = {
313357b55c76SYu Tu 	{ .fw_name = "xtal", },
313457b55c76SYu Tu 	{ .fw_name = "fclk_div4", },
313557b55c76SYu Tu 	{ .fw_name = "fclk_div3", },
313657b55c76SYu Tu 	{ .fw_name = "fclk_div5", },
313757b55c76SYu Tu 	{ .fw_name = "fclk_div7", },
313857b55c76SYu Tu 	{ .fw_name = "mpll2", },
313957b55c76SYu Tu 	{ .fw_name = "gp0_pll", },
314057b55c76SYu Tu 	{ .fw_name = "hifi_pll", },
314157b55c76SYu Tu };
314257b55c76SYu Tu 
314357b55c76SYu Tu static struct clk_regmap s4_adc_extclk_in_mux = {
314457b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data) {
314557b55c76SYu Tu 		.offset = CLKCTRL_DEMOD_CLK_CTRL,
314657b55c76SYu Tu 		.mask = 0x7,
314757b55c76SYu Tu 		.shift = 25,
314857b55c76SYu Tu 	},
314957b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
315057b55c76SYu Tu 		.name = "adc_extclk_in_mux",
315157b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
315257b55c76SYu Tu 		.parent_data = s4_adc_extclk_in_parent_data,
315357b55c76SYu Tu 		.num_parents = ARRAY_SIZE(s4_adc_extclk_in_parent_data),
315457b55c76SYu Tu 		.flags = 0,
315557b55c76SYu Tu 	},
315657b55c76SYu Tu };
315757b55c76SYu Tu 
315857b55c76SYu Tu static struct clk_regmap s4_adc_extclk_in_div = {
315957b55c76SYu Tu 	.data = &(struct clk_regmap_div_data) {
316057b55c76SYu Tu 		.offset = CLKCTRL_DEMOD_CLK_CTRL,
316157b55c76SYu Tu 		.shift = 16,
316257b55c76SYu Tu 		.width = 7,
316357b55c76SYu Tu 	},
316457b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
316557b55c76SYu Tu 		.name = "adc_extclk_in_div",
316657b55c76SYu Tu 		.ops = &clk_regmap_divider_ops,
316757b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
316857b55c76SYu Tu 			&s4_adc_extclk_in_mux.hw
316957b55c76SYu Tu 		},
317057b55c76SYu Tu 		.num_parents = 1,
317157b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
317257b55c76SYu Tu 	},
317357b55c76SYu Tu };
317457b55c76SYu Tu 
317557b55c76SYu Tu static struct clk_regmap s4_adc_extclk_in_gate = {
317657b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data) {
317757b55c76SYu Tu 		.offset = CLKCTRL_DEMOD_CLK_CTRL,
317857b55c76SYu Tu 		.bit_idx = 24,
317957b55c76SYu Tu 	},
318057b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
318157b55c76SYu Tu 		.name = "adc_extclk_in",
318257b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
318357b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
318457b55c76SYu Tu 			&s4_adc_extclk_in_div.hw
318557b55c76SYu Tu 		},
318657b55c76SYu Tu 		.num_parents = 1,
318757b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
318857b55c76SYu Tu 	},
318957b55c76SYu Tu };
319057b55c76SYu Tu 
319157b55c76SYu Tu static struct clk_regmap s4_demod_core_clk_mux = {
319257b55c76SYu Tu 	.data = &(struct clk_regmap_mux_data) {
319357b55c76SYu Tu 		.offset = CLKCTRL_DEMOD_CLK_CTRL,
319457b55c76SYu Tu 		.mask = 0x3,
319557b55c76SYu Tu 		.shift = 9,
319657b55c76SYu Tu 	},
319757b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
319857b55c76SYu Tu 		.name = "demod_core_clk_mux",
319957b55c76SYu Tu 		.ops = &clk_regmap_mux_ops,
320057b55c76SYu Tu 		.parent_data = (const struct clk_parent_data []) {
320157b55c76SYu Tu 			{ .fw_name = "xtal", },
320257b55c76SYu Tu 			{ .fw_name = "fclk_div7", },
320357b55c76SYu Tu 			{ .fw_name = "fclk_div4", },
320457b55c76SYu Tu 			{ .hw = &s4_adc_extclk_in_gate.hw }
320557b55c76SYu Tu 		},
320657b55c76SYu Tu 		.num_parents = 4,
320757b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
320857b55c76SYu Tu 	},
320957b55c76SYu Tu };
321057b55c76SYu Tu 
321157b55c76SYu Tu static struct clk_regmap s4_demod_core_clk_div = {
321257b55c76SYu Tu 	.data = &(struct clk_regmap_div_data) {
321357b55c76SYu Tu 		.offset = CLKCTRL_DEMOD_CLK_CTRL,
321457b55c76SYu Tu 		.shift = 0,
321557b55c76SYu Tu 		.width = 7,
321657b55c76SYu Tu 	},
321757b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
321857b55c76SYu Tu 		.name = "demod_core_clk_div",
321957b55c76SYu Tu 		.ops = &clk_regmap_divider_ops,
322057b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
322157b55c76SYu Tu 			&s4_demod_core_clk_mux.hw
322257b55c76SYu Tu 		},
322357b55c76SYu Tu 		.num_parents = 1,
322457b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
322557b55c76SYu Tu 	},
322657b55c76SYu Tu };
322757b55c76SYu Tu 
322857b55c76SYu Tu static struct clk_regmap s4_demod_core_clk_gate = {
322957b55c76SYu Tu 	.data = &(struct clk_regmap_gate_data) {
323057b55c76SYu Tu 		.offset = CLKCTRL_DEMOD_CLK_CTRL,
323157b55c76SYu Tu 		.bit_idx = 8,
323257b55c76SYu Tu 	},
323357b55c76SYu Tu 	.hw.init = &(struct clk_init_data){
323457b55c76SYu Tu 		.name = "demod_core_clk",
323557b55c76SYu Tu 		.ops = &clk_regmap_gate_ops,
323657b55c76SYu Tu 		.parent_hws = (const struct clk_hw *[]) {
323757b55c76SYu Tu 			&s4_demod_core_clk_div.hw
323857b55c76SYu Tu 		},
323957b55c76SYu Tu 		.num_parents = 1,
324057b55c76SYu Tu 		.flags = CLK_SET_RATE_PARENT,
324157b55c76SYu Tu 	},
324257b55c76SYu Tu };
324357b55c76SYu Tu 
324457b55c76SYu Tu #define MESON_GATE(_name, _reg, _bit) \
324557b55c76SYu Tu 	MESON_PCLK(_name, _reg, _bit, &s4_sys_clk.hw)
324657b55c76SYu Tu 
324757b55c76SYu Tu static MESON_GATE(s4_ddr,		CLKCTRL_SYS_CLK_EN0_REG0, 0);
324857b55c76SYu Tu static MESON_GATE(s4_dos,		CLKCTRL_SYS_CLK_EN0_REG0, 1);
324957b55c76SYu Tu static MESON_GATE(s4_ethphy,		CLKCTRL_SYS_CLK_EN0_REG0, 4);
325057b55c76SYu Tu static MESON_GATE(s4_mali,		CLKCTRL_SYS_CLK_EN0_REG0, 6);
325157b55c76SYu Tu static MESON_GATE(s4_aocpu,		CLKCTRL_SYS_CLK_EN0_REG0, 13);
325257b55c76SYu Tu static MESON_GATE(s4_aucpu,		CLKCTRL_SYS_CLK_EN0_REG0, 14);
325357b55c76SYu Tu static MESON_GATE(s4_cec,		CLKCTRL_SYS_CLK_EN0_REG0, 16);
325457b55c76SYu Tu static MESON_GATE(s4_sdemmca,		CLKCTRL_SYS_CLK_EN0_REG0, 24);
325557b55c76SYu Tu static MESON_GATE(s4_sdemmcb,		CLKCTRL_SYS_CLK_EN0_REG0, 25);
325657b55c76SYu Tu static MESON_GATE(s4_nand,		CLKCTRL_SYS_CLK_EN0_REG0, 26);
325757b55c76SYu Tu static MESON_GATE(s4_smartcard,		CLKCTRL_SYS_CLK_EN0_REG0, 27);
325857b55c76SYu Tu static MESON_GATE(s4_acodec,		CLKCTRL_SYS_CLK_EN0_REG0, 28);
325957b55c76SYu Tu static MESON_GATE(s4_spifc,		CLKCTRL_SYS_CLK_EN0_REG0, 29);
326057b55c76SYu Tu static MESON_GATE(s4_msr_clk,		CLKCTRL_SYS_CLK_EN0_REG0, 30);
326157b55c76SYu Tu static MESON_GATE(s4_ir_ctrl,		CLKCTRL_SYS_CLK_EN0_REG0, 31);
326257b55c76SYu Tu static MESON_GATE(s4_audio,		CLKCTRL_SYS_CLK_EN0_REG1, 0);
326357b55c76SYu Tu static MESON_GATE(s4_eth,		CLKCTRL_SYS_CLK_EN0_REG1, 3);
326457b55c76SYu Tu static MESON_GATE(s4_uart_a,		CLKCTRL_SYS_CLK_EN0_REG1, 5);
326557b55c76SYu Tu static MESON_GATE(s4_uart_b,		CLKCTRL_SYS_CLK_EN0_REG1, 6);
326657b55c76SYu Tu static MESON_GATE(s4_uart_c,		CLKCTRL_SYS_CLK_EN0_REG1, 7);
326757b55c76SYu Tu static MESON_GATE(s4_uart_d,		CLKCTRL_SYS_CLK_EN0_REG1, 8);
326857b55c76SYu Tu static MESON_GATE(s4_uart_e,		CLKCTRL_SYS_CLK_EN0_REG1, 9);
326957b55c76SYu Tu static MESON_GATE(s4_aififo,		CLKCTRL_SYS_CLK_EN0_REG1, 11);
327057b55c76SYu Tu static MESON_GATE(s4_ts_ddr,		CLKCTRL_SYS_CLK_EN0_REG1, 15);
327157b55c76SYu Tu static MESON_GATE(s4_ts_pll,		CLKCTRL_SYS_CLK_EN0_REG1, 16);
327257b55c76SYu Tu static MESON_GATE(s4_g2d,		CLKCTRL_SYS_CLK_EN0_REG1, 20);
327357b55c76SYu Tu static MESON_GATE(s4_spicc0,		CLKCTRL_SYS_CLK_EN0_REG1, 21);
327457b55c76SYu Tu static MESON_GATE(s4_usb,		CLKCTRL_SYS_CLK_EN0_REG1, 26);
327557b55c76SYu Tu static MESON_GATE(s4_i2c_m_a,		CLKCTRL_SYS_CLK_EN0_REG1, 30);
327657b55c76SYu Tu static MESON_GATE(s4_i2c_m_b,		CLKCTRL_SYS_CLK_EN0_REG1, 31);
327757b55c76SYu Tu static MESON_GATE(s4_i2c_m_c,		CLKCTRL_SYS_CLK_EN0_REG2, 0);
327857b55c76SYu Tu static MESON_GATE(s4_i2c_m_d,		CLKCTRL_SYS_CLK_EN0_REG2, 1);
327957b55c76SYu Tu static MESON_GATE(s4_i2c_m_e,		CLKCTRL_SYS_CLK_EN0_REG2, 2);
328057b55c76SYu Tu static MESON_GATE(s4_hdmitx_apb,	CLKCTRL_SYS_CLK_EN0_REG2, 4);
328157b55c76SYu Tu static MESON_GATE(s4_i2c_s_a,		CLKCTRL_SYS_CLK_EN0_REG2, 5);
328257b55c76SYu Tu static MESON_GATE(s4_usb1_to_ddr,	CLKCTRL_SYS_CLK_EN0_REG2, 8);
328357b55c76SYu Tu static MESON_GATE(s4_hdcp22,		CLKCTRL_SYS_CLK_EN0_REG2, 10);
328457b55c76SYu Tu static MESON_GATE(s4_mmc_apb,		CLKCTRL_SYS_CLK_EN0_REG2, 11);
328557b55c76SYu Tu static MESON_GATE(s4_rsa,		CLKCTRL_SYS_CLK_EN0_REG2, 18);
328657b55c76SYu Tu static MESON_GATE(s4_cpu_debug,		CLKCTRL_SYS_CLK_EN0_REG2, 19);
328757b55c76SYu Tu static MESON_GATE(s4_vpu_intr,		CLKCTRL_SYS_CLK_EN0_REG2, 25);
328857b55c76SYu Tu static MESON_GATE(s4_demod,		CLKCTRL_SYS_CLK_EN0_REG2, 27);
328957b55c76SYu Tu static MESON_GATE(s4_sar_adc,		CLKCTRL_SYS_CLK_EN0_REG2, 28);
329057b55c76SYu Tu static MESON_GATE(s4_gic,		CLKCTRL_SYS_CLK_EN0_REG2, 30);
329157b55c76SYu Tu static MESON_GATE(s4_pwm_ab,		CLKCTRL_SYS_CLK_EN0_REG3, 7);
329257b55c76SYu Tu static MESON_GATE(s4_pwm_cd,		CLKCTRL_SYS_CLK_EN0_REG3, 8);
329357b55c76SYu Tu static MESON_GATE(s4_pwm_ef,		CLKCTRL_SYS_CLK_EN0_REG3, 9);
329457b55c76SYu Tu static MESON_GATE(s4_pwm_gh,		CLKCTRL_SYS_CLK_EN0_REG3, 10);
329557b55c76SYu Tu static MESON_GATE(s4_pwm_ij,		CLKCTRL_SYS_CLK_EN0_REG3, 11);
329657b55c76SYu Tu 
329757b55c76SYu Tu /* Array of all clocks provided by this provider */
329857b55c76SYu Tu static struct clk_hw *s4_periphs_hw_clks[] = {
329957b55c76SYu Tu 	[CLKID_RTC_32K_CLKIN]		= &s4_rtc_32k_by_oscin_clkin.hw,
330057b55c76SYu Tu 	[CLKID_RTC_32K_DIV]		= &s4_rtc_32k_by_oscin_div.hw,
330157b55c76SYu Tu 	[CLKID_RTC_32K_SEL]		= &s4_rtc_32k_by_oscin_sel.hw,
330257b55c76SYu Tu 	[CLKID_RTC_32K_XATL]		= &s4_rtc_32k_by_oscin.hw,
330357b55c76SYu Tu 	[CLKID_RTC]			= &s4_rtc_clk.hw,
330457b55c76SYu Tu 	[CLKID_SYS_CLK_B_SEL]		= &s4_sysclk_b_sel.hw,
330557b55c76SYu Tu 	[CLKID_SYS_CLK_B_DIV]		= &s4_sysclk_b_div.hw,
330657b55c76SYu Tu 	[CLKID_SYS_CLK_B]		= &s4_sysclk_b.hw,
330757b55c76SYu Tu 	[CLKID_SYS_CLK_A_SEL]		= &s4_sysclk_a_sel.hw,
330857b55c76SYu Tu 	[CLKID_SYS_CLK_A_DIV]		= &s4_sysclk_a_div.hw,
330957b55c76SYu Tu 	[CLKID_SYS_CLK_A]		= &s4_sysclk_a.hw,
331057b55c76SYu Tu 	[CLKID_SYS]			= &s4_sys_clk.hw,
331157b55c76SYu Tu 	[CLKID_CECA_32K_CLKIN]		= &s4_ceca_32k_clkin.hw,
331257b55c76SYu Tu 	[CLKID_CECA_32K_DIV]		= &s4_ceca_32k_div.hw,
331357b55c76SYu Tu 	[CLKID_CECA_32K_SEL_PRE]	= &s4_ceca_32k_sel_pre.hw,
331457b55c76SYu Tu 	[CLKID_CECA_32K_SEL]		= &s4_ceca_32k_sel.hw,
331557b55c76SYu Tu 	[CLKID_CECA_32K_CLKOUT]		= &s4_ceca_32k_clkout.hw,
331657b55c76SYu Tu 	[CLKID_CECB_32K_CLKIN]		= &s4_cecb_32k_clkin.hw,
331757b55c76SYu Tu 	[CLKID_CECB_32K_DIV]		= &s4_cecb_32k_div.hw,
331857b55c76SYu Tu 	[CLKID_CECB_32K_SEL_PRE]	= &s4_cecb_32k_sel_pre.hw,
331957b55c76SYu Tu 	[CLKID_CECB_32K_SEL]		= &s4_cecb_32k_sel.hw,
332057b55c76SYu Tu 	[CLKID_CECB_32K_CLKOUT]		= &s4_cecb_32k_clkout.hw,
332157b55c76SYu Tu 	[CLKID_SC_CLK_SEL]		= &s4_sc_clk_mux.hw,
332257b55c76SYu Tu 	[CLKID_SC_CLK_DIV]		= &s4_sc_clk_div.hw,
332357b55c76SYu Tu 	[CLKID_SC]			= &s4_sc_clk_gate.hw,
332457b55c76SYu Tu 	[CLKID_12_24M]			= &s4_12_24M_clk_gate.hw,
332557b55c76SYu Tu 	[CLKID_12M_CLK_DIV]		= &s4_12M_clk_div.hw,
332657b55c76SYu Tu 	[CLKID_12_24M_CLK_SEL]		= &s4_12_24M_clk.hw,
332757b55c76SYu Tu 	[CLKID_VID_PLL_DIV]		= &s4_vid_pll_div.hw,
332857b55c76SYu Tu 	[CLKID_VID_PLL_SEL]		= &s4_vid_pll_sel.hw,
332957b55c76SYu Tu 	[CLKID_VID_PLL]			= &s4_vid_pll.hw,
333057b55c76SYu Tu 	[CLKID_VCLK_SEL]		= &s4_vclk_sel.hw,
333157b55c76SYu Tu 	[CLKID_VCLK2_SEL]		= &s4_vclk2_sel.hw,
333257b55c76SYu Tu 	[CLKID_VCLK_INPUT]		= &s4_vclk_input.hw,
333357b55c76SYu Tu 	[CLKID_VCLK2_INPUT]		= &s4_vclk2_input.hw,
333457b55c76SYu Tu 	[CLKID_VCLK_DIV]		= &s4_vclk_div.hw,
333557b55c76SYu Tu 	[CLKID_VCLK2_DIV]		= &s4_vclk2_div.hw,
333657b55c76SYu Tu 	[CLKID_VCLK]			= &s4_vclk.hw,
333757b55c76SYu Tu 	[CLKID_VCLK2]			= &s4_vclk2.hw,
333857b55c76SYu Tu 	[CLKID_VCLK_DIV1]		= &s4_vclk_div1.hw,
333957b55c76SYu Tu 	[CLKID_VCLK_DIV2_EN]		= &s4_vclk_div2_en.hw,
334057b55c76SYu Tu 	[CLKID_VCLK_DIV4_EN]		= &s4_vclk_div4_en.hw,
334157b55c76SYu Tu 	[CLKID_VCLK_DIV6_EN]		= &s4_vclk_div6_en.hw,
334257b55c76SYu Tu 	[CLKID_VCLK_DIV12_EN]		= &s4_vclk_div12_en.hw,
334357b55c76SYu Tu 	[CLKID_VCLK2_DIV1]		= &s4_vclk2_div1.hw,
334457b55c76SYu Tu 	[CLKID_VCLK2_DIV2_EN]		= &s4_vclk2_div2_en.hw,
334557b55c76SYu Tu 	[CLKID_VCLK2_DIV4_EN]		= &s4_vclk2_div4_en.hw,
334657b55c76SYu Tu 	[CLKID_VCLK2_DIV6_EN]		= &s4_vclk2_div6_en.hw,
334757b55c76SYu Tu 	[CLKID_VCLK2_DIV12_EN]		= &s4_vclk2_div12_en.hw,
334857b55c76SYu Tu 	[CLKID_VCLK_DIV2]		= &s4_vclk_div2.hw,
334957b55c76SYu Tu 	[CLKID_VCLK_DIV4]		= &s4_vclk_div4.hw,
335057b55c76SYu Tu 	[CLKID_VCLK_DIV6]		= &s4_vclk_div6.hw,
335157b55c76SYu Tu 	[CLKID_VCLK_DIV12]		= &s4_vclk_div12.hw,
335257b55c76SYu Tu 	[CLKID_VCLK2_DIV2]		= &s4_vclk2_div2.hw,
335357b55c76SYu Tu 	[CLKID_VCLK2_DIV4]		= &s4_vclk2_div4.hw,
335457b55c76SYu Tu 	[CLKID_VCLK2_DIV6]		= &s4_vclk2_div6.hw,
335557b55c76SYu Tu 	[CLKID_VCLK2_DIV12]		= &s4_vclk2_div12.hw,
335657b55c76SYu Tu 	[CLKID_CTS_ENCI_SEL]		= &s4_cts_enci_sel.hw,
335757b55c76SYu Tu 	[CLKID_CTS_ENCP_SEL]		= &s4_cts_encp_sel.hw,
335857b55c76SYu Tu 	[CLKID_CTS_VDAC_SEL]		= &s4_cts_vdac_sel.hw,
335957b55c76SYu Tu 	[CLKID_HDMI_TX_SEL]		= &s4_hdmi_tx_sel.hw,
336057b55c76SYu Tu 	[CLKID_CTS_ENCI]		= &s4_cts_enci.hw,
336157b55c76SYu Tu 	[CLKID_CTS_ENCP]		= &s4_cts_encp.hw,
336257b55c76SYu Tu 	[CLKID_CTS_VDAC]		= &s4_cts_vdac.hw,
336357b55c76SYu Tu 	[CLKID_HDMI_TX]			= &s4_hdmi_tx.hw,
336457b55c76SYu Tu 	[CLKID_HDMI_SEL]		= &s4_hdmi_sel.hw,
336557b55c76SYu Tu 	[CLKID_HDMI_DIV]		= &s4_hdmi_div.hw,
336657b55c76SYu Tu 	[CLKID_HDMI]			= &s4_hdmi.hw,
336757b55c76SYu Tu 	[CLKID_TS_CLK_DIV]		= &s4_ts_clk_div.hw,
336857b55c76SYu Tu 	[CLKID_TS]			= &s4_ts_clk_gate.hw,
336957b55c76SYu Tu 	[CLKID_MALI_0_SEL]		= &s4_mali_0_sel.hw,
337057b55c76SYu Tu 	[CLKID_MALI_0_DIV]		= &s4_mali_0_div.hw,
337157b55c76SYu Tu 	[CLKID_MALI_0]			= &s4_mali_0.hw,
337257b55c76SYu Tu 	[CLKID_MALI_1_SEL]		= &s4_mali_1_sel.hw,
337357b55c76SYu Tu 	[CLKID_MALI_1_DIV]		= &s4_mali_1_div.hw,
337457b55c76SYu Tu 	[CLKID_MALI_1]			= &s4_mali_1.hw,
337557b55c76SYu Tu 	[CLKID_MALI_SEL]		= &s4_mali_mux.hw,
337657b55c76SYu Tu 	[CLKID_VDEC_P0_SEL]		= &s4_vdec_p0_mux.hw,
337757b55c76SYu Tu 	[CLKID_VDEC_P0_DIV]		= &s4_vdec_p0_div.hw,
337857b55c76SYu Tu 	[CLKID_VDEC_P0]			= &s4_vdec_p0.hw,
337957b55c76SYu Tu 	[CLKID_VDEC_P1_SEL]		= &s4_vdec_p1_mux.hw,
338057b55c76SYu Tu 	[CLKID_VDEC_P1_DIV]		= &s4_vdec_p1_div.hw,
338157b55c76SYu Tu 	[CLKID_VDEC_P1]			= &s4_vdec_p1.hw,
338257b55c76SYu Tu 	[CLKID_VDEC_SEL]		= &s4_vdec_mux.hw,
338357b55c76SYu Tu 	[CLKID_HEVCF_P0_SEL]		= &s4_hevcf_p0_mux.hw,
338457b55c76SYu Tu 	[CLKID_HEVCF_P0_DIV]		= &s4_hevcf_p0_div.hw,
338557b55c76SYu Tu 	[CLKID_HEVCF_P0]		= &s4_hevcf_p0.hw,
338657b55c76SYu Tu 	[CLKID_HEVCF_P1_SEL]		= &s4_hevcf_p1_mux.hw,
338757b55c76SYu Tu 	[CLKID_HEVCF_P1_DIV]		= &s4_hevcf_p1_div.hw,
338857b55c76SYu Tu 	[CLKID_HEVCF_P1]		= &s4_hevcf_p1.hw,
338957b55c76SYu Tu 	[CLKID_HEVCF_SEL]		= &s4_hevcf_mux.hw,
339057b55c76SYu Tu 	[CLKID_VPU_0_SEL]		= &s4_vpu_0_sel.hw,
339157b55c76SYu Tu 	[CLKID_VPU_0_DIV]		= &s4_vpu_0_div.hw,
339257b55c76SYu Tu 	[CLKID_VPU_0]			= &s4_vpu_0.hw,
339357b55c76SYu Tu 	[CLKID_VPU_1_SEL]		= &s4_vpu_1_sel.hw,
339457b55c76SYu Tu 	[CLKID_VPU_1_DIV]		= &s4_vpu_1_div.hw,
339557b55c76SYu Tu 	[CLKID_VPU_1]			= &s4_vpu_1.hw,
339657b55c76SYu Tu 	[CLKID_VPU]			= &s4_vpu.hw,
339757b55c76SYu Tu 	[CLKID_VPU_CLKB_TMP_SEL]	= &s4_vpu_clkb_tmp_mux.hw,
339857b55c76SYu Tu 	[CLKID_VPU_CLKB_TMP_DIV]	= &s4_vpu_clkb_tmp_div.hw,
339957b55c76SYu Tu 	[CLKID_VPU_CLKB_TMP]		= &s4_vpu_clkb_tmp.hw,
340057b55c76SYu Tu 	[CLKID_VPU_CLKB_DIV]		= &s4_vpu_clkb_div.hw,
340157b55c76SYu Tu 	[CLKID_VPU_CLKB]		= &s4_vpu_clkb.hw,
340257b55c76SYu Tu 	[CLKID_VPU_CLKC_P0_SEL]		= &s4_vpu_clkc_p0_mux.hw,
340357b55c76SYu Tu 	[CLKID_VPU_CLKC_P0_DIV]		= &s4_vpu_clkc_p0_div.hw,
340457b55c76SYu Tu 	[CLKID_VPU_CLKC_P0]		= &s4_vpu_clkc_p0.hw,
340557b55c76SYu Tu 	[CLKID_VPU_CLKC_P1_SEL]		= &s4_vpu_clkc_p1_mux.hw,
340657b55c76SYu Tu 	[CLKID_VPU_CLKC_P1_DIV]		= &s4_vpu_clkc_p1_div.hw,
340757b55c76SYu Tu 	[CLKID_VPU_CLKC_P1]		= &s4_vpu_clkc_p1.hw,
340857b55c76SYu Tu 	[CLKID_VPU_CLKC_SEL]		= &s4_vpu_clkc_mux.hw,
340957b55c76SYu Tu 	[CLKID_VAPB_0_SEL]		= &s4_vapb_0_sel.hw,
341057b55c76SYu Tu 	[CLKID_VAPB_0_DIV]		= &s4_vapb_0_div.hw,
341157b55c76SYu Tu 	[CLKID_VAPB_0]			= &s4_vapb_0.hw,
341257b55c76SYu Tu 	[CLKID_VAPB_1_SEL]		= &s4_vapb_1_sel.hw,
341357b55c76SYu Tu 	[CLKID_VAPB_1_DIV]		= &s4_vapb_1_div.hw,
341457b55c76SYu Tu 	[CLKID_VAPB_1]			= &s4_vapb_1.hw,
341557b55c76SYu Tu 	[CLKID_VAPB]			= &s4_vapb.hw,
341657b55c76SYu Tu 	[CLKID_GE2D]			= &s4_ge2d_gate.hw,
341757b55c76SYu Tu 	[CLKID_VDIN_MEAS_SEL]		= &s4_vdin_meas_mux.hw,
341857b55c76SYu Tu 	[CLKID_VDIN_MEAS_DIV]		= &s4_vdin_meas_div.hw,
341957b55c76SYu Tu 	[CLKID_VDIN_MEAS]		= &s4_vdin_meas_gate.hw,
342057b55c76SYu Tu 	[CLKID_SD_EMMC_C_CLK_SEL]	= &s4_sd_emmc_c_clk0_sel.hw,
342157b55c76SYu Tu 	[CLKID_SD_EMMC_C_CLK_DIV]	= &s4_sd_emmc_c_clk0_div.hw,
342257b55c76SYu Tu 	[CLKID_SD_EMMC_C]		= &s4_sd_emmc_c_clk0.hw,
342357b55c76SYu Tu 	[CLKID_SD_EMMC_A_CLK_SEL]	= &s4_sd_emmc_a_clk0_sel.hw,
342457b55c76SYu Tu 	[CLKID_SD_EMMC_A_CLK_DIV]	= &s4_sd_emmc_a_clk0_div.hw,
342557b55c76SYu Tu 	[CLKID_SD_EMMC_A]		= &s4_sd_emmc_a_clk0.hw,
342657b55c76SYu Tu 	[CLKID_SD_EMMC_B_CLK_SEL]	= &s4_sd_emmc_b_clk0_sel.hw,
342757b55c76SYu Tu 	[CLKID_SD_EMMC_B_CLK_DIV]	= &s4_sd_emmc_b_clk0_div.hw,
342857b55c76SYu Tu 	[CLKID_SD_EMMC_B]		= &s4_sd_emmc_b_clk0.hw,
342957b55c76SYu Tu 	[CLKID_SPICC0_SEL]		= &s4_spicc0_mux.hw,
343057b55c76SYu Tu 	[CLKID_SPICC0_DIV]		= &s4_spicc0_div.hw,
343157b55c76SYu Tu 	[CLKID_SPICC0_EN]		= &s4_spicc0_gate.hw,
343257b55c76SYu Tu 	[CLKID_PWM_A_SEL]		= &s4_pwm_a_mux.hw,
343357b55c76SYu Tu 	[CLKID_PWM_A_DIV]		= &s4_pwm_a_div.hw,
343457b55c76SYu Tu 	[CLKID_PWM_A]			= &s4_pwm_a_gate.hw,
343557b55c76SYu Tu 	[CLKID_PWM_B_SEL]		= &s4_pwm_b_mux.hw,
343657b55c76SYu Tu 	[CLKID_PWM_B_DIV]		= &s4_pwm_b_div.hw,
343757b55c76SYu Tu 	[CLKID_PWM_B]			= &s4_pwm_b_gate.hw,
343857b55c76SYu Tu 	[CLKID_PWM_C_SEL]		= &s4_pwm_c_mux.hw,
343957b55c76SYu Tu 	[CLKID_PWM_C_DIV]		= &s4_pwm_c_div.hw,
344057b55c76SYu Tu 	[CLKID_PWM_C]			= &s4_pwm_c_gate.hw,
344157b55c76SYu Tu 	[CLKID_PWM_D_SEL]		= &s4_pwm_d_mux.hw,
344257b55c76SYu Tu 	[CLKID_PWM_D_DIV]		= &s4_pwm_d_div.hw,
344357b55c76SYu Tu 	[CLKID_PWM_D]			= &s4_pwm_d_gate.hw,
344457b55c76SYu Tu 	[CLKID_PWM_E_SEL]		= &s4_pwm_e_mux.hw,
344557b55c76SYu Tu 	[CLKID_PWM_E_DIV]		= &s4_pwm_e_div.hw,
344657b55c76SYu Tu 	[CLKID_PWM_E]			= &s4_pwm_e_gate.hw,
344757b55c76SYu Tu 	[CLKID_PWM_F_SEL]		= &s4_pwm_f_mux.hw,
344857b55c76SYu Tu 	[CLKID_PWM_F_DIV]		= &s4_pwm_f_div.hw,
344957b55c76SYu Tu 	[CLKID_PWM_F]			= &s4_pwm_f_gate.hw,
345057b55c76SYu Tu 	[CLKID_PWM_G_SEL]		= &s4_pwm_g_mux.hw,
345157b55c76SYu Tu 	[CLKID_PWM_G_DIV]		= &s4_pwm_g_div.hw,
345257b55c76SYu Tu 	[CLKID_PWM_G]			= &s4_pwm_g_gate.hw,
345357b55c76SYu Tu 	[CLKID_PWM_H_SEL]		= &s4_pwm_h_mux.hw,
345457b55c76SYu Tu 	[CLKID_PWM_H_DIV]		= &s4_pwm_h_div.hw,
345557b55c76SYu Tu 	[CLKID_PWM_H]			= &s4_pwm_h_gate.hw,
345657b55c76SYu Tu 	[CLKID_PWM_I_SEL]		= &s4_pwm_i_mux.hw,
345757b55c76SYu Tu 	[CLKID_PWM_I_DIV]		= &s4_pwm_i_div.hw,
345857b55c76SYu Tu 	[CLKID_PWM_I]			= &s4_pwm_i_gate.hw,
345957b55c76SYu Tu 	[CLKID_PWM_J_SEL]		= &s4_pwm_j_mux.hw,
346057b55c76SYu Tu 	[CLKID_PWM_J_DIV]		= &s4_pwm_j_div.hw,
346157b55c76SYu Tu 	[CLKID_PWM_J]			= &s4_pwm_j_gate.hw,
346257b55c76SYu Tu 	[CLKID_SARADC_SEL]		= &s4_saradc_mux.hw,
346357b55c76SYu Tu 	[CLKID_SARADC_DIV]		= &s4_saradc_div.hw,
346457b55c76SYu Tu 	[CLKID_SARADC]			= &s4_saradc_gate.hw,
346557b55c76SYu Tu 	[CLKID_GEN_SEL]			= &s4_gen_clk_sel.hw,
346657b55c76SYu Tu 	[CLKID_GEN_DIV]			= &s4_gen_clk_div.hw,
346757b55c76SYu Tu 	[CLKID_GEN]			= &s4_gen_clk.hw,
346857b55c76SYu Tu 	[CLKID_DDR]			= &s4_ddr.hw,
346957b55c76SYu Tu 	[CLKID_DOS]			= &s4_dos.hw,
347057b55c76SYu Tu 	[CLKID_ETHPHY]			= &s4_ethphy.hw,
347157b55c76SYu Tu 	[CLKID_MALI]			= &s4_mali.hw,
347257b55c76SYu Tu 	[CLKID_AOCPU]			= &s4_aocpu.hw,
347357b55c76SYu Tu 	[CLKID_AUCPU]			= &s4_aucpu.hw,
347457b55c76SYu Tu 	[CLKID_CEC]			= &s4_cec.hw,
347557b55c76SYu Tu 	[CLKID_SDEMMC_A]		= &s4_sdemmca.hw,
347657b55c76SYu Tu 	[CLKID_SDEMMC_B]		= &s4_sdemmcb.hw,
347757b55c76SYu Tu 	[CLKID_NAND]			= &s4_nand.hw,
347857b55c76SYu Tu 	[CLKID_SMARTCARD]		= &s4_smartcard.hw,
347957b55c76SYu Tu 	[CLKID_ACODEC]			= &s4_acodec.hw,
348057b55c76SYu Tu 	[CLKID_SPIFC]			= &s4_spifc.hw,
348157b55c76SYu Tu 	[CLKID_MSR]			= &s4_msr_clk.hw,
348257b55c76SYu Tu 	[CLKID_IR_CTRL]			= &s4_ir_ctrl.hw,
348357b55c76SYu Tu 	[CLKID_AUDIO]			= &s4_audio.hw,
348457b55c76SYu Tu 	[CLKID_ETH]			= &s4_eth.hw,
348557b55c76SYu Tu 	[CLKID_UART_A]			= &s4_uart_a.hw,
348657b55c76SYu Tu 	[CLKID_UART_B]			= &s4_uart_b.hw,
348757b55c76SYu Tu 	[CLKID_UART_C]			= &s4_uart_c.hw,
348857b55c76SYu Tu 	[CLKID_UART_D]			= &s4_uart_d.hw,
348957b55c76SYu Tu 	[CLKID_UART_E]			= &s4_uart_e.hw,
349057b55c76SYu Tu 	[CLKID_AIFIFO]			= &s4_aififo.hw,
349157b55c76SYu Tu 	[CLKID_TS_DDR]			= &s4_ts_ddr.hw,
349257b55c76SYu Tu 	[CLKID_TS_PLL]			= &s4_ts_pll.hw,
349357b55c76SYu Tu 	[CLKID_G2D]			= &s4_g2d.hw,
349457b55c76SYu Tu 	[CLKID_SPICC0]			= &s4_spicc0.hw,
349557b55c76SYu Tu 	[CLKID_USB]			= &s4_usb.hw,
349657b55c76SYu Tu 	[CLKID_I2C_M_A]			= &s4_i2c_m_a.hw,
349757b55c76SYu Tu 	[CLKID_I2C_M_B]			= &s4_i2c_m_b.hw,
349857b55c76SYu Tu 	[CLKID_I2C_M_C]			= &s4_i2c_m_c.hw,
349957b55c76SYu Tu 	[CLKID_I2C_M_D]			= &s4_i2c_m_d.hw,
350057b55c76SYu Tu 	[CLKID_I2C_M_E]			= &s4_i2c_m_e.hw,
350157b55c76SYu Tu 	[CLKID_HDMITX_APB]		= &s4_hdmitx_apb.hw,
350257b55c76SYu Tu 	[CLKID_I2C_S_A]			= &s4_i2c_s_a.hw,
350357b55c76SYu Tu 	[CLKID_USB1_TO_DDR]		= &s4_usb1_to_ddr.hw,
350457b55c76SYu Tu 	[CLKID_HDCP22]			= &s4_hdcp22.hw,
350557b55c76SYu Tu 	[CLKID_MMC_APB]			= &s4_mmc_apb.hw,
350657b55c76SYu Tu 	[CLKID_RSA]			= &s4_rsa.hw,
350757b55c76SYu Tu 	[CLKID_CPU_DEBUG]		= &s4_cpu_debug.hw,
350857b55c76SYu Tu 	[CLKID_VPU_INTR]		= &s4_vpu_intr.hw,
350957b55c76SYu Tu 	[CLKID_DEMOD]			= &s4_demod.hw,
351057b55c76SYu Tu 	[CLKID_SAR_ADC]			= &s4_sar_adc.hw,
351157b55c76SYu Tu 	[CLKID_GIC]			= &s4_gic.hw,
351257b55c76SYu Tu 	[CLKID_PWM_AB]			= &s4_pwm_ab.hw,
351357b55c76SYu Tu 	[CLKID_PWM_CD]			= &s4_pwm_cd.hw,
351457b55c76SYu Tu 	[CLKID_PWM_EF]			= &s4_pwm_ef.hw,
351557b55c76SYu Tu 	[CLKID_PWM_GH]			= &s4_pwm_gh.hw,
351657b55c76SYu Tu 	[CLKID_PWM_IJ]			= &s4_pwm_ij.hw,
351757b55c76SYu Tu 	[CLKID_HDCP22_ESMCLK_SEL]	= &s4_hdcp22_esmclk_mux.hw,
351857b55c76SYu Tu 	[CLKID_HDCP22_ESMCLK_DIV]	= &s4_hdcp22_esmclk_div.hw,
351957b55c76SYu Tu 	[CLKID_HDCP22_ESMCLK]		= &s4_hdcp22_esmclk_gate.hw,
352057b55c76SYu Tu 	[CLKID_HDCP22_SKPCLK_SEL]	= &s4_hdcp22_skpclk_mux.hw,
352157b55c76SYu Tu 	[CLKID_HDCP22_SKPCLK_DIV]	= &s4_hdcp22_skpclk_div.hw,
352257b55c76SYu Tu 	[CLKID_HDCP22_SKPCLK]		= &s4_hdcp22_skpclk_gate.hw,
352357b55c76SYu Tu };
352457b55c76SYu Tu 
352557b55c76SYu Tu /* Convenience table to populate regmap in .probe */
352657b55c76SYu Tu static struct clk_regmap *const s4_periphs_clk_regmaps[] = {
352757b55c76SYu Tu 	&s4_rtc_32k_by_oscin_clkin,
352857b55c76SYu Tu 	&s4_rtc_32k_by_oscin_div,
352957b55c76SYu Tu 	&s4_rtc_32k_by_oscin_sel,
353057b55c76SYu Tu 	&s4_rtc_32k_by_oscin,
353157b55c76SYu Tu 	&s4_rtc_clk,
353257b55c76SYu Tu 	&s4_sysclk_b_sel,
353357b55c76SYu Tu 	&s4_sysclk_b_div,
353457b55c76SYu Tu 	&s4_sysclk_b,
353557b55c76SYu Tu 	&s4_sysclk_a_sel,
353657b55c76SYu Tu 	&s4_sysclk_a_div,
353757b55c76SYu Tu 	&s4_sysclk_a,
353857b55c76SYu Tu 	&s4_sys_clk,
353957b55c76SYu Tu 	&s4_ceca_32k_clkin,
354057b55c76SYu Tu 	&s4_ceca_32k_div,
354157b55c76SYu Tu 	&s4_ceca_32k_sel_pre,
354257b55c76SYu Tu 	&s4_ceca_32k_sel,
354357b55c76SYu Tu 	&s4_ceca_32k_clkout,
354457b55c76SYu Tu 	&s4_cecb_32k_clkin,
354557b55c76SYu Tu 	&s4_cecb_32k_div,
354657b55c76SYu Tu 	&s4_cecb_32k_sel_pre,
354757b55c76SYu Tu 	&s4_cecb_32k_sel,
354857b55c76SYu Tu 	&s4_cecb_32k_clkout,
354957b55c76SYu Tu 	&s4_sc_clk_mux,
355057b55c76SYu Tu 	&s4_sc_clk_div,
355157b55c76SYu Tu 	&s4_sc_clk_gate,
355257b55c76SYu Tu 	&s4_12_24M_clk_gate,
355357b55c76SYu Tu 	&s4_12_24M_clk,
355457b55c76SYu Tu 	&s4_vid_pll_div,
355557b55c76SYu Tu 	&s4_vid_pll_sel,
355657b55c76SYu Tu 	&s4_vid_pll,
355757b55c76SYu Tu 	&s4_vclk_sel,
355857b55c76SYu Tu 	&s4_vclk2_sel,
355957b55c76SYu Tu 	&s4_vclk_input,
356057b55c76SYu Tu 	&s4_vclk2_input,
356157b55c76SYu Tu 	&s4_vclk_div,
356257b55c76SYu Tu 	&s4_vclk2_div,
356357b55c76SYu Tu 	&s4_vclk,
356457b55c76SYu Tu 	&s4_vclk2,
356557b55c76SYu Tu 	&s4_vclk_div1,
356657b55c76SYu Tu 	&s4_vclk_div2_en,
356757b55c76SYu Tu 	&s4_vclk_div4_en,
356857b55c76SYu Tu 	&s4_vclk_div6_en,
356957b55c76SYu Tu 	&s4_vclk_div12_en,
357057b55c76SYu Tu 	&s4_vclk2_div1,
357157b55c76SYu Tu 	&s4_vclk2_div2_en,
357257b55c76SYu Tu 	&s4_vclk2_div4_en,
357357b55c76SYu Tu 	&s4_vclk2_div6_en,
357457b55c76SYu Tu 	&s4_vclk2_div12_en,
357557b55c76SYu Tu 	&s4_cts_enci_sel,
357657b55c76SYu Tu 	&s4_cts_encp_sel,
357757b55c76SYu Tu 	&s4_cts_vdac_sel,
357857b55c76SYu Tu 	&s4_hdmi_tx_sel,
357957b55c76SYu Tu 	&s4_cts_enci,
358057b55c76SYu Tu 	&s4_cts_encp,
358157b55c76SYu Tu 	&s4_cts_vdac,
358257b55c76SYu Tu 	&s4_hdmi_tx,
358357b55c76SYu Tu 	&s4_hdmi_sel,
358457b55c76SYu Tu 	&s4_hdmi_div,
358557b55c76SYu Tu 	&s4_hdmi,
358657b55c76SYu Tu 	&s4_ts_clk_div,
358757b55c76SYu Tu 	&s4_ts_clk_gate,
358857b55c76SYu Tu 	&s4_mali_0_sel,
358957b55c76SYu Tu 	&s4_mali_0_div,
359057b55c76SYu Tu 	&s4_mali_0,
359157b55c76SYu Tu 	&s4_mali_1_sel,
359257b55c76SYu Tu 	&s4_mali_1_div,
359357b55c76SYu Tu 	&s4_mali_1,
359457b55c76SYu Tu 	&s4_mali_mux,
359557b55c76SYu Tu 	&s4_vdec_p0_mux,
359657b55c76SYu Tu 	&s4_vdec_p0_div,
359757b55c76SYu Tu 	&s4_vdec_p0,
359857b55c76SYu Tu 	&s4_vdec_p1_mux,
359957b55c76SYu Tu 	&s4_vdec_p1_div,
360057b55c76SYu Tu 	&s4_vdec_p1,
360157b55c76SYu Tu 	&s4_vdec_mux,
360257b55c76SYu Tu 	&s4_hevcf_p0_mux,
360357b55c76SYu Tu 	&s4_hevcf_p0_div,
360457b55c76SYu Tu 	&s4_hevcf_p0,
360557b55c76SYu Tu 	&s4_hevcf_p1_mux,
360657b55c76SYu Tu 	&s4_hevcf_p1_div,
360757b55c76SYu Tu 	&s4_hevcf_p1,
360857b55c76SYu Tu 	&s4_hevcf_mux,
360957b55c76SYu Tu 	&s4_vpu_0_sel,
361057b55c76SYu Tu 	&s4_vpu_0_div,
361157b55c76SYu Tu 	&s4_vpu_0,
361257b55c76SYu Tu 	&s4_vpu_1_sel,
361357b55c76SYu Tu 	&s4_vpu_1_div,
361457b55c76SYu Tu 	&s4_vpu_1,
361557b55c76SYu Tu 	&s4_vpu,
361657b55c76SYu Tu 	&s4_vpu_clkb_tmp_mux,
361757b55c76SYu Tu 	&s4_vpu_clkb_tmp_div,
361857b55c76SYu Tu 	&s4_vpu_clkb_tmp,
361957b55c76SYu Tu 	&s4_vpu_clkb_div,
362057b55c76SYu Tu 	&s4_vpu_clkb,
362157b55c76SYu Tu 	&s4_vpu_clkc_p0_mux,
362257b55c76SYu Tu 	&s4_vpu_clkc_p0_div,
362357b55c76SYu Tu 	&s4_vpu_clkc_p0,
362457b55c76SYu Tu 	&s4_vpu_clkc_p1_mux,
362557b55c76SYu Tu 	&s4_vpu_clkc_p1_div,
362657b55c76SYu Tu 	&s4_vpu_clkc_p1,
362757b55c76SYu Tu 	&s4_vpu_clkc_mux,
362857b55c76SYu Tu 	&s4_vapb_0_sel,
362957b55c76SYu Tu 	&s4_vapb_0_div,
363057b55c76SYu Tu 	&s4_vapb_0,
363157b55c76SYu Tu 	&s4_vapb_1_sel,
363257b55c76SYu Tu 	&s4_vapb_1_div,
363357b55c76SYu Tu 	&s4_vapb_1,
363457b55c76SYu Tu 	&s4_vapb,
363557b55c76SYu Tu 	&s4_ge2d_gate,
363657b55c76SYu Tu 	&s4_hdcp22_esmclk_mux,
363757b55c76SYu Tu 	&s4_hdcp22_esmclk_div,
363857b55c76SYu Tu 	&s4_hdcp22_esmclk_gate,
363957b55c76SYu Tu 	&s4_hdcp22_skpclk_mux,
364057b55c76SYu Tu 	&s4_hdcp22_skpclk_div,
364157b55c76SYu Tu 	&s4_hdcp22_skpclk_gate,
364257b55c76SYu Tu 	&s4_vdin_meas_mux,
364357b55c76SYu Tu 	&s4_vdin_meas_div,
364457b55c76SYu Tu 	&s4_vdin_meas_gate,
364557b55c76SYu Tu 	&s4_sd_emmc_c_clk0_sel,
364657b55c76SYu Tu 	&s4_sd_emmc_c_clk0_div,
364757b55c76SYu Tu 	&s4_sd_emmc_c_clk0,
364857b55c76SYu Tu 	&s4_sd_emmc_a_clk0_sel,
364957b55c76SYu Tu 	&s4_sd_emmc_a_clk0_div,
365057b55c76SYu Tu 	&s4_sd_emmc_a_clk0,
365157b55c76SYu Tu 	&s4_sd_emmc_b_clk0_sel,
365257b55c76SYu Tu 	&s4_sd_emmc_b_clk0_div,
365357b55c76SYu Tu 	&s4_sd_emmc_b_clk0,
365457b55c76SYu Tu 	&s4_spicc0_mux,
365557b55c76SYu Tu 	&s4_spicc0_div,
365657b55c76SYu Tu 	&s4_spicc0_gate,
365757b55c76SYu Tu 	&s4_pwm_a_mux,
365857b55c76SYu Tu 	&s4_pwm_a_div,
365957b55c76SYu Tu 	&s4_pwm_a_gate,
366057b55c76SYu Tu 	&s4_pwm_b_mux,
366157b55c76SYu Tu 	&s4_pwm_b_div,
366257b55c76SYu Tu 	&s4_pwm_b_gate,
366357b55c76SYu Tu 	&s4_pwm_c_mux,
366457b55c76SYu Tu 	&s4_pwm_c_div,
366557b55c76SYu Tu 	&s4_pwm_c_gate,
366657b55c76SYu Tu 	&s4_pwm_d_mux,
366757b55c76SYu Tu 	&s4_pwm_d_div,
366857b55c76SYu Tu 	&s4_pwm_d_gate,
366957b55c76SYu Tu 	&s4_pwm_e_mux,
367057b55c76SYu Tu 	&s4_pwm_e_div,
367157b55c76SYu Tu 	&s4_pwm_e_gate,
367257b55c76SYu Tu 	&s4_pwm_f_mux,
367357b55c76SYu Tu 	&s4_pwm_f_div,
367457b55c76SYu Tu 	&s4_pwm_f_gate,
367557b55c76SYu Tu 	&s4_pwm_g_mux,
367657b55c76SYu Tu 	&s4_pwm_g_div,
367757b55c76SYu Tu 	&s4_pwm_g_gate,
367857b55c76SYu Tu 	&s4_pwm_h_mux,
367957b55c76SYu Tu 	&s4_pwm_h_div,
368057b55c76SYu Tu 	&s4_pwm_h_gate,
368157b55c76SYu Tu 	&s4_pwm_i_mux,
368257b55c76SYu Tu 	&s4_pwm_i_div,
368357b55c76SYu Tu 	&s4_pwm_i_gate,
368457b55c76SYu Tu 	&s4_pwm_j_mux,
368557b55c76SYu Tu 	&s4_pwm_j_div,
368657b55c76SYu Tu 	&s4_pwm_j_gate,
368757b55c76SYu Tu 	&s4_saradc_mux,
368857b55c76SYu Tu 	&s4_saradc_div,
368957b55c76SYu Tu 	&s4_saradc_gate,
369057b55c76SYu Tu 	&s4_gen_clk_sel,
369157b55c76SYu Tu 	&s4_gen_clk_div,
369257b55c76SYu Tu 	&s4_gen_clk,
369357b55c76SYu Tu 	&s4_ddr,
369457b55c76SYu Tu 	&s4_dos,
369557b55c76SYu Tu 	&s4_ethphy,
369657b55c76SYu Tu 	&s4_mali,
369757b55c76SYu Tu 	&s4_aocpu,
369857b55c76SYu Tu 	&s4_aucpu,
369957b55c76SYu Tu 	&s4_cec,
370057b55c76SYu Tu 	&s4_sdemmca,
370157b55c76SYu Tu 	&s4_sdemmcb,
370257b55c76SYu Tu 	&s4_nand,
370357b55c76SYu Tu 	&s4_smartcard,
370457b55c76SYu Tu 	&s4_acodec,
370557b55c76SYu Tu 	&s4_spifc,
370657b55c76SYu Tu 	&s4_msr_clk,
370757b55c76SYu Tu 	&s4_ir_ctrl,
370857b55c76SYu Tu 	&s4_audio,
370957b55c76SYu Tu 	&s4_eth,
371057b55c76SYu Tu 	&s4_uart_a,
371157b55c76SYu Tu 	&s4_uart_b,
371257b55c76SYu Tu 	&s4_uart_c,
371357b55c76SYu Tu 	&s4_uart_d,
371457b55c76SYu Tu 	&s4_uart_e,
371557b55c76SYu Tu 	&s4_aififo,
371657b55c76SYu Tu 	&s4_ts_ddr,
371757b55c76SYu Tu 	&s4_ts_pll,
371857b55c76SYu Tu 	&s4_g2d,
371957b55c76SYu Tu 	&s4_spicc0,
372057b55c76SYu Tu 	&s4_usb,
372157b55c76SYu Tu 	&s4_i2c_m_a,
372257b55c76SYu Tu 	&s4_i2c_m_b,
372357b55c76SYu Tu 	&s4_i2c_m_c,
372457b55c76SYu Tu 	&s4_i2c_m_d,
372557b55c76SYu Tu 	&s4_i2c_m_e,
372657b55c76SYu Tu 	&s4_hdmitx_apb,
372757b55c76SYu Tu 	&s4_i2c_s_a,
372857b55c76SYu Tu 	&s4_usb1_to_ddr,
372957b55c76SYu Tu 	&s4_hdcp22,
373057b55c76SYu Tu 	&s4_mmc_apb,
373157b55c76SYu Tu 	&s4_rsa,
373257b55c76SYu Tu 	&s4_cpu_debug,
373357b55c76SYu Tu 	&s4_vpu_intr,
373457b55c76SYu Tu 	&s4_demod,
373557b55c76SYu Tu 	&s4_sar_adc,
373657b55c76SYu Tu 	&s4_gic,
373757b55c76SYu Tu 	&s4_pwm_ab,
373857b55c76SYu Tu 	&s4_pwm_cd,
373957b55c76SYu Tu 	&s4_pwm_ef,
374057b55c76SYu Tu 	&s4_pwm_gh,
374157b55c76SYu Tu 	&s4_pwm_ij,
374257b55c76SYu Tu 	&s4_demod_core_clk_mux,
374357b55c76SYu Tu 	&s4_demod_core_clk_div,
374457b55c76SYu Tu 	&s4_demod_core_clk_gate,
374557b55c76SYu Tu 	&s4_adc_extclk_in_mux,
374657b55c76SYu Tu 	&s4_adc_extclk_in_div,
374757b55c76SYu Tu 	&s4_adc_extclk_in_gate,
374857b55c76SYu Tu };
374957b55c76SYu Tu 
375002cc1df9SJavier Carrasco static const struct regmap_config clkc_regmap_config = {
375157b55c76SYu Tu 	.reg_bits       = 32,
375257b55c76SYu Tu 	.val_bits       = 32,
375357b55c76SYu Tu 	.reg_stride     = 4,
375432fba1c1SDmitry Rokosov 	.max_register   = CLKCTRL_DEMOD_CLK_CTRL,
375557b55c76SYu Tu };
375657b55c76SYu Tu 
375757b55c76SYu Tu static struct meson_clk_hw_data s4_periphs_clks = {
375857b55c76SYu Tu 	.hws = s4_periphs_hw_clks,
375957b55c76SYu Tu 	.num = ARRAY_SIZE(s4_periphs_hw_clks),
376057b55c76SYu Tu };
376157b55c76SYu Tu 
meson_s4_periphs_probe(struct platform_device * pdev)376257b55c76SYu Tu static int meson_s4_periphs_probe(struct platform_device *pdev)
376357b55c76SYu Tu {
376457b55c76SYu Tu 	struct device *dev = &pdev->dev;
376557b55c76SYu Tu 	struct regmap *regmap;
376657b55c76SYu Tu 	void __iomem *base;
376757b55c76SYu Tu 	int ret, i;
376857b55c76SYu Tu 
376957b55c76SYu Tu 	base = devm_platform_ioremap_resource(pdev, 0);
377057b55c76SYu Tu 	if (IS_ERR(base))
377157b55c76SYu Tu 		return dev_err_probe(dev, PTR_ERR(base),
377257b55c76SYu Tu 				     "can't ioremap resource\n");
377357b55c76SYu Tu 
377457b55c76SYu Tu 	regmap = devm_regmap_init_mmio(dev, base, &clkc_regmap_config);
377557b55c76SYu Tu 	if (IS_ERR(regmap))
377657b55c76SYu Tu 		return dev_err_probe(dev, PTR_ERR(regmap),
377757b55c76SYu Tu 				     "can't init regmap mmio region\n");
377857b55c76SYu Tu 
377957b55c76SYu Tu 	/* Populate regmap for the regmap backed clocks */
378057b55c76SYu Tu 	for (i = 0; i < ARRAY_SIZE(s4_periphs_clk_regmaps); i++)
378157b55c76SYu Tu 		s4_periphs_clk_regmaps[i]->map = regmap;
378257b55c76SYu Tu 
378357b55c76SYu Tu 	for (i = 0; i < s4_periphs_clks.num; i++) {
378457b55c76SYu Tu 		/* array might be sparse */
378557b55c76SYu Tu 		if (!s4_periphs_clks.hws[i])
378657b55c76SYu Tu 			continue;
378757b55c76SYu Tu 
378857b55c76SYu Tu 		ret = devm_clk_hw_register(dev, s4_periphs_clks.hws[i]);
378957b55c76SYu Tu 		if (ret)
379057b55c76SYu Tu 			return dev_err_probe(dev, ret,
379157b55c76SYu Tu 					     "clock[%d] registration failed\n", i);
379257b55c76SYu Tu 	}
379357b55c76SYu Tu 
379457b55c76SYu Tu 	return devm_of_clk_add_hw_provider(dev, meson_clk_hw_get, &s4_periphs_clks);
379557b55c76SYu Tu }
379657b55c76SYu Tu 
379757b55c76SYu Tu static const struct of_device_id clkc_match_table[] = {
379857b55c76SYu Tu 	{
379957b55c76SYu Tu 		.compatible = "amlogic,s4-peripherals-clkc",
380057b55c76SYu Tu 	},
380157b55c76SYu Tu 	{}
380257b55c76SYu Tu };
380311981485SKrzysztof Kozlowski MODULE_DEVICE_TABLE(of, clkc_match_table);
380457b55c76SYu Tu 
380557b55c76SYu Tu static struct platform_driver s4_driver = {
380657b55c76SYu Tu 	.probe		= meson_s4_periphs_probe,
380757b55c76SYu Tu 	.driver		= {
380857b55c76SYu Tu 		.name	= "s4-periphs-clkc",
380957b55c76SYu Tu 		.of_match_table = clkc_match_table,
381057b55c76SYu Tu 	},
381157b55c76SYu Tu };
381257b55c76SYu Tu module_platform_driver(s4_driver);
3813befe8738SJerome Brunet 
3814befe8738SJerome Brunet MODULE_DESCRIPTION("Amlogic S4 Peripherals Clock Controller driver");
381557b55c76SYu Tu MODULE_AUTHOR("Yu Tu <yu.tu@amlogic.com>");
381657b55c76SYu Tu MODULE_LICENSE("GPL");
3817*adac147cSJerome Brunet MODULE_IMPORT_NS(CLK_MESON);
3818