Commit f4440abc authored by Miquel Raynal's avatar Miquel Raynal
Browse files

Merge tag 'nand/for-6.3' into mtd/next

NAND core changes:
* Check the data only read pattern only once
* Prepare the late addition of supported operation checks
* Support for sequential cache reads
* Fix nand_chip kdoc

Raw NAND changes:
* Fsl_elbc: Propagate HW ECC settings to HW
* Marvell: Add missing layouts
* Pasemi: Don't use static data to track per-device state
* Sunxi:
  - Fix the size of the last OOB region
  - Remove an unnecessary check
  - Remove an unnecessary check
  - Clean up chips after failed init
  - Precompute the ECC_CTL register value
  - Embed sunxi_nand_hw_ecc by value
  - Update OOB layout to match hardware
* tmio_nand: Remove driver
* vf610_nfc: Use regular comments for functions

SPI-NAND changes:
* Add support for AllianceMemory AS5F34G04SND
* Macronix: use scratch buffer for DMA operation

NAND ECC changes:
* Mediatek:
  - Add ECC support fot MT7986 IC
  - Add compatible for MT7986
  - dt-bindings: Split ECC engine with rawnand controller
parents 27121864 ef3e6327
Loading
Loading
Loading
Loading
+155 −0
Original line number Original line Diff line number Diff line
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/mtd/mediatek,mtk-nfc.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#

title: MediaTek(MTK) SoCs raw NAND FLASH controller (NFC)

maintainers:
  - Xiangsheng Hou <xiangsheng.hou@mediatek.com>

properties:
  compatible:
    enum:
      - mediatek,mt2701-nfc
      - mediatek,mt2712-nfc
      - mediatek,mt7622-nfc

  reg:
    items:
      - description: Base physical address and size of NFI.

  interrupts:
    items:
      - description: NFI interrupt

  clocks:
    items:
      - description: clock used for the controller
      - description: clock used for the pad

  clock-names:
    items:
      - const: nfi_clk
      - const: pad_clk

  ecc-engine:
    description: device-tree node of the required ECC engine.
    $ref: /schemas/types.yaml#/definitions/phandle

patternProperties:
  "^nand@[a-f0-9]$":
    $ref: nand-chip.yaml#
    unevaluatedProperties: false
    properties:
      reg:
        maximum: 1
      nand-on-flash-bbt: true
      nand-ecc-mode:
        const: hw

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

  - if:
      properties:
        compatible:
          contains:
            const: mediatek,mt2701-nfc
    then:
      patternProperties:
        "^nand@[a-f0-9]$":
          properties:
            nand-ecc-step-size:
              enum: [ 512, 1024 ]
            nand-ecc-strength:
              enum: [4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 28, 32, 36,
                     40, 44, 48, 52, 56, 60]

  - if:
      properties:
        compatible:
          contains:
            const: mediatek,mt2712-nfc
    then:
      patternProperties:
        "^nand@[a-f0-9]$":
          properties:
            nand-ecc-step-size:
              enum: [ 512, 1024 ]
            nand-ecc-strength:
              enum: [4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 28, 32, 36,
                     40, 44, 48, 52, 56, 60, 68, 72, 80]

  - if:
      properties:
        compatible:
          contains:
            const: mediatek,mt7622-nfc
    then:
      patternProperties:
        "^nand@[a-f0-9]$":
          properties:
            nand-ecc-step-size:
              const: 512
            nand-ecc-strength:
              enum: [4, 6, 8, 10, 12]

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

unevaluatedProperties: false

examples:
  - |
    #include <dt-bindings/clock/mt2701-clk.h>
    #include <dt-bindings/interrupt-controller/arm-gic.h>
    #include <dt-bindings/interrupt-controller/irq.h>

    soc {
        #address-cells = <2>;
        #size-cells = <2>;

        nand-controller@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>;

            nand@0 {
                reg = <0>;

                nand-on-flash-bbt;
                nand-ecc-mode = "hw";
                nand-ecc-step-size = <1024>;
                nand-ecc-strength = <24>;

                partitions {
                    compatible = "fixed-partitions";
                    #address-cells = <1>;
                    #size-cells = <1>;

                    preloader@0 {
                        label = "pl";
                        read-only;
                        reg = <0x0 0x400000>;
                    };
                    android@400000 {
                        label = "android";
                        reg = <0x400000 0x12c00000>;
                    };
                };
            };
        };
    };
+63 −0
Original line number Original line Diff line number Diff line
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/mtd/mediatek,nand-ecc-engine.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#

title: MediaTek(MTK) SoCs NAND ECC engine

maintainers:
  - Xiangsheng Hou <xiangsheng.hou@mediatek.com>

description: |
  MTK NAND ECC engine can cowork with MTK raw NAND and SPI NAND controller.

properties:
  compatible:
    enum:
      - mediatek,mt2701-ecc
      - mediatek,mt2712-ecc
      - mediatek,mt7622-ecc
      - mediatek,mt7986-ecc

  reg:
    items:
      - description: Base physical address and size of ECC.

  interrupts:
    items:
      - description: ECC interrupt

  clocks:
    maxItems: 1

  clock-names:
    const: nfiecc_clk

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

additionalProperties: false

examples:
  - |
    #include <dt-bindings/clock/mt2701-clk.h>
    #include <dt-bindings/interrupt-controller/arm-gic.h>
    #include <dt-bindings/interrupt-controller/irq.h>

    soc {
        #address-cells = <2>;
        #size-cells = <2>;

        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";
        };
    };
+0 −176
Original line number Original line Diff line number Diff line
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";
	};
