aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorDaniel Mack <daniel@caiaq.de>2009-11-19 14:01:42 -0500
committerGrant Likely <grant.likely@secretlab.ca>2009-12-08 20:48:16 -0500
commitce1807b2e527979bd77d8a1a1768a6365f3febb5 (patch)
tree2bbf8ecbf000083f147fab885bdb91894c56186a /drivers
parentd33c861e71c57dd69d39d88b84a672adf86a2144 (diff)
spi/i.mx: drain MXC SPI transfer buffer when probing device
On the MX31litekit, the bootloader seems to communicate with the MC13783 PMIC chip before booting Linux. However, it does not flush all the buffers properly after that, which makes the imx-spi driver read bogus data when probing the MC13783. Fix that by draining the SPI receive buffer on startup. Signed-off-by: Daniel Mack <daniel@caiaq.de> Acked-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/spi/spi_imx.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/drivers/spi/spi_imx.c b/drivers/spi/spi_imx.c
index 89c22efedfb0..1b17f443dee7 100644
--- a/drivers/spi/spi_imx.c
+++ b/drivers/spi/spi_imx.c
@@ -44,6 +44,9 @@
44#define MXC_CSPIINT 0x0c 44#define MXC_CSPIINT 0x0c
45#define MXC_RESET 0x1c 45#define MXC_RESET 0x1c
46 46
47#define MX3_CSPISTAT 0x14
48#define MX3_CSPISTAT_RR (1 << 3)
49
47/* generic defines to abstract from the different register layouts */ 50/* generic defines to abstract from the different register layouts */
48#define MXC_INT_RR (1 << 0) /* Receive data ready interrupt */ 51#define MXC_INT_RR (1 << 0) /* Receive data ready interrupt */
49#define MXC_INT_TE (1 << 1) /* Transmit FIFO empty interrupt */ 52#define MXC_INT_TE (1 << 1) /* Transmit FIFO empty interrupt */
@@ -593,6 +596,11 @@ static int __init spi_imx_probe(struct platform_device *pdev)
593 if (!cpu_is_mx31() || !cpu_is_mx35()) 596 if (!cpu_is_mx31() || !cpu_is_mx35())
594 writel(1, spi_imx->base + MXC_RESET); 597 writel(1, spi_imx->base + MXC_RESET);
595 598
599 /* drain receive buffer */
600 if (cpu_is_mx31() || cpu_is_mx35())
601 while (readl(spi_imx->base + MX3_CSPISTAT) & MX3_CSPISTAT_RR)
602 readl(spi_imx->base + MXC_CSPIRXDATA);
603
596 spi_imx->intctrl(spi_imx, 0); 604 spi_imx->intctrl(spi_imx, 0);
597 605
598 ret = spi_bitbang_start(&spi_imx->bitbang); 606 ret = spi_bitbang_start(&spi_imx->bitbang);