Merge tag 'xfs-5.19-for-linus' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux
[linux-2.6-microblaze.git] / drivers / spi / spi-imx.c
index b2dd0a4..30d82cc 100644 (file)
 #include <linux/pm_runtime.h>
 #include <linux/slab.h>
 #include <linux/spi/spi.h>
-#include <linux/spi/spi_bitbang.h>
 #include <linux/types.h>
 #include <linux/of.h>
 #include <linux/of_device.h>
 #include <linux/property.h>
 
-#include <linux/platform_data/dma-imx.h>
+#include <linux/dma/imx-dma.h>
 
 #define DRIVER_NAME "spi_imx"
 
@@ -32,6 +31,12 @@ static bool use_dma = true;
 module_param(use_dma, bool, 0644);
 MODULE_PARM_DESC(use_dma, "Enable usage of DMA when available (default)");
 
+/* define polling limits */
+static unsigned int polling_limit_us = 30;
+module_param(polling_limit_us, uint, 0664);
+MODULE_PARM_DESC(polling_limit_us,
+                "time in us to run a transfer in polling mode\n");
+
 #define MXC_RPM_TIMEOUT                2000 /* 2000ms */
 
 #define MXC_CSPIRXDATA         0x00
@@ -64,15 +69,15 @@ enum spi_imx_devtype {
 struct spi_imx_data;
 
 struct spi_imx_devtype_data {
-       void (*intctrl)(struct spi_imx_data *, int);
-       int (*prepare_message)(struct spi_imx_data *, struct spi_message *);
-       int (*prepare_transfer)(struct spi_imx_data *, struct spi_device *);
-       void (*trigger)(struct spi_imx_data *);
-       int (*rx_available)(struct spi_imx_data *);
-       void (*reset)(struct spi_imx_data *);
-       void (*setup_wml)(struct spi_imx_data *);
-       void (*disable)(struct spi_imx_data *);
-       void (*disable_dma)(struct spi_imx_data *);
+       void (*intctrl)(struct spi_imx_data *spi_imx, int enable);
+       int (*prepare_message)(struct spi_imx_data *spi_imx, struct spi_message *msg);
+       int (*prepare_transfer)(struct spi_imx_data *spi_imx, struct spi_device *spi);
+       void (*trigger)(struct spi_imx_data *spi_imx);
+       int (*rx_available)(struct spi_imx_data *spi_imx);
+       void (*reset)(struct spi_imx_data *spi_imx);
+       void (*setup_wml)(struct spi_imx_data *spi_imx);
+       void (*disable)(struct spi_imx_data *spi_imx);
+       void (*disable_dma)(struct spi_imx_data *spi_imx);
        bool has_dmamode;
        bool has_slavemode;
        unsigned int fifo_size;
@@ -86,7 +91,7 @@ struct spi_imx_devtype_data {
 };
 
 struct spi_imx_data {
-       struct spi_bitbang bitbang;
+       struct spi_controller *controller;
        struct device *dev;
 
        struct completion xfer_done;
@@ -102,12 +107,13 @@ struct spi_imx_data {
        unsigned int spi_drctl;
 
        unsigned int count, remainder;
-       void (*tx)(struct spi_imx_data *);
-       void (*rx)(struct spi_imx_data *);
+       void (*tx)(struct spi_imx_data *spi_imx);
+       void (*rx)(struct spi_imx_data *spi_imx);
        void *rx_buf;
        const void *tx_buf;
        unsigned int txfifo; /* number of words pushed in tx FIFO */
        unsigned int dynamic_burst;
+       bool rx_only;
 
        /* Slave mode */
        bool slave_mode;
@@ -225,15 +231,15 @@ static int spi_imx_bytes_per_word(const int bits_per_word)
                return 4;
 }
 
-static bool spi_imx_can_dma(struct spi_master *master, struct spi_device *spi,
+static bool spi_imx_can_dma(struct spi_controller *controller, struct spi_device *spi,
                         struct spi_transfer *transfer)
 {
-       struct spi_imx_data *spi_imx = spi_master_get_devdata(master);
+       struct spi_imx_data *spi_imx = spi_controller_get_devdata(controller);
 
-       if (!use_dma || master->fallback)
+       if (!use_dma || controller->fallback)
                return false;
 
-       if (!master->dma_rx)
+       if (!controller->dma_rx)
                return false;
 
        if (spi_imx->slave_mode)
@@ -289,17 +295,16 @@ static bool spi_imx_can_dma(struct spi_master *master, struct spi_device *spi,
 static void spi_imx_buf_rx_swap_u32(struct spi_imx_data *spi_imx)
 {
        unsigned int val = readl(spi_imx->base + MXC_CSPIRXDATA);
-#ifdef __LITTLE_ENDIAN
-       unsigned int bytes_per_word;
-#endif
 
        if (spi_imx->rx_buf) {
 #ifdef __LITTLE_ENDIAN
+               unsigned int bytes_per_word;
+
                bytes_per_word = spi_imx_bytes_per_word(spi_imx->bits_per_word);
                if (bytes_per_word == 1)
-                       val = cpu_to_be32(val);
+                       swab32s(&val);
                else if (bytes_per_word == 2)
-                       val = (val << 16) | (val >> 16);
+                       swahw32s(&val);
 #endif
                *(u32 *)spi_imx->rx_buf = val;
                spi_imx->rx_buf += sizeof(u32);
@@ -353,9 +358,9 @@ static void spi_imx_buf_tx_swap_u32(struct spi_imx_data *spi_imx)
        bytes_per_word = spi_imx_bytes_per_word(spi_imx->bits_per_word);
 
        if (bytes_per_word == 1)
-               val = cpu_to_be32(val);
+               swab32s(&val);
        else if (bytes_per_word == 2)
-               val = (val << 16) | (val >> 16);
+               swahw32s(&val);
 #endif
        writel(val, spi_imx->base + MXC_CSPITXDATA);
 }
@@ -469,7 +474,7 @@ static unsigned int mx51_ecspi_clkdiv(struct spi_imx_data *spi_imx,
 
 static void mx51_ecspi_intctrl(struct spi_imx_data *spi_imx, int enable)
 {
-       unsigned val = 0;
+       unsigned int val = 0;
 
        if (enable & MXC_INT_TE)
                val |= MX51_ECSPI_INT_TEEN;
@@ -515,6 +520,7 @@ static int mx51_ecspi_prepare_message(struct spi_imx_data *spi_imx,
        u32 min_speed_hz = ~0U;
        u32 testreg, delay;
        u32 cfg = readl(spi_imx->base + MX51_ECSPI_CONFIG);
+       u32 current_cfg = cfg;
 
        /* set Master or Slave mode */
        if (spi_imx->slave_mode)
@@ -554,11 +560,6 @@ static int mx51_ecspi_prepare_message(struct spi_imx_data *spi_imx,
        else
                cfg |= MX51_ECSPI_CONFIG_SBBCTRL(spi->chip_select);
 
-       if (spi->mode & SPI_CPHA)
-               cfg |= MX51_ECSPI_CONFIG_SCLKPHA(spi->chip_select);
-       else
-               cfg &= ~MX51_ECSPI_CONFIG_SCLKPHA(spi->chip_select);
-
        if (spi->mode & SPI_CPOL) {
                cfg |= MX51_ECSPI_CONFIG_SCLKPOL(spi->chip_select);
                cfg |= MX51_ECSPI_CONFIG_SCLKCTL(spi->chip_select);
@@ -572,6 +573,9 @@ static int mx51_ecspi_prepare_message(struct spi_imx_data *spi_imx,
        else
                cfg &= ~MX51_ECSPI_CONFIG_SSBPOL(spi->chip_select);
 
+       if (cfg == current_cfg)
+               return 0;
+
        writel(cfg, spi_imx->base + MX51_ECSPI_CONFIG);
 
        /*
@@ -585,7 +589,7 @@ static int mx51_ecspi_prepare_message(struct spi_imx_data *spi_imx,
         * the SPI communication as the device on the other end would consider
         * the change of SCLK polarity as a clock tick already.
         *
-        * Because spi_imx->spi_bus_clk is only set in bitbang prepare_message
+        * Because spi_imx->spi_bus_clk is only set in prepare_message
         * callback, iterate over all the transfers in spi_message, find the
         * one with lowest bus frequency, and use that bus frequency for the
         * delay calculation. In case all transfers have speed_hz == 0, then
@@ -606,6 +610,24 @@ static int mx51_ecspi_prepare_message(struct spi_imx_data *spi_imx,
        return 0;
 }
 
+static void mx51_configure_cpha(struct spi_imx_data *spi_imx,
+                               struct spi_device *spi)
+{
+       bool cpha = (spi->mode & SPI_CPHA);
+       bool flip_cpha = (spi->mode & SPI_RX_CPHA_FLIP) && spi_imx->rx_only;
+       u32 cfg = readl(spi_imx->base + MX51_ECSPI_CONFIG);
+
+       /* Flip cpha logical value iff flip_cpha */
+       cpha ^= flip_cpha;
+
+       if (cpha)
+               cfg |= MX51_ECSPI_CONFIG_SCLKPHA(spi->chip_select);
+       else
+               cfg &= ~MX51_ECSPI_CONFIG_SCLKPHA(spi->chip_select);
+
+       writel(cfg, spi_imx->base + MX51_ECSPI_CONFIG);
+}
+
 static int mx51_ecspi_prepare_transfer(struct spi_imx_data *spi_imx,
                                       struct spi_device *spi)
 {
@@ -627,6 +649,8 @@ static int mx51_ecspi_prepare_transfer(struct spi_imx_data *spi_imx,
        ctrl |= mx51_ecspi_clkdiv(spi_imx, spi_imx->spi_bus_clk, &clk);
        spi_imx->spi_bus_clk = clk;
 
+       mx51_configure_cpha(spi_imx, spi);
+
        /*
         * ERR009165: work in XHC mode instead of SMC as PIO on the chips
         * before i.mx6ul.
@@ -1153,12 +1177,12 @@ static irqreturn_t spi_imx_isr(int irq, void *dev_id)
        return IRQ_HANDLED;
 }
 
-static int spi_imx_dma_configure(struct spi_master *master)
+static int spi_imx_dma_configure(struct spi_controller *controller)
 {
        int ret;
        enum dma_slave_buswidth buswidth;
        struct dma_slave_config rx = {}, tx = {};
-       struct spi_imx_data *spi_imx = spi_master_get_devdata(master);
+       struct spi_imx_data *spi_imx = spi_controller_get_devdata(controller);
 
        switch (spi_imx_bytes_per_word(spi_imx->bits_per_word)) {
        case 4:
@@ -1178,7 +1202,7 @@ static int spi_imx_dma_configure(struct spi_master *master)
        tx.dst_addr = spi_imx->base_phys + MXC_CSPITXDATA;
        tx.dst_addr_width = buswidth;
        tx.dst_maxburst = spi_imx->wml;
-       ret = dmaengine_slave_config(master->dma_tx, &tx);
+       ret = dmaengine_slave_config(controller->dma_tx, &tx);
        if (ret) {
                dev_err(spi_imx->dev, "TX dma configuration failed with %d\n", ret);
                return ret;
@@ -1188,7 +1212,7 @@ static int spi_imx_dma_configure(struct spi_master *master)
        rx.src_addr = spi_imx->base_phys + MXC_CSPIRXDATA;
        rx.src_addr_width = buswidth;
        rx.src_maxburst = spi_imx->wml;
-       ret = dmaengine_slave_config(master->dma_rx, &rx);
+       ret = dmaengine_slave_config(controller->dma_rx, &rx);
        if (ret) {
                dev_err(spi_imx->dev, "RX dma configuration failed with %d\n", ret);
                return ret;
@@ -1200,7 +1224,7 @@ static int spi_imx_dma_configure(struct spi_master *master)
 static int spi_imx_setupxfer(struct spi_device *spi,
                                 struct spi_transfer *t)
 {
-       struct spi_imx_data *spi_imx = spi_master_get_devdata(spi->master);
+       struct spi_imx_data *spi_imx = spi_controller_get_devdata(spi->controller);
 
        if (!t)
                return 0;
@@ -1246,11 +1270,14 @@ static int spi_imx_setupxfer(struct spi_device *spi,
                spi_imx->dynamic_burst = 0;
        }
 
-       if (spi_imx_can_dma(spi_imx->bitbang.master, spi, t))
+       if (spi_imx_can_dma(spi_imx->controller, spi, t))
                spi_imx->usedma = true;
        else
                spi_imx->usedma = false;
 
+       spi_imx->rx_only = ((t->tx_buf == NULL)
+                       || (t->tx_buf == spi->controller->dummy_tx));
+
        if (is_imx53_ecspi(spi_imx) && spi_imx->slave_mode) {
                spi_imx->rx = mx53_ecspi_rx_slave;
                spi_imx->tx = mx53_ecspi_tx_slave;
@@ -1264,50 +1291,50 @@ static int spi_imx_setupxfer(struct spi_device *spi,
 
 static void spi_imx_sdma_exit(struct spi_imx_data *spi_imx)
 {
-       struct spi_master *master = spi_imx->bitbang.master;
+       struct spi_controller *controller = spi_imx->controller;
 
-       if (master->dma_rx) {
-               dma_release_channel(master->dma_rx);
-               master->dma_rx = NULL;
+       if (controller->dma_rx) {
+               dma_release_channel(controller->dma_rx);
+               controller->dma_rx = NULL;
        }
 
-       if (master->dma_tx) {
-               dma_release_channel(master->dma_tx);
-               master->dma_tx = NULL;
+       if (controller->dma_tx) {
+               dma_release_channel(controller->dma_tx);
+               controller->dma_tx = NULL;
        }
 }
 
 static int spi_imx_sdma_init(struct device *dev, struct spi_imx_data *spi_imx,
-                            struct spi_master *master)
+                            struct spi_controller *controller)
 {
        int ret;
 
        spi_imx->wml = spi_imx->devtype_data->fifo_size / 2;
 
        /* Prepare for TX DMA: */
-       master->dma_tx = dma_request_chan(dev, "tx");
-       if (IS_ERR(master->dma_tx)) {
-               ret = PTR_ERR(master->dma_tx);
+       controller->dma_tx = dma_request_chan(dev, "tx");
+       if (IS_ERR(controller->dma_tx)) {
+               ret = PTR_ERR(controller->dma_tx);
                dev_dbg(dev, "can't get the TX DMA channel, error %d!\n", ret);
-               master->dma_tx = NULL;
+               controller->dma_tx = NULL;
                goto err;
        }
 
        /* Prepare for RX : */
-       master->dma_rx = dma_request_chan(dev, "rx");
-       if (IS_ERR(master->dma_rx)) {
-               ret = PTR_ERR(master->dma_rx);
+       controller->dma_rx = dma_request_chan(dev, "rx");
+       if (IS_ERR(controller->dma_rx)) {
+               ret = PTR_ERR(controller->dma_rx);
                dev_dbg(dev, "can't get the RX DMA channel, error %d\n", ret);
-               master->dma_rx = NULL;
+               controller->dma_rx = NULL;
                goto err;
        }
 
        init_completion(&spi_imx->dma_rx_completion);
        init_completion(&spi_imx->dma_tx_completion);
-       master->can_dma = spi_imx_can_dma;
-       master->max_dma_len = MAX_SDMA_BD_BYTES;
-       spi_imx->bitbang.master->flags = SPI_MASTER_MUST_RX |
-                                        SPI_MASTER_MUST_TX;
+       controller->can_dma = spi_imx_can_dma;
+       controller->max_dma_len = MAX_SDMA_BD_BYTES;
+       spi_imx->controller->flags = SPI_CONTROLLER_MUST_RX |
+                                        SPI_CONTROLLER_MUST_TX;
 
        return 0;
 err:
@@ -1349,7 +1376,7 @@ static int spi_imx_dma_transfer(struct spi_imx_data *spi_imx,
        struct dma_async_tx_descriptor *desc_tx, *desc_rx;
        unsigned long transfer_timeout;
        unsigned long timeout;
-       struct spi_master *master = spi_imx->bitbang.master;
+       struct spi_controller *controller = spi_imx->controller;
        struct sg_table *tx = &transfer->tx_sg, *rx = &transfer->rx_sg;
        struct scatterlist *last_sg = sg_last(rx->sgl, rx->nents);
        unsigned int bytes_per_word, i;
@@ -1367,7 +1394,7 @@ static int spi_imx_dma_transfer(struct spi_imx_data *spi_imx,
 
        spi_imx->wml =  i;
 
-       ret = spi_imx_dma_configure(master);
+       ret = spi_imx_dma_configure(controller);
        if (ret)
                goto dma_failure_no_start;
 
@@ -1382,7 +1409,7 @@ static int spi_imx_dma_transfer(struct spi_imx_data *spi_imx,
         * The TX DMA setup starts the transfer, so make sure RX is configured
         * before TX.
         */
-       desc_rx = dmaengine_prep_slave_sg(master->dma_rx,
+       desc_rx = dmaengine_prep_slave_sg(controller->dma_rx,
                                rx->sgl, rx->nents, DMA_DEV_TO_MEM,
                                DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
        if (!desc_rx) {
@@ -1394,14 +1421,14 @@ static int spi_imx_dma_transfer(struct spi_imx_data *spi_imx,
        desc_rx->callback_param = (void *)spi_imx;
        dmaengine_submit(desc_rx);
        reinit_completion(&spi_imx->dma_rx_completion);
-       dma_async_issue_pending(master->dma_rx);
+       dma_async_issue_pending(controller->dma_rx);
 
-       desc_tx = dmaengine_prep_slave_sg(master->dma_tx,
+       desc_tx = dmaengine_prep_slave_sg(controller->dma_tx,
                                tx->sgl, tx->nents, DMA_MEM_TO_DEV,
                                DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
        if (!desc_tx) {
-               dmaengine_terminate_all(master->dma_tx);
-               dmaengine_terminate_all(master->dma_rx);
+               dmaengine_terminate_all(controller->dma_tx);
+               dmaengine_terminate_all(controller->dma_rx);
                return -EINVAL;
        }
 
@@ -1409,7 +1436,7 @@ static int spi_imx_dma_transfer(struct spi_imx_data *spi_imx,
        desc_tx->callback_param = (void *)spi_imx;
        dmaengine_submit(desc_tx);
        reinit_completion(&spi_imx->dma_tx_completion);
-       dma_async_issue_pending(master->dma_tx);
+       dma_async_issue_pending(controller->dma_tx);
 
        transfer_timeout = spi_imx_calculate_timeout(spi_imx, transfer->len);
 
@@ -1418,21 +1445,21 @@ static int spi_imx_dma_transfer(struct spi_imx_data *spi_imx,
                                                transfer_timeout);
        if (!timeout) {
                dev_err(spi_imx->dev, "I/O Error in DMA TX\n");
-               dmaengine_terminate_all(master->dma_tx);
-               dmaengine_terminate_all(master->dma_rx);
+               dmaengine_terminate_all(controller->dma_tx);
+               dmaengine_terminate_all(controller->dma_rx);
                return -ETIMEDOUT;
        }
 
        timeout = wait_for_completion_timeout(&spi_imx->dma_rx_completion,
                                              transfer_timeout);
        if (!timeout) {
-               dev_err(&master->dev, "I/O Error in DMA RX\n");
+               dev_err(&controller->dev, "I/O Error in DMA RX\n");
                spi_imx->devtype_data->reset(spi_imx);
-               dmaengine_terminate_all(master->dma_rx);
+               dmaengine_terminate_all(controller->dma_rx);
                return -ETIMEDOUT;
        }
 
-       return transfer->len;
+       return 0;
 /* fallback to pio */
 dma_failure_no_start:
        transfer->error |= SPI_TRANS_FAIL_NO_START;
@@ -1442,7 +1469,7 @@ dma_failure_no_start:
 static int spi_imx_pio_transfer(struct spi_device *spi,
                                struct spi_transfer *transfer)
 {
-       struct spi_imx_data *spi_imx = spi_master_get_devdata(spi->master);
+       struct spi_imx_data *spi_imx = spi_controller_get_devdata(spi->controller);
        unsigned long transfer_timeout;
        unsigned long timeout;
 
@@ -1468,14 +1495,62 @@ static int spi_imx_pio_transfer(struct spi_device *spi,
                return -ETIMEDOUT;
        }
 
-       return transfer->len;
+       return 0;
+}
+
+static int spi_imx_poll_transfer(struct spi_device *spi,
+                                struct spi_transfer *transfer)
+{
+       struct spi_imx_data *spi_imx = spi_controller_get_devdata(spi->controller);
+       unsigned long timeout;
+
+       spi_imx->tx_buf = transfer->tx_buf;
+       spi_imx->rx_buf = transfer->rx_buf;
+       spi_imx->count = transfer->len;
+       spi_imx->txfifo = 0;
+       spi_imx->remainder = 0;
+
+       /* fill in the fifo before timeout calculations if we are
+        * interrupted here, then the data is getting transferred by
+        * the HW while we are interrupted
+        */
+       spi_imx_push(spi_imx);
+
+       timeout = spi_imx_calculate_timeout(spi_imx, transfer->len) + jiffies;
+       while (spi_imx->txfifo) {
+               /* RX */
+               while (spi_imx->txfifo &&
+                      spi_imx->devtype_data->rx_available(spi_imx)) {
+                       spi_imx->rx(spi_imx);
+                       spi_imx->txfifo--;
+               }
+
+               /* TX */
+               if (spi_imx->count) {
+                       spi_imx_push(spi_imx);
+                       continue;
+               }
+
+               if (spi_imx->txfifo &&
+                   time_after(jiffies, timeout)) {
+
+                       dev_err_ratelimited(&spi->dev,
+                                           "timeout period reached: jiffies: %lu- falling back to interrupt mode\n",
+                                           jiffies - timeout);
+
+                       /* fall back to interrupt mode */
+                       return spi_imx_pio_transfer(spi, transfer);
+               }
+       }
+
+       return 0;
 }
 
 static int spi_imx_pio_transfer_slave(struct spi_device *spi,
                                      struct spi_transfer *transfer)
 {
-       struct spi_imx_data *spi_imx = spi_master_get_devdata(spi->master);
-       int ret = transfer->len;
+       struct spi_imx_data *spi_imx = spi_controller_get_devdata(spi->controller);
+       int ret = 0;
 
        if (is_imx53_ecspi(spi_imx) &&
            transfer->len > MX53_MAX_TRANSFER_BYTES) {
@@ -1515,11 +1590,14 @@ static int spi_imx_pio_transfer_slave(struct spi_device *spi,
        return ret;
 }
 
-static int spi_imx_transfer(struct spi_device *spi,
+static int spi_imx_transfer_one(struct spi_controller *controller,
+                               struct spi_device *spi,
                                struct spi_transfer *transfer)
 {
-       struct spi_imx_data *spi_imx = spi_master_get_devdata(spi->master);
+       struct spi_imx_data *spi_imx = spi_controller_get_devdata(spi->controller);
+       unsigned long hz_per_byte, byte_limit;
 
+       spi_imx_setupxfer(spi, transfer);
        transfer->effective_speed_hz = spi_imx->spi_bus_clk;
 
        /* flush rxfifo before transfer */
@@ -1529,6 +1607,17 @@ static int spi_imx_transfer(struct spi_device *spi,
        if (spi_imx->slave_mode)
                return spi_imx_pio_transfer_slave(spi, transfer);
 
+       /*
+        * Calculate the estimated time in us the transfer runs. Find
+        * the number of Hz per byte per polling limit.
+        */
+       hz_per_byte = polling_limit_us ? ((8 + 4) * USEC_PER_SEC) / polling_limit_us : 0;
+       byte_limit = hz_per_byte ? transfer->effective_speed_hz / hz_per_byte : 1;
+
+       /* run in polling mode for short transfers */
+       if (transfer->len < byte_limit)
+               return spi_imx_poll_transfer(spi, transfer);
+
        if (spi_imx->usedma)
                return spi_imx_dma_transfer(spi_imx, transfer);
 
@@ -1548,14 +1637,13 @@ static void spi_imx_cleanup(struct spi_device *spi)
 }
 
 static int
-spi_imx_prepare_message(struct spi_master *master, struct spi_message *msg)
+spi_imx_prepare_message(struct spi_controller *controller, struct spi_message *msg)
 {
-       struct spi_imx_data *spi_imx = spi_master_get_devdata(master);
+       struct spi_imx_data *spi_imx = spi_controller_get_devdata(controller);
        int ret;
 
-       ret = pm_runtime_get_sync(spi_imx->dev);
+       ret = pm_runtime_resume_and_get(spi_imx->dev);
        if (ret < 0) {
-               pm_runtime_put_noidle(spi_imx->dev);
                dev_err(spi_imx->dev, "failed to enable clock\n");
                return ret;
        }
@@ -1570,18 +1658,18 @@ spi_imx_prepare_message(struct spi_master *master, struct spi_message *msg)
 }
 
 static int
-spi_imx_unprepare_message(struct spi_master *master, struct spi_message *msg)
+spi_imx_unprepare_message(struct spi_controller *controller, struct spi_message *msg)
 {
-       struct spi_imx_data *spi_imx = spi_master_get_devdata(master);
+       struct spi_imx_data *spi_imx = spi_controller_get_devdata(controller);
 
        pm_runtime_mark_last_busy(spi_imx->dev);
        pm_runtime_put_autosuspend(spi_imx->dev);
        return 0;
 }
 
-static int spi_imx_slave_abort(struct spi_master *master)
+static int spi_imx_slave_abort(struct spi_controller *controller)
 {
-       struct spi_imx_data *spi_imx = spi_master_get_devdata(master);
+       struct spi_imx_data *spi_imx = spi_controller_get_devdata(controller);
 
        spi_imx->slave_aborted = true;
        complete(&spi_imx->xfer_done);
@@ -1592,7 +1680,7 @@ static int spi_imx_slave_abort(struct spi_master *master)
 static int spi_imx_probe(struct platform_device *pdev)
 {
        struct device_node *np = pdev->dev.of_node;
-       struct spi_master *master;
+       struct spi_controller *controller;
        struct spi_imx_data *spi_imx;
        struct resource *res;
        int ret, irq, spi_drctl;
@@ -1604,12 +1692,12 @@ static int spi_imx_probe(struct platform_device *pdev)
        slave_mode = devtype_data->has_slavemode &&
                        of_property_read_bool(np, "spi-slave");
        if (slave_mode)
-               master = spi_alloc_slave(&pdev->dev,
-                                        sizeof(struct spi_imx_data));
+               controller = spi_alloc_slave(&pdev->dev,
+                                            sizeof(struct spi_imx_data));
        else
-               master = spi_alloc_master(&pdev->dev,
-                                         sizeof(struct spi_imx_data));
-       if (!master)
+               controller = spi_alloc_master(&pdev->dev,
+                                             sizeof(struct spi_imx_data));
+       if (!controller)
                return -ENOMEM;
 
        ret = of_property_read_u32(np, "fsl,spi-rdy-drctl", &spi_drctl);
@@ -1618,14 +1706,14 @@ static int spi_imx_probe(struct platform_device *pdev)
                spi_drctl = 0;
        }
 
-       platform_set_drvdata(pdev, master);
+       platform_set_drvdata(pdev, controller);
 
-       master->bits_per_word_mask = SPI_BPW_RANGE_MASK(1, 32);
-       master->bus_num = np ? -1 : pdev->id;
-       master->use_gpio_descriptors = true;
+       controller->bits_per_word_mask = SPI_BPW_RANGE_MASK(1, 32);
+       controller->bus_num = np ? -1 : pdev->id;
+       controller->use_gpio_descriptors = true;
 
-       spi_imx = spi_master_get_devdata(master);
-       spi_imx->bitbang.master = master;
+       spi_imx = spi_controller_get_devdata(controller);
+       spi_imx->controller = controller;
        spi_imx->dev = &pdev->dev;
        spi_imx->slave_mode = slave_mode;
 
@@ -1638,22 +1726,24 @@ static int spi_imx_probe(struct platform_device *pdev)
         * board files have <= 3 chip selects.
         */
        if (!device_property_read_u32(&pdev->dev, "num-cs", &val))
-               master->num_chipselect = val;
+               controller->num_chipselect = val;
        else
-               master->num_chipselect = 3;
-
-       spi_imx->bitbang.setup_transfer = spi_imx_setupxfer;
-       spi_imx->bitbang.txrx_bufs = spi_imx_transfer;
-       spi_imx->bitbang.master->setup = spi_imx_setup;
-       spi_imx->bitbang.master->cleanup = spi_imx_cleanup;
-       spi_imx->bitbang.master->prepare_message = spi_imx_prepare_message;
-       spi_imx->bitbang.master->unprepare_message = spi_imx_unprepare_message;
-       spi_imx->bitbang.master->slave_abort = spi_imx_slave_abort;
-       spi_imx->bitbang.master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH \
-                                            | SPI_NO_CS;
+               controller->num_chipselect = 3;
+
+       spi_imx->controller->transfer_one = spi_imx_transfer_one;
+       spi_imx->controller->setup = spi_imx_setup;
+       spi_imx->controller->cleanup = spi_imx_cleanup;
+       spi_imx->controller->prepare_message = spi_imx_prepare_message;
+       spi_imx->controller->unprepare_message = spi_imx_unprepare_message;
+       spi_imx->controller->slave_abort = spi_imx_slave_abort;
+       spi_imx->controller->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH | SPI_NO_CS;
+
        if (is_imx35_cspi(spi_imx) || is_imx51_ecspi(spi_imx) ||
            is_imx53_ecspi(spi_imx))
-               spi_imx->bitbang.master->mode_bits |= SPI_LOOP | SPI_READY;
+               spi_imx->controller->mode_bits |= SPI_LOOP | SPI_READY;
+
+       if (is_imx51_ecspi(spi_imx) || is_imx53_ecspi(spi_imx))
+               spi_imx->controller->mode_bits |= SPI_RX_CPHA_FLIP;
 
        if (is_imx51_ecspi(spi_imx) &&
            device_property_read_u32(&pdev->dev, "cs-gpios", NULL))
@@ -1662,7 +1752,7 @@ static int spi_imx_probe(struct platform_device *pdev)
                 * setting the burst length to the word size. This is
                 * considerably faster than manually controlling the CS.
                 */
-               spi_imx->bitbang.master->mode_bits |= SPI_CS_WORD;
+               spi_imx->controller->mode_bits |= SPI_CS_WORD;
 
        spi_imx->spi_drctl = spi_drctl;
 
@@ -1672,38 +1762,38 @@ static int spi_imx_probe(struct platform_device *pdev)
        spi_imx->base = devm_ioremap_resource(&pdev->dev, res);
        if (IS_ERR(spi_imx->base)) {
                ret = PTR_ERR(spi_imx->base);
-               goto out_master_put;
+               goto out_controller_put;
        }
        spi_imx->base_phys = res->start;
 
        irq = platform_get_irq(pdev, 0);
        if (irq < 0) {
                ret = irq;
-               goto out_master_put;
+               goto out_controller_put;
        }
 
        ret = devm_request_irq(&pdev->dev, irq, spi_imx_isr, 0,
                               dev_name(&pdev->dev), spi_imx);
        if (ret) {
                dev_err(&pdev->dev, "can't get irq%d: %d\n", irq, ret);
-               goto out_master_put;
+               goto out_controller_put;
        }
 
        spi_imx->clk_ipg = devm_clk_get(&pdev->dev, "ipg");
        if (IS_ERR(spi_imx->clk_ipg)) {
                ret = PTR_ERR(spi_imx->clk_ipg);
-               goto out_master_put;
+               goto out_controller_put;
        }
 
        spi_imx->clk_per = devm_clk_get(&pdev->dev, "per");
        if (IS_ERR(spi_imx->clk_per)) {
                ret = PTR_ERR(spi_imx->clk_per);
-               goto out_master_put;
+               goto out_controller_put;
        }
 
        ret = clk_prepare_enable(spi_imx->clk_per);
        if (ret)
-               goto out_master_put;
+               goto out_controller_put;
 
        ret = clk_prepare_enable(spi_imx->clk_ipg);
        if (ret)
@@ -1721,7 +1811,7 @@ static int spi_imx_probe(struct platform_device *pdev)
         * if validated on other chips.
         */
        if (spi_imx->devtype_data->has_dmamode) {
-               ret = spi_imx_sdma_init(&pdev->dev, spi_imx, master);
+               ret = spi_imx_sdma_init(&pdev->dev, spi_imx, controller);
                if (ret == -EPROBE_DEFER)
                        goto out_runtime_pm_put;
 
@@ -1734,11 +1824,11 @@ static int spi_imx_probe(struct platform_device *pdev)
 
        spi_imx->devtype_data->intctrl(spi_imx, 0);
 
-       master->dev.of_node = pdev->dev.of_node;
-       ret = spi_bitbang_start(&spi_imx->bitbang);
+       controller->dev.of_node = pdev->dev.of_node;
+       ret = spi_register_controller(controller);
        if (ret) {
-               dev_err_probe(&pdev->dev, ret, "bitbang start failed\n");
-               goto out_bitbang_start;
+               dev_err_probe(&pdev->dev, ret, "register controller failed\n");
+               goto out_register_controller;
        }
 
        pm_runtime_mark_last_busy(spi_imx->dev);
@@ -1746,7 +1836,7 @@ static int spi_imx_probe(struct platform_device *pdev)
 
        return ret;
 
-out_bitbang_start:
+out_register_controller:
        if (spi_imx->devtype_data->has_dmamode)
                spi_imx_sdma_exit(spi_imx);
 out_runtime_pm_put:
@@ -1757,23 +1847,22 @@ out_runtime_pm_put:
        clk_disable_unprepare(spi_imx->clk_ipg);
 out_put_per:
        clk_disable_unprepare(spi_imx->clk_per);
-out_master_put:
-       spi_master_put(master);
+out_controller_put:
+       spi_controller_put(controller);
 
        return ret;
 }
 
 static int spi_imx_remove(struct platform_device *pdev)
 {
-       struct spi_master *master = platform_get_drvdata(pdev);
-       struct spi_imx_data *spi_imx = spi_master_get_devdata(master);
+       struct spi_controller *controller = platform_get_drvdata(pdev);
+       struct spi_imx_data *spi_imx = spi_controller_get_devdata(controller);
        int ret;
 
-       spi_bitbang_stop(&spi_imx->bitbang);
+       spi_unregister_controller(controller);
 
-       ret = pm_runtime_get_sync(spi_imx->dev);
+       ret = pm_runtime_resume_and_get(spi_imx->dev);
        if (ret < 0) {
-               pm_runtime_put_noidle(spi_imx->dev);
                dev_err(spi_imx->dev, "failed to enable clock\n");
                return ret;
        }
@@ -1785,18 +1874,17 @@ static int spi_imx_remove(struct platform_device *pdev)
        pm_runtime_disable(spi_imx->dev);
 
        spi_imx_sdma_exit(spi_imx);
-       spi_master_put(master);
 
        return 0;
 }
 
 static int __maybe_unused spi_imx_runtime_resume(struct device *dev)
 {
-       struct spi_master *master = dev_get_drvdata(dev);
+       struct spi_controller *controller = dev_get_drvdata(dev);
        struct spi_imx_data *spi_imx;
        int ret;
 
-       spi_imx = spi_master_get_devdata(master);
+       spi_imx = spi_controller_get_devdata(controller);
 
        ret = clk_prepare_enable(spi_imx->clk_per);
        if (ret)
@@ -1813,10 +1901,10 @@ static int __maybe_unused spi_imx_runtime_resume(struct device *dev)
 
 static int __maybe_unused spi_imx_runtime_suspend(struct device *dev)
 {
-       struct spi_master *master = dev_get_drvdata(dev);
+       struct spi_controller *controller = dev_get_drvdata(dev);
        struct spi_imx_data *spi_imx;
 
-       spi_imx = spi_master_get_devdata(master);
+       spi_imx = spi_controller_get_devdata(controller);
 
        clk_disable_unprepare(spi_imx->clk_per);
        clk_disable_unprepare(spi_imx->clk_ipg);