Merge tag 'v4.0-rc7' into spi-img-spfi
[pandora-kernel.git] / drivers / spi / spi-img-spfi.c
index e649bc7..c9f3bca 100644 (file)
@@ -134,7 +134,6 @@ static inline void spfi_stop(struct img_spfi *spfi)
 static inline void spfi_reset(struct img_spfi *spfi)
 {
        spfi_writel(spfi, SPFI_CONTROL_SOFT_RESET, SPFI_CONTROL);
-       udelay(1);
        spfi_writel(spfi, 0, SPFI_CONTROL);
 }
 
@@ -397,6 +396,25 @@ stop_dma:
        return -EIO;
 }
 
+static int img_spfi_prepare(struct spi_master *master, struct spi_message *msg)
+{
+       struct img_spfi *spfi = spi_master_get_devdata(master);
+       u32 val;
+
+       val = spfi_readl(spfi, SPFI_PORT_STATE);
+       if (msg->spi->mode & SPI_CPHA)
+               val |= SPFI_PORT_STATE_CK_PHASE(msg->spi->chip_select);
+       else
+               val &= ~SPFI_PORT_STATE_CK_PHASE(msg->spi->chip_select);
+       if (msg->spi->mode & SPI_CPOL)
+               val |= SPFI_PORT_STATE_CK_POL(msg->spi->chip_select);
+       else
+               val &= ~SPFI_PORT_STATE_CK_POL(msg->spi->chip_select);
+       spfi_writel(spfi, val, SPFI_PORT_STATE);
+
+       return 0;
+}
+
 static void img_spfi_config(struct spi_master *master, struct spi_device *spi,
                            struct spi_transfer *xfer)
 {
@@ -416,6 +434,9 @@ static void img_spfi_config(struct spi_master *master, struct spi_device *spi,
        val |= div << SPFI_DEVICE_PARAMETER_BITCLK_SHIFT;
        spfi_writel(spfi, val, SPFI_DEVICE_PARAMETER(spi->chip_select));
 
+       spfi_writel(spfi, xfer->len << SPFI_TRANSACTION_TSIZE_SHIFT,
+                   SPFI_TRANSACTION);
+
        val = spfi_readl(spfi, SPFI_CONTROL);
        val &= ~(SPFI_CONTROL_SEND_DMA | SPFI_CONTROL_GET_DMA);
        if (xfer->tx_buf)
@@ -434,20 +455,6 @@ static void img_spfi_config(struct spi_master *master, struct spi_device *spi,
                                              &master->cur_msg->transfers))
                val |= SPFI_CONTROL_CONTINUE;
        spfi_writel(spfi, val, SPFI_CONTROL);
-
-       val = spfi_readl(spfi, SPFI_PORT_STATE);
-       if (spi->mode & SPI_CPHA)
-               val |= SPFI_PORT_STATE_CK_PHASE(spi->chip_select);
-       else
-               val &= ~SPFI_PORT_STATE_CK_PHASE(spi->chip_select);
-       if (spi->mode & SPI_CPOL)
-               val |= SPFI_PORT_STATE_CK_POL(spi->chip_select);
-       else
-               val &= ~SPFI_PORT_STATE_CK_POL(spi->chip_select);
-       spfi_writel(spfi, val, SPFI_PORT_STATE);
-
-       spfi_writel(spfi, xfer->len << SPFI_TRANSACTION_TSIZE_SHIFT,
-                   SPFI_TRANSACTION);
 }
 
 static int img_spfi_transfer_one(struct spi_master *master,
@@ -599,6 +606,7 @@ static int img_spfi_probe(struct platform_device *pdev)
 
        master->set_cs = img_spfi_set_cs;
        master->transfer_one = img_spfi_transfer_one;
+       master->prepare_message = img_spfi_prepare;
 
        spfi->tx_ch = dma_request_slave_channel(spfi->dev, "tx");
        spfi->rx_ch = dma_request_slave_channel(spfi->dev, "rx");