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