diff options
author | Fabio Estevam <fabio.estevam@freescale.com> | 2015-12-03 20:23:24 -0500 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2015-12-04 07:13:02 -0500 |
commit | 9f6aa42bbbb23d2115704c5044da951a7e685cc5 (patch) | |
tree | f2fe81d06fbca90f22abfbdb570ea0c5efb820b8 /drivers/spi/spi-imx.c | |
parent | 8005c49d9aea74d382f474ce11afbbc7d7130bec (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.c | 15 |
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 */ |
248 | static unsigned int mx51_ecspi_clkdiv(unsigned int fin, unsigned int fspi, | 251 | static 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 | ||