]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
mtd: spinand: Make use of the operation templates through SPINAND_OP()
authorMiquel Raynal <miquel.raynal@bootlin.com>
Fri, 9 Jan 2026 17:18:08 +0000 (18:18 +0100)
committerMiquel Raynal <miquel.raynal@bootlin.com>
Thu, 29 Jan 2026 19:21:40 +0000 (20:21 +0100)
Create a SPINAND_OP() macro to which we give the name of the operation
we want. This macro retrieves the correct operation template based on
the current bus interface (currently only single SDR, will soon be
extended to octal DTR) and fills it with the usual parameters.

This macro makes the transition from calling directly the low-level
macros into using the (bus interface dependent) templates very smooth.
Use it in all places that can be trivially converted. At this stage
there is no functional change expected, until octal DTR support gets
added.

Reviewed-by: Tudor Ambarus <tudor.ambarus@linaro.org>
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
drivers/mtd/nand/spi/core.c
drivers/mtd/nand/spi/esmt.c
drivers/mtd/nand/spi/gigadevice.c
drivers/mtd/nand/spi/macronix.c
drivers/mtd/nand/spi/micron.c
drivers/mtd/nand/spi/toshiba.c
drivers/mtd/nand/spi/winbond.c
include/linux/mtd/spinand.h

index 4ab63d7fc461da9f84099410f28dcece898881a5..7146eec51afaae21f08a89cffb27f1226c567e3c 100644 (file)
 #include <linux/spi/spi.h>
 #include <linux/spi/spi-mem.h>
 
+static struct spi_mem_op
+spinand_fill_reset_op(struct spinand_device *spinand)
+{
+       return spinand->op_templates->reset;
+}
+
+static struct spi_mem_op
+spinand_fill_readid_op(struct spinand_device *spinand,
+                      u8 naddr, u8 ndummy, void *buf, unsigned int len)
+{
+       struct spi_mem_op op = spinand->op_templates->readid;
+
+       op.addr.nbytes = naddr;
+       op.dummy.nbytes = ndummy;
+       op.data.buf.in = buf;
+       op.data.nbytes = len;
+
+       return op;
+}
+
+struct spi_mem_op
+spinand_fill_wr_en_op(struct spinand_device *spinand)
+{
+       return spinand->op_templates->wr_en;
+}
+
+static __maybe_unused struct spi_mem_op
+spinand_fill_wr_dis_op(struct spinand_device *spinand)
+{
+       return spinand->op_templates->wr_dis;
+}
+
+struct spi_mem_op
+spinand_fill_set_feature_op(struct spinand_device *spinand, u64 reg, const void *valptr)
+{
+       struct spi_mem_op op = spinand->op_templates->set_feature;
+
+       op.addr.val = reg;
+       op.data.buf.out = valptr;
+
+       return op;
+}
+
+struct spi_mem_op
+spinand_fill_get_feature_op(struct spinand_device *spinand, u64 reg, void *valptr)
+{
+       struct spi_mem_op op = spinand->op_templates->get_feature;
+
+       op.addr.val = reg;
+       op.data.buf.in = valptr;
+
+       return op;
+}
+
+static struct spi_mem_op
+spinand_fill_blk_erase_op(struct spinand_device *spinand, u64 addr)
+{
+       struct spi_mem_op op = spinand->op_templates->blk_erase;
+
+       op.addr.val = addr;
+
+       return op;
+}
+
+static struct spi_mem_op
+spinand_fill_page_read_op(struct spinand_device *spinand, u64 addr)
+{
+       struct spi_mem_op op = spinand->op_templates->page_read;
+
+       op.addr.val = addr;
+
+       return op;
+}
+
+struct spi_mem_op
+spinand_fill_prog_exec_op(struct spinand_device *spinand, u64 addr)
+{
+       struct spi_mem_op op = spinand->op_templates->prog_exec;
+
+       op.addr.val = addr;
+
+       return op;
+}
+
 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);
+       struct spi_mem_op op = SPINAND_OP(spinand, get_feature,
+                                         reg, spinand->scratchbuf);
        int ret;
 
        ret = spi_mem_exec_op(spinand->spimem, &op);
