mirror of
git://git.openwrt.org/openwrt/openwrt.git
synced 2024-12-30 10:42:22 +00:00
fa4dc86e98
MEMREAD is a new ioctl for MTD character devices that was first included in Linux 6.1. It allows userspace applications to use the Linux kernel's OOB autoplacement mechanism while reading data from NAND devices. The Yafut tool needs this ioctl to do its job. Signed-off-by: Michał Kępień <openwrt@kempniu.pl>
58 lines
1.7 KiB
Diff
58 lines
1.7 KiB
Diff
From f3fe3b15eca7908eaac57f9b8387a5dbc45ec5b2 Mon Sep 17 00:00:00 2001
|
|
From: "SkyLake.Huang" <skylake.huang@mediatek.com>
|
|
Date: Thu, 23 Jun 2022 18:40:59 +0800
|
|
Subject: [PATCH 6/6] drivers: mtd: spi-nor: Add calibration support for
|
|
spi-nor
|
|
|
|
Signed-off-by: SkyLake.Huang <skylake.huang@mediatek.com>
|
|
---
|
|
drivers/mtd/nand/spi/core.c | 5 ++++-
|
|
drivers/mtd/spi-nor/core.c | 15 +++++++++++++++
|
|
2 files changed, 19 insertions(+), 1 deletion(-)
|
|
|
|
--- a/drivers/mtd/nand/spi/core.c
|
|
+++ b/drivers/mtd/nand/spi/core.c
|
|
@@ -1018,7 +1018,10 @@ int spinand_cal_read(void *priv, u32 *ad
|
|
if (ret)
|
|
return ret;
|
|
|
|
- ret = spinand_wait(spinand, &status);
|
|
+ ret = spinand_wait(spinand,
|
|
+ SPINAND_READ_INITIAL_DELAY_US,
|
|
+ SPINAND_READ_POLL_DELAY_US,
|
|
+ &status);
|
|
if (ret < 0)
|
|
return ret;
|
|
|
|
--- a/drivers/mtd/spi-nor/core.c
|
|
+++ b/drivers/mtd/spi-nor/core.c
|
|
@@ -3060,6 +3060,18 @@ static void spi_nor_debugfs_init(struct
|
|
info->id_len, info->id);
|
|
}
|
|
|
|
+static int spi_nor_cal_read(void *priv, u32 *addr, int addrlen, u8 *buf, int readlen)
|
|
+{
|
|
+ struct spi_nor *nor = (struct spi_nor *)priv;
|
|
+
|
|
+ nor->reg_proto = SNOR_PROTO_1_1_1;
|
|
+ nor->read_proto = SNOR_PROTO_1_1_1;
|
|
+ nor->read_opcode = SPINOR_OP_READ;
|
|
+ nor->read_dummy = 0;
|
|
+
|
|
+ return nor->controller_ops->read(nor, *addr, readlen, buf);
|
|
+}
|
|
+
|
|
static const struct flash_info *spi_nor_get_flash_info(struct spi_nor *nor,
|
|
const char *name)
|
|
{
|
|
@@ -3133,6 +3145,9 @@ int spi_nor_scan(struct spi_nor *nor, co
|
|
if (!nor->bouncebuf)
|
|
return -ENOMEM;
|
|
|
|
+ if(nor->spimem)
|
|
+ spi_mem_do_calibration(nor->spimem, spi_nor_cal_read, nor);
|
|
+
|
|
info = spi_nor_get_flash_info(nor, name);
|
|
if (IS_ERR(info))
|
|
return PTR_ERR(info);
|