FAILED: patch "[PATCH] mtd: spinand: winbond: Fix oob_layout for W25N01JW" failed to apply to 6.16-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 6.16-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.16.y
git checkout FETCH_HEAD
git cherry-pick -x 4550d33e18112a11a740424c4eec063cd58e918c
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2025091343-unmade-clapped-31e9@gregkh' --subject-prefix 'PATCH 6.16.y' HEAD^..
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 4550d33e18112a11a740424c4eec063cd58e918c Mon Sep 17 00:00:00 2001
From: Santhosh Kumar K <[email protected]>
Date: Thu, 4 Sep 2025 18:47:41 +0530
Subject: [PATCH] mtd: spinand: winbond: Fix oob_layout for W25N01JW
Fix the W25N01JW's oob_layout according to the datasheet [1]
drivers/mtd/nand/spi/winbond.c +36 -1
@@ -176,6 +176,36 @@ static const struct mtd_ooblayout_ops w25n02kv_ooblayout = { .free = w25n02kv_ooblayout_free, }; +static int w25n01jw_ooblayout_ecc (struct mtd_info *mtd,int section, +struct mtd_oob_region *region) +{ +if (section >3 ) +return -ERANGE ; + + region->offset = (16 * section) +12 ; + region->length =4 ; + +return 0 ; +} + +static int w25n01jw_ooblayout_free (struct mtd_info *mtd,int section, +struct mtd_oob_region *region) +{ +if (section >3 ) +return -ERANGE ; + + region->offset = (16 * section); + region->length =12 ; + +/* Extract BBM */ +if (!section) { + region->offset +=2 ; + region->length -=2 ; + } + +return 0 ; +} +static int w35n01jw_ooblayout_ecc (struct mtd_info *mtd,int section,struct mtd_oob_region *region) {
@@ -206,6 +236,11 @@ static int w35n01jw_ooblayout_free(struct mtd_info *mtd, int section,return 0 ; } +static const struct mtd_ooblayout_ops w25n01jw_ooblayout = { + .ecc = w25n01jw_ooblayout_ecc, + .free = w25n01jw_ooblayout_free, +}; +static const struct mtd_ooblayout_ops w35n01jw_ooblayout = { .ecc = w35n01jw_ooblayout_ecc, .free = w35n01jw_ooblayout_free,
@@ -394,7 +429,7 @@ static const struct spinand_info winbond_spinand_table[] = { &write_cache_variants, &update_cache_variants), 0, - SPINAND_ECCINFO(&w25m02gv_ooblayout, NULL), + SPINAND_ECCINFO(&w25n01jw_ooblayout, NULL), SPINAND_CONFIGURE_CHIP(w25n0xjw_hs_cfg)), SPINAND_INFO("W25N01KV", /* 3.3V */ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xae, 0x21),
Sasha Levin
maintainerPATCH 1/3 mtd: spinand: Add a ->configure_chip() hook
From: Miquel Raynal <[email protected]>
[ Upstream commit da55809ebb45d1d80b7a388ffef841ed683e1a6f ]
There is already a manufacturer hook, which is manufacturer specific but not chip specific. We no longer have access to the actual NAND identity at this stage so let's add a per-chip configuration hook to align the chip configuration (if any) with the core's setting.
Stable-dep-of: 4550d33e1811 ("mtd: spinand: winbond: Fix oob_layout for W25N01JW")
--- drivers/mtd/nand/spi/core.c | 16 ++++++++++++++-- include/linux/mtd/spinand.h | 7 +++++++ 2 files changed, 21 insertions(+), 2 deletions(-)
drivers/mtd/nand/spi/core.c +14 -2
@@ -1253,8 +1253,19 @@ static int spinand_id_detect(struct spinand_device *spinand)static int spinand_manufacturer_init (struct spinand_device *spinand) { -if (spinand->manufacturer->ops->init) -return spinand->manufacturer->ops->init (spinand); +int ret; + +if (spinand->manufacturer->ops->init) { + ret = spinand->manufacturer->ops->init (spinand); +if (ret) +return ret; + } + +if (spinand->configure_chip) { + ret = spinand->configure_chip (spinand); +if (ret) +return ret; + }return 0 ; }
@@ -1349,6 +1360,7 @@ int spinand_match_and_init(struct spinand_device *spinand, spinand->flags = table[i].flags; spinand->id.len =1 + table[i].devid.len; spinand->select_target = table[i].select_target; + spinand->configure_chip = table[i].configure_chip; spinand->set_cont_read = table[i].set_cont_read; spinand->fact_otp = &table[i].fact_otp; spinand->user_otp = &table[i].user_otp;
include/linux/mtd/spinand.h +7 -0
@@ -484,6 +484,7 @@ struct spinand_user_otp {* @op_variants.update_cache: variants of the update-cache operation * @select_target: function used to select a target/die. Required only for * multi-die chips +* @configure_chip: Align the chip configuration with the core settings * @set_cont_read: enable/disable continuous cached reads * @fact_otp: SPI NAND factory OTP info. * @user_otp: SPI NAND user OTP info.
@@ -507,6 +508,7 @@ struct spinand_info { } op_variants;int (*select_target)(struct spinand_device *spinand,unsigned int target); +int (*configure_chip)(struct spinand_device *spinand);int (*set_cont_read)(struct spinand_device *spinand,bool enable);struct spinand_fact_otp fact_otp;
@@ -539,6 +541,9 @@ struct spinand_info {#define SPINAND_SELECT_TARGET (__func) \ .select_target = __func +#define SPINAND_CONFIGURE_CHIP (__configure_chip) \ + .configure_chip = __configure_chip +#define SPINAND_CONT_READ (__set_cont_read) \ .set_cont_read = __set_cont_read
@@ -607,6 +612,7 @@ struct spinand_dirmap {* passed in spi_mem_op be DMA-able, so we can't based the bufs on * the stack * @manufacturer: SPI NAND manufacturer information +* @configure_chip: Align the chip configuration with the core settings * @cont_read_possible: Field filled by the core once the whole system * configuration is known to tell whether continuous reads are * suitable to use or not in general with this chip/configuration.
@@ -647,6 +653,7 @@ struct spinand_device {const struct spinand_manufacturer *manufacturer;void *priv; +int (*configure_chip)(struct spinand_device *spinand);bool cont_read_possible;int (*set_cont_read)(struct spinand_device *spinand,bool enable);
Signature · 1 line
2.51.0
Sasha Levin
maintainerPATCH 2/3 mtd: spinand: winbond: Enable high-speed modes on w25n0xjw
From: Miquel Raynal <[email protected]>
[ Upstream commit f1a91175faaab02a45d1ceb313a315a5bfeb5416 ]
w25n0xjw chips have a high-speed capability hidden in a configuration register. Once enabled, dual/quad SDR reads may be performed at a much higher frequency.
Implement the new ->configure_chip() hook for this purpose and configure the SR4 register accordingly.
Stable-dep-of: 4550d33e1811 ("mtd: spinand: winbond: Fix oob_layout for W25N01JW")
--- drivers/mtd/nand/spi/core.c | 2 +- drivers/mtd/nand/spi/winbond.c | 45 ++++++++++++++++++++++++++++++++-- include/linux/mtd/spinand.h | 1 + 3 files changed, 45 insertions(+), 3 deletions(-)
drivers/mtd/nand/spi/core.c +1 -1
@@ -20,7 +20,7 @@#include <linux/spi/spi.h> #include <linux/spi/spi-mem.h> -static int spinand_read_reg_op (struct spinand_device *spinand,u8 reg,u8 *val) +int spinand_read_reg_op (struct spinand_device *spinand,u8 reg,u8 *val) {struct spi_mem_op op =SPINAND_GET_FEATURE_1S_1S_1S_OP (reg, spinand->scratchbuf);
drivers/mtd/nand/spi/winbond.c +43 -2
79 lines not on this page · raw message
include/linux/mtd/spinand.h +1 -0
@@ -730,6 +730,7 @@ int spinand_match_and_init(struct spinand_device *spinand, enum spinand_readid_method rdid_method);int spinand_upd_cfg (struct spinand_device *spinand,u8 mask,u8 val); +int spinand_read_reg_op (struct spinand_device *spinand,u8 reg,u8 *val);int spinand_write_reg_op (struct spinand_device *spinand,u8 reg,u8 val);int spinand_select_target (struct spinand_device *spinand,unsigned int target);
Signature · 1 line
2.51.0
Sasha Levin
maintainerPATCH 3/3 mtd: spinand: winbond: Fix oob_layout for W25N01JW
In reply to Sasha LevinFrom: Santhosh Kumar K <[email protected]>
[ Upstream commit 4550d33e18112a11a740424c4eec063cd58e918c ]
Fix the W25N01JW's oob_layout according to the datasheet [1]
--- drivers/mtd/nand/spi/winbond.c | 37 +++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-)
drivers/mtd/nand/spi/winbond.c +36 -1
@@ -162,6 +162,36 @@ static const struct mtd_ooblayout_ops w25n02kv_ooblayout = { .free = w25n02kv_ooblayout_free, }; +static int w25n01jw_ooblayout_ecc (struct mtd_info *mtd,int section, +struct mtd_oob_region *region) +{ +if (section >3 ) +return -ERANGE ; + + region->offset = (16 * section) +12 ; + region->length =4 ; + +return 0 ; +} + +static int w25n01jw_ooblayout_free (struct mtd_info *mtd,int section, +struct mtd_oob_region *region) +{ +if (section >3 ) +return -ERANGE ; + + region->offset = (16 * section); + region->length =12 ; + +/* Extract BBM */ +if (!section) { + region->offset +=2 ; + region->length -=2 ; + } + +return 0 ; +} +static int w35n01jw_ooblayout_ecc (struct mtd_info *mtd,int section,struct mtd_oob_region *region) {
@@ -192,6 +222,11 @@ static int w35n01jw_ooblayout_free(struct mtd_info *mtd, int section,return 0 ; } +static const struct mtd_ooblayout_ops w25n01jw_ooblayout = { + .ecc = w25n01jw_ooblayout_ecc, + .free = w25n01jw_ooblayout_free, +}; +static const struct mtd_ooblayout_ops w35n01jw_ooblayout = { .ecc = w35n01jw_ooblayout_ecc, .free = w35n01jw_ooblayout_free,
@@ -307,7 +342,7 @@ static const struct spinand_info winbond_spinand_table[] = { &write_cache_variants, &update_cache_variants), 0, - SPINAND_ECCINFO(&w25m02gv_ooblayout, NULL), + SPINAND_ECCINFO(&w25n01jw_ooblayout, NULL), SPINAND_CONFIGURE_CHIP(w25n0xjw_hs_cfg)), SPINAND_INFO("W25N01KV", /* 3.3V */ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xae, 0x21),
Signature · 1 line
2.51.0