]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
spi: spi-mem: Transform the read operation template
authorMiquel Raynal <miquel.raynal@bootlin.com>
Wed, 29 Apr 2026 17:56:41 +0000 (19:56 +0200)
committerMiquel Raynal <miquel.raynal@bootlin.com>
Mon, 4 May 2026 13:02:07 +0000 (15:02 +0200)
As of now, we only use a single operation template when creating SPI
memory direct mappings. With the idea to extend this possibility to 2,
rename the template to reflect that we are currently setting the
"primary" operation, and create a pointer in the same structure to point
to it.

From a user point of view, the op_tmpl name remains but becomes a
pointer, leading to minor changes in both the SPI NAND and SPI NOR
cores.

There is no functional change.

Acked-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
13 files changed:
drivers/mtd/nand/spi/core.c
drivers/mtd/spi-nor/core.c
drivers/spi/spi-airoha-snfi.c
drivers/spi/spi-aspeed-smc.c
drivers/spi/spi-intel.c
drivers/spi/spi-mem.c
drivers/spi/spi-mxic.c
drivers/spi/spi-npcm-fiu.c
drivers/spi/spi-rpc-if.c
drivers/spi/spi-stm32-ospi.c
drivers/spi/spi-stm32-qspi.c
drivers/spi/spi-wpcm-fiu.c
include/linux/spi/spi-mem.h

