1*0de0b5e2SGabriel Fernandez /* SPDX-License-Identifier: BSD-2-Clause */ 2*0de0b5e2SGabriel Fernandez /* 3*0de0b5e2SGabriel Fernandez * Copyright (C) STMicroelectronics 2024 - All Rights Reserved 4*0de0b5e2SGabriel Fernandez */ 5*0de0b5e2SGabriel Fernandez 6*0de0b5e2SGabriel Fernandez #ifndef _DT_BINDINGS_CLOCK_STM32MP25_CLKSRC_H_ 7*0de0b5e2SGabriel Fernandez #define _DT_BINDINGS_CLOCK_STM32MP25_CLKSRC_H_ 8*0de0b5e2SGabriel Fernandez 9*0de0b5e2SGabriel Fernandez #define CMD_DIV 0 10*0de0b5e2SGabriel Fernandez #define CMD_MUX 1 11*0de0b5e2SGabriel Fernandez #define CMD_CLK 2 12*0de0b5e2SGabriel Fernandez #define CMD_FLEXGEN 3 13*0de0b5e2SGabriel Fernandez #define CMD_OBS 4 14*0de0b5e2SGabriel Fernandez 15*0de0b5e2SGabriel Fernandez #define CMD_ADDR_BIT 0x80000000 16*0de0b5e2SGabriel Fernandez 17*0de0b5e2SGabriel Fernandez #define CMD_SHIFT 26 18*0de0b5e2SGabriel Fernandez #define CMD_MASK 0xFC000000 19*0de0b5e2SGabriel Fernandez #define CMD_DATA_MASK 0x03FFFFFF 20*0de0b5e2SGabriel Fernandez 21*0de0b5e2SGabriel Fernandez #define DIV_ID_SHIFT 8 22*0de0b5e2SGabriel Fernandez #define DIV_ID_MASK 0x0000FF00 23*0de0b5e2SGabriel Fernandez 24*0de0b5e2SGabriel Fernandez #define DIV_DIVN_SHIFT 0 25*0de0b5e2SGabriel Fernandez #define DIV_DIVN_MASK 0x000000FF 26*0de0b5e2SGabriel Fernandez 27*0de0b5e2SGabriel Fernandez #define MUX_ID_SHIFT 4 28*0de0b5e2SGabriel Fernandez #define MUX_ID_MASK 0x00000FF0 29*0de0b5e2SGabriel Fernandez 30*0de0b5e2SGabriel Fernandez #define MUX_SEL_SHIFT 0 31*0de0b5e2SGabriel Fernandez #define MUX_SEL_MASK 0x0000000F 32*0de0b5e2SGabriel Fernandez 33*0de0b5e2SGabriel Fernandez /* CLK define */ 34*0de0b5e2SGabriel Fernandez #define CLK_ON_MASK BIT(21) 35*0de0b5e2SGabriel Fernandez #define CLK_ON_SHIFT 21 36*0de0b5e2SGabriel Fernandez 37*0de0b5e2SGabriel Fernandez #define CLK_ID_MASK GENMASK_32(20, 12) 38*0de0b5e2SGabriel Fernandez #define CLK_ID_SHIFT 12 39*0de0b5e2SGabriel Fernandez 40*0de0b5e2SGabriel Fernandez #define CLK_NO_DIV_MASK 0x0000080 41*0de0b5e2SGabriel Fernandez #define CLK_DIV_MASK GENMASK_32(10, 5) 42*0de0b5e2SGabriel Fernandez #define CLK_DIV_SHIFT 5 43*0de0b5e2SGabriel Fernandez 44*0de0b5e2SGabriel Fernandez #define CLK_NO_SEL_MASK 0x00000010 45*0de0b5e2SGabriel Fernandez #define CLK_SEL_MASK GENMASK_32(3, 0) 46*0de0b5e2SGabriel Fernandez #define CLK_SEL_SHIFT 0 47*0de0b5e2SGabriel Fernandez 48*0de0b5e2SGabriel Fernandez #define CLK_CFG(clk_id, sel, div, state) ((CMD_CLK << CMD_SHIFT) |\ 49*0de0b5e2SGabriel Fernandez ((state) << CLK_ON_SHIFT) |\ 50*0de0b5e2SGabriel Fernandez ((clk_id) << CLK_ID_SHIFT) |\ 51*0de0b5e2SGabriel Fernandez ((div) << CLK_DIV_SHIFT) |\ 52*0de0b5e2SGabriel Fernandez ((sel) << CLK_SEL_SHIFT)) 53*0de0b5e2SGabriel Fernandez 54*0de0b5e2SGabriel Fernandez #define CLK_OFF 0 55*0de0b5e2SGabriel Fernandez #define CLK_ON 1 56*0de0b5e2SGabriel Fernandez #define CLK_NODIV 0x00000040 57*0de0b5e2SGabriel Fernandez #define CLK_NOMUX 0x00000010 58*0de0b5e2SGabriel Fernandez 59*0de0b5e2SGabriel Fernandez /* Flexgen define */ 60*0de0b5e2SGabriel Fernandez #define FLEX_ID_SHIFT 13 61*0de0b5e2SGabriel Fernandez #define FLEX_SEL_SHIFT 9 62*0de0b5e2SGabriel Fernandez #define FLEX_PDIV_SHIFT 6 63*0de0b5e2SGabriel Fernandez #define FLEX_FDIV_SHIFT 0 64*0de0b5e2SGabriel Fernandez 65*0de0b5e2SGabriel Fernandez #define FLEX_ID_MASK GENMASK_32(18, 13) 66*0de0b5e2SGabriel Fernandez #define FLEX_SEL_MASK GENMASK_32(12, 9) 67*0de0b5e2SGabriel Fernandez #define FLEX_PDIV_MASK GENMASK_32(8, 6) 68*0de0b5e2SGabriel Fernandez #define FLEX_FDIV_MASK GENMASK_32(5, 0) 69*0de0b5e2SGabriel Fernandez 70*0de0b5e2SGabriel Fernandez #define DIV_CFG(div_id, div) ((CMD_DIV << CMD_SHIFT) |\ 71*0de0b5e2SGabriel Fernandez ((div_id) << DIV_ID_SHIFT |\ 72*0de0b5e2SGabriel Fernandez (div))) 73*0de0b5e2SGabriel Fernandez 74*0de0b5e2SGabriel Fernandez #define MUX_CFG(mux_id, sel) ((CMD_MUX << CMD_SHIFT) |\ 75*0de0b5e2SGabriel Fernandez ((mux_id) << MUX_ID_SHIFT |\ 76*0de0b5e2SGabriel Fernandez (sel))) 77*0de0b5e2SGabriel Fernandez 78*0de0b5e2SGabriel Fernandez #define CLK_ADDR_SHIFT 16 79*0de0b5e2SGabriel Fernandez #define CLK_ADDR_MASK 0x7FFF0000 80*0de0b5e2SGabriel Fernandez #define CLK_ADDR_VAL_MASK 0xFFFF 81*0de0b5e2SGabriel Fernandez 82*0de0b5e2SGabriel Fernandez #define DIV_LSMCU 0 83*0de0b5e2SGabriel Fernandez #define DIV_APB1 1 84*0de0b5e2SGabriel Fernandez #define DIV_APB2 2 85*0de0b5e2SGabriel Fernandez #define DIV_APB3 3 86*0de0b5e2SGabriel Fernandez #define DIV_APB4 4 87*0de0b5e2SGabriel Fernandez #define DIV_APBDBG 5 88*0de0b5e2SGabriel Fernandez #define DIV_RTC 6 89*0de0b5e2SGabriel Fernandez #define DIV_NB 7 90*0de0b5e2SGabriel Fernandez 91*0de0b5e2SGabriel Fernandez #define MUX_MUXSEL0 0 92*0de0b5e2SGabriel Fernandez #define MUX_MUXSEL1 1 93*0de0b5e2SGabriel Fernandez #define MUX_MUXSEL2 2 94*0de0b5e2SGabriel Fernandez #define MUX_MUXSEL3 3 95*0de0b5e2SGabriel Fernandez #define MUX_MUXSEL4 4 96*0de0b5e2SGabriel Fernandez #define MUX_MUXSEL5 5 97*0de0b5e2SGabriel Fernandez #define MUX_MUXSEL6 6 98*0de0b5e2SGabriel Fernandez #define MUX_MUXSEL7 7 99*0de0b5e2SGabriel Fernandez #define MUX_XBARSEL 8 100*0de0b5e2SGabriel Fernandez #define MUX_RTC 9 101*0de0b5e2SGabriel Fernandez #define MUX_MCO1 10 102*0de0b5e2SGabriel Fernandez #define MUX_MCO2 11 103*0de0b5e2SGabriel Fernandez #define MUX_ADC12 12 104*0de0b5e2SGabriel Fernandez #define MUX_ADC3 13 105*0de0b5e2SGabriel Fernandez #define MUX_USB2PHY1 14 106*0de0b5e2SGabriel Fernandez #define MUX_USB2PHY2 15 107*0de0b5e2SGabriel Fernandez #define MUX_USB3PCIEPHY 16 108*0de0b5e2SGabriel Fernandez #define MUX_DSIBLANE 17 109*0de0b5e2SGabriel Fernandez #define MUX_DSIPHY 18 110*0de0b5e2SGabriel Fernandez #define MUX_LVDSPHY 19 111*0de0b5e2SGabriel Fernandez #define MUX_DTS 20 112*0de0b5e2SGabriel Fernandez #define MUX_D3PER 21 113*0de0b5e2SGabriel Fernandez #define MUX_NB 22 114*0de0b5e2SGabriel Fernandez 115*0de0b5e2SGabriel Fernandez #define MUXSEL_HSI 0 116*0de0b5e2SGabriel Fernandez #define MUXSEL_HSE 1 117*0de0b5e2SGabriel Fernandez #define MUXSEL_MSI 2 118*0de0b5e2SGabriel Fernandez 119*0de0b5e2SGabriel Fernandez /* KERNEL source clocks */ 120*0de0b5e2SGabriel Fernandez #define MUX_RTC_DISABLED 0x0 121*0de0b5e2SGabriel Fernandez #define MUX_RTC_LSE 0x1 122*0de0b5e2SGabriel Fernandez #define MUX_RTC_LSI 0x2 123*0de0b5e2SGabriel Fernandez #define MUX_RTC_HSE 0x3 124*0de0b5e2SGabriel Fernandez 125*0de0b5e2SGabriel Fernandez #define MUX_MCO1_FLEX61 0x0 126*0de0b5e2SGabriel Fernandez #define MUX_MCO1_OBSER0 0x1 127*0de0b5e2SGabriel Fernandez 128*0de0b5e2SGabriel Fernandez #define MUX_MCO2_FLEX62 0x0 129*0de0b5e2SGabriel Fernandez #define MUX_MCO2_OBSER1 0x1 130*0de0b5e2SGabriel Fernandez 131*0de0b5e2SGabriel Fernandez #define MUX_ADC12_FLEX46 0x0 132*0de0b5e2SGabriel Fernandez #define MUX_ADC12_LSMCU 0x1 133*0de0b5e2SGabriel Fernandez 134*0de0b5e2SGabriel Fernandez #define MUX_ADC3_FLEX47 0x0 135*0de0b5e2SGabriel Fernandez #define MUX_ADC3_LSMCU 0x1 136*0de0b5e2SGabriel Fernandez #define MUX_ADC3_FLEX46 0x2 137*0de0b5e2SGabriel Fernandez 138*0de0b5e2SGabriel Fernandez #define MUX_USB2PHY1_FLEX57 0x0 139*0de0b5e2SGabriel Fernandez #define MUX_USB2PHY1_HSE 0x1 140*0de0b5e2SGabriel Fernandez 141*0de0b5e2SGabriel Fernandez #define MUX_USB2PHY2_FLEX58 0x0 142*0de0b5e2SGabriel Fernandez #define MUX_USB2PHY2_HSE 0x1 143*0de0b5e2SGabriel Fernandez 144*0de0b5e2SGabriel Fernandez #define MUX_USB3PCIEPHY_FLEX34 0x0 145*0de0b5e2SGabriel Fernandez #define MUX_USB3PCIEPHY_HSE 0x1 146*0de0b5e2SGabriel Fernandez 147*0de0b5e2SGabriel Fernandez #define MUX_DSIBLANE_DSIPHY 0x0 148*0de0b5e2SGabriel Fernandez #define MUX_DSIBLANE_FLEX27 0x1 149*0de0b5e2SGabriel Fernandez 150*0de0b5e2SGabriel Fernandez #define MUX_DSIPHY_FLEX28 0x0 151*0de0b5e2SGabriel Fernandez #define MUX_DSIPHY_HSE 0x1 152*0de0b5e2SGabriel Fernandez 153*0de0b5e2SGabriel Fernandez #define MUX_LVDSPHY_FLEX32 0x0 154*0de0b5e2SGabriel Fernandez #define MUX_LVDSPHY_HSE 0x1 155*0de0b5e2SGabriel Fernandez 156*0de0b5e2SGabriel Fernandez #define MUX_DTS_HSI 0x0 157*0de0b5e2SGabriel Fernandez #define MUX_DTS_HSE 0x1 158*0de0b5e2SGabriel Fernandez #define MUX_DTS_MSI 0x2 159*0de0b5e2SGabriel Fernandez 160*0de0b5e2SGabriel Fernandez #define MUX_D3PER_MSI 0x0 161*0de0b5e2SGabriel Fernandez #define MUX_D3PER_LSI 0x1 162*0de0b5e2SGabriel Fernandez #define MUX_D3PER_LSE 0x2 163*0de0b5e2SGabriel Fernandez 164*0de0b5e2SGabriel Fernandez /* PLLs source clocks */ 165*0de0b5e2SGabriel Fernandez #define PLL_SRC_HSI 0x0 166*0de0b5e2SGabriel Fernandez #define PLL_SRC_HSE 0x1 167*0de0b5e2SGabriel Fernandez #define PLL_SRC_MSI 0x2 168*0de0b5e2SGabriel Fernandez #define PLL_SRC_DISABLED 0x3 169*0de0b5e2SGabriel Fernandez 170*0de0b5e2SGabriel Fernandez /* XBAR source clocks */ 171*0de0b5e2SGabriel Fernandez #define XBAR_SRC_PLL4 0x0 172*0de0b5e2SGabriel Fernandez #define XBAR_SRC_PLL5 0x1 173*0de0b5e2SGabriel Fernandez #define XBAR_SRC_PLL6 0x2 174*0de0b5e2SGabriel Fernandez #define XBAR_SRC_PLL7 0x3 175*0de0b5e2SGabriel Fernandez #define XBAR_SRC_PLL8 0x4 176*0de0b5e2SGabriel Fernandez #define XBAR_SRC_HSI 0x5 177*0de0b5e2SGabriel Fernandez #define XBAR_SRC_HSE 0x6 178*0de0b5e2SGabriel Fernandez #define XBAR_SRC_MSI 0x7 179*0de0b5e2SGabriel Fernandez #define XBAR_SRC_HSI_KER 0x8 180*0de0b5e2SGabriel Fernandez #define XBAR_SRC_HSE_KER 0x9 181*0de0b5e2SGabriel Fernandez #define XBAR_SRC_MSI_KER 0xA 182*0de0b5e2SGabriel Fernandez #define XBAR_SRC_SPDIF_SYMB 0xB 183*0de0b5e2SGabriel Fernandez #define XBAR_SRC_I2S 0xC 184*0de0b5e2SGabriel Fernandez #define XBAR_SRC_LSI 0xD 185*0de0b5e2SGabriel Fernandez #define XBAR_SRC_LSE 0xE 186*0de0b5e2SGabriel Fernandez 187*0de0b5e2SGabriel Fernandez /* 188*0de0b5e2SGabriel Fernandez * Configure a XBAR channel with its clock source 189*0de0b5e2SGabriel Fernandez * channel_nb: XBAR channel number from 0 to 63 190*0de0b5e2SGabriel Fernandez * channel_src: one of the 15 previous XBAR source clocks defines 191*0de0b5e2SGabriel Fernandez * channel_prediv: value of the PREDIV in channel RCC_PREDIVxCFGR register 192*0de0b5e2SGabriel Fernandez * can be either 1, 2, 4 or 1024 193*0de0b5e2SGabriel Fernandez * channel_findiv: value of the FINDIV in channel RCC_FINDIVxCFGR register 194*0de0b5e2SGabriel Fernandez * from 1 to 64 195*0de0b5e2SGabriel Fernandez */ 196*0de0b5e2SGabriel Fernandez 197*0de0b5e2SGabriel Fernandez #define FLEXGEN_CFG(ch, sel, pdiv, fdiv) ((CMD_FLEXGEN << CMD_SHIFT) |\ 198*0de0b5e2SGabriel Fernandez ((ch) << FLEX_ID_SHIFT) |\ 199*0de0b5e2SGabriel Fernandez ((sel) << FLEX_SEL_SHIFT) |\ 200*0de0b5e2SGabriel Fernandez ((pdiv) << FLEX_PDIV_SHIFT) |\ 201*0de0b5e2SGabriel Fernandez ((fdiv) << FLEX_FDIV_SHIFT)) 202*0de0b5e2SGabriel Fernandez 203*0de0b5e2SGabriel Fernandez /* Register addresses of MCO1 & MCO2 */ 204*0de0b5e2SGabriel Fernandez #define MCO1 0x494 205*0de0b5e2SGabriel Fernandez #define MCO2 0x498 206*0de0b5e2SGabriel Fernandez 207*0de0b5e2SGabriel Fernandez #define MCO_OFF 0 208*0de0b5e2SGabriel Fernandez #define MCO_ON 1 209*0de0b5e2SGabriel Fernandez #define MCO_STATUS_SHIFT 8 210*0de0b5e2SGabriel Fernandez 211*0de0b5e2SGabriel Fernandez #define MCO_CFG(addr, sel, status) (CMD_ADDR_BIT |\ 212*0de0b5e2SGabriel Fernandez ((addr) << CLK_ADDR_SHIFT) |\ 213*0de0b5e2SGabriel Fernandez ((status) << MCO_STATUS_SHIFT) |\ 214*0de0b5e2SGabriel Fernandez (sel)) 215*0de0b5e2SGabriel Fernandez #define OBS_ID_SHIFT 14 216*0de0b5e2SGabriel Fernandez #define OBS_STATUS_SHIFT 13 217*0de0b5e2SGabriel Fernandez #define OBS_INTEXT_SHIFT 12 218*0de0b5e2SGabriel Fernandez #define OBS_DIV_SHIFT 9 219*0de0b5e2SGabriel Fernandez #define OBS_INV_SHIFT 8 220*0de0b5e2SGabriel Fernandez #define OBS_SEL_SHIFT 0 221*0de0b5e2SGabriel Fernandez 222*0de0b5e2SGabriel Fernandez #define OBS_ID_MASK GENMASK_32(14, 14) 223*0de0b5e2SGabriel Fernandez #define OBS_STATUS_MASK GENMASK_32(13, 13) 224*0de0b5e2SGabriel Fernandez #define OBS_INTEXT_MASK GENMASK_32(12, 12) 225*0de0b5e2SGabriel Fernandez #define OBS_DIV_MASK GENMASK_32(11, 9) 226*0de0b5e2SGabriel Fernandez #define OBS_INV_MASK BIT(8) 227*0de0b5e2SGabriel Fernandez #define OBS_SEL_MASK GENMASK_32(7, 0) 228*0de0b5e2SGabriel Fernandez 229*0de0b5e2SGabriel Fernandez #define OBS_CFG(id, status, int_ext, div, inv, sel)\ 230*0de0b5e2SGabriel Fernandez ((CMD_OBS << CMD_SHIFT) |\ 231*0de0b5e2SGabriel Fernandez ((id) << OBS_ID_SHIFT) |\ 232*0de0b5e2SGabriel Fernandez ((status) << OBS_STATUS_SHIFT) |\ 233*0de0b5e2SGabriel Fernandez ((int_ext) << OBS_INTEXT_SHIFT) |\ 234*0de0b5e2SGabriel Fernandez ((div) << OBS_DIV_SHIFT) |\ 235*0de0b5e2SGabriel Fernandez ((inv) << OBS_INV_SHIFT) |\ 236*0de0b5e2SGabriel Fernandez ((sel) << OBS_SEL_SHIFT)) 237*0de0b5e2SGabriel Fernandez 238*0de0b5e2SGabriel Fernandez #define OBS0 0 239*0de0b5e2SGabriel Fernandez #define OBS1 1 240*0de0b5e2SGabriel Fernandez 241*0de0b5e2SGabriel Fernandez #define OBS_OFF 0 242*0de0b5e2SGabriel Fernandez #define OBS_ON 1 243*0de0b5e2SGabriel Fernandez 244*0de0b5e2SGabriel Fernandez #define OBS_INT 0 245*0de0b5e2SGabriel Fernandez #define OBS_EXT 1 246*0de0b5e2SGabriel Fernandez 247*0de0b5e2SGabriel Fernandez #define OBS_DIV1 0 248*0de0b5e2SGabriel Fernandez #define OBS_DIV2 1 249*0de0b5e2SGabriel Fernandez #define OBS_DIV4 2 250*0de0b5e2SGabriel Fernandez #define OBS_DIV8 3 251*0de0b5e2SGabriel Fernandez #define OBS_DIV16 4 252*0de0b5e2SGabriel Fernandez #define OBS_DIV32 5 253*0de0b5e2SGabriel Fernandez #define OBS_DIV64 6 254*0de0b5e2SGabriel Fernandez #define OBS_DIV128 7 255*0de0b5e2SGabriel Fernandez 256*0de0b5e2SGabriel Fernandez #define OBS_NO_INV 0 257*0de0b5e2SGabriel Fernandez #define OBS_INV 1 258*0de0b5e2SGabriel Fernandez 259*0de0b5e2SGabriel Fernandez #define OBS_INT_CFG(id, status, div, inv, sel)\ 260*0de0b5e2SGabriel Fernandez OBS_CFG(id, status, OBS_INT, div, inv, sel) 261*0de0b5e2SGabriel Fernandez 262*0de0b5e2SGabriel Fernandez #define OBS_EXT_CFG(id, status, div, inv, sel)\ 263*0de0b5e2SGabriel Fernandez OBS_CFG(id, status, OBS_EXT, div, inv, sel) 264*0de0b5e2SGabriel Fernandez 265*0de0b5e2SGabriel Fernandez /* define for st,pll /csg */ 266*0de0b5e2SGabriel Fernandez #define SSCG_MODE_CENTER_SPREAD 0 267*0de0b5e2SGabriel Fernandez #define SSCG_MODE_DOWN_SPREAD 1 268*0de0b5e2SGabriel Fernandez 269*0de0b5e2SGabriel Fernandez /* define for st,drive */ 270*0de0b5e2SGabriel Fernandez #define LSEDRV_LOWEST 0 271*0de0b5e2SGabriel Fernandez #define LSEDRV_MEDIUM_LOW 2 272*0de0b5e2SGabriel Fernandez #define LSEDRV_MEDIUM_HIGH 1 273*0de0b5e2SGabriel Fernandez #define LSEDRV_HIGHEST 3 274*0de0b5e2SGabriel Fernandez 275*0de0b5e2SGabriel Fernandez #endif /* _DT_BINDINGS_CLOCK_STM32MP25_CLKSRC_H_ */ 276