aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/spi/spi-imx.c
diff options
context:
space:
mode:
authorFabio Estevam <fabio.estevam@freescale.com>2015-12-03 20:23:24 -0500
committerMark Brown <broonie@kernel.org>2015-12-04 07:13:02 -0500
commit9f6aa42bbbb23d2115704c5044da951a7e685cc5 (patch)
treef2fe81d06fbca90f22abfbdb570ea0c5efb820b8 /drivers/spi/spi-imx.c
parent8005c49d9aea74d382f474ce11afbbc7d7130bec (diff)
spi: imx: Add loopback mode support
Loopback mode can be activated by setting bit LBC (LoopBack Control) of register ECSPI_TESTREG. Add support for it. Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com> Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to 'drivers/spi/spi-imx.c')
-rw-r--r--drivers/spi/spi-imx.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c
index 0e5723ab47f0..e7e4f0c0f14d 100644
--- a/drivers/spi/spi-imx.c
+++ b/drivers/spi/spi-imx.c
@@ -244,6 +244,9 @@ static bool spi_imx_can_dma(struct spi_master *master, struct spi_device *spi,
244#define MX51_ECSPI_STAT 0x18 244#define MX51_ECSPI_STAT 0x18
245#define MX51_ECSPI_STAT_RR (1 << 3) 245#define MX51_ECSPI_STAT_RR (1 << 3)
246 246
247#define MX51_ECSPI_TESTREG 0x20
248#define MX51_ECSPI_TESTREG_LBC BIT(31)
249
247/* MX51 eCSPI */ 250/* MX51 eCSPI */
248static unsigned int mx51_ecspi_clkdiv(unsigned int fin, unsigned int fspi, 251static unsigned int mx51_ecspi_clkdiv(unsigned int fin, unsigned int fspi,
249 unsigned int *fres) 252 unsigned int *fres)
@@ -313,7 +316,7 @@ static int __maybe_unused mx51_ecspi_config(struct spi_imx_data *spi_imx,
313{ 316{
314 u32 ctrl = MX51_ECSPI_CTRL_ENABLE, cfg = 0, dma = 0; 317 u32 ctrl = MX51_ECSPI_CTRL_ENABLE, cfg = 0, dma = 0;
315 u32 tx_wml_cfg, rx_wml_cfg, rxt_wml_cfg; 318 u32 tx_wml_cfg, rx_wml_cfg, rxt_wml_cfg;
316 u32 clk = config->speed_hz, delay; 319 u32 clk = config->speed_hz, delay, reg;
317 320
318 /* 321 /*
319 * The hardware seems to have a race condition when changing modes. The 322 * The hardware seems to have a race condition when changing modes. The
@@ -351,6 +354,13 @@ static int __maybe_unused mx51_ecspi_config(struct spi_imx_data *spi_imx,
351 else 354 else
352 cfg &= ~MX51_ECSPI_CONFIG_SSBPOL(config->cs); 355 cfg &= ~MX51_ECSPI_CONFIG_SSBPOL(config->cs);
353 356
357 reg = readl(spi_imx->base + MX51_ECSPI_TESTREG);
358 if (config->mode & SPI_LOOP)
359 reg |= MX51_ECSPI_TESTREG_LBC;
360 else
361 reg &= ~MX51_ECSPI_TESTREG_LBC;
362 writel(reg, spi_imx->base + MX51_ECSPI_TESTREG);
363
354 writel(ctrl, spi_imx->base + MX51_ECSPI_CTRL); 364 writel(ctrl, spi_imx->base + MX51_ECSPI_CTRL);
355 writel(cfg, spi_imx->base + MX51_ECSPI_CONFIG); 365 writel(cfg, spi_imx->base + MX51_ECSPI_CONFIG);
356 366
@@ -1141,7 +1151,8 @@ static int spi_imx_probe(struct platform_device *pdev)
1141 spi_imx->bitbang.master->cleanup = spi_imx_cleanup; 1151 spi_imx->bitbang.master->cleanup = spi_imx_cleanup;
1142 spi_imx->bitbang.master->prepare_message = spi_imx_prepare_message; 1152 spi_imx->bitbang.master->prepare_message = spi_imx_prepare_message;
1143 spi_imx->bitbang.master->unprepare_message = spi_imx_unprepare_message; 1153 spi_imx->bitbang.master->unprepare_message = spi_imx_unprepare_message;
1144 spi_imx->bitbang.master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH; 1154 spi_imx->bitbang.master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH |
1155 SPI_LOOP;
1145 1156
1146 init_completion(&spi_imx->xfer_done); 1157 init_completion(&spi_imx->xfer_done);
1147 1158