18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * r8a77970 Clock Pulse Generator / Module Standby and Software Reset 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 2017-2018 Cogent Embedded Inc. 68c2ecf20Sopenharmony_ci * 78c2ecf20Sopenharmony_ci * Based on r8a7795-cpg-mssr.c 88c2ecf20Sopenharmony_ci * 98c2ecf20Sopenharmony_ci * Copyright (C) 2015 Glider bvba 108c2ecf20Sopenharmony_ci */ 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ci#include <linux/clk-provider.h> 138c2ecf20Sopenharmony_ci#include <linux/device.h> 148c2ecf20Sopenharmony_ci#include <linux/init.h> 158c2ecf20Sopenharmony_ci#include <linux/kernel.h> 168c2ecf20Sopenharmony_ci#include <linux/soc/renesas/rcar-rst.h> 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci#include <dt-bindings/clock/r8a77970-cpg-mssr.h> 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ci#include "renesas-cpg-mssr.h" 218c2ecf20Sopenharmony_ci#include "rcar-gen3-cpg.h" 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_ci#define CPG_SD0CKCR 0x0074 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_cienum r8a77970_clk_types { 268c2ecf20Sopenharmony_ci CLK_TYPE_R8A77970_SD0H = CLK_TYPE_GEN3_SOC_BASE, 278c2ecf20Sopenharmony_ci CLK_TYPE_R8A77970_SD0, 288c2ecf20Sopenharmony_ci}; 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_cienum clk_ids { 318c2ecf20Sopenharmony_ci /* Core Clock Outputs exported to DT */ 328c2ecf20Sopenharmony_ci LAST_DT_CORE_CLK = R8A77970_CLK_OSC, 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_ci /* External Input Clocks */ 358c2ecf20Sopenharmony_ci CLK_EXTAL, 368c2ecf20Sopenharmony_ci CLK_EXTALR, 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_ci /* Internal Core Clocks */ 398c2ecf20Sopenharmony_ci CLK_MAIN, 408c2ecf20Sopenharmony_ci CLK_PLL0, 418c2ecf20Sopenharmony_ci CLK_PLL1, 428c2ecf20Sopenharmony_ci CLK_PLL3, 438c2ecf20Sopenharmony_ci CLK_PLL1_DIV2, 448c2ecf20Sopenharmony_ci CLK_PLL1_DIV4, 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_ci /* Module Clocks */ 478c2ecf20Sopenharmony_ci MOD_CLK_BASE 488c2ecf20Sopenharmony_ci}; 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_cistatic spinlock_t cpg_lock; 518c2ecf20Sopenharmony_ci 528c2ecf20Sopenharmony_cistatic const struct clk_div_table cpg_sd0h_div_table[] = { 538c2ecf20Sopenharmony_ci { 0, 2 }, { 1, 3 }, { 2, 4 }, { 3, 6 }, 548c2ecf20Sopenharmony_ci { 4, 8 }, { 5, 12 }, { 6, 16 }, { 7, 18 }, 558c2ecf20Sopenharmony_ci { 8, 24 }, { 10, 36 }, { 11, 48 }, { 0, 0 }, 568c2ecf20Sopenharmony_ci}; 578c2ecf20Sopenharmony_ci 588c2ecf20Sopenharmony_cistatic const struct clk_div_table cpg_sd0_div_table[] = { 598c2ecf20Sopenharmony_ci { 4, 8 }, { 5, 12 }, { 6, 16 }, { 7, 18 }, 608c2ecf20Sopenharmony_ci { 8, 24 }, { 10, 36 }, { 11, 48 }, { 12, 10 }, 618c2ecf20Sopenharmony_ci { 0, 0 }, 628c2ecf20Sopenharmony_ci}; 638c2ecf20Sopenharmony_ci 648c2ecf20Sopenharmony_cistatic const struct cpg_core_clk r8a77970_core_clks[] __initconst = { 658c2ecf20Sopenharmony_ci /* External Clock Inputs */ 668c2ecf20Sopenharmony_ci DEF_INPUT("extal", CLK_EXTAL), 678c2ecf20Sopenharmony_ci DEF_INPUT("extalr", CLK_EXTALR), 688c2ecf20Sopenharmony_ci 698c2ecf20Sopenharmony_ci /* Internal Core Clocks */ 708c2ecf20Sopenharmony_ci DEF_BASE(".main", CLK_MAIN, CLK_TYPE_GEN3_MAIN, CLK_EXTAL), 718c2ecf20Sopenharmony_ci DEF_BASE(".pll0", CLK_PLL0, CLK_TYPE_GEN3_PLL0, CLK_MAIN), 728c2ecf20Sopenharmony_ci DEF_BASE(".pll1", CLK_PLL1, CLK_TYPE_GEN3_PLL1, CLK_MAIN), 738c2ecf20Sopenharmony_ci DEF_BASE(".pll3", CLK_PLL3, CLK_TYPE_GEN3_PLL3, CLK_MAIN), 748c2ecf20Sopenharmony_ci 758c2ecf20Sopenharmony_ci DEF_FIXED(".pll1_div2", CLK_PLL1_DIV2, CLK_PLL1, 2, 1), 768c2ecf20Sopenharmony_ci DEF_FIXED(".pll1_div4", CLK_PLL1_DIV4, CLK_PLL1_DIV2, 2, 1), 778c2ecf20Sopenharmony_ci 788c2ecf20Sopenharmony_ci /* Core Clock Outputs */ 798c2ecf20Sopenharmony_ci DEF_FIXED("ztr", R8A77970_CLK_ZTR, CLK_PLL1_DIV2, 6, 1), 808c2ecf20Sopenharmony_ci DEF_FIXED("ztrd2", R8A77970_CLK_ZTRD2, CLK_PLL1_DIV2, 12, 1), 818c2ecf20Sopenharmony_ci DEF_FIXED("zt", R8A77970_CLK_ZT, CLK_PLL1_DIV2, 4, 1), 828c2ecf20Sopenharmony_ci DEF_FIXED("zx", R8A77970_CLK_ZX, CLK_PLL1_DIV2, 3, 1), 838c2ecf20Sopenharmony_ci DEF_FIXED("s1d1", R8A77970_CLK_S1D1, CLK_PLL1_DIV2, 4, 1), 848c2ecf20Sopenharmony_ci DEF_FIXED("s1d2", R8A77970_CLK_S1D2, CLK_PLL1_DIV2, 8, 1), 858c2ecf20Sopenharmony_ci DEF_FIXED("s1d4", R8A77970_CLK_S1D4, CLK_PLL1_DIV2, 16, 1), 868c2ecf20Sopenharmony_ci DEF_FIXED("s2d1", R8A77970_CLK_S2D1, CLK_PLL1_DIV2, 6, 1), 878c2ecf20Sopenharmony_ci DEF_FIXED("s2d2", R8A77970_CLK_S2D2, CLK_PLL1_DIV2, 12, 1), 888c2ecf20Sopenharmony_ci DEF_FIXED("s2d4", R8A77970_CLK_S2D4, CLK_PLL1_DIV2, 24, 1), 898c2ecf20Sopenharmony_ci 908c2ecf20Sopenharmony_ci DEF_BASE("sd0h", R8A77970_CLK_SD0H, CLK_TYPE_R8A77970_SD0H, 918c2ecf20Sopenharmony_ci CLK_PLL1_DIV2), 928c2ecf20Sopenharmony_ci DEF_BASE("sd0", R8A77970_CLK_SD0, CLK_TYPE_R8A77970_SD0, CLK_PLL1_DIV2), 938c2ecf20Sopenharmony_ci 948c2ecf20Sopenharmony_ci DEF_FIXED("rpc", R8A77970_CLK_RPC, CLK_PLL1_DIV2, 5, 1), 958c2ecf20Sopenharmony_ci DEF_FIXED("rpcd2", R8A77970_CLK_RPCD2, CLK_PLL1_DIV2, 10, 1), 968c2ecf20Sopenharmony_ci 978c2ecf20Sopenharmony_ci DEF_FIXED("cl", R8A77970_CLK_CL, CLK_PLL1_DIV2, 48, 1), 988c2ecf20Sopenharmony_ci DEF_FIXED("cp", R8A77970_CLK_CP, CLK_EXTAL, 2, 1), 998c2ecf20Sopenharmony_ci DEF_FIXED("cpex", R8A77970_CLK_CPEX, CLK_EXTAL, 2, 1), 1008c2ecf20Sopenharmony_ci 1018c2ecf20Sopenharmony_ci DEF_DIV6P1("canfd", R8A77970_CLK_CANFD, CLK_PLL1_DIV4, 0x244), 1028c2ecf20Sopenharmony_ci DEF_DIV6P1("mso", R8A77970_CLK_MSO, CLK_PLL1_DIV4, 0x014), 1038c2ecf20Sopenharmony_ci DEF_DIV6P1("csi0", R8A77970_CLK_CSI0, CLK_PLL1_DIV4, 0x00c), 1048c2ecf20Sopenharmony_ci 1058c2ecf20Sopenharmony_ci DEF_FIXED("osc", R8A77970_CLK_OSC, CLK_PLL1_DIV2, 12*1024, 1), 1068c2ecf20Sopenharmony_ci DEF_FIXED("r", R8A77970_CLK_R, CLK_EXTALR, 1, 1), 1078c2ecf20Sopenharmony_ci}; 1088c2ecf20Sopenharmony_ci 1098c2ecf20Sopenharmony_cistatic const struct mssr_mod_clk r8a77970_mod_clks[] __initconst = { 1108c2ecf20Sopenharmony_ci DEF_MOD("tmu4", 121, R8A77970_CLK_S2D2), 1118c2ecf20Sopenharmony_ci DEF_MOD("tmu3", 122, R8A77970_CLK_S2D2), 1128c2ecf20Sopenharmony_ci DEF_MOD("tmu2", 123, R8A77970_CLK_S2D2), 1138c2ecf20Sopenharmony_ci DEF_MOD("tmu1", 124, R8A77970_CLK_S2D2), 1148c2ecf20Sopenharmony_ci DEF_MOD("tmu0", 125, R8A77970_CLK_CP), 1158c2ecf20Sopenharmony_ci DEF_MOD("ivcp1e", 127, R8A77970_CLK_S2D1), 1168c2ecf20Sopenharmony_ci DEF_MOD("scif4", 203, R8A77970_CLK_S2D4), 1178c2ecf20Sopenharmony_ci DEF_MOD("scif3", 204, R8A77970_CLK_S2D4), 1188c2ecf20Sopenharmony_ci DEF_MOD("scif1", 206, R8A77970_CLK_S2D4), 1198c2ecf20Sopenharmony_ci DEF_MOD("scif0", 207, R8A77970_CLK_S2D4), 1208c2ecf20Sopenharmony_ci DEF_MOD("msiof3", 208, R8A77970_CLK_MSO), 1218c2ecf20Sopenharmony_ci DEF_MOD("msiof2", 209, R8A77970_CLK_MSO), 1228c2ecf20Sopenharmony_ci DEF_MOD("msiof1", 210, R8A77970_CLK_MSO), 1238c2ecf20Sopenharmony_ci DEF_MOD("msiof0", 211, R8A77970_CLK_MSO), 1248c2ecf20Sopenharmony_ci DEF_MOD("mfis", 213, R8A77970_CLK_S2D2), 1258c2ecf20Sopenharmony_ci DEF_MOD("sys-dmac2", 217, R8A77970_CLK_S2D1), 1268c2ecf20Sopenharmony_ci DEF_MOD("sys-dmac1", 218, R8A77970_CLK_S2D1), 1278c2ecf20Sopenharmony_ci DEF_MOD("cmt3", 300, R8A77970_CLK_R), 1288c2ecf20Sopenharmony_ci DEF_MOD("cmt2", 301, R8A77970_CLK_R), 1298c2ecf20Sopenharmony_ci DEF_MOD("cmt1", 302, R8A77970_CLK_R), 1308c2ecf20Sopenharmony_ci DEF_MOD("cmt0", 303, R8A77970_CLK_R), 1318c2ecf20Sopenharmony_ci DEF_MOD("tpu0", 304, R8A77970_CLK_S2D4), 1328c2ecf20Sopenharmony_ci DEF_MOD("sd-if", 314, R8A77970_CLK_SD0), 1338c2ecf20Sopenharmony_ci DEF_MOD("rwdt", 402, R8A77970_CLK_R), 1348c2ecf20Sopenharmony_ci DEF_MOD("intc-ex", 407, R8A77970_CLK_CP), 1358c2ecf20Sopenharmony_ci DEF_MOD("intc-ap", 408, R8A77970_CLK_S2D1), 1368c2ecf20Sopenharmony_ci DEF_MOD("hscif3", 517, R8A77970_CLK_S2D1), 1378c2ecf20Sopenharmony_ci DEF_MOD("hscif2", 518, R8A77970_CLK_S2D1), 1388c2ecf20Sopenharmony_ci DEF_MOD("hscif1", 519, R8A77970_CLK_S2D1), 1398c2ecf20Sopenharmony_ci DEF_MOD("hscif0", 520, R8A77970_CLK_S2D1), 1408c2ecf20Sopenharmony_ci DEF_MOD("thermal", 522, R8A77970_CLK_CP), 1418c2ecf20Sopenharmony_ci DEF_MOD("pwm", 523, R8A77970_CLK_S2D4), 1428c2ecf20Sopenharmony_ci DEF_MOD("fcpvd0", 603, R8A77970_CLK_S2D1), 1438c2ecf20Sopenharmony_ci DEF_MOD("vspd0", 623, R8A77970_CLK_S2D1), 1448c2ecf20Sopenharmony_ci DEF_MOD("csi40", 716, R8A77970_CLK_CSI0), 1458c2ecf20Sopenharmony_ci DEF_MOD("du0", 724, R8A77970_CLK_S2D1), 1468c2ecf20Sopenharmony_ci DEF_MOD("lvds", 727, R8A77970_CLK_S2D1), 1478c2ecf20Sopenharmony_ci DEF_MOD("vin3", 808, R8A77970_CLK_S2D1), 1488c2ecf20Sopenharmony_ci DEF_MOD("vin2", 809, R8A77970_CLK_S2D1), 1498c2ecf20Sopenharmony_ci DEF_MOD("vin1", 810, R8A77970_CLK_S2D1), 1508c2ecf20Sopenharmony_ci DEF_MOD("vin0", 811, R8A77970_CLK_S2D1), 1518c2ecf20Sopenharmony_ci DEF_MOD("etheravb", 812, R8A77970_CLK_S2D2), 1528c2ecf20Sopenharmony_ci DEF_MOD("gpio5", 907, R8A77970_CLK_CP), 1538c2ecf20Sopenharmony_ci DEF_MOD("gpio4", 908, R8A77970_CLK_CP), 1548c2ecf20Sopenharmony_ci DEF_MOD("gpio3", 909, R8A77970_CLK_CP), 1558c2ecf20Sopenharmony_ci DEF_MOD("gpio2", 910, R8A77970_CLK_CP), 1568c2ecf20Sopenharmony_ci DEF_MOD("gpio1", 911, R8A77970_CLK_CP), 1578c2ecf20Sopenharmony_ci DEF_MOD("gpio0", 912, R8A77970_CLK_CP), 1588c2ecf20Sopenharmony_ci DEF_MOD("can-fd", 914, R8A77970_CLK_S2D2), 1598c2ecf20Sopenharmony_ci DEF_MOD("rpc-if", 917, R8A77970_CLK_RPC), 1608c2ecf20Sopenharmony_ci DEF_MOD("i2c4", 927, R8A77970_CLK_S2D2), 1618c2ecf20Sopenharmony_ci DEF_MOD("i2c3", 928, R8A77970_CLK_S2D2), 1628c2ecf20Sopenharmony_ci DEF_MOD("i2c2", 929, R8A77970_CLK_S2D2), 1638c2ecf20Sopenharmony_ci DEF_MOD("i2c1", 930, R8A77970_CLK_S2D2), 1648c2ecf20Sopenharmony_ci DEF_MOD("i2c0", 931, R8A77970_CLK_S2D2), 1658c2ecf20Sopenharmony_ci}; 1668c2ecf20Sopenharmony_ci 1678c2ecf20Sopenharmony_cistatic const unsigned int r8a77970_crit_mod_clks[] __initconst = { 1688c2ecf20Sopenharmony_ci MOD_CLK_ID(402), /* RWDT */ 1698c2ecf20Sopenharmony_ci MOD_CLK_ID(408), /* INTC-AP (GIC) */ 1708c2ecf20Sopenharmony_ci}; 1718c2ecf20Sopenharmony_ci 1728c2ecf20Sopenharmony_ci/* 1738c2ecf20Sopenharmony_ci * CPG Clock Data 1748c2ecf20Sopenharmony_ci */ 1758c2ecf20Sopenharmony_ci 1768c2ecf20Sopenharmony_ci/* 1778c2ecf20Sopenharmony_ci * MD EXTAL PLL0 PLL1 PLL3 1788c2ecf20Sopenharmony_ci * 14 13 19 (MHz) 1798c2ecf20Sopenharmony_ci *------------------------------------------------- 1808c2ecf20Sopenharmony_ci * 0 0 0 16.66 x 1 x192 x192 x96 1818c2ecf20Sopenharmony_ci * 0 0 1 16.66 x 1 x192 x192 x80 1828c2ecf20Sopenharmony_ci * 0 1 0 20 x 1 x160 x160 x80 1838c2ecf20Sopenharmony_ci * 0 1 1 20 x 1 x160 x160 x66 1848c2ecf20Sopenharmony_ci * 1 0 0 27 / 2 x236 x236 x118 1858c2ecf20Sopenharmony_ci * 1 0 1 27 / 2 x236 x236 x98 1868c2ecf20Sopenharmony_ci * 1 1 0 33.33 / 2 x192 x192 x96 1878c2ecf20Sopenharmony_ci * 1 1 1 33.33 / 2 x192 x192 x80 1888c2ecf20Sopenharmony_ci */ 1898c2ecf20Sopenharmony_ci#define CPG_PLL_CONFIG_INDEX(md) ((((md) & BIT(14)) >> 12) | \ 1908c2ecf20Sopenharmony_ci (((md) & BIT(13)) >> 12) | \ 1918c2ecf20Sopenharmony_ci (((md) & BIT(19)) >> 19)) 1928c2ecf20Sopenharmony_ci 1938c2ecf20Sopenharmony_cistatic const struct rcar_gen3_cpg_pll_config cpg_pll_configs[8] __initconst = { 1948c2ecf20Sopenharmony_ci /* EXTAL div PLL1 mult/div PLL3 mult/div */ 1958c2ecf20Sopenharmony_ci { 1, 192, 1, 96, 1, }, 1968c2ecf20Sopenharmony_ci { 1, 192, 1, 80, 1, }, 1978c2ecf20Sopenharmony_ci { 1, 160, 1, 80, 1, }, 1988c2ecf20Sopenharmony_ci { 1, 160, 1, 66, 1, }, 1998c2ecf20Sopenharmony_ci { 2, 236, 1, 118, 1, }, 2008c2ecf20Sopenharmony_ci { 2, 236, 1, 98, 1, }, 2018c2ecf20Sopenharmony_ci { 2, 192, 1, 96, 1, }, 2028c2ecf20Sopenharmony_ci { 2, 192, 1, 80, 1, }, 2038c2ecf20Sopenharmony_ci}; 2048c2ecf20Sopenharmony_ci 2058c2ecf20Sopenharmony_cistatic int __init r8a77970_cpg_mssr_init(struct device *dev) 2068c2ecf20Sopenharmony_ci{ 2078c2ecf20Sopenharmony_ci const struct rcar_gen3_cpg_pll_config *cpg_pll_config; 2088c2ecf20Sopenharmony_ci u32 cpg_mode; 2098c2ecf20Sopenharmony_ci int error; 2108c2ecf20Sopenharmony_ci 2118c2ecf20Sopenharmony_ci error = rcar_rst_read_mode_pins(&cpg_mode); 2128c2ecf20Sopenharmony_ci if (error) 2138c2ecf20Sopenharmony_ci return error; 2148c2ecf20Sopenharmony_ci 2158c2ecf20Sopenharmony_ci spin_lock_init(&cpg_lock); 2168c2ecf20Sopenharmony_ci 2178c2ecf20Sopenharmony_ci cpg_pll_config = &cpg_pll_configs[CPG_PLL_CONFIG_INDEX(cpg_mode)]; 2188c2ecf20Sopenharmony_ci 2198c2ecf20Sopenharmony_ci return rcar_gen3_cpg_init(cpg_pll_config, CLK_EXTALR, cpg_mode); 2208c2ecf20Sopenharmony_ci} 2218c2ecf20Sopenharmony_ci 2228c2ecf20Sopenharmony_cistatic struct clk * __init r8a77970_cpg_clk_register(struct device *dev, 2238c2ecf20Sopenharmony_ci const struct cpg_core_clk *core, const struct cpg_mssr_info *info, 2248c2ecf20Sopenharmony_ci struct clk **clks, void __iomem *base, 2258c2ecf20Sopenharmony_ci struct raw_notifier_head *notifiers) 2268c2ecf20Sopenharmony_ci{ 2278c2ecf20Sopenharmony_ci const struct clk_div_table *table; 2288c2ecf20Sopenharmony_ci const struct clk *parent; 2298c2ecf20Sopenharmony_ci unsigned int shift; 2308c2ecf20Sopenharmony_ci 2318c2ecf20Sopenharmony_ci switch (core->type) { 2328c2ecf20Sopenharmony_ci case CLK_TYPE_R8A77970_SD0H: 2338c2ecf20Sopenharmony_ci table = cpg_sd0h_div_table; 2348c2ecf20Sopenharmony_ci shift = 8; 2358c2ecf20Sopenharmony_ci break; 2368c2ecf20Sopenharmony_ci case CLK_TYPE_R8A77970_SD0: 2378c2ecf20Sopenharmony_ci table = cpg_sd0_div_table; 2388c2ecf20Sopenharmony_ci shift = 4; 2398c2ecf20Sopenharmony_ci break; 2408c2ecf20Sopenharmony_ci default: 2418c2ecf20Sopenharmony_ci return rcar_gen3_cpg_clk_register(dev, core, info, clks, base, 2428c2ecf20Sopenharmony_ci notifiers); 2438c2ecf20Sopenharmony_ci } 2448c2ecf20Sopenharmony_ci 2458c2ecf20Sopenharmony_ci parent = clks[core->parent]; 2468c2ecf20Sopenharmony_ci if (IS_ERR(parent)) 2478c2ecf20Sopenharmony_ci return ERR_CAST(parent); 2488c2ecf20Sopenharmony_ci 2498c2ecf20Sopenharmony_ci return clk_register_divider_table(NULL, core->name, 2508c2ecf20Sopenharmony_ci __clk_get_name(parent), 0, 2518c2ecf20Sopenharmony_ci base + CPG_SD0CKCR, 2528c2ecf20Sopenharmony_ci shift, 4, 0, table, &cpg_lock); 2538c2ecf20Sopenharmony_ci} 2548c2ecf20Sopenharmony_ci 2558c2ecf20Sopenharmony_ciconst struct cpg_mssr_info r8a77970_cpg_mssr_info __initconst = { 2568c2ecf20Sopenharmony_ci /* Core Clocks */ 2578c2ecf20Sopenharmony_ci .core_clks = r8a77970_core_clks, 2588c2ecf20Sopenharmony_ci .num_core_clks = ARRAY_SIZE(r8a77970_core_clks), 2598c2ecf20Sopenharmony_ci .last_dt_core_clk = LAST_DT_CORE_CLK, 2608c2ecf20Sopenharmony_ci .num_total_core_clks = MOD_CLK_BASE, 2618c2ecf20Sopenharmony_ci 2628c2ecf20Sopenharmony_ci /* Module Clocks */ 2638c2ecf20Sopenharmony_ci .mod_clks = r8a77970_mod_clks, 2648c2ecf20Sopenharmony_ci .num_mod_clks = ARRAY_SIZE(r8a77970_mod_clks), 2658c2ecf20Sopenharmony_ci .num_hw_mod_clks = 12 * 32, 2668c2ecf20Sopenharmony_ci 2678c2ecf20Sopenharmony_ci /* Critical Module Clocks */ 2688c2ecf20Sopenharmony_ci .crit_mod_clks = r8a77970_crit_mod_clks, 2698c2ecf20Sopenharmony_ci .num_crit_mod_clks = ARRAY_SIZE(r8a77970_crit_mod_clks), 2708c2ecf20Sopenharmony_ci 2718c2ecf20Sopenharmony_ci /* Callbacks */ 2728c2ecf20Sopenharmony_ci .init = r8a77970_cpg_mssr_init, 2738c2ecf20Sopenharmony_ci .cpg_clk_register = r8a77970_cpg_clk_register, 2748c2ecf20Sopenharmony_ci}; 275