summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@quicinc.com>2018-02-01 01:42:06 -0800
committerGerrit - the friendly Code Review server <code-review@localhost>2018-02-01 01:42:06 -0800
commit92c282612363986f25bd473c838d7b47af1a2e53 (patch)
tree7a8cbe615f74f5b1dcf0e67f743dd99911c98117
parente08d3d8ae8b117f6b29ca860ef26cf12254e35a9 (diff)
parent363bbeba93346dd8551467d4bc26a9643ed9526c (diff)
Merge "spi: spi_qsd: Correct SPI slave hw init sequence"
-rw-r--r--drivers/spi/spi_qsd.c27
1 files changed, 23 insertions, 4 deletions
diff --git a/drivers/spi/spi_qsd.c b/drivers/spi/spi_qsd.c
index 5fd1565d692f..aa7386325893 100644
--- a/drivers/spi/spi_qsd.c
+++ b/drivers/spi/spi_qsd.c
@@ -1799,10 +1799,7 @@ static void msm_spi_slv_setup(struct msm_spi *dd)
u32 irq_en = GENMASK(6, 0);
qup_config &= ~QUP_CFG_MODE;
- qup_config |= QUP_CONFIG_SPI_SLAVE;
- qup_config |= (SPI_EN_EXT_OUT_FLAG | APP_CLK_ON_EN | CORE_CLK_ON_EN
- | FIFO_CLK_ON_EN | CORE_EX_CLK_ON_EN);
- spi_config |= SPI_CFG_SLAVE_OP;
+ qup_config |= SPI_EN_EXT_OUT_FLAG;
writel_relaxed(qup_config, dd->base + QUP_CONFIG);
writel_relaxed(spi_config, dd->base + SPI_CONFIG);
writel_relaxed(irq_en, (dd->base + SPI_SLAVE_IRQ_EN));
@@ -1813,6 +1810,28 @@ static void msm_spi_slv_setup(struct msm_spi *dd)
writel_relaxed(slv_cfg, (dd->base + SPI_SLAVE_CONFIG));
}
/*
+ * Ensure the previous write completed before enabling slave mode.
+ */
+ mb();
+
+ spi_config = readl_relaxed(dd->base + SPI_CONFIG);
+ qup_config = readl_relaxed(dd->base + QUP_CONFIG);
+
+ qup_config |= QUP_CONFIG_SPI_SLAVE;
+ spi_config |= SPI_CFG_SLAVE_OP;
+
+ writel_relaxed(qup_config, dd->base + QUP_CONFIG);
+ writel_relaxed(spi_config, dd->base + SPI_CONFIG);
+ /*
+ * Ensure the previous write completed before enabling clk_on bit.
+ */
+ mb();
+
+ qup_config = readl_relaxed(dd->base + QUP_CONFIG);
+ qup_config |= (APP_CLK_ON_EN | CORE_CLK_ON_EN |
+ FIFO_CLK_ON_EN | CORE_EX_CLK_ON_EN);
+ writel_relaxed(qup_config, dd->base + QUP_CONFIG);
+ /*
* Ensure Slave setup completes before returning.
*/
mb();