# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/mtd/rockchip,nand-controller.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#

title: Rockchip SoCs NAND FLASH Controller (NFC)

allOf:
  - $ref: nand-controller.yaml#

maintainers:
  - Heiko Stuebner <heiko@sntech.de>

properties:
  compatible:
    oneOf:
      - const: rockchip,px30-nfc
      - const: rockchip,rk2928-nfc
      - const: rockchip,rv1108-nfc
      - items:
          - enum:
              - rockchip,rk3036-nfc
              - rockchip,rk3128-nfc
          - const: rockchip,rk2928-nfc
      - items:
          - const: rockchip,rk3308-nfc
          - const: rockchip,rv1108-nfc

  reg:
    maxItems: 1

  interrupts:
    maxItems: 1

  clocks:
    minItems: 1
    items:
      - description: Bus Clock
      - description: Module Clock

  clock-names:
    minItems: 1
    items:
      - const: ahb
      - const: nfc

  assigned-clocks:
    maxItems: 1

  assigned-clock-rates:
    maxItems: 1

  power-domains:
    maxItems: 1

patternProperties:
  "^nand@[0-7]$":
    type: object
    $ref: raw-nand-chip.yaml
    properties:
      reg:
        minimum: 0
        maximum: 7

      nand-ecc-mode:
        const: hw

      nand-ecc-step-size:
        const: 1024

      nand-ecc-strength:
        enum: [16, 24, 40, 60, 70]
        description: |
          The ECC configurations that can be supported are as follows.
            NFC v600 ECC 16, 24, 40, 60
              RK2928, RK3066, RK3188

            NFC v622 ECC 16, 24, 40, 60
              RK3036, RK3128

            NFC v800 ECC 16
              RK3308, RV1108

            NFC v900 ECC 16, 40, 60, 70
              RK3326, PX30

      nand-bus-width:
        const: 8

      rockchip,boot-blks:
        $ref: /schemas/types.yaml#/definitions/uint32
        minimum: 2
        default: 16
        description:
          The NFC driver need this information to select ECC
          algorithms supported by the boot ROM.
          Only used in combination with 'nand-is-boot-medium'.

      rockchip,boot-ecc-strength:
        enum: [16, 24, 40, 60, 70]
        $ref: /schemas/types.yaml#/definitions/uint32
        description: |
          If specified it indicates that a different BCH/ECC setting is
          supported by the boot ROM.
            NFC v600 ECC 16, 24
              RK2928, RK3066, RK3188

            NFC v622 ECC 16, 24, 40, 60
              RK3036, RK3128

            NFC v800 ECC 16
              RK3308, RV1108

            NFC v900 ECC 16, 70
              RK3326, PX30

          Only used in combination with 'nand-is-boot-medium'.

    unevaluatedProperties: false

required:
  - compatible
  - reg
  - interrupts
  - clocks
  - clock-names

unevaluatedProperties: false

examples:
  - |
    #include <dt-bindings/clock/rk3308-cru.h>
    #include <dt-bindings/interrupt-controller/arm-gic.h>
    nfc: nand-controller@ff4b0000 {
      compatible = "rockchip,rk3308-nfc",
                   "rockchip,rv1108-nfc";
      reg = <0xff4b0000 0x4000>;
      interrupts = <GIC_SPI 81 IRQ_TYPE_LEVEL_HIGH>;
      clocks = <&cru HCLK_NANDC>, <&cru SCLK_NANDC>;
      clock-names = "ahb", "nfc";
      assigned-clocks = <&clks SCLK_NANDC>;
      assigned-clock-rates = <150000000>;

      pinctrl-0 = <&flash_ale &flash_bus8 &flash_cle &flash_csn0
                   &flash_rdn &flash_rdy &flash_wrn>;
      pinctrl-names = "default";

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

      nand@0 {
        reg = <0>;
        label = "rk-nand";
        nand-bus-width = <8>;
        nand-ecc-mode = "hw";
        nand-ecc-step-size = <1024>;
        nand-ecc-strength = <16>;
        nand-is-boot-medium;
        rockchip,boot-blks = <8>;
        rockchip,boot-ecc-strength = <16>;
      };
    };

...