xref: /linux/drivers/clk/renesas/r9a09g011-cpg.c (revision 2ed2e359dea752e7758d29a423033031a0b96584)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * RZ/V2M Clock Pulse Generator / Module Standby and Software Reset
4  *
5  * Copyright (C) 2022 Renesas Electronics Corp.
6  *
7  * Based on r9a07g044-cpg.c
8  */
9 
10 #include <linux/clk-provider.h>
11 #include <linux/device.h>
12 #include <linux/init.h>
13 #include <linux/kernel.h>
14 
15 #include <dt-bindings/clock/r9a09g011-cpg.h>
16 
17 #include "rzg2l-cpg.h"
18 
19 #define DIV_A		DDIV_PACK(0x200, 0, 3)
20 #define DIV_B		DDIV_PACK(0x204, 0, 2)
21 #define DIV_D		DDIV_PACK(0x204, 4, 2)
22 #define DIV_E		DDIV_PACK(0x204, 8, 1)
23 #define DIV_W		DDIV_PACK(0x328, 0, 3)
24 
25 #define SEL_B		SEL_PLL_PACK(0x214, 0, 1)
26 #define SEL_CSI0	SEL_PLL_PACK(0x330, 0, 1)
27 #define SEL_CSI4	SEL_PLL_PACK(0x330, 4, 1)
28 #define SEL_D		SEL_PLL_PACK(0x214, 1, 1)
29 #define SEL_E		SEL_PLL_PACK(0x214, 2, 1)
30 #define SEL_SDI		SEL_PLL_PACK(0x300, 0, 1)
31 #define SEL_W0		SEL_PLL_PACK(0x32C, 0, 1)
32 
33 enum clk_ids {
34 	/* Core Clock Outputs exported to DT */
35 	LAST_DT_CORE_CLK = 0,
36 
37 	/* External Input Clocks */
38 	CLK_EXTAL,
39 
40 	/* Internal Core Clocks */
41 	CLK_MAIN,
42 	CLK_MAIN_24,
43 	CLK_MAIN_2,
44 	CLK_PLL1,
45 	CLK_PLL2,
46 	CLK_PLL2_800,
47 	CLK_PLL2_400,
48 	CLK_PLL2_200,
49 	CLK_PLL2_100,
50 	CLK_PLL4,
51 	CLK_DIV_A,
52 	CLK_DIV_B,
53 	CLK_DIV_D,
54 	CLK_DIV_E,
55 	CLK_DIV_W,
56 	CLK_SEL_B,
57 	CLK_SEL_B_D2,
58 	CLK_SEL_CSI0,
59 	CLK_SEL_CSI4,
60 	CLK_SEL_D,
61 	CLK_SEL_E,
62 	CLK_SEL_SDI,
63 	CLK_SEL_W0,
64 
65 	/* Module Clocks */
66 	MOD_CLK_BASE
67 };
68 
69 /* Divider tables */
70 static const struct clk_div_table dtable_diva[] = {
71 	{0, 1},
72 	{1, 2},
73 	{2, 3},
74 	{3, 4},
75 	{4, 6},
76 	{5, 12},
77 	{6, 24},
78 	{0, 0},
79 };
80 
81 static const struct clk_div_table dtable_divb[] = {
82 	{0, 1},
83 	{1, 2},
84 	{2, 4},
85 	{3, 8},
86 	{0, 0},
87 };
88 
89 static const struct clk_div_table dtable_divd[] = {
90 	{0, 1},
91 	{1, 2},
92 	{2, 4},
93 	{0, 0},
94 };
95 
96 static const struct clk_div_table dtable_divw[] = {
97 	{0, 6},
98 	{1, 7},
99 	{2, 8},
100 	{3, 9},
101 	{4, 10},
102 	{5, 11},
103 	{6, 12},
104 	{0, 0},
105 };
106 
107 /* Mux clock tables */
108 static const char * const sel_b[] = { ".main", ".divb" };
109 static const char * const sel_csi[] = { ".main_24", ".main" };
110 static const char * const sel_d[] = { ".main", ".divd" };
111 static const char * const sel_e[] = { ".main", ".dive" };
112 static const char * const sel_w[] = { ".main", ".divw" };
113 static const char * const sel_sdi[] = { ".main", ".pll2_200" };
114 
115 static const struct cpg_core_clk r9a09g011_core_clks[] __initconst = {
116 	/* External Clock Inputs */
117 	DEF_INPUT("extal",	CLK_EXTAL),
118 
119 	/* Internal Core Clocks */
120 	DEF_FIXED(".main",	CLK_MAIN,	CLK_EXTAL,	1,	1),
121 	DEF_FIXED(".main_24",	CLK_MAIN_24,	CLK_MAIN,	1,	2),
122 	DEF_FIXED(".main_2",	CLK_MAIN_2,	CLK_MAIN,	1,	24),
123 	DEF_FIXED(".pll1",	CLK_PLL1,	CLK_MAIN_2,	498,	1),
124 	DEF_FIXED(".pll2",	CLK_PLL2,	CLK_MAIN_2,	800,	1),
125 	DEF_FIXED(".pll2_800",	CLK_PLL2_800,	CLK_PLL2,	1,	2),
126 	DEF_FIXED(".pll2_400",	CLK_PLL2_400,	CLK_PLL2_800,	1,	2),
127 	DEF_FIXED(".pll2_200",	CLK_PLL2_200,	CLK_PLL2_800,	1,	4),
128 	DEF_FIXED(".pll2_100",	CLK_PLL2_100,	CLK_PLL2_800,	1,	8),
129 	DEF_SAMPLL(".pll4",	CLK_PLL4,	CLK_MAIN_2,	CPG_SAM_PLL_CONF(0x100)),
130 
131 	DEF_DIV_RO(".diva",	CLK_DIV_A,	CLK_PLL1,	DIV_A,	dtable_diva),
132 	DEF_DIV_RO(".divb",	CLK_DIV_B,	CLK_PLL2_400,	DIV_B,	dtable_divb),
133 	DEF_DIV_RO(".divd",	CLK_DIV_D,	CLK_PLL2_200,	DIV_D,	dtable_divd),
134 	DEF_DIV_RO(".dive",	CLK_DIV_E,	CLK_PLL2_100,	DIV_E,	NULL),
135 	DEF_DIV_RO(".divw",	CLK_DIV_W,	CLK_PLL4,	DIV_W,	dtable_divw),
136 
137 	DEF_MUX_RO(".selb",	CLK_SEL_B,	SEL_B,		sel_b),
138 	DEF_MUX_RO(".seld",	CLK_SEL_D,	SEL_D,		sel_d),
139 	DEF_MUX_RO(".sele",	CLK_SEL_E,	SEL_E,		sel_e),
140 	DEF_MUX(".selsdi",	CLK_SEL_SDI,	SEL_SDI,	sel_sdi),
141 	DEF_MUX(".selcsi0",	CLK_SEL_CSI0,	SEL_CSI0,	sel_csi),
142 	DEF_MUX(".selcsi4",	CLK_SEL_CSI4,	SEL_CSI4,	sel_csi),
143 	DEF_MUX(".selw0",	CLK_SEL_W0,	SEL_W0,		sel_w),
144 
145 	DEF_FIXED(".selb_d2",	CLK_SEL_B_D2,	CLK_SEL_B,	1,	2),
146 };
147 
148 static const struct rzg2l_mod_clk r9a09g011_mod_clks[] __initconst = {
149 	DEF_MOD("pfc",		R9A09G011_PFC_PCLK,	 CLK_MAIN,     0x400, 2, 0),
150 	DEF_MOD("gic",		R9A09G011_GIC_CLK,	 CLK_SEL_B_D2, 0x400, 5, 0),
151 	DEF_MOD("sdi0_aclk",	R9A09G011_SDI0_ACLK,	 CLK_SEL_D,    0x408, 0, 0),
152 	DEF_MOD("sdi0_imclk",	R9A09G011_SDI0_IMCLK,	 CLK_SEL_SDI,  0x408, 1, 0),
153 	DEF_MOD("sdi0_imclk2",	R9A09G011_SDI0_IMCLK2,	 CLK_SEL_SDI,  0x408, 2, 0),
154 	DEF_MOD("sdi0_clk_hs",	R9A09G011_SDI0_CLK_HS,	 CLK_PLL2_800, 0x408, 3, 0),
155 	DEF_MOD("sdi1_aclk",	R9A09G011_SDI1_ACLK,	 CLK_SEL_D,    0x408, 4, 0),
156 	DEF_MOD("sdi1_imclk",	R9A09G011_SDI1_IMCLK,	 CLK_SEL_SDI,  0x408, 5, 0),
157 	DEF_MOD("sdi1_imclk2",	R9A09G011_SDI1_IMCLK2,	 CLK_SEL_SDI,  0x408, 6, 0),
158 	DEF_MOD("sdi1_clk_hs",	R9A09G011_SDI1_CLK_HS,	 CLK_PLL2_800, 0x408, 7, 0),
159 	DEF_MOD("emm_aclk",	R9A09G011_EMM_ACLK,	 CLK_SEL_D,    0x408, 8, 0),
160 	DEF_MOD("emm_imclk",	R9A09G011_EMM_IMCLK,	 CLK_SEL_SDI,  0x408, 9, 0),
161 	DEF_MOD("emm_imclk2",	R9A09G011_EMM_IMCLK2,	 CLK_SEL_SDI,  0x408, 10, 0),
162 	DEF_MOD("emm_clk_hs",	R9A09G011_EMM_CLK_HS,	 CLK_PLL2_800, 0x408, 11, 0),
163 	DEF_COUPLED("eth_axi",	R9A09G011_ETH0_CLK_AXI,	 CLK_PLL2_200, 0x40c, 8, 0),
164 	DEF_COUPLED("eth_chi",	R9A09G011_ETH0_CLK_CHI,	 CLK_PLL2_100, 0x40c, 8, 0),
165 	DEF_MOD("eth_clk_gptp",	R9A09G011_ETH0_GPTP_EXT, CLK_PLL2_100, 0x40c, 9, 0),
166 	DEF_MOD("usb_aclk_h",	R9A09G011_USB_ACLK_H,	 CLK_SEL_D,    0x40c, 4, 0),
167 	DEF_MOD("usb_aclk_p",	R9A09G011_USB_ACLK_P,	 CLK_SEL_D,    0x40c, 5, 0),
168 	DEF_MOD("usb_pclk",	R9A09G011_USB_PCLK,	 CLK_SEL_E,    0x40c, 6, 0),
169 	DEF_MOD("syc_cnt_clk",	R9A09G011_SYC_CNT_CLK,	 CLK_MAIN_24,  0x41c, 12, 0),
170 	DEF_MOD("iic_pclk0",	R9A09G011_IIC_PCLK0,	 CLK_SEL_E,    0x420, 12, 0),
171 	DEF_MOD("cperi_grpb",	R9A09G011_CPERI_GRPB_PCLK, CLK_SEL_E,  0x424, 0, 0),
172 	DEF_MOD("tim_clk_8",	R9A09G011_TIM8_CLK,	 CLK_MAIN_2,   0x424, 4, 0),
173 	DEF_MOD("tim_clk_9",	R9A09G011_TIM9_CLK,	 CLK_MAIN_2,   0x424, 5, 0),
174 	DEF_MOD("tim_clk_10",	R9A09G011_TIM10_CLK,	 CLK_MAIN_2,   0x424, 6, 0),
175 	DEF_MOD("tim_clk_11",	R9A09G011_TIM11_CLK,	 CLK_MAIN_2,   0x424, 7, 0),
176 	DEF_MOD("tim_clk_12",	R9A09G011_TIM12_CLK,	 CLK_MAIN_2,   0x424, 8, 0),
177 	DEF_MOD("tim_clk_13",	R9A09G011_TIM13_CLK,	 CLK_MAIN_2,   0x424, 9, 0),
178 	DEF_MOD("tim_clk_14",	R9A09G011_TIM14_CLK,	 CLK_MAIN_2,   0x424, 10, 0),
179 	DEF_MOD("tim_clk_15",	R9A09G011_TIM15_CLK,	 CLK_MAIN_2,   0x424, 11, 0),
180 	DEF_MOD("iic_pclk1",	R9A09G011_IIC_PCLK1,	 CLK_SEL_E,    0x424, 12, 0),
181 	DEF_MOD("cperi_grpc",	R9A09G011_CPERI_GRPC_PCLK, CLK_SEL_E,  0x428, 0, 0),
182 	DEF_MOD("tim_clk_16",	R9A09G011_TIM16_CLK,	 CLK_MAIN_2,   0x428, 4, 0),
183 	DEF_MOD("tim_clk_17",	R9A09G011_TIM17_CLK,	 CLK_MAIN_2,   0x428, 5, 0),
184 	DEF_MOD("tim_clk_18",	R9A09G011_TIM18_CLK,	 CLK_MAIN_2,   0x428, 6, 0),
185 	DEF_MOD("tim_clk_19",	R9A09G011_TIM19_CLK,	 CLK_MAIN_2,   0x428, 7, 0),
186 	DEF_MOD("tim_clk_20",	R9A09G011_TIM20_CLK,	 CLK_MAIN_2,   0x428, 8, 0),
187 	DEF_MOD("tim_clk_21",	R9A09G011_TIM21_CLK,	 CLK_MAIN_2,   0x428, 9, 0),
188 	DEF_MOD("tim_clk_22",	R9A09G011_TIM22_CLK,	 CLK_MAIN_2,   0x428, 10, 0),
189 	DEF_MOD("tim_clk_23",	R9A09G011_TIM23_CLK,	 CLK_MAIN_2,   0x428, 11, 0),
190 	DEF_MOD("wdt0_pclk",	R9A09G011_WDT0_PCLK,	 CLK_SEL_E,    0x428, 12, 0),
191 	DEF_MOD("wdt0_clk",	R9A09G011_WDT0_CLK,	 CLK_MAIN,     0x428, 13, 0),
192 	DEF_MOD("cperi_grpf",	R9A09G011_CPERI_GRPF_PCLK, CLK_SEL_E,  0x434, 0, 0),
193 	DEF_MOD("pwm8_clk",	R9A09G011_PWM8_CLK,	 CLK_MAIN,     0x434, 4, 0),
194 	DEF_MOD("pwm9_clk",	R9A09G011_PWM9_CLK,	 CLK_MAIN,     0x434, 5, 0),
195 	DEF_MOD("pwm10_clk",	R9A09G011_PWM10_CLK,	 CLK_MAIN,     0x434, 6, 0),
196 	DEF_MOD("pwm11_clk",	R9A09G011_PWM11_CLK,	 CLK_MAIN,     0x434, 7, 0),
197 	DEF_MOD("pwm12_clk",	R9A09G011_PWM12_CLK,	 CLK_MAIN,     0x434, 8, 0),
198 	DEF_MOD("pwm13_clk",	R9A09G011_PWM13_CLK,	 CLK_MAIN,     0x434, 9, 0),
199 	DEF_MOD("pwm14_clk",	R9A09G011_PWM14_CLK,	 CLK_MAIN,     0x434, 10, 0),
200 	DEF_MOD("cperi_grpg",	R9A09G011_CPERI_GRPG_PCLK, CLK_SEL_E,  0x438, 0, 0),
201 	DEF_MOD("cperi_grph",	R9A09G011_CPERI_GRPH_PCLK, CLK_SEL_E,  0x438, 1, 0),
202 	DEF_MOD("urt_pclk",	R9A09G011_URT_PCLK,	 CLK_SEL_E,    0x438, 4, 0),
203 	DEF_MOD("urt0_clk",	R9A09G011_URT0_CLK,	 CLK_SEL_W0,   0x438, 5, 0),
204 	DEF_MOD("csi0_clk",	R9A09G011_CSI0_CLK,	 CLK_SEL_CSI0, 0x438, 8, 0),
205 	DEF_MOD("csi4_clk",	R9A09G011_CSI4_CLK,	 CLK_SEL_CSI4, 0x438, 12, 0),
206 	DEF_MOD("ca53",		R9A09G011_CA53_CLK,	 CLK_DIV_A,    0x448, 0, 0),
207 };
208 
209 static const struct rzg2l_reset r9a09g011_resets[] = {
210 	DEF_RST(R9A09G011_PFC_PRESETN,		0x600, 2),
211 	DEF_RST_MON(R9A09G011_SDI0_IXRST,	0x608, 0,  6),
212 	DEF_RST_MON(R9A09G011_SDI1_IXRST,	0x608, 1,  7),
213 	DEF_RST_MON(R9A09G011_EMM_IXRST,	0x608, 2,  8),
214 	DEF_RST(R9A09G011_USB_PRESET_N,		0x608, 7),
215 	DEF_RST(R9A09G011_USB_DRD_RESET,	0x608, 8),
216 	DEF_RST(R9A09G011_USB_ARESETN_P,	0x608, 9),
217 	DEF_RST(R9A09G011_USB_ARESETN_H,	0x608, 10),
218 	DEF_RST_MON(R9A09G011_ETH0_RST_HW_N,	0x608, 11, 11),
219 	DEF_RST_MON(R9A09G011_SYC_RST_N,	0x610, 9,  13),
220 	DEF_RST(R9A09G011_TIM_GPB_PRESETN,	0x614, 1),
221 	DEF_RST(R9A09G011_TIM_GPC_PRESETN,	0x614, 2),
222 	DEF_RST_MON(R9A09G011_PWM_GPF_PRESETN,	0x614, 5, 23),
223 	DEF_RST_MON(R9A09G011_CSI_GPG_PRESETN,	0x614, 6, 22),
224 	DEF_RST_MON(R9A09G011_CSI_GPH_PRESETN,	0x614, 7, 23),
225 	DEF_RST(R9A09G011_IIC_GPA_PRESETN,	0x614, 8),
226 	DEF_RST(R9A09G011_IIC_GPB_PRESETN,	0x614, 9),
227 	DEF_RST_MON(R9A09G011_WDT0_PRESETN,	0x614, 12, 19),
228 };
229 
230 static const unsigned int r9a09g011_crit_mod_clks[] __initconst = {
231 	MOD_CLK_BASE + R9A09G011_CA53_CLK,
232 	MOD_CLK_BASE + R9A09G011_CPERI_GRPB_PCLK,
233 	MOD_CLK_BASE + R9A09G011_CPERI_GRPC_PCLK,
234 	MOD_CLK_BASE + R9A09G011_CPERI_GRPF_PCLK,
235 	MOD_CLK_BASE + R9A09G011_CPERI_GRPG_PCLK,
236 	MOD_CLK_BASE + R9A09G011_CPERI_GRPH_PCLK,
237 	MOD_CLK_BASE + R9A09G011_GIC_CLK,
238 	MOD_CLK_BASE + R9A09G011_SYC_CNT_CLK,
239 	MOD_CLK_BASE + R9A09G011_URT_PCLK,
240 };
241 
242 const struct rzg2l_cpg_info r9a09g011_cpg_info = {
243 	/* Core Clocks */
244 	.core_clks = r9a09g011_core_clks,
245 	.num_core_clks = ARRAY_SIZE(r9a09g011_core_clks),
246 	.last_dt_core_clk = LAST_DT_CORE_CLK,
247 	.num_total_core_clks = MOD_CLK_BASE,
248 
249 	/* Critical Module Clocks */
250 	.crit_mod_clks = r9a09g011_crit_mod_clks,
251 	.num_crit_mod_clks = ARRAY_SIZE(r9a09g011_crit_mod_clks),
252 
253 	/* Module Clocks */
254 	.mod_clks = r9a09g011_mod_clks,
255 	.num_mod_clks = ARRAY_SIZE(r9a09g011_mod_clks),
256 	.num_hw_mod_clks = R9A09G011_CA53_CLK + 1,
257 
258 	/* Resets */
259 	.resets = r9a09g011_resets,
260 	.num_resets = ARRAY_SIZE(r9a09g011_resets),
261 
262 	.has_clk_mon_regs = false,
263 };
264