]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
mtd: rawnand: ESMT: retrieve ECC requirements from 5th id byte
authorMarcel Ziswiler <marcel.ziswiler@toradex.com>
Wed, 19 Sep 2018 11:40:49 +0000 (13:40 +0200)
committerMiquel Raynal <miquel.raynal@bootlin.com>
Wed, 3 Oct 2018 09:12:25 +0000 (11:12 +0200)
This patch enables support to read the ECC level from the NAND flash
using ESMT SLC NAND ID byte 5 information as documented e.g. in the
following data sheet:

https://www.esmt.com.tw/upload/pdf/ESMT/datasheets/F59L1G81LA(2Y).pdf

Signed-off-by: Marcel Ziswiler <marcel.ziswiler@toradex.com>
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
drivers/mtd/nand/raw/Makefile
drivers/mtd/nand/raw/internals.h
drivers/mtd/nand/raw/nand_esmt.c [new file with mode: 0644]
drivers/mtd/nand/raw/nand_ids.c

index be2c17863ee599228af85a5a02810f5cb80541a5..57159b349054ddf2065890326a5809633f8c4f16 100644 (file)
@@ -61,6 +61,7 @@ nand-objs := nand_base.o nand_legacy.o nand_bbt.o nand_timings.o nand_ids.o
 nand-objs += nand_onfi.o
 nand-objs += nand_jedec.o
 nand-objs += nand_amd.o
+nand-objs += nand_esmt.o
 nand-objs += nand_hynix.o
 nand-objs += nand_macronix.o
 nand-objs += nand_micron.o
index f624b7b8041316b478ce3b319b3f2b60ae8fb5aa..04c2cf74eff3e397779874d82d4155d456b5009b 100644 (file)
@@ -67,6 +67,7 @@ struct nand_manufacturer {
 extern struct nand_flash_dev nand_flash_ids[];
 
 extern const struct nand_manufacturer_ops amd_nand_manuf_ops;
+extern const struct nand_manufacturer_ops esmt_nand_manuf_ops;
 extern const struct nand_manufacturer_ops hynix_nand_manuf_ops;
 extern const struct nand_manufacturer_ops macronix_nand_manuf_ops;
 extern const struct nand_manufacturer_ops micron_nand_manuf_ops;
diff --git a/drivers/mtd/nand/raw/nand_esmt.c b/drivers/mtd/nand/raw/nand_esmt.c
new file mode 100644 (file)
index 0000000..96f039a
--- /dev/null
@@ -0,0 +1,47 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2018 Toradex AG
+ *
+ * Author: Marcel Ziswiler <marcel.ziswiler@toradex.com>
+ */
+
+#include <linux/mtd/rawnand.h>
+#include "internals.h"
+
+static void esmt_nand_decode_id(struct nand_chip *chip)
+{
+       nand_decode_ext_id(chip);
+
+       /* Extract ECC requirements from 5th id byte. */
+       if (chip->id.len >= 5 && nand_is_slc(chip)) {
+               chip->ecc_step_ds = 512;
+               switch (chip->id.data[4] & 0x3) {
+               case 0x0:
+                       chip->ecc_strength_ds = 4;
+                       break;
+               case 0x1:
+                       chip->ecc_strength_ds = 2;
+                       break;
+               case 0x2:
+                       chip->ecc_strength_ds = 1;
+                       break;
+               default:
+                       WARN(1, "Could not get ECC info");
+                       chip->ecc_step_ds = 0;
+                       break;
+               }
+       }
+}
+
+static int esmt_nand_init(struct nand_chip *chip)
+{
+       if (nand_is_slc(chip))
+               chip->bbt_options |= NAND_BBT_SCAN2NDPAGE;
+
+       return 0;
+}
+
+const struct nand_manufacturer_ops esmt_nand_manuf_ops = {
+       .detect = esmt_nand_decode_id,
+       .init = esmt_nand_init,
+};
index fd0a7f71110004b47e8522e2ff52884ddce4c965..ea5a342cd91e5376a2693cef5583e0f7364f0131 100644 (file)
@@ -174,7 +174,7 @@ static const struct nand_manufacturer nand_manufacturers[] = {
        {NAND_MFR_AMD, "AMD/Spansion", &amd_nand_manuf_ops},
        {NAND_MFR_ATO, "ATO"},
        {NAND_MFR_EON, "Eon"},
-       {NAND_MFR_ESMT, "ESMT"},
+       {NAND_MFR_ESMT, "ESMT", &esmt_nand_manuf_ops},
        {NAND_MFR_FUJITSU, "Fujitsu"},
        {NAND_MFR_HYNIX, "Hynix", &hynix_nand_manuf_ops},
        {NAND_MFR_INTEL, "Intel"},