diff options
Diffstat (limited to 'drivers/spi/spi-imx.c')
-rw-r--r-- | drivers/spi/spi-imx.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c index e7a19be87c38..50769078e72e 100644 --- a/drivers/spi/spi-imx.c +++ b/drivers/spi/spi-imx.c | |||
@@ -211,11 +211,15 @@ static bool spi_imx_can_dma(struct spi_master *master, struct spi_device *spi, | |||
211 | struct spi_transfer *transfer) | 211 | struct spi_transfer *transfer) |
212 | { | 212 | { |
213 | struct spi_imx_data *spi_imx = spi_master_get_devdata(master); | 213 | struct spi_imx_data *spi_imx = spi_master_get_devdata(master); |
214 | unsigned int bpw = transfer->bits_per_word; | 214 | unsigned int bpw; |
215 | 215 | ||
216 | if (!master->dma_rx) | 216 | if (!master->dma_rx) |
217 | return false; | 217 | return false; |
218 | 218 | ||
219 | if (!transfer) | ||
220 | return false; | ||
221 | |||
222 | bpw = transfer->bits_per_word; | ||
219 | if (!bpw) | 223 | if (!bpw) |
220 | bpw = spi->bits_per_word; | 224 | bpw = spi->bits_per_word; |
221 | 225 | ||
@@ -333,8 +337,9 @@ static void __maybe_unused mx51_ecspi_trigger(struct spi_imx_data *spi_imx) | |||
333 | static int __maybe_unused mx51_ecspi_config(struct spi_imx_data *spi_imx, | 337 | static int __maybe_unused mx51_ecspi_config(struct spi_imx_data *spi_imx, |
334 | struct spi_imx_config *config) | 338 | struct spi_imx_config *config) |
335 | { | 339 | { |
336 | u32 ctrl = MX51_ECSPI_CTRL_ENABLE, cfg = 0; | 340 | u32 ctrl = MX51_ECSPI_CTRL_ENABLE; |
337 | u32 clk = config->speed_hz, delay, reg; | 341 | u32 clk = config->speed_hz, delay, reg; |
342 | u32 cfg = readl(spi_imx->base + MX51_ECSPI_CONFIG); | ||
338 | 343 | ||
339 | /* | 344 | /* |
340 | * The hardware seems to have a race condition when changing modes. The | 345 | * The hardware seems to have a race condition when changing modes. The |
@@ -358,13 +363,20 @@ static int __maybe_unused mx51_ecspi_config(struct spi_imx_data *spi_imx, | |||
358 | 363 | ||
359 | if (config->mode & SPI_CPHA) | 364 | if (config->mode & SPI_CPHA) |
360 | cfg |= MX51_ECSPI_CONFIG_SCLKPHA(config->cs); | 365 | cfg |= MX51_ECSPI_CONFIG_SCLKPHA(config->cs); |
366 | else | ||
367 | cfg &= ~MX51_ECSPI_CONFIG_SCLKPHA(config->cs); | ||
361 | 368 | ||
362 | if (config->mode & SPI_CPOL) { | 369 | if (config->mode & SPI_CPOL) { |
363 | cfg |= MX51_ECSPI_CONFIG_SCLKPOL(config->cs); | 370 | cfg |= MX51_ECSPI_CONFIG_SCLKPOL(config->cs); |
364 | cfg |= MX51_ECSPI_CONFIG_SCLKCTL(config->cs); | 371 | cfg |= MX51_ECSPI_CONFIG_SCLKCTL(config->cs); |
372 | } else { | ||
373 | cfg &= ~MX51_ECSPI_CONFIG_SCLKPOL(config->cs); | ||
374 | cfg &= ~MX51_ECSPI_CONFIG_SCLKCTL(config->cs); | ||
365 | } | 375 | } |
366 | if (config->mode & SPI_CS_HIGH) | 376 | if (config->mode & SPI_CS_HIGH) |
367 | cfg |= MX51_ECSPI_CONFIG_SSBPOL(config->cs); | 377 | cfg |= MX51_ECSPI_CONFIG_SSBPOL(config->cs); |
378 | else | ||
379 | cfg &= ~MX51_ECSPI_CONFIG_SSBPOL(config->cs); | ||
368 | 380 | ||
369 | if (spi_imx->usedma) | 381 | if (spi_imx->usedma) |
370 | ctrl |= MX51_ECSPI_CTRL_SMC; | 382 | ctrl |= MX51_ECSPI_CTRL_SMC; |