+1 −1
Original line number Original line Diff line number Diff line
@@ -13213,7 +13213,7 @@ F: drivers/phy/ralink/phy-mt7621-pci.c
MEDIATEK NAND CONTROLLER DRIVER
MEDIATEK NAND CONTROLLER DRIVER
L:	linux-mtd@lists.infradead.org
L:	linux-mtd@lists.infradead.org
S:	Orphan
S:	Orphan
F:	Documentation/devicetree/bindings/mtd/mtk-nand.txt
F:	Documentation/devicetree/bindings/mtd/mediatek,mtk-nfc.yaml
F:	drivers/mtd/nand/raw/mtk_*
F:	drivers/mtd/nand/raw/mtk_*
MEDIATEK PMIC LED DRIVER
MEDIATEK PMIC LED DRIVER
+25 −3
Original line number Original line Diff line number Diff line
@@ -40,6 +40,10 @@
#define ECC_IDLE_REG(op)	((op) == ECC_ENCODE ? ECC_ENCIDLE : ECC_DECIDLE)
#define ECC_IDLE_REG(op)	((op) == ECC_ENCODE ? ECC_ENCIDLE : ECC_DECIDLE)
#define ECC_CTL_REG(op)		((op) == ECC_ENCODE ? ECC_ENCCON : ECC_DECCON)
#define ECC_CTL_REG(op)		((op) == ECC_ENCODE ? ECC_ENCCON : ECC_DECCON)


#define ECC_ERRMASK_MT7622	GENMASK(4, 0)
#define ECC_ERRMASK_MT2701	GENMASK(5, 0)
#define ECC_ERRMASK_MT2712	GENMASK(6, 0)

struct mtk_ecc_caps {
struct mtk_ecc_caps {
	u32 err_mask;
	u32 err_mask;
	u32 err_shift;
	u32 err_shift;
@@ -79,6 +83,10 @@ static const u8 ecc_strength_mt7622[] = {
	4, 6, 8, 10, 12
	4, 6, 8, 10, 12
};
};


static const u8 ecc_strength_mt7986[] = {
	4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24
};

enum mtk_ecc_regs {
enum mtk_ecc_regs {
	ECC_ENCPAR00,
	ECC_ENCPAR00,
	ECC_ENCIRQ_EN,
	ECC_ENCIRQ_EN,
@@ -451,7 +459,7 @@ unsigned int mtk_ecc_get_parity_bits(struct mtk_ecc *ecc)
EXPORT_SYMBOL(mtk_ecc_get_parity_bits);
EXPORT_SYMBOL(mtk_ecc_get_parity_bits);


static const struct mtk_ecc_caps mtk_ecc_caps_mt2701 = {
static const struct mtk_ecc_caps mtk_ecc_caps_mt2701 = {
	.err_mask = 0x3f,
	.err_mask = ECC_ERRMASK_MT2701,
	.err_shift = 8,
	.err_shift = 8,
	.ecc_strength = ecc_strength_mt2701,
	.ecc_strength = ecc_strength_mt2701,
	.ecc_regs = mt2701_ecc_regs,
	.ecc_regs = mt2701_ecc_regs,
@@ -462,7 +470,7 @@ static const struct mtk_ecc_caps mtk_ecc_caps_mt2701 = {
};
};


static const struct mtk_ecc_caps mtk_ecc_caps_mt2712 = {
static const struct mtk_ecc_caps mtk_ecc_caps_mt2712 = {
	.err_mask = 0x7f,
	.err_mask = ECC_ERRMASK_MT2712,
	.err_shift = 8,
	.err_shift = 8,
	.ecc_strength = ecc_strength_mt2712,
	.ecc_strength = ecc_strength_mt2712,
	.ecc_regs = mt2712_ecc_regs,
	.ecc_regs = mt2712_ecc_regs,
@@ -473,7 +481,7 @@ static const struct mtk_ecc_caps mtk_ecc_caps_mt2712 = {
};
};


static const struct mtk_ecc_caps mtk_ecc_caps_mt7622 = {
static const struct mtk_ecc_caps mtk_ecc_caps_mt7622 = {
	.err_mask = 0x1f,
	.err_mask = ECC_ERRMASK_MT7622,
	.err_shift = 5,
	.err_shift = 5,
	.ecc_strength = ecc_strength_mt7622,
	.ecc_strength = ecc_strength_mt7622,
	.ecc_regs = mt7622_ecc_regs,
	.ecc_regs = mt7622_ecc_regs,
@@ -483,6 +491,17 @@ static const struct mtk_ecc_caps mtk_ecc_caps_mt7622 = {
	.pg_irq_sel = 0,
	.pg_irq_sel = 0,
};
};


static const struct mtk_ecc_caps mtk_ecc_caps_mt7986 = {
	.err_mask = ECC_ERRMASK_MT7622,
	.err_shift = 8,
	.ecc_strength = ecc_strength_mt7986,
	.ecc_regs = mt2712_ecc_regs,
	.num_ecc_strength = 11,
	.ecc_mode_shift = 5,
	.parity_bits = 14,
	.pg_irq_sel = 1,
};

static const struct of_device_id mtk_ecc_dt_match[] = {
static const struct of_device_id mtk_ecc_dt_match[] = {
	{
	{
		.compatible = "mediatek,mt2701-ecc",
		.compatible = "mediatek,mt2701-ecc",
@@ -493,6 +512,9 @@ static const struct of_device_id mtk_ecc_dt_match[] = {
	}, {
	}, {
		.compatible = "mediatek,mt7622-ecc",
		.compatible = "mediatek,mt7622-ecc",
		.data = &mtk_ecc_caps_mt7622,
		.data = &mtk_ecc_caps_mt7622,
	}, {
		.compatible = "mediatek,mt7986-ecc",
		.data = &mtk_ecc_caps_mt7986,
	},
	},
	{},
	{},
};
};
Loading