Patrick Delaunay | 266fa4d | 2018-03-12 10:46:16 +0100 | [diff] [blame^] | 1 | STMicroelectronics STM32MP1 clock tree initialization |
| 2 | ===================================================== |
| 3 | |
| 4 | The STM32MP clock tree initialization is based on device tree information |
| 5 | for RCC IP and on fixed clocks. |
| 6 | |
| 7 | ------------------------------- |
| 8 | RCC CLOCK = st,stm32mp1-rcc-clk |
| 9 | ------------------------------- |
| 10 | |
| 11 | The RCC IP is both a reset and a clock controller but this documentation only |
| 12 | describes the fields added for clock tree initialization which are not present |
| 13 | in Linux binding. |
| 14 | |
| 15 | Please refer to ../mfd/st,stm32-rcc.txt for all the other properties common |
| 16 | with Linux. |
| 17 | |
| 18 | Required properties: |
| 19 | |
| 20 | - compatible: Should be "st,stm32mp1-rcc-clk" |
| 21 | |
| 22 | - st,clksrc : The clock source in this order |
| 23 | |
| 24 | for STM32MP15x: 9 clock sources are requested |
| 25 | MPU AXI MCU PLL12 PLL3 PLL4 RTC MCO1 MCO2 |
| 26 | |
| 27 | with value equals to RCC clock specifier as defined in |
| 28 | dt-bindings/clock/stm32mp1-clksrc.h: CLK_<NAME>_<SOURCE> |
| 29 | |
| 30 | - st,clkdiv : The div parameters in this order |
| 31 | for STM32MP15x: 11 dividers value are requested |
| 32 | MPU AXI MCU APB1 APB2 APB3 APB4 APB5 RTC MCO1 MCO2 |
| 33 | |
| 34 | with DIV coding defined in RCC associated register RCC_xxxDIVR |
| 35 | |
| 36 | most the case, it is: |
| 37 | 0x0: not divided |
| 38 | 0x1: division by 2 |
| 39 | 0x2: division by 4 |
| 40 | 0x3: division by 8 |
| 41 | ... |
| 42 | |
| 43 | but for RTC MCO1 MCO2, the coding is different: |
| 44 | 0x0: not divided |
| 45 | 0x1: division by 2 |
| 46 | 0x2: division by 3 |
| 47 | 0x3: division by 4 |
| 48 | ... |
| 49 | |
| 50 | Optional Properties: |
| 51 | - st,pll |
| 52 | PLL children node for PLL1 to PLL4 : (see ref manual for details) |
| 53 | with associated index 0 to 3 (st,pll@0 to st,pll@4) |
| 54 | PLLx is off when the associated node is absent |
| 55 | |
| 56 | - Sub-nodes: |
| 57 | |
| 58 | - cfg: The parameters for PLL configuration in this order: |
| 59 | DIVM DIVN DIVP DIVQ DIVR Output |
| 60 | |
| 61 | with DIV value as defined in RCC spec: |
| 62 | 0x0: bypass (division by 1) |
| 63 | 0x1: division by 2 |
| 64 | 0x2: division by 3 |
| 65 | 0x3: division by 4 |
| 66 | ... |
| 67 | |
| 68 | and Output = bitfield for each output value = 1:ON/0:OFF |
| 69 | BIT(0) => output P : DIVPEN |
| 70 | BIT(1) => output Q : DIVQEN |
| 71 | BIT(2) => output R : DIVREN |
| 72 | NB : macro PQR(p,q,r) can be used to build this value |
| 73 | with p,p,r = 0 or 1 |
| 74 | |
| 75 | - frac : Fractional part of the multiplication factor |
| 76 | (optional, PLL is in integer mode when absent) |
| 77 | |
| 78 | - csg : Clock Spreading Generator (optional) |
| 79 | with parameters in this order: |
| 80 | MOD_PER INC_STEP SSCG_MODE |
| 81 | |
| 82 | * MOD_PER: Modulation Period Adjustment |
| 83 | * INC_STEP: Modulation Depth Adjustment |
| 84 | * SSCG_MODE: Spread spectrum clock generator mode |
| 85 | you can use associated defines from stm32mp1-clksrc.h |
| 86 | * SSCG_MODE_CENTER_SPREAD = 0 |
| 87 | * SSCG_MODE_DOWN_SPREAD = 1 |
| 88 | |
| 89 | |
| 90 | - st,pkcs : used to configure the peripherals kernel clock selection |
| 91 | containing a list of peripheral kernel clock source identifier as defined |
| 92 | in the file dt-bindings/clock/stm32mp1-clksrc.h |
| 93 | |
| 94 | Example: |
| 95 | |
| 96 | rcc: rcc@50000000 { |
| 97 | compatible = "syscon", "simple-mfd"; |
| 98 | |
| 99 | reg = <0x50000000 0x1000>; |
| 100 | |
| 101 | rcc_clk: rcc-clk@50000000 { |
| 102 | #clock-cells = <1>; |
| 103 | compatible = "st,stm32mp1-rcc-clk"; |
| 104 | |
| 105 | st,clksrc = < CLK_MPU_PLL1P |
| 106 | CLK_AXI_PLL2P |
| 107 | CLK_MCU_HSI |
| 108 | CLK_PLL12_HSE |
| 109 | CLK_PLL3_HSE |
| 110 | CLK_PLL4_HSE |
| 111 | CLK_RTC_HSE |
| 112 | CLK_MCO1_DISABLED |
| 113 | CLK_MCO2_DISABLED |
| 114 | >; |
| 115 | |
| 116 | st,clkdiv = < |
| 117 | 1 /*MPU*/ |
| 118 | 0 /*AXI*/ |
| 119 | 0 /*MCU*/ |
| 120 | 1 /*APB1*/ |
| 121 | 1 /*APB2*/ |
| 122 | 1 /*APB3*/ |
| 123 | 1 /*APB4*/ |
| 124 | 5 /*APB5*/ |
| 125 | 23 /*RTC*/ |
| 126 | 0 /*MCO1*/ |
| 127 | 0 /*MCO2*/ |
| 128 | >; |
| 129 | |
| 130 | st,pll@0 { |
| 131 | cfg = < 1 53 0 0 0 1 >; |
| 132 | frac = < 0x810 >; |
| 133 | }; |
| 134 | st,pll@1 { |
| 135 | cfg = < 1 43 1 0 0 PQR(0,1,1)>; |
| 136 | csg = <10 20 1>; |
| 137 | }; |
| 138 | st,pll@2 { |
| 139 | cfg = < 2 85 3 13 3 0>; |
| 140 | csg = <10 20 SSCG_MODE_CENTER_SPREAD>; |
| 141 | }; |
| 142 | st,pll@3 { |
| 143 | cfg = < 2 78 4 7 9 3>; |
| 144 | }; |
| 145 | st,pkcs = < |
| 146 | CLK_STGEN_HSE |
| 147 | CLK_CKPER_HSI |
| 148 | CLK_USBPHY_PLL2P |
| 149 | CLK_DSI_PLL2Q |
| 150 | >; |
| 151 | }; |
| 152 | }; |
| 153 | |
| 154 | -------------------------- |
| 155 | other clocks = fixed-clock |
| 156 | -------------------------- |
| 157 | The clock tree is also based on 5 fixed-clock in clocks node |
| 158 | used to define the state of associated ST32MP1 oscillators: |
| 159 | - clk-lsi |
| 160 | - clk-lse |
| 161 | - clk-hsi |
| 162 | - clk-hse |
| 163 | - clk-csi |
| 164 | |
| 165 | At boot the clock tree initialization will |
| 166 | - enable the oscillator present in device tree |
| 167 | - disable HSI oscillator if the node is absent (always activated by bootrom) |
| 168 | |
| 169 | Optional properties : |
| 170 | |
| 171 | a) for external oscillator: "clk-lse", "clk-hse" |
| 172 | |
| 173 | 3 optional fields are managed |
| 174 | - "st,bypass" Configure the oscillator bypass mode (HSEBYP, LSEBYP) |
| 175 | - "st,css" Activate the clock security system (HSECSSON, LSECSSON) |
| 176 | - "st,drive" (only for LSE) value of the drive for the oscillator |
| 177 | (see LSEDRV_ define in the file dt-bindings/clock/stm32mp1-clksrc.h) |
| 178 | |
| 179 | Example board file: |
| 180 | |
| 181 | / { |
| 182 | clocks { |
| 183 | clk_hse: clk-hse { |
| 184 | #clock-cells = <0>; |
| 185 | compatible = "fixed-clock"; |
| 186 | clock-frequency = <64000000>; |
| 187 | st,bypass; |
| 188 | }; |
| 189 | |
| 190 | clk_lse: clk-lse { |
| 191 | #clock-cells = <0>; |
| 192 | compatible = "fixed-clock"; |
| 193 | clock-frequency = <32768>; |
| 194 | st,css; |
| 195 | st,drive = <LSEDRV_LOWEST>; |
| 196 | }; |
| 197 | }; |
| 198 | |
| 199 | b) for internal oscillator: "clk-hsi" |
| 200 | |
| 201 | internally HSI clock is fixed to 64MHz for STM32MP157 soc |
| 202 | in device tree clk-hsi is the clock after HSIDIV (ck_hsi in RCC doc) |
| 203 | So this clock frequency is used to compute the expected HSI_DIV |
| 204 | for the clock tree initialisation |
| 205 | |
| 206 | ex: for HSIDIV = /1 |
| 207 | |
| 208 | / { |
| 209 | clocks { |
| 210 | clk_hsi: clk-hsi { |
| 211 | #clock-cells = <0>; |
| 212 | compatible = "fixed-clock"; |
| 213 | clock-frequency = <64000000>; |
| 214 | }; |
| 215 | }; |
| 216 | |
| 217 | ex: for HSIDIV = /2 |
| 218 | |
| 219 | / { |
| 220 | clocks { |
| 221 | clk_hsi: clk-hsi { |
| 222 | #clock-cells = <0>; |
| 223 | compatible = "fixed-clock"; |
| 224 | clock-frequency = <32000000>; |
| 225 | }; |
| 226 | }; |