aboutsummaryrefslogtreecommitdiffstats
path: root/sound
diff options
context:
space:
mode:
authorMarkus Pargmann <mpa@pengutronix.de>2013-12-20 08:11:28 -0500
committerMark Brown <broonie@linaro.org>2014-01-08 12:18:30 -0500
commit2841be9afa6c9d37d41386af30cd8813acd06739 (patch)
tree2256fea505cea328fd412936e4043e8f71ab5e66 /sound
parentb0a23b8b36e1fb754dcbdfe622e5ca5ded2f188b (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.c16
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
1322error_dai: 1324error_dai:
1325 if (ssi_private->ssi_on_imx && !ssi_private->use_dma)
1326 imx_pcm_fiq_exit(pdev);
1327
1328error_pcm:
1323 snd_soc_unregister_component(&pdev->dev); 1329 snd_soc_unregister_component(&pdev->dev);
1324 1330
1325error_dev: 1331error_dev:
@@ -1333,7 +1339,8 @@ error_clk:
1333 } 1339 }
1334 1340
1335error_irqmap: 1341error_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}