121 lines
3.6 KiB
Diff
121 lines
3.6 KiB
Diff
From 7ac30bd8a32bd1b992f5c252b5608c9c26e4be26 Mon Sep 17 00:00:00 2001
|
|
From: Tudor Ambarus <tudor.ambarus@microchip.com>
|
|
Date: Thu, 24 Oct 2019 16:40:13 +0300
|
|
Subject: [PATCH 09/39] mtd: spi-nor: Pointer parameter for FSR in
|
|
spi_nor_read_fsr()
|
|
|
|
mainline inclusion
|
|
from mainline-v5.5-rc1
|
|
commit 5ce1b49ccb52fc3dd5679d8c523a3e8b5c812fb0
|
|
category: feature
|
|
bugzilla: https://gitee.com/openeuler/kernel/issues/I8CSBP
|
|
CVE: NA
|
|
|
|
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=5ce1b49ccb52fc3dd5679d8c523a3e8b5c812fb0
|
|
|
|
----------------------------------------------------------------------------
|
|
|
|
Let the callers pass the pointer to the DMA-able buffer where
|
|
the value of the Flag Status Register will be written. This way we
|
|
avoid the casts between int and u8, which can be confusing.
|
|
|
|
Caller stops compare the return value of spi_nor_read_fsr() with negative,
|
|
spi_nor_read_fsr() returns 0 on success and -errno otherwise.
|
|
|
|
Signed-off-by: Tudor Ambarus <tudor.ambarus@microchip.com>
|
|
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
|
|
Signed-off-by: YunYi Yang <yangyunyi2@huawei.com>
|
|
|
|
Conflicts:
|
|
drivers/mtd/spi-nor/spi-nor.c
|
|
---
|
|
drivers/mtd/spi-nor/spi-nor.c | 38 ++++++++++++++++++-----------------
|
|
1 file changed, 20 insertions(+), 18 deletions(-)
|
|
|
|
diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c
|
|
index 3a10b5939cd2..766ad458197e 100644
|
|
--- a/drivers/mtd/spi-nor/spi-nor.c
|
|
+++ b/drivers/mtd/spi-nor/spi-nor.c
|
|
@@ -276,12 +276,15 @@ static int spi_nor_read_sr(struct spi_nor *nor, u8 *sr)
|
|
return ret;
|
|
}
|
|
|
|
-/*
|
|
- * Read the flag status register, returning its value in the location
|
|
- * Return the status register value.
|
|
- * Returns negative if error occurred.
|
|
+/**
|
|
+ * spi_nor_read_fsr() - Read the Flag Status Register.
|
|
+ * @nor: pointer to 'struct spi_nor'
|
|
+ * @fsr: pointer to a DMA-able buffer where the value of the
|
|
+ * Flag Status Register will be written.
|
|
+ *
|
|
+ * Return: 0 on success, -errno otherwise.
|
|
*/
|
|
-static int spi_nor_read_fsr(struct spi_nor *nor)
|
|
+static int spi_nor_read_fsr(struct spi_nor *nor, u8 *fsr)
|
|
{
|
|
int ret;
|
|
|
|
@@ -290,19 +293,17 @@ static int spi_nor_read_fsr(struct spi_nor *nor)
|
|
SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_RDFSR, 1),
|
|
SPI_MEM_OP_NO_ADDR,
|
|
SPI_MEM_OP_NO_DUMMY,
|
|
- SPI_MEM_OP_DATA_IN(1, nor->bouncebuf, 1));
|
|
+ SPI_MEM_OP_DATA_IN(1, fsr, 1));
|
|
|
|
ret = spi_mem_exec_op(nor->spimem, &op);
|
|
} else {
|
|
- ret = nor->read_reg(nor, SPINOR_OP_RDFSR, nor->bouncebuf, 1);
|
|
+ ret = nor->read_reg(nor, SPINOR_OP_RDFSR, fsr, 1);
|
|
}
|
|
|
|
- if (ret) {
|
|
+ if (ret)
|
|
pr_err("error %d reading FSR\n", ret);
|
|
- return ret;
|
|
- }
|
|
|
|
- return nor->bouncebuf[0];
|
|
+ return ret;
|
|
}
|
|
|
|
/*
|
|
@@ -646,17 +647,18 @@ static int spi_nor_clear_fsr(struct spi_nor *nor)
|
|
|
|
static inline int spi_nor_fsr_ready(struct spi_nor *nor)
|
|
{
|
|
- int fsr = spi_nor_read_fsr(nor);
|
|
- if (fsr < 0)
|
|
- return fsr;
|
|
+ int ret = spi_nor_read_fsr(nor, nor->bouncebuf);
|
|
+
|
|
+ if (ret)
|
|
+ return ret;
|
|
|
|
- if (fsr & (FSR_E_ERR | FSR_P_ERR)) {
|
|
- if (fsr & FSR_E_ERR)
|
|
+ if (nor->bouncebuf[0] & (FSR_E_ERR | FSR_P_ERR)) {
|
|
+ if (nor->bouncebuf[0] & FSR_E_ERR)
|
|
dev_err(nor->dev, "Erase operation failed.\n");
|
|
else
|
|
dev_err(nor->dev, "Program operation failed.\n");
|
|
|
|
- if (fsr & FSR_PT_ERR)
|
|
+ if (nor->bouncebuf[0] & FSR_PT_ERR)
|
|
dev_err(nor->dev,
|
|
"Attempted to modify a protected sector.\n");
|
|
|
|
@@ -664,7 +666,7 @@ static inline int spi_nor_fsr_ready(struct spi_nor *nor)
|
|
return -EIO;
|
|
}
|
|
|
|
- return fsr & FSR_READY;
|
|
+ return nor->bouncebuf[0] & FSR_READY;
|
|
}
|
|
|
|
static int spi_nor_ready(struct spi_nor *nor)
|
|
--
|
|
2.27.0
|
|
|