162306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
262306a36Sopenharmony_ci%YAML 1.2
362306a36Sopenharmony_ci---
462306a36Sopenharmony_ci$id: http://devicetree.org/schemas/mtd/brcm,brcmnand.yaml#
562306a36Sopenharmony_ci$schema: http://devicetree.org/meta-schemas/core.yaml#
662306a36Sopenharmony_ci
762306a36Sopenharmony_cititle: Broadcom STB NAND Controller
862306a36Sopenharmony_ci
962306a36Sopenharmony_cimaintainers:
1062306a36Sopenharmony_ci  - Brian Norris <computersforpeace@gmail.com>
1162306a36Sopenharmony_ci  - Kamal Dasu <kdasu.kdev@gmail.com>
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_cidescription: |
1462306a36Sopenharmony_ci  The Broadcom Set-Top Box NAND controller supports low-level access to raw NAND
1562306a36Sopenharmony_ci  flash chips. It has a memory-mapped register interface for both control
1662306a36Sopenharmony_ci  registers and for its data input/output buffer. On some SoCs, this controller
1762306a36Sopenharmony_ci  is paired with a custom DMA engine (inventively named "Flash DMA") which
1862306a36Sopenharmony_ci  supports basic PROGRAM and READ functions, among other features.
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci  This controller was originally designed for STB SoCs (BCM7xxx) but is now
2162306a36Sopenharmony_ci  available on a variety of Broadcom SoCs, including some BCM3xxx, BCM63xx, and
2262306a36Sopenharmony_ci  iProc/Cygnus. Its history includes several similar (but not fully register
2362306a36Sopenharmony_ci  compatible) versions.
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci  -- Additional SoC-specific NAND controller properties --
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci  The NAND controller is integrated differently on the variety of SoCs on which
2862306a36Sopenharmony_ci  it is found. Part of this integration involves providing status and enable
2962306a36Sopenharmony_ci  bits with which to control the 8 exposed NAND interrupts, as well as hardware
3062306a36Sopenharmony_ci  for configuring the endianness of the data bus. On some SoCs, these features
3162306a36Sopenharmony_ci  are handled via standard, modular components (e.g., their interrupts look like
3262306a36Sopenharmony_ci  a normal IRQ chip), but on others, they are controlled in unique and
3362306a36Sopenharmony_ci  interesting ways, sometimes with registers that lump multiple NAND-related
3462306a36Sopenharmony_ci  functions together. The former case can be described simply by the standard
3562306a36Sopenharmony_ci  interrupts properties in the main controller node. But for the latter
3662306a36Sopenharmony_ci  exceptional cases, we define additional 'compatible' properties and associated
3762306a36Sopenharmony_ci  register resources within the NAND controller node above.
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ciproperties:
4062306a36Sopenharmony_ci  compatible:
4162306a36Sopenharmony_ci    oneOf:
4262306a36Sopenharmony_ci      - items:
4362306a36Sopenharmony_ci          - enum:
4462306a36Sopenharmony_ci              - brcm,brcmnand-v2.1
4562306a36Sopenharmony_ci              - brcm,brcmnand-v2.2
4662306a36Sopenharmony_ci              - brcm,brcmnand-v4.0
4762306a36Sopenharmony_ci              - brcm,brcmnand-v5.0
4862306a36Sopenharmony_ci              - brcm,brcmnand-v6.0
4962306a36Sopenharmony_ci              - brcm,brcmnand-v6.1
5062306a36Sopenharmony_ci              - brcm,brcmnand-v6.2
5162306a36Sopenharmony_ci              - brcm,brcmnand-v7.0
5262306a36Sopenharmony_ci              - brcm,brcmnand-v7.1
5362306a36Sopenharmony_ci              - brcm,brcmnand-v7.2
5462306a36Sopenharmony_ci              - brcm,brcmnand-v7.3
5562306a36Sopenharmony_ci          - const: brcm,brcmnand
5662306a36Sopenharmony_ci      - description: BCM63138 SoC-specific NAND controller
5762306a36Sopenharmony_ci        items:
5862306a36Sopenharmony_ci          - const: brcm,nand-bcm63138
5962306a36Sopenharmony_ci          - enum:
6062306a36Sopenharmony_ci              - brcm,brcmnand-v7.0
6162306a36Sopenharmony_ci              - brcm,brcmnand-v7.1
6262306a36Sopenharmony_ci          - const: brcm,brcmnand
6362306a36Sopenharmony_ci      - description: iProc SoC-specific NAND controller
6462306a36Sopenharmony_ci        items:
6562306a36Sopenharmony_ci          - const: brcm,nand-iproc
6662306a36Sopenharmony_ci          - const: brcm,brcmnand-v6.1
6762306a36Sopenharmony_ci          - const: brcm,brcmnand
6862306a36Sopenharmony_ci      - description: BCM63168 SoC-specific NAND controller
6962306a36Sopenharmony_ci        items:
7062306a36Sopenharmony_ci          - const: brcm,nand-bcm63168
7162306a36Sopenharmony_ci          - const: brcm,nand-bcm6368
7262306a36Sopenharmony_ci          - const: brcm,brcmnand-v4.0
7362306a36Sopenharmony_ci          - const: brcm,brcmnand
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci  reg:
7662306a36Sopenharmony_ci    minItems: 1
7762306a36Sopenharmony_ci    maxItems: 6
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci  reg-names:
8062306a36Sopenharmony_ci    minItems: 1
8162306a36Sopenharmony_ci    maxItems: 6
8262306a36Sopenharmony_ci    items:
8362306a36Sopenharmony_ci      enum: [ nand, flash-dma, flash-edu, nand-cache, nand-int-base, iproc-idm, iproc-ext ]
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ci  interrupts:
8662306a36Sopenharmony_ci    minItems: 1
8762306a36Sopenharmony_ci    items:
8862306a36Sopenharmony_ci      - description: NAND CTLRDY interrupt
8962306a36Sopenharmony_ci      - description: FLASH_DMA_DONE (if flash DMA is available) or FLASH_EDU_DONE (if EDU is available)
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ci  interrupt-names:
9262306a36Sopenharmony_ci    minItems: 1
9362306a36Sopenharmony_ci    items:
9462306a36Sopenharmony_ci      - const: nand_ctlrdy
9562306a36Sopenharmony_ci      - enum:
9662306a36Sopenharmony_ci          - flash_dma_done
9762306a36Sopenharmony_ci          - flash_edu_done
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_ci  clocks:
10062306a36Sopenharmony_ci    maxItems: 1
10162306a36Sopenharmony_ci    description: reference to the clock for the NAND controller
10262306a36Sopenharmony_ci
10362306a36Sopenharmony_ci  clock-names:
10462306a36Sopenharmony_ci    const: nand
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_ci  brcm,nand-has-wp:
10762306a36Sopenharmony_ci    description: >
10862306a36Sopenharmony_ci      Some versions of this IP include a write-protect
10962306a36Sopenharmony_ci      (WP) control bit. It is always available on >=
11062306a36Sopenharmony_ci      v7.0. Use this property to describe the rare
11162306a36Sopenharmony_ci      earlier versions of this core that include WP
11262306a36Sopenharmony_ci    type: boolean
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_cipatternProperties:
11562306a36Sopenharmony_ci  "^nand@[a-f0-9]$":
11662306a36Sopenharmony_ci    type: object
11762306a36Sopenharmony_ci    $ref: raw-nand-chip.yaml
11862306a36Sopenharmony_ci    properties:
11962306a36Sopenharmony_ci      compatible:
12062306a36Sopenharmony_ci        const: brcm,nandcs
12162306a36Sopenharmony_ci
12262306a36Sopenharmony_ci      nand-ecc-step-size:
12362306a36Sopenharmony_ci        enum: [ 512, 1024 ]
12462306a36Sopenharmony_ci
12562306a36Sopenharmony_ci      brcm,nand-oob-sector-size:
12662306a36Sopenharmony_ci        description: |
12762306a36Sopenharmony_ci          integer, to denote the spare area sector size
12862306a36Sopenharmony_ci          expected for the ECC layout in use. This size, in
12962306a36Sopenharmony_ci          addition to the strength and step-size,
13062306a36Sopenharmony_ci          determines how the hardware BCH engine will lay
13162306a36Sopenharmony_ci          out the parity bytes it stores on the flash.
13262306a36Sopenharmony_ci          This property can be automatically determined by
13362306a36Sopenharmony_ci          the flash geometry (particularly the NAND page
13462306a36Sopenharmony_ci          and OOB size) in many cases, but when booting
13562306a36Sopenharmony_ci          from NAND, the boot controller has only a limited
13662306a36Sopenharmony_ci          number of available options for its default ECC
13762306a36Sopenharmony_ci          layout.
13862306a36Sopenharmony_ci        $ref: /schemas/types.yaml#/definitions/uint32
13962306a36Sopenharmony_ci
14062306a36Sopenharmony_ci    unevaluatedProperties: false
14162306a36Sopenharmony_ci
14262306a36Sopenharmony_ciallOf:
14362306a36Sopenharmony_ci  - $ref: nand-controller.yaml#
14462306a36Sopenharmony_ci  - if:
14562306a36Sopenharmony_ci      properties:
14662306a36Sopenharmony_ci        compatible:
14762306a36Sopenharmony_ci          contains:
14862306a36Sopenharmony_ci            const: brcm,nand-bcm63138
14962306a36Sopenharmony_ci    then:
15062306a36Sopenharmony_ci      properties:
15162306a36Sopenharmony_ci        reg-names:
15262306a36Sopenharmony_ci          items:
15362306a36Sopenharmony_ci            - const: nand
15462306a36Sopenharmony_ci            - const: nand-int-base
15562306a36Sopenharmony_ci  - if:
15662306a36Sopenharmony_ci      properties:
15762306a36Sopenharmony_ci        compatible:
15862306a36Sopenharmony_ci          contains:
15962306a36Sopenharmony_ci            const: brcm,nand-bcm6368
16062306a36Sopenharmony_ci    then:
16162306a36Sopenharmony_ci      properties:
16262306a36Sopenharmony_ci        reg-names:
16362306a36Sopenharmony_ci          items:
16462306a36Sopenharmony_ci            - const: nand
16562306a36Sopenharmony_ci            - const: nand-int-base
16662306a36Sopenharmony_ci            - const: nand-cache
16762306a36Sopenharmony_ci  - if:
16862306a36Sopenharmony_ci      properties:
16962306a36Sopenharmony_ci        compatible:
17062306a36Sopenharmony_ci          contains:
17162306a36Sopenharmony_ci            const: brcm,nand-iproc
17262306a36Sopenharmony_ci    then:
17362306a36Sopenharmony_ci      properties:
17462306a36Sopenharmony_ci        reg-names:
17562306a36Sopenharmony_ci          items:
17662306a36Sopenharmony_ci            - const: nand
17762306a36Sopenharmony_ci            - const: iproc-idm
17862306a36Sopenharmony_ci            - const: iproc-ext
17962306a36Sopenharmony_ci  - if:
18062306a36Sopenharmony_ci      properties:
18162306a36Sopenharmony_ci        interrupts:
18262306a36Sopenharmony_ci          minItems: 2
18362306a36Sopenharmony_ci    then:
18462306a36Sopenharmony_ci      required:
18562306a36Sopenharmony_ci        - interrupt-names
18662306a36Sopenharmony_ci
18762306a36Sopenharmony_ciunevaluatedProperties: false
18862306a36Sopenharmony_ci
18962306a36Sopenharmony_cirequired:
19062306a36Sopenharmony_ci  - reg
19162306a36Sopenharmony_ci  - reg-names
19262306a36Sopenharmony_ci  - interrupts
19362306a36Sopenharmony_ci
19462306a36Sopenharmony_ciexamples:
19562306a36Sopenharmony_ci  - |
19662306a36Sopenharmony_ci    nand-controller@f0442800 {
19762306a36Sopenharmony_ci        compatible = "brcm,brcmnand-v7.0", "brcm,brcmnand";
19862306a36Sopenharmony_ci        reg = <0xf0442800 0x600>,
19962306a36Sopenharmony_ci              <0xf0443000 0x100>;
20062306a36Sopenharmony_ci        reg-names = "nand", "flash-dma";
20162306a36Sopenharmony_ci        interrupt-parent = <&hif_intr2_intc>;
20262306a36Sopenharmony_ci        interrupts = <24>, <4>;
20362306a36Sopenharmony_ci        interrupt-names = "nand_ctlrdy", "flash_dma_done";
20462306a36Sopenharmony_ci
20562306a36Sopenharmony_ci        #address-cells = <1>;
20662306a36Sopenharmony_ci        #size-cells = <0>;
20762306a36Sopenharmony_ci
20862306a36Sopenharmony_ci        nand@1 {
20962306a36Sopenharmony_ci            compatible = "brcm,nandcs";
21062306a36Sopenharmony_ci            reg = <1>; // Chip select 1
21162306a36Sopenharmony_ci            nand-on-flash-bbt;
21262306a36Sopenharmony_ci            nand-ecc-strength = <12>;
21362306a36Sopenharmony_ci            nand-ecc-step-size = <512>;
21462306a36Sopenharmony_ci
21562306a36Sopenharmony_ci            #address-cells = <1>;
21662306a36Sopenharmony_ci            #size-cells = <1>;
21762306a36Sopenharmony_ci        };
21862306a36Sopenharmony_ci    };
21962306a36Sopenharmony_ci  - |
22062306a36Sopenharmony_ci    nand-controller@10000200 {
22162306a36Sopenharmony_ci        compatible = "brcm,nand-bcm63168", "brcm,nand-bcm6368",
22262306a36Sopenharmony_ci                     "brcm,brcmnand-v4.0", "brcm,brcmnand";
22362306a36Sopenharmony_ci        reg = <0x10000200 0x180>,
22462306a36Sopenharmony_ci              <0x100000b0 0x10>,
22562306a36Sopenharmony_ci              <0x10000600 0x200>;
22662306a36Sopenharmony_ci        reg-names = "nand", "nand-int-base", "nand-cache";
22762306a36Sopenharmony_ci        interrupt-parent = <&periph_intc>;
22862306a36Sopenharmony_ci        interrupts = <50>;
22962306a36Sopenharmony_ci        clocks = <&periph_clk 20>;
23062306a36Sopenharmony_ci        clock-names = "nand";
23162306a36Sopenharmony_ci
23262306a36Sopenharmony_ci        #address-cells = <1>;
23362306a36Sopenharmony_ci        #size-cells = <0>;
23462306a36Sopenharmony_ci
23562306a36Sopenharmony_ci        nand@0 {
23662306a36Sopenharmony_ci            compatible = "brcm,nandcs";
23762306a36Sopenharmony_ci            reg = <0>;
23862306a36Sopenharmony_ci            nand-on-flash-bbt;
23962306a36Sopenharmony_ci            nand-ecc-strength = <1>;
24062306a36Sopenharmony_ci            nand-ecc-step-size = <512>;
24162306a36Sopenharmony_ci
24262306a36Sopenharmony_ci            #address-cells = <1>;
24362306a36Sopenharmony_ci            #size-cells = <1>;
24462306a36Sopenharmony_ci        };
24562306a36Sopenharmony_ci    };
246