Documentation / devicetree / bindings / memory-controllers / st,stm32mp25-omm.yaml


Based on kernel version 6.16. Page generated on 2025-08-06 08:57 EST.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/memory-controllers/st,stm32mp25-omm.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#

title: STM32 Octo Memory Manager (OMM)

maintainers:
  - Patrice Chotard <patrice.chotard@foss.st.com>

description: |
  The STM32 Octo Memory Manager is a low-level interface that enables an
  efficient OCTOSPI pin assignment with a full I/O matrix (before alternate
  function map) and multiplex of single/dual/quad/octal SPI interfaces over
  the same bus. It Supports up to:
    - Two single/dual/quad/octal SPI interfaces
    - Two ports for pin assignment

properties:
  compatible:
    const: st,stm32mp25-omm
 
  "#address-cells":
    const: 2
 
  "#size-cells":
    const: 1

  ranges:
    description: |
      Reflects the memory layout per OSPI instance.
      Format:
      <chip-select> 0 <registers base address> <size>
    minItems: 2
    maxItems: 2

  reg:
    items:
      - description: OMM registers
      - description: OMM memory map area

  reg-names:
    items:
      - const: regs
      - const: memory_map

  memory-region:
    description:
      Memory region shared between the 2 OCTOSPI instance.
      One or two phandle to a node describing a memory mapped region
      depending of child number.
    minItems: 1
    maxItems: 2

  memory-region-names:
    description:
      Identify to which OSPI instance the memory region belongs to.
    items:
      enum: [ospi1, ospi2]
    minItems: 1
    maxItems: 2

  clocks:
    maxItems: 3

  clock-names:
    items:
      - const: omm
      - const: ospi1
      - const: ospi2

  resets:
    maxItems: 3

  reset-names:
    items:
      - const: omm
      - const: ospi1
      - const: ospi2

  access-controllers:
    maxItems: 1

  power-domains:
    maxItems: 1

  st,syscfg-amcr:
    $ref: /schemas/types.yaml#/definitions/phandle-array
    description: |
      The Address Mapping Control Register (AMCR) is used to split the 256MB
      memory map area shared between the 2 OSPI instance. The Octo Memory
      Manager sets the AMCR depending of the memory-region configuration.
      The memory split bitmask description is:
        - 000: OCTOSPI1 (256 Mbytes), OCTOSPI2 unmapped
        - 001: OCTOSPI1 (192 Mbytes), OCTOSPI2 (64 Mbytes)
        - 010: OCTOSPI1 (128 Mbytes), OCTOSPI2 (128 Mbytes)
        - 011: OCTOSPI1 (64 Mbytes), OCTOSPI2 (192 Mbytes)
        - 1xx: OCTOSPI1 unmapped, OCTOSPI2 (256 Mbytes)
    items:
      - items:
          - description: phandle to syscfg
          - description: register offset within syscfg
          - description: register bitmask for memory split

  st,omm-req2ack-ns:
    description:
      In multiplexed mode (MUXEN = 1), this field defines the time in
      nanoseconds between two transactions.
    default: 0

  st,omm-cssel-ovr:
    $ref: /schemas/types.yaml#/definitions/uint32
    description: |
      Configure the chip select selector override for the 2 OCTOSPIs.
      - 0: OCTOSPI1 chip select send to NCS1 OCTOSPI2 chip select send to NCS1
      - 1: OCTOSPI1 chip select send to NCS2 OCTOSPI2 chip select send to NCS1
      - 2: OCTOSPI1 chip select send to NCS1 OCTOSPI2 chip select send to NCS2
      - 3: OCTOSPI1 chip select send to NCS2 OCTOSPI2 chip select send to NCS2
    minimum: 0
    maximum: 3
    default: 0

  st,omm-mux:
    $ref: /schemas/types.yaml#/definitions/uint32
    description: |
      Configure the muxing between the 2 OCTOSPIs busses and the 2 output ports.
      - 0: direct mode
      - 1: mux OCTOSPI1 and OCTOSPI2 to port 1
      - 2: swapped mode
      - 3: mux OCTOSPI1 and OCTOSPI2 to port 2
    minimum: 0
    maximum: 3
    default: 0

