blob: 560ca0ae4add8f8494a76b3d8bee83061eea1e66 [file] [log] [blame]
Nicolas Le Bayonc7b37052023-09-29 09:58:26 +02001/* SPDX-License-Identifier: GPL-2.0-only OR BSD-3-Clause */
2/*
3 * Copyright (C) 2025, STMicroelectronics - All Rights Reserved
4 */
5
6#ifndef _DT_BINDINGS_CLOCK_STM32MP21_CLKSRC_H_
7#define _DT_BINDINGS_CLOCK_STM32MP21_CLKSRC_H_
8
9#define CMD_DIV 0
10#define CMD_MUX 1
11#define CMD_CLK 2
12#define CMD_FLEXGEN 3
13
14#define CMD_ADDR_BIT 0x80000000
15
16#define CMD_SHIFT 26
17#define CMD_MASK 0xFC000000
18#define CMD_DATA_MASK 0x03FFFFFF
19
20#define DIV_ID_SHIFT 8
21#define DIV_ID_MASK 0x0000FF00
22
23#define DIV_DIVN_SHIFT 0
24#define DIV_DIVN_MASK 0x000000FF
25
26#define MUX_ID_SHIFT 4
27#define MUX_ID_MASK 0x00000FF0
28
29#define MUX_SEL_SHIFT 0
30#define MUX_SEL_MASK 0x0000000F
31
32/* CLK define */
33#define CLK_ON_MASK BIT(21)
34#define CLK_ON_SHIFT 21
35
36#define CLK_ID_MASK GENMASK_32(20, 12)
37#define CLK_ID_SHIFT 12
38
39#define CLK_NO_DIV_MASK 0x0000080
40#define CLK_DIV_MASK GENMASK_32(10, 5)
41#define CLK_DIV_SHIFT 5
42
43#define CLK_NO_SEL_MASK 0x00000010
44#define CLK_SEL_MASK GENMASK_32(3, 0)
45#define CLK_SEL_SHIFT 0
46
47#define CLK_CFG(clk_id, sel, div, state) ((CMD_CLK << CMD_SHIFT) |\
48 ((state) << CLK_ON_SHIFT) |\
49 ((clk_id) << CLK_ID_SHIFT) |\
50 ((div) << CLK_DIV_SHIFT) |\
51 ((sel) << CLK_SEL_SHIFT))
52
53#define CLK_OFF 0
54#define CLK_ON 1
55#define CLK_NODIV 0x00000040
56#define CLK_NOMUX 0x00000010
57
58/* Flexgen define */
59#define FLEX_ID_SHIFT 20
60#define FLEX_SEL_SHIFT 16
61#define FLEX_PDIV_SHIFT 6
62#define FLEX_FDIV_SHIFT 0
63
64#define FLEX_ID_MASK GENMASK_32(25, 20)
65#define FLEX_SEL_MASK GENMASK_32(19, 16)
66#define FLEX_PDIV_MASK GENMASK_32(15, 6)
67#define FLEX_FDIV_MASK GENMASK_32(5, 0)
68
69#define DIV_CFG(div_id, div) ((CMD_DIV << CMD_SHIFT) |\
70 ((div_id) << DIV_ID_SHIFT |\
71 (div)))
72
73#define MUX_CFG(mux_id, sel) ((CMD_MUX << CMD_SHIFT) |\
74 ((mux_id) << MUX_ID_SHIFT |\
75 (sel)))
76
77#define CLK_ADDR_SHIFT 16
78#define CLK_ADDR_MASK 0x7FFF0000
79#define CLK_ADDR_VAL_MASK 0xFFFF
80
81#define DIV_LSMCU 0
82#define DIV_APB1 1
83#define DIV_APB2 2
84#define DIV_APB3 3
85#define DIV_APB4 4
86#define DIV_APB5 5
87#define DIV_APBDBG 6
88#define DIV_RTC 7
89#define DIV_NB 8
90
91#define MUX_MUXSEL0 0
92#define MUX_MUXSEL1 1
93#define MUX_MUXSEL2 2
94#define MUX_MUXSEL3 3
95#define MUX_MUXSEL4 4
96#define MUX_MUXSEL5 5
97#define MUX_MUXSEL6 6
98#define MUX_MUXSEL7 7
99#define MUX_XBARSEL 8
100#define MUX_RTC 9
101#define MUX_MCO1 10
102#define MUX_MCO2 11
103#define MUX_ADC1 12
104#define MUX_ADC2 13
105#define MUX_USB2PHY1 14
106#define MUX_USB2PHY2 15
107#define MUX_DTS 16
108#define MUX_CPU1 17
109#define MUX_NB 18
110
111#define MUXSEL_HSI 0
112#define MUXSEL_HSE 1
113#define MUXSEL_MSI 2
114
115/* KERNEL source clocks */
116#define MUX_RTC_DISABLED 0x0
117#define MUX_RTC_LSE 0x1
118#define MUX_RTC_LSI 0x2
119#define MUX_RTC_HSE 0x3
120
121#define MUX_MCO1_FLEX61 0x0
122#define MUX_MCO1_OBSER0 0x1
123
124#define MUX_MCO2_FLEX62 0x0
125#define MUX_MCO2_OBSER1 0x1
126
127#define MUX_ADC1_FLEX46 0x0
128#define MUX_ADC1_LSMCU 0x1
129
130#define MUX_ADC2_FLEX47 0x0
131#define MUX_ADC2_LSMCU 0x1
132#define MUX_ADC2_FLEX46 0x2
133
134#define MUX_USB2PHY1_FLEX57 0x0
135#define MUX_USB2PHY1_HSE 0x1
136
137#define MUX_USB2PHY2_FLEX58 0x0
138#define MUX_USB2PHY2_HSE 0x1
139
140#define MUX_DTS_HSI 0x0
141#define MUX_DTS_HSE 0x1
142#define MUX_DTS_MSI 0x2
143
144/* PLLs source clocks */
145#define PLL_SRC_HSI 0x0
146#define PLL_SRC_HSE 0x1
147#define PLL_SRC_MSI 0x2
148#define PLL_SRC_DISABLED 0x3
149
150/* XBAR source clocks */
151#define XBAR_SRC_PLL4 0x0
152#define XBAR_SRC_PLL5 0x1
153#define XBAR_SRC_PLL6 0x2
154#define XBAR_SRC_PLL7 0x3
155#define XBAR_SRC_PLL8 0x4
156#define XBAR_SRC_HSI 0x5
157#define XBAR_SRC_HSE 0x6
158#define XBAR_SRC_MSI 0x7
159#define XBAR_SRC_HSI_KER 0x8
160#define XBAR_SRC_HSE_KER 0x9
161#define XBAR_SRC_MSI_KER 0xA
162#define XBAR_SRC_SPDIF_SYMB 0xB
163#define XBAR_SRC_I2S 0xC
164#define XBAR_SRC_LSI 0xD
165#define XBAR_SRC_LSE 0xE
166
167/*
168 * Configure a XBAR channel with its clock source
169 * channel_nb: XBAR channel number from 0 to 63
170 * channel_src: one of the 15 previous XBAR source clocks defines
171 * channel_prediv: value of the PREDIV in channel RCC_PREDIVxCFGR register
172 * can be either 1, 2, 4 or 1024
173 * channel_findiv: value of the FINDIV in channel RCC_FINDIVxCFGR register
174 * from 1 to 64
175 */
176
177#define FLEXGEN_CFG(ch, sel, pdiv, fdiv) ((CMD_FLEXGEN << CMD_SHIFT) |\
178 ((ch) << FLEX_ID_SHIFT) |\
179 ((sel) << FLEX_SEL_SHIFT) |\
180 ((pdiv) << FLEX_PDIV_SHIFT) |\
181 ((fdiv) << FLEX_FDIV_SHIFT))
182
183/* Register addresses of MCO1 & MCO2 */
184#define MCO1 0x488
185#define MCO2 0x48C
186
187#define MCO_OFF 0
188#define MCO_ON 1
189#define MCO_STATUS_SHIFT 8
190
191#define MCO_CFG(addr, sel, status) (CMD_ADDR_BIT |\
192 ((addr) << CLK_ADDR_SHIFT) |\
193 ((status) << MCO_STATUS_SHIFT) |\
194 (sel))
195
196/* define for st,pll /csg */
197#define SSCG_MODE_CENTER_SPREAD 0
198#define SSCG_MODE_DOWN_SPREAD 1
199
200/* define for st,drive */
201#define LSEDRV_LOWEST 0
202#define LSEDRV_MEDIUM_LOW 2
203#define LSEDRV_MEDIUM_HIGH 1
204#define LSEDRV_HIGHEST 3
205
206#endif /* _DT_BINDINGS_CLOCK_STM32MP21_CLKSRC_H_ */