xref: /optee_os/core/include/dt-bindings/clock/stm32mp21-clksrc.h (revision b2ceba5a8fc9aa384d26c6d4a35f331e7900dc0c)
1*b2ceba5aSNicolas Le Bayon /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */
2*b2ceba5aSNicolas Le Bayon /*
3*b2ceba5aSNicolas Le Bayon  * Copyright (C) STMicroelectronics 2025 - All Rights Reserved
4*b2ceba5aSNicolas Le Bayon  */
5*b2ceba5aSNicolas Le Bayon 
6*b2ceba5aSNicolas Le Bayon #ifndef _DT_BINDINGS_CLOCK_STM32MP21_CLKSRC_H_
7*b2ceba5aSNicolas Le Bayon #define _DT_BINDINGS_CLOCK_STM32MP21_CLKSRC_H_
8*b2ceba5aSNicolas Le Bayon 
9*b2ceba5aSNicolas Le Bayon #define CMD_DIV		0
10*b2ceba5aSNicolas Le Bayon #define CMD_MUX		1
11*b2ceba5aSNicolas Le Bayon #define CMD_FLEXGEN	3
12*b2ceba5aSNicolas Le Bayon #define CMD_OBS		4
13*b2ceba5aSNicolas Le Bayon 
14*b2ceba5aSNicolas Le Bayon #define CMD_ADDR_BIT	(1 << 31)
15*b2ceba5aSNicolas Le Bayon 
16*b2ceba5aSNicolas Le Bayon #define CMD_SHIFT	26
17*b2ceba5aSNicolas Le Bayon #define CMD_MASK	0xFC000000
18*b2ceba5aSNicolas Le Bayon #define CMD_DATA_MASK	0x03FFFFFF
19*b2ceba5aSNicolas Le Bayon 
20*b2ceba5aSNicolas Le Bayon #define DIV_ID_SHIFT	8
21*b2ceba5aSNicolas Le Bayon #define DIV_ID_MASK	0x0000FF00
22*b2ceba5aSNicolas Le Bayon 
23*b2ceba5aSNicolas Le Bayon #define DIV_DIVN_SHIFT	0
24*b2ceba5aSNicolas Le Bayon #define DIV_DIVN_MASK	0x000000FF
25*b2ceba5aSNicolas Le Bayon 
26*b2ceba5aSNicolas Le Bayon #define MUX_ID_SHIFT	4
27*b2ceba5aSNicolas Le Bayon #define MUX_ID_MASK	0x00000FF0
28*b2ceba5aSNicolas Le Bayon 
29*b2ceba5aSNicolas Le Bayon #define MUX_SEL_SHIFT	0
30*b2ceba5aSNicolas Le Bayon #define MUX_SEL_MASK	0x0000000F
31*b2ceba5aSNicolas Le Bayon 
32*b2ceba5aSNicolas Le Bayon /* Flexgen define */
33*b2ceba5aSNicolas Le Bayon #define FLEX_ID_SHIFT	20
34*b2ceba5aSNicolas Le Bayon #define FLEX_SEL_SHIFT	16
35*b2ceba5aSNicolas Le Bayon #define FLEX_PDIV_SHIFT	6
36*b2ceba5aSNicolas Le Bayon #define FLEX_FDIV_SHIFT	0
37*b2ceba5aSNicolas Le Bayon 
38*b2ceba5aSNicolas Le Bayon #define FLEX_ID_MASK	GENMASK_32(25, 20)
39*b2ceba5aSNicolas Le Bayon #define FLEX_SEL_MASK	GENMASK_32(19, 16)
40*b2ceba5aSNicolas Le Bayon #define FLEX_PDIV_MASK	GENMASK_32(15, 6)
41*b2ceba5aSNicolas Le Bayon #define FLEX_FDIV_MASK	GENMASK_32(5, 0)
42*b2ceba5aSNicolas Le Bayon 
43*b2ceba5aSNicolas Le Bayon #define DIV_CFG(div_id, div)	((CMD_DIV << CMD_SHIFT) |\
44*b2ceba5aSNicolas Le Bayon 				 ((div_id) << DIV_ID_SHIFT |\
45*b2ceba5aSNicolas Le Bayon 				 (div)))
46*b2ceba5aSNicolas Le Bayon 
47*b2ceba5aSNicolas Le Bayon #define MUX_CFG(mux_id, sel)	((CMD_MUX << CMD_SHIFT) |\
48*b2ceba5aSNicolas Le Bayon 				 ((mux_id) << MUX_ID_SHIFT |\
49*b2ceba5aSNicolas Le Bayon 				 (sel)))
50*b2ceba5aSNicolas Le Bayon 
51*b2ceba5aSNicolas Le Bayon #define CLK_ADDR_SHIFT		16
52*b2ceba5aSNicolas Le Bayon #define CLK_ADDR_MASK		GENMASK_32(30, 16)
53*b2ceba5aSNicolas Le Bayon #define CLK_ADDR_VAL_MASK	GENMASK_32(15, 0)
54*b2ceba5aSNicolas Le Bayon 
55*b2ceba5aSNicolas Le Bayon #define DIV_LSMCU	0
56*b2ceba5aSNicolas Le Bayon #define DIV_APB1	1
57*b2ceba5aSNicolas Le Bayon #define DIV_APB2	2
58*b2ceba5aSNicolas Le Bayon #define DIV_APB3	3
59*b2ceba5aSNicolas Le Bayon #define DIV_APB4	4
60*b2ceba5aSNicolas Le Bayon #define DIV_APB5	5
61*b2ceba5aSNicolas Le Bayon #define DIV_APBDBG	6
62*b2ceba5aSNicolas Le Bayon #define DIV_RTC		7
63*b2ceba5aSNicolas Le Bayon #define DIV_NB		8
64*b2ceba5aSNicolas Le Bayon 
65*b2ceba5aSNicolas Le Bayon #define MUX_MUXSEL0	0
66*b2ceba5aSNicolas Le Bayon #define MUX_MUXSEL1	1
67*b2ceba5aSNicolas Le Bayon #define MUX_MUXSEL2	2
68*b2ceba5aSNicolas Le Bayon #define MUX_MUXSEL3	3
69*b2ceba5aSNicolas Le Bayon #define MUX_MUXSEL4	4
70*b2ceba5aSNicolas Le Bayon #define MUX_MUXSEL5	5
71*b2ceba5aSNicolas Le Bayon #define MUX_MUXSEL6	6
72*b2ceba5aSNicolas Le Bayon #define MUX_MUXSEL7	7
73*b2ceba5aSNicolas Le Bayon #define MUX_XBARSEL	8
74*b2ceba5aSNicolas Le Bayon #define MUX_RTC		9
75*b2ceba5aSNicolas Le Bayon #define MUX_MCO1	10
76*b2ceba5aSNicolas Le Bayon #define MUX_MCO2	11
77*b2ceba5aSNicolas Le Bayon #define MUX_ADC1	12
78*b2ceba5aSNicolas Le Bayon #define MUX_ADC2	13
79*b2ceba5aSNicolas Le Bayon #define MUX_USB2PHY1	14
80*b2ceba5aSNicolas Le Bayon #define MUX_USB2PHY2	15
81*b2ceba5aSNicolas Le Bayon #define MUX_DTS		16
82*b2ceba5aSNicolas Le Bayon #define MUX_CPU1	17
83*b2ceba5aSNicolas Le Bayon #define MUX_NB		18
84*b2ceba5aSNicolas Le Bayon 
85*b2ceba5aSNicolas Le Bayon #define MUXSEL_HSI		0
86*b2ceba5aSNicolas Le Bayon #define MUXSEL_HSE		1
87*b2ceba5aSNicolas Le Bayon #define MUXSEL_MSI		2
88*b2ceba5aSNicolas Le Bayon 
89*b2ceba5aSNicolas Le Bayon /* KERNEL source clocks */
90*b2ceba5aSNicolas Le Bayon #define MUX_RTC_DISABLED	0x0
91*b2ceba5aSNicolas Le Bayon #define MUX_RTC_LSE		0x1
92*b2ceba5aSNicolas Le Bayon #define MUX_RTC_LSI		0x2
93*b2ceba5aSNicolas Le Bayon #define MUX_RTC_HSE		0x3
94*b2ceba5aSNicolas Le Bayon 
95*b2ceba5aSNicolas Le Bayon #define MUX_MCO1_FLEX61		0x0
96*b2ceba5aSNicolas Le Bayon #define MUX_MCO1_OBSER0		0x1
97*b2ceba5aSNicolas Le Bayon 
98*b2ceba5aSNicolas Le Bayon #define MUX_MCO2_FLEX62		0x0
99*b2ceba5aSNicolas Le Bayon #define MUX_MCO2_OBSER1		0x1
100*b2ceba5aSNicolas Le Bayon 
101*b2ceba5aSNicolas Le Bayon #define MUX_ADC1_FLEX46		0x0
102*b2ceba5aSNicolas Le Bayon #define MUX_ADC1_LSMCU		0x1
103*b2ceba5aSNicolas Le Bayon 
104*b2ceba5aSNicolas Le Bayon #define MUX_ADC2_FLEX47		0x0
105*b2ceba5aSNicolas Le Bayon #define MUX_ADC2_LSMCU		0x1
106*b2ceba5aSNicolas Le Bayon #define MUX_ADC2_FLEX46		0x2
107*b2ceba5aSNicolas Le Bayon 
108*b2ceba5aSNicolas Le Bayon #define MUX_USB2PHY1_FLEX57	0x0
109*b2ceba5aSNicolas Le Bayon #define MUX_USB2PHY1_HSE	0x1
110*b2ceba5aSNicolas Le Bayon 
111*b2ceba5aSNicolas Le Bayon #define MUX_USB2PHY2_FLEX58	0x0
112*b2ceba5aSNicolas Le Bayon #define MUX_USB2PHY2_HSE	0x1
113*b2ceba5aSNicolas Le Bayon 
114*b2ceba5aSNicolas Le Bayon #define MUX_DTS_HSI		0x0
115*b2ceba5aSNicolas Le Bayon #define MUX_DTS_HSE		0x1
116*b2ceba5aSNicolas Le Bayon #define MUX_DTS_MSI		0x2
117*b2ceba5aSNicolas Le Bayon 
118*b2ceba5aSNicolas Le Bayon /* PLLs source clocks */
119*b2ceba5aSNicolas Le Bayon #define PLL_SRC_HSI		0x0
120*b2ceba5aSNicolas Le Bayon #define PLL_SRC_HSE		0x1
121*b2ceba5aSNicolas Le Bayon #define PLL_SRC_MSI		0x2
122*b2ceba5aSNicolas Le Bayon #define PLL_SRC_DISABLED	0x3
123*b2ceba5aSNicolas Le Bayon 
124*b2ceba5aSNicolas Le Bayon /* XBAR source clocks */
125*b2ceba5aSNicolas Le Bayon #define XBAR_SRC_PLL4		0x0
126*b2ceba5aSNicolas Le Bayon #define XBAR_SRC_PLL5		0x1
127*b2ceba5aSNicolas Le Bayon #define XBAR_SRC_PLL6		0x2
128*b2ceba5aSNicolas Le Bayon #define XBAR_SRC_PLL7		0x3
129*b2ceba5aSNicolas Le Bayon #define XBAR_SRC_PLL8		0x4
130*b2ceba5aSNicolas Le Bayon #define XBAR_SRC_HSI		0x5
131*b2ceba5aSNicolas Le Bayon #define XBAR_SRC_HSE		0x6
132*b2ceba5aSNicolas Le Bayon #define XBAR_SRC_MSI		0x7
133*b2ceba5aSNicolas Le Bayon #define XBAR_SRC_HSI_KER	0x8
134*b2ceba5aSNicolas Le Bayon #define XBAR_SRC_HSE_KER	0x9
135*b2ceba5aSNicolas Le Bayon #define XBAR_SRC_MSI_KER	0xA
136*b2ceba5aSNicolas Le Bayon #define XBAR_SRC_SPDIF_SYMB	0xB
137*b2ceba5aSNicolas Le Bayon #define XBAR_SRC_I2S		0xC
138*b2ceba5aSNicolas Le Bayon #define XBAR_SRC_LSI		0xD
139*b2ceba5aSNicolas Le Bayon #define XBAR_SRC_LSE		0xE
140*b2ceba5aSNicolas Le Bayon 
141*b2ceba5aSNicolas Le Bayon /*
142*b2ceba5aSNicolas Le Bayon  * Configure a XBAR channel with its clock source
143*b2ceba5aSNicolas Le Bayon  * ch: XBAR channel number from 0 to 63
144*b2ceba5aSNicolas Le Bayon  * sel: one of the 15 previous XBAR source clocks defines
145*b2ceba5aSNicolas Le Bayon  * pdiv: value of the PREDIV in channel RCC_PREDIVxCFGR register can be either
146*b2ceba5aSNicolas Le Bayon  *       1, 2, 4 or 1024
147*b2ceba5aSNicolas Le Bayon  * fdiv: value of the FINDIV in channel RCC_FINDIVxCFGR register from 1 to 64
148*b2ceba5aSNicolas Le Bayon  */
149*b2ceba5aSNicolas Le Bayon 
150*b2ceba5aSNicolas Le Bayon #define FLEXGEN_CFG(ch, sel, pdiv, fdiv)	((CMD_FLEXGEN << CMD_SHIFT) |\
151*b2ceba5aSNicolas Le Bayon 						 ((ch) << FLEX_ID_SHIFT) |\
152*b2ceba5aSNicolas Le Bayon 						 ((sel) << FLEX_SEL_SHIFT) |\
153*b2ceba5aSNicolas Le Bayon 						 ((pdiv) << FLEX_PDIV_SHIFT) |\
154*b2ceba5aSNicolas Le Bayon 						 ((fdiv) << FLEX_FDIV_SHIFT))
155*b2ceba5aSNicolas Le Bayon 
156*b2ceba5aSNicolas Le Bayon /* Register addresses of MCO1 & MCO2 */
157*b2ceba5aSNicolas Le Bayon #define MCO1			0x488
158*b2ceba5aSNicolas Le Bayon #define MCO2			0x48C
159*b2ceba5aSNicolas Le Bayon 
160*b2ceba5aSNicolas Le Bayon #define MCO_OFF			0
161*b2ceba5aSNicolas Le Bayon #define MCO_ON			1
162*b2ceba5aSNicolas Le Bayon #define MCO_STATUS_SHIFT	8
163*b2ceba5aSNicolas Le Bayon 
164*b2ceba5aSNicolas Le Bayon #define MCO_CFG(addr, sel, status)	(CMD_ADDR_BIT |\
165*b2ceba5aSNicolas Le Bayon 					 ((addr) << CLK_ADDR_SHIFT) |\
166*b2ceba5aSNicolas Le Bayon 					 ((status) << MCO_STATUS_SHIFT) |\
167*b2ceba5aSNicolas Le Bayon 					 (sel))
168*b2ceba5aSNicolas Le Bayon #define OBS_ID_SHIFT		14
169*b2ceba5aSNicolas Le Bayon #define OBS_STATUS_SHIFT	13
170*b2ceba5aSNicolas Le Bayon #define OBS_INTEXT_SHIFT	12
171*b2ceba5aSNicolas Le Bayon #define OBS_DIV_SHIFT		9
172*b2ceba5aSNicolas Le Bayon #define OBS_INV_SHIFT		8
173*b2ceba5aSNicolas Le Bayon #define OBS_SEL_SHIFT		0
174*b2ceba5aSNicolas Le Bayon 
175*b2ceba5aSNicolas Le Bayon #define OBS_ID_MASK		GENMASK_32(14, 14)
176*b2ceba5aSNicolas Le Bayon #define OBS_STATUS_MASK		GENMASK_32(13, 13)
177*b2ceba5aSNicolas Le Bayon #define OBS_INTEXT_MASK		GENMASK_32(12, 12)
178*b2ceba5aSNicolas Le Bayon #define OBS_DIV_MASK		GENMASK_32(11, 9)
179*b2ceba5aSNicolas Le Bayon #define OBS_INV_MASK		(1 << 8)
180*b2ceba5aSNicolas Le Bayon #define OBS_SEL_MASK		GENMASK_32(7, 0)
181*b2ceba5aSNicolas Le Bayon 
182*b2ceba5aSNicolas Le Bayon #define OBS_CFG(id, status, int_ext, div, inv, sel)\
183*b2ceba5aSNicolas Le Bayon 	((CMD_OBS << CMD_SHIFT) |\
184*b2ceba5aSNicolas Le Bayon 	 ((id) << OBS_ID_SHIFT) |\
185*b2ceba5aSNicolas Le Bayon 	 ((status) << OBS_STATUS_SHIFT) |\
186*b2ceba5aSNicolas Le Bayon 	 ((int_ext) << OBS_INTEXT_SHIFT) |\
187*b2ceba5aSNicolas Le Bayon 	 ((div) << OBS_DIV_SHIFT) |\
188*b2ceba5aSNicolas Le Bayon 	 ((inv) << OBS_INV_SHIFT) |\
189*b2ceba5aSNicolas Le Bayon 	 ((sel) << OBS_SEL_SHIFT))
190*b2ceba5aSNicolas Le Bayon 
191*b2ceba5aSNicolas Le Bayon #define OBS0			0
192*b2ceba5aSNicolas Le Bayon #define OBS1			1
193*b2ceba5aSNicolas Le Bayon 
194*b2ceba5aSNicolas Le Bayon #define OBS_OFF			0
195*b2ceba5aSNicolas Le Bayon #define OBS_ON			1
196*b2ceba5aSNicolas Le Bayon 
197*b2ceba5aSNicolas Le Bayon #define OBS_INT			0
198*b2ceba5aSNicolas Le Bayon #define OBS_EXT			1
199*b2ceba5aSNicolas Le Bayon 
200*b2ceba5aSNicolas Le Bayon #define OBS_DIV1		0
201*b2ceba5aSNicolas Le Bayon #define OBS_DIV2		1
202*b2ceba5aSNicolas Le Bayon #define OBS_DIV4		2
203*b2ceba5aSNicolas Le Bayon #define OBS_DIV8		3
204*b2ceba5aSNicolas Le Bayon #define OBS_DIV16		4
205*b2ceba5aSNicolas Le Bayon #define OBS_DIV32		5
206*b2ceba5aSNicolas Le Bayon #define OBS_DIV64		6
207*b2ceba5aSNicolas Le Bayon #define OBS_DIV128		7
208*b2ceba5aSNicolas Le Bayon 
209*b2ceba5aSNicolas Le Bayon #define OBS_NO_INV		0
210*b2ceba5aSNicolas Le Bayon #define OBS_INV			1
211*b2ceba5aSNicolas Le Bayon 
212*b2ceba5aSNicolas Le Bayon #define OBS_INT_CFG(id, status, div, inv, sel)\
213*b2ceba5aSNicolas Le Bayon 		OBS_CFG((id), (status), OBS_INT, (div), (inv), (sel))
214*b2ceba5aSNicolas Le Bayon 
215*b2ceba5aSNicolas Le Bayon #define OBS_EXT_CFG(id, status, div, inv, sel)\
216*b2ceba5aSNicolas Le Bayon 		OBS_CFG((id), (status), OBS_EXT, (div), (inv), (sel))
217*b2ceba5aSNicolas Le Bayon 
218*b2ceba5aSNicolas Le Bayon /* define for st,pll /csg */
219*b2ceba5aSNicolas Le Bayon #define SSCG_MODE_CENTER_SPREAD	0
220*b2ceba5aSNicolas Le Bayon #define SSCG_MODE_DOWN_SPREAD	1
221*b2ceba5aSNicolas Le Bayon 
222*b2ceba5aSNicolas Le Bayon /* define for st,drive */
223*b2ceba5aSNicolas Le Bayon #define LSEDRV_LOWEST		0
224*b2ceba5aSNicolas Le Bayon #define LSEDRV_MEDIUM_LOW	2
225*b2ceba5aSNicolas Le Bayon #define LSEDRV_MEDIUM_HIGH	1
226*b2ceba5aSNicolas Le Bayon #define LSEDRV_HIGHEST		3
227*b2ceba5aSNicolas Le Bayon 
228*b2ceba5aSNicolas Le Bayon #endif /* _DT_BINDINGS_CLOCK_STM32MP21_CLKSRC_H_ */
229