Documentation / devicetree / bindings / mtd / mtk-nand.txt


Based on kernel version 6.2.16. Page generated on 2023-08-29 08:28 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
MTK SoCs NAND FLASH controller (NFC) DT binding

This file documents the device tree bindings for MTK SoCs NAND controllers.
The functional split of the controller requires two drivers to operate:
the nand controller interface driver and the ECC engine driver.

The hardware description for both devices must be captured as device
tree nodes.

1) NFC NAND Controller Interface (NFI):
=======================================

The first part of NFC is NAND Controller Interface (NFI) HW.
Required NFI properties:
- compatible:			Should be one of
				"mediatek,mt2701-nfc",
				"mediatek,mt2712-nfc",
				"mediatek,mt7622-nfc".
- reg:				Base physical address and size of NFI.
- interrupts:			Interrupts of NFI.
- clocks:			NFI required clocks.
- clock-names:			NFI clocks internal name.
- ecc-engine:			Required ECC Engine node.
- #address-cells:		NAND chip index, should be 1.
- #size-cells:			Should be 0.

Example:

	nandc: nfi@1100d000 {
		compatible = "mediatek,mt2701-nfc";
		reg = <0 0x1100d000 0 0x1000>;
		interrupts = <GIC_SPI 56 IRQ_TYPE_LEVEL_LOW>;
		clocks = <&pericfg CLK_PERI_NFI>,
			 <&pericfg CLK_PERI_NFI_PAD>;
		clock-names = "nfi_clk", "pad_clk";
		ecc-engine = <&bch>;
		#address-cells = <1>;
		#size-cells = <0>;
        };

Platform related properties, should be set in {platform_name}.dts:
- children nodes:	NAND chips.

Children nodes properties:
- reg:			Chip Select Signal, default 0.
			Set as reg = <0>, <1> when need 2 CS.
Optional:
- nand-on-flash-bbt:	Store BBT on NAND Flash.
- nand-ecc-mode:	the NAND ecc mode (check driver for supported modes)
- nand-ecc-step-size:	Number of data bytes covered by a single ECC step.
			valid values:
			512 and 1024 on mt2701 and mt2712.
			512 only on mt7622.
			1024 is recommended for large page NANDs.
- nand-ecc-strength:	Number of bits to correct per ECC step.
			The valid values that each controller supports:
			mt2701: 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 28,
				32, 36, 40, 44, 48, 52, 56, 60.
			mt2712: 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 28,
				32, 36, 40, 44, 48, 52, 56, 60, 68, 72, 80.
			mt7622: 4, 6, 8, 10, 12, 14, 16.
			The strength should be calculated as follows:
			E = (S - F) * 8 / B
			S = O / (P / Q)
				E :	nand-ecc-strength.
				S :	spare size per sector.
				F :	FDM size, should be in the range [1,8].
					It is used to store free oob data.
				O :	oob size.
				P :	page size.
				Q :	nand-ecc-step-size.
				B :	number of parity bits needed to correct
					1 bitflip.
					According to MTK NAND controller design,
					this number depends on max ecc step size
					that MTK NAND controller supports.
					If max ecc step size supported is 1024,
					then it should be always 14. And if max
					ecc step size is 512, then it should be
					always 13.
			If the result does not match any one of the listed
			choices above, please select the smaller valid value from
			the list.
			(otherwise the driver will do the adjustment at runtime)
- pinctrl-names:	Default NAND pin GPIO setting name.
- pinctrl-0:		GPIO setting node.

Example:
	&pio {
		nand_pins_default: nanddefault {
			pins_dat {
				pinmux = <MT2701_PIN_111_MSDC0_DAT7__FUNC_NLD7>,
					 <MT2701_PIN_112_MSDC0_DAT6__FUNC_NLD6>,
					 <MT2701_PIN_114_MSDC0_DAT4__FUNC_NLD4>,
					 <MT2701_PIN_118_MSDC0_DAT3__FUNC_NLD3>,
					 <MT2701_PIN_121_MSDC0_DAT0__FUNC_NLD0>,
					 <MT2701_PIN_120_MSDC0_DAT1__FUNC_NLD1>,
					 <MT2701_PIN_113_MSDC0_DAT5__FUNC_NLD5>,
					 <MT2701_PIN_115_MSDC0_RSTB__FUNC_NLD8>,
					 <MT2701_PIN_119_MSDC0_DAT2__FUNC_NLD2>;
				input-enable;
				drive-strength = <MTK_DRIVE_8mA>;
				bias-pull-up;
			};

			pins_we {
				pinmux = <MT2701_PIN_117_MSDC0_CLK__FUNC_NWEB>;
				drive-strength = <MTK_DRIVE_8mA>;
				bias-pull-up = <MTK_PUPD_SET_R1R0_10>;
			};

			pins_ale {
				pinmux = <MT2701_PIN_116_MSDC0_CMD__FUNC_NALE>;
				drive-strength = <MTK_DRIVE_8mA>;
				bias-pull-down = <MTK_PUPD_SET_R1R0_10>;
			};
		};
	};

	&nandc {
		status = "okay";
		pinctrl-names = "default";
		pinctrl-0 = <&nand_pins_default>;
		nand@0 {
			reg = <0>;
			nand-on-flash-bbt;
			nand-ecc-mode = "hw";
			nand-ecc-strength = <24>;
			nand-ecc-step-size = <1024>;
		};
	};

NAND chip optional subnodes:
- Partitions, see Documentation/devicetree/bindings/mtd/mtd.yaml

Example:
	nand@0 {
		partitions {
			compatible = "fixed-partitions";
			#address-cells = <1>;
			#size-cells = <1>;

			preloader@0 {
				label = "pl";
				read-only;
				reg = <0x00000000 0x00400000>;
			};
			android@00400000 {
				label = "android";
				reg = <0x00400000 0x12c00000>;
			};
		};
	};

2) ECC Engine:
==============

Required BCH properties:
- compatible:	Should be one of
		"mediatek,mt2701-ecc",
		"mediatek,mt2712-ecc",
		"mediatek,mt7622-ecc".
- reg:		Base physical address and size of ECC.
- interrupts:	Interrupts of ECC.
- clocks:	ECC required clocks.
- clock-names:	ECC clocks internal name.

Example:

	bch: ecc@1100e000 {
		compatible = "mediatek,mt2701-ecc";
		reg = <0 0x1100e000 0 0x1000>;
		interrupts = <GIC_SPI 55 IRQ_TYPE_LEVEL_LOW>;
		clocks = <&pericfg CLK_PERI_NFI_ECC>;
		clock-names = "nfiecc_clk";
	};