~funderscore blog cgit wiki get in touch
aboutsummaryrefslogtreecommitdiff
blob: e638bcef7bc80b9f30ae8d18342974ba05cc85b0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
STMicroelectronics STM32MP1 clock tree initialization
=====================================================

The STM32MP1 clock tree initialization is based on device tree information
for RCC IP node (st,stm32mp1-rcc) and on fixed-clock nodes.

RCC IP = st,stm32mp1-rcc
========================

The RCC IP is both a reset and a clock controller but this documentation only
describes the fields added for clock tree initialization which are not present
in Linux binding for compatible "st,stm32mp1-rcc" defined in st,stm32mp1-rcc.txt
file.

This parent node may optionally have additional children nodes which define
specific init values for RCC elements.

The added properties for clock tree initialization are:

Required properties:
- st,clksrc : The clock sources configuration array in a platform specific
              order.

  For the STM32MP15x family there are 9 clock sources selector which are
  configured in the following order:
	MPU AXI MCU PLL12 PLL3 PLL4 RTC MCO1 MCO2

  Clock source configuration values are defined by macros CLK_<NAME>_<SOURCE>
  from dt-bindings/clock/stm32mp1-clksrc.h.

  Example:
	st,clksrc = <
		CLK_MPU_PLL1P
		CLK_AXI_PLL2P
		CLK_MCU_PLL3P
		CLK_PLL12_HSE
		CLK_PLL3_HSE
		CLK_PLL4_HSE
		CLK_RTC_LSE
		CLK_MCO1_DISABLED
		CLK_MCO2_DISABLED
	>;

- st,clkdiv : The clock main dividers value specified in an array
              in a platform specific order.

  When used, it shall describe the whole clock dividers tree.

  For the STM32MP15x family there are 11 dividers values expected.
  They shall be configured in the following order:
		MPU AXI MCU APB1 APB2 APB3 APB4 APB5 RTC MCO1 MCO2

  The each divider value uses the DIV coding defined in RCC associated
  register RCC_xxxDIVR. In most the case, it is:
		0x0: not divided
		0x1: division by 2
		0x2: division by 4
		0x3: division by 8
		...

  Note that for RTC MCO1 MCO2, the coding is different:
		0x0: not divided
		0x1: division by 2
		0x2: division by 3
		0x3: division by 4
		...

  Example:
	st,clkdiv = <
		1 /*MPU*/
		0 /*AXI*/
		0 /*MCU*/
		1 /*APB1*/
		1 /*APB2*/
		1 /*APB3*/
		1 /*APB4*/
		2 /*APB5*/
		23 /*RTC*/
		0 /*MCO1*/
		0 /*MCO2*/
	>;

Optional Properties:
- children for a PLL configuration with "st,stm32mp1-pll" compatible

  each PLL children nodes for PLL1 to PLL4 (see ref manual for details)
  are listed with associated reg 0 to 3.
  PLLx is off when the associated node is absent or deactivated.

  For PLL1, when the node is absent, the frequency of the OPP node is used
  to compute the PLL setting (see compatible "operating-points-v2" in
  opp/opp.txt for details).

  Here are the available properties for each PLL node:
    - compatible: should be "st,stm32mp1-pll"

    - reg: index of the pll instance

    - cfg: The parameters for PLL configuration in the following order:
           DIVM DIVN DIVP DIVQ DIVR Output.

	DIVx values are defined as in RCC spec:
		0x0: bypass (division by 1)
		0x1: division by 2
		0x2: division by 3
		0x3: division by 4
		...

	Output contains a bitfield for each output value (1:ON/0:OFF)
		BIT(0) => output P : DIVPEN
		BIT(1) => output Q : DIVQEN
		BIT(2) => output R : DIVREN
	  NB: macro PQR(p,q,r) can be used to build this value
	      with p,q,r = 0 or 1.

    - frac : Fractional part of the multiplication factor
             (optional, PLL is in integer mode when absent).

    - csg : Clock Spreading Generator (optional) with parameters in the
	    following order: MOD_PER INC_STEP SSCG_MODE.

	MOD_PER: Modulation Period Adjustment
	INC_STEP: Modulation Depth Adjustment
	SSCG_MODE: Spread spectrum clock generator mode, with associated
		   defined from stm32mp1-clksrc.h:
			- SSCG_MODE_CENTER_SPREAD = 0
			- SSCG_MODE_DOWN_SPREAD = 1

    Example:
	st,pll@0 {
		compatible = "st,stm32mp1-pll";
		reg = <0>;
		cfg = < 1 53 0 0 0 1 >;
		frac = < 0x810 >;
	};
	st,pll@1 {
		compatible = "st,stm32mp1-pll";
		reg = <1>;
		cfg = < 1 43 1 0 0 PQR(0,1,1) >;
		csg = < 10 20 1 >;
	};
	st,pll@2 {
		compatible = "st,stm32mp1-pll";
		reg = <2>;
		cfg = < 2 85 3 13 3 0 >;
		csg = < 10 20 SSCG_MODE_CENTER_SPREAD >;
		};
	st,pll@3 {
		compatible = "st,stm32mp1-pll";
		reg = <3>;
		cfg = < 2 78 4 7 9 3 >;
	};

