spi: airoha: unify dirmap read/write code

Makes dirmap writing looks similar to dirmap reading. Just a minor
refactoring, no behavior change is expected.

Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy@iopsys.eu>
Link: https://patch.msgid.link/20251012121707.2296160-8-mikhail.kshevetskiy@iopsys.eu
Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
Mikhail Kshevetskiy 2025-10-12 15:16:58 +03:00 committed by Mark Brown
parent 7350f8dc15
commit 233a226874
No known key found for this signature in database
GPG Key ID: 24D68B725D5487D0
1 changed files with 35 additions and 21 deletions

View File

@ -672,6 +672,8 @@ static ssize_t airoha_snand_dirmap_read(struct spi_mem_dirmap_desc *desc,
u32 val, rd_mode; u32 val, rd_mode;
int err; int err;
as_ctrl = spi_controller_get_devdata(spi->controller);
switch (op->cmd.opcode) { switch (op->cmd.opcode) {
case SPI_NAND_OP_READ_FROM_CACHE_DUAL: case SPI_NAND_OP_READ_FROM_CACHE_DUAL:
rd_mode = 1; rd_mode = 1;
@ -684,7 +686,6 @@ static ssize_t airoha_snand_dirmap_read(struct spi_mem_dirmap_desc *desc,
break; break;
} }
as_ctrl = spi_controller_get_devdata(spi->controller);
err = airoha_snand_set_mode(as_ctrl, SPI_MODE_DMA); err = airoha_snand_set_mode(as_ctrl, SPI_MODE_DMA);
if (err < 0) if (err < 0)
return err; return err;
@ -748,7 +749,7 @@ static ssize_t airoha_snand_dirmap_read(struct spi_mem_dirmap_desc *desc,
if (err) if (err)
goto error_dma_unmap; goto error_dma_unmap;
/* trigger dma start read */ /* trigger dma reading */
err = regmap_clear_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_CON, err = regmap_clear_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_CON,
SPI_NFI_RD_TRIG); SPI_NFI_RD_TRIG);
if (err) if (err)
@ -806,37 +807,47 @@ static ssize_t airoha_snand_dirmap_read(struct spi_mem_dirmap_desc *desc,
static ssize_t airoha_snand_dirmap_write(struct spi_mem_dirmap_desc *desc, static ssize_t airoha_snand_dirmap_write(struct spi_mem_dirmap_desc *desc,
u64 offs, size_t len, const void *buf) u64 offs, size_t len, const void *buf)
{ {
struct spi_mem_op *op = &desc->info.op_tmpl;
struct spi_device *spi = desc->mem->spi; struct spi_device *spi = desc->mem->spi;
u8 *txrx_buf = spi_get_ctldata(spi); u8 *txrx_buf = spi_get_ctldata(spi);
struct airoha_snand_ctrl *as_ctrl; struct airoha_snand_ctrl *as_ctrl;
dma_addr_t dma_addr; dma_addr_t dma_addr;
u32 wr_mode, val; u32 wr_mode, val, opcode;
int err; int err;
as_ctrl = spi_controller_get_devdata(spi->controller); as_ctrl = spi_controller_get_devdata(spi->controller);
opcode = desc->info.op_tmpl.cmd.opcode;
switch (opcode) {
case SPI_NAND_OP_PROGRAM_LOAD_SINGLE:
case SPI_NAND_OP_PROGRAM_LOAD_RAMDOM_SINGLE:
wr_mode = 0;
break;
case SPI_NAND_OP_PROGRAM_LOAD_QUAD:
case SPI_NAND_OP_PROGRAM_LOAD_RAMDON_QUAD:
wr_mode = 2;
break;
default:
/* unknown opcode */
return -EOPNOTSUPP;
}
memcpy(txrx_buf + offs, buf, len); memcpy(txrx_buf + offs, buf, len);
err = airoha_snand_set_mode(as_ctrl, SPI_MODE_DMA);
if (err < 0)
return err;
err = airoha_snand_nfi_config(as_ctrl);
if (err)
goto error_dma_mode_off;
dma_addr = dma_map_single(as_ctrl->dev, txrx_buf, SPI_NAND_CACHE_SIZE, dma_addr = dma_map_single(as_ctrl->dev, txrx_buf, SPI_NAND_CACHE_SIZE,
DMA_TO_DEVICE); DMA_TO_DEVICE);
err = dma_mapping_error(as_ctrl->dev, dma_addr); err = dma_mapping_error(as_ctrl->dev, dma_addr);
if (err) if (err)
return err; goto error_dma_mode_off;
err = airoha_snand_set_mode(as_ctrl, SPI_MODE_DMA);
if (err < 0)
goto error_dma_unmap;
err = airoha_snand_nfi_config(as_ctrl);
if (err)
goto error_dma_unmap;
if (op->cmd.opcode == SPI_NAND_OP_PROGRAM_LOAD_QUAD ||
op->cmd.opcode == SPI_NAND_OP_PROGRAM_LOAD_RAMDON_QUAD)
wr_mode = BIT(1);
else
wr_mode = 0;
/* set dma addr */
err = regmap_write(as_ctrl->regmap_nfi, REG_SPI_NFI_STRADDR, err = regmap_write(as_ctrl->regmap_nfi, REG_SPI_NFI_STRADDR,
dma_addr); dma_addr);
if (err) if (err)
@ -850,12 +861,13 @@ static ssize_t airoha_snand_dirmap_write(struct spi_mem_dirmap_desc *desc,
if (err) if (err)
goto error_dma_unmap; goto error_dma_unmap;
/* set write command */
err = regmap_write(as_ctrl->regmap_nfi, REG_SPI_NFI_PG_CTL1, err = regmap_write(as_ctrl->regmap_nfi, REG_SPI_NFI_PG_CTL1,
FIELD_PREP(SPI_NFI_PG_LOAD_CMD, FIELD_PREP(SPI_NFI_PG_LOAD_CMD, opcode));
op->cmd.opcode));
if (err) if (err)
goto error_dma_unmap; goto error_dma_unmap;
/* set write mode */
err = regmap_write(as_ctrl->regmap_nfi, REG_SPI_NFI_SNF_MISC_CTL, err = regmap_write(as_ctrl->regmap_nfi, REG_SPI_NFI_SNF_MISC_CTL,
FIELD_PREP(SPI_NFI_DATA_READ_WR_MODE, wr_mode)); FIELD_PREP(SPI_NFI_DATA_READ_WR_MODE, wr_mode));
if (err) if (err)
@ -887,6 +899,7 @@ static ssize_t airoha_snand_dirmap_write(struct spi_mem_dirmap_desc *desc,
if (err) if (err)
goto error_dma_unmap; goto error_dma_unmap;
/* trigger dma writing */
err = regmap_clear_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_CON, err = regmap_clear_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_CON,
SPI_NFI_WR_TRIG); SPI_NFI_WR_TRIG);
if (err) if (err)
@ -931,6 +944,7 @@ static ssize_t airoha_snand_dirmap_write(struct spi_mem_dirmap_desc *desc,
error_dma_unmap: error_dma_unmap:
dma_unmap_single(as_ctrl->dev, dma_addr, SPI_NAND_CACHE_SIZE, dma_unmap_single(as_ctrl->dev, dma_addr, SPI_NAND_CACHE_SIZE,
DMA_TO_DEVICE); DMA_TO_DEVICE);
error_dma_mode_off:
airoha_snand_set_mode(as_ctrl, SPI_MODE_MANUAL); airoha_snand_set_mode(as_ctrl, SPI_MODE_MANUAL);
return err; return err;
} }