spi: spi-mem: Claim SPI bus before spi mem access
authorVignesh R <vigneshr@ti.com>
Tue, 5 Feb 2019 05:59:14 +0000 (11:29 +0530)
committerJagan Teki <jagan@amarulasolutions.com>
Thu, 7 Feb 2019 10:03:21 +0000 (15:33 +0530)
It is necessary to call spi_claim_bus() before starting any SPI
transactions and this restriction would also apply when calling spi-mem
operations. Therefore claim and release bus before requesting transfer
via exec_op.

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 334af682dc658614df24cf7dc232d159b75a049c..1bb0987edb728fb35a37695c756a58586000d9e3 100644 (file)
@@ -210,6 +210,10 @@ int spi_mem_exec_op(struct spi_slave *slave, const struct spi_mem_op *op)
        if (!spi_mem_supports_op(slave, op))
                return -ENOTSUPP;
 
+       ret = spi_claim_bus(slave);
+       if (ret < 0)
+               return ret;
+
        if (ops->mem_ops) {
 #ifndef __UBOOT__
                /*
@@ -232,6 +236,7 @@ int spi_mem_exec_op(struct spi_slave *slave, const struct spi_mem_op *op)
                mutex_lock(&ctlr->io_mutex);
 #endif
                ret = ops->mem_ops->exec_op(slave, op);
+
 #ifndef __UBOOT__
                mutex_unlock(&ctlr->io_mutex);
                mutex_unlock(&ctlr->bus_lock_mutex);
@@ -245,8 +250,10 @@ int spi_mem_exec_op(struct spi_slave *slave, const struct spi_mem_op *op)
                 * read path) and expect the core to use the regular SPI
                 * interface in other cases.
                 */
-               if (!ret || ret != -ENOTSUPP)
+               if (!ret || ret != -ENOTSUPP) {
+                       spi_release_bus(slave);
                        return ret;
+               }
        }
 
 #ifndef __UBOOT__
@@ -333,10 +340,6 @@ int spi_mem_exec_op(struct spi_slave *slave, const struct spi_mem_op *op)
        op_len = sizeof(op->cmd.opcode) + op->addr.nbytes + op->dummy.nbytes;
        op_buf = calloc(1, op_len);
 
-       ret = spi_claim_bus(slave);
-       if (ret < 0)
-               return ret;
-
        op_buf[pos++] = op->cmd.opcode;
 
        if (op->addr.nbytes) {