diff options
author | Markus Pargmann <mpa@pengutronix.de> | 2013-12-20 08:11:28 -0500 |
---|---|---|
committer | Mark Brown <broonie@linaro.org> | 2014-01-08 12:18:30 -0500 |
commit | 2841be9afa6c9d37d41386af30cd8813acd06739 (patch) | |
tree | 2256fea505cea328fd412936e4043e8f71ab5e66 /sound | |
parent | b0a23b8b36e1fb754dcbdfe622e5ca5ded2f188b (diff) |
ASoC: fsl-ssi: Fix probe error handling
This patch fixes the error handling in the fsl-ssi probe function.
Signed-off-by: Markus Pargmann <mpa@pengutronix.de>
Signed-off-by: Mark Brown <broonie@linaro.org>
Diffstat (limited to 'sound')
-rw-r--r-- | sound/soc/fsl/fsl_ssi.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/sound/soc/fsl/fsl_ssi.c b/sound/soc/fsl/fsl_ssi.c index 816ae4b28a53..19891f2a5de4 100644 --- a/sound/soc/fsl/fsl_ssi.c +++ b/sound/soc/fsl/fsl_ssi.c | |||
@@ -141,6 +141,7 @@ struct fsl_ssi_private { | |||
141 | bool imx_ac97; | 141 | bool imx_ac97; |
142 | bool use_dma; | 142 | bool use_dma; |
143 | bool baudclk_locked; | 143 | bool baudclk_locked; |
144 | bool irq_stats; | ||
144 | u8 i2s_mode; | 145 | u8 i2s_mode; |
145 | spinlock_t baudclk_lock; | 146 | spinlock_t baudclk_lock; |
146 | struct clk *baudclk; | 147 | struct clk *baudclk; |
@@ -1224,6 +1225,7 @@ static int fsl_ssi_probe(struct platform_device *pdev) | |||
1224 | ret = devm_request_irq(&pdev->dev, ssi_private->irq, | 1225 | ret = devm_request_irq(&pdev->dev, ssi_private->irq, |
1225 | fsl_ssi_isr, 0, ssi_private->name, | 1226 | fsl_ssi_isr, 0, ssi_private->name, |
1226 | ssi_private); | 1227 | ssi_private); |
1228 | ssi_private->irq_stats = true; | ||
1227 | if (ret < 0) { | 1229 | if (ret < 0) { |
1228 | dev_err(&pdev->dev, "could not claim irq %u\n", | 1230 | dev_err(&pdev->dev, "could not claim irq %u\n", |
1229 | ssi_private->irq); | 1231 | ssi_private->irq); |
@@ -1274,11 +1276,11 @@ static int fsl_ssi_probe(struct platform_device *pdev) | |||
1274 | 1276 | ||
1275 | ret = imx_pcm_fiq_init(pdev, &ssi_private->fiq_params); | 1277 | ret = imx_pcm_fiq_init(pdev, &ssi_private->fiq_params); |
1276 | if (ret) | 1278 | if (ret) |
1277 | goto error_dev; | 1279 | goto error_pcm; |
1278 | } else { | 1280 | } else { |
1279 | ret = imx_pcm_dma_init(pdev); | 1281 | ret = imx_pcm_dma_init(pdev); |
1280 | if (ret) | 1282 | if (ret) |
1281 | goto error_dev; | 1283 | goto error_pcm; |
1282 | } | 1284 | } |
1283 | } | 1285 | } |
1284 | 1286 | ||
@@ -1320,6 +1322,10 @@ done: | |||
1320 | return 0; | 1322 | return 0; |
1321 | 1323 | ||
1322 | error_dai: | 1324 | error_dai: |
1325 | if (ssi_private->ssi_on_imx && !ssi_private->use_dma) | ||
1326 | imx_pcm_fiq_exit(pdev); | ||
1327 | |||
1328 | error_pcm: | ||
1323 | snd_soc_unregister_component(&pdev->dev); | 1329 | snd_soc_unregister_component(&pdev->dev); |
1324 | 1330 | ||
1325 | error_dev: | 1331 | error_dev: |
@@ -1333,7 +1339,8 @@ error_clk: | |||
1333 | } | 1339 | } |
1334 | 1340 | ||
1335 | error_irqmap: | 1341 | error_irqmap: |
1336 | irq_dispose_mapping(ssi_private->irq); | 1342 | if (ssi_private->irq_stats) |
1343 | irq_dispose_mapping(ssi_private->irq); | ||
1337 | 1344 | ||
1338 | return ret; | 1345 | return ret; |
1339 | } | 1346 | } |
@@ -1351,7 +1358,8 @@ static int fsl_ssi_remove(struct platform_device *pdev) | |||
1351 | clk_disable_unprepare(ssi_private->baudclk); | 1358 | clk_disable_unprepare(ssi_private->baudclk); |
1352 | clk_disable_unprepare(ssi_private->clk); | 1359 | clk_disable_unprepare(ssi_private->clk); |
1353 | } | 1360 | } |
1354 | irq_dispose_mapping(ssi_private->irq); | 1361 | if (ssi_private->irq_stats) |
1362 | irq_dispose_mapping(ssi_private->irq); | ||
1355 | 1363 | ||
1356 | return 0; | 1364 | return 0; |
1357 | } | 1365 | } |