summaryrefslogtreecommitdiffstats
path: root/drivers/spi/spi-mem.c
diff options
context:
space:
mode:
authorChuanhua Han <chuanhua.han@nxp.com>2018-08-30 04:43:24 -0400
committerMark Brown <broonie@kernel.org>2018-09-10 13:41:46 -0400
commite757996cafbeb6b71234a17130674bcd8f44c59e (patch)
treed60e8692116913a9a4faeb0e776174f60de207d8 /drivers/spi/spi-mem.c
parentabf5feef3ff0cefade0c76be53b59e55fdd46093 (diff)
spi: spi-mem: Adjust op len based on message/transfer size limitations
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: c36ff266dc82 ("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>
Diffstat (limited to 'drivers/spi/spi-mem.c')
-rw-r--r--drivers/spi/spi-mem.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/drivers/spi/spi-mem.c b/drivers/spi/spi-mem.c
index e43842c7a31a..eb72dba71d83 100644
--- a/drivers/spi/spi-mem.c
+++ b/drivers/spi/spi-mem.c
@@ -346,10 +346,25 @@ EXPORT_SYMBOL_GPL(spi_mem_get_name);
346int spi_mem_adjust_op_size(struct spi_mem *mem, struct spi_mem_op *op) 346int spi_mem_adjust_op_size(struct spi_mem *mem, struct spi_mem_op *op)
347{ 347{
348 struct spi_controller *ctlr = mem->spi->controller; 348 struct spi_controller *ctlr = mem->spi->controller;
349 size_t len;
350
351 len = sizeof(op->cmd.opcode) + op->addr.nbytes + op->dummy.nbytes;
349 352
350 if (ctlr->mem_ops && ctlr->mem_ops->adjust_op_size) 353 if (ctlr->mem_ops && ctlr->mem_ops->adjust_op_size)
351 return ctlr->mem_ops->adjust_op_size(mem, op); 354 return ctlr->mem_ops->adjust_op_size(mem, op);
352 355
356 if (!ctlr->mem_ops || !ctlr->mem_ops->exec_op) {
357 if (len > spi_max_transfer_size(mem->spi))
358 return -EINVAL;
359
360 op->data.nbytes = min3((size_t)op->data.nbytes,
361 spi_max_transfer_size(mem->spi),
362 spi_max_message_size(mem->spi) -
363 len);
364 if (!op->data.nbytes)
365 return -EINVAL;
366 }
367
353 return 0; 368 return 0;
354} 369}
355EXPORT_SYMBOL_GPL(spi_mem_adjust_op_size); 370EXPORT_SYMBOL_GPL(spi_mem_adjust_op_size);