|
@@ -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(struct spi_device *spi,
|
|
|
|
|
|
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_device *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 omap2_mcspi *mcspi, struct spi_message *m)
|
|
|
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) {
|