aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPramod Gurav <pramod.gurav@smartplayin.com>2015-02-06 06:21:44 -0500
committerVinod Koul <vinod.koul@intel.com>2015-02-23 06:26:13 -0500
commit81ceefa49e26069d05f2c3350930d2896de0baeb (patch)
treeb317774747f1d354e420532d20ec77c1cb075d69
parentc517d838eb7d07bbe9507871fab3931deccff539 (diff)
dmaengine: qcom_bam_dma: Fix error path in probe function
Calls tasklet_kill() in error path of the probe function were missing. Add the same in error path. Signed-off-by: Pramod Gurav <pramod.gurav@smartplayin.com> Signed-off-by: Vinod Koul <vinod.koul@intel.com>
-rw-r--r--drivers/dma/qcom_bam_dma.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/drivers/dma/qcom_bam_dma.c b/drivers/dma/qcom_bam_dma.c
index d7a33b3ac466..cbacee55f7ef 100644
--- a/drivers/dma/qcom_bam_dma.c
+++ b/drivers/dma/qcom_bam_dma.c
@@ -1113,7 +1113,7 @@ static int bam_dma_probe(struct platform_device *pdev)
1113 1113
1114 if (!bdev->channels) { 1114 if (!bdev->channels) {
1115 ret = -ENOMEM; 1115 ret = -ENOMEM;
1116 goto err_disable_clk; 1116 goto err_tasklet_kill;
1117 } 1117 }
1118 1118
1119 /* allocate and initialize channels */ 1119 /* allocate and initialize channels */
@@ -1125,7 +1125,7 @@ static int bam_dma_probe(struct platform_device *pdev)
1125 ret = devm_request_irq(bdev->dev, bdev->irq, bam_dma_irq, 1125 ret = devm_request_irq(bdev->dev, bdev->irq, bam_dma_irq,
1126 IRQF_TRIGGER_HIGH, "bam_dma", bdev); 1126 IRQF_TRIGGER_HIGH, "bam_dma", bdev);
1127 if (ret) 1127 if (ret)
1128 goto err_disable_clk; 1128 goto err_bam_channel_exit;
1129 1129
1130 /* set max dma segment size */ 1130 /* set max dma segment size */
1131 bdev->common.dev = bdev->dev; 1131 bdev->common.dev = bdev->dev;
@@ -1133,7 +1133,7 @@ static int bam_dma_probe(struct platform_device *pdev)
1133 ret = dma_set_max_seg_size(bdev->common.dev, BAM_MAX_DATA_SIZE); 1133 ret = dma_set_max_seg_size(bdev->common.dev, BAM_MAX_DATA_SIZE);
1134 if (ret) { 1134 if (ret) {
1135 dev_err(bdev->dev, "cannot set maximum segment size\n"); 1135 dev_err(bdev->dev, "cannot set maximum segment size\n");
1136 goto err_disable_clk; 1136 goto err_bam_channel_exit;
1137 } 1137 }
1138 1138
1139 platform_set_drvdata(pdev, bdev); 1139 platform_set_drvdata(pdev, bdev);
@@ -1157,7 +1157,7 @@ static int bam_dma_probe(struct platform_device *pdev)
1157 ret = dma_async_device_register(&bdev->common); 1157 ret = dma_async_device_register(&bdev->common);
1158 if (ret) { 1158 if (ret) {
1159 dev_err(bdev->dev, "failed to register dma async device\n"); 1159 dev_err(bdev->dev, "failed to register dma async device\n");
1160 goto err_disable_clk; 1160 goto err_bam_channel_exit;
1161 } 1161 }
1162 1162
1163 ret = of_dma_controller_register(pdev->dev.of_node, bam_dma_xlate, 1163 ret = of_dma_controller_register(pdev->dev.of_node, bam_dma_xlate,
@@ -1169,8 +1169,14 @@ static int bam_dma_probe(struct platform_device *pdev)
1169 1169
1170err_unregister_dma: 1170err_unregister_dma:
1171 dma_async_device_unregister(&bdev->common); 1171 dma_async_device_unregister(&bdev->common);
1172err_bam_channel_exit:
1173 for (i = 0; i < bdev->num_channels; i++)
1174 tasklet_kill(&bdev->channels[i].vc.task);
1175err_tasklet_kill:
1176 tasklet_kill(&bdev->task);
1172err_disable_clk: 1177err_disable_clk:
1173 clk_disable_unprepare(bdev->bamclk); 1178 clk_disable_unprepare(bdev->bamclk);
1179
1174 return ret; 1180 return ret;
1175} 1181}
1176 1182