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) |
