diff options
| author | Christian Marangi <ansuelsmth@gmail.com> | 2025-06-07 23:11:21 +0200 | 
|---|---|---|
| committer | Tom Rini <trini@konsulko.com> | 2025-06-14 09:11:10 -0600 | 
| commit | fe37fb8214e40ea64cf03453d112527b629fb08a (patch) | |
| tree | 90e2dd4b85b8a8b6aeb5391bc7a2ae2dfd1e89a9 /drivers/mtd | |
| parent | 01cc7046ad2a1537791cda5175bce281f0a0acfc (diff) | |
mtd: spinand: winbond: add Winbond W25N04KV flash support
Add Winbond W25N04KV flash support that use a different value to detect
ECC bitflip.
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
Diffstat (limited to 'drivers/mtd')
| -rw-r--r-- | drivers/mtd/nand/spi/winbond.c | 13 | 
1 files changed, 13 insertions, 0 deletions
| diff --git a/drivers/mtd/nand/spi/winbond.c b/drivers/mtd/nand/spi/winbond.c index dd4ed257a83..16abf89dbbf 100644 --- a/drivers/mtd/nand/spi/winbond.c +++ b/drivers/mtd/nand/spi/winbond.c @@ -11,6 +11,7 @@  #include <linux/device.h>  #include <linux/kernel.h>  #endif +#include <linux/bitfield.h>  #include <linux/bug.h>  #include <linux/mtd/spinand.h> @@ -18,6 +19,8 @@  #define WINBOND_CFG_BUF_READ		BIT(3) +#define W25N04KV_STATUS_ECC_5_8_BITFLIPS FIELD_PREP_CONST(STATUS_ECC_MASK, 0x3) +  static SPINAND_OP_VARIANTS(read_cache_variants,  		SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 2, NULL, 0),  		SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0), @@ -121,6 +124,7 @@ static int w25n02kv_ecc_get_status(struct spinand_device *spinand,  		return -EBADMSG;  	case STATUS_ECC_HAS_BITFLIPS: +	case W25N04KV_STATUS_ECC_5_8_BITFLIPS:  		/*  		 * Let's try to retrieve the real maximum number of bitflips  		 * in order to avoid forcing the wear-leveling layer to move @@ -172,6 +176,15 @@ static const struct spinand_info winbond_spinand_table[] = {  					      &update_cache_variants),  		     0,  		     SPINAND_ECCINFO(&w25n02kv_ooblayout, w25n02kv_ecc_get_status)), +	SPINAND_INFO("W25N04KV", +		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xaa, 0x23), +		     NAND_MEMORG(1, 2048, 128, 64, 4096, 40, 2, 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)),  };  static int winbond_spinand_init(struct spinand_device *spinand) | 
