3.16-stable review patch.  If anyone has any objections, please let me know.

------------------

From: "Mark A. Greer" <mgr...@animalcreek.com>

commit 97ca0d6cc118716840ea443e010cb3d5f2d25eaf upstream.

Commit id 2bd16e3e23d9df41592c6b257c59b6860a9cc3ea
(spi: omap2-mcspi: Do not configure the controller
on each transfer unless needed) does its job too
well so omap2_mcspi_setup_transfer() isn't called
even when an SPI slave driver changes 'spi->mode'.
The result is that the mode requested by the SPI
slave driver never takes effect.

Fix this by adding the 'mode' member to the
omap2_mcspi_cs structure which holds the mode
value that the hardware is configured for.
When the SPI slave driver changes 'spi->mode'
it will be different than the value of this new
member and the SPI master driver will know that
the hardware must be reconfigured (by calling
omap2_mcspi_setup_transfer()).

Fixes: 2bd16e3e23 (spi: omap2-mcspi: Do not configure the controller on each 
transfer unless needed)
Signed-off-by: Mark A. Greer <mgr...@animalcreek.com>
Signed-off-by: Mark Brown <broo...@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gre...@linuxfoundation.org>

---
 drivers/spi/spi-omap2-mcspi.c |   14 ++++++++++++++
 1 file changed, 14 insertions(+)

--- a/drivers/spi/spi-omap2-mcspi.c
+++ b/drivers/spi/spi-omap2-mcspi.c
@@ -149,6 +149,7 @@ struct omap2_mcspi_cs {
        void __iomem            *base;
        unsigned long           phys;
        int                     word_len;
+       u16                     mode;
        struct list_head        node;
        /* Context save and restore shadow register */
        u32                     chconf0, chctrl0;
@@ -926,6 +927,8 @@ static int omap2_mcspi_setup_transfer(st
 
        mcspi_write_chconf0(spi, l);
 
+       cs->mode = spi->mode;
+
        dev_dbg(&spi->dev, "setup: speed %d, sample %s edge, clk %s\n",
                        speed_hz,
                        (spi->mode & SPI_CPHA) ? "trailing" : "leading",
@@ -998,6 +1001,7 @@ static int omap2_mcspi_setup(struct spi_
                        return -ENOMEM;
                cs->base = mcspi->base + spi->chip_select * 0x14;
                cs->phys = mcspi->phys + spi->chip_select * 0x14;
+               cs->mode = 0;
                cs->chconf0 = 0;
                cs->chctrl0 = 0;
                spi->controller_state = cs;
@@ -1079,6 +1083,16 @@ static void omap2_mcspi_work(struct omap
        cs = spi->controller_state;
        cd = spi->controller_data;
 
+       /*
+        * The slave driver could have changed spi->mode in which case
+        * it will be different from cs->mode (the current hardware setup).
+        * If so, set par_override (even though its not a parity issue) so
+        * omap2_mcspi_setup_transfer will be called to configure the hardware
+        * with the correct mode on the first iteration of the loop below.
+        */
+       if (spi->mode != cs->mode)
+               par_override = 1;
+
        omap2_mcspi_set_enable(spi, 0);
        list_for_each_entry(t, &m->transfers, transfer_list) {
                if (t->tx_buf == NULL && t->rx_buf == NULL && t->len) {


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to