Changelog: https://cdn.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.12.75 Removed upstream: bcm27xx/patches-6.12/950-0225-media-i2c-ov5647-Correct-pixel-array-offset.patch[1] bcm27xx/patches-6.12/950-0226-media-i2c-ov5647-Correct-minimum-VBLANK-value.patch[2] bcm27xx/patches-6.12/950-0248-media-i2c-ov5647-Sensor-should-report-RAW-color-spac.patch[3] qualcommax/patches-6.12/0074-v6.20-clk-qcom-gcc-ipq5018-flag-sleep-clock-as-critical.patch[4] Manually rebased: bcm27xx/patches-6.12/950-0262-mfd-simple-mfd-i2c-Add-configuration-for-RPi-POE-HAT.patch bcm27xx/patches-6.12/950-0071-drivers-mfd-sensehat-Add-Raspberry-Pi-Sense-HAT-to-s.patch bcm27xx/patches-6.12/950-0516-media-i2c-ov5647-Add-V4L2_CID_LINK_FREQUENCY-control.patch lantiq/patches-6.12/101-find_active_root.patch All other patches automatically rebased. 1. https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v6.12.75&id=58f1767ad5c9eda3dd0befddc1843259d46d64fa 2. https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v6.12.75&id=ff65571ffae52b65577121e7696bf22156e1928a 3. https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v6.12.75&id=fbf2a108ed5eb1c896d3f354bd05314c2e22e78f 4. https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v6.12.75&id=b109dd4970a0fc89d54b1198b163f86125dd2977 Build system: x86/64 Build-tested: flogic/glinet_gl-mt6000 Run-tested: flogic/glinet_gl-mt6000 Co-authored-by: Shiji Yang <yangshiji66@outlook.com> Signed-off-by: John Audia <therealgraysky@proton.me> Link: https://github.com/openwrt/openwrt/pull/22276 Signed-off-by: Robert Marko <robimarko@gmail.com>
99 lines
3.4 KiB
Diff
99 lines
3.4 KiB
Diff
From 004f8ea0d9917398aabff7388b3bf62a84a4088b Mon Sep 17 00:00:00 2001
|
|
From: Mikhail Kshevetskiy <mikhail.kshevetskiy@iopsys.eu>
|
|
Date: Thu, 18 Sep 2025 00:54:00 +0300
|
|
Subject: mtd: spinand: try a regular dirmap if creating a dirmap for
|
|
continuous reading fails
|
|
|
|
Continuous reading may result in multiple flash pages reading in one
|
|
operation. Typically only one flash page has read/written (a little bit
|
|
more than 2-4 Kb), but continuous reading requires the spi controller
|
|
to read up to 512 Kb in one operation without toggling CS in beetween.
|
|
|
|
Roughly speaking spi controllers can be divided on 2 categories:
|
|
* spi controllers without dirmap acceleration support
|
|
* spi controllers with dirmap acceleration support
|
|
|
|
Firt of them will have issues with continuous reading if restriction on
|
|
the transfer length is implemented in the adjust_op_size() handler.
|
|
Second group often supports acceleration of single page only reading.
|
|
Thus enabling of continuous reading can break flash reading.
|
|
|
|
This patch tries to create dirmap for continuous reading first and
|
|
fallback to regular reading if spi controller refuses to create it.
|
|
|
|
Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy@iopsys.eu>
|
|
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
|
|
---
|
|
drivers/mtd/nand/spi/core.c | 43 ++++++++++++++++++++++++++++++-------
|
|
1 file changed, 35 insertions(+), 8 deletions(-)
|
|
|
|
--- a/drivers/mtd/nand/spi/core.c
|
|
+++ b/drivers/mtd/nand/spi/core.c
|
|
@@ -1032,6 +1032,39 @@ static int spinand_mtd_block_isreserved(
|
|
return ret;
|
|
}
|
|
|
|
+static struct spi_mem_dirmap_desc *spinand_create_rdesc(
|
|
+ struct spinand_device *spinand,
|
|
+ struct spi_mem_dirmap_info *info)
|
|
+{
|
|
+ struct nand_device *nand = spinand_to_nand(spinand);
|
|
+ struct spi_mem_dirmap_desc *desc = NULL;
|
|
+
|
|
+ if (spinand->cont_read_possible) {
|
|
+ /*
|
|
+ * spi controller may return an error if info->length is
|
|
+ * too large
|
|
+ */
|
|
+ info->length = nanddev_eraseblock_size(nand);
|
|
+ desc = devm_spi_mem_dirmap_create(&spinand->spimem->spi->dev,
|
|
+ spinand->spimem, info);
|
|
+ }
|
|
+
|
|
+ if (IS_ERR_OR_NULL(desc)) {
|
|
+ /*
|
|
+ * continuous reading is not supported by flash or
|
|
+ * its spi controller, use regular reading
|
|
+ */
|
|
+ spinand->cont_read_possible = false;
|
|
+
|
|
+ info->length = nanddev_page_size(nand) +
|
|
+ nanddev_per_page_oobsize(nand);
|
|
+ desc = devm_spi_mem_dirmap_create(&spinand->spimem->spi->dev,
|
|
+ spinand->spimem, info);
|
|
+ }
|
|
+
|
|
+ return desc;
|
|
+}
|
|
+
|
|
static int spinand_create_dirmap(struct spinand_device *spinand,
|
|
unsigned int plane)
|
|
{
|
|
@@ -1051,11 +1084,8 @@ static int spinand_create_dirmap(struct
|
|
|
|
spinand->dirmaps[plane].wdesc = desc;
|
|
|
|
- if (spinand->cont_read_possible)
|
|
- info.length = nanddev_eraseblock_size(nand);
|
|
info.op_tmpl = *spinand->op_templates.read_cache;
|
|
- desc = devm_spi_mem_dirmap_create(&spinand->spimem->spi->dev,
|
|
- spinand->spimem, &info);
|
|
+ desc = spinand_create_rdesc(spinand, &info);
|
|
if (IS_ERR(desc))
|
|
return PTR_ERR(desc);
|
|
|
|
@@ -1078,12 +1108,9 @@ static int spinand_create_dirmap(struct
|
|
|
|
spinand->dirmaps[plane].wdesc_ecc = desc;
|
|
|
|
- if (spinand->cont_read_possible)
|
|
- info.length = nanddev_eraseblock_size(nand);
|
|
info.op_tmpl = *spinand->op_templates.read_cache;
|
|
info.op_tmpl.data.ecc = true;
|
|
- desc = devm_spi_mem_dirmap_create(&spinand->spimem->spi->dev,
|
|
- spinand->spimem, &info);
|
|
+ desc = spinand_create_rdesc(spinand, &info);
|
|
if (IS_ERR(desc))
|
|
return PTR_ERR(desc);
|
|
|