aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/platform/msm/sps/sps.c58
1 files changed, 34 insertions, 24 deletions
diff --git a/drivers/platform/msm/sps/sps.c b/drivers/platform/msm/sps/sps.c
index 62f3a5e54e3..97cdb28cab4 100644
--- a/drivers/platform/msm/sps/sps.c
+++ b/drivers/platform/msm/sps/sps.c
@@ -2534,20 +2534,8 @@ static int msm_sps_probe(struct platform_device *pdev)
goto device_create_err;
}
- sps->dfab_clk = clk_get(sps->dev, "dfab_clk");
- if (IS_ERR(sps->dfab_clk)) {
- if (PTR_ERR(sps->dfab_clk) == -EPROBE_DEFER)
- ret = -EPROBE_DEFER;
- else
- SPS_ERR("sps:fail to get dfab_clk.");
- goto dfab_clk_err;
- } else {
- ret = clk_set_rate(sps->dfab_clk, 64000000);
- if (ret) {
- SPS_ERR("sps:failed to set dfab_clk rate.");
- goto dfab_clk_set_err;
- }
- }
+ if (pdev->dev.of_node)
+ sps->dev->of_node = pdev->dev.of_node;
if (!d_type) {
sps->pmem_clk = clk_get(sps->dev, "mem_clk");
@@ -2556,38 +2544,58 @@ static int msm_sps_probe(struct platform_device *pdev)
ret = -EPROBE_DEFER;
else
SPS_ERR("sps:fail to get pmem_clk.");
- goto dfab_clk_set_err;
+ goto pmem_clk_err;
} else {
ret = clk_prepare_enable(sps->pmem_clk);
if (ret) {
SPS_ERR("sps:failed to enable pmem_clk.");
- goto pmem_clk_set_err;
+ goto pmem_clk_en_err;
}
}
}
#ifdef CONFIG_SPS_SUPPORT_BAMDMA
+ sps->dfab_clk = clk_get(sps->dev, "dfab_clk");
+ if (IS_ERR(sps->dfab_clk)) {
+ if (PTR_ERR(sps->dfab_clk) == -EPROBE_DEFER)
+ ret = -EPROBE_DEFER;
+ else
+ SPS_ERR("sps:fail to get dfab_clk.");
+ goto dfab_clk_err;
+ } else {
+ ret = clk_set_rate(sps->dfab_clk, 64000000);
+ if (ret) {
+ SPS_ERR("sps:failed to set dfab_clk rate.");
+ clk_put(sps->dfab_clk);
+ goto dfab_clk_err;
+ }
+ }
+
sps->bamdma_clk = clk_get(sps->dev, "dma_bam_pclk");
if (IS_ERR(sps->bamdma_clk)) {
if (PTR_ERR(sps->bamdma_clk) == -EPROBE_DEFER)
ret = -EPROBE_DEFER;
else
SPS_ERR("sps:fail to get bamdma_clk.");
- goto pmem_clk_set_err;
+ clk_put(sps->dfab_clk);
+ goto dfab_clk_err;
} else {
ret = clk_prepare_enable(sps->bamdma_clk);
if (ret) {
SPS_ERR("sps:failed to enable bamdma_clk. ret=%d", ret);
clk_put(sps->bamdma_clk);
- goto pmem_clk_set_err;
+ clk_put(sps->dfab_clk);
+ goto dfab_clk_err;
}
}
ret = clk_prepare_enable(sps->dfab_clk);
if (ret) {
SPS_ERR("sps:failed to enable dfab_clk. ret=%d", ret);
+ clk_disable_unprepare(sps->bamdma_clk);
clk_put(sps->bamdma_clk);
- goto pmem_clk_set_err;
+ clk_put(sps->dfab_clk);
+ goto dfab_clk_err;
}
#endif
ret = sps_device_init();
@@ -2597,8 +2605,9 @@ static int msm_sps_probe(struct platform_device *pdev)
clk_disable_unprepare(sps->dfab_clk);
clk_disable_unprepare(sps->bamdma_clk);
clk_put(sps->bamdma_clk);
+ clk_put(sps->dfab_clk);
#endif
- goto pmem_clk_set_err;
+ goto dfab_clk_err;
}
#ifdef CONFIG_SPS_SUPPORT_BAMDMA
clk_disable_unprepare(sps->dfab_clk);
@@ -2609,12 +2618,13 @@ static int msm_sps_probe(struct platform_device *pdev)
SPS_INFO("sps:sps is ready.");
return 0;
-pmem_clk_set_err:
+dfab_clk_err:
+ if (!d_type)
+ clk_disable_unprepare(sps->pmem_clk);
+pmem_clk_en_err:
if (!d_type)
clk_put(sps->pmem_clk);
-dfab_clk_set_err:
- clk_put(sps->dfab_clk);
-dfab_clk_err:
+pmem_clk_err:
device_destroy(sps->dev_class, sps->dev_num);
device_create_err:
unregister_chrdev_region(sps->dev_num, 1);