bac8a20fa3
* Use refcount to prevent corruption * Call external _get and _put in right order * Fix use-after-free in mtd release * Explicitly include correct DT includes * Clean refcounting with MTD_PARTITIONED_MASTER * mtdblock: make warning messages ratelimited * dt-bindings: Add SEAMA partition bindings MTD device driver changes: * spear_smi: Use helper function devm_clk_get_enabled() * maps: fix -Wvoid-pointer-to-enum-cast warning * docg3: Remove unnecessary (void*) conversions * physmap-core, spear_smi, st_spi_fsm, lpddr2_nvm, lantiq-flash, plat-ram: - Use devm_platform_get_and_ioremap_resource() Raw NAND core changes: * Fix -Wvoid-pointer-to-enum-cast warning * Export 'nand_exit_status_op()' * dt-bindings: Fix nand-controller.yaml license Raw NAND controller driver changes: * Omap, Omap2, Samsung, Atmel, fsl_upm, lpc32xx_slc, lpc32xx_mlc, STM32_FMC2, sh_ftlctl, MXC, Sunxi: - Use devm_platform_get_and_ioremap_resource() * Orion, vf610_nfc, Sunxi, STM32_FMC2, MTK, mpc5121, lpc32xx_slc, Intel, FSMC, Arasan: - Use helper function devm_clk_get_optional_enabled() * Brcmnand: - Use devm_platform_ioremap_resource_byname() - Propagate init error -EPROBE_DEFER up - Propagate error and simplify ternary operators - Fix mtd oobsize - Fix potential out-of-bounds access in oob write - Fix crash during the panic_write - Fix potential false time out warning - Fix ECC level field setting for v7.2 controller * fsmc: Handle clk prepare error in fsmc_nand_resume() * Marvell: Add support for AC5 SoC * Meson: - Support for 512B ECC step size - Fix build error - Use NAND core API to check status - dt-bindings: * Make ECC properties dependent * Support for 512B ECC step size * Drop unneeded quotes * Oxnas: Remove driver and bindings * Qcom: - Conversion to ->exec_op() - Removal of the legacy interface - Two full series of improvements/misc fixes * Use the BIT() macro * Use u8 instead of uint8_t * Fix alignment with open parenthesis * Fix the spacing * Fix wrong indentation * Fix a typo * Early structure initialization * Fix address parsing within ->exec_op() * Remove superfluous initialization of "ret" * Rename variables in qcom_op_cmd_mapping() * Handle unsupported opcode in qcom_op_cmd_mapping() * Fix the opcode check in qcom_check_op() * Use EOPNOTSUPP instead of ENOTSUPP * Wrap qcom_nand_exec_op() to 80 columns * Unmap sg_list and free desc within submic_descs() * Simplify the call to nand_prog_page_end_op() * Do not override the error no of submit_descs() * Sort includes alphabetically * Clear buf_count and buf_start in raw read * Add read/read_start ops in exec_op path * vf610_nfc: Do not check 0 for platform_get_irq() SPI NAND manufacturer driver changes: * gigadevice: Add support for GD5F1GQ{4,5}RExxH * esmt: Add support for F50D2G41KA * toshiba: Add support for T{C,H}58NYG{0,2}S3HBAI4 and TH58NYG3S0HBAI6 SPI NOR core changes: * fix assumption on enabling quad mode in spi_nor_write_16bit_sr_and_check() * avoid setting SRWD bit in SR if WP# signal not connected as it will configure the SR permanently as read only. Add "no-wp" dt property. * clarify the need for spi-nor compatibles in dt-bindings SPI NOR manufacturer driver changes: * Spansion: - Add support for S28HS02GT - Switch methods to use vreg_offset from SFDP instead of hardcoding the register value * Microchip/SST: - Add support for sst26vf032b flash * Winbond: - Correct flags for Winbond w25q128 * NXP spifi: - Use helper function devm_clk_get_enabled() -----BEGIN PGP SIGNATURE----- iQEzBAABCgAdFiEE9HuaYnbmDhq/XIDIJWrqGEe9VoQFAmTstY0ACgkQJWrqGEe9 VoRpeggAmiUPLVEJRosvtOAaT+en2YTDiVZrRmQ8hjekjRc4FfY6C7DPNWNua3zx SaVqLEF7ScjnKH1YYwXN3XG3j4+1NPRV/VmR89yD6NVOcLs8BEJk/Ooc6LQrHAAf E87jVafbPLWq8MkcVcnHbdijgHVh2onMbUQtkqjFSn6WAolSmZFJotocfKT12uuY K9Hn5TLjRiH5e7O1rQnBcATMXjHIA1o0G1RCklm+T1MojNXIO1KN8yMYRjUoGbEJ afFdwczNiTFgL4MJ3qL6NhqhSGC6V6QsUcsYvEjmComepAuZBP2wGnuQMHOxKqYV Tl93LW8FOdyWHdCSgJdYkctoRPU6KQ== =uMXQ -----END PGP SIGNATURE----- Merge tag 'mtd/for-6.6' of git://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux Pull MTD updates from Miquel Raynal: "Core MTD changes: - Use refcount to prevent corruption - Call external _get and _put in right order - Fix use-after-free in mtd release - Explicitly include correct DT includes - Clean refcounting with MTD_PARTITIONED_MASTER - mtdblock: make warning messages ratelimited - dt-bindings: Add SEAMA partition bindings Device driver changes: - Use devm helper functions - Fix questionable cast, remove pointless ones. - error handling fixes - add support for new chip versions - update DT bindings - misc cleanups - fix typos, whitespace, indentation" * tag 'mtd/for-6.6' of git://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux: (105 commits) dt-bindings: mtd: amlogic,meson-nand: drop unneeded quotes mtd: spear_smi: Use helper function devm_clk_get_enabled() mtd: rawnand: orion: Use helper function devm_clk_get_optional_enabled() mtd: rawnand: vf610_nfc: Use helper function devm_clk_get_enabled() mtd: rawnand: sunxi: Use helper function devm_clk_get_enabled() mtd: rawnand: stm32_fmc2: Use helper function devm_clk_get_enabled() mtd: rawnand: mtk: Use helper function devm_clk_get_enabled() mtd: rawnand: mpc5121: Use helper function devm_clk_get_enabled() mtd: rawnand: lpc32xx_slc: Use helper function devm_clk_get_enabled() mtd: rawnand: intel: Use helper function devm_clk_get_enabled() mtd: rawnand: fsmc: Use helper function devm_clk_get_enabled() mtd: rawnand: arasan: Use helper function devm_clk_get_enabled() mtd: rawnand: qcom: Add read/read_start ops in exec_op path mtd: rawnand: qcom: Clear buf_count and buf_start in raw read mtd: maps: fix -Wvoid-pointer-to-enum-cast warning mtd: rawnand: fix -Wvoid-pointer-to-enum-cast warning mtd: rawnand: fsmc: handle clk prepare error in fsmc_nand_resume() mtd: rawnand: Propagate error and simplify ternary operators for brcmstb_nand_wait_for_completion() mtd: rawnand: qcom: Sort includes alphabetically mtd: rawnand: qcom: Do not override the error no of submit_descs() ...
313 lines
11 KiB
C
313 lines
11 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/*
|
|
* Copyright (c) 2018 exceet electronics GmbH
|
|
* Copyright (c) 2018 Kontron Electronics GmbH
|
|
*
|
|
* Author: Frieder Schrempf <frieder.schrempf@kontron.de>
|
|
*/
|
|
|
|
#include <linux/device.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/mtd/spinand.h>
|
|
|
|
/* Kioxia is new name of Toshiba memory. */
|
|
#define SPINAND_MFR_TOSHIBA 0x98
|
|
#define TOSH_STATUS_ECC_HAS_BITFLIPS_T (3 << 4)
|
|
|
|
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_x4_variants,
|
|
SPINAND_PROG_LOAD_X4(true, 0, NULL, 0),
|
|
SPINAND_PROG_LOAD(true, 0, NULL, 0));
|
|
|
|
static SPINAND_OP_VARIANTS(update_cache_x4_variants,
|
|
SPINAND_PROG_LOAD_X4(false, 0, NULL, 0),
|
|
SPINAND_PROG_LOAD(false, 0, NULL, 0));
|
|
|
|
/*
|
|
* Backward compatibility for 1st generation Serial NAND devices
|
|
* which don't support Quad Program Load operation.
|
|
*/
|
|
static SPINAND_OP_VARIANTS(write_cache_variants,
|
|
SPINAND_PROG_LOAD(true, 0, NULL, 0));
|
|
|
|
static SPINAND_OP_VARIANTS(update_cache_variants,
|
|
SPINAND_PROG_LOAD(false, 0, NULL, 0));
|
|
|
|
static int tx58cxgxsxraix_ooblayout_ecc(struct mtd_info *mtd, int section,
|
|
struct mtd_oob_region *region)
|
|
{
|
|
if (section > 0)
|
|
return -ERANGE;
|
|
|
|
region->offset = mtd->oobsize / 2;
|
|
region->length = mtd->oobsize / 2;
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int tx58cxgxsxraix_ooblayout_free(struct mtd_info *mtd, int section,
|
|
struct mtd_oob_region *region)
|
|
{
|
|
if (section > 0)
|
|
return -ERANGE;
|
|
|
|
/* 2 bytes reserved for BBM */
|
|
region->offset = 2;
|
|
region->length = (mtd->oobsize / 2) - 2;
|
|
|
|
return 0;
|
|
}
|
|
|
|
static const struct mtd_ooblayout_ops tx58cxgxsxraix_ooblayout = {
|
|
.ecc = tx58cxgxsxraix_ooblayout_ecc,
|
|
.free = tx58cxgxsxraix_ooblayout_free,
|
|
};
|
|
|
|
static int tx58cxgxsxraix_ecc_get_status(struct spinand_device *spinand,
|
|
u8 status)
|
|
{
|
|
struct nand_device *nand = spinand_to_nand(spinand);
|
|
u8 mbf = 0;
|
|
struct spi_mem_op op = SPINAND_GET_FEATURE_OP(0x30, spinand->scratchbuf);
|
|
|
|
switch (status & STATUS_ECC_MASK) {
|
|
case STATUS_ECC_NO_BITFLIPS:
|
|
return 0;
|
|
|
|
case STATUS_ECC_UNCOR_ERROR:
|
|
return -EBADMSG;
|
|
|
|
case STATUS_ECC_HAS_BITFLIPS:
|
|
case TOSH_STATUS_ECC_HAS_BITFLIPS_T:
|
|
/*
|
|
* Let's try to retrieve the real maximum number of bitflips
|
|
* in order to avoid forcing the wear-leveling layer to move
|
|
* data around if it's not necessary.
|
|
*/
|
|
if (spi_mem_exec_op(spinand->spimem, &op))
|
|
return nanddev_get_ecc_conf(nand)->strength;
|
|
|
|
mbf = *(spinand->scratchbuf) >> 4;
|
|
|
|
if (WARN_ON(mbf > nanddev_get_ecc_conf(nand)->strength || !mbf))
|
|
return nanddev_get_ecc_conf(nand)->strength;
|
|
|
|
return mbf;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return -EINVAL;
|
|
}
|
|
|
|
static const struct spinand_info toshiba_spinand_table[] = {
|
|
/* 3.3V 1Gb (1st generation) */
|
|
SPINAND_INFO("TC58CVG0S3HRAIG",
|
|
SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xC2),
|
|
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(&tx58cxgxsxraix_ooblayout,
|
|
tx58cxgxsxraix_ecc_get_status)),
|
|
/* 3.3V 2Gb (1st generation) */
|
|
SPINAND_INFO("TC58CVG1S3HRAIG",
|
|
SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xCB),
|
|
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(&tx58cxgxsxraix_ooblayout,
|
|
tx58cxgxsxraix_ecc_get_status)),
|
|
/* 3.3V 4Gb (1st generation) */
|
|
SPINAND_INFO("TC58CVG2S0HRAIG",
|
|
SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xCD),
|
|
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(&tx58cxgxsxraix_ooblayout,
|
|
tx58cxgxsxraix_ecc_get_status)),
|
|
/* 1.8V 1Gb (1st generation) */
|
|
SPINAND_INFO("TC58CYG0S3HRAIG",
|
|
SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xB2),
|
|
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(&tx58cxgxsxraix_ooblayout,
|
|
tx58cxgxsxraix_ecc_get_status)),
|
|
/* 1.8V 2Gb (1st generation) */
|
|
SPINAND_INFO("TC58CYG1S3HRAIG",
|
|
SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xBB),
|
|
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(&tx58cxgxsxraix_ooblayout,
|
|
tx58cxgxsxraix_ecc_get_status)),
|
|
/* 1.8V 4Gb (1st generation) */
|
|
SPINAND_INFO("TC58CYG2S0HRAIG",
|
|
SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xBD),
|
|
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(&tx58cxgxsxraix_ooblayout,
|
|
tx58cxgxsxraix_ecc_get_status)),
|
|
|
|
/*
|
|
* 2nd generation serial nand has HOLD_D which is equivalent to
|
|
* QE_BIT.
|
|
*/
|
|
/* 3.3V 1Gb (2nd generation) */
|
|
SPINAND_INFO("TC58CVG0S3HRAIJ",
|
|
SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xE2),
|
|
NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
|
|
NAND_ECCREQ(8, 512),
|
|
SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
|
&write_cache_x4_variants,
|
|
&update_cache_x4_variants),
|
|
SPINAND_HAS_QE_BIT,
|
|
SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
|
|
tx58cxgxsxraix_ecc_get_status)),
|
|
/* 3.3V 2Gb (2nd generation) */
|
|
SPINAND_INFO("TC58CVG1S3HRAIJ",
|
|
SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xEB),
|
|
NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1),
|
|
NAND_ECCREQ(8, 512),
|
|
SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
|
&write_cache_x4_variants,
|
|
&update_cache_x4_variants),
|
|
SPINAND_HAS_QE_BIT,
|
|
SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
|
|
tx58cxgxsxraix_ecc_get_status)),
|
|
/* 3.3V 4Gb (2nd generation) */
|
|
SPINAND_INFO("TC58CVG2S0HRAIJ",
|
|
SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xED),
|
|
NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 1, 1, 1),
|
|
NAND_ECCREQ(8, 512),
|
|
SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
|
&write_cache_x4_variants,
|
|
&update_cache_x4_variants),
|
|
SPINAND_HAS_QE_BIT,
|
|
SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
|
|
tx58cxgxsxraix_ecc_get_status)),
|
|
/* 3.3V 8Gb (2nd generation) */
|
|
SPINAND_INFO("TH58CVG3S0HRAIJ",
|
|
SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xE4),
|
|
NAND_MEMORG(1, 4096, 256, 64, 4096, 80, 1, 1, 1),
|
|
NAND_ECCREQ(8, 512),
|
|
SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
|
&write_cache_x4_variants,
|
|
&update_cache_x4_variants),
|
|
SPINAND_HAS_QE_BIT,
|
|
SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
|
|
tx58cxgxsxraix_ecc_get_status)),
|
|
/* 1.8V 1Gb (2nd generation) */
|
|
SPINAND_INFO("TC58CYG0S3HRAIJ",
|
|
SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xD2),
|
|
NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
|
|
NAND_ECCREQ(8, 512),
|
|
SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
|
&write_cache_x4_variants,
|
|
&update_cache_x4_variants),
|
|
SPINAND_HAS_QE_BIT,
|
|
SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
|
|
tx58cxgxsxraix_ecc_get_status)),
|
|
/* 1.8V 2Gb (2nd generation) */
|
|
SPINAND_INFO("TC58CYG1S3HRAIJ",
|
|
SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xDB),
|
|
NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1),
|
|
NAND_ECCREQ(8, 512),
|
|
SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
|
&write_cache_x4_variants,
|
|
&update_cache_x4_variants),
|
|
SPINAND_HAS_QE_BIT,
|
|
SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
|
|
tx58cxgxsxraix_ecc_get_status)),
|
|
/* 1.8V 4Gb (2nd generation) */
|
|
SPINAND_INFO("TC58CYG2S0HRAIJ",
|
|
SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xDD),
|
|
NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 1, 1, 1),
|
|
NAND_ECCREQ(8, 512),
|
|
SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
|
&write_cache_x4_variants,
|
|
&update_cache_x4_variants),
|
|
SPINAND_HAS_QE_BIT,
|
|
SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
|
|
tx58cxgxsxraix_ecc_get_status)),
|
|
/* 1.8V 8Gb (2nd generation) */
|
|
SPINAND_INFO("TH58CYG3S0HRAIJ",
|
|
SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xD4),
|
|
NAND_MEMORG(1, 4096, 256, 64, 4096, 80, 1, 1, 1),
|
|
NAND_ECCREQ(8, 512),
|
|
SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
|
&write_cache_x4_variants,
|
|
&update_cache_x4_variants),
|
|
SPINAND_HAS_QE_BIT,
|
|
SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
|
|
tx58cxgxsxraix_ecc_get_status)),
|
|
/* 1.8V 1Gb (1st generation) */
|
|
SPINAND_INFO("TC58NYG0S3HBAI4",
|
|
SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xA1),
|
|
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(&tx58cxgxsxraix_ooblayout,
|
|
tx58cxgxsxraix_ecc_get_status)),
|
|
/* 1.8V 4Gb (1st generation) */
|
|
SPINAND_INFO("TH58NYG2S3HBAI4",
|
|
SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xAC),
|
|
NAND_MEMORG(1, 2048, 128, 64, 4096, 80, 1, 2, 1),
|
|
NAND_ECCREQ(8, 512),
|
|
SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
|
&write_cache_x4_variants,
|
|
&update_cache_x4_variants),
|
|
SPINAND_HAS_QE_BIT,
|
|
SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
|
|
tx58cxgxsxraix_ecc_get_status)),
|
|
/* 1.8V 8Gb (1st generation) */
|
|
SPINAND_INFO("TH58NYG3S0HBAI6",
|
|
SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xA3),
|
|
NAND_MEMORG(1, 4096, 256, 64, 4096, 80, 1, 1, 1),
|
|
NAND_ECCREQ(8, 512),
|
|
SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
|
&write_cache_x4_variants,
|
|
&update_cache_x4_variants),
|
|
SPINAND_HAS_QE_BIT,
|
|
SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
|
|
tx58cxgxsxraix_ecc_get_status)),
|
|
};
|
|
|
|
static const struct spinand_manufacturer_ops toshiba_spinand_manuf_ops = {
|
|
};
|
|
|
|
const struct spinand_manufacturer toshiba_spinand_manufacturer = {
|
|
.id = SPINAND_MFR_TOSHIBA,
|
|
.name = "Toshiba",
|
|
.chips = toshiba_spinand_table,
|
|
.nchips = ARRAY_SIZE(toshiba_spinand_table),
|
|
.ops = &toshiba_spinand_manuf_ops,
|
|
};
|