diff options
-rw-r--r-- | sound/soc/ux500/ux500_msp_dai.c | 38 | ||||
-rw-r--r-- | sound/soc/ux500/ux500_msp_dai.h | 1 |
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; |
418 | err_clk: | ||
419 | clk_disable_unprepare(drvdata->pclk); | ||
420 | err_pclk: | ||
421 | regulator_disable(drvdata->reg_vape); | ||
422 | return ret; | ||
408 | } | 423 | } |
409 | 424 | ||
410 | static void ux500_msp_dai_shutdown(struct snd_pcm_substream *substream, | 425 | static 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 | ||
813 | err_init_msp: | 837 | err_init_msp: |
814 | clk_put(drvdata->clk); | 838 | clk_put(drvdata->clk); |
815 | |||
816 | err_clk: | 839 | err_clk: |
840 | clk_put(drvdata->pclk); | ||
841 | err_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; |