# 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 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: 0 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 #include #include 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 = ; 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 = ; 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>; }; };