diff options
| -rw-r--r-- | sound/soc/fsl/fsl_esai.c | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/sound/soc/fsl/fsl_esai.c b/sound/soc/fsl/fsl_esai.c index d0c72ed261e7..f55341e52970 100644 --- a/sound/soc/fsl/fsl_esai.c +++ b/sound/soc/fsl/fsl_esai.c | |||
| @@ -431,17 +431,26 @@ static int fsl_esai_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) | |||
| 431 | static int fsl_esai_startup(struct snd_pcm_substream *substream, | 431 | static int fsl_esai_startup(struct snd_pcm_substream *substream, |
| 432 | struct snd_soc_dai *dai) | 432 | struct snd_soc_dai *dai) |
| 433 | { | 433 | { |
| 434 | int ret; | ||
| 434 | struct fsl_esai *esai_priv = snd_soc_dai_get_drvdata(dai); | 435 | struct fsl_esai *esai_priv = snd_soc_dai_get_drvdata(dai); |
| 435 | 436 | ||
| 436 | /* | 437 | /* |
| 437 | * Some platforms might use the same bit to gate all three or two of | 438 | * Some platforms might use the same bit to gate all three or two of |
| 438 | * clocks, so keep all clocks open/close at the same time for safety | 439 | * clocks, so keep all clocks open/close at the same time for safety |
| 439 | */ | 440 | */ |
| 440 | clk_prepare_enable(esai_priv->coreclk); | 441 | ret = clk_prepare_enable(esai_priv->coreclk); |
| 441 | if (!IS_ERR(esai_priv->extalclk)) | 442 | if (ret) |
| 442 | clk_prepare_enable(esai_priv->extalclk); | 443 | return ret; |
| 443 | if (!IS_ERR(esai_priv->fsysclk)) | 444 | if (!IS_ERR(esai_priv->extalclk)) { |
| 444 | clk_prepare_enable(esai_priv->fsysclk); | 445 | ret = clk_prepare_enable(esai_priv->extalclk); |
| 446 | if (ret) | ||
| 447 | goto err_extalck; | ||
| 448 | } | ||
| 449 | if (!IS_ERR(esai_priv->fsysclk)) { | ||
| 450 | ret = clk_prepare_enable(esai_priv->fsysclk); | ||
| 451 | if (ret) | ||
| 452 | goto err_fsysclk; | ||
| 453 | } | ||
| 445 | 454 | ||
| 446 | if (!dai->active) { | 455 | if (!dai->active) { |
| 447 | /* Reset Port C */ | 456 | /* Reset Port C */ |
| @@ -463,6 +472,14 @@ static int fsl_esai_startup(struct snd_pcm_substream *substream, | |||
| 463 | } | 472 | } |
| 464 | 473 | ||
| 465 | return 0; | 474 | return 0; |
| 475 | |||
| 476 | err_fsysclk: | ||
| 477 | if (!IS_ERR(esai_priv->extalclk)) | ||
| 478 | clk_disable_unprepare(esai_priv->extalclk); | ||
| 479 | err_extalck: | ||
| 480 | clk_disable_unprepare(esai_priv->coreclk); | ||
| 481 | |||
| 482 | return ret; | ||
| 466 | } | 483 | } |
| 467 | 484 | ||
| 468 | static int fsl_esai_hw_params(struct snd_pcm_substream *substream, | 485 | static int fsl_esai_hw_params(struct snd_pcm_substream *substream, |
