]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - drivers/spi/spi.c
Merge remote-tracking branch 'spi/fix/grant' into spi-linus
[mirror_ubuntu-bionic-kernel.git] / drivers / spi / spi.c
index 004b10f184d4e7fe00916af3fc5acad6d7866139..32b7bb111eb6b53d9e96808f7bd5fd0982cffd9d 100644 (file)
@@ -334,7 +334,7 @@ struct spi_device *spi_alloc_device(struct spi_master *master)
        spi->dev.parent = &master->dev;
        spi->dev.bus = &spi_bus_type;
        spi->dev.release = spidev_release;
-       spi->cs_gpio = -EINVAL;
+       spi->cs_gpio = -ENOENT;
        device_initialize(&spi->dev);
        return spi;
 }
@@ -1067,8 +1067,11 @@ static int of_spi_register_master(struct spi_master *master)
        nb = of_gpio_named_count(np, "cs-gpios");
        master->num_chipselect = max(nb, (int)master->num_chipselect);
 
-       if (nb < 1)
+       /* Return error only for an incorrectly formed cs-gpios property */
+       if (nb == 0 || nb == -ENOENT)
                return 0;
+       else if (nb < 0)
+               return nb;
 
        cs = devm_kzalloc(&master->dev,
                          sizeof(int) * master->num_chipselect,
@@ -1079,7 +1082,7 @@ static int of_spi_register_master(struct spi_master *master)
                return -ENOMEM;
 
        for (i = 0; i < master->num_chipselect; i++)
-               cs[i] = -EINVAL;
+               cs[i] = -ENOENT;
 
        for (i = 0; i < nb; i++)
                cs[i] = of_get_named_gpio(np, "cs-gpios", i);
@@ -1376,6 +1379,14 @@ static int __spi_async(struct spi_device *spi, struct spi_message *message)
                        xfer->bits_per_word = spi->bits_per_word;
                if (!xfer->speed_hz)
                        xfer->speed_hz = spi->max_speed_hz;
+               if (master->bits_per_word_mask) {
+                       /* Only 32 bits fit in the mask */
+                       if (xfer->bits_per_word > 32)
+                               return -EINVAL;
+                       if (!(master->bits_per_word_mask &
+                                       BIT(xfer->bits_per_word - 1)))
+                               return -EINVAL;
+               }
        }
 
        message->spi = spi;