b9d58f7e06
generic: Add/rename patches for upstream consistency ipq40xx: generic-level patch replaces same-source patches-4.19/ 082-v4.20-mtd-spinand-winbond-Add-support-for-W25N01GV.patch The SPI-NAND framework from Linux uses common driver code that is then "tuned" by a tiny struct of chip-specific data that describes available commands, timing, and layout (data and OOB data). Several manufacturers and chips have been added since 4.19, several of which are used in devices already supported by OpenWrt (typically with no or "legacy" access to their NAND memory). This commit catches up the supported-chip definitions through Linux 5.2-rc6 and linux/next. The driver is only compiled for platforms with CONFIG_MTD_SPI_NAND=y. This presently includes ipq40xx and pistachio, with the addition of ath79-nand in these commits (and not ath79-generic or ath79-tiny). Upstream patches refreshed against 4.19.75 Build-tested-on: ipq40xx Run-tested-on: ath79-nand Signed-off-by: Jeff Kletsky <git-commits@allycomm.com>
137 lines
4.6 KiB
Diff
137 lines
4.6 KiB
Diff
From db214513f62fd13c0a9af3bd5c5d634dba37e65d Mon Sep 17 00:00:00 2001
|
|
From: Yoshio Furuyama <tmcmc-mb-yfuruyama7@ml.toshiba.co.jp>
|
|
Date: Wed, 16 Jan 2019 14:53:19 +0900
|
|
Subject: [PATCH 7/8] mtd: spinand: Add support for all Toshiba Memory products
|
|
|
|
Add device table for Toshiba Memory products.
|
|
Also, generalize OOB layout structure and function names.
|
|
|
|
Signed-off-by: Yoshio Furuyama <tmcmc-mb-yfuruyama7@ml.toshiba.co.jp>
|
|
Reviewed-by: Frieder Schrempf <frieder.schrempf@kontron.de>
|
|
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
|
|
---
|
|
drivers/mtd/nand/spi/toshiba.c | 79 ++++++++++++++++++++++++++++------
|
|
1 file changed, 65 insertions(+), 14 deletions(-)
|
|
|
|
--- a/drivers/mtd/nand/spi/toshiba.c
|
|
+++ b/drivers/mtd/nand/spi/toshiba.c
|
|
@@ -25,19 +25,19 @@ static SPINAND_OP_VARIANTS(write_cache_v
|
|
static SPINAND_OP_VARIANTS(update_cache_variants,
|
|
SPINAND_PROG_LOAD(false, 0, NULL, 0));
|
|
|
|
-static int tc58cvg2s0h_ooblayout_ecc(struct mtd_info *mtd, int section,
|
|
+static int tc58cxgxsx_ooblayout_ecc(struct mtd_info *mtd, int section,
|
|
struct mtd_oob_region *region)
|
|
{
|
|
- if (section > 7)
|
|
+ if (section > 0)
|
|
return -ERANGE;
|
|
|
|
- region->offset = 128 + 16 * section;
|
|
- region->length = 16;
|
|
+ region->offset = mtd->oobsize / 2;
|
|
+ region->length = mtd->oobsize / 2;
|
|
|
|
return 0;
|
|
}
|
|
|
|
-static int tc58cvg2s0h_ooblayout_free(struct mtd_info *mtd, int section,
|
|
+static int tc58cxgxsx_ooblayout_free(struct mtd_info *mtd, int section,
|
|
struct mtd_oob_region *region)
|
|
{
|
|
if (section > 0)
|
|
@@ -45,17 +45,17 @@ static int tc58cvg2s0h_ooblayout_free(st
|
|
|
|
/* 2 bytes reserved for BBM */
|
|
region->offset = 2;
|
|
- region->length = 126;
|
|
+ region->length = (mtd->oobsize / 2) - 2;
|
|
|
|
return 0;
|
|
}
|
|
|
|
-static const struct mtd_ooblayout_ops tc58cvg2s0h_ooblayout = {
|
|
- .ecc = tc58cvg2s0h_ooblayout_ecc,
|
|
- .free = tc58cvg2s0h_ooblayout_free,
|
|
+static const struct mtd_ooblayout_ops tc58cxgxsx_ooblayout = {
|
|
+ .ecc = tc58cxgxsx_ooblayout_ecc,
|
|
+ .free = tc58cxgxsx_ooblayout_free,
|
|
};
|
|
|
|
-static int tc58cvg2s0h_ecc_get_status(struct spinand_device *spinand,
|
|
+static int tc58cxgxsx_ecc_get_status(struct spinand_device *spinand,
|
|
u8 status)
|
|
{
|
|
struct nand_device *nand = spinand_to_nand(spinand);
|
|
@@ -94,15 +94,66 @@ static int tc58cvg2s0h_ecc_get_status(st
|
|
}
|
|
|
|
static const struct spinand_info toshiba_spinand_table[] = {
|
|
- SPINAND_INFO("TC58CVG2S0H", 0xCD,
|
|
+ /* 3.3V 1Gb */
|
|
+ SPINAND_INFO("TC58CVG0S3", 0xC2,
|
|
+ NAND_MEMORG(1, 2048, 128, 64, 1024, 1, 1, 1),
|
|
+ NAND_ECCREQ(8, 512),
|
|
+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
|
+ &write_cache_variants,
|
|
+ &update_cache_variants),
|
|
+ 0,
|
|
+ SPINAND_ECCINFO(&tc58cxgxsx_ooblayout,
|
|
+ tc58cxgxsx_ecc_get_status)),
|
|
+ /* 3.3V 2Gb */
|
|
+ SPINAND_INFO("TC58CVG1S3", 0xCB,
|
|
+ NAND_MEMORG(1, 2048, 128, 64, 2048, 1, 1, 1),
|
|
+ NAND_ECCREQ(8, 512),
|
|
+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
|
+ &write_cache_variants,
|
|
+ &update_cache_variants),
|
|
+ 0,
|
|
+ SPINAND_ECCINFO(&tc58cxgxsx_ooblayout,
|
|
+ tc58cxgxsx_ecc_get_status)),
|
|
+ /* 3.3V 4Gb */
|
|
+ SPINAND_INFO("TC58CVG2S0", 0xCD,
|
|
+ NAND_MEMORG(1, 4096, 256, 64, 2048, 1, 1, 1),
|
|
+ NAND_ECCREQ(8, 512),
|
|
+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
|
+ &write_cache_variants,
|
|
+ &update_cache_variants),
|
|
+ 0,
|
|
+ SPINAND_ECCINFO(&tc58cxgxsx_ooblayout,
|
|
+ tc58cxgxsx_ecc_get_status)),
|
|
+ /* 1.8V 1Gb */
|
|
+ SPINAND_INFO("TC58CYG0S3", 0xB2,
|
|
+ NAND_MEMORG(1, 2048, 128, 64, 1024, 1, 1, 1),
|
|
+ NAND_ECCREQ(8, 512),
|
|
+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
|
+ &write_cache_variants,
|
|
+ &update_cache_variants),
|
|
+ 0,
|
|
+ SPINAND_ECCINFO(&tc58cxgxsx_ooblayout,
|
|
+ tc58cxgxsx_ecc_get_status)),
|
|
+ /* 1.8V 2Gb */
|
|
+ SPINAND_INFO("TC58CYG1S3", 0xBB,
|
|
+ NAND_MEMORG(1, 2048, 128, 64, 2048, 1, 1, 1),
|
|
+ NAND_ECCREQ(8, 512),
|
|
+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
|
+ &write_cache_variants,
|
|
+ &update_cache_variants),
|
|
+ 0,
|
|
+ SPINAND_ECCINFO(&tc58cxgxsx_ooblayout,
|
|
+ tc58cxgxsx_ecc_get_status)),
|
|
+ /* 1.8V 4Gb */
|
|
+ SPINAND_INFO("TC58CYG2S0", 0xBD,
|
|
NAND_MEMORG(1, 4096, 256, 64, 2048, 1, 1, 1),
|
|
NAND_ECCREQ(8, 512),
|
|
SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
|
&write_cache_variants,
|
|
&update_cache_variants),
|
|
- SPINAND_HAS_QE_BIT,
|
|
- SPINAND_ECCINFO(&tc58cvg2s0h_ooblayout,
|
|
- tc58cvg2s0h_ecc_get_status)),
|
|
+ 0,
|
|
+ SPINAND_ECCINFO(&tc58cxgxsx_ooblayout,
|
|
+ tc58cxgxsx_ecc_get_status)),
|
|
};
|
|
|
|
static int toshiba_spinand_detect(struct spinand_device *spinand)
|