aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sound/soc/ux500/ux500_msp_dai.c38
-rw-r--r--sound/soc/ux500/ux500_msp_dai.h1
2 files changed, 33 insertions, 6 deletions
diff --git a/sound/soc/ux500/ux500_msp_dai.c b/sound/soc/ux500/ux500_msp_dai.c
index e11187fb433f..74bb3c0e81f5 100644
--- a/sound/soc/ux500/ux500_msp_dai.c
+++ b/sound/soc/ux500/ux500_msp_dai.c
@@ -398,13 +398,28 @@ static int ux500_msp_dai_startup(struct snd_pcm_substream *substream,
398 return ret; 398 return ret;
399 } 399 }
400 400
401 /* Prepare and enable clock */ 401 /* Prepare and enable clocks */
402 dev_dbg(dai->dev, "%s: Enabling MSP-clock.\n", __func__); 402 dev_dbg(dai->dev, "%s: Enabling MSP-clocks.\n", __func__);
403 ret = clk_prepare_enable(drvdata->pclk);
404 if (ret) {
405 dev_err(drvdata->msp->dev,
406 "%s: Failed to prepare/enable pclk!\n", __func__);
407 goto err_pclk;
408 }
409
403 ret = clk_prepare_enable(drvdata->clk); 410 ret = clk_prepare_enable(drvdata->clk);
404 if (ret) 411 if (ret) {
405 regulator_disable(drvdata->reg_vape); 412 dev_err(drvdata->msp->dev,
413 "%s: Failed to prepare/enable clk!\n", __func__);
414 goto err_clk;
415 }
406 416
407 return ret; 417 return ret;
418err_clk:
419 clk_disable_unprepare(drvdata->pclk);
420err_pclk:
421 regulator_disable(drvdata->reg_vape);
422 return ret;
408} 423}
409 424
410static void ux500_msp_dai_shutdown(struct snd_pcm_substream *substream, 425static void ux500_msp_dai_shutdown(struct snd_pcm_substream *substream,
@@ -430,8 +445,9 @@ static void ux500_msp_dai_shutdown(struct snd_pcm_substream *substream,
430 __func__, dai->id, snd_pcm_stream_str(substream)); 445 __func__, dai->id, snd_pcm_stream_str(substream));
431 } 446 }
432 447
433 /* Disable and unprepare clock */ 448 /* Disable and unprepare clocks */
434 clk_disable_unprepare(drvdata->clk); 449 clk_disable_unprepare(drvdata->clk);
450 clk_disable_unprepare(drvdata->pclk);
435 451
436 /* Disable regulator */ 452 /* Disable regulator */
437 ret = regulator_disable(drvdata->reg_vape); 453 ret = regulator_disable(drvdata->reg_vape);
@@ -782,6 +798,14 @@ static int __devinit ux500_msp_drv_probe(struct platform_device *pdev)
782 } 798 }
783 prcmu_qos_add_requirement(PRCMU_QOS_APE_OPP, (char *)pdev->name, 50); 799 prcmu_qos_add_requirement(PRCMU_QOS_APE_OPP, (char *)pdev->name, 50);
784 800
801 drvdata->pclk = clk_get(&pdev->dev, "apb_pclk");
802 if (IS_ERR(drvdata->pclk)) {
803 ret = (int)PTR_ERR(drvdata->pclk);
804 dev_err(&pdev->dev, "%s: ERROR: clk_get of pclk failed (%d)!\n",
805 __func__, ret);
806 goto err_pclk;
807 }
808
785 drvdata->clk = clk_get(&pdev->dev, NULL); 809 drvdata->clk = clk_get(&pdev->dev, NULL);
786 if (IS_ERR(drvdata->clk)) { 810 if (IS_ERR(drvdata->clk)) {
787 ret = (int)PTR_ERR(drvdata->clk); 811 ret = (int)PTR_ERR(drvdata->clk);
@@ -812,8 +836,9 @@ static int __devinit ux500_msp_drv_probe(struct platform_device *pdev)
812 836
813err_init_msp: 837err_init_msp:
814 clk_put(drvdata->clk); 838 clk_put(drvdata->clk);
815
816err_clk: 839err_clk:
840 clk_put(drvdata->pclk);
841err_pclk:
817 devm_regulator_put(drvdata->reg_vape); 842 devm_regulator_put(drvdata->reg_vape);
818 843
819 return ret; 844 return ret;
@@ -829,6 +854,7 @@ static int __devexit ux500_msp_drv_remove(struct platform_device *pdev)
829 prcmu_qos_remove_requirement(PRCMU_QOS_APE_OPP, "ux500_msp_i2s"); 854 prcmu_qos_remove_requirement(PRCMU_QOS_APE_OPP, "ux500_msp_i2s");
830 855
831 clk_put(drvdata->clk); 856 clk_put(drvdata->clk);
857 clk_put(drvdata->pclk);
832 858
833 ux500_msp_i2s_cleanup_msp(pdev, drvdata->msp); 859 ux500_msp_i2s_cleanup_msp(pdev, drvdata->msp);
834 860
diff --git a/sound/soc/ux500/ux500_msp_dai.h b/sound/soc/ux500/ux500_msp_dai.h
index 98202a34a5dd..9c778d9c3838 100644
--- a/sound/soc/ux500/ux500_msp_dai.h
+++ b/sound/soc/ux500/ux500_msp_dai.h
@@ -69,6 +69,7 @@ struct ux500_msp_i2s_drvdata {
69 /* Clocks */ 69 /* Clocks */
70 unsigned int master_clk; 70 unsigned int master_clk;
71 struct clk *clk; 71 struct clk *clk;
72 struct clk *pclk;
72 73
73 /* Regulators */ 74 /* Regulators */
74 int vape_opp_constraint; 75 int vape_opp_constraint;