index 0f154260e70fce6e941548b0346f764dd703e71c..b4c1410d5d8a4f511e4cbe6fafe8c64426d1fefd 100644 (file)
@@ -491,9 +491,9 @@ static int spinand_read_from_cache_op(struct spinand_device *spinand,
 
        if (nand->ecc.engine->integration == NAND_ECC_ENGINE_INTEGRATION_PIPELINED &&
            req->mode != MTD_OPS_RAW)
-               rdesc->info.op_tmpl.data.ecc = true;
+               rdesc->info.op_tmpl->data.ecc = true;
        else
-               rdesc->info.op_tmpl.data.ecc = false;
+               rdesc->info.op_tmpl->data.ecc = false;
 
        if (spinand->flags & SPINAND_HAS_READ_PLANE_SELECT_BIT)
                column |= req->pos.plane << fls(nanddev_page_size(nand));
@@ -586,9 +586,9 @@ static int spinand_write_to_cache_op(struct spinand_device *spinand,
 
        if (nand->ecc.engine->integration == NAND_ECC_ENGINE_INTEGRATION_PIPELINED &&
            req->mode != MTD_OPS_RAW)
-               wdesc->info.op_tmpl.data.ecc = true;
+               wdesc->info.op_tmpl->data.ecc = true;
        else
-               wdesc->info.op_tmpl.data.ecc = false;
+               wdesc->info.op_tmpl->data.ecc = false;
 
        if (spinand->flags & SPINAND_HAS_PROG_PLANE_SELECT_BIT)
                column |= req->pos.plane << fls(nanddev_page_size(nand));
@@ -1247,7 +1247,8 @@ static int spinand_create_dirmap(struct spinand_device *spinand,
 
        /* Write descriptor */
        info.length = nanddev_page_size(nand) + nanddev_per_page_oobsize(nand);
-       info.op_tmpl.data.ecc = enable_ecc;
+       info.primary_op_tmpl = *spinand->op_templates->update_cache;
+       info.primary_op_tmpl.data.ecc = enable_ecc;
        desc = devm_spi_mem_dirmap_create(&spinand->spimem->spi->dev,
                                          spinand->spimem, &info);
        if (IS_ERR(desc))
@@ -1256,8 +1257,8 @@ static int spinand_create_dirmap(struct spinand_device *spinand,
        spinand->dirmaps[plane].wdesc = desc;
 
        /* Read descriptor */
-       info.op_tmpl = *spinand->op_templates->read_cache;
-       info.op_tmpl.data.ecc = enable_ecc;
+       info.primary_op_tmpl = *spinand->op_templates->read_cache;
+       info.primary_op_tmpl.data.ecc = enable_ecc;
        desc = spinand_create_rdesc(spinand, &info);
        if (IS_ERR(desc))
                return PTR_ERR(desc);
index 5dd0b3cb52503300483c4f06926c742ae2794613..a7bc458edc5cd86e506ceac6e620a5dbeb62b630 100644 (file)
@@ -3641,14 +3641,15 @@ EXPORT_SYMBOL_GPL(spi_nor_scan);
 static int spi_nor_create_read_dirmap(struct spi_nor *nor)
 {
        struct spi_mem_dirmap_info info = {
-               .op_tmpl = SPI_MEM_OP(SPI_MEM_OP_CMD(nor->read_opcode, 0),
-                                     SPI_MEM_OP_ADDR(nor->addr_nbytes, 0, 0),
-                                     SPI_MEM_OP_DUMMY(nor->read_dummy, 0),
-                                     SPI_MEM_OP_DATA_IN(0, NULL, 0)),
+               .op_tmpl = &info.primary_op_tmpl,
+               .primary_op_tmpl = SPI_MEM_OP(SPI_MEM_OP_CMD(nor->read_opcode, 0),
+                                             SPI_MEM_OP_ADDR(nor->addr_nbytes, 0, 0),
+                                             SPI_MEM_OP_DUMMY(nor->read_dummy, 0),
+                                             SPI_MEM_OP_DATA_IN(0, NULL, 0)),
                .offset = 0,
                .length = nor->params->size,
        };
-       struct spi_mem_op *op = &info.op_tmpl;
+       struct spi_mem_op *op = info.op_tmpl;
 
        spi_nor_spimem_setup_op(nor, op, nor->read_proto);
 
@@ -3672,14 +3673,15 @@ static int spi_nor_create_read_dirmap(struct spi_nor *nor)
 static int spi_nor_create_write_dirmap(struct spi_nor *nor)
 {
        struct spi_mem_dirmap_info info = {
-               .op_tmpl = SPI_MEM_OP(SPI_MEM_OP_CMD(nor->program_opcode, 0),
-                                     SPI_MEM_OP_ADDR(nor->addr_nbytes, 0, 0),
-                                     SPI_MEM_OP_NO_DUMMY,
-                                     SPI_MEM_OP_DATA_OUT(0, NULL, 0)),
+               .op_tmpl = &info.primary_op_tmpl,
+               .primary_op_tmpl = SPI_MEM_OP(SPI_MEM_OP_CMD(nor->program_opcode, 0),
+                                             SPI_MEM_OP_ADDR(nor->addr_nbytes, 0, 0),
+                                             SPI_MEM_OP_NO_DUMMY,
+                                             SPI_MEM_OP_DATA_OUT(0, NULL, 0)),
                .offset = 0,
                .length = nor->params->size,
        };
-       struct spi_mem_op *op = &info.op_tmpl;
+       struct spi_mem_op *op = info.op_tmpl;
 
        if (nor->program_opcode == SPINOR_OP_AAI_WP && nor->sst_write_second)
                op->addr.nbytes = 0;
index 7b6c09f91fef900e56fa61a2c0873f52281ad62c..95bfde7c8e7f26b687a8b18f0d45942f03e59876 100644 (file)
@@ -546,7 +546,7 @@ static int airoha_snand_dirmap_create(struct spi_mem_dirmap_desc *desc)
        if (desc->info.length > SPI_NAND_CACHE_SIZE)
                return -E2BIG;
 
-       if (!airoha_snand_supports_op(desc->mem, &desc->info.op_tmpl))
+       if (!airoha_snand_supports_op(desc->mem, desc->info.op_tmpl))
                return -EOPNOTSUPP;
 
        return 0;
@@ -572,7 +572,7 @@ static ssize_t airoha_snand_dirmap_read(struct spi_mem_dirmap_desc *desc,
         * DUALIO and QUADIO opcodes are not supported by the spi controller,
         * replace them with supported opcodes.
         */
-       opcode = desc->info.op_tmpl.cmd.opcode;
+       opcode = desc->info.op_tmpl->cmd.opcode;
        switch (opcode) {
        case SPI_NAND_OP_READ_FROM_CACHE_SINGLE:
        case SPI_NAND_OP_READ_FROM_CACHE_SINGLE_FAST:
@@ -761,7 +761,7 @@ static ssize_t airoha_snand_dirmap_write(struct spi_mem_dirmap_desc *desc,
        /* minimum oob size is 64 */
        bytes = round_up(offs + len, 64);
 
-       opcode = desc->info.op_tmpl.cmd.opcode;
+       opcode = desc->info.op_tmpl->cmd.opcode;
        switch (opcode) {
        case SPI_NAND_OP_PROGRAM_LOAD_SINGLE:
        case SPI_NAND_OP_PROGRAM_LOAD_RAMDOM_SINGLE:
index c21323e07d3cad5d0e1997022311e9d7408ab10b..c20a33734f5c9c702753c0bdfa9b3d26fdf2bcef 100644 (file)
@@ -697,7 +697,7 @@ static int aspeed_spi_dirmap_create(struct spi_mem_dirmap_desc *desc)
 {
        struct aspeed_spi *aspi = spi_controller_get_devdata(desc->mem->spi->controller);
        struct aspeed_spi_chip *chip = &aspi->chips[spi_get_chipselect(desc->mem->spi, 0)];
-       struct spi_mem_op *op = &desc->info.op_tmpl;
+       struct spi_mem_op *op = desc->info.op_tmpl;
        u32 ctl_val;
        int ret = 0;
 
@@ -769,7 +769,7 @@ static ssize_t aspeed_spi_dirmap_read(struct spi_mem_dirmap_desc *desc,
        if (chip->ahb_window_size < offset + len || chip->force_user_mode) {
                int ret;
 
-               ret = aspeed_spi_read_user(chip, &desc->info.op_tmpl, offset, len, buf);
+               ret = aspeed_spi_read_user(chip, desc->info.op_tmpl, offset, len, buf);
                if (ret < 0)
                        return ret;
        } else {
index 1775ad39e6339f34efc780c677ff19dd10614564..7494b921a743a9c93b3f052155fc243cadfd73cb 100644 (file)
@@ -814,7 +814,7 @@ static int intel_spi_dirmap_create(struct spi_mem_dirmap_desc *desc)
        struct intel_spi *ispi = spi_controller_get_devdata(desc->mem->spi->controller);
        const struct intel_spi_mem_op *iop;
 
-       iop = intel_spi_match_mem_op(ispi, &desc->info.op_tmpl);
+       iop = intel_spi_match_mem_op(ispi, desc->info.op_tmpl);
        if (!iop)
                return -EOPNOTSUPP;
 
@@ -827,7 +827,7 @@ static ssize_t intel_spi_dirmap_read(struct spi_mem_dirmap_desc *desc, u64 offs,
 {
        struct intel_spi *ispi = spi_controller_get_devdata(desc->mem->spi->controller);
        const struct intel_spi_mem_op *iop = desc->priv;
-       struct spi_mem_op op = desc->info.op_tmpl;
+       struct spi_mem_op op = *desc->info.op_tmpl;
        int ret;
 
        /* Fill in the gaps */
@@ -844,7 +844,7 @@ static ssize_t intel_spi_dirmap_write(struct spi_mem_dirmap_desc *desc, u64 offs
 {
        struct intel_spi *ispi = spi_controller_get_devdata(desc->mem->spi->controller);
        const struct intel_spi_mem_op *iop = desc->priv;
-       struct spi_mem_op op = desc->info.op_tmpl;
+       struct spi_mem_op op = *desc->info.op_tmpl;
        int ret;
 
        op.addr.val = offs;
index a09371a075d2ec23328774807ed6855653bb3320..e2eaa1ba4ff600a6a13b3e82449563897ec884fb 100644 (file)
@@ -647,7 +647,7 @@ EXPORT_SYMBOL_GPL(spi_mem_calc_op_duration);
 static ssize_t spi_mem_no_dirmap_read(struct spi_mem_dirmap_desc *desc,
                                      u64 offs, size_t len, void *buf)
 {
-       struct spi_mem_op op = desc->info.op_tmpl;
+       struct spi_mem_op op = *desc->info.op_tmpl;
        int ret;
 
        op.addr.val = desc->info.offset + offs;
@@ -667,7 +667,7 @@ static ssize_t spi_mem_no_dirmap_read(struct spi_mem_dirmap_desc *desc,
 static ssize_t spi_mem_no_dirmap_write(struct spi_mem_dirmap_desc *desc,
                                       u64 offs, size_t len, const void *buf)
 {
-       struct spi_mem_op op = desc->info.op_tmpl;
+       struct spi_mem_op op = *desc->info.op_tmpl;
        int ret;
 
        op.addr.val = desc->info.offset + offs;
@@ -706,11 +706,11 @@ spi_mem_dirmap_create(struct spi_mem *mem,
        int ret = -ENOTSUPP;
 
        /* Make sure the number of address cycles is between 1 and 8 bytes. */
-       if (!info->op_tmpl.addr.nbytes || info->op_tmpl.addr.nbytes > 8)
+       if (!info->primary_op_tmpl.addr.nbytes || info->primary_op_tmpl.addr.nbytes > 8)
                return ERR_PTR(-EINVAL);
 
        /* data.dir should either be SPI_MEM_DATA_IN or SPI_MEM_DATA_OUT. */
-       if (info->op_tmpl.data.dir == SPI_MEM_NO_DATA)
+       if (info->primary_op_tmpl.data.dir == SPI_MEM_NO_DATA)
                return ERR_PTR(-EINVAL);
 
        desc = kzalloc_obj(*desc);
@@ -719,6 +719,7 @@ spi_mem_dirmap_create(struct spi_mem *mem,
 
        desc->mem = mem;
        desc->info = *info;
+       desc->info.op_tmpl = &desc->info.primary_op_tmpl;
        if (ctlr->mem_ops && ctlr->mem_ops->dirmap_create) {
                ret = spi_mem_access_start(mem);
                if (ret) {
@@ -733,7 +734,7 @@ spi_mem_dirmap_create(struct spi_mem *mem,
 
        if (ret) {
                desc->nodirmap = true;
-               if (!spi_mem_supports_op(desc->mem, &desc->info.op_tmpl))
+               if (!spi_mem_supports_op(desc->mem, &desc->info.primary_op_tmpl))
                        ret = -EOPNOTSUPP;
                else
                        ret = 0;
@@ -857,7 +858,7 @@ ssize_t spi_mem_dirmap_read(struct spi_mem_dirmap_desc *desc,
        struct spi_controller *ctlr = desc->mem->spi->controller;
        ssize_t ret;
 
-       if (desc->info.op_tmpl.data.dir != SPI_MEM_DATA_IN)
+       if (desc->info.op_tmpl->data.dir != SPI_MEM_DATA_IN)
                return -EINVAL;
 
        if (!len)
@@ -903,7 +904,7 @@ ssize_t spi_mem_dirmap_write(struct spi_mem_dirmap_desc *desc,
        struct spi_controller *ctlr = desc->mem->spi->controller;
        ssize_t ret;
 
-       if (desc->info.op_tmpl.data.dir != SPI_MEM_DATA_OUT)
+       if (desc->info.op_tmpl->data.dir != SPI_MEM_DATA_OUT)
                return -EINVAL;
 
        if (!len)
index b0e7fc828a5098c4857ccbfac9478300f9747b54..83b688e6528412b4b731f3790025d9db335ddb0a 100644 (file)
@@ -403,20 +403,20 @@ static ssize_t mxic_spi_mem_dirmap_read(struct spi_mem_dirmap_desc *desc,
        if (WARN_ON(offs + desc->info.offset + len > U32_MAX))
                return -EINVAL;
 
-       writel(mxic_spi_prep_hc_cfg(desc->mem->spi, 0, desc->info.op_tmpl.data.swap16),
+       writel(mxic_spi_prep_hc_cfg(desc->mem->spi, 0, desc->info.op_tmpl->data.swap16),
               mxic->regs + HC_CFG);
 
-       writel(mxic_spi_mem_prep_op_cfg(&desc->info.op_tmpl, len),
+       writel(mxic_spi_mem_prep_op_cfg(desc->info.op_tmpl, len),
               mxic->regs + LRD_CFG);
        writel(desc->info.offset + offs, mxic->regs + LRD_ADDR);
        len = min_t(size_t, len, mxic->linear.size);
        writel(len, mxic->regs + LRD_RANGE);
-       writel(LMODE_CMD0(desc->info.op_tmpl.cmd.opcode) |
+       writel(LMODE_CMD0(desc->info.op_tmpl->cmd.opcode) |
               LMODE_SLV_ACT(spi_get_chipselect(desc->mem->spi, 0)) |
               LMODE_EN,
               mxic->regs + LRD_CTRL);
 
-       if (mxic->ecc.use_pipelined_conf && desc->info.op_tmpl.data.ecc) {
+       if (mxic->ecc.use_pipelined_conf && desc->info.op_tmpl->data.ecc) {
                ret = mxic_ecc_process_data_pipelined(mxic->ecc.pipelined_engine,
                                                      NAND_PAGE_READ,
                                                      mxic->linear.dma + offs);
@@ -448,20 +448,20 @@ static ssize_t mxic_spi_mem_dirmap_write(struct spi_mem_dirmap_desc *desc,
        if (WARN_ON(offs + desc->info.offset + len > U32_MAX))
                return -EINVAL;
 
-       writel(mxic_spi_prep_hc_cfg(desc->mem->spi, 0, desc->info.op_tmpl.data.swap16),
+       writel(mxic_spi_prep_hc_cfg(desc->mem->spi, 0, desc->info.op_tmpl->data.swap16),
               mxic->regs + HC_CFG);
 
-       writel(mxic_spi_mem_prep_op_cfg(&desc->info.op_tmpl, len),
+       writel(mxic_spi_mem_prep_op_cfg(desc->info.op_tmpl, len),
               mxic->regs + LWR_CFG);
        writel(desc->info.offset + offs, mxic->regs + LWR_ADDR);
        len = min_t(size_t, len, mxic->linear.size);
        writel(len, mxic->regs + LWR_RANGE);
-       writel(LMODE_CMD0(desc->info.op_tmpl.cmd.opcode) |
+       writel(LMODE_CMD0(desc->info.op_tmpl->cmd.opcode) |
               LMODE_SLV_ACT(spi_get_chipselect(desc->mem->spi, 0)) |
               LMODE_EN,
               mxic->regs + LWR_CTRL);
 
-       if (mxic->ecc.use_pipelined_conf && desc->info.op_tmpl.data.ecc) {
+       if (mxic->ecc.use_pipelined_conf && desc->info.op_tmpl->data.ecc) {
                ret = mxic_ecc_process_data_pipelined(mxic->ecc.pipelined_engine,
                                                      NAND_PAGE_WRITE,
                                                      mxic->linear.dma + offs);
@@ -509,7 +509,7 @@ static int mxic_spi_mem_dirmap_create(struct spi_mem_dirmap_desc *desc)
        if (desc->info.offset + desc->info.length > U32_MAX)
                return -EINVAL;
 
-       if (!mxic_spi_mem_supports_op(desc->mem, &desc->info.op_tmpl))
+       if (!mxic_spi_mem_supports_op(desc->mem, desc->info.op_tmpl))
                return -EOPNOTSUPP;
 
        return 0;
index 6617751009c3056220e4d15b42a7f4775462c6f4..4b825044038b2b7ef5cb23be941489411700eeda 100644 (file)
@@ -299,11 +299,11 @@ static ssize_t npcm_fiu_direct_read(struct spi_mem_dirmap_desc *desc,
                for (i = 0 ; i < len ; i++)
                        *(buf_rx + i) = ioread8(src + i);
        } else {
-               if (desc->info.op_tmpl.addr.buswidth != fiu->drd_op.addr.buswidth ||
-                   desc->info.op_tmpl.dummy.nbytes != fiu->drd_op.dummy.nbytes ||
-                   desc->info.op_tmpl.cmd.opcode != fiu->drd_op.cmd.opcode ||
-                   desc->info.op_tmpl.addr.nbytes != fiu->drd_op.addr.nbytes)
-                       npcm_fiu_set_drd(fiu, &desc->info.op_tmpl);
+               if (desc->info.op_tmpl->addr.buswidth != fiu->drd_op.addr.buswidth ||
+                   desc->info.op_tmpl->dummy.nbytes != fiu->drd_op.dummy.nbytes ||
+                   desc->info.op_tmpl->cmd.opcode != fiu->drd_op.cmd.opcode ||
+                   desc->info.op_tmpl->addr.nbytes != fiu->drd_op.addr.nbytes)
+                       npcm_fiu_set_drd(fiu, desc->info.op_tmpl);
 
                memcpy_fromio(buf_rx, src, len);
        }
@@ -609,7 +609,7 @@ static int npcm_fiu_dirmap_create(struct spi_mem_dirmap_desc *desc)
        }
 
        if (!fiu->spix_mode &&
-           desc->info.op_tmpl.data.dir == SPI_MEM_DATA_OUT) {
+           desc->info.op_tmpl->data.dir == SPI_MEM_DATA_OUT) {
                desc->nodirmap = true;
                return 0;
        }
@@ -644,9 +644,9 @@ static int npcm_fiu_dirmap_create(struct spi_mem_dirmap_desc *desc)
                                   NPCM_FIU_CFG_FIU_FIX);
        }
 
-       if (desc->info.op_tmpl.data.dir == SPI_MEM_DATA_IN) {
+       if (desc->info.op_tmpl->data.dir == SPI_MEM_DATA_IN) {
                if (!fiu->spix_mode)
-                       npcm_fiu_set_drd(fiu, &desc->info.op_tmpl);
+                       npcm_fiu_set_drd(fiu, desc->info.op_tmpl);
                else
                        npcm_fiux_set_direct_rd(fiu);
 
index 6edc0c4db854dbb493f8d0539c3c78483f886849..1ef7bd91b3b37245ef2117132f98bfa6eba6d4f0 100644 (file)
@@ -83,7 +83,7 @@ static ssize_t xspi_spi_mem_dirmap_write(struct spi_mem_dirmap_desc *desc,
        if (offs + desc->info.offset + len > U32_MAX)
                return -EINVAL;
 
-       rpcif_spi_mem_prepare(desc->mem->spi, &desc->info.op_tmpl, &offs, &len);
+       rpcif_spi_mem_prepare(desc->mem->spi, desc->info.op_tmpl, &offs, &len);
 
        return xspi_dirmap_write(rpc->dev, offs, len, buf);
 }
@@ -97,7 +97,7 @@ static ssize_t rpcif_spi_mem_dirmap_read(struct spi_mem_dirmap_desc *desc,
        if (offs + desc->info.offset + len > U32_MAX)
                return -EINVAL;
 
-       rpcif_spi_mem_prepare(desc->mem->spi, &desc->info.op_tmpl, &offs, &len);
+       rpcif_spi_mem_prepare(desc->mem->spi, desc->info.op_tmpl, &offs, &len);
 
        return rpcif_dirmap_read(rpc->dev, offs, len, buf);
 }
@@ -110,13 +110,13 @@ static int rpcif_spi_mem_dirmap_create(struct spi_mem_dirmap_desc *desc)
        if (desc->info.offset + desc->info.length > U32_MAX)
                return -EINVAL;
 
-       if (!rpcif_spi_mem_supports_op(desc->mem, &desc->info.op_tmpl))
+       if (!rpcif_spi_mem_supports_op(desc->mem, desc->info.op_tmpl))
                return -EOPNOTSUPP;
 
        if (!rpc->dirmap)
                return -EOPNOTSUPP;
 
-       if (!rpc->xspi && desc->info.op_tmpl.data.dir != SPI_MEM_DATA_IN)
+       if (!rpc->xspi && desc->info.op_tmpl->data.dir != SPI_MEM_DATA_IN)
                return -EOPNOTSUPP;
 
        return 0;
index 4461c6e24b9edcafac2139112f596eee62d7247e..5f5b3cd5d7256bd34a4a708159726cb279321450 100644 (file)
@@ -602,11 +602,11 @@ static int stm32_ospi_dirmap_create(struct spi_mem_dirmap_desc *desc)
 {
        struct stm32_ospi *ospi = spi_controller_get_devdata(desc->mem->spi->controller);
 
-       if (desc->info.op_tmpl.data.dir == SPI_MEM_DATA_OUT)
+       if (desc->info.op_tmpl->data.dir == SPI_MEM_DATA_OUT)
                return -EOPNOTSUPP;
 
        /* Should never happen, as mm_base == null is an error probe exit condition */
-       if (!ospi->mm_base && desc->info.op_tmpl.data.dir == SPI_MEM_DATA_IN)
+       if (!ospi->mm_base && desc->info.op_tmpl->data.dir == SPI_MEM_DATA_IN)
                return -EOPNOTSUPP;
 
        if (!ospi->mm_size)
@@ -633,7 +633,7 @@ static ssize_t stm32_ospi_dirmap_read(struct spi_mem_dirmap_desc *desc,
         * spi_mem_op template with offs, len and *buf in  order to get
         * all needed transfer information into struct spi_mem_op
         */
-       memcpy(&op, &desc->info.op_tmpl, sizeof(struct spi_mem_op));
+       memcpy(&op, desc->info.op_tmpl, sizeof(struct spi_mem_op));
        dev_dbg(ospi->dev, "%s len = 0x%zx offs = 0x%llx buf = 0x%p\n", __func__, len, offs, buf);
 
        op.data.nbytes = len;
index df1bbacec90a2b2d46a312a9b4cd6c1863a4a0a1..e2a6a6eaf9b2846beacf2723bf4bd6dd42c91982 100644 (file)
@@ -506,11 +506,11 @@ static int stm32_qspi_dirmap_create(struct spi_mem_dirmap_desc *desc)
 {
        struct stm32_qspi *qspi = spi_controller_get_devdata(desc->mem->spi->controller);
 
-       if (desc->info.op_tmpl.data.dir == SPI_MEM_DATA_OUT)
+       if (desc->info.op_tmpl->data.dir == SPI_MEM_DATA_OUT)
                return -EOPNOTSUPP;
 
        /* should never happen, as mm_base == null is an error probe exit condition */
-       if (!qspi->mm_base && desc->info.op_tmpl.data.dir == SPI_MEM_DATA_IN)
+       if (!qspi->mm_base && desc->info.op_tmpl->data.dir == SPI_MEM_DATA_IN)
                return -EOPNOTSUPP;
 
        if (!qspi->mm_size)
@@ -536,7 +536,7 @@ static ssize_t stm32_qspi_dirmap_read(struct spi_mem_dirmap_desc *desc,
         * spi_mem_op template with offs, len and *buf in  order to get
         * all needed transfer information into struct spi_mem_op
         */
-       memcpy(&op, &desc->info.op_tmpl, sizeof(struct spi_mem_op));
+       memcpy(&op, desc->info.op_tmpl, sizeof(struct spi_mem_op));
        dev_dbg(qspi->dev, "%s len = 0x%zx offs = 0x%llx buf = 0x%p\n", __func__, len, offs, buf);
 
        op.data.nbytes = len;
index 0e26ff1785056595395054ba78cac86d6602e1ed..cd78e927953dcf4933557f1d93d29225fe09d32f 100644 (file)
@@ -377,7 +377,7 @@ static int wpcm_fiu_dirmap_create(struct spi_mem_dirmap_desc *desc)
        struct wpcm_fiu_spi *fiu = spi_controller_get_devdata(desc->mem->spi->controller);
        int cs = spi_get_chipselect(desc->mem->spi, 0);
 
-       if (desc->info.op_tmpl.data.dir != SPI_MEM_DATA_IN)
+       if (desc->info.op_tmpl->data.dir != SPI_MEM_DATA_IN)
                return -EOPNOTSUPP;
 
        /*
index c8e207522223f2285174b9c584e6c6558415d6d5..9a96ddace3eb2f90ef06ce45945391b3edeb467d 100644 (file)
@@ -237,7 +237,8 @@ struct spi_mem_op {
  * direction is directly encoded in the ->op_tmpl.data.dir field.
  */
 struct spi_mem_dirmap_info {
-       struct spi_mem_op op_tmpl;
+       struct spi_mem_op *op_tmpl;
+       struct spi_mem_op primary_op_tmpl;
        u64 offset;
        u64 length;
 };