diff options
author | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2013-04-18 13:12:00 -0400 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2013-04-18 13:17:27 -0400 |
commit | fb9d044efbb54918f35a718691126248b236a06e (patch) | |
tree | 6dc24810933935d861210eef00555479a79e05f4 | |
parent | 563b444e33810f3120838620c990480304e24e63 (diff) |
spi/s3c64xx: Check for errors in dmaengine prepare_transfer()
Don't silently ignore errors, report them.
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
-rw-r--r-- | drivers/spi/spi-s3c64xx.c | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/drivers/spi/spi-s3c64xx.c b/drivers/spi/spi-s3c64xx.c index 6d6537d09d4f..5000586cb98d 100644 --- a/drivers/spi/spi-s3c64xx.c +++ b/drivers/spi/spi-s3c64xx.c | |||
@@ -421,6 +421,7 @@ static int s3c64xx_spi_prepare_transfer(struct spi_master *spi) | |||
421 | dma_filter_fn filter = sdd->cntrlr_info->filter; | 421 | dma_filter_fn filter = sdd->cntrlr_info->filter; |
422 | struct device *dev = &sdd->pdev->dev; | 422 | struct device *dev = &sdd->pdev->dev; |
423 | dma_cap_mask_t mask; | 423 | dma_cap_mask_t mask; |
424 | int ret; | ||
424 | 425 | ||
425 | dma_cap_zero(mask); | 426 | dma_cap_zero(mask); |
426 | dma_cap_set(DMA_SLAVE, mask); | 427 | dma_cap_set(DMA_SLAVE, mask); |
@@ -428,11 +429,34 @@ static int s3c64xx_spi_prepare_transfer(struct spi_master *spi) | |||
428 | /* Acquire DMA channels */ | 429 | /* Acquire DMA channels */ |
429 | sdd->rx_dma.ch = dma_request_slave_channel_compat(mask, filter, | 430 | sdd->rx_dma.ch = dma_request_slave_channel_compat(mask, filter, |
430 | (void*)sdd->rx_dma.dmach, dev, "rx"); | 431 | (void*)sdd->rx_dma.dmach, dev, "rx"); |
432 | if (!sdd->rx_dma.ch) { | ||
433 | dev_err(dev, "Failed to get RX DMA channel\n"); | ||
434 | ret = -EBUSY; | ||
435 | goto out; | ||
436 | } | ||
437 | |||
431 | sdd->tx_dma.ch = dma_request_slave_channel_compat(mask, filter, | 438 | sdd->tx_dma.ch = dma_request_slave_channel_compat(mask, filter, |
432 | (void*)sdd->tx_dma.dmach, dev, "tx"); | 439 | (void*)sdd->tx_dma.dmach, dev, "tx"); |
433 | pm_runtime_get_sync(&sdd->pdev->dev); | 440 | if (!sdd->tx_dma.ch) { |
441 | dev_err(dev, "Failed to get TX DMA channel\n"); | ||
442 | ret = -EBUSY; | ||
443 | goto out_rx; | ||
444 | } | ||
445 | |||
446 | ret = pm_runtime_get_sync(&sdd->pdev->dev); | ||
447 | if (ret != 0) { | ||
448 | dev_err(dev, "Failed to enable device: %d\n", ret); | ||
449 | goto out_tx; | ||
450 | } | ||
434 | 451 | ||
435 | return 0; | 452 | return 0; |
453 | |||
454 | out_tx: | ||
455 | dma_release_channel(sdd->tx_dma.ch); | ||
456 | out_rx: | ||
457 | dma_release_channel(sdd->rx_dma.ch); | ||
458 | out: | ||
459 | return ret; | ||
436 | } | 460 | } |
437 | 461 | ||
438 | static int s3c64xx_spi_unprepare_transfer(struct spi_master *spi) | 462 | static int s3c64xx_spi_unprepare_transfer(struct spi_master *spi) |