spi: Correct operations check in dm_spi_xfer()
authorSimon Glass <sjg@chromium.org>
Sat, 7 Dec 2019 04:42:35 +0000 (21:42 -0700)
committerBin Meng <bmeng.cn@gmail.com>
Sun, 15 Dec 2019 03:44:21 +0000 (11:44 +0800)
At present we have to have an xfer() method even if it does nothing. This
is not correct, so fix it.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
drivers/spi/ich.c
drivers/spi/spi-uclass.c
include/spi.h

index fbb58c7..a4e4ad5 100644 (file)
@@ -493,13 +493,6 @@ static int ich_spi_adjust_size(struct spi_slave *slave, struct spi_mem_op *op)
        return 0;
 }
 
-static int ich_spi_xfer(struct udevice *dev, unsigned int bitlen,
-                       const void *dout, void *din, unsigned long flags)
-{
-       printf("ICH SPI: Only supports memory operations\n");
-       return -1;
-}
-
 static int ich_spi_probe(struct udevice *dev)
 {
        struct ich_spi_platdata *plat = dev_get_platdata(dev);
@@ -612,7 +605,7 @@ static const struct spi_controller_mem_ops ich_controller_mem_ops = {
 };
 
 static const struct dm_spi_ops ich_spi_ops = {
-       .xfer           = ich_spi_xfer,
+       /* xfer is not supported */
        .set_speed      = ich_spi_set_speed,
        .set_mode       = ich_spi_set_mode,
        .mem_ops        = &ich_controller_mem_ops,
index 665611f..af910e9 100644 (file)
@@ -85,11 +85,14 @@ int dm_spi_xfer(struct udevice *dev, unsigned int bitlen,
                const void *dout, void *din, unsigned long flags)
 {
        struct udevice *bus = dev->parent;
+       struct dm_spi_ops *ops = spi_get_ops(bus);
 
        if (bus->uclass->uc_drv->id != UCLASS_SPI)
                return -EOPNOTSUPP;
+       if (!ops->xfer)
+               return -ENOSYS;
 
-       return spi_get_ops(bus)->xfer(dev, bitlen, dout, din, flags);
+       return ops->xfer(dev, bitlen, dout, din, flags);
 }
 
 int dm_spi_get_mmap(struct udevice *dev, ulong *map_basep, uint *map_sizep,
index 6fbb433..ba2c840 100644 (file)
@@ -224,7 +224,7 @@ void spi_release_bus(struct spi_slave *slave);
 int spi_set_wordlen(struct spi_slave *slave, unsigned int wordlen);
 
 /**
- * SPI transfer
+ * SPI transfer (optional if mem_ops is used)
  *
  * This writes "bitlen" bits out the SPI MOSI port and simultaneously clocks
  * "bitlen" bits in the SPI MISO port.  That's just the way SPI works.