# Copyright (c) 2022 Georgij Cernysiov
# SPDX-License-Identifier: Apache-2.0

description: |
  STM32 Flexible Memory Controller (NOR Flash/PSRAM/SRAM controller).

  The FMC generates the appropriate signal timings to drive the
  following types of memories:

  * Asynchronous SRAM and ROM
    - 8 bits
    - 16 bits
    - 32 bits
  * PSRAM (Cellular RAM)
    - Asynchronous mode
    - Burst mode for synchronous accesses with configurable option to split burst
      access when crossing boundary page for CRAM 1.5.
    - Multiplexed or non-multiplexed
  * NOR Flash memory
    - Asynchronous mode
    - Burst mode for synchronous accesses
    - Multiplexed or non-multiplexed

  A unique Chip Select signal (NE) is used per bank. All the other
  signals (addresses, data and control) are shared. A wide range of
  devices is supported through programmable timings.

  Refer to the reference manual for more details.

  The FMC NOR/PSRAM controller is defined below the FMC node and banks are
  defined as child nodes of the FMC NOR/PSRAM controller node.

  You can enable the controller in devicetree as follows:

  &fmc {
    status = "okay";
    pinctrl-0 = <&fmc_nwe_pd5 &fmc_noe_pd4 ...>;
    pinctrl-names = "default";

    sram {
      status = "okay";
      compatible = "st,stm32-fmc-nor-psram";
      label = "STM32_FMC_NOR_PSRAM";

      #address-cells = <1>;
      #size-cells = <0>;

      sram2@2 {
        reg = <0x2>;
        st,control = <STM32_FMC_DATA_ADDRESS_MUX_DISABLE
                      STM32_FMC_MEMORY_TYPE_SRAM
                      STM32_FMC_NORSRAM_MEM_BUS_WIDTH_16
                      STM32_FMC_BURST_ACCESS_MODE_DISABLE
                      STM32_FMC_WAIT_SIGNAL_POLARITY_LOW
                      STM32_FMC_WAIT_TIMING_BEFORE_WS
                      STM32_FMC_WRITE_OPERATION_ENABLE
                      STM32_FMC_WAIT_SIGNAL_DISABLE
                      STM32_FMC_EXTENDED_MODE_DISABLE
                      STM32_FMC_ASYNCHRONOUS_WAIT_DISABLE
                      STM32_FMC_WRITE_BURST_DISABLE
                      STM32_FMC_CONTINUOUS_CLOCK_SYNC_ONLY
                      STM32_FMC_WRITE_FIFO_DISABLE
                      STM32_FMC_PAGE_SIZE_NONE>;
        st,timing = <4 2 3 0 16 17 STM32_FMC_ACCESS_MODE_A>;
      };
    };
  };

  Use constants defined in dt-bindings/memory-controller/stm32-fmc-nor-psram.h.

compatible: "st,stm32-fmc-nor-psram"

include: base.yaml

properties:
  label:
    required: true

  "#address-cells":
    required: true
    const: 1

  "#size-cells":
    required: true
    const: 0

child-binding:
  description: NOR/PSRAM bank.

  properties:
    reg:
      type: int
      required: true

    st,control:
      type: array
      required: true
      description: |
        SRAM/NOR-Flash control register (FMC_BCRx).

        Contains control information of each memory bank,
        used for SRAMs, PSRAM and NOR Flash memories.

        Expected fields, in order:

        * MUXEN - Address/data multiplexing enable bit.
        * MTYP  - Memory type.
        * MWID  - Memory data bus width.
        * FACCEN - Flash access enable.
        * BURSTEN - Burst enable bit.
        * WAITPOL - Wait signal polarity bit.
        * WAITCFG - Wait timing configuration.
        * WREN - Write enable bit.
        * WAITEN - Wait enable bit.
        * EXTMOD - Extended mode enable.
                   If set, then 'st,timing-ext' shall be provided.
        * ASYNCWAIT -  Wait signal during asynchronous transfers.
        * CPSIZE - Cellular RAM (CRAM) 1.5 Page Size.
        * CBURSTRW - Write burst enable.
        * CCLKEN - Continuous Clock Enable.
        * WFDIS - Write FIFO Disable.
        * BMAP - FMC bank mapping.

    st,timing:
      type: array
      required: true
      description: |
        SRAM/NOR-Flash (read) timing register (FMC_BTRx).

        If the EXTMOD is set (see control register FMC_BCRx), then
        FMC_BTRx register is partitioned for write and read access.
        That means, use this property to configure read accesses and
        'st,timing-ext' to configure write accesses.

        Expected fields, in order:

        * ADDSET  - Address setup phase duration.
                    Number of HCLK cycles to configure the duration of
                    the address setup time. This parameter can be a value
                    between Min_Data = 0 and Max_Data = 15.
                    Note: Not used with synchronous NOR Flash memories.
        * ADDHLD  - Address-hold phase duration.
                    Number of HCLK cycles to configure the duration of
                    the address hold time. This parameter can be a value
                    between Min_Data = 1 and Max_Data = 15.
                    Note: Not used with synchronous NOR Flash memories.
        * DATAST  - Data-phase duration.
                    Number of HCLK cycles to configure the duration of
                    the data setup time. This parameter can be a value
                    between Min_Data = 1 and Max_Data = 255.
                    Note: Used for SRAMs, ROMs and asynchronous multiplexed
                    NOR Flash memories.
        * BUSTURN - Bus turnaround phase duration.
                    Number of HCLK cycles to configure the duration of
                    the bus turnaround. This parameter can be a value
                    between Min_Data = 0 and Max_Data = 15.
                    Note: Only used for multiplexed NOR Flash memories.
        * CLKDIV  - Clock divide ratio (for FMC_CLK signal).
                    Period of CLK clock output signal, expressed in number of
                    HCLK cycles. This parameter can be a value
                    between Min_Data = 2 and Max_Data = 16.
                    Note: Not used for asynchronous NOR Flash, SRAM or ROM
                    accesses.
        * DATLAT  - Data latency for synchronous memory.
                    Number of memory clock cycles to issue to the memory
                    before getting the first data.
                    The value depends on the memory type as shown below:
                    - It must be set to 0 in case of a CRAM
                    - It is don't care in asynchronous NOR, SRAM or ROM accesses
                    - It may assume a value between Min_Data = 2 and Max_Data = 17
                      in NOR Flash memories with synchronous burst mode enable
        * ACCMOD  - Access mode.
                    See access mode defines
                    in dt-bindings/memory-controller/stm32-fmc-nor-psram.h.

    st,timing-ext:
      type: array
      required: false # required when 'EXTMOD' is enabled
      default: [0xF, 0xF, 0xFF, 0xF, 0x0] # reset state
      description: |
        SRAM/NOR-Flash (write) timing register (FMC_BWTRx).

        Expected fields, in order:

        * ADDSET  - Address setup phase duration.
                    Reset state: 15 (0xF).
        * ADDHLD  - Address-hold phase duration.
                    Reset state: 15 (0xF).
        * DATAST  - Data-phase duration.
                    Reset state: 255 (0xFF).
        * BUSTURN - Bus turnaround phase duration.
                    Reset state: 15 (0xF).
        * ACCMOD  - Access mode.
                    Reset state: 0 (0x0).

        Refer to 'st,timing' for detailed field descriptions.

        This property is applied only when EXTMOD is set
        (see control register FMC_BCRx).

        If absent, then reset state values are used.
