spi: spi-mem: Extend spi_mem_adjust_op_size() to honor max xfer size
authorVignesh R <vigneshr@ti.com>
Tue, 5 Feb 2019 05:59:13 +0000 (11:29 +0530)
committerJagan Teki <jagan@amarulasolutions.com>
Thu, 7 Feb 2019 10:03:21 +0000 (15:33 +0530)
Extend spi_mem_adjust_op_size() to take spi->max_write_size and
spi->max_read_size into account.

Signed-off-by: Vignesh R <vigneshr@ti.com>
Tested-by: Simon Goldschmidt <simon.k.r.goldschmidt@gmail.com>
Tested-by: Stefan Roese <sr@denx.de>
Tested-by: Horatiu Vultur <horatiu.vultur@microchip.com>
Reviewed-by: Jagan Teki <jagan@openedev.com>
Tested-by: Jagan Teki <jagan@amarulasolutions.com> #zynq-microzed
drivers/spi/spi-mem.c

index 1da20b8de5c43851df0e36495ce14e9d88c730cf..334af682dc658614df24cf7dc232d159b75a049c 100644 (file)
@@ -412,6 +412,25 @@ int spi_mem_adjust_op_size(struct spi_slave *slave, struct spi_mem_op *op)
        if (ops->mem_ops && ops->mem_ops->adjust_op_size)
                return ops->mem_ops->adjust_op_size(slave, op);
 
+       if (!ops->mem_ops || !ops->mem_ops->exec_op) {
+               unsigned int len;
+
+               len = sizeof(op->cmd.opcode) + op->addr.nbytes +
+                       op->dummy.nbytes;
+               if (slave->max_write_size && len > slave->max_write_size)
+                       return -EINVAL;
+
+               if (op->data.dir == SPI_MEM_DATA_IN && slave->max_read_size)
+                       op->data.nbytes = min(op->data.nbytes,
+                                             slave->max_read_size);
+               else if (slave->max_write_size)
+                       op->data.nbytes = min(op->data.nbytes,
+                                             slave->max_write_size - len);
+
+               if (!op->data.nbytes)
+                       return -EINVAL;
+       }
+
        return 0;
 }
 EXPORT_SYMBOL_GPL(spi_mem_adjust_op_size);