Commit 8a9a784f authored by Mika Westerberg's avatar Mika Westerberg Committed by Mark Brown

spi: intel: Implement adjust_op_size()

This allows us to get rid of the checks in the intel_spi_[sh]w_cycle()
and makes it possible for the SPI-NOR core to split the transaction into
smaller chunks as needed.
Signed-off-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
Link: https://lore.kernel.org/r/20221025064623.22808-3-mika.westerberg@linux.intel.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent f73f6bd2
...@@ -363,10 +363,6 @@ static int intel_spi_hw_cycle(struct intel_spi *ispi, ...@@ -363,10 +363,6 @@ static int intel_spi_hw_cycle(struct intel_spi *ispi,
val = readl(ispi->base + HSFSTS_CTL); val = readl(ispi->base + HSFSTS_CTL);
val &= ~(HSFSTS_CTL_FCYCLE_MASK | HSFSTS_CTL_FDBC_MASK); val &= ~(HSFSTS_CTL_FCYCLE_MASK | HSFSTS_CTL_FDBC_MASK);
if (len > INTEL_SPI_FIFO_SZ)
return -EINVAL;
val |= (len - 1) << HSFSTS_CTL_FDBC_SHIFT; val |= (len - 1) << HSFSTS_CTL_FDBC_SHIFT;
val |= HSFSTS_CTL_FCERR | HSFSTS_CTL_FDONE; val |= HSFSTS_CTL_FCERR | HSFSTS_CTL_FDONE;
val |= HSFSTS_CTL_FGO; val |= HSFSTS_CTL_FGO;
...@@ -397,9 +393,6 @@ static int intel_spi_sw_cycle(struct intel_spi *ispi, u8 opcode, size_t len, ...@@ -397,9 +393,6 @@ static int intel_spi_sw_cycle(struct intel_spi *ispi, u8 opcode, size_t len,
if (ret < 0) if (ret < 0)
return ret; return ret;
if (len > INTEL_SPI_FIFO_SZ)
return -EINVAL;
/* /*
* Always clear it after each SW sequencer operation regardless * Always clear it after each SW sequencer operation regardless
* of whether it is successful or not. * of whether it is successful or not.
...@@ -704,6 +697,12 @@ static int intel_spi_erase(struct intel_spi *ispi, const struct spi_mem *mem, ...@@ -704,6 +697,12 @@ static int intel_spi_erase(struct intel_spi *ispi, const struct spi_mem *mem,
return 0; return 0;
} }
static int intel_spi_adjust_op_size(struct spi_mem *mem, struct spi_mem_op *op)
{
op->data.nbytes = clamp_val(op->data.nbytes, 0, INTEL_SPI_FIFO_SZ);
return 0;
}
static bool intel_spi_cmp_mem_op(const struct intel_spi_mem_op *iop, static bool intel_spi_cmp_mem_op(const struct intel_spi_mem_op *iop,
const struct spi_mem_op *op) const struct spi_mem_op *op)
{ {
...@@ -844,6 +843,7 @@ static ssize_t intel_spi_dirmap_write(struct spi_mem_dirmap_desc *desc, u64 offs ...@@ -844,6 +843,7 @@ static ssize_t intel_spi_dirmap_write(struct spi_mem_dirmap_desc *desc, u64 offs
} }
static const struct spi_controller_mem_ops intel_spi_mem_ops = { static const struct spi_controller_mem_ops intel_spi_mem_ops = {
.adjust_op_size = intel_spi_adjust_op_size,
.supports_op = intel_spi_supports_mem_op, .supports_op = intel_spi_supports_mem_op,
.exec_op = intel_spi_exec_mem_op, .exec_op = intel_spi_exec_mem_op,
.get_name = intel_spi_get_name, .get_name = intel_spi_get_name,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment