[PATCH] mtd: spi-nor: Make octal_dtr_enable() dedicate for enabling Octal DTR
tkuw584924 at gmail.com
tkuw584924 at gmail.com
Thu Jun 15 22:06:00 PDT 2023
From: Takahiro Kuwano <Takahiro.Kuwano at infineon.com>
The function should be responsible only for enabling Octal DTR. Remove
'enable' parameter from octal_dtr_enable() and add octal_dtr_disable()
that takes care for disabling. This can remove 'enable' flag checks in
core and manufacturer drivers and improve readability.
Signed-off-by: Takahiro Kuwano <Takahiro.Kuwano at infineon.com>
---
drivers/mtd/spi-nor/core.c | 42 ++++++++++++++++++++++++++-------
drivers/mtd/spi-nor/core.h | 4 +++-
drivers/mtd/spi-nor/micron-st.c | 11 +++------
drivers/mtd/spi-nor/spansion.c | 36 ++++++++++++++--------------
4 files changed, 57 insertions(+), 36 deletions(-)
diff --git a/drivers/mtd/spi-nor/core.c b/drivers/mtd/spi-nor/core.c
index 143ca3c9b477..d2571f309f41 100644
--- a/drivers/mtd/spi-nor/core.c
+++ b/drivers/mtd/spi-nor/core.c
@@ -3086,11 +3086,10 @@ static int spi_nor_init_params(struct spi_nor *nor)
/** spi_nor_octal_dtr_enable() - enable Octal DTR I/O if needed
* @nor: pointer to a 'struct spi_nor'
- * @enable: whether to enable or disable Octal DTR
*
* Return: 0 on success, -errno otherwise.
*/
-static int spi_nor_octal_dtr_enable(struct spi_nor *nor, bool enable)
+static int spi_nor_octal_dtr_enable(struct spi_nor *nor)
{
int ret;
@@ -3104,14 +3103,39 @@ static int spi_nor_octal_dtr_enable(struct spi_nor *nor, bool enable)
if (!(nor->flags & SNOR_F_IO_MODE_EN_VOLATILE))
return 0;
- ret = nor->params->octal_dtr_enable(nor, enable);
+ ret = nor->params->octal_dtr_enable(nor);
if (ret)
return ret;
- if (enable)
- nor->reg_proto = SNOR_PROTO_8_8_8_DTR;
- else
- nor->reg_proto = SNOR_PROTO_1_1_1;
+ nor->reg_proto = SNOR_PROTO_8_8_8_DTR;
+
+ return 0;
+}
+
+/** spi_nor_octal_dtr_disable() - disable Octal DTR I/O if it is enabled
+ * @nor: pointer to a 'struct spi_nor'
+ *
+ * Return: 0 on success, -errno otherwise.
+ */
+static int spi_nor_octal_dtr_disable(struct spi_nor *nor)
+{
+ int ret;
+
+ if (!nor->params->octal_dtr_disable)
+ return 0;
+
+ if (!(nor->read_proto == SNOR_PROTO_8_8_8_DTR &&
+ nor->write_proto == SNOR_PROTO_8_8_8_DTR))
+ return 0;
+
+ if (!(nor->flags & SNOR_F_IO_MODE_EN_VOLATILE))
+ return 0;
+
+ ret = nor->params->octal_dtr_disable(nor);
+ if (ret)
+ return ret;
+
+ nor->reg_proto = SNOR_PROTO_1_1_1;
return 0;
}
@@ -3165,7 +3189,7 @@ static int spi_nor_init(struct spi_nor *nor)
{
int err;
- err = spi_nor_octal_dtr_enable(nor, true);
+ err = spi_nor_octal_dtr_enable(nor);
if (err) {
dev_dbg(nor->dev, "octal mode not supported\n");
return err;
@@ -3267,7 +3291,7 @@ static int spi_nor_suspend(struct mtd_info *mtd)
int ret;
/* Disable octal DTR mode if we enabled it. */
- ret = spi_nor_octal_dtr_enable(nor, false);
+ ret = spi_nor_octal_dtr_disable(nor);
if (ret)
dev_err(nor->dev, "suspend() failed\n");
diff --git a/drivers/mtd/spi-nor/core.h b/drivers/mtd/spi-nor/core.h
index fd61c4793a10..9c33d7c8395b 100644
--- a/drivers/mtd/spi-nor/core.h
+++ b/drivers/mtd/spi-nor/core.h
@@ -364,6 +364,7 @@ struct spi_nor_otp {
* Table.
* @otp: SPI NOR OTP info.
* @octal_dtr_enable: enables SPI NOR octal DTR mode.
+ * @octal_dtr_disable: disables SPI NOR octal DTR mode.
* @quad_enable: enables SPI NOR quad mode.
* @set_4byte_addr_mode: puts the SPI NOR in 4 byte addressing mode.
* @convert_addr: converts an absolute address into something the flash
@@ -397,7 +398,8 @@ struct spi_nor_flash_parameter {
struct spi_nor_erase_map erase_map;
struct spi_nor_otp otp;
- int (*octal_dtr_enable)(struct spi_nor *nor, bool enable);
+ int (*octal_dtr_enable)(struct spi_nor *nor);
+ int (*octal_dtr_disable)(struct spi_nor *nor);
int (*quad_enable)(struct spi_nor *nor);
int (*set_4byte_addr_mode)(struct spi_nor *nor, bool enable);
u32 (*convert_addr)(struct spi_nor *nor, u32 addr);
diff --git a/drivers/mtd/spi-nor/micron-st.c b/drivers/mtd/spi-nor/micron-st.c
index 4b919756a205..15c70085085b 100644
--- a/drivers/mtd/spi-nor/micron-st.c
+++ b/drivers/mtd/spi-nor/micron-st.c
@@ -47,7 +47,7 @@
SPI_MEM_OP_NO_DUMMY, \
SPI_MEM_OP_NO_DATA)
-static int micron_st_nor_octal_dtr_en(struct spi_nor *nor)
+static int micron_st_nor_octal_dtr_enable(struct spi_nor *nor)
{
struct spi_mem_op op;
u8 *buf = nor->bouncebuf;
@@ -84,7 +84,7 @@ static int micron_st_nor_octal_dtr_en(struct spi_nor *nor)
return 0;
}
-static int micron_st_nor_octal_dtr_dis(struct spi_nor *nor)
+static int micron_st_nor_octal_dtr_disable(struct spi_nor *nor)
{
struct spi_mem_op op;
u8 *buf = nor->bouncebuf;
@@ -120,15 +120,10 @@ static int micron_st_nor_octal_dtr_dis(struct spi_nor *nor)
return 0;
}
-static int micron_st_nor_octal_dtr_enable(struct spi_nor *nor, bool enable)
-{
- return enable ? micron_st_nor_octal_dtr_en(nor) :
- micron_st_nor_octal_dtr_dis(nor);
-}
-
static void mt35xu512aba_default_init(struct spi_nor *nor)
{
nor->params->octal_dtr_enable = micron_st_nor_octal_dtr_enable;
+ nor->params->octal_dtr_disable = micron_st_nor_octal_dtr_disable;
}
static int mt35xu512aba_post_sfdp_fixup(struct spi_nor *nor)
diff --git a/drivers/mtd/spi-nor/spansion.c b/drivers/mtd/spi-nor/spansion.c
index 15f9a80c10b9..a0231075e18a 100644
--- a/drivers/mtd/spi-nor/spansion.c
+++ b/drivers/mtd/spi-nor/spansion.c
@@ -141,7 +141,16 @@ static int cypress_nor_sr_ready_and_clear(struct spi_nor *nor)
return 1;
}
-static int cypress_nor_octal_dtr_en(struct spi_nor *nor)
+/**
+ * cypress_nor_octal_dtr_enable() - Enable octal DTR on Cypress flashes.
+ * @nor: pointer to a 'struct spi_nor'
+ *
+ * This also sets the memory access latency cycles to 24 to allow the flash to
+ * run at up to 200MHz.
+ *
+ * Return: 0 on success, -errno otherwise.
+ */
+static int cypress_nor_octal_dtr_enable(struct spi_nor *nor)
{
struct spi_mem_op op;
u8 *buf = nor->bouncebuf;
@@ -184,7 +193,13 @@ static int cypress_nor_octal_dtr_en(struct spi_nor *nor)
return 0;
}
-static int cypress_nor_octal_dtr_dis(struct spi_nor *nor)
+/**
+ * cypress_nor_octal_dtr_disable() - Disable octal DTR on Cypress flashes.
+ * @nor: pointer to a 'struct spi_nor'
+ *
+ * Return: 0 on success, -errno otherwise.
+ */
+static int cypress_nor_octal_dtr_disable(struct spi_nor *nor)
{
struct spi_mem_op op;
u8 *buf = nor->bouncebuf;
@@ -606,22 +621,6 @@ static struct spi_nor_fixups s25hx_t_fixups = {
.late_init = s25hx_t_late_init,
};
-/**
- * cypress_nor_octal_dtr_enable() - Enable octal DTR on Cypress flashes.
- * @nor: pointer to a 'struct spi_nor'
- * @enable: whether to enable or disable Octal DTR
- *
- * This also sets the memory access latency cycles to 24 to allow the flash to
- * run at up to 200MHz.
- *
- * Return: 0 on success, -errno otherwise.
- */
-static int cypress_nor_octal_dtr_enable(struct spi_nor *nor, bool enable)
-{
- return enable ? cypress_nor_octal_dtr_en(nor) :
- cypress_nor_octal_dtr_dis(nor);
-}
-
static int s28hx_t_post_sfdp_fixup(struct spi_nor *nor)
{
/*
@@ -668,6 +667,7 @@ static int s28hx_t_post_bfpt_fixup(struct spi_nor *nor,
static void s28hx_t_late_init(struct spi_nor *nor)
{
nor->params->octal_dtr_enable = cypress_nor_octal_dtr_enable;
+ nor->params->octal_dtr_disable = cypress_nor_octal_dtr_disable;
cypress_nor_ecc_init(nor);
}
--
2.34.1
More information about the linux-mtd
mailing list