aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/ux500
diff options
context:
space:
mode:
authorUlf Hansson <ulf.hansson@linaro.org>2012-10-22 08:32:05 -0400
committerMark Brown <broonie@opensource.wolfsonmicro.com>2012-10-22 09:28:28 -0400
commitf61ab093828df646b5df35f244577859efe4329c (patch)
tree6fa614fd2357d88b8562e6378b2d33465b0523dc /sound/soc/ux500
parentfe36a0b2b55c66f25407cc1f713b631bf7da75fa (diff)
ASoC: Ux500: Control apb clock
When switching to common clock driver for ux500 this clock needs to be handled as well. Before this clock was internally managed by the clock driver itself. Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org> Acked-by: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'sound/soc/ux500')
-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;