Skip to content

Commit

Permalink
spi: spi-mem: Adjust op len based on message/transfer size limitations
Browse files Browse the repository at this point in the history
We need that to adjust the len of the 2nd transfer (called data in
spi-mem) if it's too long to fit in a SPI message or SPI transfer.

Fixes: c36ff26 ("spi: Extend the core to ease integration of SPI memory controllers")
Cc: <stable@vger.kernel.org>
Signed-off-by: Chuanhua Han <chuanhua.han@nxp.com>
Reviewed-by: Boris Brezillon <boris.brezillon@bootlin.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
  • Loading branch information
Chuanhua Han authored and Mark Brown committed Sep 10, 2018
1 parent abf5fee commit e757996
Showing 1 changed file with 15 additions and 0 deletions.
15 changes: 15 additions & 0 deletions drivers/spi/spi-mem.c
Original file line number Diff line number Diff line change
Expand Up @@ -346,10 +346,25 @@ EXPORT_SYMBOL_GPL(spi_mem_get_name);
int spi_mem_adjust_op_size(struct spi_mem *mem, struct spi_mem_op *op)
{
struct spi_controller *ctlr = mem->spi->controller;
size_t len;

len = sizeof(op->cmd.opcode) + op->addr.nbytes + op->dummy.nbytes;

if (ctlr->mem_ops && ctlr->mem_ops->adjust_op_size)
return ctlr->mem_ops->adjust_op_size(mem, op);

if (!ctlr->mem_ops || !ctlr->mem_ops->exec_op) {
if (len > spi_max_transfer_size(mem->spi))
return -EINVAL;

op->data.nbytes = min3((size_t)op->data.nbytes,
spi_max_transfer_size(mem->spi),
spi_max_message_size(mem->spi) -
len);
if (!op->data.nbytes)
return -EINVAL;
}

return 0;
}
EXPORT_SYMBOL_GPL(spi_mem_adjust_op_size);
Expand Down

0 comments on commit e757996

Please sign in to comment.