summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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);