xref: /openbmc/linux/drivers/clk/renesas/rzg2l-cpg.h (revision b97d6790d03b763eca08847a9a5869a4291b9f9a)
10aae437aSGeert Uytterhoeven /* SPDX-License-Identifier: GPL-2.0 */
20aae437aSGeert Uytterhoeven /*
30aae437aSGeert Uytterhoeven  * RZ/G2L Clock Pulse Generator
40aae437aSGeert Uytterhoeven  *
50aae437aSGeert Uytterhoeven  * Copyright (C) 2021 Renesas Electronics Corp.
60aae437aSGeert Uytterhoeven  *
70aae437aSGeert Uytterhoeven  */
80aae437aSGeert Uytterhoeven 
90aae437aSGeert Uytterhoeven #ifndef __RENESAS_RZG2L_CPG_H__
100aae437aSGeert Uytterhoeven #define __RENESAS_RZG2L_CPG_H__
110aae437aSGeert Uytterhoeven 
121561380eSBiju Das #define CPG_SIPLL5_STBY		(0x140)
131561380eSBiju Das #define CPG_SIPLL5_CLK1		(0x144)
141561380eSBiju Das #define CPG_SIPLL5_CLK3		(0x14C)
151561380eSBiju Das #define CPG_SIPLL5_CLK4		(0x150)
161561380eSBiju Das #define CPG_SIPLL5_CLK5		(0x154)
171561380eSBiju Das #define CPG_SIPLL5_MON		(0x15C)
1886e122c0SBiju Das #define CPG_PL1_DDIV		(0x200)
190aae437aSGeert Uytterhoeven #define CPG_PL2_DDIV		(0x204)
200aae437aSGeert Uytterhoeven #define CPG_PL3A_DDIV		(0x208)
217ef9c45aSBiju Das #define CPG_PL6_DDIV		(0x210)
22373bd6f4SBiju Das #define CPG_PL2SDHI_DSEL	(0x218)
23eaff3364SBiju Das #define CPG_CLKSTATUS		(0x280)
24f294a0eaSLad Prabhakar #define CPG_PL3_SSEL		(0x408)
257ef9c45aSBiju Das #define CPG_PL6_SSEL		(0x414)
2670a4af36SBiju Das #define CPG_PL6_ETH_SSEL	(0x418)
2746bb3e15SBiju Das #define CPG_PL5_SDIV		(0x420)
288090bea3SPhil Edworthy #define CPG_RST_MON		(0x680)
296cc859caSBiju Das #define CPG_OTHERFUNC1_REG	(0xBE8)
300aae437aSGeert Uytterhoeven 
311561380eSBiju Das #define CPG_SIPLL5_STBY_RESETB		BIT(0)
321561380eSBiju Das #define CPG_SIPLL5_STBY_RESETB_WEN	BIT(16)
331561380eSBiju Das #define CPG_SIPLL5_STBY_SSCG_EN_WEN	BIT(18)
341561380eSBiju Das #define CPG_SIPLL5_STBY_DOWNSPREAD_WEN	BIT(20)
351561380eSBiju Das #define CPG_SIPLL5_CLK4_RESV_LSB	(0xFF)
361561380eSBiju Das #define CPG_SIPLL5_MON_PLL5_LOCK	BIT(4)
371561380eSBiju Das 
386cc859caSBiju Das #define CPG_OTHERFUNC1_REG_RES0_ON_WEN	BIT(16)
396cc859caSBiju Das 
4046bb3e15SBiju Das #define CPG_PL5_SDIV_DIV_DSI_A_WEN	BIT(16)
4146bb3e15SBiju Das #define CPG_PL5_SDIV_DIV_DSI_B_WEN	BIT(24)
4246bb3e15SBiju Das 
43eaff3364SBiju Das #define CPG_CLKSTATUS_SELSDHI0_STS	BIT(28)
44eaff3364SBiju Das #define CPG_CLKSTATUS_SELSDHI1_STS	BIT(29)
45eaff3364SBiju Das 
46*f9290517SClaudiu Beznea #define CPG_SDHI_CLK_SWITCH_STATUS_TIMEOUT_US	200
47eaff3364SBiju Das 
480aae437aSGeert Uytterhoeven /* n = 0/1/2 for PLL1/4/6 */
490aae437aSGeert Uytterhoeven #define CPG_SAMPLL_CLK1(n)	(0x04 + (16 * n))
500aae437aSGeert Uytterhoeven #define CPG_SAMPLL_CLK2(n)	(0x08 + (16 * n))
510aae437aSGeert Uytterhoeven 
520aae437aSGeert Uytterhoeven #define PLL146_CONF(n)	(CPG_SAMPLL_CLK1(n) << 22 | CPG_SAMPLL_CLK2(n) << 12)
530aae437aSGeert Uytterhoeven 
540aae437aSGeert Uytterhoeven #define DDIV_PACK(offset, bitpos, size) \
550aae437aSGeert Uytterhoeven 		(((offset) << 20) | ((bitpos) << 12) | ((size) << 8))
5686e122c0SBiju Das #define DIVPL1A		DDIV_PACK(CPG_PL1_DDIV, 0, 2)
570aae437aSGeert Uytterhoeven #define DIVPL2A		DDIV_PACK(CPG_PL2_DDIV, 0, 3)
5846bb3e15SBiju Das #define DIVDSILPCLK	DDIV_PACK(CPG_PL2_DDIV, 12, 2)
590aae437aSGeert Uytterhoeven #define DIVPL3A		DDIV_PACK(CPG_PL3A_DDIV, 0, 3)
600aae437aSGeert Uytterhoeven #define DIVPL3B		DDIV_PACK(CPG_PL3A_DDIV, 4, 3)
61f294a0eaSLad Prabhakar #define DIVPL3C		DDIV_PACK(CPG_PL3A_DDIV, 8, 3)
627ef9c45aSBiju Das #define DIVGPU		DDIV_PACK(CPG_PL6_DDIV, 0, 2)
630aae437aSGeert Uytterhoeven 
647c5a2561SBiju Das #define SEL_PLL_PACK(offset, bitpos, size) \
657c5a2561SBiju Das 		(((offset) << 20) | ((bitpos) << 12) | ((size) << 8))
667c5a2561SBiju Das 
67f294a0eaSLad Prabhakar #define SEL_PLL3_3	SEL_PLL_PACK(CPG_PL3_SSEL, 8, 1)
686cc859caSBiju Das #define SEL_PLL5_4	SEL_PLL_PACK(CPG_OTHERFUNC1_REG, 0, 1)
6970a4af36SBiju Das #define SEL_PLL6_2	SEL_PLL_PACK(CPG_PL6_ETH_SSEL, 0, 1)
707ef9c45aSBiju Das #define SEL_GPU2	SEL_PLL_PACK(CPG_PL6_SSEL, 12, 1)
7170a4af36SBiju Das 
72373bd6f4SBiju Das #define SEL_SDHI0	DDIV_PACK(CPG_PL2SDHI_DSEL, 0, 2)
73373bd6f4SBiju Das #define SEL_SDHI1	DDIV_PACK(CPG_PL2SDHI_DSEL, 4, 2)
74373bd6f4SBiju Das 
751561380eSBiju Das #define EXTAL_FREQ_IN_MEGA_HZ	(24)
761561380eSBiju Das 
770aae437aSGeert Uytterhoeven /**
780aae437aSGeert Uytterhoeven  * Definitions of CPG Core Clocks
790aae437aSGeert Uytterhoeven  *
800aae437aSGeert Uytterhoeven  * These include:
810aae437aSGeert Uytterhoeven  *   - Clock outputs exported to DT
820aae437aSGeert Uytterhoeven  *   - External input clocks
830aae437aSGeert Uytterhoeven  *   - Internal CPG clocks
840aae437aSGeert Uytterhoeven  */
850aae437aSGeert Uytterhoeven struct cpg_core_clk {
860aae437aSGeert Uytterhoeven 	const char *name;
870aae437aSGeert Uytterhoeven 	unsigned int id;
880aae437aSGeert Uytterhoeven 	unsigned int parent;
890aae437aSGeert Uytterhoeven 	unsigned int div;
900aae437aSGeert Uytterhoeven 	unsigned int mult;
910aae437aSGeert Uytterhoeven 	unsigned int type;
920aae437aSGeert Uytterhoeven 	unsigned int conf;
930aae437aSGeert Uytterhoeven 	const struct clk_div_table *dtable;
940aae437aSGeert Uytterhoeven 	const char * const *parent_names;
950aae437aSGeert Uytterhoeven 	int flag;
967c5a2561SBiju Das 	int mux_flags;
970aae437aSGeert Uytterhoeven 	int num_parents;
980aae437aSGeert Uytterhoeven };
990aae437aSGeert Uytterhoeven 
1000aae437aSGeert Uytterhoeven enum clk_types {
1010aae437aSGeert Uytterhoeven 	/* Generic */
1020aae437aSGeert Uytterhoeven 	CLK_TYPE_IN,		/* External Clock Input */
1030aae437aSGeert Uytterhoeven 	CLK_TYPE_FF,		/* Fixed Factor Clock */
1040aae437aSGeert Uytterhoeven 	CLK_TYPE_SAM_PLL,
1050aae437aSGeert Uytterhoeven 
1060aae437aSGeert Uytterhoeven 	/* Clock with divider */
1070aae437aSGeert Uytterhoeven 	CLK_TYPE_DIV,
1087c5a2561SBiju Das 
1097c5a2561SBiju Das 	/* Clock with clock source selector */
1107c5a2561SBiju Das 	CLK_TYPE_MUX,
111eaff3364SBiju Das 
112eaff3364SBiju Das 	/* Clock with SD clock source selector */
113eaff3364SBiju Das 	CLK_TYPE_SD_MUX,
1141561380eSBiju Das 
1151561380eSBiju Das 	/* Clock for SIPLL5 */
1161561380eSBiju Das 	CLK_TYPE_SIPLL5,
1176cc859caSBiju Das 
1186cc859caSBiju Das 	/* Clock for PLL5_4 clock source selector */
1196cc859caSBiju Das 	CLK_TYPE_PLL5_4_MUX,
12046bb3e15SBiju Das 
12146bb3e15SBiju Das 	/* Clock for DSI divider */
12246bb3e15SBiju Das 	CLK_TYPE_DSI_DIV,
12346bb3e15SBiju Das 
1240aae437aSGeert Uytterhoeven };
1250aae437aSGeert Uytterhoeven 
1260aae437aSGeert Uytterhoeven #define DEF_TYPE(_name, _id, _type...) \
1270aae437aSGeert Uytterhoeven 	{ .name = _name, .id = _id, .type = _type }
1280aae437aSGeert Uytterhoeven #define DEF_BASE(_name, _id, _type, _parent...) \
1290aae437aSGeert Uytterhoeven 	DEF_TYPE(_name, _id, _type, .parent = _parent)
1300aae437aSGeert Uytterhoeven #define DEF_SAMPLL(_name, _id, _parent, _conf) \
1310aae437aSGeert Uytterhoeven 	DEF_TYPE(_name, _id, CLK_TYPE_SAM_PLL, .parent = _parent, .conf = _conf)
1320aae437aSGeert Uytterhoeven #define DEF_INPUT(_name, _id) \
1330aae437aSGeert Uytterhoeven 	DEF_TYPE(_name, _id, CLK_TYPE_IN)
1340aae437aSGeert Uytterhoeven #define DEF_FIXED(_name, _id, _parent, _mult, _div) \
1350aae437aSGeert Uytterhoeven 	DEF_BASE(_name, _id, CLK_TYPE_FF, _parent, .div = _div, .mult = _mult)
13675b0ad42SPhil Edworthy #define DEF_DIV(_name, _id, _parent, _conf, _dtable) \
1370aae437aSGeert Uytterhoeven 	DEF_TYPE(_name, _id, CLK_TYPE_DIV, .conf = _conf, \
13875b0ad42SPhil Edworthy 		 .parent = _parent, .dtable = _dtable, \
13975b0ad42SPhil Edworthy 		 .flag = CLK_DIVIDER_HIWORD_MASK)
1408282fe00SPhil Edworthy #define DEF_DIV_RO(_name, _id, _parent, _conf, _dtable) \
1418282fe00SPhil Edworthy 	DEF_TYPE(_name, _id, CLK_TYPE_DIV, .conf = _conf, \
1428282fe00SPhil Edworthy 		 .parent = _parent, .dtable = _dtable, \
1438282fe00SPhil Edworthy 		 .flag = CLK_DIVIDER_READ_ONLY)
14475b0ad42SPhil Edworthy #define DEF_MUX(_name, _id, _conf, _parent_names) \
1457c5a2561SBiju Das 	DEF_TYPE(_name, _id, CLK_TYPE_MUX, .conf = _conf, \
146ceb3bfabSPhil Edworthy 		 .parent_names = _parent_names, \
147ceb3bfabSPhil Edworthy 		 .num_parents = ARRAY_SIZE(_parent_names), \
14875b0ad42SPhil Edworthy 		 .mux_flags = CLK_MUX_HIWORD_MASK)
1498282fe00SPhil Edworthy #define DEF_MUX_RO(_name, _id, _conf, _parent_names) \
1508282fe00SPhil Edworthy 	DEF_TYPE(_name, _id, CLK_TYPE_MUX, .conf = _conf, \
1518282fe00SPhil Edworthy 		 .parent_names = _parent_names, \
1528282fe00SPhil Edworthy 		 .num_parents = ARRAY_SIZE(_parent_names), \
1538282fe00SPhil Edworthy 		 .mux_flags = CLK_MUX_READ_ONLY)
154ceb3bfabSPhil Edworthy #define DEF_SD_MUX(_name, _id, _conf, _parent_names) \
155eaff3364SBiju Das 	DEF_TYPE(_name, _id, CLK_TYPE_SD_MUX, .conf = _conf, \
156ceb3bfabSPhil Edworthy 		 .parent_names = _parent_names, \
157ceb3bfabSPhil Edworthy 		 .num_parents = ARRAY_SIZE(_parent_names))
1581561380eSBiju Das #define DEF_PLL5_FOUTPOSTDIV(_name, _id, _parent) \
1591561380eSBiju Das 	DEF_TYPE(_name, _id, CLK_TYPE_SIPLL5, .parent = _parent)
160ceb3bfabSPhil Edworthy #define DEF_PLL5_4_MUX(_name, _id, _conf, _parent_names) \
1616cc859caSBiju Das 	DEF_TYPE(_name, _id, CLK_TYPE_PLL5_4_MUX, .conf = _conf, \
162ceb3bfabSPhil Edworthy 		 .parent_names = _parent_names, \
163ceb3bfabSPhil Edworthy 		 .num_parents = ARRAY_SIZE(_parent_names))
16446bb3e15SBiju Das #define DEF_DSI_DIV(_name, _id, _parent, _flag) \
16546bb3e15SBiju Das 	DEF_TYPE(_name, _id, CLK_TYPE_DSI_DIV, .parent = _parent, .flag = _flag)
1660aae437aSGeert Uytterhoeven 
1670aae437aSGeert Uytterhoeven /**
1680aae437aSGeert Uytterhoeven  * struct rzg2l_mod_clk - Module Clocks definitions
1690aae437aSGeert Uytterhoeven  *
1700aae437aSGeert Uytterhoeven  * @name: handle between common and hardware-specific interfaces
1710aae437aSGeert Uytterhoeven  * @id: clock index in array containing all Core and Module Clocks
1720aae437aSGeert Uytterhoeven  * @parent: id of parent clock
1730aae437aSGeert Uytterhoeven  * @off: register offset
1740aae437aSGeert Uytterhoeven  * @bit: ON/MON bit
17532897e6fSBiju Das  * @is_coupled: flag to indicate coupled clock
1760aae437aSGeert Uytterhoeven  */
1770aae437aSGeert Uytterhoeven struct rzg2l_mod_clk {
1780aae437aSGeert Uytterhoeven 	const char *name;
1790aae437aSGeert Uytterhoeven 	unsigned int id;
1800aae437aSGeert Uytterhoeven 	unsigned int parent;
1810aae437aSGeert Uytterhoeven 	u16 off;
1820aae437aSGeert Uytterhoeven 	u8 bit;
18332897e6fSBiju Das 	bool is_coupled;
1840aae437aSGeert Uytterhoeven };
1850aae437aSGeert Uytterhoeven 
18632897e6fSBiju Das #define DEF_MOD_BASE(_name, _id, _parent, _off, _bit, _is_coupled)	\
1870aae437aSGeert Uytterhoeven 	{ \
1880aae437aSGeert Uytterhoeven 		.name = _name, \
1890aae437aSGeert Uytterhoeven 		.id = MOD_CLK_BASE + (_id), \
1900aae437aSGeert Uytterhoeven 		.parent = (_parent), \
1910aae437aSGeert Uytterhoeven 		.off = (_off), \
1920aae437aSGeert Uytterhoeven 		.bit = (_bit), \
19332897e6fSBiju Das 		.is_coupled = (_is_coupled), \
1940aae437aSGeert Uytterhoeven 	}
1950aae437aSGeert Uytterhoeven 
19632897e6fSBiju Das #define DEF_MOD(_name, _id, _parent, _off, _bit)	\
19732897e6fSBiju Das 	DEF_MOD_BASE(_name, _id, _parent, _off, _bit, false)
19832897e6fSBiju Das 
19932897e6fSBiju Das #define DEF_COUPLED(_name, _id, _parent, _off, _bit)	\
20032897e6fSBiju Das 	DEF_MOD_BASE(_name, _id, _parent, _off, _bit, true)
20132897e6fSBiju Das 
2020aae437aSGeert Uytterhoeven /**
2030aae437aSGeert Uytterhoeven  * struct rzg2l_reset - Reset definitions
2040aae437aSGeert Uytterhoeven  *
2050aae437aSGeert Uytterhoeven  * @off: register offset
2060aae437aSGeert Uytterhoeven  * @bit: reset bit
2078090bea3SPhil Edworthy  * @monbit: monitor bit in CPG_RST_MON register, -1 if none
2080aae437aSGeert Uytterhoeven  */
2090aae437aSGeert Uytterhoeven struct rzg2l_reset {
2100aae437aSGeert Uytterhoeven 	u16 off;
2110aae437aSGeert Uytterhoeven 	u8 bit;
2128090bea3SPhil Edworthy 	s8 monbit;
2130aae437aSGeert Uytterhoeven };
2140aae437aSGeert Uytterhoeven 
2158090bea3SPhil Edworthy #define DEF_RST_MON(_id, _off, _bit, _monbit)	\
2160aae437aSGeert Uytterhoeven 	[_id] = { \
2170aae437aSGeert Uytterhoeven 		.off = (_off), \
2188090bea3SPhil Edworthy 		.bit = (_bit), \
2198090bea3SPhil Edworthy 		.monbit = (_monbit) \
2200aae437aSGeert Uytterhoeven 	}
2218090bea3SPhil Edworthy #define DEF_RST(_id, _off, _bit)	\
2228090bea3SPhil Edworthy 	DEF_RST_MON(_id, _off, _bit, -1)
2230aae437aSGeert Uytterhoeven 
2240aae437aSGeert Uytterhoeven /**
2250aae437aSGeert Uytterhoeven  * struct rzg2l_cpg_info - SoC-specific CPG Description
2260aae437aSGeert Uytterhoeven  *
2270aae437aSGeert Uytterhoeven  * @core_clks: Array of Core Clock definitions
2280aae437aSGeert Uytterhoeven  * @num_core_clks: Number of entries in core_clks[]
2290aae437aSGeert Uytterhoeven  * @last_dt_core_clk: ID of the last Core Clock exported to DT
2300aae437aSGeert Uytterhoeven  * @num_total_core_clks: Total number of Core Clocks (exported + internal)
2310aae437aSGeert Uytterhoeven  *
2320aae437aSGeert Uytterhoeven  * @mod_clks: Array of Module Clock definitions
2330aae437aSGeert Uytterhoeven  * @num_mod_clks: Number of entries in mod_clks[]
2340aae437aSGeert Uytterhoeven  * @num_hw_mod_clks: Number of Module Clocks supported by the hardware
2350aae437aSGeert Uytterhoeven  *
236099ee032SGeert Uytterhoeven  * @resets: Array of Module Reset definitions
237099ee032SGeert Uytterhoeven  * @num_resets: Number of entries in resets[]
238099ee032SGeert Uytterhoeven  *
2390aae437aSGeert Uytterhoeven  * @crit_mod_clks: Array with Module Clock IDs of critical clocks that
2400aae437aSGeert Uytterhoeven  *                 should not be disabled without a knowledgeable driver
2410aae437aSGeert Uytterhoeven  * @num_crit_mod_clks: Number of entries in crit_mod_clks[]
24263804400SPhil Edworthy  * @has_clk_mon_regs: Flag indicating whether the SoC has CLK_MON registers
2430aae437aSGeert Uytterhoeven  */
2440aae437aSGeert Uytterhoeven struct rzg2l_cpg_info {
2450aae437aSGeert Uytterhoeven 	/* Core Clocks */
2460aae437aSGeert Uytterhoeven 	const struct cpg_core_clk *core_clks;
2470aae437aSGeert Uytterhoeven 	unsigned int num_core_clks;
2480aae437aSGeert Uytterhoeven 	unsigned int last_dt_core_clk;
2490aae437aSGeert Uytterhoeven 	unsigned int num_total_core_clks;
2500aae437aSGeert Uytterhoeven 
2510aae437aSGeert Uytterhoeven 	/* Module Clocks */
2520aae437aSGeert Uytterhoeven 	const struct rzg2l_mod_clk *mod_clks;
2530aae437aSGeert Uytterhoeven 	unsigned int num_mod_clks;
2540aae437aSGeert Uytterhoeven 	unsigned int num_hw_mod_clks;
2550aae437aSGeert Uytterhoeven 
2563702cff6SLad Prabhakar 	/* No PM Module Clocks */
2573702cff6SLad Prabhakar 	const unsigned int *no_pm_mod_clks;
2583702cff6SLad Prabhakar 	unsigned int num_no_pm_mod_clks;
2593702cff6SLad Prabhakar 
2600aae437aSGeert Uytterhoeven 	/* Resets */
2610aae437aSGeert Uytterhoeven 	const struct rzg2l_reset *resets;
2620aae437aSGeert Uytterhoeven 	unsigned int num_resets;
2630aae437aSGeert Uytterhoeven 
2640aae437aSGeert Uytterhoeven 	/* Critical Module Clocks that should not be disabled */
2650aae437aSGeert Uytterhoeven 	const unsigned int *crit_mod_clks;
2660aae437aSGeert Uytterhoeven 	unsigned int num_crit_mod_clks;
26763804400SPhil Edworthy 
26863804400SPhil Edworthy 	bool has_clk_mon_regs;
2690aae437aSGeert Uytterhoeven };
2700aae437aSGeert Uytterhoeven 
271c8b08822SBiju Das extern const struct rzg2l_cpg_info r9a07g043_cpg_info;
2720aae437aSGeert Uytterhoeven extern const struct rzg2l_cpg_info r9a07g044_cpg_info;
273a1bcf50aSBiju Das extern const struct rzg2l_cpg_info r9a07g054_cpg_info;
2741dd65bb0SPhil Edworthy extern const struct rzg2l_cpg_info r9a09g011_cpg_info;
2750aae437aSGeert Uytterhoeven 
2760aae437aSGeert Uytterhoeven #endif
277