138 lines
4.4 KiB
YAML
138 lines
4.4 KiB
YAML
# Copyright (c) 2021, Linaro ltd
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
|
|
description: |
|
|
STM32 Reset and Clock controller node.
|
|
This node is in charge of system clock ('SYSCLK') source selection and controlling
|
|
clocks for AHB (Advanced High Performance) and APB (Advanced Peripheral) bus domains.
|
|
|
|
Configuring STM32 Reset and Clock controller node:
|
|
|
|
System clock source should be selected amongst the clock nodes available in "clocks"
|
|
node (typically 'clk_hse, clk_hsi', 'pll', ...).
|
|
Core clock frequency should also be defined, using "clock-frequency" property.
|
|
Note:
|
|
Core clock frequency = SYSCLK / AHB prescaler
|
|
Last, peripheral bus clocks (typically PCLK1, PCLK2) should be configured using matching
|
|
prescaler properties.
|
|
Here is an example of correctly configured rcc node:
|
|
&rcc {
|
|
clocks = <&pll>; /* Select 80MHz pll as SYSCLK source */
|
|
ahb-prescaler = <2>;
|
|
clock-frequency = <DT_FREQ_M(40)>; /* = SYSCLK / AHB prescaler */
|
|
apb1-presacler = <1>;
|
|
apb2-presacler = <1>;
|
|
}
|
|
|
|
Specifying a gated clock:
|
|
|
|
To specify a gated clock, a peripheral should define a "clocks" property encoded
|
|
in the following way:
|
|
... {
|
|
...
|
|
clocks = <&rcc STM32_CLOCK_BUS_APB2 0x00000020>;
|
|
...
|
|
}
|
|
After the phandle referring to rcc node, the first index specifies the registers of
|
|
the bus controlling the peripheral and the second index specifies the bit used to
|
|
control the peripheral clock in that bus register.
|
|
The gated clock is required when accessing to the peripheral controller is needed
|
|
(generally for configuring the device). If dual clock domain is not used, it is
|
|
also used for peripheral operation.
|
|
|
|
Specifying a domain clock source:
|
|
|
|
Specifying a domain source clock could be done by adding a clock specifier to the
|
|
clock property:
|
|
... {
|
|
...
|
|
clocks = <&rcc STM32_CLOCK_BUS_APB2 0x00000020>,
|
|
<&rcc STM32_SRC_HSI I2C1_SEL(2)>;
|
|
...
|
|
}
|
|
In this example, I2C1 device is assigned HSI as domain clock source.
|
|
Domain clock is independent from the bus/gatted clock and allows access to the device's
|
|
register while the gated clock is off. As it doesn't feed the peripheral's controller, it
|
|
allows peripheral operation, but can't be used for peripheral configuration.
|
|
It is peripheral driver's responsibility to querry and use clock source information in
|
|
accordance with clock_control API specifications.
|
|
|
|
Since the peripheral subsystem rate is dictated by the clock used for peripheral
|
|
operation, same clock should be used in calls to `clock_control_get_rate()`
|
|
|
|
Note 1: No additional specifier means gating clock is also the clock source (ie
|
|
'PCLK/PCLK1/PCLK2' depending on the device). There is no need to add a second
|
|
cell to explicitly set it.
|
|
Note 2: Default peripheral clock configuration (ie the one provided in *.dsti files)
|
|
should be the one matching SoC reset state. Confere reference manual to check
|
|
what is the reset value of the clock source for each peripheral.
|
|
|
|
compatible: "st,stm32-rcc"
|
|
|
|
include: [clock-controller.yaml, base.yaml]
|
|
|
|
properties:
|
|
reg:
|
|
required: true
|
|
|
|
"#clock-cells":
|
|
const: 2
|
|
|
|
clock-frequency:
|
|
required: true
|
|
type: int
|
|
description: |
|
|
default frequency in Hz for clock output
|
|
|
|
ahb-prescaler:
|
|
type: int
|
|
required: true
|
|
enum:
|
|
- 1
|
|
- 2
|
|
- 4
|
|
- 8
|
|
- 16
|
|
- 64
|
|
- 128
|
|
- 256
|
|
- 512
|
|
description: |
|
|
AHB prescaler. Defines actual core clock frequency (HCLK)
|
|
based on system frequency input.
|
|
The HCLK clocks CPU, AHB, memories and DMA.
|
|
|
|
apb1-prescaler:
|
|
type: int
|
|
required: true
|
|
enum:
|
|
- 1
|
|
- 2
|
|
- 4
|
|
- 8
|
|
- 16
|
|
|
|
apb2-prescaler:
|
|
type: int
|
|
required: true
|
|
enum:
|
|
- 1
|
|
- 2
|
|
- 4
|
|
- 8
|
|
- 16
|
|
|
|
undershoot-prevention:
|
|
type: boolean
|
|
required: false
|
|
description: |
|
|
On some parts, it could be required to set up highest core frequencies
|
|
(>80MHz) in two steps in order to prevent undershoot.
|
|
This is done by applying an intermediate AHB prescaler before switching
|
|
System Clock source to PLL. Once done, prescaler is set back to expected
|
|
value.
|
|
|
|
clock-cells:
|
|
- bus
|
|
- bits
|