diff options
| -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; |