patternProperties:
  ^spi@[0-9]:
    type: object
    $ref: /schemas/spi/st,stm32mp25-ospi.yaml#
    description: Required spi child node

required:
  - compatible
  - reg
  - "#address-cells"
  - "#size-cells"
  - clocks
  - clock-names
  - resets
  - reset-names
  - st,syscfg-amcr
  - ranges

additionalProperties: false

examples:
  - |
    #include <dt-bindings/clock/st,stm32mp25-rcc.h>
    #include <dt-bindings/interrupt-controller/arm-gic.h>
    #include <dt-bindings/reset/st,stm32mp25-rcc.h>
    ommanager@40500000 {
      compatible = "st,stm32mp25-omm";
      reg = <0x40500000 0x400>, <0x60000000 0x10000000>;
      reg-names = "regs", "memory_map";
      ranges = <0 0 0x40430000 0x400>,
               <1 0 0x40440000 0x400>;
      memory-region = <&mm_ospi1>, <&mm_ospi2>;
      memory-region-names = "ospi1", "ospi2";
      pinctrl-0 = <&ospi_port1_clk_pins_a
                   &ospi_port1_io03_pins_a
                   &ospi_port1_cs0_pins_a>;
      pinctrl-1 = <&ospi_port1_clk_sleep_pins_a
                   &ospi_port1_io03_sleep_pins_a
                   &ospi_port1_cs0_sleep_pins_a>;
      pinctrl-names = "default", "sleep";
      clocks = <&rcc CK_BUS_OSPIIOM>,
               <&scmi_clk CK_SCMI_OSPI1>,
               <&scmi_clk CK_SCMI_OSPI2>;
      clock-names = "omm", "ospi1", "ospi2";
      resets = <&rcc OSPIIOM_R>,
               <&scmi_reset RST_SCMI_OSPI1>,
               <&scmi_reset RST_SCMI_OSPI2>;
      reset-names = "omm", "ospi1", "ospi2";
      access-controllers = <&rifsc 111>;
      power-domains = <&CLUSTER_PD>;
      #address-cells = <2>;
      #size-cells = <1>;
      st,syscfg-amcr = <&syscfg 0x2c00 0x7>;
      st,omm-req2ack-ns = <0>;
      st,omm-mux = <0>;
      st,omm-cssel-ovr = <0>;
 
      spi@0 {
        compatible = "st,stm32mp25-ospi";
        reg = <0 0 0x400>;
        memory-region = <&mm_ospi1>;
        interrupts = <GIC_SPI 163 IRQ_TYPE_LEVEL_HIGH>;
        dmas = <&hpdma 2 0x62 0x00003121 0x0>,
               <&hpdma 2 0x42 0x00003112 0x0>;
        dma-names = "tx", "rx";
        clocks = <&scmi_clk CK_SCMI_OSPI1>;
        resets = <&scmi_reset RST_SCMI_OSPI1>, <&scmi_reset RST_SCMI_OSPI1DLL>;
        access-controllers = <&rifsc 74>;
        power-domains = <&CLUSTER_PD>;
        #address-cells = <1>;
        #size-cells = <0>;
        st,syscfg-dlyb = <&syscfg 0x1000>;
      };
 
      spi@1 {
        compatible = "st,stm32mp25-ospi";
        reg = <1 0 0x400>;
        memory-region = <&mm_ospi1>;
        interrupts = <GIC_SPI 164 IRQ_TYPE_LEVEL_HIGH>;
        dmas = <&hpdma 3 0x62 0x00003121 0x0>,
               <&hpdma 3 0x42 0x00003112 0x0>;
        dma-names = "tx", "rx";
        clocks = <&scmi_clk CK_KER_OSPI2>;
        resets = <&scmi_reset RST_SCMI_OSPI2>, <&scmi_reset RST_SCMI_OSPI1DLL>;
        access-controllers = <&rifsc 75>;
        power-domains = <&CLUSTER_PD>;
        #address-cells = <1>;
        #size-cells = <0>;
        st,syscfg-dlyb = <&syscfg 0x1000>;
      };
    };