1 /*
2  * Copyright (c) 2023 STMicroelectronics
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 #ifndef ZEPHYR_INCLUDE_DT_BINDINGS_CLOCK_STM32_COMMON_CLOCKS_H_
7 #define ZEPHYR_INCLUDE_DT_BINDINGS_CLOCK_STM32_COMMON_CLOCKS_H_
8 
9 /** System clock */
10 #define STM32_SRC_SYSCLK	0x001
11 /** Fixed clocks  */
12 #define STM32_SRC_LSE		0x002
13 #define STM32_SRC_LSI		0x003
14 
15 /** Dummy: Add a specifier when no selection is possible */
16 #define NO_SEL			0xFF
17 
18 #define STM32_CLOCK_DIV_SHIFT	12
19 
20 /** Clock divider */
21 #define STM32_CLOCK_DIV(div)	(((div) - 1) << STM32_CLOCK_DIV_SHIFT)
22 
23 /** Helper macros to pack RCC clock source selection register info in the DT */
24 #define STM32_DT_CLKSEL_REG_MASK	0xFFFFU
25 #define STM32_DT_CLKSEL_REG_SHIFT	0U
26 #define STM32_DT_CLKSEL_SHIFT_MASK	0x3FU
27 #define STM32_DT_CLKSEL_SHIFT_SHIFT	16U
28 #define STM32_DT_CLKSEL_MASK_MASK	0x1FU
29 #define STM32_DT_CLKSEL_MASK_SHIFT	22U
30 #define STM32_DT_CLKSEL_VAL_MASK	0x1FU
31 #define STM32_DT_CLKSEL_VAL_SHIFT	27U
32 
33 /**
34  * @brief Pack STM32 source clock selection RCC register bit fields for the DT
35  *
36  * @param val    Clock configuration field value
37  * @param mask   Mask of register field in RCC register
38  * @param shift  Position of field within RCC register (= field LSB's index)
39  * @param reg    Offset to target clock configuration register in RCC
40  *
41  * @note 'reg' range:    0x0~0xFFFF   [ 00 : 15 ]
42  * @note 'shift' range:  0~63         [ 16 : 21 ]
43  * @note 'mask' range:   0x00~0x1F    [ 22 : 26 ]
44  * @note 'val' range:    0x00~0x1F    [ 27 : 31 ]
45  */
46 #define STM32_DT_CLOCK_SELECT(val, mask, shift, reg)					\
47 	((((reg) & STM32_DT_CLKSEL_REG_MASK) << STM32_DT_CLKSEL_REG_SHIFT) |		\
48 	 (((shift) & STM32_DT_CLKSEL_SHIFT_MASK) << STM32_DT_CLKSEL_SHIFT_SHIFT) |	\
49 	 (((mask) & STM32_DT_CLKSEL_MASK_MASK) << STM32_DT_CLKSEL_MASK_SHIFT) |		\
50 	 (((val) & STM32_DT_CLKSEL_VAL_MASK) << STM32_DT_CLKSEL_VAL_SHIFT))
51 
52 /**
53  * Pack RCC clock register offset and bit in two 32-bit values
54  * as expected for the Device Tree `clocks` property on STM32.
55  *
56  * @param bus STM32 bus name (expands to STM32_CLOCK_BUS_{bus})
57  * @param bit Clock bit
58  */
59 #define STM32_CLOCK(bus, bit) (STM32_CLOCK_BUS_##bus) (1 << bit)
60 
61 #endif /* ZEPHYR_INCLUDE_DT_BINDINGS_CLOCK_STM32_COMMON_CLOCKS_H_ */
62