]> Pileus Git - ~andy/linux/blobdiff - drivers/spi/spi.c
Merge branch 'for-upstream' of git://openrisc.net/jonas/linux
[~andy/linux] / drivers / spi / spi.c
index 19ee901577da8d1649b975e9873b7a6c1e40029f..f996c600eb8c6a63b0d3122dd0b267a95d032555 100644 (file)
@@ -33,7 +33,7 @@
 #include <linux/of_gpio.h>
 #include <linux/pm_runtime.h>
 #include <linux/export.h>
-#include <linux/sched.h>
+#include <linux/sched/rt.h>
 #include <linux/delay.h>
 #include <linux/kthread.h>
 #include <linux/ioport.h>
@@ -1059,15 +1059,14 @@ EXPORT_SYMBOL_GPL(spi_alloc_master);
 #ifdef CONFIG_OF
 static int of_spi_register_master(struct spi_master *master)
 {
-       u16 nb;
-       int i, *cs;
+       int nb, i, *cs;
        struct device_node *np = master->dev.of_node;
 
        if (!np)
                return 0;
 
        nb = of_gpio_named_count(np, "cs-gpios");
-       master->num_chipselect = max(nb, master->num_chipselect);
+       master->num_chipselect = max(nb, (int)master->num_chipselect);
 
        if (nb < 1)
                return 0;
@@ -1080,7 +1079,8 @@ static int of_spi_register_master(struct spi_master *master)
        if (!master->cs_gpios)
                return -ENOMEM;
 
-       memset(cs, -EINVAL, master->num_chipselect);
+       for (i = 0; i < master->num_chipselect; i++)
+               cs[i] = -EINVAL;
 
        for (i = 0; i < nb; i++)
                cs[i] = of_get_named_gpio(np, "cs-gpios", i);
@@ -1135,6 +1135,9 @@ int spi_register_master(struct spi_master *master)
        if (master->num_chipselect == 0)
                return -EINVAL;
 
+       if ((master->bus_num < 0) && master->dev.of_node)
+               master->bus_num = of_alias_get_id(master->dev.of_node, "spi");
+
        /* convention:  dynamically assigned bus IDs count down from the max */
        if (master->bus_num < 0) {
                /* FIXME switch to an IDR based scheme, something like
@@ -1248,10 +1251,10 @@ int spi_master_resume(struct spi_master *master)
 }
 EXPORT_SYMBOL_GPL(spi_master_resume);
 
-static int __spi_master_match(struct device *dev, void *data)
+static int __spi_master_match(struct device *dev, const void *data)
 {
        struct spi_master *m;
-       u16 *bus_num = data;
+       const u16 *bus_num = data;
 
        m = container_of(dev, struct spi_master, dev);
        return m->bus_num == *bus_num;
@@ -1366,12 +1369,14 @@ static int __spi_async(struct spi_device *spi, struct spi_message *message)
        }
 
        /**
-        * Set transfer bits_per_word as spi device default if it is not
-        * set for this transfer.
+        * Set transfer bits_per_word and max speed as spi device default if
+        * it is not set for this transfer.
         */
        list_for_each_entry(xfer, &message->transfers, transfer_list) {
                if (!xfer->bits_per_word)
                        xfer->bits_per_word = spi->bits_per_word;
+               if (!xfer->speed_hz)
+                       xfer->speed_hz = spi->max_speed_hz;
        }
 
        message->spi = spi;
@@ -1656,7 +1661,8 @@ int spi_write_then_read(struct spi_device *spi,
         * using the pre-allocated buffer or the transfer is too large.
         */
        if ((n_tx + n_rx) > SPI_BUFSIZ || !mutex_trylock(&lock)) {
-               local_buf = kmalloc(max((unsigned)SPI_BUFSIZ, n_tx + n_rx), GFP_KERNEL);
+               local_buf = kmalloc(max((unsigned)SPI_BUFSIZ, n_tx + n_rx),
+                                   GFP_KERNEL | GFP_DMA);
                if (!local_buf)
                        return -ENOMEM;
        } else {