162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2023 Nuvoton Technology Corp.
462306a36Sopenharmony_ci * Author: Chi-Fang Li <cfli0@nuvoton.com>
562306a36Sopenharmony_ci */
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#include <linux/clk-provider.h>
862306a36Sopenharmony_ci#include <linux/mfd/syscon.h>
962306a36Sopenharmony_ci#include <linux/module.h>
1062306a36Sopenharmony_ci#include <linux/of.h>
1162306a36Sopenharmony_ci#include <linux/platform_device.h>
1262306a36Sopenharmony_ci#include <linux/spinlock.h>
1362306a36Sopenharmony_ci#include <dt-bindings/clock/nuvoton,ma35d1-clk.h>
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#include "clk-ma35d1.h"
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_cistatic DEFINE_SPINLOCK(ma35d1_lock);
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci#define PLL_MAX_NUM		5
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci/* Clock Control Registers Offset */
2262306a36Sopenharmony_ci#define REG_CLK_PWRCTL		0x00
2362306a36Sopenharmony_ci#define REG_CLK_SYSCLK0		0x04
2462306a36Sopenharmony_ci#define REG_CLK_SYSCLK1		0x08
2562306a36Sopenharmony_ci#define REG_CLK_APBCLK0		0x0c
2662306a36Sopenharmony_ci#define REG_CLK_APBCLK1		0x10
2762306a36Sopenharmony_ci#define REG_CLK_APBCLK2		0x14
2862306a36Sopenharmony_ci#define REG_CLK_CLKSEL0		0x18
2962306a36Sopenharmony_ci#define REG_CLK_CLKSEL1		0x1c
3062306a36Sopenharmony_ci#define REG_CLK_CLKSEL2		0x20
3162306a36Sopenharmony_ci#define REG_CLK_CLKSEL3		0x24
3262306a36Sopenharmony_ci#define REG_CLK_CLKSEL4		0x28
3362306a36Sopenharmony_ci#define REG_CLK_CLKDIV0		0x2c
3462306a36Sopenharmony_ci#define REG_CLK_CLKDIV1		0x30
3562306a36Sopenharmony_ci#define REG_CLK_CLKDIV2		0x34
3662306a36Sopenharmony_ci#define REG_CLK_CLKDIV3		0x38
3762306a36Sopenharmony_ci#define REG_CLK_CLKDIV4		0x3c
3862306a36Sopenharmony_ci#define REG_CLK_CLKOCTL		0x40
3962306a36Sopenharmony_ci#define REG_CLK_STATUS		0x50
4062306a36Sopenharmony_ci#define REG_CLK_PLL0CTL0	0x60
4162306a36Sopenharmony_ci#define REG_CLK_PLL2CTL0	0x80
4262306a36Sopenharmony_ci#define REG_CLK_PLL2CTL1	0x84
4362306a36Sopenharmony_ci#define REG_CLK_PLL2CTL2	0x88
4462306a36Sopenharmony_ci#define REG_CLK_PLL3CTL0	0x90
4562306a36Sopenharmony_ci#define REG_CLK_PLL3CTL1	0x94
4662306a36Sopenharmony_ci#define REG_CLK_PLL3CTL2	0x98
4762306a36Sopenharmony_ci#define REG_CLK_PLL4CTL0	0xa0
4862306a36Sopenharmony_ci#define REG_CLK_PLL4CTL1	0xa4
4962306a36Sopenharmony_ci#define REG_CLK_PLL4CTL2	0xa8
5062306a36Sopenharmony_ci#define REG_CLK_PLL5CTL0	0xb0
5162306a36Sopenharmony_ci#define REG_CLK_PLL5CTL1	0xb4
5262306a36Sopenharmony_ci#define REG_CLK_PLL5CTL2	0xb8
5362306a36Sopenharmony_ci#define REG_CLK_CLKDCTL		0xc0
5462306a36Sopenharmony_ci#define REG_CLK_CLKDSTS		0xc4
5562306a36Sopenharmony_ci#define REG_CLK_CDUPB		0xc8
5662306a36Sopenharmony_ci#define REG_CLK_CDLOWB		0xcc
5762306a36Sopenharmony_ci#define REG_CLK_CKFLTRCTL	0xd0
5862306a36Sopenharmony_ci#define REG_CLK_TESTCLK		0xf0
5962306a36Sopenharmony_ci#define REG_CLK_PLLCTL		0x40
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci#define PLL_MODE_INT            0
6262306a36Sopenharmony_ci#define PLL_MODE_FRAC           1
6362306a36Sopenharmony_ci#define PLL_MODE_SS             2
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_cistatic const struct clk_parent_data ca35clk_sel_clks[] = {
6662306a36Sopenharmony_ci	{ .fw_name = "hxt", },
6762306a36Sopenharmony_ci	{ .fw_name = "capll", },
6862306a36Sopenharmony_ci	{ .fw_name = "ddrpll", },
6962306a36Sopenharmony_ci};
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_cistatic const struct clk_parent_data sysclk0_sel_clks[] = {
7262306a36Sopenharmony_ci	{ .fw_name = "epll_div2", },
7362306a36Sopenharmony_ci	{ .fw_name = "syspll", },
7462306a36Sopenharmony_ci};
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_cistatic const struct clk_parent_data sysclk1_sel_clks[] = {
7762306a36Sopenharmony_ci	{ .fw_name = "hxt", },
7862306a36Sopenharmony_ci	{ .fw_name = "syspll", },
7962306a36Sopenharmony_ci};
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_cistatic const struct clk_parent_data axiclk_sel_clks[] = {
8262306a36Sopenharmony_ci	{ .fw_name = "capll_div2", },
8362306a36Sopenharmony_ci	{ .fw_name = "capll_div4", },
8462306a36Sopenharmony_ci};
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_cistatic const struct clk_parent_data ccap_sel_clks[] = {
8762306a36Sopenharmony_ci	{ .fw_name = "hxt", },
8862306a36Sopenharmony_ci	{ .fw_name = "vpll", },
8962306a36Sopenharmony_ci	{ .fw_name = "apll", },
9062306a36Sopenharmony_ci	{ .fw_name = "syspll", },
9162306a36Sopenharmony_ci};
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_cistatic const struct clk_parent_data sdh_sel_clks[] = {
9462306a36Sopenharmony_ci	{ .fw_name = "syspll", },
9562306a36Sopenharmony_ci	{ .fw_name = "apll", },
9662306a36Sopenharmony_ci};
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_cistatic const struct clk_parent_data dcu_sel_clks[] = {
9962306a36Sopenharmony_ci	{ .fw_name = "epll_div2", },
10062306a36Sopenharmony_ci	{ .fw_name = "syspll", },
10162306a36Sopenharmony_ci};
10262306a36Sopenharmony_ci
10362306a36Sopenharmony_cistatic const struct clk_parent_data gfx_sel_clks[] = {
10462306a36Sopenharmony_ci	{ .fw_name = "epll", },
10562306a36Sopenharmony_ci	{ .fw_name = "syspll", },
10662306a36Sopenharmony_ci};
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_cistatic const struct clk_parent_data dbg_sel_clks[] = {
10962306a36Sopenharmony_ci	{ .fw_name = "hirc", },
11062306a36Sopenharmony_ci	{ .fw_name = "syspll", },
11162306a36Sopenharmony_ci};
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_cistatic const struct clk_parent_data timer0_sel_clks[] = {
11462306a36Sopenharmony_ci	{ .fw_name = "hxt", },
11562306a36Sopenharmony_ci	{ .fw_name = "lxt", },
11662306a36Sopenharmony_ci	{ .fw_name = "pclk0", },
11762306a36Sopenharmony_ci	{ .index = -1, },
11862306a36Sopenharmony_ci	{ .index = -1, },
11962306a36Sopenharmony_ci	{ .fw_name = "lirc", },
12062306a36Sopenharmony_ci	{ .index = -1, },
12162306a36Sopenharmony_ci	{ .fw_name = "hirc", },
12262306a36Sopenharmony_ci};
12362306a36Sopenharmony_ci
12462306a36Sopenharmony_cistatic const struct clk_parent_data timer1_sel_clks[] = {
12562306a36Sopenharmony_ci	{ .fw_name = "hxt", },
12662306a36Sopenharmony_ci	{ .fw_name = "lxt", },
12762306a36Sopenharmony_ci	{ .fw_name = "pclk0", },
12862306a36Sopenharmony_ci	{ .index = -1, },
12962306a36Sopenharmony_ci	{ .index = -1, },
13062306a36Sopenharmony_ci	{ .fw_name = "lirc", },
13162306a36Sopenharmony_ci	{ .index = -1, },
13262306a36Sopenharmony_ci	{ .fw_name = "hirc", },
13362306a36Sopenharmony_ci};
13462306a36Sopenharmony_ci
13562306a36Sopenharmony_cistatic const struct clk_parent_data timer2_sel_clks[] = {
13662306a36Sopenharmony_ci	{ .fw_name = "hxt", },
13762306a36Sopenharmony_ci	{ .fw_name = "lxt", },
13862306a36Sopenharmony_ci	{ .fw_name = "pclk1", },
13962306a36Sopenharmony_ci	{ .index = -1, },
14062306a36Sopenharmony_ci	{ .index = -1, },
14162306a36Sopenharmony_ci	{ .fw_name = "lirc", },
14262306a36Sopenharmony_ci	{ .index = -1, },
14362306a36Sopenharmony_ci	{ .fw_name = "hirc", },
14462306a36Sopenharmony_ci};
14562306a36Sopenharmony_ci
14662306a36Sopenharmony_cistatic const struct clk_parent_data timer3_sel_clks[] = {
14762306a36Sopenharmony_ci	{ .fw_name = "hxt", },
14862306a36Sopenharmony_ci	{ .fw_name = "lxt", },
14962306a36Sopenharmony_ci	{ .fw_name = "pclk1", },
15062306a36Sopenharmony_ci	{ .index = -1, },
15162306a36Sopenharmony_ci	{ .index = -1, },
15262306a36Sopenharmony_ci	{ .fw_name = "lirc", },
15362306a36Sopenharmony_ci	{ .index = -1, },
15462306a36Sopenharmony_ci	{ .fw_name = "hirc", },
15562306a36Sopenharmony_ci};
15662306a36Sopenharmony_ci
15762306a36Sopenharmony_cistatic const struct clk_parent_data timer4_sel_clks[] = {
15862306a36Sopenharmony_ci	{ .fw_name = "hxt", },
15962306a36Sopenharmony_ci	{ .fw_name = "lxt", },
16062306a36Sopenharmony_ci	{ .fw_name = "pclk2", },
16162306a36Sopenharmony_ci	{ .index = -1, },
16262306a36Sopenharmony_ci	{ .index = -1, },
16362306a36Sopenharmony_ci	{ .fw_name = "lirc", },
16462306a36Sopenharmony_ci	{ .index = -1, },
16562306a36Sopenharmony_ci	{ .fw_name = "hirc", },
16662306a36Sopenharmony_ci};
16762306a36Sopenharmony_ci
16862306a36Sopenharmony_cistatic const struct clk_parent_data timer5_sel_clks[] = {
16962306a36Sopenharmony_ci	{ .fw_name = "hxt", },
17062306a36Sopenharmony_ci	{ .fw_name = "lxt", },
17162306a36Sopenharmony_ci	{ .fw_name = "pclk2", },
17262306a36Sopenharmony_ci	{ .index = -1, },
17362306a36Sopenharmony_ci	{ .index = -1, },
17462306a36Sopenharmony_ci	{ .fw_name = "lirc", },
17562306a36Sopenharmony_ci	{ .index = -1, },
17662306a36Sopenharmony_ci	{ .fw_name = "hirc", },
17762306a36Sopenharmony_ci};
17862306a36Sopenharmony_ci
17962306a36Sopenharmony_cistatic const struct clk_parent_data timer6_sel_clks[] = {
18062306a36Sopenharmony_ci	{ .fw_name = "hxt", },
18162306a36Sopenharmony_ci	{ .fw_name = "lxt", },
18262306a36Sopenharmony_ci	{ .fw_name = "pclk0", },
18362306a36Sopenharmony_ci	{ .index = -1, },
18462306a36Sopenharmony_ci	{ .index = -1, },
18562306a36Sopenharmony_ci	{ .fw_name = "lirc", },
18662306a36Sopenharmony_ci	{ .index = -1, },
18762306a36Sopenharmony_ci	{ .fw_name = "hirc", },
18862306a36Sopenharmony_ci};
18962306a36Sopenharmony_ci
19062306a36Sopenharmony_cistatic const struct clk_parent_data timer7_sel_clks[] = {
19162306a36Sopenharmony_ci	{ .fw_name = "hxt", },
19262306a36Sopenharmony_ci	{ .fw_name = "lxt", },
19362306a36Sopenharmony_ci	{ .fw_name = "pclk0", },
19462306a36Sopenharmony_ci	{ .index = -1, },
19562306a36Sopenharmony_ci	{ .index = -1, },
19662306a36Sopenharmony_ci	{ .fw_name = "lirc", },
19762306a36Sopenharmony_ci	{ .index = -1, },
19862306a36Sopenharmony_ci	{ .fw_name = "hirc", },
19962306a36Sopenharmony_ci};
20062306a36Sopenharmony_ci
20162306a36Sopenharmony_cistatic const struct clk_parent_data timer8_sel_clks[] = {
20262306a36Sopenharmony_ci	{ .fw_name = "hxt", },
20362306a36Sopenharmony_ci	{ .fw_name = "lxt", },
20462306a36Sopenharmony_ci	{ .fw_name = "pclk1", },
20562306a36Sopenharmony_ci	{ .index = -1, },
20662306a36Sopenharmony_ci	{ .index = -1, },
20762306a36Sopenharmony_ci	{ .fw_name = "lirc", },
20862306a36Sopenharmony_ci	{ .index = -1, },
20962306a36Sopenharmony_ci	{ .fw_name = "hirc", },
21062306a36Sopenharmony_ci};
21162306a36Sopenharmony_ci
21262306a36Sopenharmony_cistatic const struct clk_parent_data timer9_sel_clks[] = {
21362306a36Sopenharmony_ci	{ .fw_name = "hxt", },
21462306a36Sopenharmony_ci	{ .fw_name = "lxt", },
21562306a36Sopenharmony_ci	{ .fw_name = "pclk1", },
21662306a36Sopenharmony_ci	{ .index = -1, },
21762306a36Sopenharmony_ci	{ .index = -1, },
21862306a36Sopenharmony_ci	{ .fw_name = "lirc", },
21962306a36Sopenharmony_ci	{ .index = -1, },
22062306a36Sopenharmony_ci	{ .fw_name = "hirc", },
22162306a36Sopenharmony_ci};
22262306a36Sopenharmony_ci
22362306a36Sopenharmony_cistatic const struct clk_parent_data timer10_sel_clks[] = {
22462306a36Sopenharmony_ci	{ .fw_name = "hxt", },
22562306a36Sopenharmony_ci	{ .fw_name = "lxt", },
22662306a36Sopenharmony_ci	{ .fw_name = "pclk2", },
22762306a36Sopenharmony_ci	{ .index = -1, },
22862306a36Sopenharmony_ci	{ .index = -1, },
22962306a36Sopenharmony_ci	{ .fw_name = "lirc", },
23062306a36Sopenharmony_ci	{ .index = -1, },
23162306a36Sopenharmony_ci	{ .fw_name = "hirc", },
23262306a36Sopenharmony_ci};
23362306a36Sopenharmony_ci
23462306a36Sopenharmony_cistatic const struct clk_parent_data timer11_sel_clks[] = {
23562306a36Sopenharmony_ci	{ .fw_name = "hxt", },
23662306a36Sopenharmony_ci	{ .fw_name = "lxt", },
23762306a36Sopenharmony_ci	{ .fw_name = "pclk2", },
23862306a36Sopenharmony_ci	{ .index = -1, },
23962306a36Sopenharmony_ci	{ .index = -1, },
24062306a36Sopenharmony_ci	{ .fw_name = "lirc", },
24162306a36Sopenharmony_ci	{ .index = -1, },
24262306a36Sopenharmony_ci	{ .fw_name = "hirc", },
24362306a36Sopenharmony_ci};
24462306a36Sopenharmony_ci
24562306a36Sopenharmony_cistatic const struct clk_parent_data uart_sel_clks[] = {
24662306a36Sopenharmony_ci	{ .fw_name = "hxt", },
24762306a36Sopenharmony_ci	{ .fw_name = "sysclk1_div2", },
24862306a36Sopenharmony_ci};
24962306a36Sopenharmony_ci
25062306a36Sopenharmony_cistatic const struct clk_parent_data wdt0_sel_clks[] = {
25162306a36Sopenharmony_ci	{ .index = -1, },
25262306a36Sopenharmony_ci	{ .fw_name = "lxt", },
25362306a36Sopenharmony_ci	{ .fw_name = "pclk3_div4096", },
25462306a36Sopenharmony_ci	{ .fw_name = "lirc", },
25562306a36Sopenharmony_ci};
25662306a36Sopenharmony_ci
25762306a36Sopenharmony_cistatic const struct clk_parent_data wdt1_sel_clks[] = {
25862306a36Sopenharmony_ci	{ .index = -1, },
25962306a36Sopenharmony_ci	{ .fw_name = "lxt", },
26062306a36Sopenharmony_ci	{ .fw_name = "pclk3_div4096", },
26162306a36Sopenharmony_ci	{ .fw_name = "lirc", },
26262306a36Sopenharmony_ci};
26362306a36Sopenharmony_ci
26462306a36Sopenharmony_cistatic const struct clk_parent_data wdt2_sel_clks[] = {
26562306a36Sopenharmony_ci	{ .index = -1, },
26662306a36Sopenharmony_ci	{ .fw_name = "lxt", },
26762306a36Sopenharmony_ci	{ .fw_name = "pclk4_div4096", },
26862306a36Sopenharmony_ci	{ .fw_name = "lirc", },
26962306a36Sopenharmony_ci};
27062306a36Sopenharmony_ci
27162306a36Sopenharmony_cistatic const struct clk_parent_data wwdt0_sel_clks[] = {
27262306a36Sopenharmony_ci	{ .index = -1, },
27362306a36Sopenharmony_ci	{ .index = -1, },
27462306a36Sopenharmony_ci	{ .fw_name = "pclk3_div4096", },
27562306a36Sopenharmony_ci	{ .fw_name = "lirc", },
27662306a36Sopenharmony_ci};
27762306a36Sopenharmony_ci
27862306a36Sopenharmony_cistatic const struct clk_parent_data wwdt1_sel_clks[] = {
27962306a36Sopenharmony_ci	{ .index = -1, },
28062306a36Sopenharmony_ci	{ .index = -1, },
28162306a36Sopenharmony_ci	{ .fw_name = "pclk3_div4096", },
28262306a36Sopenharmony_ci	{ .fw_name = "lirc", },
28362306a36Sopenharmony_ci};
28462306a36Sopenharmony_ci
28562306a36Sopenharmony_cistatic const struct clk_parent_data wwdt2_sel_clks[] = {
28662306a36Sopenharmony_ci	{ .index = -1, },
28762306a36Sopenharmony_ci	{ .index = -1, },
28862306a36Sopenharmony_ci	{ .fw_name = "pclk4_div4096", },
28962306a36Sopenharmony_ci	{ .fw_name = "lirc", },
29062306a36Sopenharmony_ci};
29162306a36Sopenharmony_ci
29262306a36Sopenharmony_cistatic const struct clk_parent_data spi0_sel_clks[] = {
29362306a36Sopenharmony_ci	{ .fw_name = "pclk1", },
29462306a36Sopenharmony_ci	{ .fw_name = "apll", },
29562306a36Sopenharmony_ci};
29662306a36Sopenharmony_ci
29762306a36Sopenharmony_cistatic const struct clk_parent_data spi1_sel_clks[] = {
29862306a36Sopenharmony_ci	{ .fw_name = "pclk2", },
29962306a36Sopenharmony_ci	{ .fw_name = "apll", },
30062306a36Sopenharmony_ci};
30162306a36Sopenharmony_ci
30262306a36Sopenharmony_cistatic const struct clk_parent_data spi2_sel_clks[] = {
30362306a36Sopenharmony_ci	{ .fw_name = "pclk1", },
30462306a36Sopenharmony_ci	{ .fw_name = "apll", },
30562306a36Sopenharmony_ci};
30662306a36Sopenharmony_ci
30762306a36Sopenharmony_cistatic const struct clk_parent_data spi3_sel_clks[] = {
30862306a36Sopenharmony_ci	{ .fw_name = "pclk2", },
30962306a36Sopenharmony_ci	{ .fw_name = "apll", },
31062306a36Sopenharmony_ci};
31162306a36Sopenharmony_ci
31262306a36Sopenharmony_cistatic const struct clk_parent_data qspi0_sel_clks[] = {
31362306a36Sopenharmony_ci	{ .fw_name = "pclk0", },
31462306a36Sopenharmony_ci	{ .fw_name = "apll", },
31562306a36Sopenharmony_ci};
31662306a36Sopenharmony_ci
31762306a36Sopenharmony_cistatic const struct clk_parent_data qspi1_sel_clks[] = {
31862306a36Sopenharmony_ci	{ .fw_name = "pclk0", },
31962306a36Sopenharmony_ci	{ .fw_name = "apll", },
32062306a36Sopenharmony_ci};
32162306a36Sopenharmony_ci
32262306a36Sopenharmony_cistatic const struct clk_parent_data i2s0_sel_clks[] = {
32362306a36Sopenharmony_ci	{ .fw_name = "apll", },
32462306a36Sopenharmony_ci	{ .fw_name = "sysclk1_div2", },
32562306a36Sopenharmony_ci};
32662306a36Sopenharmony_ci
32762306a36Sopenharmony_cistatic const struct clk_parent_data i2s1_sel_clks[] = {
32862306a36Sopenharmony_ci	{ .fw_name = "apll", },
32962306a36Sopenharmony_ci	{ .fw_name = "sysclk1_div2", },
33062306a36Sopenharmony_ci};
33162306a36Sopenharmony_ci
33262306a36Sopenharmony_cistatic const struct clk_parent_data can_sel_clks[] = {
33362306a36Sopenharmony_ci	{ .fw_name = "apll", },
33462306a36Sopenharmony_ci	{ .fw_name = "vpll", },
33562306a36Sopenharmony_ci};
33662306a36Sopenharmony_ci
33762306a36Sopenharmony_cistatic const struct clk_parent_data cko_sel_clks[] = {
33862306a36Sopenharmony_ci	{ .fw_name = "hxt", },
33962306a36Sopenharmony_ci	{ .fw_name = "lxt", },
34062306a36Sopenharmony_ci	{ .fw_name = "hirc", },
34162306a36Sopenharmony_ci	{ .fw_name = "lirc", },
34262306a36Sopenharmony_ci	{ .fw_name = "capll_div4", },
34362306a36Sopenharmony_ci	{ .fw_name = "syspll", },
34462306a36Sopenharmony_ci	{ .fw_name = "ddrpll", },
34562306a36Sopenharmony_ci	{ .fw_name = "epll_div2", },
34662306a36Sopenharmony_ci	{ .fw_name = "apll", },
34762306a36Sopenharmony_ci	{ .fw_name = "vpll", },
34862306a36Sopenharmony_ci};
34962306a36Sopenharmony_ci
35062306a36Sopenharmony_cistatic const struct clk_parent_data smc_sel_clks[] = {
35162306a36Sopenharmony_ci	{ .fw_name = "hxt", },
35262306a36Sopenharmony_ci	{ .fw_name = "pclk4", },
35362306a36Sopenharmony_ci};
35462306a36Sopenharmony_ci
35562306a36Sopenharmony_cistatic const struct clk_parent_data kpi_sel_clks[] = {
35662306a36Sopenharmony_ci	{ .fw_name = "hxt", },
35762306a36Sopenharmony_ci	{ .fw_name = "lxt", },
35862306a36Sopenharmony_ci};
35962306a36Sopenharmony_ci
36062306a36Sopenharmony_cistatic const struct clk_div_table ip_div_table[] = {
36162306a36Sopenharmony_ci	{0, 2}, {1, 4}, {2, 6}, {3, 8}, {4, 10},
36262306a36Sopenharmony_ci	{5, 12}, {6, 14}, {7, 16}, {0, 0},
36362306a36Sopenharmony_ci};
36462306a36Sopenharmony_ci
36562306a36Sopenharmony_cistatic const struct clk_div_table eadc_div_table[] = {
36662306a36Sopenharmony_ci	{0, 2}, {1, 4}, {2, 6}, {3, 8}, {4, 10},
36762306a36Sopenharmony_ci	{5, 12}, {6, 14}, {7, 16}, {8, 18},
36862306a36Sopenharmony_ci	{9, 20}, {10, 22}, {11, 24}, {12, 26},
36962306a36Sopenharmony_ci	{13, 28}, {14, 30}, {15, 32}, {0, 0},
37062306a36Sopenharmony_ci};
37162306a36Sopenharmony_ci
37262306a36Sopenharmony_cistatic struct clk_hw *ma35d1_clk_fixed(const char *name, int rate)
37362306a36Sopenharmony_ci{
37462306a36Sopenharmony_ci	return clk_hw_register_fixed_rate(NULL, name, NULL, 0, rate);
37562306a36Sopenharmony_ci}
37662306a36Sopenharmony_ci
37762306a36Sopenharmony_cistatic struct clk_hw *ma35d1_clk_mux_parent(struct device *dev, const char *name,
37862306a36Sopenharmony_ci					    void __iomem *reg, u8 shift, u8 width,
37962306a36Sopenharmony_ci					    const struct clk_parent_data *pdata,
38062306a36Sopenharmony_ci					    int num_pdata)
38162306a36Sopenharmony_ci{
38262306a36Sopenharmony_ci	return clk_hw_register_mux_parent_data(dev, name, pdata, num_pdata,
38362306a36Sopenharmony_ci					       CLK_SET_RATE_NO_REPARENT, reg, shift,
38462306a36Sopenharmony_ci					       width, 0, &ma35d1_lock);
38562306a36Sopenharmony_ci}
38662306a36Sopenharmony_ci
38762306a36Sopenharmony_cistatic struct clk_hw *ma35d1_clk_mux(struct device *dev, const char *name,
38862306a36Sopenharmony_ci				     void __iomem *reg, u8 shift, u8 width,
38962306a36Sopenharmony_ci				     const struct clk_parent_data *pdata,
39062306a36Sopenharmony_ci				     int num_pdata)
39162306a36Sopenharmony_ci{
39262306a36Sopenharmony_ci	return clk_hw_register_mux_parent_data(dev, name, pdata, num_pdata,
39362306a36Sopenharmony_ci					       CLK_SET_RATE_NO_REPARENT, reg, shift,
39462306a36Sopenharmony_ci					       width, 0, &ma35d1_lock);
39562306a36Sopenharmony_ci}
39662306a36Sopenharmony_ci
39762306a36Sopenharmony_cistatic struct clk_hw *ma35d1_clk_divider(struct device *dev, const char *name,
39862306a36Sopenharmony_ci					 const char *parent, void __iomem *reg,
39962306a36Sopenharmony_ci					 u8 shift, u8 width)
40062306a36Sopenharmony_ci{
40162306a36Sopenharmony_ci	return devm_clk_hw_register_divider(dev, name, parent, CLK_SET_RATE_PARENT,
40262306a36Sopenharmony_ci					    reg, shift, width, 0, &ma35d1_lock);
40362306a36Sopenharmony_ci}
40462306a36Sopenharmony_ci
40562306a36Sopenharmony_cistatic struct clk_hw *ma35d1_clk_divider_pow2(struct device *dev, const char *name,
40662306a36Sopenharmony_ci					      const char *parent, void __iomem *reg,
40762306a36Sopenharmony_ci					      u8 shift, u8 width)
40862306a36Sopenharmony_ci{
40962306a36Sopenharmony_ci	return devm_clk_hw_register_divider(dev, name, parent,
41062306a36Sopenharmony_ci					    CLK_DIVIDER_POWER_OF_TWO, reg, shift,
41162306a36Sopenharmony_ci					    width, 0, &ma35d1_lock);
41262306a36Sopenharmony_ci}
41362306a36Sopenharmony_ci
41462306a36Sopenharmony_cistatic struct clk_hw *ma35d1_clk_divider_table(struct device *dev, const char *name,
41562306a36Sopenharmony_ci					       const char *parent, void __iomem *reg,
41662306a36Sopenharmony_ci					       u8 shift, u8 width,
41762306a36Sopenharmony_ci					       const struct clk_div_table *table)
41862306a36Sopenharmony_ci{
41962306a36Sopenharmony_ci	return devm_clk_hw_register_divider_table(dev, name, parent, 0,
42062306a36Sopenharmony_ci						  reg, shift, width, 0,
42162306a36Sopenharmony_ci						  table, &ma35d1_lock);
42262306a36Sopenharmony_ci}
42362306a36Sopenharmony_ci
42462306a36Sopenharmony_cistatic struct clk_hw *ma35d1_clk_fixed_factor(struct device *dev, const char *name,
42562306a36Sopenharmony_ci					      const char *parent, unsigned int mult,
42662306a36Sopenharmony_ci					      unsigned int div)
42762306a36Sopenharmony_ci{
42862306a36Sopenharmony_ci	return devm_clk_hw_register_fixed_factor(dev, name, parent,
42962306a36Sopenharmony_ci					    CLK_SET_RATE_PARENT, mult, div);
43062306a36Sopenharmony_ci}
43162306a36Sopenharmony_ci
43262306a36Sopenharmony_cistatic struct clk_hw *ma35d1_clk_gate(struct device *dev, const char *name, const char *parent,
43362306a36Sopenharmony_ci				      void __iomem *reg, u8 shift)
43462306a36Sopenharmony_ci{
43562306a36Sopenharmony_ci	return devm_clk_hw_register_gate(dev, name, parent, CLK_SET_RATE_PARENT,
43662306a36Sopenharmony_ci				    reg, shift, 0, &ma35d1_lock);
43762306a36Sopenharmony_ci}
43862306a36Sopenharmony_ci
43962306a36Sopenharmony_cistatic int ma35d1_get_pll_setting(struct device_node *clk_node, u32 *pllmode)
44062306a36Sopenharmony_ci{
44162306a36Sopenharmony_ci	const char *of_str;
44262306a36Sopenharmony_ci	int i;
44362306a36Sopenharmony_ci
44462306a36Sopenharmony_ci	for (i = 0; i < PLL_MAX_NUM; i++) {
44562306a36Sopenharmony_ci		if (of_property_read_string_index(clk_node, "nuvoton,pll-mode", i, &of_str))
44662306a36Sopenharmony_ci			return -EINVAL;
44762306a36Sopenharmony_ci		if (!strcmp(of_str, "integer"))
44862306a36Sopenharmony_ci			pllmode[i] = PLL_MODE_INT;
44962306a36Sopenharmony_ci		else if (!strcmp(of_str, "fractional"))
45062306a36Sopenharmony_ci			pllmode[i] = PLL_MODE_FRAC;
45162306a36Sopenharmony_ci		else if (!strcmp(of_str, "spread-spectrum"))
45262306a36Sopenharmony_ci			pllmode[i] = PLL_MODE_SS;
45362306a36Sopenharmony_ci		else
45462306a36Sopenharmony_ci			return -EINVAL;
45562306a36Sopenharmony_ci	}
45662306a36Sopenharmony_ci	return 0;
45762306a36Sopenharmony_ci}
45862306a36Sopenharmony_ci
45962306a36Sopenharmony_cistatic int ma35d1_clocks_probe(struct platform_device *pdev)
46062306a36Sopenharmony_ci{
46162306a36Sopenharmony_ci	struct device *dev = &pdev->dev;
46262306a36Sopenharmony_ci	struct device_node *clk_node = pdev->dev.of_node;
46362306a36Sopenharmony_ci	void __iomem *clk_base;
46462306a36Sopenharmony_ci	static struct clk_hw **hws;
46562306a36Sopenharmony_ci	static struct clk_hw_onecell_data *ma35d1_hw_data;
46662306a36Sopenharmony_ci	u32 pllmode[PLL_MAX_NUM];
46762306a36Sopenharmony_ci	int ret;
46862306a36Sopenharmony_ci
46962306a36Sopenharmony_ci	ma35d1_hw_data = devm_kzalloc(dev,
47062306a36Sopenharmony_ci				      struct_size(ma35d1_hw_data, hws, CLK_MAX_IDX),
47162306a36Sopenharmony_ci				      GFP_KERNEL);
47262306a36Sopenharmony_ci	if (!ma35d1_hw_data)
47362306a36Sopenharmony_ci		return -ENOMEM;
47462306a36Sopenharmony_ci
47562306a36Sopenharmony_ci	ma35d1_hw_data->num = CLK_MAX_IDX;
47662306a36Sopenharmony_ci	hws = ma35d1_hw_data->hws;
47762306a36Sopenharmony_ci
47862306a36Sopenharmony_ci	clk_base = devm_platform_ioremap_resource(pdev, 0);
47962306a36Sopenharmony_ci	if (IS_ERR(clk_base))
48062306a36Sopenharmony_ci		return PTR_ERR(clk_base);
48162306a36Sopenharmony_ci
48262306a36Sopenharmony_ci	ret = ma35d1_get_pll_setting(clk_node, pllmode);
48362306a36Sopenharmony_ci	if (ret < 0) {
48462306a36Sopenharmony_ci		dev_err(dev, "Invalid PLL setting!\n");
48562306a36Sopenharmony_ci		return -EINVAL;
48662306a36Sopenharmony_ci	}
48762306a36Sopenharmony_ci
48862306a36Sopenharmony_ci	hws[HXT] = ma35d1_clk_fixed("hxt", 24000000);
48962306a36Sopenharmony_ci	hws[HXT_GATE] = ma35d1_clk_gate(dev, "hxt_gate", "hxt",
49062306a36Sopenharmony_ci					clk_base + REG_CLK_PWRCTL, 0);
49162306a36Sopenharmony_ci	hws[LXT] = ma35d1_clk_fixed("lxt", 32768);
49262306a36Sopenharmony_ci	hws[LXT_GATE] = ma35d1_clk_gate(dev, "lxt_gate", "lxt",
49362306a36Sopenharmony_ci					clk_base + REG_CLK_PWRCTL, 1);
49462306a36Sopenharmony_ci	hws[HIRC] = ma35d1_clk_fixed("hirc", 12000000);
49562306a36Sopenharmony_ci	hws[HIRC_GATE] = ma35d1_clk_gate(dev, "hirc_gate", "hirc",
49662306a36Sopenharmony_ci					 clk_base + REG_CLK_PWRCTL, 2);
49762306a36Sopenharmony_ci	hws[LIRC] = ma35d1_clk_fixed("lirc", 32000);
49862306a36Sopenharmony_ci	hws[LIRC_GATE] = ma35d1_clk_gate(dev, "lirc_gate", "lirc",
49962306a36Sopenharmony_ci					 clk_base + REG_CLK_PWRCTL, 3);
50062306a36Sopenharmony_ci
50162306a36Sopenharmony_ci	hws[CAPLL] = ma35d1_reg_clk_pll(dev, CAPLL, pllmode[0], "capll",
50262306a36Sopenharmony_ci					hws[HXT], clk_base + REG_CLK_PLL0CTL0);
50362306a36Sopenharmony_ci	hws[SYSPLL] = ma35d1_clk_fixed("syspll", 180000000);
50462306a36Sopenharmony_ci	hws[DDRPLL] = ma35d1_reg_clk_pll(dev, DDRPLL, pllmode[1], "ddrpll",
50562306a36Sopenharmony_ci					hws[HXT], clk_base + REG_CLK_PLL2CTL0);
50662306a36Sopenharmony_ci	hws[APLL] = ma35d1_reg_clk_pll(dev, APLL, pllmode[2], "apll",
50762306a36Sopenharmony_ci				       hws[HXT], clk_base + REG_CLK_PLL3CTL0);
50862306a36Sopenharmony_ci	hws[EPLL] = ma35d1_reg_clk_pll(dev, EPLL, pllmode[3], "epll",
50962306a36Sopenharmony_ci				       hws[HXT], clk_base + REG_CLK_PLL4CTL0);
51062306a36Sopenharmony_ci	hws[VPLL] = ma35d1_reg_clk_pll(dev, VPLL, pllmode[4], "vpll",
51162306a36Sopenharmony_ci				       hws[HXT], clk_base + REG_CLK_PLL5CTL0);
51262306a36Sopenharmony_ci
51362306a36Sopenharmony_ci	hws[EPLL_DIV2] = ma35d1_clk_fixed_factor(dev, "epll_div2", "epll", 1, 2);
51462306a36Sopenharmony_ci	hws[EPLL_DIV4] = ma35d1_clk_fixed_factor(dev, "epll_div4", "epll", 1, 4);
51562306a36Sopenharmony_ci	hws[EPLL_DIV8] = ma35d1_clk_fixed_factor(dev, "epll_div8", "epll", 1, 8);
51662306a36Sopenharmony_ci
51762306a36Sopenharmony_ci	hws[CA35CLK_MUX] = ma35d1_clk_mux_parent(dev, "ca35clk_mux",
51862306a36Sopenharmony_ci						 clk_base + REG_CLK_CLKSEL0, 0, 2,
51962306a36Sopenharmony_ci						 ca35clk_sel_clks,
52062306a36Sopenharmony_ci						 ARRAY_SIZE(ca35clk_sel_clks));
52162306a36Sopenharmony_ci	hws[AXICLK_DIV2] = ma35d1_clk_fixed_factor(dev, "capll_div2", "ca35clk_mux", 1, 2);
52262306a36Sopenharmony_ci	hws[AXICLK_DIV4] = ma35d1_clk_fixed_factor(dev, "capll_div4", "ca35clk_mux", 1, 4);
52362306a36Sopenharmony_ci
52462306a36Sopenharmony_ci	hws[AXICLK_MUX] = ma35d1_clk_mux(dev, "axiclk_mux", clk_base + REG_CLK_CLKDIV0,
52562306a36Sopenharmony_ci					 26, 1, axiclk_sel_clks,
52662306a36Sopenharmony_ci					 ARRAY_SIZE(axiclk_sel_clks));
52762306a36Sopenharmony_ci	hws[SYSCLK0_MUX] = ma35d1_clk_mux(dev, "sysclk0_mux", clk_base + REG_CLK_CLKSEL0,
52862306a36Sopenharmony_ci					  2, 1, sysclk0_sel_clks,
52962306a36Sopenharmony_ci					  ARRAY_SIZE(sysclk0_sel_clks));
53062306a36Sopenharmony_ci	hws[SYSCLK1_MUX] = ma35d1_clk_mux(dev, "sysclk1_mux", clk_base + REG_CLK_CLKSEL0,
53162306a36Sopenharmony_ci					  4, 1, sysclk1_sel_clks,
53262306a36Sopenharmony_ci					  ARRAY_SIZE(sysclk1_sel_clks));
53362306a36Sopenharmony_ci	hws[SYSCLK1_DIV2] = ma35d1_clk_fixed_factor(dev, "sysclk1_div2", "sysclk1_mux", 1, 2);
53462306a36Sopenharmony_ci
53562306a36Sopenharmony_ci	/* HCLK0~3 & PCLK0~4 */
53662306a36Sopenharmony_ci	hws[HCLK0] = ma35d1_clk_fixed_factor(dev, "hclk0", "sysclk1_mux", 1, 1);
53762306a36Sopenharmony_ci	hws[HCLK1] = ma35d1_clk_fixed_factor(dev, "hclk1", "sysclk1_mux", 1, 1);
53862306a36Sopenharmony_ci	hws[HCLK2] = ma35d1_clk_fixed_factor(dev, "hclk2", "sysclk1_mux", 1, 1);
53962306a36Sopenharmony_ci	hws[PCLK0] = ma35d1_clk_fixed_factor(dev, "pclk0", "sysclk1_mux", 1, 1);
54062306a36Sopenharmony_ci	hws[PCLK1] = ma35d1_clk_fixed_factor(dev, "pclk1", "sysclk1_mux", 1, 1);
54162306a36Sopenharmony_ci	hws[PCLK2] = ma35d1_clk_fixed_factor(dev, "pclk2", "sysclk1_mux", 1, 1);
54262306a36Sopenharmony_ci
54362306a36Sopenharmony_ci	hws[HCLK3] = ma35d1_clk_fixed_factor(dev, "hclk3", "sysclk1_mux", 1, 2);
54462306a36Sopenharmony_ci	hws[PCLK3] = ma35d1_clk_fixed_factor(dev, "pclk3", "sysclk1_mux", 1, 2);
54562306a36Sopenharmony_ci	hws[PCLK4] = ma35d1_clk_fixed_factor(dev, "pclk4", "sysclk1_mux", 1, 2);
54662306a36Sopenharmony_ci
54762306a36Sopenharmony_ci	hws[USBPHY0] = ma35d1_clk_fixed("usbphy0", 480000000);
54862306a36Sopenharmony_ci	hws[USBPHY1] = ma35d1_clk_fixed("usbphy1", 480000000);
54962306a36Sopenharmony_ci
55062306a36Sopenharmony_ci	/* DDR */
55162306a36Sopenharmony_ci	hws[DDR0_GATE] = ma35d1_clk_gate(dev, "ddr0_gate", "ddrpll",
55262306a36Sopenharmony_ci					 clk_base + REG_CLK_SYSCLK0, 4);
55362306a36Sopenharmony_ci	hws[DDR6_GATE] = ma35d1_clk_gate(dev, "ddr6_gate", "ddrpll",
55462306a36Sopenharmony_ci					 clk_base + REG_CLK_SYSCLK0, 5);
55562306a36Sopenharmony_ci
55662306a36Sopenharmony_ci	hws[CAN0_MUX] = ma35d1_clk_mux(dev, "can0_mux", clk_base + REG_CLK_CLKSEL4,
55762306a36Sopenharmony_ci				       16, 1, can_sel_clks, ARRAY_SIZE(can_sel_clks));
55862306a36Sopenharmony_ci	hws[CAN0_DIV] = ma35d1_clk_divider_table(dev, "can0_div", "can0_mux",
55962306a36Sopenharmony_ci						 clk_base + REG_CLK_CLKDIV0,
56062306a36Sopenharmony_ci						 0, 3, ip_div_table);
56162306a36Sopenharmony_ci	hws[CAN0_GATE] = ma35d1_clk_gate(dev, "can0_gate", "can0_div",
56262306a36Sopenharmony_ci					 clk_base + REG_CLK_SYSCLK0, 8);
56362306a36Sopenharmony_ci	hws[CAN1_MUX] = ma35d1_clk_mux(dev, "can1_mux", clk_base + REG_CLK_CLKSEL4,
56462306a36Sopenharmony_ci				       17, 1, can_sel_clks, ARRAY_SIZE(can_sel_clks));
56562306a36Sopenharmony_ci	hws[CAN1_DIV] = ma35d1_clk_divider_table(dev, "can1_div", "can1_mux",
56662306a36Sopenharmony_ci						 clk_base + REG_CLK_CLKDIV0,
56762306a36Sopenharmony_ci						 4, 3, ip_div_table);
56862306a36Sopenharmony_ci	hws[CAN1_GATE] = ma35d1_clk_gate(dev, "can1_gate", "can1_div",
56962306a36Sopenharmony_ci					 clk_base + REG_CLK_SYSCLK0, 9);
57062306a36Sopenharmony_ci	hws[CAN2_MUX] = ma35d1_clk_mux(dev, "can2_mux", clk_base + REG_CLK_CLKSEL4,
57162306a36Sopenharmony_ci				       18, 1, can_sel_clks, ARRAY_SIZE(can_sel_clks));
57262306a36Sopenharmony_ci	hws[CAN2_DIV] = ma35d1_clk_divider_table(dev, "can2_div", "can2_mux",
57362306a36Sopenharmony_ci						 clk_base + REG_CLK_CLKDIV0,
57462306a36Sopenharmony_ci						 8, 3, ip_div_table);
57562306a36Sopenharmony_ci	hws[CAN2_GATE] = ma35d1_clk_gate(dev, "can2_gate", "can2_div",
57662306a36Sopenharmony_ci					 clk_base + REG_CLK_SYSCLK0, 10);
57762306a36Sopenharmony_ci	hws[CAN3_MUX] = ma35d1_clk_mux(dev, "can3_mux", clk_base + REG_CLK_CLKSEL4,
57862306a36Sopenharmony_ci				       19, 1, can_sel_clks, ARRAY_SIZE(can_sel_clks));
57962306a36Sopenharmony_ci	hws[CAN3_DIV] = ma35d1_clk_divider_table(dev, "can3_div", "can3_mux",
58062306a36Sopenharmony_ci						 clk_base + REG_CLK_CLKDIV0,
58162306a36Sopenharmony_ci						 12, 3, ip_div_table);
58262306a36Sopenharmony_ci	hws[CAN3_GATE] = ma35d1_clk_gate(dev, "can3_gate", "can3_div",
58362306a36Sopenharmony_ci					 clk_base + REG_CLK_SYSCLK0, 11);
58462306a36Sopenharmony_ci
58562306a36Sopenharmony_ci	hws[SDH0_MUX] = ma35d1_clk_mux(dev, "sdh0_mux", clk_base + REG_CLK_CLKSEL0,
58662306a36Sopenharmony_ci				       16, 2, sdh_sel_clks, ARRAY_SIZE(sdh_sel_clks));
58762306a36Sopenharmony_ci	hws[SDH0_GATE] = ma35d1_clk_gate(dev, "sdh0_gate", "sdh0_mux",
58862306a36Sopenharmony_ci					 clk_base + REG_CLK_SYSCLK0, 16);
58962306a36Sopenharmony_ci	hws[SDH1_MUX] = ma35d1_clk_mux(dev, "sdh1_mux", clk_base + REG_CLK_CLKSEL0,
59062306a36Sopenharmony_ci				       18, 2, sdh_sel_clks, ARRAY_SIZE(sdh_sel_clks));
59162306a36Sopenharmony_ci	hws[SDH1_GATE] = ma35d1_clk_gate(dev, "sdh1_gate", "sdh1_mux",
59262306a36Sopenharmony_ci					 clk_base + REG_CLK_SYSCLK0, 17);
59362306a36Sopenharmony_ci
59462306a36Sopenharmony_ci	hws[NAND_GATE] = ma35d1_clk_gate(dev, "nand_gate", "hclk1",
59562306a36Sopenharmony_ci					 clk_base + REG_CLK_SYSCLK0, 18);
59662306a36Sopenharmony_ci
59762306a36Sopenharmony_ci	hws[USBD_GATE] = ma35d1_clk_gate(dev, "usbd_gate", "usbphy0",
59862306a36Sopenharmony_ci					 clk_base + REG_CLK_SYSCLK0, 19);
59962306a36Sopenharmony_ci	hws[USBH_GATE] = ma35d1_clk_gate(dev, "usbh_gate", "usbphy0",
60062306a36Sopenharmony_ci					 clk_base + REG_CLK_SYSCLK0, 20);
60162306a36Sopenharmony_ci	hws[HUSBH0_GATE] = ma35d1_clk_gate(dev, "husbh0_gate", "usbphy0",
60262306a36Sopenharmony_ci					   clk_base + REG_CLK_SYSCLK0, 21);
60362306a36Sopenharmony_ci	hws[HUSBH1_GATE] = ma35d1_clk_gate(dev, "husbh1_gate", "usbphy0",
60462306a36Sopenharmony_ci					   clk_base + REG_CLK_SYSCLK0, 22);
60562306a36Sopenharmony_ci
60662306a36Sopenharmony_ci	hws[GFX_MUX] = ma35d1_clk_mux(dev, "gfx_mux", clk_base + REG_CLK_CLKSEL0,
60762306a36Sopenharmony_ci				      26, 1, gfx_sel_clks, ARRAY_SIZE(gfx_sel_clks));
60862306a36Sopenharmony_ci	hws[GFX_GATE] = ma35d1_clk_gate(dev, "gfx_gate", "gfx_mux",
60962306a36Sopenharmony_ci					clk_base + REG_CLK_SYSCLK0, 24);
61062306a36Sopenharmony_ci	hws[VC8K_GATE] = ma35d1_clk_gate(dev, "vc8k_gate", "sysclk0_mux",
61162306a36Sopenharmony_ci					 clk_base + REG_CLK_SYSCLK0, 25);
61262306a36Sopenharmony_ci	hws[DCU_MUX] = ma35d1_clk_mux(dev, "dcu_mux", clk_base + REG_CLK_CLKSEL0,
61362306a36Sopenharmony_ci				      24, 1, dcu_sel_clks, ARRAY_SIZE(dcu_sel_clks));
61462306a36Sopenharmony_ci	hws[DCU_GATE] = ma35d1_clk_gate(dev, "dcu_gate", "dcu_mux",
61562306a36Sopenharmony_ci					clk_base + REG_CLK_SYSCLK0, 26);
61662306a36Sopenharmony_ci	hws[DCUP_DIV] = ma35d1_clk_divider_table(dev, "dcup_div", "vpll",
61762306a36Sopenharmony_ci						 clk_base + REG_CLK_CLKDIV0,
61862306a36Sopenharmony_ci						 16, 3, ip_div_table);
61962306a36Sopenharmony_ci
62062306a36Sopenharmony_ci	hws[EMAC0_GATE] = ma35d1_clk_gate(dev, "emac0_gate", "epll_div2",
62162306a36Sopenharmony_ci					  clk_base + REG_CLK_SYSCLK0, 27);
62262306a36Sopenharmony_ci	hws[EMAC1_GATE] = ma35d1_clk_gate(dev, "emac1_gate", "epll_div2",
62362306a36Sopenharmony_ci					  clk_base + REG_CLK_SYSCLK0, 28);
62462306a36Sopenharmony_ci
62562306a36Sopenharmony_ci	hws[CCAP0_MUX] = ma35d1_clk_mux(dev, "ccap0_mux", clk_base + REG_CLK_CLKSEL0,
62662306a36Sopenharmony_ci					12, 1, ccap_sel_clks, ARRAY_SIZE(ccap_sel_clks));
62762306a36Sopenharmony_ci	hws[CCAP0_DIV] = ma35d1_clk_divider(dev, "ccap0_div", "ccap0_mux",
62862306a36Sopenharmony_ci					    clk_base + REG_CLK_CLKDIV1, 8, 4);
62962306a36Sopenharmony_ci	hws[CCAP0_GATE] = ma35d1_clk_gate(dev, "ccap0_gate", "ccap0_div",
63062306a36Sopenharmony_ci					  clk_base + REG_CLK_SYSCLK0, 29);
63162306a36Sopenharmony_ci	hws[CCAP1_MUX] = ma35d1_clk_mux(dev, "ccap1_mux", clk_base + REG_CLK_CLKSEL0,
63262306a36Sopenharmony_ci					14, 1, ccap_sel_clks, ARRAY_SIZE(ccap_sel_clks));
63362306a36Sopenharmony_ci	hws[CCAP1_DIV] = ma35d1_clk_divider(dev, "ccap1_div", "ccap1_mux",
63462306a36Sopenharmony_ci					    clk_base + REG_CLK_CLKDIV1,
63562306a36Sopenharmony_ci					    12, 4);
63662306a36Sopenharmony_ci	hws[CCAP1_GATE] = ma35d1_clk_gate(dev, "ccap1_gate", "ccap1_div",
63762306a36Sopenharmony_ci					  clk_base + REG_CLK_SYSCLK0, 30);
63862306a36Sopenharmony_ci
63962306a36Sopenharmony_ci	hws[PDMA0_GATE] = ma35d1_clk_gate(dev, "pdma0_gate", "hclk0",
64062306a36Sopenharmony_ci					  clk_base + REG_CLK_SYSCLK1, 0);
64162306a36Sopenharmony_ci	hws[PDMA1_GATE] = ma35d1_clk_gate(dev, "pdma1_gate", "hclk0",
64262306a36Sopenharmony_ci					  clk_base + REG_CLK_SYSCLK1, 1);
64362306a36Sopenharmony_ci	hws[PDMA2_GATE] = ma35d1_clk_gate(dev, "pdma2_gate", "hclk0",
64462306a36Sopenharmony_ci					  clk_base + REG_CLK_SYSCLK1, 2);
64562306a36Sopenharmony_ci	hws[PDMA3_GATE] = ma35d1_clk_gate(dev, "pdma3_gate", "hclk0",
64662306a36Sopenharmony_ci					  clk_base + REG_CLK_SYSCLK1, 3);
64762306a36Sopenharmony_ci
64862306a36Sopenharmony_ci	hws[WH0_GATE] = ma35d1_clk_gate(dev, "wh0_gate", "hclk0",
64962306a36Sopenharmony_ci					clk_base + REG_CLK_SYSCLK1, 4);
65062306a36Sopenharmony_ci	hws[WH1_GATE] = ma35d1_clk_gate(dev, "wh1_gate", "hclk0",
65162306a36Sopenharmony_ci					clk_base + REG_CLK_SYSCLK1, 5);
65262306a36Sopenharmony_ci
65362306a36Sopenharmony_ci	hws[HWS_GATE] = ma35d1_clk_gate(dev, "hws_gate", "hclk0",
65462306a36Sopenharmony_ci					clk_base + REG_CLK_SYSCLK1, 6);
65562306a36Sopenharmony_ci
65662306a36Sopenharmony_ci	hws[EBI_GATE] = ma35d1_clk_gate(dev, "ebi_gate", "hclk0",
65762306a36Sopenharmony_ci					clk_base + REG_CLK_SYSCLK1, 7);
65862306a36Sopenharmony_ci
65962306a36Sopenharmony_ci	hws[SRAM0_GATE] = ma35d1_clk_gate(dev, "sram0_gate", "hclk0",
66062306a36Sopenharmony_ci					  clk_base + REG_CLK_SYSCLK1, 8);
66162306a36Sopenharmony_ci	hws[SRAM1_GATE] = ma35d1_clk_gate(dev, "sram1_gate", "hclk0",
66262306a36Sopenharmony_ci					  clk_base + REG_CLK_SYSCLK1, 9);
66362306a36Sopenharmony_ci
66462306a36Sopenharmony_ci	hws[ROM_GATE] = ma35d1_clk_gate(dev, "rom_gate", "hclk0",
66562306a36Sopenharmony_ci					clk_base + REG_CLK_SYSCLK1, 10);
66662306a36Sopenharmony_ci
66762306a36Sopenharmony_ci	hws[TRA_GATE] = ma35d1_clk_gate(dev, "tra_gate", "hclk0",
66862306a36Sopenharmony_ci					clk_base + REG_CLK_SYSCLK1, 11);
66962306a36Sopenharmony_ci
67062306a36Sopenharmony_ci	hws[DBG_MUX] = ma35d1_clk_mux(dev, "dbg_mux", clk_base + REG_CLK_CLKSEL0,
67162306a36Sopenharmony_ci				      27, 1, dbg_sel_clks, ARRAY_SIZE(dbg_sel_clks));
67262306a36Sopenharmony_ci	hws[DBG_GATE] = ma35d1_clk_gate(dev, "dbg_gate", "hclk0",
67362306a36Sopenharmony_ci					clk_base + REG_CLK_SYSCLK1, 12);
67462306a36Sopenharmony_ci
67562306a36Sopenharmony_ci	hws[CKO_MUX] = ma35d1_clk_mux(dev, "cko_mux", clk_base + REG_CLK_CLKSEL4,
67662306a36Sopenharmony_ci				      24, 4, cko_sel_clks, ARRAY_SIZE(cko_sel_clks));
67762306a36Sopenharmony_ci	hws[CKO_DIV] = ma35d1_clk_divider_pow2(dev, "cko_div", "cko_mux",
67862306a36Sopenharmony_ci					       clk_base + REG_CLK_CLKOCTL, 0, 4);
67962306a36Sopenharmony_ci	hws[CKO_GATE] = ma35d1_clk_gate(dev, "cko_gate", "cko_div",
68062306a36Sopenharmony_ci					clk_base + REG_CLK_SYSCLK1, 13);
68162306a36Sopenharmony_ci
68262306a36Sopenharmony_ci	hws[GTMR_GATE] = ma35d1_clk_gate(dev, "gtmr_gate", "hirc",
68362306a36Sopenharmony_ci					 clk_base + REG_CLK_SYSCLK1, 14);
68462306a36Sopenharmony_ci
68562306a36Sopenharmony_ci	hws[GPA_GATE] = ma35d1_clk_gate(dev, "gpa_gate", "hclk0",
68662306a36Sopenharmony_ci					clk_base + REG_CLK_SYSCLK1, 16);
68762306a36Sopenharmony_ci	hws[GPB_GATE] = ma35d1_clk_gate(dev, "gpb_gate", "hclk0",
68862306a36Sopenharmony_ci					clk_base + REG_CLK_SYSCLK1, 17);
68962306a36Sopenharmony_ci	hws[GPC_GATE] = ma35d1_clk_gate(dev, "gpc_gate", "hclk0",
69062306a36Sopenharmony_ci					clk_base + REG_CLK_SYSCLK1, 18);
69162306a36Sopenharmony_ci	hws[GPD_GATE] = ma35d1_clk_gate(dev, "gpd_gate", "hclk0",
69262306a36Sopenharmony_ci					clk_base + REG_CLK_SYSCLK1, 19);
69362306a36Sopenharmony_ci	hws[GPE_GATE] = ma35d1_clk_gate(dev, "gpe_gate", "hclk0",
69462306a36Sopenharmony_ci					clk_base + REG_CLK_SYSCLK1, 20);
69562306a36Sopenharmony_ci	hws[GPF_GATE] = ma35d1_clk_gate(dev, "gpf_gate", "hclk0",
69662306a36Sopenharmony_ci					clk_base + REG_CLK_SYSCLK1, 21);
69762306a36Sopenharmony_ci	hws[GPG_GATE] = ma35d1_clk_gate(dev, "gpg_gate", "hclk0",
69862306a36Sopenharmony_ci					clk_base + REG_CLK_SYSCLK1, 22);
69962306a36Sopenharmony_ci	hws[GPH_GATE] = ma35d1_clk_gate(dev, "gph_gate", "hclk0",
70062306a36Sopenharmony_ci					clk_base + REG_CLK_SYSCLK1, 23);
70162306a36Sopenharmony_ci	hws[GPI_GATE] = ma35d1_clk_gate(dev, "gpi_gate", "hclk0",
70262306a36Sopenharmony_ci					clk_base + REG_CLK_SYSCLK1, 24);
70362306a36Sopenharmony_ci	hws[GPJ_GATE] = ma35d1_clk_gate(dev, "gpj_gate", "hclk0",
70462306a36Sopenharmony_ci					clk_base + REG_CLK_SYSCLK1, 25);
70562306a36Sopenharmony_ci	hws[GPK_GATE] = ma35d1_clk_gate(dev, "gpk_gate", "hclk0",
70662306a36Sopenharmony_ci					clk_base + REG_CLK_SYSCLK1, 26);
70762306a36Sopenharmony_ci	hws[GPL_GATE] = ma35d1_clk_gate(dev, "gpl_gate", "hclk0",
70862306a36Sopenharmony_ci					clk_base + REG_CLK_SYSCLK1, 27);
70962306a36Sopenharmony_ci	hws[GPM_GATE] = ma35d1_clk_gate(dev, "gpm_gate", "hclk0",
71062306a36Sopenharmony_ci					clk_base + REG_CLK_SYSCLK1, 28);
71162306a36Sopenharmony_ci	hws[GPN_GATE] = ma35d1_clk_gate(dev, "gpn_gate", "hclk0",
71262306a36Sopenharmony_ci					clk_base + REG_CLK_SYSCLK1, 29);
71362306a36Sopenharmony_ci
71462306a36Sopenharmony_ci	hws[TMR0_MUX] = ma35d1_clk_mux(dev, "tmr0_mux", clk_base + REG_CLK_CLKSEL1,
71562306a36Sopenharmony_ci				       0, 3, timer0_sel_clks,
71662306a36Sopenharmony_ci				       ARRAY_SIZE(timer0_sel_clks));
71762306a36Sopenharmony_ci	hws[TMR0_GATE] = ma35d1_clk_gate(dev, "tmr0_gate", "tmr0_mux",
71862306a36Sopenharmony_ci					 clk_base + REG_CLK_APBCLK0, 0);
71962306a36Sopenharmony_ci	hws[TMR1_MUX] = ma35d1_clk_mux(dev, "tmr1_mux", clk_base + REG_CLK_CLKSEL1,
72062306a36Sopenharmony_ci				       4, 3, timer1_sel_clks,
72162306a36Sopenharmony_ci				       ARRAY_SIZE(timer1_sel_clks));
72262306a36Sopenharmony_ci	hws[TMR1_GATE] = ma35d1_clk_gate(dev, "tmr1_gate", "tmr1_mux",
72362306a36Sopenharmony_ci					 clk_base + REG_CLK_APBCLK0, 1);
72462306a36Sopenharmony_ci	hws[TMR2_MUX] = ma35d1_clk_mux(dev, "tmr2_mux", clk_base + REG_CLK_CLKSEL1,
72562306a36Sopenharmony_ci				       8, 3, timer2_sel_clks,
72662306a36Sopenharmony_ci				       ARRAY_SIZE(timer2_sel_clks));
72762306a36Sopenharmony_ci	hws[TMR2_GATE] = ma35d1_clk_gate(dev, "tmr2_gate", "tmr2_mux",
72862306a36Sopenharmony_ci					 clk_base + REG_CLK_APBCLK0, 2);
72962306a36Sopenharmony_ci	hws[TMR3_MUX] = ma35d1_clk_mux(dev, "tmr3_mux", clk_base + REG_CLK_CLKSEL1,
73062306a36Sopenharmony_ci				       12, 3, timer3_sel_clks,
73162306a36Sopenharmony_ci				       ARRAY_SIZE(timer3_sel_clks));
73262306a36Sopenharmony_ci	hws[TMR3_GATE] = ma35d1_clk_gate(dev, "tmr3_gate", "tmr3_mux",
73362306a36Sopenharmony_ci					 clk_base + REG_CLK_APBCLK0, 3);
73462306a36Sopenharmony_ci	hws[TMR4_MUX] = ma35d1_clk_mux(dev, "tmr4_mux", clk_base + REG_CLK_CLKSEL1,
73562306a36Sopenharmony_ci				       16, 3, timer4_sel_clks,
73662306a36Sopenharmony_ci				       ARRAY_SIZE(timer4_sel_clks));
73762306a36Sopenharmony_ci	hws[TMR4_GATE] = ma35d1_clk_gate(dev, "tmr4_gate", "tmr4_mux",
73862306a36Sopenharmony_ci					 clk_base + REG_CLK_APBCLK0, 4);
73962306a36Sopenharmony_ci	hws[TMR5_MUX] = ma35d1_clk_mux(dev, "tmr5_mux", clk_base + REG_CLK_CLKSEL1,
74062306a36Sopenharmony_ci				       20, 3, timer5_sel_clks,
74162306a36Sopenharmony_ci				       ARRAY_SIZE(timer5_sel_clks));
74262306a36Sopenharmony_ci	hws[TMR5_GATE] = ma35d1_clk_gate(dev, "tmr5_gate", "tmr5_mux",
74362306a36Sopenharmony_ci					 clk_base + REG_CLK_APBCLK0, 5);
74462306a36Sopenharmony_ci	hws[TMR6_MUX] = ma35d1_clk_mux(dev, "tmr6_mux", clk_base + REG_CLK_CLKSEL1,
74562306a36Sopenharmony_ci				       24, 3, timer6_sel_clks,
74662306a36Sopenharmony_ci				       ARRAY_SIZE(timer6_sel_clks));
74762306a36Sopenharmony_ci	hws[TMR6_GATE] = ma35d1_clk_gate(dev, "tmr6_gate", "tmr6_mux",
74862306a36Sopenharmony_ci					 clk_base + REG_CLK_APBCLK0, 6);
74962306a36Sopenharmony_ci	hws[TMR7_MUX] = ma35d1_clk_mux(dev, "tmr7_mux", clk_base + REG_CLK_CLKSEL1,
75062306a36Sopenharmony_ci				       28, 3, timer7_sel_clks,
75162306a36Sopenharmony_ci				       ARRAY_SIZE(timer7_sel_clks));
75262306a36Sopenharmony_ci	hws[TMR7_GATE] = ma35d1_clk_gate(dev, "tmr7_gate", "tmr7_mux",
75362306a36Sopenharmony_ci					 clk_base + REG_CLK_APBCLK0, 7);
75462306a36Sopenharmony_ci	hws[TMR8_MUX] = ma35d1_clk_mux(dev, "tmr8_mux", clk_base + REG_CLK_CLKSEL2,
75562306a36Sopenharmony_ci				       0, 3, timer8_sel_clks,
75662306a36Sopenharmony_ci				       ARRAY_SIZE(timer8_sel_clks));
75762306a36Sopenharmony_ci	hws[TMR8_GATE] = ma35d1_clk_gate(dev, "tmr8_gate", "tmr8_mux",
75862306a36Sopenharmony_ci					 clk_base + REG_CLK_APBCLK0, 8);
75962306a36Sopenharmony_ci	hws[TMR9_MUX] = ma35d1_clk_mux(dev, "tmr9_mux", clk_base + REG_CLK_CLKSEL2,
76062306a36Sopenharmony_ci				       4, 3, timer9_sel_clks,
76162306a36Sopenharmony_ci				       ARRAY_SIZE(timer9_sel_clks));
76262306a36Sopenharmony_ci	hws[TMR9_GATE] = ma35d1_clk_gate(dev, "tmr9_gate", "tmr9_mux",
76362306a36Sopenharmony_ci					 clk_base + REG_CLK_APBCLK0, 9);
76462306a36Sopenharmony_ci	hws[TMR10_MUX] = ma35d1_clk_mux(dev, "tmr10_mux", clk_base + REG_CLK_CLKSEL2,
76562306a36Sopenharmony_ci					8, 3, timer10_sel_clks,
76662306a36Sopenharmony_ci					ARRAY_SIZE(timer10_sel_clks));
76762306a36Sopenharmony_ci	hws[TMR10_GATE] = ma35d1_clk_gate(dev, "tmr10_gate", "tmr10_mux",
76862306a36Sopenharmony_ci					  clk_base + REG_CLK_APBCLK0, 10);
76962306a36Sopenharmony_ci	hws[TMR11_MUX] = ma35d1_clk_mux(dev, "tmr11_mux", clk_base + REG_CLK_CLKSEL2,
77062306a36Sopenharmony_ci					12, 3, timer11_sel_clks,
77162306a36Sopenharmony_ci					ARRAY_SIZE(timer11_sel_clks));
77262306a36Sopenharmony_ci	hws[TMR11_GATE] = ma35d1_clk_gate(dev, "tmr11_gate", "tmr11_mux",
77362306a36Sopenharmony_ci					  clk_base + REG_CLK_APBCLK0, 11);
77462306a36Sopenharmony_ci
77562306a36Sopenharmony_ci	hws[UART0_MUX] = ma35d1_clk_mux(dev, "uart0_mux", clk_base + REG_CLK_CLKSEL2,
77662306a36Sopenharmony_ci					16, 2, uart_sel_clks, ARRAY_SIZE(uart_sel_clks));
77762306a36Sopenharmony_ci	hws[UART0_DIV] = ma35d1_clk_divider(dev, "uart0_div", "uart0_mux",
77862306a36Sopenharmony_ci					    clk_base + REG_CLK_CLKDIV1,
77962306a36Sopenharmony_ci					    16, 4);
78062306a36Sopenharmony_ci	hws[UART0_GATE] = ma35d1_clk_gate(dev, "uart0_gate", "uart0_div",
78162306a36Sopenharmony_ci					  clk_base + REG_CLK_APBCLK0, 12);
78262306a36Sopenharmony_ci	hws[UART1_MUX] = ma35d1_clk_mux(dev, "uart1_mux", clk_base + REG_CLK_CLKSEL2,
78362306a36Sopenharmony_ci					18, 2, uart_sel_clks, ARRAY_SIZE(uart_sel_clks));
78462306a36Sopenharmony_ci	hws[UART1_DIV] = ma35d1_clk_divider(dev, "uart1_div", "uart1_mux",
78562306a36Sopenharmony_ci					    clk_base + REG_CLK_CLKDIV1,
78662306a36Sopenharmony_ci					    20, 4);
78762306a36Sopenharmony_ci	hws[UART1_GATE] = ma35d1_clk_gate(dev, "uart1_gate", "uart1_div",
78862306a36Sopenharmony_ci					  clk_base + REG_CLK_APBCLK0, 13);
78962306a36Sopenharmony_ci	hws[UART2_MUX] = ma35d1_clk_mux(dev, "uart2_mux", clk_base + REG_CLK_CLKSEL2,
79062306a36Sopenharmony_ci					20, 2, uart_sel_clks, ARRAY_SIZE(uart_sel_clks));
79162306a36Sopenharmony_ci	hws[UART2_DIV] = ma35d1_clk_divider(dev, "uart2_div", "uart2_mux",
79262306a36Sopenharmony_ci					    clk_base + REG_CLK_CLKDIV1,
79362306a36Sopenharmony_ci					    24, 4);
79462306a36Sopenharmony_ci	hws[UART2_GATE] = ma35d1_clk_gate(dev, "uart2_gate", "uart2_div",
79562306a36Sopenharmony_ci					  clk_base + REG_CLK_APBCLK0, 14);
79662306a36Sopenharmony_ci	hws[UART3_MUX] = ma35d1_clk_mux(dev, "uart3_mux", clk_base + REG_CLK_CLKSEL2,
79762306a36Sopenharmony_ci					22, 2, uart_sel_clks, ARRAY_SIZE(uart_sel_clks));
79862306a36Sopenharmony_ci	hws[UART3_DIV] = ma35d1_clk_divider(dev, "uart3_div", "uart3_mux",
79962306a36Sopenharmony_ci					    clk_base + REG_CLK_CLKDIV1,
80062306a36Sopenharmony_ci					    28, 4);
80162306a36Sopenharmony_ci	hws[UART3_GATE] = ma35d1_clk_gate(dev, "uart3_gate", "uart3_div",
80262306a36Sopenharmony_ci					  clk_base + REG_CLK_APBCLK0, 15);
80362306a36Sopenharmony_ci	hws[UART4_MUX] = ma35d1_clk_mux(dev, "uart4_mux", clk_base + REG_CLK_CLKSEL2,
80462306a36Sopenharmony_ci					24, 2, uart_sel_clks, ARRAY_SIZE(uart_sel_clks));
80562306a36Sopenharmony_ci	hws[UART4_DIV] = ma35d1_clk_divider(dev, "uart4_div", "uart4_mux",
80662306a36Sopenharmony_ci					    clk_base + REG_CLK_CLKDIV2,
80762306a36Sopenharmony_ci					    0, 4);
80862306a36Sopenharmony_ci	hws[UART4_GATE] = ma35d1_clk_gate(dev, "uart4_gate", "uart4_div",
80962306a36Sopenharmony_ci					  clk_base + REG_CLK_APBCLK0, 16);
81062306a36Sopenharmony_ci	hws[UART5_MUX] = ma35d1_clk_mux(dev, "uart5_mux", clk_base + REG_CLK_CLKSEL2,
81162306a36Sopenharmony_ci					26, 2, uart_sel_clks, ARRAY_SIZE(uart_sel_clks));
81262306a36Sopenharmony_ci	hws[UART5_DIV] = ma35d1_clk_divider(dev, "uart5_div", "uart5_mux",
81362306a36Sopenharmony_ci					    clk_base + REG_CLK_CLKDIV2,
81462306a36Sopenharmony_ci					    4, 4);
81562306a36Sopenharmony_ci	hws[UART5_GATE] = ma35d1_clk_gate(dev, "uart5_gate", "uart5_div",
81662306a36Sopenharmony_ci					  clk_base + REG_CLK_APBCLK0, 17);
81762306a36Sopenharmony_ci	hws[UART6_MUX] = ma35d1_clk_mux(dev, "uart6_mux", clk_base + REG_CLK_CLKSEL2,
81862306a36Sopenharmony_ci					28, 2, uart_sel_clks, ARRAY_SIZE(uart_sel_clks));
81962306a36Sopenharmony_ci	hws[UART6_DIV] = ma35d1_clk_divider(dev, "uart6_div", "uart6_mux",
82062306a36Sopenharmony_ci					    clk_base + REG_CLK_CLKDIV2,
82162306a36Sopenharmony_ci					    8, 4);
82262306a36Sopenharmony_ci	hws[UART6_GATE] = ma35d1_clk_gate(dev, "uart6_gate", "uart6_div",
82362306a36Sopenharmony_ci					  clk_base + REG_CLK_APBCLK0, 18);
82462306a36Sopenharmony_ci	hws[UART7_MUX] = ma35d1_clk_mux(dev, "uart7_mux", clk_base + REG_CLK_CLKSEL2,
82562306a36Sopenharmony_ci					30, 2, uart_sel_clks, ARRAY_SIZE(uart_sel_clks));
82662306a36Sopenharmony_ci	hws[UART7_DIV] = ma35d1_clk_divider(dev, "uart7_div", "uart7_mux",
82762306a36Sopenharmony_ci					    clk_base + REG_CLK_CLKDIV2,
82862306a36Sopenharmony_ci					    12, 4);
82962306a36Sopenharmony_ci	hws[UART7_GATE] = ma35d1_clk_gate(dev, "uart7_gate", "uart7_div",
83062306a36Sopenharmony_ci					  clk_base + REG_CLK_APBCLK0, 19);
83162306a36Sopenharmony_ci	hws[UART8_MUX] = ma35d1_clk_mux(dev, "uart8_mux", clk_base + REG_CLK_CLKSEL3,
83262306a36Sopenharmony_ci					0, 2, uart_sel_clks, ARRAY_SIZE(uart_sel_clks));
83362306a36Sopenharmony_ci	hws[UART8_DIV] = ma35d1_clk_divider(dev, "uart8_div", "uart8_mux",
83462306a36Sopenharmony_ci					    clk_base + REG_CLK_CLKDIV2,
83562306a36Sopenharmony_ci					    16, 4);
83662306a36Sopenharmony_ci	hws[UART8_GATE] = ma35d1_clk_gate(dev, "uart8_gate", "uart8_div",
83762306a36Sopenharmony_ci					  clk_base + REG_CLK_APBCLK0, 20);
83862306a36Sopenharmony_ci	hws[UART9_MUX] = ma35d1_clk_mux(dev, "uart9_mux", clk_base + REG_CLK_CLKSEL3,
83962306a36Sopenharmony_ci					2, 2, uart_sel_clks, ARRAY_SIZE(uart_sel_clks));
84062306a36Sopenharmony_ci	hws[UART9_DIV] = ma35d1_clk_divider(dev, "uart9_div", "uart9_mux",
84162306a36Sopenharmony_ci					    clk_base + REG_CLK_CLKDIV2,
84262306a36Sopenharmony_ci					    20, 4);
84362306a36Sopenharmony_ci	hws[UART9_GATE] = ma35d1_clk_gate(dev, "uart9_gate", "uart9_div",
84462306a36Sopenharmony_ci					  clk_base + REG_CLK_APBCLK0, 21);
84562306a36Sopenharmony_ci	hws[UART10_MUX] = ma35d1_clk_mux(dev, "uart10_mux", clk_base + REG_CLK_CLKSEL3,
84662306a36Sopenharmony_ci					 4, 2, uart_sel_clks, ARRAY_SIZE(uart_sel_clks));
84762306a36Sopenharmony_ci	hws[UART10_DIV] = ma35d1_clk_divider(dev, "uart10_div", "uart10_mux",
84862306a36Sopenharmony_ci					     clk_base + REG_CLK_CLKDIV2,
84962306a36Sopenharmony_ci					     24, 4);
85062306a36Sopenharmony_ci	hws[UART10_GATE] = ma35d1_clk_gate(dev, "uart10_gate", "uart10_div",
85162306a36Sopenharmony_ci					   clk_base + REG_CLK_APBCLK0, 22);
85262306a36Sopenharmony_ci	hws[UART11_MUX] = ma35d1_clk_mux(dev, "uart11_mux", clk_base + REG_CLK_CLKSEL3,
85362306a36Sopenharmony_ci					 6, 2, uart_sel_clks, ARRAY_SIZE(uart_sel_clks));
85462306a36Sopenharmony_ci	hws[UART11_DIV] = ma35d1_clk_divider(dev, "uart11_div", "uart11_mux",
85562306a36Sopenharmony_ci					     clk_base + REG_CLK_CLKDIV2,
85662306a36Sopenharmony_ci					     28, 4);
85762306a36Sopenharmony_ci	hws[UART11_GATE] = ma35d1_clk_gate(dev, "uart11_gate", "uart11_div",
85862306a36Sopenharmony_ci					   clk_base + REG_CLK_APBCLK0, 23);
85962306a36Sopenharmony_ci	hws[UART12_MUX] = ma35d1_clk_mux(dev, "uart12_mux", clk_base + REG_CLK_CLKSEL3,
86062306a36Sopenharmony_ci					 8, 2, uart_sel_clks, ARRAY_SIZE(uart_sel_clks));
86162306a36Sopenharmony_ci	hws[UART12_DIV] = ma35d1_clk_divider(dev, "uart12_div", "uart12_mux",
86262306a36Sopenharmony_ci					     clk_base + REG_CLK_CLKDIV3,
86362306a36Sopenharmony_ci					     0, 4);
86462306a36Sopenharmony_ci	hws[UART12_GATE] = ma35d1_clk_gate(dev, "uart12_gate", "uart12_div",
86562306a36Sopenharmony_ci					   clk_base + REG_CLK_APBCLK0, 24);
86662306a36Sopenharmony_ci	hws[UART13_MUX] = ma35d1_clk_mux(dev, "uart13_mux", clk_base + REG_CLK_CLKSEL3,
86762306a36Sopenharmony_ci					 10, 2, uart_sel_clks, ARRAY_SIZE(uart_sel_clks));
86862306a36Sopenharmony_ci	hws[UART13_DIV] = ma35d1_clk_divider(dev, "uart13_div", "uart13_mux",
86962306a36Sopenharmony_ci					     clk_base + REG_CLK_CLKDIV3,
87062306a36Sopenharmony_ci					     4, 4);
87162306a36Sopenharmony_ci	hws[UART13_GATE] = ma35d1_clk_gate(dev, "uart13_gate", "uart13_div",
87262306a36Sopenharmony_ci					   clk_base + REG_CLK_APBCLK0, 25);
87362306a36Sopenharmony_ci	hws[UART14_MUX] = ma35d1_clk_mux(dev, "uart14_mux", clk_base + REG_CLK_CLKSEL3,
87462306a36Sopenharmony_ci					 12, 2, uart_sel_clks, ARRAY_SIZE(uart_sel_clks));
87562306a36Sopenharmony_ci	hws[UART14_DIV] = ma35d1_clk_divider(dev, "uart14_div", "uart14_mux",
87662306a36Sopenharmony_ci					     clk_base + REG_CLK_CLKDIV3,
87762306a36Sopenharmony_ci					     8, 4);
87862306a36Sopenharmony_ci	hws[UART14_GATE] = ma35d1_clk_gate(dev, "uart14_gate", "uart14_div",
87962306a36Sopenharmony_ci					   clk_base + REG_CLK_APBCLK0, 26);
88062306a36Sopenharmony_ci	hws[UART15_MUX] = ma35d1_clk_mux(dev, "uart15_mux", clk_base + REG_CLK_CLKSEL3,
88162306a36Sopenharmony_ci					 14, 2, uart_sel_clks, ARRAY_SIZE(uart_sel_clks));
88262306a36Sopenharmony_ci	hws[UART15_DIV] = ma35d1_clk_divider(dev, "uart15_div", "uart15_mux",
88362306a36Sopenharmony_ci					     clk_base + REG_CLK_CLKDIV3,
88462306a36Sopenharmony_ci					     12, 4);
88562306a36Sopenharmony_ci	hws[UART15_GATE] = ma35d1_clk_gate(dev, "uart15_gate", "uart15_div",
88662306a36Sopenharmony_ci					   clk_base + REG_CLK_APBCLK0, 27);
88762306a36Sopenharmony_ci	hws[UART16_MUX] = ma35d1_clk_mux(dev, "uart16_mux", clk_base + REG_CLK_CLKSEL3,
88862306a36Sopenharmony_ci					 16, 2, uart_sel_clks, ARRAY_SIZE(uart_sel_clks));
88962306a36Sopenharmony_ci	hws[UART16_DIV] = ma35d1_clk_divider(dev, "uart16_div", "uart16_mux",
89062306a36Sopenharmony_ci					     clk_base + REG_CLK_CLKDIV3,
89162306a36Sopenharmony_ci					     16, 4);
89262306a36Sopenharmony_ci	hws[UART16_GATE] = ma35d1_clk_gate(dev, "uart16_gate", "uart16_div",
89362306a36Sopenharmony_ci					   clk_base + REG_CLK_APBCLK0, 28);
89462306a36Sopenharmony_ci
89562306a36Sopenharmony_ci	hws[RTC_GATE] = ma35d1_clk_gate(dev, "rtc_gate", "lxt",
89662306a36Sopenharmony_ci					clk_base + REG_CLK_APBCLK0, 29);
89762306a36Sopenharmony_ci	hws[DDR_GATE] = ma35d1_clk_gate(dev, "ddr_gate", "ddrpll",
89862306a36Sopenharmony_ci					clk_base + REG_CLK_APBCLK0, 30);
89962306a36Sopenharmony_ci
90062306a36Sopenharmony_ci	hws[KPI_MUX] = ma35d1_clk_mux(dev, "kpi_mux", clk_base + REG_CLK_CLKSEL4,
90162306a36Sopenharmony_ci				      30, 1, kpi_sel_clks, ARRAY_SIZE(kpi_sel_clks));
90262306a36Sopenharmony_ci	hws[KPI_DIV] = ma35d1_clk_divider(dev, "kpi_div", "kpi_mux",
90362306a36Sopenharmony_ci					  clk_base + REG_CLK_CLKDIV4,
90462306a36Sopenharmony_ci					  24, 8);
90562306a36Sopenharmony_ci	hws[KPI_GATE] = ma35d1_clk_gate(dev, "kpi_gate", "kpi_div",
90662306a36Sopenharmony_ci					clk_base + REG_CLK_APBCLK0, 31);
90762306a36Sopenharmony_ci
90862306a36Sopenharmony_ci	hws[I2C0_GATE] = ma35d1_clk_gate(dev, "i2c0_gate", "pclk0",
90962306a36Sopenharmony_ci					 clk_base + REG_CLK_APBCLK1, 0);
91062306a36Sopenharmony_ci	hws[I2C1_GATE] = ma35d1_clk_gate(dev, "i2c1_gate", "pclk1",
91162306a36Sopenharmony_ci					 clk_base + REG_CLK_APBCLK1, 1);
91262306a36Sopenharmony_ci	hws[I2C2_GATE] = ma35d1_clk_gate(dev, "i2c2_gate", "pclk2",
91362306a36Sopenharmony_ci					 clk_base + REG_CLK_APBCLK1, 2);
91462306a36Sopenharmony_ci	hws[I2C3_GATE] = ma35d1_clk_gate(dev, "i2c3_gate", "pclk0",
91562306a36Sopenharmony_ci					 clk_base + REG_CLK_APBCLK1, 3);
91662306a36Sopenharmony_ci	hws[I2C4_GATE] = ma35d1_clk_gate(dev, "i2c4_gate", "pclk1",
91762306a36Sopenharmony_ci					 clk_base + REG_CLK_APBCLK1, 4);
91862306a36Sopenharmony_ci	hws[I2C5_GATE] = ma35d1_clk_gate(dev, "i2c5_gate", "pclk2",
91962306a36Sopenharmony_ci					 clk_base + REG_CLK_APBCLK1, 5);
92062306a36Sopenharmony_ci
92162306a36Sopenharmony_ci	hws[QSPI0_MUX] = ma35d1_clk_mux(dev, "qspi0_mux", clk_base + REG_CLK_CLKSEL4,
92262306a36Sopenharmony_ci					8, 2, qspi0_sel_clks, ARRAY_SIZE(qspi0_sel_clks));
92362306a36Sopenharmony_ci	hws[QSPI0_GATE] = ma35d1_clk_gate(dev, "qspi0_gate", "qspi0_mux",
92462306a36Sopenharmony_ci					  clk_base + REG_CLK_APBCLK1, 6);
92562306a36Sopenharmony_ci	hws[QSPI1_MUX] = ma35d1_clk_mux(dev, "qspi1_mux", clk_base + REG_CLK_CLKSEL4,
92662306a36Sopenharmony_ci					10, 2, qspi1_sel_clks, ARRAY_SIZE(qspi1_sel_clks));
92762306a36Sopenharmony_ci	hws[QSPI1_GATE] = ma35d1_clk_gate(dev, "qspi1_gate", "qspi1_mux",
92862306a36Sopenharmony_ci					  clk_base + REG_CLK_APBCLK1, 7);
92962306a36Sopenharmony_ci
93062306a36Sopenharmony_ci	hws[SMC0_MUX] = ma35d1_clk_mux(dev, "smc0_mux", clk_base + REG_CLK_CLKSEL4,
93162306a36Sopenharmony_ci					28, 1, smc_sel_clks, ARRAY_SIZE(smc_sel_clks));
93262306a36Sopenharmony_ci	hws[SMC0_DIV] = ma35d1_clk_divider(dev, "smc0_div", "smc0_mux",
93362306a36Sopenharmony_ci					   clk_base + REG_CLK_CLKDIV1,
93462306a36Sopenharmony_ci					   0, 4);
93562306a36Sopenharmony_ci	hws[SMC0_GATE] = ma35d1_clk_gate(dev, "smc0_gate", "smc0_div",
93662306a36Sopenharmony_ci					 clk_base + REG_CLK_APBCLK1, 12);
93762306a36Sopenharmony_ci	hws[SMC1_MUX] = ma35d1_clk_mux(dev, "smc1_mux", clk_base + REG_CLK_CLKSEL4,
93862306a36Sopenharmony_ci					 29, 1, smc_sel_clks, ARRAY_SIZE(smc_sel_clks));
93962306a36Sopenharmony_ci	hws[SMC1_DIV] = ma35d1_clk_divider(dev, "smc1_div", "smc1_mux",
94062306a36Sopenharmony_ci					   clk_base + REG_CLK_CLKDIV1,
94162306a36Sopenharmony_ci					   4, 4);
94262306a36Sopenharmony_ci	hws[SMC1_GATE] = ma35d1_clk_gate(dev, "smc1_gate", "smc1_div",
94362306a36Sopenharmony_ci					 clk_base + REG_CLK_APBCLK1, 13);
94462306a36Sopenharmony_ci
94562306a36Sopenharmony_ci	hws[WDT0_MUX] = ma35d1_clk_mux(dev, "wdt0_mux", clk_base + REG_CLK_CLKSEL3,
94662306a36Sopenharmony_ci				       20, 2, wdt0_sel_clks, ARRAY_SIZE(wdt0_sel_clks));
94762306a36Sopenharmony_ci	hws[WDT0_GATE] = ma35d1_clk_gate(dev, "wdt0_gate", "wdt0_mux",
94862306a36Sopenharmony_ci					 clk_base + REG_CLK_APBCLK1, 16);
94962306a36Sopenharmony_ci	hws[WDT1_MUX] = ma35d1_clk_mux(dev, "wdt1_mux", clk_base + REG_CLK_CLKSEL3,
95062306a36Sopenharmony_ci				       24, 2, wdt1_sel_clks, ARRAY_SIZE(wdt1_sel_clks));
95162306a36Sopenharmony_ci	hws[WDT1_GATE] = ma35d1_clk_gate(dev, "wdt1_gate", "wdt1_mux",
95262306a36Sopenharmony_ci					 clk_base + REG_CLK_APBCLK1, 17);
95362306a36Sopenharmony_ci	hws[WDT2_MUX] = ma35d1_clk_mux(dev, "wdt2_mux", clk_base + REG_CLK_CLKSEL3,
95462306a36Sopenharmony_ci				       28, 2, wdt2_sel_clks, ARRAY_SIZE(wdt2_sel_clks));
95562306a36Sopenharmony_ci	hws[WDT2_GATE] = ma35d1_clk_gate(dev, "wdt2_gate", "wdt2_mux",
95662306a36Sopenharmony_ci				       clk_base + REG_CLK_APBCLK1, 18);
95762306a36Sopenharmony_ci
95862306a36Sopenharmony_ci	hws[WWDT0_MUX] = ma35d1_clk_mux(dev, "wwdt0_mux", clk_base + REG_CLK_CLKSEL3,
95962306a36Sopenharmony_ci					22, 2, wwdt0_sel_clks, ARRAY_SIZE(wwdt0_sel_clks));
96062306a36Sopenharmony_ci	hws[WWDT1_MUX] = ma35d1_clk_mux(dev, "wwdt1_mux", clk_base + REG_CLK_CLKSEL3,
96162306a36Sopenharmony_ci					26, 2, wwdt1_sel_clks, ARRAY_SIZE(wwdt1_sel_clks));
96262306a36Sopenharmony_ci	hws[WWDT2_MUX] = ma35d1_clk_mux(dev, "wwdt2_mux", clk_base + REG_CLK_CLKSEL3,
96362306a36Sopenharmony_ci					30, 2, wwdt2_sel_clks, ARRAY_SIZE(wwdt2_sel_clks));
96462306a36Sopenharmony_ci
96562306a36Sopenharmony_ci	hws[EPWM0_GATE] = ma35d1_clk_gate(dev, "epwm0_gate", "pclk1",
96662306a36Sopenharmony_ci					  clk_base + REG_CLK_APBCLK1, 24);
96762306a36Sopenharmony_ci	hws[EPWM1_GATE] = ma35d1_clk_gate(dev, "epwm1_gate", "pclk2",
96862306a36Sopenharmony_ci					  clk_base + REG_CLK_APBCLK1, 25);
96962306a36Sopenharmony_ci	hws[EPWM2_GATE] = ma35d1_clk_gate(dev, "epwm2_gate", "pclk1",
97062306a36Sopenharmony_ci					  clk_base + REG_CLK_APBCLK1, 26);
97162306a36Sopenharmony_ci
97262306a36Sopenharmony_ci	hws[I2S0_MUX] = ma35d1_clk_mux(dev, "i2s0_mux", clk_base + REG_CLK_CLKSEL4,
97362306a36Sopenharmony_ci				       12, 2, i2s0_sel_clks, ARRAY_SIZE(i2s0_sel_clks));
97462306a36Sopenharmony_ci	hws[I2S0_GATE] = ma35d1_clk_gate(dev, "i2s0_gate", "i2s0_mux",
97562306a36Sopenharmony_ci					 clk_base + REG_CLK_APBCLK2, 0);
97662306a36Sopenharmony_ci	hws[I2S1_MUX] = ma35d1_clk_mux(dev, "i2s1_mux", clk_base + REG_CLK_CLKSEL4,
97762306a36Sopenharmony_ci				       14, 2, i2s1_sel_clks, ARRAY_SIZE(i2s1_sel_clks));
97862306a36Sopenharmony_ci	hws[I2S1_GATE] = ma35d1_clk_gate(dev, "i2s1_gate", "i2s1_mux",
97962306a36Sopenharmony_ci					 clk_base + REG_CLK_APBCLK2, 1);
98062306a36Sopenharmony_ci
98162306a36Sopenharmony_ci	hws[SSMCC_GATE] = ma35d1_clk_gate(dev, "ssmcc_gate", "pclk3",
98262306a36Sopenharmony_ci					  clk_base + REG_CLK_APBCLK2, 2);
98362306a36Sopenharmony_ci	hws[SSPCC_GATE] = ma35d1_clk_gate(dev, "sspcc_gate", "pclk3",
98462306a36Sopenharmony_ci					  clk_base + REG_CLK_APBCLK2, 3);
98562306a36Sopenharmony_ci
98662306a36Sopenharmony_ci	hws[SPI0_MUX] = ma35d1_clk_mux(dev, "spi0_mux", clk_base + REG_CLK_CLKSEL4,
98762306a36Sopenharmony_ci				       0, 2, spi0_sel_clks, ARRAY_SIZE(spi0_sel_clks));
98862306a36Sopenharmony_ci	hws[SPI0_GATE] = ma35d1_clk_gate(dev, "spi0_gate", "spi0_mux",
98962306a36Sopenharmony_ci					 clk_base + REG_CLK_APBCLK2, 4);
99062306a36Sopenharmony_ci	hws[SPI1_MUX] = ma35d1_clk_mux(dev, "spi1_mux", clk_base + REG_CLK_CLKSEL4,
99162306a36Sopenharmony_ci				       2, 2, spi1_sel_clks, ARRAY_SIZE(spi1_sel_clks));
99262306a36Sopenharmony_ci	hws[SPI1_GATE] = ma35d1_clk_gate(dev, "spi1_gate", "spi1_mux",
99362306a36Sopenharmony_ci					 clk_base + REG_CLK_APBCLK2, 5);
99462306a36Sopenharmony_ci	hws[SPI2_MUX] = ma35d1_clk_mux(dev, "spi2_mux", clk_base + REG_CLK_CLKSEL4,
99562306a36Sopenharmony_ci				       4, 2, spi2_sel_clks, ARRAY_SIZE(spi2_sel_clks));
99662306a36Sopenharmony_ci	hws[SPI2_GATE] = ma35d1_clk_gate(dev, "spi2_gate", "spi2_mux",
99762306a36Sopenharmony_ci					 clk_base + REG_CLK_APBCLK2, 6);
99862306a36Sopenharmony_ci	hws[SPI3_MUX] = ma35d1_clk_mux(dev, "spi3_mux", clk_base + REG_CLK_CLKSEL4,
99962306a36Sopenharmony_ci				       6, 2, spi3_sel_clks, ARRAY_SIZE(spi3_sel_clks));
100062306a36Sopenharmony_ci	hws[SPI3_GATE] = ma35d1_clk_gate(dev, "spi3_gate", "spi3_mux",
100162306a36Sopenharmony_ci					 clk_base + REG_CLK_APBCLK2, 7);
100262306a36Sopenharmony_ci
100362306a36Sopenharmony_ci	hws[ECAP0_GATE] = ma35d1_clk_gate(dev, "ecap0_gate", "pclk1",
100462306a36Sopenharmony_ci					  clk_base + REG_CLK_APBCLK2, 8);
100562306a36Sopenharmony_ci	hws[ECAP1_GATE] = ma35d1_clk_gate(dev, "ecap1_gate", "pclk2",
100662306a36Sopenharmony_ci					  clk_base + REG_CLK_APBCLK2, 9);
100762306a36Sopenharmony_ci	hws[ECAP2_GATE] = ma35d1_clk_gate(dev, "ecap2_gate", "pclk1",
100862306a36Sopenharmony_ci					  clk_base + REG_CLK_APBCLK2, 10);
100962306a36Sopenharmony_ci
101062306a36Sopenharmony_ci	hws[QEI0_GATE] = ma35d1_clk_gate(dev, "qei0_gate", "pclk1",
101162306a36Sopenharmony_ci					 clk_base + REG_CLK_APBCLK2, 12);
101262306a36Sopenharmony_ci	hws[QEI1_GATE] = ma35d1_clk_gate(dev, "qei1_gate", "pclk2",
101362306a36Sopenharmony_ci					 clk_base + REG_CLK_APBCLK2, 13);
101462306a36Sopenharmony_ci	hws[QEI2_GATE] = ma35d1_clk_gate(dev, "qei2_gate", "pclk1",
101562306a36Sopenharmony_ci					 clk_base + REG_CLK_APBCLK2, 14);
101662306a36Sopenharmony_ci
101762306a36Sopenharmony_ci	hws[ADC_DIV] = ma35d1_reg_adc_clkdiv(dev, "adc_div", hws[PCLK0],
101862306a36Sopenharmony_ci					     &ma35d1_lock, 0,
101962306a36Sopenharmony_ci					     clk_base + REG_CLK_CLKDIV4,
102062306a36Sopenharmony_ci					     4, 17, 0x1ffff);
102162306a36Sopenharmony_ci	hws[ADC_GATE] = ma35d1_clk_gate(dev, "adc_gate", "adc_div",
102262306a36Sopenharmony_ci					clk_base + REG_CLK_APBCLK2, 24);
102362306a36Sopenharmony_ci
102462306a36Sopenharmony_ci	hws[EADC_DIV] = ma35d1_clk_divider_table(dev, "eadc_div", "pclk2",
102562306a36Sopenharmony_ci						 clk_base + REG_CLK_CLKDIV4,
102662306a36Sopenharmony_ci						 0, 4, eadc_div_table);
102762306a36Sopenharmony_ci	hws[EADC_GATE] = ma35d1_clk_gate(dev, "eadc_gate", "eadc_div",
102862306a36Sopenharmony_ci					 clk_base + REG_CLK_APBCLK2, 25);
102962306a36Sopenharmony_ci
103062306a36Sopenharmony_ci	return devm_of_clk_add_hw_provider(dev,
103162306a36Sopenharmony_ci					   of_clk_hw_onecell_get,
103262306a36Sopenharmony_ci					   ma35d1_hw_data);
103362306a36Sopenharmony_ci}
103462306a36Sopenharmony_ci
103562306a36Sopenharmony_cistatic const struct of_device_id ma35d1_clk_of_match[] = {
103662306a36Sopenharmony_ci	{ .compatible = "nuvoton,ma35d1-clk" },
103762306a36Sopenharmony_ci	{ }
103862306a36Sopenharmony_ci};
103962306a36Sopenharmony_ciMODULE_DEVICE_TABLE(of, ma35d1_clk_of_match);
104062306a36Sopenharmony_ci
104162306a36Sopenharmony_cistatic struct platform_driver ma35d1_clk_driver = {
104262306a36Sopenharmony_ci	.probe = ma35d1_clocks_probe,
104362306a36Sopenharmony_ci	.driver = {
104462306a36Sopenharmony_ci		.name = "ma35d1-clk",
104562306a36Sopenharmony_ci		.of_match_table = ma35d1_clk_of_match,
104662306a36Sopenharmony_ci	},
104762306a36Sopenharmony_ci};
104862306a36Sopenharmony_ci
104962306a36Sopenharmony_cistatic int __init ma35d1_clocks_init(void)
105062306a36Sopenharmony_ci{
105162306a36Sopenharmony_ci	return platform_driver_register(&ma35d1_clk_driver);
105262306a36Sopenharmony_ci}
105362306a36Sopenharmony_ci
105462306a36Sopenharmony_cipostcore_initcall(ma35d1_clocks_init);
105562306a36Sopenharmony_ci
105662306a36Sopenharmony_ciMODULE_AUTHOR("Chi-Fang Li <cfli0@nuvoton.com>");
105762306a36Sopenharmony_ciMODULE_DESCRIPTION("NUVOTON MA35D1 Clock Driver");
105862306a36Sopenharmony_ciMODULE_LICENSE("GPL");
1059