Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
fork
Configure Feed
Select the types of activity you want to include in your feed.
1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * Amlogic C3 Peripherals Clock Controller Driver
4 *
5 * Copyright (c) 2023 Amlogic, inc.
6 * Author: Chuan Liu <chuan.liu@amlogic.com>
7 */
8
9#include <linux/clk-provider.h>
10#include <linux/platform_device.h>
11#include "clk-regmap.h"
12#include "clk-dualdiv.h"
13#include "meson-clkc-utils.h"
14#include <dt-bindings/clock/amlogic,c3-peripherals-clkc.h>
15
16#define RTC_BY_OSCIN_CTRL0 0x8
17#define RTC_BY_OSCIN_CTRL1 0xc
18#define RTC_CTRL 0x10
19#define SYS_CLK_EN0_REG0 0x44
20#define SYS_CLK_EN0_REG1 0x48
21#define SYS_CLK_EN0_REG2 0x4c
22#define CLK12_24_CTRL 0xa8
23#define AXI_CLK_EN0 0xac
24#define VDIN_MEAS_CLK_CTRL 0xf8
25#define VAPB_CLK_CTRL 0xfc
26#define MIPIDSI_PHY_CLK_CTRL 0x104
27#define GE2D_CLK_CTRL 0x10c
28#define ISP0_CLK_CTRL 0x110
29#define DEWARPA_CLK_CTRL 0x114
30#define VOUTENC_CLK_CTRL 0x118
31#define VDEC_CLK_CTRL 0x140
32#define VDEC3_CLK_CTRL 0x148
33#define TS_CLK_CTRL 0x158
34#define ETH_CLK_CTRL 0x164
35#define NAND_CLK_CTRL 0x168
36#define SD_EMMC_CLK_CTRL 0x16c
37#define SPICC_CLK_CTRL 0x174
38#define GEN_CLK_CTRL 0x178
39#define SAR_CLK_CTRL0 0x17c
40#define PWM_CLK_AB_CTRL 0x180
41#define PWM_CLK_CD_CTRL 0x184
42#define PWM_CLK_EF_CTRL 0x188
43#define PWM_CLK_GH_CTRL 0x18c
44#define PWM_CLK_IJ_CTRL 0x190
45#define PWM_CLK_KL_CTRL 0x194
46#define PWM_CLK_MN_CTRL 0x198
47#define VC9000E_CLK_CTRL 0x19c
48#define SPIFC_CLK_CTRL 0x1a0
49#define NNA_CLK_CTRL 0x220
50
51#define C3_COMP_SEL(_name, _reg, _shift, _mask, _pdata) \
52 MESON_COMP_SEL(c3_, _name, _reg, _shift, _mask, _pdata, NULL, 0, 0)
53
54#define C3_COMP_DIV(_name, _reg, _shift, _width) \
55 MESON_COMP_DIV(c3_, _name, _reg, _shift, _width, 0, CLK_SET_RATE_PARENT)
56
57#define C3_COMP_GATE(_name, _reg, _bit) \
58 MESON_COMP_GATE(c3_, _name, _reg, _bit, CLK_SET_RATE_PARENT)
59
60static struct clk_regmap c3_rtc_xtal_clkin = {
61 .data = &(struct clk_regmap_gate_data) {
62 .offset = RTC_BY_OSCIN_CTRL0,
63 .bit_idx = 31,
64 },
65 .hw.init = &(struct clk_init_data) {
66 .name = "rtc_xtal_clkin",
67 .ops = &clk_regmap_gate_ops,
68 .parent_data = &(const struct clk_parent_data) {
69 .fw_name = "oscin",
70 },
71 .num_parents = 1,
72 },
73};
74
75static const struct meson_clk_dualdiv_param c3_rtc_32k_div_table[] = {
76 { 733, 732, 8, 11, 1 },
77 { /* sentinel */ }
78};
79
80static struct clk_regmap c3_rtc_32k_div = {
81 .data = &(struct meson_clk_dualdiv_data) {
82 .n1 = {
83 .reg_off = RTC_BY_OSCIN_CTRL0,
84 .shift = 0,
85 .width = 12,
86 },
87 .n2 = {
88 .reg_off = RTC_BY_OSCIN_CTRL0,
89 .shift = 12,
90 .width = 12,
91 },
92 .m1 = {
93 .reg_off = RTC_BY_OSCIN_CTRL1,
94 .shift = 0,
95 .width = 12,
96 },
97 .m2 = {
98 .reg_off = RTC_BY_OSCIN_CTRL1,
99 .shift = 12,
100 .width = 12,
101 },
102 .dual = {
103 .reg_off = RTC_BY_OSCIN_CTRL0,
104 .shift = 28,
105 .width = 1,
106 },
107 .table = c3_rtc_32k_div_table,
108 },
109 .hw.init = &(struct clk_init_data) {
110 .name = "rtc_32k_div",
111 .ops = &meson_clk_dualdiv_ops,
112 .parent_hws = (const struct clk_hw *[]) {
113 &c3_rtc_xtal_clkin.hw
114 },
115 .num_parents = 1,
116 },
117};
118
119static const struct clk_parent_data c3_rtc_32k_parents[] = {
120 { .hw = &c3_rtc_32k_div.hw },
121 { .hw = &c3_rtc_xtal_clkin.hw }
122};
123
124static struct clk_regmap c3_rtc_32k_sel = {
125 .data = &(struct clk_regmap_mux_data) {
126 .offset = RTC_BY_OSCIN_CTRL1,
127 .mask = 0x1,
128 .shift = 24,
129 },
130 .hw.init = &(struct clk_init_data) {
131 .name = "rtc_32k_sel",
132 .ops = &clk_regmap_mux_ops,
133 .parent_data = c3_rtc_32k_parents,
134 .num_parents = ARRAY_SIZE(c3_rtc_32k_parents),
135 .flags = CLK_SET_RATE_PARENT,
136 },
137};
138
139static struct clk_regmap c3_rtc_32k = {
140 .data = &(struct clk_regmap_gate_data) {
141 .offset = RTC_BY_OSCIN_CTRL0,
142 .bit_idx = 30,
143 },
144 .hw.init = &(struct clk_init_data) {
145 .name = "rtc_32k",
146 .ops = &clk_regmap_gate_ops,
147 .parent_hws = (const struct clk_hw *[]) {
148 &c3_rtc_32k_sel.hw
149 },
150 .num_parents = 1,
151 .flags = CLK_SET_RATE_PARENT,
152 },
153};
154
155static const struct clk_parent_data c3_rtc_clk_parents[] = {
156 { .fw_name = "oscin" },
157 { .hw = &c3_rtc_32k.hw },
158 { .fw_name = "pad_osc" }
159};
160
161static struct clk_regmap c3_rtc_clk = {
162 .data = &(struct clk_regmap_mux_data) {
163 .offset = RTC_CTRL,
164 .mask = 0x3,
165 .shift = 0,
166 },
167 .hw.init = &(struct clk_init_data) {
168 .name = "rtc_clk",
169 .ops = &clk_regmap_mux_ops,
170 .parent_data = c3_rtc_clk_parents,
171 .num_parents = ARRAY_SIZE(c3_rtc_clk_parents),
172 .flags = CLK_SET_RATE_PARENT,
173 },
174};
175
176static const struct clk_parent_data c3_sys_pclk_parents = { .fw_name = "sysclk" };
177
178#define C3_SYS_PCLK(_name, _reg, _bit, _flags) \
179 MESON_PCLK(c3_##_name, _reg, _bit, &c3_sys_pclk_parents, _flags)
180
181#define C3_SYS_PCLK_RO(_name, _reg, _bit) \
182 MESON_PCLK_RO(c3_##_name, _reg, _bit, &c3_sys_pclk_parents, 0)
183
184static C3_SYS_PCLK(sys_reset_ctrl, SYS_CLK_EN0_REG0, 1, 0);
185static C3_SYS_PCLK(sys_pwr_ctrl, SYS_CLK_EN0_REG0, 3, 0);
186static C3_SYS_PCLK(sys_pad_ctrl, SYS_CLK_EN0_REG0, 4, 0);
187static C3_SYS_PCLK(sys_ctrl, SYS_CLK_EN0_REG0, 5, 0);
188static C3_SYS_PCLK(sys_ts_pll, SYS_CLK_EN0_REG0, 6, 0);
189
190/*
191 * NOTE: sys_dev_arb provides the clock to the ETH and SPICC arbiters that
192 * access the AXI bus.
193 */
194static C3_SYS_PCLK(sys_dev_arb, SYS_CLK_EN0_REG0, 7, 0);
195
196/*
197 * FIXME: sys_mmc_pclk provides the clock for the DDR PHY, DDR will only be
198 * initialized in bl2, and this clock should not be touched in linux.
199 */
200static C3_SYS_PCLK_RO(sys_mmc_pclk, SYS_CLK_EN0_REG0, 8);
201
202/*
203 * NOTE: sys_cpu_ctrl provides the clock for CPU controller. After clock is
204 * disabled, cpu_clk and other key CPU-related configurations cannot take effect.
205 */
206static C3_SYS_PCLK(sys_cpu_ctrl, SYS_CLK_EN0_REG0, 11, CLK_IS_CRITICAL);
207static C3_SYS_PCLK(sys_jtag_ctrl, SYS_CLK_EN0_REG0, 12, 0);
208static C3_SYS_PCLK(sys_ir_ctrl, SYS_CLK_EN0_REG0, 13, 0);
209
210/*
211 * NOTE: sys_irq_ctrl provides the clock for IRQ controller. The IRQ controller
212 * collects and distributes the interrupt signal to the GIC, PWR_CTRL, and
213 * AOCPU. If the clock is disabled, interrupt-related functions will occurs an
214 * exception.
215 */
216static C3_SYS_PCLK(sys_irq_ctrl, SYS_CLK_EN0_REG0, 14, CLK_IS_CRITICAL);
217static C3_SYS_PCLK(sys_msr_clk, SYS_CLK_EN0_REG0, 15, 0);
218static C3_SYS_PCLK(sys_rom, SYS_CLK_EN0_REG0, 16, 0);
219static C3_SYS_PCLK(sys_uart_f, SYS_CLK_EN0_REG0, 17, 0);
220static C3_SYS_PCLK(sys_cpu_apb, SYS_CLK_EN0_REG0, 18, 0);
221static C3_SYS_PCLK(sys_rsa, SYS_CLK_EN0_REG0, 19, 0);
222static C3_SYS_PCLK(sys_sar_adc, SYS_CLK_EN0_REG0, 20, 0);
223static C3_SYS_PCLK(sys_startup, SYS_CLK_EN0_REG0, 21, 0);
224static C3_SYS_PCLK(sys_secure, SYS_CLK_EN0_REG0, 22, 0);
225static C3_SYS_PCLK(sys_spifc, SYS_CLK_EN0_REG0, 23, 0);
226static C3_SYS_PCLK(sys_nna, SYS_CLK_EN0_REG0, 25, 0);
227static C3_SYS_PCLK(sys_eth_mac, SYS_CLK_EN0_REG0, 26, 0);
228
229/*
230 * FIXME: sys_gic provides the clock for GIC(Generic Interrupt Controller).
231 * After clock is disabled, The GIC cannot work properly. At present, the driver
232 * used by our GIC is the public driver in kernel, and there is no management
233 * clock in the driver.
234 */
235static C3_SYS_PCLK(sys_gic, SYS_CLK_EN0_REG0, 27, CLK_IS_CRITICAL);
236static C3_SYS_PCLK(sys_rama, SYS_CLK_EN0_REG0, 28, 0);
237
238/*
239 * NOTE: sys_big_nic provides the clock to the control bus of the NIC(Network
240 * Interface Controller) between multiple devices(CPU, DDR, RAM, ROM, GIC,
241 * SPIFC, CAPU, JTAG, EMMC, SDIO, sec_top, USB, Audio, ETH, SPICC) in the
242 * system. After clock is disabled, The NIC cannot work.
243 */
244static C3_SYS_PCLK(sys_big_nic, SYS_CLK_EN0_REG0, 29, CLK_IS_CRITICAL);
245static C3_SYS_PCLK(sys_ramb, SYS_CLK_EN0_REG0, 30, 0);
246static C3_SYS_PCLK(sys_audio_pclk, SYS_CLK_EN0_REG0, 31, 0);
247static C3_SYS_PCLK(sys_pwm_kl, SYS_CLK_EN0_REG1, 0, 0);
248static C3_SYS_PCLK(sys_pwm_ij, SYS_CLK_EN0_REG1, 1, 0);
249static C3_SYS_PCLK(sys_usb, SYS_CLK_EN0_REG1, 2, 0);
250static C3_SYS_PCLK(sys_sd_emmc_a, SYS_CLK_EN0_REG1, 3, 0);
251static C3_SYS_PCLK(sys_sd_emmc_c, SYS_CLK_EN0_REG1, 4, 0);
252static C3_SYS_PCLK(sys_pwm_ab, SYS_CLK_EN0_REG1, 5, 0);
253static C3_SYS_PCLK(sys_pwm_cd, SYS_CLK_EN0_REG1, 6, 0);
254static C3_SYS_PCLK(sys_pwm_ef, SYS_CLK_EN0_REG1, 7, 0);
255static C3_SYS_PCLK(sys_pwm_gh, SYS_CLK_EN0_REG1, 8, 0);
256static C3_SYS_PCLK(sys_spicc_1, SYS_CLK_EN0_REG1, 9, 0);
257static C3_SYS_PCLK(sys_spicc_0, SYS_CLK_EN0_REG1, 10, 0);
258static C3_SYS_PCLK(sys_uart_a, SYS_CLK_EN0_REG1, 11, 0);
259static C3_SYS_PCLK(sys_uart_b, SYS_CLK_EN0_REG1, 12, 0);
260static C3_SYS_PCLK(sys_uart_c, SYS_CLK_EN0_REG1, 13, 0);
261static C3_SYS_PCLK(sys_uart_d, SYS_CLK_EN0_REG1, 14, 0);
262static C3_SYS_PCLK(sys_uart_e, SYS_CLK_EN0_REG1, 15, 0);
263static C3_SYS_PCLK(sys_i2c_m_a, SYS_CLK_EN0_REG1, 16, 0);
264static C3_SYS_PCLK(sys_i2c_m_b, SYS_CLK_EN0_REG1, 17, 0);
265static C3_SYS_PCLK(sys_i2c_m_c, SYS_CLK_EN0_REG1, 18, 0);
266static C3_SYS_PCLK(sys_i2c_m_d, SYS_CLK_EN0_REG1, 19, 0);
267static C3_SYS_PCLK(sys_i2c_s_a, SYS_CLK_EN0_REG1, 20, 0);
268static C3_SYS_PCLK(sys_rtc, SYS_CLK_EN0_REG1, 21, 0);
269static C3_SYS_PCLK(sys_ge2d, SYS_CLK_EN0_REG1, 22, 0);
270static C3_SYS_PCLK(sys_isp, SYS_CLK_EN0_REG1, 23, 0);
271static C3_SYS_PCLK(sys_gpv_isp_nic, SYS_CLK_EN0_REG1, 24, 0);
272static C3_SYS_PCLK(sys_gpv_cve_nic, SYS_CLK_EN0_REG1, 25, 0);
273static C3_SYS_PCLK(sys_mipi_dsi_host, SYS_CLK_EN0_REG1, 26, 0);
274static C3_SYS_PCLK(sys_mipi_dsi_phy, SYS_CLK_EN0_REG1, 27, 0);
275static C3_SYS_PCLK(sys_eth_phy, SYS_CLK_EN0_REG1, 28, 0);
276static C3_SYS_PCLK(sys_acodec, SYS_CLK_EN0_REG1, 29, 0);
277static C3_SYS_PCLK(sys_dwap, SYS_CLK_EN0_REG1, 30, 0);
278static C3_SYS_PCLK(sys_dos, SYS_CLK_EN0_REG1, 31, 0);
279static C3_SYS_PCLK(sys_cve, SYS_CLK_EN0_REG2, 0, 0);
280static C3_SYS_PCLK(sys_vout, SYS_CLK_EN0_REG2, 1, 0);
281static C3_SYS_PCLK(sys_vc9000e, SYS_CLK_EN0_REG2, 2, 0);
282static C3_SYS_PCLK(sys_pwm_mn, SYS_CLK_EN0_REG2, 3, 0);
283static C3_SYS_PCLK(sys_sd_emmc_b, SYS_CLK_EN0_REG2, 4, 0);
284
285static const struct clk_parent_data c3_axi_pclk_parents = { .fw_name = "axiclk" };
286
287#define C3_AXI_PCLK(_name, _reg, _bit, _flags) \
288 MESON_PCLK(c3_##_name, _reg, _bit, &c3_axi_pclk_parents, _flags)
289
290/*
291 * NOTE: axi_sys_nic provides the clock to the AXI bus of the system NIC. After
292 * clock is disabled, The NIC cannot work.
293 */
294static C3_AXI_PCLK(axi_sys_nic, AXI_CLK_EN0, 2, CLK_IS_CRITICAL);
295static C3_AXI_PCLK(axi_isp_nic, AXI_CLK_EN0, 3, 0);
296static C3_AXI_PCLK(axi_cve_nic, AXI_CLK_EN0, 4, 0);
297static C3_AXI_PCLK(axi_ramb, AXI_CLK_EN0, 5, 0);
298static C3_AXI_PCLK(axi_rama, AXI_CLK_EN0, 6, 0);
299
300/*
301 * NOTE: axi_cpu_dmc provides the clock to the AXI bus where the CPU accesses
302 * the DDR. After clock is disabled, The CPU will not have access to the DDR.
303 */
304static C3_AXI_PCLK(axi_cpu_dmc, AXI_CLK_EN0, 7, CLK_IS_CRITICAL);
305static C3_AXI_PCLK(axi_nic, AXI_CLK_EN0, 8, 0);
306static C3_AXI_PCLK(axi_dma, AXI_CLK_EN0, 9, 0);
307
308/*
309 * NOTE: axi_mux_nic provides the clock to the NIC's AXI bus for NN(Neural
310 * Network) and other devices(CPU, EMMC, SDIO, sec_top, USB, Audio, ETH, SPICC)
311 * to access RAM space.
312 */
313static C3_AXI_PCLK(axi_mux_nic, AXI_CLK_EN0, 10, 0);
314static C3_AXI_PCLK(axi_cve, AXI_CLK_EN0, 12, 0);
315
316/*
317 * NOTE: axi_dev1_dmc provides the clock for the peripherals(EMMC, SDIO,
318 * sec_top, USB, Audio, ETH, SPICC) to access the AXI bus of the DDR.
319 */
320static C3_AXI_PCLK(axi_dev1_dmc, AXI_CLK_EN0, 13, 0);
321static C3_AXI_PCLK(axi_dev0_dmc, AXI_CLK_EN0, 14, 0);
322static C3_AXI_PCLK(axi_dsp_dmc, AXI_CLK_EN0, 15, 0);
323
324/*
325 * clk_12_24m model
326 *
327 * |------| |-----| clk_12m_24m |-----|
328 * xtal---->| gate |---->| div |------------>| pad |
329 * |------| |-----| |-----|
330 */
331static struct clk_regmap c3_clk_12_24m_in = {
332 .data = &(struct clk_regmap_gate_data) {
333 .offset = CLK12_24_CTRL,
334 .bit_idx = 11,
335 },
336 .hw.init = &(struct clk_init_data) {
337 .name = "clk_12_24m_in",
338 .ops = &clk_regmap_gate_ops,
339 .parent_data = &(const struct clk_parent_data) {
340 .fw_name = "xtal_24m",
341 },
342 .num_parents = 1,
343 },
344};
345
346static struct clk_regmap c3_clk_12_24m = {
347 .data = &(struct clk_regmap_div_data) {
348 .offset = CLK12_24_CTRL,
349 .shift = 10,
350 .width = 1,
351 },
352 .hw.init = &(struct clk_init_data) {
353 .name = "clk_12_24m",
354 .ops = &clk_regmap_divider_ops,
355 .parent_hws = (const struct clk_hw *[]) {
356 &c3_clk_12_24m_in.hw
357 },
358 .num_parents = 1,
359 },
360};
361
362/* Fix me: set value 0 will div by 2 like value 1 */
363static struct clk_regmap c3_fclk_25m_div = {
364 .data = &(struct clk_regmap_div_data) {
365 .offset = CLK12_24_CTRL,
366 .shift = 0,
367 .width = 8,
368 },
369 .hw.init = &(struct clk_init_data) {
370 .name = "fclk_25m_div",
371 .ops = &clk_regmap_divider_ops,
372 .parent_data = &(const struct clk_parent_data) {
373 .fw_name = "fix",
374 },
375 .num_parents = 1,
376 },
377};
378
379static struct clk_regmap c3_fclk_25m = {
380 .data = &(struct clk_regmap_gate_data) {
381 .offset = CLK12_24_CTRL,
382 .bit_idx = 12,
383 },
384 .hw.init = &(struct clk_init_data) {
385 .name = "fclk_25m",
386 .ops = &clk_regmap_gate_ops,
387 .parent_hws = (const struct clk_hw *[]) {
388 &c3_fclk_25m_div.hw
389 },
390 .num_parents = 1,
391 .flags = CLK_SET_RATE_PARENT,
392 },
393};
394
395/*
396 * Channel 3(ddr_dpll_pt_clk) is manged by the DDR module; channel 12(cts_msr_clk)
397 * is manged by clock measures module. Their hardware are out of clock tree.
398 * Channel 4 8 9 10 11 13 14 15 16 18 are not connected.
399 */
400static u32 c3_gen_parents_val_table[] = { 0, 1, 2, 5, 6, 7, 17, 19, 20, 21, 22, 23, 24};
401static const struct clk_parent_data c3_gen_parents[] = {
402 { .fw_name = "oscin" },
403 { .hw = &c3_rtc_clk.hw },
404 { .fw_name = "sysplldiv16" },
405 { .fw_name = "gp0" },
406 { .fw_name = "gp1" },
407 { .fw_name = "hifi" },
408 { .fw_name = "cpudiv16" },
409 { .fw_name = "fdiv2" },
410 { .fw_name = "fdiv2p5" },
411 { .fw_name = "fdiv3" },
412 { .fw_name = "fdiv4" },
413 { .fw_name = "fdiv5" },
414 { .fw_name = "fdiv7" }
415};
416
417static struct clk_regmap c3_gen_sel = {
418 .data = &(struct clk_regmap_mux_data) {
419 .offset = GEN_CLK_CTRL,
420 .mask = 0x1f,
421 .shift = 12,
422 .table = c3_gen_parents_val_table,
423 },
424 .hw.init = &(struct clk_init_data) {
425 .name = "gen_sel",
426 .ops = &clk_regmap_mux_ops,
427 .parent_data = c3_gen_parents,
428 .num_parents = ARRAY_SIZE(c3_gen_parents),
429 },
430};
431
432static struct clk_regmap c3_gen_div = {
433 .data = &(struct clk_regmap_div_data) {
434 .offset = GEN_CLK_CTRL,
435 .shift = 0,
436 .width = 11,
437 },
438 .hw.init = &(struct clk_init_data) {
439 .name = "gen_div",
440 .ops = &clk_regmap_divider_ops,
441 .parent_hws = (const struct clk_hw *[]) {
442 &c3_gen_sel.hw
443 },
444 .num_parents = 1,
445 .flags = CLK_SET_RATE_PARENT,
446 },
447};
448
449static struct clk_regmap c3_gen = {
450 .data = &(struct clk_regmap_gate_data) {
451 .offset = GEN_CLK_CTRL,
452 .bit_idx = 11,
453 },
454 .hw.init = &(struct clk_init_data) {
455 .name = "gen",
456 .ops = &clk_regmap_gate_ops,
457 .parent_hws = (const struct clk_hw *[]) {
458 &c3_gen_div.hw
459 },
460 .num_parents = 1,
461 .flags = CLK_SET_RATE_PARENT,
462 },
463};
464
465static const struct clk_parent_data c3_saradc_parents[] = {
466 { .fw_name = "oscin" },
467 { .fw_name = "sysclk" }
468};
469
470static C3_COMP_SEL(saradc, SAR_CLK_CTRL0, 9, 0x1, c3_saradc_parents);
471static C3_COMP_DIV(saradc, SAR_CLK_CTRL0, 0, 8);
472static C3_COMP_GATE(saradc, SAR_CLK_CTRL0, 8);
473
474static const struct clk_parent_data c3_pwm_parents[] = {
475 { .fw_name = "oscin" },
476 { .fw_name = "gp1" },
477 { .fw_name = "fdiv4" },
478 { .fw_name = "fdiv3" }
479};
480
481static C3_COMP_SEL(pwm_a, PWM_CLK_AB_CTRL, 9, 0x3, c3_pwm_parents);
482static C3_COMP_DIV(pwm_a, PWM_CLK_AB_CTRL, 0, 8);
483static C3_COMP_GATE(pwm_a, PWM_CLK_AB_CTRL, 8);
484
485static C3_COMP_SEL(pwm_b, PWM_CLK_AB_CTRL, 25, 0x3, c3_pwm_parents);
486static C3_COMP_DIV(pwm_b, PWM_CLK_AB_CTRL, 16, 8);
487static C3_COMP_GATE(pwm_b, PWM_CLK_AB_CTRL, 24);
488
489static C3_COMP_SEL(pwm_c, PWM_CLK_CD_CTRL, 9, 0x3, c3_pwm_parents);
490static C3_COMP_DIV(pwm_c, PWM_CLK_CD_CTRL, 0, 8);
491static C3_COMP_GATE(pwm_c, PWM_CLK_CD_CTRL, 8);
492
493static C3_COMP_SEL(pwm_d, PWM_CLK_CD_CTRL, 25, 0x3, c3_pwm_parents);
494static C3_COMP_DIV(pwm_d, PWM_CLK_CD_CTRL, 16, 8);
495static C3_COMP_GATE(pwm_d, PWM_CLK_CD_CTRL, 24);
496
497static C3_COMP_SEL(pwm_e, PWM_CLK_EF_CTRL, 9, 0x3, c3_pwm_parents);
498static C3_COMP_DIV(pwm_e, PWM_CLK_EF_CTRL, 0, 8);
499static C3_COMP_GATE(pwm_e, PWM_CLK_EF_CTRL, 8);
500
501static C3_COMP_SEL(pwm_f, PWM_CLK_EF_CTRL, 25, 0x3, c3_pwm_parents);
502static C3_COMP_DIV(pwm_f, PWM_CLK_EF_CTRL, 16, 8);
503static C3_COMP_GATE(pwm_f, PWM_CLK_EF_CTRL, 24);
504
505static C3_COMP_SEL(pwm_g, PWM_CLK_GH_CTRL, 9, 0x3, c3_pwm_parents);
506static C3_COMP_DIV(pwm_g, PWM_CLK_GH_CTRL, 0, 8);
507static C3_COMP_GATE(pwm_g, PWM_CLK_GH_CTRL, 8);
508
509static C3_COMP_SEL(pwm_h, PWM_CLK_GH_CTRL, 25, 0x3, c3_pwm_parents);
510static C3_COMP_DIV(pwm_h, PWM_CLK_GH_CTRL, 16, 8);
511static C3_COMP_GATE(pwm_h, PWM_CLK_GH_CTRL, 24);
512
513static C3_COMP_SEL(pwm_i, PWM_CLK_IJ_CTRL, 9, 0x3, c3_pwm_parents);
514static C3_COMP_DIV(pwm_i, PWM_CLK_IJ_CTRL, 0, 8);
515static C3_COMP_GATE(pwm_i, PWM_CLK_IJ_CTRL, 8);
516
517static C3_COMP_SEL(pwm_j, PWM_CLK_IJ_CTRL, 25, 0x3, c3_pwm_parents);
518static C3_COMP_DIV(pwm_j, PWM_CLK_IJ_CTRL, 16, 8);
519static C3_COMP_GATE(pwm_j, PWM_CLK_IJ_CTRL, 24);
520
521static C3_COMP_SEL(pwm_k, PWM_CLK_KL_CTRL, 9, 0x3, c3_pwm_parents);
522static C3_COMP_DIV(pwm_k, PWM_CLK_KL_CTRL, 0, 8);
523static C3_COMP_GATE(pwm_k, PWM_CLK_KL_CTRL, 8);
524
525static C3_COMP_SEL(pwm_l, PWM_CLK_KL_CTRL, 25, 0x3, c3_pwm_parents);
526static C3_COMP_DIV(pwm_l, PWM_CLK_KL_CTRL, 16, 8);
527static C3_COMP_GATE(pwm_l, PWM_CLK_KL_CTRL, 24);
528
529static C3_COMP_SEL(pwm_m, PWM_CLK_MN_CTRL, 9, 0x3, c3_pwm_parents);
530static C3_COMP_DIV(pwm_m, PWM_CLK_MN_CTRL, 0, 8);
531static C3_COMP_GATE(pwm_m, PWM_CLK_MN_CTRL, 8);
532
533static C3_COMP_SEL(pwm_n, PWM_CLK_MN_CTRL, 25, 0x3, c3_pwm_parents);
534static C3_COMP_DIV(pwm_n, PWM_CLK_MN_CTRL, 16, 8);
535static C3_COMP_GATE(pwm_n, PWM_CLK_MN_CTRL, 24);
536
537static const struct clk_parent_data c3_spicc_parents[] = {
538 { .fw_name = "oscin" },
539 { .fw_name = "sysclk" },
540 { .fw_name = "fdiv4" },
541 { .fw_name = "fdiv3" },
542 { .fw_name = "fdiv2" },
543 { .fw_name = "fdiv5" },
544 { .fw_name = "fdiv7" },
545 { .fw_name = "gp1" }
546};
547
548static C3_COMP_SEL(spicc_a, SPICC_CLK_CTRL, 7, 0x7, c3_spicc_parents);
549static C3_COMP_DIV(spicc_a, SPICC_CLK_CTRL, 0, 6);
550static C3_COMP_GATE(spicc_a, SPICC_CLK_CTRL, 6);
551
552static C3_COMP_SEL(spicc_b, SPICC_CLK_CTRL, 23, 0x7, c3_spicc_parents);
553static C3_COMP_DIV(spicc_b, SPICC_CLK_CTRL, 16, 6);
554static C3_COMP_GATE(spicc_b, SPICC_CLK_CTRL, 22);
555
556static const struct clk_parent_data c3_spifc_parents[] = {
557 { .fw_name = "gp0" },
558 { .fw_name = "fdiv2" },
559 { .fw_name = "fdiv3" },
560 { .fw_name = "fdiv2p5" },
561 { .fw_name = "hifi" },
562 { .fw_name = "fdiv4" },
563 { .fw_name = "fdiv5" },
564 { .fw_name = "fdiv7" }
565};
566
567static C3_COMP_SEL(spifc, SPIFC_CLK_CTRL, 9, 0x7, c3_spifc_parents);
568static C3_COMP_DIV(spifc, SPIFC_CLK_CTRL, 0, 7);
569static C3_COMP_GATE(spifc, SPIFC_CLK_CTRL, 8);
570
571static const struct clk_parent_data c3_sd_emmc_parents[] = {
572 { .fw_name = "oscin" },
573 { .fw_name = "fdiv2" },
574 { .fw_name = "fdiv3" },
575 { .fw_name = "hifi" },
576 { .fw_name = "fdiv2p5" },
577 { .fw_name = "fdiv4" },
578 { .fw_name = "gp1" },
579 { .fw_name = "gp0" }
580};
581
582static C3_COMP_SEL(sd_emmc_a, SD_EMMC_CLK_CTRL, 9, 0x7, c3_sd_emmc_parents);
583static C3_COMP_DIV(sd_emmc_a, SD_EMMC_CLK_CTRL, 0, 7);
584static C3_COMP_GATE(sd_emmc_a, SD_EMMC_CLK_CTRL, 7);
585
586static C3_COMP_SEL(sd_emmc_b, SD_EMMC_CLK_CTRL, 25, 0x7, c3_sd_emmc_parents);
587static C3_COMP_DIV(sd_emmc_b, SD_EMMC_CLK_CTRL, 16, 7);
588static C3_COMP_GATE(sd_emmc_b, SD_EMMC_CLK_CTRL, 23);
589
590static C3_COMP_SEL(sd_emmc_c, NAND_CLK_CTRL, 9, 0x7, c3_sd_emmc_parents);
591static C3_COMP_DIV(sd_emmc_c, NAND_CLK_CTRL, 0, 7);
592static C3_COMP_GATE(sd_emmc_c, NAND_CLK_CTRL, 7);
593
594static struct clk_regmap c3_ts_div = {
595 .data = &(struct clk_regmap_div_data) {
596 .offset = TS_CLK_CTRL,
597 .shift = 0,
598 .width = 8,
599 },
600 .hw.init = &(struct clk_init_data) {
601 .name = "ts_div",
602 .ops = &clk_regmap_divider_ops,
603 .parent_data = &(const struct clk_parent_data) {
604 .fw_name = "oscin",
605 },
606 .num_parents = 1,
607 },
608};
609
610static struct clk_regmap c3_ts = {
611 .data = &(struct clk_regmap_gate_data) {
612 .offset = TS_CLK_CTRL,
613 .bit_idx = 8,
614 },
615 .hw.init = &(struct clk_init_data) {
616 .name = "ts",
617 .ops = &clk_regmap_gate_ops,
618 .parent_hws = (const struct clk_hw *[]) {
619 &c3_ts_div.hw
620 },
621 .num_parents = 1,
622 .flags = CLK_SET_RATE_PARENT,
623 },
624};
625
626static const struct clk_parent_data c3_eth_parents = {
627 .fw_name = "fdiv2",
628};
629
630static struct clk_fixed_factor c3_eth_125m_div = {
631 .mult = 1,
632 .div = 8,
633 .hw.init = &(struct clk_init_data) {
634 .name = "eth_125m_div",
635 .ops = &clk_fixed_factor_ops,
636 .parent_data = &c3_eth_parents,
637 .num_parents = 1,
638 },
639};
640
641static struct clk_regmap c3_eth_125m = {
642 .data = &(struct clk_regmap_gate_data) {
643 .offset = ETH_CLK_CTRL,
644 .bit_idx = 7,
645 },
646 .hw.init = &(struct clk_init_data) {
647 .name = "eth_125m",
648 .ops = &clk_regmap_gate_ops,
649 .parent_hws = (const struct clk_hw *[]) {
650 &c3_eth_125m_div.hw
651 },
652 .num_parents = 1,
653 .flags = CLK_SET_RATE_PARENT,
654 },
655};
656
657static struct clk_regmap c3_eth_rmii_div = {
658 .data = &(struct clk_regmap_div_data) {
659 .offset = ETH_CLK_CTRL,
660 .shift = 0,
661 .width = 7,
662 },
663 .hw.init = &(struct clk_init_data) {
664 .name = "eth_rmii_div",
665 .ops = &clk_regmap_divider_ops,
666 .parent_data = &c3_eth_parents,
667 .num_parents = 1,
668 },
669};
670
671static struct clk_regmap c3_eth_rmii = {
672 .data = &(struct clk_regmap_gate_data) {
673 .offset = ETH_CLK_CTRL,
674 .bit_idx = 8,
675 },
676 .hw.init = &(struct clk_init_data) {
677 .name = "eth_rmii",
678 .ops = &clk_regmap_gate_ops,
679 .parent_hws = (const struct clk_hw *[]) {
680 &c3_eth_rmii_div.hw
681 },
682 .num_parents = 1,
683 .flags = CLK_SET_RATE_PARENT,
684 },
685};
686
687static const struct clk_parent_data c3_mipi_dsi_meas_parents[] = {
688 { .fw_name = "oscin" },
689 { .fw_name = "fdiv4" },
690 { .fw_name = "fdiv3" },
691 { .fw_name = "fdiv5" },
692 { .fw_name = "gp1" },
693 { .fw_name = "gp0" },
694 { .fw_name = "fdiv2" },
695 { .fw_name = "fdiv7" }
696};
697
698static C3_COMP_SEL(mipi_dsi_meas, VDIN_MEAS_CLK_CTRL, 21, 0x7, c3_mipi_dsi_meas_parents);
699static C3_COMP_DIV(mipi_dsi_meas, VDIN_MEAS_CLK_CTRL, 12, 7);
700static C3_COMP_GATE(mipi_dsi_meas, VDIN_MEAS_CLK_CTRL, 20);
701
702static const struct clk_parent_data c3_dsi_phy_parents[] = {
703 { .fw_name = "gp1" },
704 { .fw_name = "gp0" },
705 { .fw_name = "hifi" },
706 { .fw_name = "fdiv3" },
707 { .fw_name = "fdiv2" },
708 { .fw_name = "fdiv2p5" },
709 { .fw_name = "fdiv4" },
710 { .fw_name = "fdiv7" }
711};
712
713static C3_COMP_SEL(dsi_phy, MIPIDSI_PHY_CLK_CTRL, 12, 0x7, c3_dsi_phy_parents);
714static C3_COMP_DIV(dsi_phy, MIPIDSI_PHY_CLK_CTRL, 0, 7);
715static C3_COMP_GATE(dsi_phy, MIPIDSI_PHY_CLK_CTRL, 8);
716
717static const struct clk_parent_data c3_vout_mclk_parents[] = {
718 { .fw_name = "fdiv2p5" },
719 { .fw_name = "fdiv3" },
720 { .fw_name = "fdiv4" },
721 { .fw_name = "fdiv5" },
722 { .fw_name = "gp0" },
723 { .fw_name = "hifi" },
724 { .fw_name = "gp1" },
725 { .fw_name = "fdiv7" }
726};
727
728static C3_COMP_SEL(vout_mclk, VOUTENC_CLK_CTRL, 9, 0x7, c3_vout_mclk_parents);
729static C3_COMP_DIV(vout_mclk, VOUTENC_CLK_CTRL, 0, 7);
730static C3_COMP_GATE(vout_mclk, VOUTENC_CLK_CTRL, 8);
731
732static const struct clk_parent_data c3_vout_enc_parents[] = {
733 { .fw_name = "gp1" },
734 { .fw_name = "fdiv3" },
735 { .fw_name = "fdiv4" },
736 { .fw_name = "fdiv5" },
737 { .fw_name = "gp0" },
738 { .fw_name = "hifi" },
739 { .fw_name = "fdiv2p5" },
740 { .fw_name = "fdiv7" }
741};
742
743static C3_COMP_SEL(vout_enc, VOUTENC_CLK_CTRL, 25, 0x7, c3_vout_enc_parents);
744static C3_COMP_DIV(vout_enc, VOUTENC_CLK_CTRL, 16, 7);
745static C3_COMP_GATE(vout_enc, VOUTENC_CLK_CTRL, 24);
746
747static const struct clk_parent_data c3_hcodec_pre_parents[] = {
748 { .fw_name = "fdiv2p5" },
749 { .fw_name = "fdiv3" },
750 { .fw_name = "fdiv4" },
751 { .fw_name = "fdiv5" },
752 { .fw_name = "fdiv7" },
753 { .fw_name = "hifi" },
754 { .fw_name = "gp0" },
755 { .fw_name = "oscin" }
756};
757
758static C3_COMP_SEL(hcodec_0, VDEC_CLK_CTRL, 9, 0x7, c3_hcodec_pre_parents);
759static C3_COMP_DIV(hcodec_0, VDEC_CLK_CTRL, 0, 7);
760static C3_COMP_GATE(hcodec_0, VDEC_CLK_CTRL, 8);
761
762static C3_COMP_SEL(hcodec_1, VDEC3_CLK_CTRL, 9, 0x7, c3_hcodec_pre_parents);
763static C3_COMP_DIV(hcodec_1, VDEC3_CLK_CTRL, 0, 7);
764static C3_COMP_GATE(hcodec_1, VDEC3_CLK_CTRL, 8);
765
766static const struct clk_parent_data c3_hcodec_parents[] = {
767 { .hw = &c3_hcodec_0.hw },
768 { .hw = &c3_hcodec_1.hw }
769};
770
771static struct clk_regmap c3_hcodec = {
772 .data = &(struct clk_regmap_mux_data) {
773 .offset = VDEC3_CLK_CTRL,
774 .mask = 0x1,
775 .shift = 15,
776 },
777 .hw.init = &(struct clk_init_data) {
778 .name = "hcodec",
779 .ops = &clk_regmap_mux_ops,
780 .parent_data = c3_hcodec_parents,
781 .num_parents = ARRAY_SIZE(c3_hcodec_parents),
782 .flags = CLK_SET_RATE_PARENT,
783 },
784};
785
786static const struct clk_parent_data c3_vc9000e_parents[] = {
787 { .fw_name = "oscin" },
788 { .fw_name = "fdiv4" },
789 { .fw_name = "fdiv3" },
790 { .fw_name = "fdiv5" },
791 { .fw_name = "fdiv7" },
792 { .fw_name = "fdiv2p5" },
793 { .fw_name = "hifi" },
794 { .fw_name = "gp0" }
795};
796
797static C3_COMP_SEL(vc9000e_aclk, VC9000E_CLK_CTRL, 9, 0x7, c3_vc9000e_parents);
798static C3_COMP_DIV(vc9000e_aclk, VC9000E_CLK_CTRL, 0, 7);
799static C3_COMP_GATE(vc9000e_aclk, VC9000E_CLK_CTRL, 8);
800
801static C3_COMP_SEL(vc9000e_core, VC9000E_CLK_CTRL, 25, 0x7, c3_vc9000e_parents);
802static C3_COMP_DIV(vc9000e_core, VC9000E_CLK_CTRL, 16, 7);
803static C3_COMP_GATE(vc9000e_core, VC9000E_CLK_CTRL, 24);
804
805static const struct clk_parent_data c3_csi_phy_parents[] = {
806 { .fw_name = "fdiv2p5" },
807 { .fw_name = "fdiv3" },
808 { .fw_name = "fdiv4" },
809 { .fw_name = "fdiv5" },
810 { .fw_name = "gp0" },
811 { .fw_name = "hifi" },
812 { .fw_name = "gp1" },
813 { .fw_name = "oscin" }
814};
815
816static C3_COMP_SEL(csi_phy0, ISP0_CLK_CTRL, 25, 0x7, c3_csi_phy_parents);
817static C3_COMP_DIV(csi_phy0, ISP0_CLK_CTRL, 16, 7);
818static C3_COMP_GATE(csi_phy0, ISP0_CLK_CTRL, 24);
819
820static const struct clk_parent_data c3_dewarpa_parents[] = {
821 { .fw_name = "fdiv2p5" },
822 { .fw_name = "fdiv3" },
823 { .fw_name = "fdiv4" },
824 { .fw_name = "fdiv5" },
825 { .fw_name = "gp0" },
826 { .fw_name = "hifi" },
827 { .fw_name = "gp1" },
828 { .fw_name = "fdiv7" }
829};
830
831static C3_COMP_SEL(dewarpa, DEWARPA_CLK_CTRL, 9, 0x7, c3_dewarpa_parents);
832static C3_COMP_DIV(dewarpa, DEWARPA_CLK_CTRL, 0, 7);
833static C3_COMP_GATE(dewarpa, DEWARPA_CLK_CTRL, 8);
834
835static const struct clk_parent_data c3_isp_parents[] = {
836 { .fw_name = "fdiv2p5" },
837 { .fw_name = "fdiv3" },
838 { .fw_name = "fdiv4" },
839 { .fw_name = "fdiv5" },
840 { .fw_name = "gp0" },
841 { .fw_name = "hifi" },
842 { .fw_name = "gp1" },
843 { .fw_name = "oscin" }
844};
845
846static C3_COMP_SEL(isp0, ISP0_CLK_CTRL, 9, 0x7, c3_isp_parents);
847static C3_COMP_DIV(isp0, ISP0_CLK_CTRL, 0, 7);
848static C3_COMP_GATE(isp0, ISP0_CLK_CTRL, 8);
849
850static const struct clk_parent_data c3_nna_core_parents[] = {
851 { .fw_name = "oscin" },
852 { .fw_name = "fdiv2p5" },
853 { .fw_name = "fdiv4" },
854 { .fw_name = "fdiv3" },
855 { .fw_name = "fdiv5" },
856 { .fw_name = "fdiv2" },
857 { .fw_name = "gp1" },
858 { .fw_name = "hifi" }
859};
860
861static C3_COMP_SEL(nna_core, NNA_CLK_CTRL, 9, 0x7, c3_nna_core_parents);
862static C3_COMP_DIV(nna_core, NNA_CLK_CTRL, 0, 7);
863static C3_COMP_GATE(nna_core, NNA_CLK_CTRL, 8);
864
865static const struct clk_parent_data c3_ge2d_parents[] = {
866 { .fw_name = "oscin" },
867 { .fw_name = "fdiv2p5" },
868 { .fw_name = "fdiv3" },
869 { .fw_name = "fdiv4" },
870 { .fw_name = "hifi" },
871 { .fw_name = "fdiv5" },
872 { .fw_name = "gp0" },
873 { .hw = &c3_rtc_clk.hw }
874};
875
876static C3_COMP_SEL(ge2d, GE2D_CLK_CTRL, 9, 0x7, c3_ge2d_parents);
877static C3_COMP_DIV(ge2d, GE2D_CLK_CTRL, 0, 7);
878static C3_COMP_GATE(ge2d, GE2D_CLK_CTRL, 8);
879
880static const struct clk_parent_data c3_vapb_parents[] = {
881 { .fw_name = "fdiv2p5" },
882 { .fw_name = "fdiv3" },
883 { .fw_name = "fdiv4" },
884 { .fw_name = "fdiv5" },
885 { .fw_name = "gp0" },
886 { .fw_name = "hifi" },
887 { .fw_name = "gp1" },
888 { .fw_name = "oscin" },
889};
890
891static C3_COMP_SEL(vapb, VAPB_CLK_CTRL, 9, 0x7, c3_vapb_parents);
892static C3_COMP_DIV(vapb, VAPB_CLK_CTRL, 0, 7);
893static C3_COMP_GATE(vapb, VAPB_CLK_CTRL, 8);
894
895static struct clk_hw *c3_peripherals_hw_clks[] = {
896 [CLKID_RTC_XTAL_CLKIN] = &c3_rtc_xtal_clkin.hw,
897 [CLKID_RTC_32K_DIV] = &c3_rtc_32k_div.hw,
898 [CLKID_RTC_32K_MUX] = &c3_rtc_32k_sel.hw,
899 [CLKID_RTC_32K] = &c3_rtc_32k.hw,
900 [CLKID_RTC_CLK] = &c3_rtc_clk.hw,
901 [CLKID_SYS_RESET_CTRL] = &c3_sys_reset_ctrl.hw,
902 [CLKID_SYS_PWR_CTRL] = &c3_sys_pwr_ctrl.hw,
903 [CLKID_SYS_PAD_CTRL] = &c3_sys_pad_ctrl.hw,
904 [CLKID_SYS_CTRL] = &c3_sys_ctrl.hw,
905 [CLKID_SYS_TS_PLL] = &c3_sys_ts_pll.hw,
906 [CLKID_SYS_DEV_ARB] = &c3_sys_dev_arb.hw,
907 [CLKID_SYS_MMC_PCLK] = &c3_sys_mmc_pclk.hw,
908 [CLKID_SYS_CPU_CTRL] = &c3_sys_cpu_ctrl.hw,
909 [CLKID_SYS_JTAG_CTRL] = &c3_sys_jtag_ctrl.hw,
910 [CLKID_SYS_IR_CTRL] = &c3_sys_ir_ctrl.hw,
911 [CLKID_SYS_IRQ_CTRL] = &c3_sys_irq_ctrl.hw,
912 [CLKID_SYS_MSR_CLK] = &c3_sys_msr_clk.hw,
913 [CLKID_SYS_ROM] = &c3_sys_rom.hw,
914 [CLKID_SYS_UART_F] = &c3_sys_uart_f.hw,
915 [CLKID_SYS_CPU_ARB] = &c3_sys_cpu_apb.hw,
916 [CLKID_SYS_RSA] = &c3_sys_rsa.hw,
917 [CLKID_SYS_SAR_ADC] = &c3_sys_sar_adc.hw,
918 [CLKID_SYS_STARTUP] = &c3_sys_startup.hw,
919 [CLKID_SYS_SECURE] = &c3_sys_secure.hw,
920 [CLKID_SYS_SPIFC] = &c3_sys_spifc.hw,
921 [CLKID_SYS_NNA] = &c3_sys_nna.hw,
922 [CLKID_SYS_ETH_MAC] = &c3_sys_eth_mac.hw,
923 [CLKID_SYS_GIC] = &c3_sys_gic.hw,
924 [CLKID_SYS_RAMA] = &c3_sys_rama.hw,
925 [CLKID_SYS_BIG_NIC] = &c3_sys_big_nic.hw,
926 [CLKID_SYS_RAMB] = &c3_sys_ramb.hw,
927 [CLKID_SYS_AUDIO_PCLK] = &c3_sys_audio_pclk.hw,
928 [CLKID_SYS_PWM_KL] = &c3_sys_pwm_kl.hw,
929 [CLKID_SYS_PWM_IJ] = &c3_sys_pwm_ij.hw,
930 [CLKID_SYS_USB] = &c3_sys_usb.hw,
931 [CLKID_SYS_SD_EMMC_A] = &c3_sys_sd_emmc_a.hw,
932 [CLKID_SYS_SD_EMMC_C] = &c3_sys_sd_emmc_c.hw,
933 [CLKID_SYS_PWM_AB] = &c3_sys_pwm_ab.hw,
934 [CLKID_SYS_PWM_CD] = &c3_sys_pwm_cd.hw,
935 [CLKID_SYS_PWM_EF] = &c3_sys_pwm_ef.hw,
936 [CLKID_SYS_PWM_GH] = &c3_sys_pwm_gh.hw,
937 [CLKID_SYS_SPICC_1] = &c3_sys_spicc_1.hw,
938 [CLKID_SYS_SPICC_0] = &c3_sys_spicc_0.hw,
939 [CLKID_SYS_UART_A] = &c3_sys_uart_a.hw,
940 [CLKID_SYS_UART_B] = &c3_sys_uart_b.hw,
941 [CLKID_SYS_UART_C] = &c3_sys_uart_c.hw,
942 [CLKID_SYS_UART_D] = &c3_sys_uart_d.hw,
943 [CLKID_SYS_UART_E] = &c3_sys_uart_e.hw,
944 [CLKID_SYS_I2C_M_A] = &c3_sys_i2c_m_a.hw,
945 [CLKID_SYS_I2C_M_B] = &c3_sys_i2c_m_b.hw,
946 [CLKID_SYS_I2C_M_C] = &c3_sys_i2c_m_c.hw,
947 [CLKID_SYS_I2C_M_D] = &c3_sys_i2c_m_d.hw,
948 [CLKID_SYS_I2S_S_A] = &c3_sys_i2c_s_a.hw,
949 [CLKID_SYS_RTC] = &c3_sys_rtc.hw,
950 [CLKID_SYS_GE2D] = &c3_sys_ge2d.hw,
951 [CLKID_SYS_ISP] = &c3_sys_isp.hw,
952 [CLKID_SYS_GPV_ISP_NIC] = &c3_sys_gpv_isp_nic.hw,
953 [CLKID_SYS_GPV_CVE_NIC] = &c3_sys_gpv_cve_nic.hw,
954 [CLKID_SYS_MIPI_DSI_HOST] = &c3_sys_mipi_dsi_host.hw,
955 [CLKID_SYS_MIPI_DSI_PHY] = &c3_sys_mipi_dsi_phy.hw,
956 [CLKID_SYS_ETH_PHY] = &c3_sys_eth_phy.hw,
957 [CLKID_SYS_ACODEC] = &c3_sys_acodec.hw,
958 [CLKID_SYS_DWAP] = &c3_sys_dwap.hw,
959 [CLKID_SYS_DOS] = &c3_sys_dos.hw,
960 [CLKID_SYS_CVE] = &c3_sys_cve.hw,
961 [CLKID_SYS_VOUT] = &c3_sys_vout.hw,
962 [CLKID_SYS_VC9000E] = &c3_sys_vc9000e.hw,
963 [CLKID_SYS_PWM_MN] = &c3_sys_pwm_mn.hw,
964 [CLKID_SYS_SD_EMMC_B] = &c3_sys_sd_emmc_b.hw,
965 [CLKID_AXI_SYS_NIC] = &c3_axi_sys_nic.hw,
966 [CLKID_AXI_ISP_NIC] = &c3_axi_isp_nic.hw,
967 [CLKID_AXI_CVE_NIC] = &c3_axi_cve_nic.hw,
968 [CLKID_AXI_RAMB] = &c3_axi_ramb.hw,
969 [CLKID_AXI_RAMA] = &c3_axi_rama.hw,
970 [CLKID_AXI_CPU_DMC] = &c3_axi_cpu_dmc.hw,
971 [CLKID_AXI_NIC] = &c3_axi_nic.hw,
972 [CLKID_AXI_DMA] = &c3_axi_dma.hw,
973 [CLKID_AXI_MUX_NIC] = &c3_axi_mux_nic.hw,
974 [CLKID_AXI_CVE] = &c3_axi_cve.hw,
975 [CLKID_AXI_DEV1_DMC] = &c3_axi_dev1_dmc.hw,
976 [CLKID_AXI_DEV0_DMC] = &c3_axi_dev0_dmc.hw,
977 [CLKID_AXI_DSP_DMC] = &c3_axi_dsp_dmc.hw,
978 [CLKID_12_24M_IN] = &c3_clk_12_24m_in.hw,
979 [CLKID_12M_24M] = &c3_clk_12_24m.hw,
980 [CLKID_FCLK_25M_DIV] = &c3_fclk_25m_div.hw,
981 [CLKID_FCLK_25M] = &c3_fclk_25m.hw,
982 [CLKID_GEN_SEL] = &c3_gen_sel.hw,
983 [CLKID_GEN_DIV] = &c3_gen_div.hw,
984 [CLKID_GEN] = &c3_gen.hw,
985 [CLKID_SARADC_SEL] = &c3_saradc_sel.hw,
986 [CLKID_SARADC_DIV] = &c3_saradc_div.hw,
987 [CLKID_SARADC] = &c3_saradc.hw,
988 [CLKID_PWM_A_SEL] = &c3_pwm_a_sel.hw,
989 [CLKID_PWM_A_DIV] = &c3_pwm_a_div.hw,
990 [CLKID_PWM_A] = &c3_pwm_a.hw,
991 [CLKID_PWM_B_SEL] = &c3_pwm_b_sel.hw,
992 [CLKID_PWM_B_DIV] = &c3_pwm_b_div.hw,
993 [CLKID_PWM_B] = &c3_pwm_b.hw,
994 [CLKID_PWM_C_SEL] = &c3_pwm_c_sel.hw,
995 [CLKID_PWM_C_DIV] = &c3_pwm_c_div.hw,
996 [CLKID_PWM_C] = &c3_pwm_c.hw,
997 [CLKID_PWM_D_SEL] = &c3_pwm_d_sel.hw,
998 [CLKID_PWM_D_DIV] = &c3_pwm_d_div.hw,
999 [CLKID_PWM_D] = &c3_pwm_d.hw,
1000 [CLKID_PWM_E_SEL] = &c3_pwm_e_sel.hw,
1001 [CLKID_PWM_E_DIV] = &c3_pwm_e_div.hw,
1002 [CLKID_PWM_E] = &c3_pwm_e.hw,
1003 [CLKID_PWM_F_SEL] = &c3_pwm_f_sel.hw,
1004 [CLKID_PWM_F_DIV] = &c3_pwm_f_div.hw,
1005 [CLKID_PWM_F] = &c3_pwm_f.hw,
1006 [CLKID_PWM_G_SEL] = &c3_pwm_g_sel.hw,
1007 [CLKID_PWM_G_DIV] = &c3_pwm_g_div.hw,
1008 [CLKID_PWM_G] = &c3_pwm_g.hw,
1009 [CLKID_PWM_H_SEL] = &c3_pwm_h_sel.hw,
1010 [CLKID_PWM_H_DIV] = &c3_pwm_h_div.hw,
1011 [CLKID_PWM_H] = &c3_pwm_h.hw,
1012 [CLKID_PWM_I_SEL] = &c3_pwm_i_sel.hw,
1013 [CLKID_PWM_I_DIV] = &c3_pwm_i_div.hw,
1014 [CLKID_PWM_I] = &c3_pwm_i.hw,
1015 [CLKID_PWM_J_SEL] = &c3_pwm_j_sel.hw,
1016 [CLKID_PWM_J_DIV] = &c3_pwm_j_div.hw,
1017 [CLKID_PWM_J] = &c3_pwm_j.hw,
1018 [CLKID_PWM_K_SEL] = &c3_pwm_k_sel.hw,
1019 [CLKID_PWM_K_DIV] = &c3_pwm_k_div.hw,
1020 [CLKID_PWM_K] = &c3_pwm_k.hw,
1021 [CLKID_PWM_L_SEL] = &c3_pwm_l_sel.hw,
1022 [CLKID_PWM_L_DIV] = &c3_pwm_l_div.hw,
1023 [CLKID_PWM_L] = &c3_pwm_l.hw,
1024 [CLKID_PWM_M_SEL] = &c3_pwm_m_sel.hw,
1025 [CLKID_PWM_M_DIV] = &c3_pwm_m_div.hw,
1026 [CLKID_PWM_M] = &c3_pwm_m.hw,
1027 [CLKID_PWM_N_SEL] = &c3_pwm_n_sel.hw,
1028 [CLKID_PWM_N_DIV] = &c3_pwm_n_div.hw,
1029 [CLKID_PWM_N] = &c3_pwm_n.hw,
1030 [CLKID_SPICC_A_SEL] = &c3_spicc_a_sel.hw,
1031 [CLKID_SPICC_A_DIV] = &c3_spicc_a_div.hw,
1032 [CLKID_SPICC_A] = &c3_spicc_a.hw,
1033 [CLKID_SPICC_B_SEL] = &c3_spicc_b_sel.hw,
1034 [CLKID_SPICC_B_DIV] = &c3_spicc_b_div.hw,
1035 [CLKID_SPICC_B] = &c3_spicc_b.hw,
1036 [CLKID_SPIFC_SEL] = &c3_spifc_sel.hw,
1037 [CLKID_SPIFC_DIV] = &c3_spifc_div.hw,
1038 [CLKID_SPIFC] = &c3_spifc.hw,
1039 [CLKID_SD_EMMC_A_SEL] = &c3_sd_emmc_a_sel.hw,
1040 [CLKID_SD_EMMC_A_DIV] = &c3_sd_emmc_a_div.hw,
1041 [CLKID_SD_EMMC_A] = &c3_sd_emmc_a.hw,
1042 [CLKID_SD_EMMC_B_SEL] = &c3_sd_emmc_b_sel.hw,
1043 [CLKID_SD_EMMC_B_DIV] = &c3_sd_emmc_b_div.hw,
1044 [CLKID_SD_EMMC_B] = &c3_sd_emmc_b.hw,
1045 [CLKID_SD_EMMC_C_SEL] = &c3_sd_emmc_c_sel.hw,
1046 [CLKID_SD_EMMC_C_DIV] = &c3_sd_emmc_c_div.hw,
1047 [CLKID_SD_EMMC_C] = &c3_sd_emmc_c.hw,
1048 [CLKID_TS_DIV] = &c3_ts_div.hw,
1049 [CLKID_TS] = &c3_ts.hw,
1050 [CLKID_ETH_125M_DIV] = &c3_eth_125m_div.hw,
1051 [CLKID_ETH_125M] = &c3_eth_125m.hw,
1052 [CLKID_ETH_RMII_DIV] = &c3_eth_rmii_div.hw,
1053 [CLKID_ETH_RMII] = &c3_eth_rmii.hw,
1054 [CLKID_MIPI_DSI_MEAS_SEL] = &c3_mipi_dsi_meas_sel.hw,
1055 [CLKID_MIPI_DSI_MEAS_DIV] = &c3_mipi_dsi_meas_div.hw,
1056 [CLKID_MIPI_DSI_MEAS] = &c3_mipi_dsi_meas.hw,
1057 [CLKID_DSI_PHY_SEL] = &c3_dsi_phy_sel.hw,
1058 [CLKID_DSI_PHY_DIV] = &c3_dsi_phy_div.hw,
1059 [CLKID_DSI_PHY] = &c3_dsi_phy.hw,
1060 [CLKID_VOUT_MCLK_SEL] = &c3_vout_mclk_sel.hw,
1061 [CLKID_VOUT_MCLK_DIV] = &c3_vout_mclk_div.hw,
1062 [CLKID_VOUT_MCLK] = &c3_vout_mclk.hw,
1063 [CLKID_VOUT_ENC_SEL] = &c3_vout_enc_sel.hw,
1064 [CLKID_VOUT_ENC_DIV] = &c3_vout_enc_div.hw,
1065 [CLKID_VOUT_ENC] = &c3_vout_enc.hw,
1066 [CLKID_HCODEC_0_SEL] = &c3_hcodec_0_sel.hw,
1067 [CLKID_HCODEC_0_DIV] = &c3_hcodec_0_div.hw,
1068 [CLKID_HCODEC_0] = &c3_hcodec_0.hw,
1069 [CLKID_HCODEC_1_SEL] = &c3_hcodec_1_sel.hw,
1070 [CLKID_HCODEC_1_DIV] = &c3_hcodec_1_div.hw,
1071 [CLKID_HCODEC_1] = &c3_hcodec_1.hw,
1072 [CLKID_HCODEC] = &c3_hcodec.hw,
1073 [CLKID_VC9000E_ACLK_SEL] = &c3_vc9000e_aclk_sel.hw,
1074 [CLKID_VC9000E_ACLK_DIV] = &c3_vc9000e_aclk_div.hw,
1075 [CLKID_VC9000E_ACLK] = &c3_vc9000e_aclk.hw,
1076 [CLKID_VC9000E_CORE_SEL] = &c3_vc9000e_core_sel.hw,
1077 [CLKID_VC9000E_CORE_DIV] = &c3_vc9000e_core_div.hw,
1078 [CLKID_VC9000E_CORE] = &c3_vc9000e_core.hw,
1079 [CLKID_CSI_PHY0_SEL] = &c3_csi_phy0_sel.hw,
1080 [CLKID_CSI_PHY0_DIV] = &c3_csi_phy0_div.hw,
1081 [CLKID_CSI_PHY0] = &c3_csi_phy0.hw,
1082 [CLKID_DEWARPA_SEL] = &c3_dewarpa_sel.hw,
1083 [CLKID_DEWARPA_DIV] = &c3_dewarpa_div.hw,
1084 [CLKID_DEWARPA] = &c3_dewarpa.hw,
1085 [CLKID_ISP0_SEL] = &c3_isp0_sel.hw,
1086 [CLKID_ISP0_DIV] = &c3_isp0_div.hw,
1087 [CLKID_ISP0] = &c3_isp0.hw,
1088 [CLKID_NNA_CORE_SEL] = &c3_nna_core_sel.hw,
1089 [CLKID_NNA_CORE_DIV] = &c3_nna_core_div.hw,
1090 [CLKID_NNA_CORE] = &c3_nna_core.hw,
1091 [CLKID_GE2D_SEL] = &c3_ge2d_sel.hw,
1092 [CLKID_GE2D_DIV] = &c3_ge2d_div.hw,
1093 [CLKID_GE2D] = &c3_ge2d.hw,
1094 [CLKID_VAPB_SEL] = &c3_vapb_sel.hw,
1095 [CLKID_VAPB_DIV] = &c3_vapb_div.hw,
1096 [CLKID_VAPB] = &c3_vapb.hw,
1097};
1098
1099static const struct meson_clkc_data c3_peripherals_clkc_data = {
1100 .hw_clks = {
1101 .hws = c3_peripherals_hw_clks,
1102 .num = ARRAY_SIZE(c3_peripherals_hw_clks),
1103 },
1104};
1105
1106static const struct of_device_id c3_peripherals_clkc_match_table[] = {
1107 {
1108 .compatible = "amlogic,c3-peripherals-clkc",
1109 .data = &c3_peripherals_clkc_data,
1110 },
1111 { /* sentinel */ }
1112};
1113
1114MODULE_DEVICE_TABLE(of, c3_peripherals_clkc_match_table);
1115
1116static struct platform_driver c3_peripherals_clkc_driver = {
1117 .probe = meson_clkc_mmio_probe,
1118 .driver = {
1119 .name = "c3-peripherals-clkc",
1120 .of_match_table = c3_peripherals_clkc_match_table,
1121 },
1122};
1123module_platform_driver(c3_peripherals_clkc_driver);
1124
1125MODULE_DESCRIPTION("Amlogic C3 Peripherals Clock Controller driver");
1126MODULE_AUTHOR("Chuan Liu <chuan.liu@amlogic.com>");
1127MODULE_LICENSE("GPL");
1128MODULE_IMPORT_NS("CLK_MESON");