Merge remote-tracking branches 'spi/topic/imx', 'spi/topic/init', 'spi/topic/mpc512x...
[cascardo/linux.git] / drivers / spi / spi-atmel.c
index b0842f7..8005f98 100644 (file)
@@ -9,7 +9,6 @@
  */
 
 #include <linux/kernel.h>
-#include <linux/init.h>
 #include <linux/clk.h>
 #include <linux/module.h>
 #include <linux/platform_device.h>
@@ -26,6 +25,7 @@
 
 #include <linux/io.h>
 #include <linux/gpio.h>
+#include <linux/pinctrl/consumer.h>
 
 /* SPI register offsets */
 #define SPI_CR                                 0x0000
@@ -993,13 +993,6 @@ static int atmel_spi_setup(struct spi_device *spi)
 
        as = spi_master_get_devdata(spi->master);
 
-       if (spi->chip_select > spi->master->num_chipselect) {
-               dev_dbg(&spi->dev,
-                               "setup: invalid chipselect %u (%u defined)\n",
-                               spi->chip_select, spi->master->num_chipselect);
-               return -EINVAL;
-       }
-
        /* see notes above re chipselect */
        if (!atmel_spi_is_v2(as)
                        && spi->chip_select == 0
@@ -1087,14 +1080,6 @@ static int atmel_spi_one_transfer(struct spi_master *master,
                }
        }
 
-       if (xfer->bits_per_word > 8) {
-               if (xfer->len % 2) {
-                       dev_dbg(&spi->dev,
-                       "buffer len should be 16 bits aligned\n");
-                       return -EINVAL;
-               }
-       }
-
        /*
         * DMA map early, for performance (empties dcache ASAP) and
         * better fault reporting.
@@ -1221,9 +1206,6 @@ static int atmel_spi_transfer_one_message(struct spi_master *master,
        dev_dbg(&spi->dev, "new message %p submitted for %s\n",
                                        msg, dev_name(&spi->dev));
 
-       if (unlikely(list_empty(&msg->transfers)))
-               return -EINVAL;
-
        atmel_spi_lock(as);
        cs_activate(as, spi);
 
@@ -1244,10 +1226,10 @@ static int atmel_spi_transfer_one_message(struct spi_master *master,
 
        list_for_each_entry(xfer, &msg->transfers, transfer_list) {
                dev_dbg(&spi->dev,
-                       "  xfer %p: len %u tx %p/%08x rx %p/%08x\n",
+                       "  xfer %p: len %u tx %p/%pad rx %p/%pad\n",
                        xfer, xfer->len,
-                       xfer->tx_buf, xfer->tx_dma,
-                       xfer->rx_buf, xfer->rx_dma);
+                       xfer->tx_buf, &xfer->tx_dma,
+                       xfer->rx_buf, &xfer->rx_dma);
        }
 
 msg_done:
@@ -1303,6 +1285,9 @@ static int atmel_spi_probe(struct platform_device *pdev)
        struct spi_master       *master;
        struct atmel_spi        *as;
 
+       /* Select default pin state */
+       pinctrl_pm_select_default_state(&pdev->dev);
+
        regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        if (!regs)
                return -ENXIO;
@@ -1455,8 +1440,19 @@ static int atmel_spi_suspend(struct device *dev)
 {
        struct spi_master       *master = dev_get_drvdata(dev);
        struct atmel_spi        *as = spi_master_get_devdata(master);
+       int ret;
+
+       /* Stop the queue running */
+       ret = spi_master_suspend(master);
+       if (ret) {
+               dev_warn(dev, "cannot suspend master\n");
+               return ret;
+       }
 
        clk_disable_unprepare(as->clk);
+
+       pinctrl_pm_select_sleep_state(dev);
+
        return 0;
 }
 
@@ -1464,9 +1460,18 @@ static int atmel_spi_resume(struct device *dev)
 {
        struct spi_master       *master = dev_get_drvdata(dev);
        struct atmel_spi        *as = spi_master_get_devdata(master);
+       int ret;
+
+       pinctrl_pm_select_default_state(dev);
 
        clk_prepare_enable(as->clk);
-       return 0;
+
+       /* Start the queue running */
+       ret = spi_master_resume(master);
+       if (ret)
+               dev_err(dev, "problem starting queue (%d)\n", ret);
+
+       return ret;
 }
 
 static SIMPLE_DEV_PM_OPS(atmel_spi_pm_ops, atmel_spi_suspend, atmel_spi_resume);