mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-16 05:26:07 +00:00
Merge branch 'nand/next' of git://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux.git
This commit is contained in:
commit
a7acb58ac1
@ -1,94 +0,0 @@
|
||||
Device tree bindings for Texas instruments Davinci/Keystone NAND controller
|
||||
|
||||
This file provides information, what the device node for the davinci/keystone
|
||||
NAND interface contains.
|
||||
|
||||
Documentation:
|
||||
Davinci DM646x - https://www.ti.com/lit/ug/sprueq7c/sprueq7c.pdf
|
||||
Kestone - https://www.ti.com/lit/ug/sprugz3a/sprugz3a.pdf
|
||||
|
||||
Required properties:
|
||||
|
||||
- compatible: "ti,davinci-nand"
|
||||
"ti,keystone-nand"
|
||||
|
||||
- reg: Contains 2 offset/length values:
|
||||
- offset and length for the access window.
|
||||
- offset and length for accessing the AEMIF
|
||||
control registers.
|
||||
|
||||
- ti,davinci-chipselect: number of chipselect. Indicates on the
|
||||
davinci_nand driver which chipselect is used
|
||||
for accessing the nand.
|
||||
Can be in the range [0-3].
|
||||
|
||||
Recommended properties :
|
||||
|
||||
- ti,davinci-mask-ale: mask for ALE. Needed for executing address
|
||||
phase. These offset will be added to the base
|
||||
address for the chip select space the NAND Flash
|
||||
device is connected to.
|
||||
If not set equal to 0x08.
|
||||
|
||||
- ti,davinci-mask-cle: mask for CLE. Needed for executing command
|
||||
phase. These offset will be added to the base
|
||||
address for the chip select space the NAND Flash
|
||||
device is connected to.
|
||||
If not set equal to 0x10.
|
||||
|
||||
- ti,davinci-mask-chipsel: mask for chipselect address. Needed to mask
|
||||
addresses for given chipselect.
|
||||
|
||||
- nand-ecc-mode: operation mode of the NAND ecc mode. ECC mode
|
||||
valid values for davinci driver:
|
||||
- "none"
|
||||
- "soft"
|
||||
- "hw"
|
||||
|
||||
- ti,davinci-ecc-bits: used ECC bits, currently supported 1 or 4.
|
||||
|
||||
- nand-bus-width: buswidth 8 or 16. If not present 8.
|
||||
|
||||
- nand-on-flash-bbt: use flash based bad block table support. OOB
|
||||
identifier is saved in OOB area. If not present
|
||||
false.
|
||||
|
||||
Deprecated properties:
|
||||
|
||||
- ti,davinci-ecc-mode: operation mode of the NAND ecc mode. ECC mode
|
||||
valid values for davinci driver:
|
||||
- "none"
|
||||
- "soft"
|
||||
- "hw"
|
||||
|
||||
- ti,davinci-nand-buswidth: buswidth 8 or 16. If not present 8.
|
||||
|
||||
- ti,davinci-nand-use-bbt: use flash based bad block table support. OOB
|
||||
identifier is saved in OOB area. If not present
|
||||
false.
|
||||
|
||||
Nand device bindings may contain additional sub-nodes describing partitions of
|
||||
the address space. See mtd.yaml for more detail. The NAND Flash timing
|
||||
values must be programmed in the chip select’s node of AEMIF
|
||||
memory-controller (see Documentation/devicetree/bindings/memory-controllers/
|
||||
davinci-aemif.txt).
|
||||
|
||||
Example(da850 EVM ):
|
||||
|
||||
nand_cs3@62000000 {
|
||||
compatible = "ti,davinci-nand";
|
||||
reg = <0x62000000 0x807ff
|
||||
0x68000000 0x8000>;
|
||||
ti,davinci-chipselect = <1>;
|
||||
ti,davinci-mask-ale = <0>;
|
||||
ti,davinci-mask-cle = <0>;
|
||||
ti,davinci-mask-chipsel = <0>;
|
||||
nand-ecc-mode = "hw";
|
||||
ti,davinci-ecc-bits = <4>;
|
||||
nand-on-flash-bbt;
|
||||
|
||||
partition@180000 {
|
||||
label = "ubifs";
|
||||
reg = <0x180000 0x7e80000>;
|
||||
};
|
||||
};
|
124
Documentation/devicetree/bindings/mtd/ti,davinci-nand.yaml
Normal file
124
Documentation/devicetree/bindings/mtd/ti,davinci-nand.yaml
Normal file
@ -0,0 +1,124 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/mtd/ti,davinci-nand.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: TI DaVinci NAND controller
|
||||
|
||||
maintainers:
|
||||
- Marcus Folkesson <marcus.folkesson@gmail.com>
|
||||
|
||||
allOf:
|
||||
- $ref: nand-controller.yaml
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- ti,davinci-nand
|
||||
- ti,keystone-nand
|
||||
|
||||
reg:
|
||||
items:
|
||||
- description: Access window.
|
||||
- description: AEMIF control registers.
|
||||
|
||||
partitions:
|
||||
$ref: /schemas/mtd/partitions/partitions.yaml
|
||||
|
||||
ti,davinci-chipselect:
|
||||
description:
|
||||
Number of chipselect. Indicate on the davinci_nand driver which
|
||||
chipselect is used for accessing the nand.
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
enum: [0, 1, 2, 3]
|
||||
|
||||
ti,davinci-mask-ale:
|
||||
description:
|
||||
Mask for ALE. Needed for executing address phase. These offset will be
|
||||
added to the base address for the chip select space the NAND Flash
|
||||
device is connected to.
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
default: 0x08
|
||||
|
||||
ti,davinci-mask-cle:
|
||||
description:
|
||||
Mask for CLE. Needed for executing command phase. These offset will be
|
||||
added to the base address for the chip select space the NAND Flash device
|
||||
is connected to.
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
default: 0x10
|
||||
|
||||
ti,davinci-mask-chipsel:
|
||||
description:
|
||||
Mask for chipselect address. Needed to mask addresses for given
|
||||
chipselect.
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
default: 0
|
||||
|
||||
ti,davinci-ecc-bits:
|
||||
description: Used ECC bits.
|
||||
enum: [1, 4]
|
||||
|
||||
ti,davinci-ecc-mode:
|
||||
description: Operation mode of the NAND ECC mode.
|
||||
$ref: /schemas/types.yaml#/definitions/string
|
||||
enum: [none, soft, hw, on-die]
|
||||
deprecated: true
|
||||
|
||||
ti,davinci-nand-buswidth:
|
||||
description: Bus width to the NAND chip.
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
enum: [8, 16]
|
||||
default: 8
|
||||
deprecated: true
|
||||
|
||||
ti,davinci-nand-use-bbt:
|
||||
type: boolean
|
||||
description:
|
||||
Use flash based bad block table support. OOB identifier is saved in OOB
|
||||
area.
|
||||
deprecated: true
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- ti,davinci-chipselect
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
bus {
|
||||
#address-cells = <2>;
|
||||
#size-cells = <1>;
|
||||
|
||||
nand-controller@2000000,0 {
|
||||
compatible = "ti,davinci-nand";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <0 0x02000000 0x02000000>,
|
||||
<1 0x00000000 0x00008000>;
|
||||
|
||||
ti,davinci-chipselect = <1>;
|
||||
ti,davinci-mask-ale = <0>;
|
||||
ti,davinci-mask-cle = <0>;
|
||||
ti,davinci-mask-chipsel = <0>;
|
||||
|
||||
ti,davinci-nand-buswidth = <16>;
|
||||
ti,davinci-ecc-mode = "hw";
|
||||
ti,davinci-ecc-bits = <4>;
|
||||
ti,davinci-nand-use-bbt;
|
||||
|
||||
partitions {
|
||||
compatible = "fixed-partitions";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
partition@0 {
|
||||
label = "u-boot env";
|
||||
reg = <0 0x020000>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
@ -2923,6 +2923,7 @@ static int do_otp_read(struct mtd_info *mtd, loff_t from, size_t len,
|
||||
ret = ONENAND_IS_4KB_PAGE(this) ?
|
||||
onenand_mlc_read_ops_nolock(mtd, from, &ops) :
|
||||
onenand_read_ops_nolock(mtd, from, &ops);
|
||||
*retlen = ops.retlen;
|
||||
|
||||
/* Exit OTP access mode */
|
||||
this->command(mtd, ONENAND_CMD_RESET, 0, 0);
|
||||
|
@ -66,6 +66,7 @@ struct davinci_nand_pdata {
|
||||
|
||||
/* none == NAND_ECC_ENGINE_TYPE_NONE (strongly *not* advised!!)
|
||||
* soft == NAND_ECC_ENGINE_TYPE_SOFT
|
||||
* on-die == NAND_ECC_ENGINE_TYPE_ON_DIE
|
||||
* else == NAND_ECC_ENGINE_TYPE_ON_HOST, according to ecc_bits
|
||||
*
|
||||
* All DaVinci-family chips support 1-bit hardware ECC.
|
||||
@ -525,6 +526,8 @@ nand_davinci_get_pdata(struct platform_device *pdev)
|
||||
pdata->engine_type = NAND_ECC_ENGINE_TYPE_SOFT;
|
||||
if (!strncmp("hw", mode, 2))
|
||||
pdata->engine_type = NAND_ECC_ENGINE_TYPE_ON_HOST;
|
||||
if (!strncmp("on-die", mode, 6))
|
||||
pdata->engine_type = NAND_ECC_ENGINE_TYPE_ON_DIE;
|
||||
}
|
||||
if (!device_property_read_u32(&pdev->dev,
|
||||
"ti,davinci-ecc-bits", &prop))
|
||||
@ -580,6 +583,7 @@ static int davinci_nand_attach_chip(struct nand_chip *chip)
|
||||
|
||||
switch (chip->ecc.engine_type) {
|
||||
case NAND_ECC_ENGINE_TYPE_NONE:
|
||||
case NAND_ECC_ENGINE_TYPE_ON_DIE:
|
||||
pdata->ecc_bits = 0;
|
||||
break;
|
||||
case NAND_ECC_ENGINE_TYPE_SOFT:
|
||||
|
@ -1,4 +1,4 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
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
|
||||
spinand-objs += micron.o paragon.o skyhigh.o toshiba.o winbond.o xtx.o
|
||||
obj-$(CONFIG_MTD_SPI_NAND) += spinand.o
|
||||
|
@ -294,6 +294,9 @@ static int spinand_ondie_ecc_prepare_io_req(struct nand_device *nand,
|
||||
struct spinand_device *spinand = nand_to_spinand(nand);
|
||||
bool enable = (req->mode != MTD_OPS_RAW);
|
||||
|
||||
if (!enable && spinand->flags & SPINAND_NO_RAW_ACCESS)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
memset(spinand->oobbuf, 0xff, nanddev_per_page_oobsize(nand));
|
||||
|
||||
/* Only enable or disable the engine */
|
||||
@ -901,9 +904,17 @@ static bool spinand_isbad(struct nand_device *nand, const struct nand_pos *pos)
|
||||
.oobbuf.in = marker,
|
||||
.mode = MTD_OPS_RAW,
|
||||
};
|
||||
int ret;
|
||||
|
||||
spinand_select_target(spinand, pos->target);
|
||||
spinand_read_page(spinand, &req);
|
||||
|
||||
ret = spinand_read_page(spinand, &req);
|
||||
if (ret == -EOPNOTSUPP) {
|
||||
/* Retry with ECC in case raw access is not supported */
|
||||
req.mode = MTD_OPS_PLACE_OOB;
|
||||
spinand_read_page(spinand, &req);
|
||||
}
|
||||
|
||||
if (marker[0] != 0xff || marker[1] != 0xff)
|
||||
return true;
|
||||
|
||||
@ -942,11 +953,14 @@ static int spinand_markbad(struct nand_device *nand, const struct nand_pos *pos)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = spinand_write_enable_op(spinand);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = spinand_write_page(spinand, &req);
|
||||
if (ret == -EOPNOTSUPP) {
|
||||
/* Retry with ECC in case raw access is not supported */
|
||||
req.mode = MTD_OPS_PLACE_OOB;
|
||||
ret = spinand_write_page(spinand, &req);
|
||||
}
|
||||
|
||||
return spinand_write_page(spinand, &req);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int spinand_mtd_block_markbad(struct mtd_info *mtd, loff_t offs)
|
||||
@ -1117,6 +1131,7 @@ static const struct spinand_manufacturer *spinand_manufacturers[] = {
|
||||
¯onix_spinand_manufacturer,
|
||||
µn_spinand_manufacturer,
|
||||
¶gon_spinand_manufacturer,
|
||||
&skyhigh_spinand_manufacturer,
|
||||
&toshiba_spinand_manufacturer,
|
||||
&winbond_spinand_manufacturer,
|
||||
&xtx_spinand_manufacturer,
|
||||
|
@ -81,6 +81,16 @@ static const struct spinand_info foresee_spinand_table[] = {
|
||||
SPINAND_HAS_QE_BIT,
|
||||
SPINAND_ECCINFO(&f35sqa002g_ooblayout,
|
||||
f35sqa002g_ecc_get_status)),
|
||||
SPINAND_INFO("F35SQA001G",
|
||||
SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x71, 0x71),
|
||||
NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 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 = {
|
||||
|
147
drivers/mtd/nand/spi/skyhigh.c
Normal file
147
drivers/mtd/nand/spi/skyhigh.c
Normal file
@ -0,0 +1,147 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (c) 2024 SkyHigh Memory Limited
|
||||
*
|
||||
* Author: Takahiro Kuwano <takahiro.kuwano@infineon.com>
|
||||
* Co-Author: KR Kim <kr.kim@skyhighmemory.com>
|
||||
*/
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/mtd/spinand.h>
|
||||
|
||||
#define SPINAND_MFR_SKYHIGH 0x01
|
||||
#define SKYHIGH_STATUS_ECC_1TO2_BITFLIPS (1 << 4)
|
||||
#define SKYHIGH_STATUS_ECC_3TO6_BITFLIPS (2 << 4)
|
||||
#define SKYHIGH_STATUS_ECC_UNCOR_ERROR (3 << 4)
|
||||
#define SKYHIGH_CONFIG_PROTECT_EN BIT(1)
|
||||
|
||||
static SPINAND_OP_VARIANTS(read_cache_variants,
|
||||
SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 4, NULL, 0),
|
||||
SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0),
|
||||
SPINAND_PAGE_READ_FROM_CACHE_DUALIO_OP(0, 2, 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 skyhigh_spinand_ooblayout_ecc(struct mtd_info *mtd, int section,
|
||||
struct mtd_oob_region *region)
|
||||
{
|
||||
/* ECC bytes are stored in hidden area. */
|
||||
return -ERANGE;
|
||||
}
|
||||
|
||||
static int skyhigh_spinand_ooblayout_free(struct mtd_info *mtd, int section,
|
||||
struct mtd_oob_region *region)
|
||||
{
|
||||
if (section)
|
||||
return -ERANGE;
|
||||
|
||||
/* ECC bytes are stored in hidden area. Reserve 2 bytes for the BBM. */
|
||||
region->offset = 2;
|
||||
region->length = mtd->oobsize - 2;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct mtd_ooblayout_ops skyhigh_spinand_ooblayout = {
|
||||
.ecc = skyhigh_spinand_ooblayout_ecc,
|
||||
.free = skyhigh_spinand_ooblayout_free,
|
||||
};
|
||||
|
||||
static int skyhigh_spinand_ecc_get_status(struct spinand_device *spinand,
|
||||
u8 status)
|
||||
{
|
||||
switch (status & STATUS_ECC_MASK) {
|
||||
case STATUS_ECC_NO_BITFLIPS:
|
||||
return 0;
|
||||
|
||||
case SKYHIGH_STATUS_ECC_UNCOR_ERROR:
|
||||
return -EBADMSG;
|
||||
|
||||
case SKYHIGH_STATUS_ECC_1TO2_BITFLIPS:
|
||||
return 2;
|
||||
|
||||
case SKYHIGH_STATUS_ECC_3TO6_BITFLIPS:
|
||||
return 6;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static const struct spinand_info skyhigh_spinand_table[] = {
|
||||
SPINAND_INFO("S35ML01G301",
|
||||
SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x15),
|
||||
NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1),
|
||||
NAND_ECCREQ(6, 32),
|
||||
SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
||||
&write_cache_variants,
|
||||
&update_cache_variants),
|
||||
SPINAND_NO_RAW_ACCESS,
|
||||
SPINAND_ECCINFO(&skyhigh_spinand_ooblayout,
|
||||
skyhigh_spinand_ecc_get_status)),
|
||||
SPINAND_INFO("S35ML01G300",
|
||||
SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x14),
|
||||
NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
|
||||
NAND_ECCREQ(6, 32),
|
||||
SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
||||
&write_cache_variants,
|
||||
&update_cache_variants),
|
||||
SPINAND_NO_RAW_ACCESS,
|
||||
SPINAND_ECCINFO(&skyhigh_spinand_ooblayout,
|
||||
skyhigh_spinand_ecc_get_status)),
|
||||
SPINAND_INFO("S35ML02G300",
|
||||
SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x25),
|
||||
NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 2, 1, 1),
|
||||
NAND_ECCREQ(6, 32),
|
||||
SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
||||
&write_cache_variants,
|
||||
&update_cache_variants),
|
||||
SPINAND_NO_RAW_ACCESS,
|
||||
SPINAND_ECCINFO(&skyhigh_spinand_ooblayout,
|
||||
skyhigh_spinand_ecc_get_status)),
|
||||
SPINAND_INFO("S35ML04G300",
|
||||
SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x35),
|
||||
NAND_MEMORG(1, 2048, 128, 64, 4096, 80, 2, 1, 1),
|
||||
NAND_ECCREQ(6, 32),
|
||||
SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
||||
&write_cache_variants,
|
||||
&update_cache_variants),
|
||||
SPINAND_NO_RAW_ACCESS,
|
||||
SPINAND_ECCINFO(&skyhigh_spinand_ooblayout,
|
||||
skyhigh_spinand_ecc_get_status)),
|
||||
};
|
||||
|
||||
static int skyhigh_spinand_init(struct spinand_device *spinand)
|
||||
{
|
||||
/*
|
||||
* Config_Protect_En (bit 1 in Block Lock register) must be set to 1
|
||||
* before writing other bits. Do it here before core unlocks all blocks
|
||||
* by writing block protection bits.
|
||||
*/
|
||||
return spinand_write_reg_op(spinand, REG_BLOCK_LOCK,
|
||||
SKYHIGH_CONFIG_PROTECT_EN);
|
||||
}
|
||||
|
||||
static const struct spinand_manufacturer_ops skyhigh_spinand_manuf_ops = {
|
||||
.init = skyhigh_spinand_init,
|
||||
};
|
||||
|
||||
const struct spinand_manufacturer skyhigh_spinand_manufacturer = {
|
||||
.id = SPINAND_MFR_SKYHIGH,
|
||||
.name = "SkyHigh",
|
||||
.chips = skyhigh_spinand_table,
|
||||
.nchips = ARRAY_SIZE(skyhigh_spinand_table),
|
||||
.ops = &skyhigh_spinand_manuf_ops,
|
||||
};
|
@ -268,6 +268,7 @@ extern const struct spinand_manufacturer gigadevice_spinand_manufacturer;
|
||||
extern const struct spinand_manufacturer macronix_spinand_manufacturer;
|
||||
extern const struct spinand_manufacturer micron_spinand_manufacturer;
|
||||
extern const struct spinand_manufacturer paragon_spinand_manufacturer;
|
||||
extern const struct spinand_manufacturer skyhigh_spinand_manufacturer;
|
||||
extern const struct spinand_manufacturer toshiba_spinand_manufacturer;
|
||||
extern const struct spinand_manufacturer winbond_spinand_manufacturer;
|
||||
extern const struct spinand_manufacturer xtx_spinand_manufacturer;
|
||||
@ -314,6 +315,7 @@ struct spinand_ecc_info {
|
||||
#define SPINAND_HAS_CR_FEAT_BIT BIT(1)
|
||||
#define SPINAND_HAS_PROG_PLANE_SELECT_BIT BIT(2)
|
||||
#define SPINAND_HAS_READ_PLANE_SELECT_BIT BIT(3)
|
||||
#define SPINAND_NO_RAW_ACCESS BIT(4)
|
||||
|
||||
/**
|
||||
* struct spinand_ondie_ecc_conf - private SPI-NAND on-die ECC engine structure
|
||||
|
Loading…
x
Reference in New Issue
Block a user