diff options
| author | Mark Brown <[email protected]> | 2025-05-09 09:06:17 +0000 |
|---|---|---|
| committer | Mark Brown <[email protected]> | 2025-05-09 09:06:17 +0000 |
| commit | 09fd04daed0746d8e77ed2327f26c671ce49023c (patch) | |
| tree | d2240a6213535df8e40eb544aa269b40f97ff55b /drivers/spi/spi-rpc-if.c | |
| parent | This patch set did some clean up and add runtime pm (diff) | |
| parent | spi: rpc-if: Add write support for memory-mapped area (diff) | |
| download | kernel-09fd04daed0746d8e77ed2327f26c671ce49023c.tar.gz kernel-09fd04daed0746d8e77ed2327f26c671ce49023c.zip | |
Add RZ/G3E xSPI support
Merge series from Biju Das <[email protected]>:
The xSPI IP found on RZ/G3E SoC similar to RPC-IF interface, but it
can support writes on memory-mapped area. Even though the registers are
different, the rpcif driver code can be reused for xSPI by adding wrapper
functions.
Diffstat (limited to 'drivers/spi/spi-rpc-if.c')
| -rw-r--r-- | drivers/spi/spi-rpc-if.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/drivers/spi/spi-rpc-if.c b/drivers/spi/spi-rpc-if.c index e0c66a24a3cb..627cffea5d5c 100644 --- a/drivers/spi/spi-rpc-if.c +++ b/drivers/spi/spi-rpc-if.c @@ -75,6 +75,19 @@ static bool rpcif_spi_mem_supports_op(struct spi_mem *mem, return true; } +static ssize_t xspi_spi_mem_dirmap_write(struct spi_mem_dirmap_desc *desc, + u64 offs, size_t len, const void *buf) +{ + struct rpcif *rpc = spi_controller_get_devdata(desc->mem->spi->controller); + + if (offs + desc->info.offset + len > U32_MAX) + return -EINVAL; + + rpcif_spi_mem_prepare(desc->mem->spi, &desc->info.op_tmpl, &offs, &len); + + return xspi_dirmap_write(rpc->dev, offs, len, buf); +} + static ssize_t rpcif_spi_mem_dirmap_read(struct spi_mem_dirmap_desc *desc, u64 offs, size_t len, void *buf) { @@ -103,7 +116,7 @@ static int rpcif_spi_mem_dirmap_create(struct spi_mem_dirmap_desc *desc) if (!rpc->dirmap) return -EOPNOTSUPP; - if (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; @@ -125,6 +138,7 @@ static const struct spi_controller_mem_ops rpcif_spi_mem_ops = { .exec_op = rpcif_spi_mem_exec_op, .dirmap_create = rpcif_spi_mem_dirmap_create, .dirmap_read = rpcif_spi_mem_dirmap_read, + .dirmap_write = xspi_spi_mem_dirmap_write, }; static int rpcif_spi_probe(struct platform_device *pdev) |
