diff options
author | olivier moysan <olivier.moysan@st.com> | 2017-11-06 10:18:53 -0500 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2017-11-06 10:45:45 -0500 |
commit | 98c8dc2fd59fdad77d26d7b0d7007776c5fbec16 (patch) | |
tree | 53bb5f23c1e531df3ac87d31c21f711b51bff75f | |
parent | 9036e4acc81700a51e5f42820ba4570bea9b6f48 (diff) |
ASoC: stm32: spdifrx: fix control DMA error management
Fix DMA channel request error handling.
Signed-off-by: Olivier Moysan <olivier.moysan@st.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r-- | sound/soc/stm/stm32_spdifrx.c | 15 |
1 files changed, 7 insertions, 8 deletions
diff --git a/sound/soc/stm/stm32_spdifrx.c b/sound/soc/stm/stm32_spdifrx.c index d7dbe84d5eeb..b9bdefcd3e10 100644 --- a/sound/soc/stm/stm32_spdifrx.c +++ b/sound/soc/stm/stm32_spdifrx.c | |||
@@ -392,6 +392,12 @@ static int stm32_spdifrx_dma_ctrl_register(struct device *dev, | |||
392 | { | 392 | { |
393 | int ret; | 393 | int ret; |
394 | 394 | ||
395 | spdifrx->ctrl_chan = dma_request_chan(dev, "rx-ctrl"); | ||
396 | if (IS_ERR(spdifrx->ctrl_chan)) { | ||
397 | dev_err(dev, "dma_request_slave_channel failed\n"); | ||
398 | return PTR_ERR(spdifrx->ctrl_chan); | ||
399 | } | ||
400 | |||
395 | spdifrx->dmab = devm_kzalloc(dev, sizeof(struct snd_dma_buffer), | 401 | spdifrx->dmab = devm_kzalloc(dev, sizeof(struct snd_dma_buffer), |
396 | GFP_KERNEL); | 402 | GFP_KERNEL); |
397 | if (!spdifrx->dmab) | 403 | if (!spdifrx->dmab) |
@@ -406,12 +412,6 @@ static int stm32_spdifrx_dma_ctrl_register(struct device *dev, | |||
406 | return ret; | 412 | return ret; |
407 | } | 413 | } |
408 | 414 | ||
409 | spdifrx->ctrl_chan = dma_request_chan(dev, "rx-ctrl"); | ||
410 | if (!spdifrx->ctrl_chan) { | ||
411 | dev_err(dev, "dma_request_slave_channel failed\n"); | ||
412 | return -EINVAL; | ||
413 | } | ||
414 | |||
415 | spdifrx->slave_config.direction = DMA_DEV_TO_MEM; | 415 | spdifrx->slave_config.direction = DMA_DEV_TO_MEM; |
416 | spdifrx->slave_config.src_addr = (dma_addr_t)(spdifrx->phys_addr + | 416 | spdifrx->slave_config.src_addr = (dma_addr_t)(spdifrx->phys_addr + |
417 | STM32_SPDIFRX_CSR); | 417 | STM32_SPDIFRX_CSR); |
@@ -423,7 +423,6 @@ static int stm32_spdifrx_dma_ctrl_register(struct device *dev, | |||
423 | &spdifrx->slave_config); | 423 | &spdifrx->slave_config); |
424 | if (ret < 0) { | 424 | if (ret < 0) { |
425 | dev_err(dev, "dmaengine_slave_config returned error %d\n", ret); | 425 | dev_err(dev, "dmaengine_slave_config returned error %d\n", ret); |
426 | dma_release_channel(spdifrx->ctrl_chan); | ||
427 | spdifrx->ctrl_chan = NULL; | 426 | spdifrx->ctrl_chan = NULL; |
428 | } | 427 | } |
429 | 428 | ||
@@ -962,7 +961,7 @@ static int stm32_spdifrx_probe(struct platform_device *pdev) | |||
962 | return 0; | 961 | return 0; |
963 | 962 | ||
964 | error: | 963 | error: |
965 | if (spdifrx->ctrl_chan) | 964 | if (!IS_ERR(spdifrx->ctrl_chan)) |
966 | dma_release_channel(spdifrx->ctrl_chan); | 965 | dma_release_channel(spdifrx->ctrl_chan); |
967 | if (spdifrx->dmab) | 966 | if (spdifrx->dmab) |
968 | snd_dma_free_pages(spdifrx->dmab); | 967 | snd_dma_free_pages(spdifrx->dmab); |