mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2025-01-22 13:54:57 +08:00
The raw NAND subsystem has, as usual, seen a bit of cleanup being done
this cycle, typically return values of platform_get_irq() and devm_kasprintf(), plus structure annotations for sanitizers. There is also a better ECC check in the Arasan driver. This comes with smaller misc changes. In the SPI-NAND world there is now support for Foresee F35SQA002G, Winbond W25N and XTX XT26 chips. -----BEGIN PGP SIGNATURE----- iQEzBAABCgAdFiEE9HuaYnbmDhq/XIDIJWrqGEe9VoQFAmVGIQoACgkQJWrqGEe9 VoTPOggAjxm9yHRE6kQh5QT1mLaU9VMchyl7+/rwxOc4TA3TLIcgACIjz0BDHTSu +VBB+XzL5pV2Nxn2ixepIyiNsACFgNKJ6+5toQomCEgQSKyNXUghE29G6HZ8Mydr +/o2GZy7nBoVtgnSjAto3tSwM9T5aE9rovJXp+sXjBkPdmUvH0vQs1EPqiHzlF1w PBuaQYecODLli6/9Mlt2Los5BRUNzdRaHXFUI9Cr7+u37ZIA0McAtrSbFeEX+A1T DRB2cPzosHK0IQ+093Rh9KNRPqhPB3KYaEf7/+VjuZxjzbjeeDT8Hhic9PJPcvSz 6CWta2A4g5nxUDArb2ZO9bTkw2es7Q== =nCq+ -----END PGP SIGNATURE----- Merge tag 'nand/for-6.7' into mtd/next The raw NAND subsystem has, as usual, seen a bit of cleanup being done this cycle, typically return values of platform_get_irq() and devm_kasprintf(), plus structure annotations for sanitizers. There is also a better ECC check in the Arasan driver. This comes with smaller misc changes. In the SPI-NAND world there is now support for Foresee F35SQA002G, Winbond W25N and XTX XT26 chips. Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
This commit is contained in:
commit
6d55d31e92
@ -481,7 +481,7 @@ static int anfc_read_page_hw_ecc(struct nand_chip *chip, u8 *buf,
|
||||
}
|
||||
|
||||
bf = nand_check_erased_ecc_chunk(raw_buf, chip->ecc.size,
|
||||
NULL, 0, NULL, 0,
|
||||
anand->hw_ecc, chip->ecc.bytes, NULL, 0,
|
||||
chip->ecc.strength);
|
||||
if (bf > 0) {
|
||||
mtd->ecc_stats.corrected += bf;
|
||||
|
@ -528,7 +528,7 @@ struct cdns_nand_chip {
|
||||
/* ECC strength index. */
|
||||
u8 corr_str_idx;
|
||||
|
||||
u8 cs[];
|
||||
u8 cs[] __counted_by(nsels);
|
||||
};
|
||||
|
||||
struct ecc_info {
|
||||
|
@ -619,6 +619,11 @@ static int ebu_nand_probe(struct platform_device *pdev)
|
||||
ebu_host->cs_num = cs;
|
||||
|
||||
resname = devm_kasprintf(dev, GFP_KERNEL, "nand_cs%d", cs);
|
||||
if (!resname) {
|
||||
ret = -ENOMEM;
|
||||
goto err_of_node_put;
|
||||
}
|
||||
|
||||
ebu_host->cs[cs].chipaddr = devm_platform_ioremap_resource_byname(pdev,
|
||||
resname);
|
||||
if (IS_ERR(ebu_host->cs[cs].chipaddr)) {
|
||||
@ -649,6 +654,11 @@ static int ebu_nand_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
resname = devm_kasprintf(dev, GFP_KERNEL, "addr_sel%d", cs);
|
||||
if (!resname) {
|
||||
ret = -ENOMEM;
|
||||
goto err_cleanup_dma;
|
||||
}
|
||||
|
||||
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, resname);
|
||||
if (!res) {
|
||||
ret = -EINVAL;
|
||||
|
@ -106,7 +106,6 @@ int nand_read_page_raw_notsupp(struct nand_chip *chip, u8 *buf,
|
||||
int oob_required, int page);
|
||||
int nand_write_page_raw_notsupp(struct nand_chip *chip, const u8 *buf,
|
||||
int oob_required, int page);
|
||||
int nand_exit_status_op(struct nand_chip *chip);
|
||||
int nand_read_param_page_op(struct nand_chip *chip, u8 page, void *buf,
|
||||
unsigned int len);
|
||||
void nand_decode_ext_id(struct nand_chip *chip);
|
||||
|
@ -1134,6 +1134,9 @@ static int meson_nfc_clk_init(struct meson_nfc *nfc)
|
||||
init.name = devm_kasprintf(nfc->dev,
|
||||
GFP_KERNEL, "%s#div",
|
||||
dev_name(nfc->dev));
|
||||
if (!init.name)
|
||||
return -ENOMEM;
|
||||
|
||||
init.ops = &clk_divider_ops;
|
||||
nfc_divider_parent_data[0].fw_name = "device";
|
||||
init.parent_data = nfc_divider_parent_data;
|
||||
|
@ -130,7 +130,7 @@ struct mtk_nfc_nand_chip {
|
||||
u32 spare_per_sector;
|
||||
|
||||
int nsels;
|
||||
u8 sels[];
|
||||
u8 sels[] __counted_by(nsels);
|
||||
/* nothing after this field */
|
||||
};
|
||||
|
||||
|
@ -42,7 +42,6 @@
|
||||
#include <linux/io.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_gpio.h>
|
||||
#include <linux/gpio/consumer.h>
|
||||
|
||||
#include "internals.h"
|
||||
|
@ -1881,8 +1881,8 @@ static int omap_nand_attach_chip(struct nand_chip *chip)
|
||||
|
||||
case NAND_OMAP_PREFETCH_IRQ:
|
||||
info->gpmc_irq_fifo = platform_get_irq(info->pdev, 0);
|
||||
if (info->gpmc_irq_fifo <= 0)
|
||||
return -ENODEV;
|
||||
if (info->gpmc_irq_fifo < 0)
|
||||
return info->gpmc_irq_fifo;
|
||||
err = devm_request_irq(dev, info->gpmc_irq_fifo,
|
||||
omap_nand_irq, IRQF_SHARED,
|
||||
"gpmc-nand-fifo", info);
|
||||
@ -1894,8 +1894,8 @@ static int omap_nand_attach_chip(struct nand_chip *chip)
|
||||
}
|
||||
|
||||
info->gpmc_irq_count = platform_get_irq(info->pdev, 1);
|
||||
if (info->gpmc_irq_count <= 0)
|
||||
return -ENODEV;
|
||||
if (info->gpmc_irq_count < 0)
|
||||
return info->gpmc_irq_count;
|
||||
err = devm_request_irq(dev, info->gpmc_irq_count,
|
||||
omap_nand_irq, IRQF_SHARED,
|
||||
"gpmc-nand-count", info);
|
||||
|
@ -158,8 +158,7 @@ struct rk_nfc_nand_chip {
|
||||
u32 timing;
|
||||
|
||||
u8 nsels;
|
||||
u8 sels[];
|
||||
/* Nothing after this field. */
|
||||
u8 sels[] __counted_by(nsels);
|
||||
};
|
||||
|
||||
struct rk_nfc {
|
||||
@ -1119,7 +1118,7 @@ static int rk_nfc_nand_chip_init(struct device *dev, struct rk_nfc *nfc,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
rknand = devm_kzalloc(dev, sizeof(*rknand) + nsels * sizeof(u8),
|
||||
rknand = devm_kzalloc(dev, struct_size(rknand, sels, nsels),
|
||||
GFP_KERNEL);
|
||||
if (!rknand)
|
||||
return -ENOMEM;
|
||||
|
@ -1215,6 +1215,7 @@ static void flctl_remove(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
static struct platform_driver flctl_driver = {
|
||||
.probe = flctl_probe,
|
||||
.remove_new = flctl_remove,
|
||||
.driver = {
|
||||
.name = "sh_flctl",
|
||||
@ -1222,7 +1223,7 @@ static struct platform_driver flctl_driver = {
|
||||
},
|
||||
};
|
||||
|
||||
module_platform_driver_probe(flctl_driver, flctl_probe);
|
||||
module_platform_driver(flctl_driver);
|
||||
|
||||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_AUTHOR("Yoshihiro Shimoda");
|
||||
|
@ -1197,6 +1197,10 @@ static int tegra_nand_probe(struct platform_device *pdev)
|
||||
init_completion(&ctrl->dma_complete);
|
||||
|
||||
ctrl->irq = platform_get_irq(pdev, 0);
|
||||
if (ctrl->irq < 0) {
|
||||
err = ctrl->irq;
|
||||
goto err_put_pm;
|
||||
}
|
||||
err = devm_request_irq(&pdev->dev, ctrl->irq, tegra_nand_irq, 0,
|
||||
dev_name(&pdev->dev), ctrl);
|
||||
if (err) {
|
||||
|
@ -6,7 +6,6 @@
|
||||
*/
|
||||
|
||||
#include <linux/mtd/rawnand.h>
|
||||
#include <linux/of_gpio.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
spinand-objs := core.o alliancememory.o ato.o esmt.o gigadevice.o macronix.o
|
||||
spinand-objs := core.o alliancememory.o ato.o esmt.o foresee.o gigadevice.o macronix.o
|
||||
spinand-objs += micron.o paragon.o toshiba.o winbond.o xtx.o
|
||||
obj-$(CONFIG_MTD_SPI_NAND) += spinand.o
|
||||
|
@ -940,6 +940,7 @@ static const struct spinand_manufacturer *spinand_manufacturers[] = {
|
||||
&alliancememory_spinand_manufacturer,
|
||||
&ato_spinand_manufacturer,
|
||||
&esmt_c8_spinand_manufacturer,
|
||||
&foresee_spinand_manufacturer,
|
||||
&gigadevice_spinand_manufacturer,
|
||||
¯onix_spinand_manufacturer,
|
||||
µn_spinand_manufacturer,
|
||||
|
95
drivers/mtd/nand/spi/foresee.c
Normal file
95
drivers/mtd/nand/spi/foresee.c
Normal file
@ -0,0 +1,95 @@
|
||||
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
/*
|
||||
* Copyright (c) 2023, SberDevices. All Rights Reserved.
|
||||
*
|
||||
* Author: Martin Kurbanov <mmkurbanov@salutedevices.com>
|
||||
*/
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/mtd/spinand.h>
|
||||
|
||||
#define SPINAND_MFR_FORESEE 0xCD
|
||||
|
||||
static SPINAND_OP_VARIANTS(read_cache_variants,
|
||||
SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0),
|
||||
SPINAND_PAGE_READ_FROM_CACHE_X2_OP(0, 1, NULL, 0),
|
||||
SPINAND_PAGE_READ_FROM_CACHE_OP(true, 0, 1, NULL, 0),
|
||||
SPINAND_PAGE_READ_FROM_CACHE_OP(false, 0, 1, NULL, 0));
|
||||
|
||||
static SPINAND_OP_VARIANTS(write_cache_variants,
|
||||
SPINAND_PROG_LOAD_X4(true, 0, NULL, 0),
|
||||
SPINAND_PROG_LOAD(true, 0, NULL, 0));
|
||||
|
||||
static SPINAND_OP_VARIANTS(update_cache_variants,
|
||||
SPINAND_PROG_LOAD_X4(false, 0, NULL, 0),
|
||||
SPINAND_PROG_LOAD(false, 0, NULL, 0));
|
||||
|
||||
static int f35sqa002g_ooblayout_ecc(struct mtd_info *mtd, int section,
|
||||
struct mtd_oob_region *region)
|
||||
{
|
||||
return -ERANGE;
|
||||
}
|
||||
|
||||
static int f35sqa002g_ooblayout_free(struct mtd_info *mtd, int section,
|
||||
struct mtd_oob_region *region)
|
||||
{
|
||||
if (section)
|
||||
return -ERANGE;
|
||||
|
||||
/* Reserve 2 bytes for the BBM. */
|
||||
region->offset = 2;
|
||||
region->length = 62;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct mtd_ooblayout_ops f35sqa002g_ooblayout = {
|
||||
.ecc = f35sqa002g_ooblayout_ecc,
|
||||
.free = f35sqa002g_ooblayout_free,
|
||||
};
|
||||
|
||||
static int f35sqa002g_ecc_get_status(struct spinand_device *spinand, u8 status)
|
||||
{
|
||||
struct nand_device *nand = spinand_to_nand(spinand);
|
||||
|
||||
switch (status & STATUS_ECC_MASK) {
|
||||
case STATUS_ECC_NO_BITFLIPS:
|
||||
return 0;
|
||||
|
||||
case STATUS_ECC_HAS_BITFLIPS:
|
||||
return nanddev_get_ecc_conf(nand)->strength;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
/* More than 1-bit error was detected in one or more sectors and
|
||||
* cannot be corrected.
|
||||
*/
|
||||
return -EBADMSG;
|
||||
}
|
||||
|
||||
static const struct spinand_info foresee_spinand_table[] = {
|
||||
SPINAND_INFO("F35SQA002G",
|
||||
SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x72, 0x72),
|
||||
NAND_MEMORG(1, 2048, 64, 64, 2048, 40, 1, 1, 1),
|
||||
NAND_ECCREQ(1, 512),
|
||||
SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
||||
&write_cache_variants,
|
||||
&update_cache_variants),
|
||||
SPINAND_HAS_QE_BIT,
|
||||
SPINAND_ECCINFO(&f35sqa002g_ooblayout,
|
||||
f35sqa002g_ecc_get_status)),
|
||||
};
|
||||
|
||||
static const struct spinand_manufacturer_ops foresee_spinand_manuf_ops = {
|
||||
};
|
||||
|
||||
const struct spinand_manufacturer foresee_spinand_manufacturer = {
|
||||
.id = SPINAND_MFR_FORESEE,
|
||||
.name = "FORESEE",
|
||||
.chips = foresee_spinand_table,
|
||||
.nchips = ARRAY_SIZE(foresee_spinand_table),
|
||||
.ops = &foresee_spinand_manuf_ops,
|
||||
};
|
@ -169,6 +169,51 @@ static const struct spinand_info winbond_spinand_table[] = {
|
||||
&update_cache_variants),
|
||||
0,
|
||||
SPINAND_ECCINFO(&w25n02kv_ooblayout, w25n02kv_ecc_get_status)),
|
||||
SPINAND_INFO("W25N01JW",
|
||||
SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xbc, 0x21),
|
||||
NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1),
|
||||
NAND_ECCREQ(4, 512),
|
||||
SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
||||
&write_cache_variants,
|
||||
&update_cache_variants),
|
||||
0,
|
||||
SPINAND_ECCINFO(&w25m02gv_ooblayout, w25n02kv_ecc_get_status)),
|
||||
SPINAND_INFO("W25N02JWZEIF",
|
||||
SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xbf, 0x22),
|
||||
NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 2, 1),
|
||||
NAND_ECCREQ(4, 512),
|
||||
SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
||||
&write_cache_variants,
|
||||
&update_cache_variants),
|
||||
0,
|
||||
SPINAND_ECCINFO(&w25n02kv_ooblayout, w25n02kv_ecc_get_status)),
|
||||
SPINAND_INFO("W25N512GW",
|
||||
SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xba, 0x20),
|
||||
NAND_MEMORG(1, 2048, 64, 64, 512, 10, 1, 1, 1),
|
||||
NAND_ECCREQ(4, 512),
|
||||
SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
||||
&write_cache_variants,
|
||||
&update_cache_variants),
|
||||
0,
|
||||
SPINAND_ECCINFO(&w25n02kv_ooblayout, w25n02kv_ecc_get_status)),
|
||||
SPINAND_INFO("W25N02KWZEIR",
|
||||
SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xba, 0x22),
|
||||
NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1),
|
||||
NAND_ECCREQ(8, 512),
|
||||
SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
||||
&write_cache_variants,
|
||||
&update_cache_variants),
|
||||
0,
|
||||
SPINAND_ECCINFO(&w25n02kv_ooblayout, w25n02kv_ecc_get_status)),
|
||||
SPINAND_INFO("W25N01GWZEIG",
|
||||
SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xba, 0x21),
|
||||
NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1),
|
||||
NAND_ECCREQ(4, 512),
|
||||
SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
||||
&write_cache_variants,
|
||||
&update_cache_variants),
|
||||
0,
|
||||
SPINAND_ECCINFO(&w25m02gv_ooblayout, w25n02kv_ecc_get_status)),
|
||||
};
|
||||
|
||||
static int winbond_spinand_init(struct spinand_device *spinand)
|
||||
|
@ -4,6 +4,7 @@
|
||||
* Felix Matouschek <felix@matouschek.org>
|
||||
*/
|
||||
|
||||
#include <linux/bitfield.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/mtd/spinand.h>
|
||||
@ -15,6 +16,12 @@
|
||||
#define XT26G0XA_STATUS_ECC_8_CORRECTED (3 << 4)
|
||||
#define XT26G0XA_STATUS_ECC_UNCOR_ERROR (2 << 4)
|
||||
|
||||
#define XT26XXXD_STATUS_ECC3_ECC2_MASK GENMASK(7, 6)
|
||||
#define XT26XXXD_STATUS_ECC_NO_DETECTED (0)
|
||||
#define XT26XXXD_STATUS_ECC_1_7_CORRECTED (1)
|
||||
#define XT26XXXD_STATUS_ECC_8_CORRECTED (3)
|
||||
#define XT26XXXD_STATUS_ECC_UNCOR_ERROR (2)
|
||||
|
||||
static SPINAND_OP_VARIANTS(read_cache_variants,
|
||||
SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 1, NULL, 0),
|
||||
SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0),
|
||||
@ -84,6 +91,53 @@ static int xt26g0xa_ecc_get_status(struct spinand_device *spinand,
|
||||
return status >> 2;
|
||||
}
|
||||
|
||||
static int xt26xxxd_ooblayout_ecc(struct mtd_info *mtd, int section,
|
||||
struct mtd_oob_region *region)
|
||||
{
|
||||
if (section)
|
||||
return -ERANGE;
|
||||
|
||||
region->offset = mtd->oobsize / 2;
|
||||
region->length = mtd->oobsize / 2;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int xt26xxxd_ooblayout_free(struct mtd_info *mtd, int section,
|
||||
struct mtd_oob_region *region)
|
||||
{
|
||||
if (section)
|
||||
return -ERANGE;
|
||||
|
||||
region->offset = 2;
|
||||
region->length = mtd->oobsize / 2 - 2;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct mtd_ooblayout_ops xt26xxxd_ooblayout = {
|
||||
.ecc = xt26xxxd_ooblayout_ecc,
|
||||
.free = xt26xxxd_ooblayout_free,
|
||||
};
|
||||
|
||||
static int xt26xxxd_ecc_get_status(struct spinand_device *spinand,
|
||||
u8 status)
|
||||
{
|
||||
switch (FIELD_GET(STATUS_ECC_MASK, status)) {
|
||||
case XT26XXXD_STATUS_ECC_NO_DETECTED:
|
||||
return 0;
|
||||
case XT26XXXD_STATUS_ECC_UNCOR_ERROR:
|
||||
return -EBADMSG;
|
||||
case XT26XXXD_STATUS_ECC_1_7_CORRECTED:
|
||||
return 4 + FIELD_GET(XT26XXXD_STATUS_ECC3_ECC2_MASK, status);
|
||||
case XT26XXXD_STATUS_ECC_8_CORRECTED:
|
||||
return 8;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
static const struct spinand_info xtx_spinand_table[] = {
|
||||
SPINAND_INFO("XT26G01A",
|
||||
SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0xE1),
|
||||
@ -115,6 +169,86 @@ static const struct spinand_info xtx_spinand_table[] = {
|
||||
SPINAND_HAS_QE_BIT,
|
||||
SPINAND_ECCINFO(&xt26g0xa_ooblayout,
|
||||
xt26g0xa_ecc_get_status)),
|
||||
SPINAND_INFO("XT26G01D",
|
||||
SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x31),
|
||||
NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
|
||||
NAND_ECCREQ(8, 512),
|
||||
SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
||||
&write_cache_variants,
|
||||
&update_cache_variants),
|
||||
0,
|
||||
SPINAND_ECCINFO(&xt26xxxd_ooblayout,
|
||||
xt26xxxd_ecc_get_status)),
|
||||
SPINAND_INFO("XT26G11D",
|
||||
SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x34),
|
||||
NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
|
||||
NAND_ECCREQ(8, 512),
|
||||
SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
||||
&write_cache_variants,
|
||||
&update_cache_variants),
|
||||
0,
|
||||
SPINAND_ECCINFO(&xt26xxxd_ooblayout,
|
||||
xt26xxxd_ecc_get_status)),
|
||||
SPINAND_INFO("XT26Q01D",
|
||||
SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x51),
|
||||
NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
|
||||
NAND_ECCREQ(8, 512),
|
||||
SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
||||
&write_cache_variants,
|
||||
&update_cache_variants),
|
||||
0,
|
||||
SPINAND_ECCINFO(&xt26xxxd_ooblayout,
|
||||
xt26xxxd_ecc_get_status)),
|
||||
SPINAND_INFO("XT26G02D",
|
||||
SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x32),
|
||||
NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1),
|
||||
NAND_ECCREQ(8, 512),
|
||||
SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
||||
&write_cache_variants,
|
||||
&update_cache_variants),
|
||||
0,
|
||||
SPINAND_ECCINFO(&xt26xxxd_ooblayout,
|
||||
xt26xxxd_ecc_get_status)),
|
||||
SPINAND_INFO("XT26G12D",
|
||||
SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x35),
|
||||
NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1),
|
||||
NAND_ECCREQ(8, 512),
|
||||
SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
||||
&write_cache_variants,
|
||||
&update_cache_variants),
|
||||
0,
|
||||
SPINAND_ECCINFO(&xt26xxxd_ooblayout,
|
||||
xt26xxxd_ecc_get_status)),
|
||||
SPINAND_INFO("XT26Q02D",
|
||||
SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x52),
|
||||
NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1),
|
||||
NAND_ECCREQ(8, 512),
|
||||
SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
||||
&write_cache_variants,
|
||||
&update_cache_variants),
|
||||
0,
|
||||
SPINAND_ECCINFO(&xt26xxxd_ooblayout,
|
||||
xt26xxxd_ecc_get_status)),
|
||||
SPINAND_INFO("XT26G04D",
|
||||
SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x33),
|
||||
NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 1, 1, 1),
|
||||
NAND_ECCREQ(8, 512),
|
||||
SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
||||
&write_cache_variants,
|
||||
&update_cache_variants),
|
||||
0,
|
||||
SPINAND_ECCINFO(&xt26xxxd_ooblayout,
|
||||
xt26xxxd_ecc_get_status)),
|
||||
SPINAND_INFO("XT26Q04D",
|
||||
SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x53),
|
||||
NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 1, 1, 1),
|
||||
NAND_ECCREQ(8, 512),
|
||||
SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
||||
&write_cache_variants,
|
||||
&update_cache_variants),
|
||||
0,
|
||||
SPINAND_ECCINFO(&xt26xxxd_ooblayout,
|
||||
xt26xxxd_ecc_get_status)),
|
||||
};
|
||||
|
||||
static const struct spinand_manufacturer_ops xtx_spinand_manuf_ops = {
|
||||
|
@ -263,6 +263,7 @@ struct spinand_manufacturer {
|
||||
extern const struct spinand_manufacturer alliancememory_spinand_manufacturer;
|
||||
extern const struct spinand_manufacturer ato_spinand_manufacturer;
|
||||
extern const struct spinand_manufacturer esmt_c8_spinand_manufacturer;
|
||||
extern const struct spinand_manufacturer foresee_spinand_manufacturer;
|
||||
extern const struct spinand_manufacturer gigadevice_spinand_manufacturer;
|
||||
extern const struct spinand_manufacturer macronix_spinand_manufacturer;
|
||||
extern const struct spinand_manufacturer micron_spinand_manufacturer;
|
||||
|
Loading…
Reference in New Issue
Block a user