spi: spi-mem: Allow controller supporting mem_ops without exec_op
authorWilliam Zhang <william.zhang@broadcom.com>
Thu, 9 Feb 2023 20:02:43 +0000 (12:02 -0800)
committerMark Brown <broonie@kernel.org>
Fri, 10 Feb 2023 21:36:43 +0000 (21:36 +0000)
Currently exec_op is always required if controller driver provides
mem_ops. But some controller such as bcm63xx-hsspi may only need to
implement other operation like supports_op and use the default
execution operation. This patch removes this restriction.

Signed-off-by: William Zhang <william.zhang@broadcom.com>
Link: https://lore.kernel.org/r/20230209200246.141520-13-william.zhang@broadcom.com
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/spi/spi-mem.c
drivers/spi/spi.c

index 0c79193..701838b 100644 (file)
@@ -325,7 +325,7 @@ int spi_mem_exec_op(struct spi_mem *mem, const struct spi_mem_op *op)
        if (!spi_mem_internal_supports_op(mem, op))
                return -ENOTSUPP;
 
-       if (ctlr->mem_ops && !mem->spi->cs_gpiod) {
+       if (ctlr->mem_ops && ctlr->mem_ops->exec_op && !mem->spi->cs_gpiod) {
                ret = spi_mem_access_start(mem);
                if (ret)
                        return ret;
index f4eb447..91f7130 100644 (file)
@@ -3072,15 +3072,14 @@ static int spi_controller_check_ops(struct spi_controller *ctlr)
         * The controller may implement only the high-level SPI-memory like
         * operations if it does not support regular SPI transfers, and this is
         * valid use case.
-        * If ->mem_ops is NULL, we request that at least one of the
-        * ->transfer_xxx() method be implemented.
+        * If ->mem_ops or ->mem_ops->exec_op is NULL, we request that at least
+        * one of the ->transfer_xxx() method be implemented.
         */
-       if (ctlr->mem_ops) {
-               if (!ctlr->mem_ops->exec_op)
-                       return -EINVAL;
-       } else if (!ctlr->transfer && !ctlr->transfer_one &&
+       if (!ctlr->mem_ops || (ctlr->mem_ops && !ctlr->mem_ops->exec_op)) {
+               if (!ctlr->transfer && !ctlr->transfer_one &&
                   !ctlr->transfer_one_message) {
-               return -EINVAL;
+                       return -EINVAL;
+               }
        }
 
        return 0;