Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  * R7S9210 Clock Pulse Generator / Module Standby
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  * Based on r8a7795-cpg-mssr.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7)  * Copyright (C) 2018 Chris Brandt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8)  * Copyright (C) 2018 Renesas Electronics Corp.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) #include <linux/clk.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) #include <linux/clk-provider.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) #include <linux/io.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) #include <dt-bindings/clock/r7s9210-cpg-mssr.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) #include "renesas-cpg-mssr.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) #define CPG_FRQCR	0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) static u8 cpg_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) /* Internal Clock ratio table */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) static const struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) 	unsigned int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) 	unsigned int g;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) 	unsigned int b;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) 	unsigned int p1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) 	/* p0 is always 32 */;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) } ratio_tab[5] = {	/* I,  G,  B, P1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) 			{  2,  4,  8, 16},	/* FRQCR = 0x012 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) 			{  4,  4,  8, 16},	/* FRQCR = 0x112 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) 			{  8,  4,  8, 16},	/* FRQCR = 0x212 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) 			{ 16,  8, 16, 16},	/* FRQCR = 0x322 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) 			{ 16, 16, 32, 32},	/* FRQCR = 0x333 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) 			};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) enum rz_clk_types {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) 	CLK_TYPE_RZA_MAIN = CLK_TYPE_CUSTOM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) 	CLK_TYPE_RZA_PLL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) enum clk_ids {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 	/* Core Clock Outputs exported to DT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 	LAST_DT_CORE_CLK = R7S9210_CLK_P0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 	/* External Input Clocks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 	CLK_EXTAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 	/* Internal Core Clocks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) 	CLK_MAIN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 	CLK_PLL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 	/* Module Clocks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 	MOD_CLK_BASE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) static struct cpg_core_clk r7s9210_early_core_clks[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 	/* External Clock Inputs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 	DEF_INPUT("extal",     CLK_EXTAL),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 	/* Internal Core Clocks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 	DEF_BASE(".main",       CLK_MAIN, CLK_TYPE_RZA_MAIN, CLK_EXTAL),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 	DEF_BASE(".pll",       CLK_PLL, CLK_TYPE_RZA_PLL, CLK_MAIN),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 	/* Core Clock Outputs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 	DEF_FIXED("p1c",    R7S9210_CLK_P1C,   CLK_PLL,         16, 1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) static const struct mssr_mod_clk r7s9210_early_mod_clks[] __initconst = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 	DEF_MOD_STB("ostm2",	 34,	R7S9210_CLK_P1C),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 	DEF_MOD_STB("ostm1",	 35,	R7S9210_CLK_P1C),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 	DEF_MOD_STB("ostm0",	 36,	R7S9210_CLK_P1C),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) static struct cpg_core_clk r7s9210_core_clks[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 	/* Core Clock Outputs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 	DEF_FIXED("i",      R7S9210_CLK_I,     CLK_PLL,          2, 1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 	DEF_FIXED("g",      R7S9210_CLK_G,     CLK_PLL,          4, 1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 	DEF_FIXED("b",      R7S9210_CLK_B,     CLK_PLL,          8, 1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 	DEF_FIXED("p1",     R7S9210_CLK_P1,    CLK_PLL,         16, 1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 	DEF_FIXED("p0",     R7S9210_CLK_P0,    CLK_PLL,         32, 1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) static const struct mssr_mod_clk r7s9210_mod_clks[] __initconst = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 	DEF_MOD_STB("scif4",	 43,	R7S9210_CLK_P1C),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 	DEF_MOD_STB("scif3",	 44,	R7S9210_CLK_P1C),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 	DEF_MOD_STB("scif2",	 45,	R7S9210_CLK_P1C),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 	DEF_MOD_STB("scif1",	 46,	R7S9210_CLK_P1C),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 	DEF_MOD_STB("scif0",	 47,	R7S9210_CLK_P1C),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 	DEF_MOD_STB("usb1",	 60,	R7S9210_CLK_B),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 	DEF_MOD_STB("usb0",	 61,	R7S9210_CLK_B),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 	DEF_MOD_STB("ether1",	 64,	R7S9210_CLK_B),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 	DEF_MOD_STB("ether0",	 65,	R7S9210_CLK_B),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 	DEF_MOD_STB("spibsc",	 83,	R7S9210_CLK_P1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 	DEF_MOD_STB("i2c3",	 84,	R7S9210_CLK_P1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 	DEF_MOD_STB("i2c2",	 85,	R7S9210_CLK_P1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 	DEF_MOD_STB("i2c1",	 86,	R7S9210_CLK_P1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 	DEF_MOD_STB("i2c0",	 87,	R7S9210_CLK_P1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 	DEF_MOD_STB("spi2",	 95,	R7S9210_CLK_P1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 	DEF_MOD_STB("spi1",	 96,	R7S9210_CLK_P1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 	DEF_MOD_STB("spi0",	 97,	R7S9210_CLK_P1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 	DEF_MOD_STB("sdhi11",	100,	R7S9210_CLK_B),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 	DEF_MOD_STB("sdhi10",	101,	R7S9210_CLK_B),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 	DEF_MOD_STB("sdhi01",	102,	R7S9210_CLK_B),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 	DEF_MOD_STB("sdhi00",	103,	R7S9210_CLK_B),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) /* The clock dividers in the table vary based on DT and register settings */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) static void __init r7s9210_update_clk_table(struct clk *extal_clk,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 					    void __iomem *base)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 	int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 	u16 frqcr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 	u8 index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 	/* If EXTAL is above 12MHz, then we know it is Mode 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 	if (clk_get_rate(extal_clk) > 12000000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 		cpg_mode = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 	frqcr = readl(base + CPG_FRQCR) & 0xFFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 	if (frqcr == 0x012)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 		index = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 	else if (frqcr == 0x112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 		index = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 	else if (frqcr == 0x212)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 		index = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 	else if (frqcr == 0x322)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 		index = 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 	else if (frqcr == 0x333)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 		index = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 		BUG_ON(1);	/* Illegal FRQCR value */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) 	for (i = 0; i < ARRAY_SIZE(r7s9210_core_clks); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 		switch (r7s9210_core_clks[i].id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) 		case R7S9210_CLK_I:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 			r7s9210_core_clks[i].div = ratio_tab[index].i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 		case R7S9210_CLK_G:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) 			r7s9210_core_clks[i].div = ratio_tab[index].g;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 		case R7S9210_CLK_B:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 			r7s9210_core_clks[i].div = ratio_tab[index].b;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 		case R7S9210_CLK_P1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 		case R7S9210_CLK_P1C:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) 			r7s9210_core_clks[i].div = ratio_tab[index].p1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 		case R7S9210_CLK_P0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) 			r7s9210_core_clks[i].div = 32;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) static struct clk * __init rza2_cpg_clk_register(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) 	const struct cpg_core_clk *core, const struct cpg_mssr_info *info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) 	struct clk **clks, void __iomem *base,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) 	struct raw_notifier_head *notifiers)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) 	struct clk *parent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) 	unsigned int mult = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) 	unsigned int div = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) 	parent = clks[core->parent];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) 	if (IS_ERR(parent))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) 		return ERR_CAST(parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) 	switch (core->id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) 	case CLK_MAIN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) 	case CLK_PLL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 		if (cpg_mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) 			mult = 44;	/* Divider 1 is 1/2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 			mult = 88;	/* Divider 1 is 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 		return ERR_PTR(-EINVAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) 	if (core->id == CLK_MAIN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) 		r7s9210_update_clk_table(parent, base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) 	return clk_register_fixed_factor(NULL, core->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) 					 __clk_get_name(parent), 0, mult, div);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) const struct cpg_mssr_info r7s9210_cpg_mssr_info __initconst = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) 	/* Early Clocks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) 	.early_core_clks = r7s9210_early_core_clks,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) 	.num_early_core_clks = ARRAY_SIZE(r7s9210_early_core_clks),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) 	.early_mod_clks = r7s9210_early_mod_clks,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) 	.num_early_mod_clks = ARRAY_SIZE(r7s9210_early_mod_clks),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) 	/* Core Clocks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) 	.core_clks = r7s9210_core_clks,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) 	.num_core_clks = ARRAY_SIZE(r7s9210_core_clks),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) 	.last_dt_core_clk = LAST_DT_CORE_CLK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) 	.num_total_core_clks = MOD_CLK_BASE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) 	/* Module Clocks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 	.mod_clks = r7s9210_mod_clks,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) 	.num_mod_clks = ARRAY_SIZE(r7s9210_mod_clks),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) 	.num_hw_mod_clks = 11 * 32, /* includes STBCR0 which doesn't exist */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) 	/* Callbacks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) 	.cpg_clk_register = rza2_cpg_clk_register,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) 	/* RZ/A2 has Standby Control Registers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) 	.reg_layout = CLK_REG_LAYOUT_RZ_A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) static void __init r7s9210_cpg_mssr_early_init(struct device_node *np)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) 	cpg_mssr_early_init(np, &r7s9210_cpg_mssr_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) CLK_OF_DECLARE_DRIVER(cpg_mstp_clks, "renesas,r7s9210-cpg-mssr",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) 		      r7s9210_cpg_mssr_early_init);