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) |
