1 /* 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_ */ 207