# 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
    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
