]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
spi: img-spfi: Implement a prepare_message() callback
authorEzequiel Garcia <ezequiel.garcia@imgtec.com>
Mon, 6 Apr 2015 21:29:04 +0000 (14:29 -0700)
committerMark Brown <broonie@kernel.org>
Tue, 7 Apr 2015 11:17:54 +0000 (12:17 +0100)
In preparation for switching to using the SPI core's CS GPIO handling,
move setup of the PORT_STATE register, which must be configured before
CS is asserted, to a prepare_message() callback.

Signed-off-by: Ezequiel Garcia <ezequiel.garcia@imgtec.com>
Signed-off-by: Andrew Bresticker <abrestic@chromium.org>
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/spi/spi-img-spfi.c

index fde4b5dd40f28f30bc7976139c90580141da697f..642259e88429b42f02c685b06faa81fff0459c58 100644 (file)
@@ -396,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)
 {
@@ -433,18 +452,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);
 }
@@ -591,6 +598,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");