diff options
author | Srinivas Kandagatla <srinivas.kandagatla@linaro.org> | 2015-05-21 17:52:57 -0400 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2015-05-22 08:27:06 -0400 |
commit | 3e53ac8230c1af075402bb3c1c89777791c2055e (patch) | |
tree | 2c7fc5c79ff2758f9fac543654e8e06d11073f57 | |
parent | 9a127cff91e43af807c96ca4ec7c855d382cc23d (diff) |
ASoC: qcom: make osr clock optional
Some LPASS integrations like on APQ8016 do not have OSR clk, so making
osr clk optional would allow such integrations to use lpass driver.
Tested-by: Kenneth Westfield <kwestfie@codeaurora.org>
Acked-by: Kenneth Westfield <kwestfie@codeaurora.org>
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r-- | sound/soc/qcom/lpass-cpu.c | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/sound/soc/qcom/lpass-cpu.c b/sound/soc/qcom/lpass-cpu.c index 96cb4950b2fd..407e24de494e 100644 --- a/sound/soc/qcom/lpass-cpu.c +++ b/sound/soc/qcom/lpass-cpu.c | |||
@@ -33,6 +33,9 @@ static int lpass_cpu_daiops_set_sysclk(struct snd_soc_dai *dai, int clk_id, | |||
33 | struct lpass_data *drvdata = snd_soc_dai_get_drvdata(dai); | 33 | struct lpass_data *drvdata = snd_soc_dai_get_drvdata(dai); |
34 | int ret; | 34 | int ret; |
35 | 35 | ||
36 | if (IS_ERR(drvdata->mi2s_osr_clk[dai->driver->id])) | ||
37 | return 0; | ||
38 | |||
36 | ret = clk_set_rate(drvdata->mi2s_osr_clk[dai->driver->id], freq); | 39 | ret = clk_set_rate(drvdata->mi2s_osr_clk[dai->driver->id], freq); |
37 | if (ret) | 40 | if (ret) |
38 | dev_err(dai->dev, "%s() error setting mi2s osrclk to %u: %d\n", | 41 | dev_err(dai->dev, "%s() error setting mi2s osrclk to %u: %d\n", |
@@ -47,18 +50,23 @@ static int lpass_cpu_daiops_startup(struct snd_pcm_substream *substream, | |||
47 | struct lpass_data *drvdata = snd_soc_dai_get_drvdata(dai); | 50 | struct lpass_data *drvdata = snd_soc_dai_get_drvdata(dai); |
48 | int ret; | 51 | int ret; |
49 | 52 | ||
50 | ret = clk_prepare_enable(drvdata->mi2s_osr_clk[dai->diver->id]); | 53 | if (!IS_ERR(drvdata->mi2s_osr_clk[dai->driver->id])) { |
51 | if (ret) { | 54 | ret = clk_prepare_enable( |
52 | dev_err(dai->dev, "%s() error in enabling mi2s osr clk: %d\n", | 55 | drvdata->mi2s_osr_clk[dai->driver->id]); |
53 | __func__, ret); | 56 | if (ret) { |
54 | return ret; | 57 | dev_err(dai->dev, "%s() error in enabling mi2s osr clk: %d\n", |
58 | __func__, ret); | ||
59 | return ret; | ||
60 | } | ||
55 | } | 61 | } |
56 | 62 | ||
57 | ret = clk_prepare_enable(drvdata->mi2s_bit_clk[dai->driver->id]); | 63 | ret = clk_prepare_enable(drvdata->mi2s_bit_clk[dai->driver->id]); |
58 | if (ret) { | 64 | if (ret) { |
59 | dev_err(dai->dev, "%s() error in enabling mi2s bit clk: %d\n", | 65 | dev_err(dai->dev, "%s() error in enabling mi2s bit clk: %d\n", |
60 | __func__, ret); | 66 | __func__, ret); |
61 | clk_disable_unprepare(drvdata->mi2s_osr_clk[dai->driver->id]); | 67 | if (!IS_ERR(drvdata->mi2s_osr_clk[dai->driver->id])) |
68 | clk_disable_unprepare( | ||
69 | drvdata->mi2s_osr_clk[dai->driver->id]); | ||
62 | return ret; | 70 | return ret; |
63 | } | 71 | } |
64 | 72 | ||
@@ -71,7 +79,9 @@ static void lpass_cpu_daiops_shutdown(struct snd_pcm_substream *substream, | |||
71 | struct lpass_data *drvdata = snd_soc_dai_get_drvdata(dai); | 79 | struct lpass_data *drvdata = snd_soc_dai_get_drvdata(dai); |
72 | 80 | ||
73 | clk_disable_unprepare(drvdata->mi2s_bit_clk[dai->driver->id]); | 81 | clk_disable_unprepare(drvdata->mi2s_bit_clk[dai->driver->id]); |
74 | clk_disable_unprepare(drvdata->mi2s_osr_clk[dai->driver->id]); | 82 | |
83 | if (!IS_ERR(drvdata->mi2s_osr_clk[dai->driver->id])) | ||
84 | clk_disable_unprepare(drvdata->mi2s_osr_clk[dai->driver->id]); | ||
75 | } | 85 | } |
76 | 86 | ||
77 | static int lpass_cpu_daiops_hw_params(struct snd_pcm_substream *substream, | 87 | static int lpass_cpu_daiops_hw_params(struct snd_pcm_substream *substream, |
@@ -412,11 +422,10 @@ int asoc_qcom_lpass_cpu_platform_probe(struct platform_device *pdev) | |||
412 | drvdata->mi2s_osr_clk[dai_id] = devm_clk_get(&pdev->dev, | 422 | drvdata->mi2s_osr_clk[dai_id] = devm_clk_get(&pdev->dev, |
413 | clk_name); | 423 | clk_name); |
414 | if (IS_ERR(drvdata->mi2s_osr_clk[dai_id])) { | 424 | if (IS_ERR(drvdata->mi2s_osr_clk[dai_id])) { |
415 | dev_err(&pdev->dev, | 425 | dev_warn(&pdev->dev, |
416 | "%s() error getting mi2s-osr-clk: %ld\n", | 426 | "%s() error getting mi2s-osr-clk: %ld\n", |
417 | __func__, | 427 | __func__, |
418 | PTR_ERR(drvdata->mi2s_osr_clk[dai_id])); | 428 | PTR_ERR(drvdata->mi2s_osr_clk[dai_id])); |
419 | return PTR_ERR(drvdata->mi2s_osr_clk[dai_id]); | ||
420 | } | 429 | } |
421 | 430 | ||
422 | if (variant->num_dai > 1) | 431 | if (variant->num_dai > 1) |