- st,pkcs : used to configure the peripherals kernel clock selection.

  The property is a list of peripheral kernel clock source identifiers defined
  by macros CLK_<KERNEL-CLOCK>_<PARENT-CLOCK> as defined by header file
  dt-bindings/clock/stm32mp1-clksrc.h.

  st,pkcs may not list all the kernel clocks and has no ordering requirements.

  Example:
	st,pkcs = <
		CLK_STGEN_HSE
		CLK_CKPER_HSI
		CLK_USBPHY_PLL2P
		CLK_DSI_PLL2Q
		CLK_I2C46_HSI
		CLK_UART1_HSI
		CLK_UART24_HSI
	>;

other clocks = fixed-clock
==========================

The clock tree is also based on 5 fixed-clock in clocks node
used to define the state of associated ST32MP1 oscillators:
  - clk-lsi
  - clk-lse
  - clk-hsi
  - clk-hse
  - clk-csi

At boot the clock tree initialization will
  - enable oscillators present in device tree and not disabled
    (node with status="disabled"),
  - disable HSI oscillator if the node is absent (always activated by bootrom)
    and not disabled (node with status="disabled").

Optional properties :

a) for external oscillator: "clk-lse", "clk-hse"

  4 optional fields are managed
  - "st,bypass" configures the oscillator bypass mode (HSEBYP, LSEBYP)
  - "st,digbypass" configures the bypass mode as full-swing digital
    signal (DIGBYP)
  - "st,css" activates the clock security system (HSECSSON, LSECSSON)
  - "st,drive" (only for LSE) contains the value of the drive for the
     oscillator (see LSEDRV_ defined in the file
     dt-bindings/clock/stm32mp1-clksrc.h)

  Example board file:
	/ {
		clocks {
			clk_hse: clk-hse {
				#clock-cells = <0>;
				compatible = "fixed-clock";
				clock-frequency = <64000000>;
				st,bypass;
			};

			clk_lse: clk-lse {
				#clock-cells = <0>;
				compatible = "fixed-clock";
				clock-frequency = <32768>;
				st,css;
				st,drive = <LSEDRV_LOWEST>;
			};
	};

b) for internal oscillator: "clk-hsi"

  Internally HSI clock is fixed to 64MHz for STM32MP157 SoC.
  In device tree, clk-hsi is the clock after HSIDIV (clk_hsi in RCC
  doc). So this clock frequency is used to compute the expected HSI_DIV
  for the clock tree initialization.

  Example with HSIDIV = /1:
	/ {
		clocks {
			clk_hsi: clk-hsi {
				#clock-cells = <0>;
				compatible = "fixed-clock";
				clock-frequency = <64000000>;
			};
	};

  Example with HSIDIV = /2
	/ {
		clocks {
			clk_hsi: clk-hsi {
				#clock-cells = <0>;
				compatible = "fixed-clock";
				clock-frequency = <32000000>;
			};
	};

Example of clock tree initialization
====================================

/ {
	clocks {
		bootph-all;
		clk_hse: clk-hse {
			bootph-all;
			#clock-cells = <0>;
			compatible = "fixed-clock";
			clock-frequency = <24000000>;
			st,digbypass;
		};

		clk_hsi: clk-hsi {
			bootph-all;
			#clock-cells = <0>;
			compatible = "fixed-clock";
			clock-frequency = <64000000>;
		};

		clk_lse: clk-lse {
			bootph-all;
			#clock-cells = <0>;
			compatible = "fixed-clock";
			clock-frequency = <32768>;
		};

		clk_lsi: clk-lsi {
			bootph-all;
			#clock-cells = <0>;
			compatible = "fixed-clock";
			clock-frequency = <32000>;
		};

		clk_csi: clk-csi {
			bootph-all;
			#clock-cells = <0>;
			compatible = "fixed-clock";
			clock-frequency = <4000000>;
		};
	};

	soc {

		rcc: rcc@50000000 {
			bootph-all;
			compatible = "st,stm32mp1-rcc", "syscon";
			reg = <0x50000000 0x1000>;
			#address-cells = <1>;
			#size-cells = <0>;
			#clock-cells = <1>;
			#reset-cells = <1>;
			interrupts = <GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>;

			st,clksrc = <
				CLK_MPU_PLL1P
				CLK_AXI_PLL2P
				CLK_MCU_PLL3P
				CLK_PLL12_HSE
				CLK_PLL3_HSE
				CLK_PLL4_HSE
				CLK_RTC_LSE
				CLK_MCO1_DISABLED
				CLK_MCO2_DISABLED
			>;

			st,clkdiv = <
				1 /*MPU*/
				0 /*AXI*/
				0 /*MCU*/
				1 /*APB1*/
				1 /*APB2*/
				1 /*APB3*/
				1 /*APB4*/
				2 /*APB5*/
				23 /*RTC*/
				0 /*MCO1*/
				0 /*MCO2*/
			>;

			st,pkcs = <
				CLK_CKPER_HSE
				CLK_FMC_ACLK
				CLK_QSPI_ACLK
				CLK_ETH_DISABLED
				CLK_SDMMC12_PLL4P
				CLK_DSI_DSIPLL
				CLK_STGEN_HSE
				CLK_USBPHY_HSE
				CLK_SPI2S1_PLL3Q
				CLK_SPI2S23_PLL3Q
				CLK_SPI45_HSI
				CLK_SPI6_HSI
				CLK_I2C46_HSI
				CLK_SDMMC3_PLL4P
				CLK_USBO_USBPHY
				CLK_ADC_CKPER
				CLK_CEC_LSE
				CLK_I2C12_HSI
				CLK_I2C35_HSI
				CLK_UART1_HSI
				CLK_UART24_HSI
				CLK_UART35_HSI
				CLK_UART6_HSI
				CLK_UART78_HSI
				CLK_SPDIF_PLL4P
				CLK_FDCAN_PLL4Q
				CLK_SAI1_PLL3Q
				CLK_SAI2_PLL3Q
				CLK_SAI3_PLL3Q
				CLK_SAI4_PLL3Q
				CLK_RNG1_LSI
				CLK_RNG2_LSI
				CLK_LPTIM1_PCLK1
				CLK_LPTIM23_PCLK3
				CLK_LPTIM45_LSE
			>;

			/* VCO = 1300.0 MHz => P = 650 (CPU) */
			pll1: st,pll@0 {
				compatible = "st,stm32mp1-pll";
				reg = <0>;
				cfg = < 2 80 0 0 0 PQR(1,0,0) >;
				frac = < 0x800 >;
				bootph-all;
			};

			/* VCO = 1066.0 MHz => P = 266 (AXI), Q = 533 (GPU),
			                       R = 533 (DDR) */
			pll2: st,pll@1 {
				compatible = "st,stm32mp1-pll";
				reg = <1>;
				cfg = < 2 65 1 0 0 PQR(1,1,1) >;
				frac = < 0x1400 >;
				bootph-all;
			};

			/* VCO = 417.8 MHz => P = 209, Q = 24, R = 11 */
			pll3: st,pll@2 {
				compatible = "st,stm32mp1-pll";
				reg = <2>;
				cfg = < 1 33 1 16 36 PQR(1,1,1) >;
				frac = < 0x1a04 >;
				bootph-all;
			};

			/* VCO = 594.0 MHz => P = 99, Q = 74, R = 74 */
			pll4: st,pll@3 {
				compatible = "st,stm32mp1-pll";
				reg = <3>;
				cfg = < 3 98 5 7 7 PQR(1,1,1) >;
				bootph-all;
			};
		};
	};
};