1 /*
2  * Copyright (c) 2024 STMicroelectronics
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 #ifndef ZEPHYR_INCLUDE_DT_BINDINGS_CLOCK_STM32WB0_CLOCK_H_
7 #define ZEPHYR_INCLUDE_DT_BINDINGS_CLOCK_STM32WB0_CLOCK_H_
8 
9 /** Define system & low-speed clocks */
10 #include "stm32_common_clocks.h"
11 
12 /** Other fixed clocks.
13  * - CLKSLOWMUX: used to query slow clock tree frequency
14  * - CLK16MHZ: secondary clock for LPUART, SPI3/I2S and BLE
15  * - CLK32MHZ: secondary clock for SPI3/I2S and BLE
16  */
17 #define STM32_SRC_CLKSLOWMUX		(STM32_SRC_LSI + 1)
18 #define STM32_SRC_CLK16MHZ		(STM32_SRC_CLKSLOWMUX + 1)
19 #define STM32_SRC_CLK32MHZ		(STM32_SRC_CLK16MHZ + 1)
20 
21 /** Bus clocks */
22 #define STM32_CLOCK_BUS_AHB0	0x50
23 #define STM32_CLOCK_BUS_APB0	0x54
24 #define STM32_CLOCK_BUS_APB1	0x58
25 #define STM32_CLOCK_BUS_APB2	0x60
26 
27 #define STM32_PERIPH_BUS_MIN	STM32_CLOCK_BUS_AHB0
28 #define STM32_PERIPH_BUS_MAX	STM32_CLOCK_BUS_APB2
29 
30 #define STM32_CLOCK_REG_MASK	(0xFFFFU)
31 #define STM32_CLOCK_REG_SHIFT	(0U)
32 #define STM32_CLOCK_SHIFT_MASK  (0x3FU)
33 #define STM32_CLOCK_SHIFT_SHIFT (16U)
34 #define STM32_CLOCK_MASK_MASK   (0x1FU)
35 #define STM32_CLOCK_MASK_SHIFT  (22U)
36 #define STM32_CLOCK_VAL_MASK    STM32_CLOCK_MASK_MASK
37 #define STM32_CLOCK_VAL_SHIFT   (27U)
38 
39 /**
40  * @brief STM32 clock configuration bit field
41  *
42  * @param reg	Offset to target configuration register in RCC
43  * @param shift	Position of field within RCC register (= field LSB's index)
44  * @param mask	Mask of field in RCC register
45  * @param val	Field value
46  *
47  * @note 'reg' range:	0x0~0xFFFF	[ 00 : 15 ]
48  * @note 'shift' range:	0~63		[ 16 : 21 ]
49  * @note 'mask' range:	0x00~0x1F	[ 22 : 26 ]
50  * @note 'val' range:	0x00~0x1F	[ 27 : 31 ]
51  */
52 #define STM32_DOMAIN_CLOCK(val, mask, shift, reg)				\
53 	((((reg) & STM32_CLOCK_REG_MASK) << STM32_CLOCK_REG_SHIFT) |		\
54 	 (((shift) & STM32_CLOCK_SHIFT_MASK) << STM32_CLOCK_SHIFT_SHIFT) |	\
55 	 (((mask) & STM32_CLOCK_MASK_MASK) << STM32_CLOCK_MASK_SHIFT) |		\
56 	 (((val) & STM32_CLOCK_VAL_MASK) << STM32_CLOCK_VAL_SHIFT))
57 
58 /** @brief RCC_CFGR register offset */
59 #define CFGR_REG	0x08
60 
61 /** @brief RCC_APB2ENR register offset */
62 #define APB2ENR_REG	0x60
63 
64 /** @brief Device clk sources selection helpers */
65 #define LPUART1_SEL(val)	STM32_DOMAIN_CLOCK(val, 1, 13, CFGR_REG)	/* WB05/WB09 only */
66 #define SPI2_I2S2_SEL(val)	STM32_DOMAIN_CLOCK(val, 1, 22, CFGR_REG)	/* WB06/WB07 only */
67 /* `mask` is only 0x1 for WB06/WB07, but a single definition with mask=0x3 is acceptable */
68 #define SPI3_I2S3_SEL(val)	STM32_DOMAIN_CLOCK(val, 3, 22, CFGR_REG)
69 
70 #endif /* ZEPHYR_INCLUDE_DT_BINDINGS_CLOCK_STM32WB0_CLOCK_H_ */
71