@@ -36,8 +120,8 @@ 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)
 {
-       struct spi_mem_op op = SPINAND_SET_FEATURE_1S_1S_1S_OP(reg,
-                                                     spinand->scratchbuf);
+       struct spi_mem_op op = SPINAND_OP(spinand, set_feature,
+                                         reg, spinand->scratchbuf);
 
        *spinand->scratchbuf = val;
        return spi_mem_exec_op(spinand->spimem, &op);
@@ -362,7 +446,7 @@ static void spinand_ondie_ecc_save_status(struct nand_device *nand, u8 status)
 
 int spinand_write_enable_op(struct spinand_device *spinand)
 {
-       struct spi_mem_op op = SPINAND_WR_EN_1S_0_0_OP;
+       struct spi_mem_op op = SPINAND_OP(spinand, wr_en);
 
        return spi_mem_exec_op(spinand->spimem, &op);
 }
@@ -372,7 +456,7 @@ static int spinand_load_page_op(struct spinand_device *spinand,
 {
        struct nand_device *nand = spinand_to_nand(spinand);
        unsigned int row = nanddev_pos_to_row(nand, &req->pos);
-       struct spi_mem_op op = SPINAND_PAGE_READ_1S_1S_0_OP(row);
+       struct spi_mem_op op = SPINAND_OP(spinand, page_read, row);
 
        return spi_mem_exec_op(spinand->spimem, &op);
 }
@@ -527,7 +611,7 @@ static int spinand_program_op(struct spinand_device *spinand,
 {
        struct nand_device *nand = spinand_to_nand(spinand);
        unsigned int row = nanddev_pos_to_row(nand, &req->pos);
-       struct spi_mem_op op = SPINAND_PROG_EXEC_1S_1S_0_OP(row);
+       struct spi_mem_op op = SPINAND_OP(spinand, prog_exec, row);
 
        return spi_mem_exec_op(spinand->spimem, &op);
 }
@@ -537,7 +621,7 @@ static int spinand_erase_op(struct spinand_device *spinand,
 {
        struct nand_device *nand = spinand_to_nand(spinand);
        unsigned int row = nanddev_pos_to_row(nand, pos);
-       struct spi_mem_op op = SPINAND_BLK_ERASE_1S_1S_0_OP(row);
+       struct spi_mem_op op = SPINAND_OP(spinand, blk_erase, row);
 
        return spi_mem_exec_op(spinand->spimem, &op);
 }
@@ -557,8 +641,8 @@ static int spinand_erase_op(struct spinand_device *spinand,
 int spinand_wait(struct spinand_device *spinand, unsigned long initial_delay_us,
                 unsigned long poll_delay_us, u8 *s)
 {
-       struct spi_mem_op op = SPINAND_GET_FEATURE_1S_1S_1S_OP(REG_STATUS,
-                                                              spinand->scratchbuf);
+       struct spi_mem_op op = SPINAND_OP(spinand, get_feature,
+                                         REG_STATUS, spinand->scratchbuf);
        u8 status;
        int ret;
 
@@ -591,8 +675,8 @@ out:
 static int spinand_read_id_op(struct spinand_device *spinand, u8 naddr,
                              u8 ndummy, u8 *buf)
 {
-       struct spi_mem_op op = SPINAND_READID_1S_1S_1S_OP(
-               naddr, ndummy, spinand->scratchbuf, SPINAND_MAX_ID_LEN);
+       struct spi_mem_op op = SPINAND_OP(spinand, readid,
+                                         naddr, ndummy, spinand->scratchbuf, SPINAND_MAX_ID_LEN);
        int ret;
 
        ret = spi_mem_exec_op(spinand->spimem, &op);
@@ -604,7 +688,7 @@ static int spinand_read_id_op(struct spinand_device *spinand, u8 naddr,
 
 static int spinand_reset_op(struct spinand_device *spinand)
 {
-       struct spi_mem_op op = SPINAND_RESET_1S_0_0_OP;
+       struct spi_mem_op op = SPINAND_OP(spinand, reset);
        int ret;
 
        ret = spi_mem_exec_op(spinand->spimem, &op);
index adadc01e8f2fdd4ec8edf055acc3404c88050037..3020aa89a495fd7e19a6ff88d2ce68f20bd98622 100644 (file)
@@ -138,8 +138,8 @@ static int f50l1g41lb_user_otp_info(struct spinand_device *spinand, size_t len,
 static int f50l1g41lb_otp_lock(struct spinand_device *spinand, loff_t from,
                               size_t len)
 {
-       struct spi_mem_op write_op = SPINAND_WR_EN_1S_0_0_OP;
-       struct spi_mem_op exec_op = SPINAND_PROG_EXEC_1S_1S_0_OP(0);
+       struct spi_mem_op write_op = SPINAND_OP(spinand, wr_en);
+       struct spi_mem_op exec_op = SPINAND_OP(spinand, prog_exec, 0);
        u8 status;
        int ret;
 
index 72ad36c9a12693caf863b0d172d4a1f2ac4d5ecd..e4380208edd09445c44a29bb7dd2012a0bb1a1b0 100644 (file)
@@ -266,8 +266,8 @@ static int gd5fxgq4uexxg_ecc_get_status(struct spinand_device *spinand,
                                        u8 status)
 {
        u8 status2;
-       struct spi_mem_op op = SPINAND_GET_FEATURE_1S_1S_1S_OP(GD5FXGQXXEXXG_REG_STATUS2,
-                                                     spinand->scratchbuf);
+       struct spi_mem_op op = SPINAND_OP(spinand, get_feature,
+                                         GD5FXGQXXEXXG_REG_STATUS2, spinand->scratchbuf);
        int ret;
 
        switch (status & STATUS_ECC_MASK) {
@@ -309,8 +309,8 @@ static int gd5fxgq5xexxg_ecc_get_status(struct spinand_device *spinand,
                                        u8 status)
 {
        u8 status2;
-       struct spi_mem_op op = SPINAND_GET_FEATURE_1S_1S_1S_OP(GD5FXGQXXEXXG_REG_STATUS2,
-                                                     spinand->scratchbuf);
+       struct spi_mem_op op = SPINAND_OP(spinand, get_feature,
+                                         GD5FXGQXXEXXG_REG_STATUS2, spinand->scratchbuf);
        int ret;
 
        switch (status & STATUS_ECC_MASK) {
index edf63b9996cf029fffa4948566c7afda77d97cee..143cc120bdec1300f8fe60e951c4da9174668677 100644 (file)
@@ -148,8 +148,8 @@ static int macronix_set_cont_read(struct spinand_device *spinand, bool enable)
 static int macronix_set_read_retry(struct spinand_device *spinand,
                                             unsigned int retry_mode)
 {
-       struct spi_mem_op op = SPINAND_SET_FEATURE_1S_1S_1S_OP(MACRONIX_FEATURE_ADDR_READ_RETRY,
-                                                              spinand->scratchbuf);
+       struct spi_mem_op op = SPINAND_OP(spinand, set_feature,
+                                         MACRONIX_FEATURE_ADDR_READ_RETRY, spinand->scratchbuf);
 
        *spinand->scratchbuf = retry_mode;
        return spi_mem_exec_op(spinand->spimem, &op);
index b8130e04e8e798519ad38c58b5569935c1a447a2..36f6cbbd7462c0c5c208a28acae6e64e1af954da 100644 (file)
@@ -137,8 +137,8 @@ static const struct mtd_ooblayout_ops micron_4_ooblayout = {
 static int micron_select_target(struct spinand_device *spinand,
                                unsigned int target)
 {
-       struct spi_mem_op op = SPINAND_SET_FEATURE_1S_1S_1S_OP(MICRON_DIE_SELECT_REG,
-                                                     spinand->scratchbuf);
+       struct spi_mem_op op = SPINAND_OP(spinand, set_feature,
+                                         MICRON_DIE_SELECT_REG, spinand->scratchbuf);
 
        if (target > 1)
                return -EINVAL;
@@ -251,8 +251,8 @@ static int mt29f2g01abagd_user_otp_info(struct spinand_device *spinand,
 static int mt29f2g01abagd_otp_lock(struct spinand_device *spinand, loff_t from,
                                   size_t len)
 {
-       struct spi_mem_op write_op = SPINAND_WR_EN_1S_0_0_OP;
-       struct spi_mem_op exec_op = SPINAND_PROG_EXEC_1S_1S_0_OP(0);
+       struct spi_mem_op write_op = SPINAND_OP(spinand, wr_en);
+       struct spi_mem_op exec_op = SPINAND_OP(spinand, prog_exec, 0);
        u8 status;
        int ret;
 
index 6530257ac0beddf8b9e5a9591c5f5ccc4803c003..ef649162ee680c2d7db9dc9332e705265bc8f234 100644 (file)
@@ -73,7 +73,8 @@ static int tx58cxgxsxraix_ecc_get_status(struct spinand_device *spinand,
 {
        struct nand_device *nand = spinand_to_nand(spinand);
        u8 mbf = 0;
-       struct spi_mem_op op = SPINAND_GET_FEATURE_1S_1S_1S_OP(0x30, spinand->scratchbuf);
+       struct spi_mem_op op = SPINAND_OP(spinand, get_feature,
+                                         0x30, spinand->scratchbuf);
 
        switch (status & STATUS_ECC_MASK) {
        case STATUS_ECC_NO_BITFLIPS:
index d5799c2df06520de6cb5c5b771ceeb9d11ddf1fb..bfec5d037f25b81a3c90feba666fe8283a41ddb1 100644 (file)
@@ -251,7 +251,8 @@ static int w25n02kv_ecc_get_status(struct spinand_device *spinand,
 {
        struct nand_device *nand = spinand_to_nand(spinand);
        u8 mbf = 0;
-       struct spi_mem_op op = SPINAND_GET_FEATURE_1S_1S_1S_OP(0x30, spinand->scratchbuf);
+       struct spi_mem_op op = SPINAND_OP(spinand, get_feature,
+                                         0x30, spinand->scratchbuf);
 
        switch (status & STATUS_ECC_MASK) {
        case STATUS_ECC_NO_BITFLIPS:
index a458617fb3755f28483f4d331fa5fa38a70d20c0..553c56a389d2eededfedae1413b73cac1aa2cd34 100644 (file)
@@ -703,6 +703,14 @@ struct spinand_device {
                             unsigned int retry_mode);
 };
 
+struct spi_mem_op spinand_fill_wr_en_op(struct spinand_device *spinand);
+struct spi_mem_op spinand_fill_set_feature_op(struct spinand_device *spinand, u64 reg, const void *valptr);
+struct spi_mem_op spinand_fill_get_feature_op(struct spinand_device *spinand, u64 reg, void *valptr);
+struct spi_mem_op spinand_fill_prog_exec_op(struct spinand_device *spinand, u64 addr);
+
+#define SPINAND_OP(spinand, op_name, ...)                      \
+       spinand_fill_ ## op_name ## _op(spinand, ##__VA_ARGS__)
+
 /**
  * mtd_to_spinand() - Get the SPI NAND device attached to an MTD instance
  * @mtd: MTD instance