diff options
author | John Keeping <john@metanate.com> | 2016-05-09 07:24:29 -0400 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2016-05-10 13:56:01 -0400 |
commit | 420c470d6b5c2924a3182edf5b002870ff770331 (patch) | |
tree | 32d618759c262a3db32fadbd37a100540c94440b | |
parent | f55532a0c0b8bb6148f4e07853b876ef73bc69ca (diff) |
ASoC: es8328: Move clock setup to hw_params
This ensures that the clock is setup after its frequency has been set;
the existing code in set_dai_fmt may be called before the clock rate has
been set resulting in an incorrect configuration.
Signed-off-by: John Keeping <john@metanate.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r-- | sound/soc/codecs/es8328.c | 31 |
1 files changed, 16 insertions, 15 deletions
diff --git a/sound/soc/codecs/es8328.c b/sound/soc/codecs/es8328.c index afa6c5db9dcc..3ca89ae32889 100644 --- a/sound/soc/codecs/es8328.c +++ b/sound/soc/codecs/es8328.c | |||
@@ -445,9 +445,10 @@ static int es8328_hw_params(struct snd_pcm_substream *substream, | |||
445 | { | 445 | { |
446 | struct snd_soc_codec *codec = dai->codec; | 446 | struct snd_soc_codec *codec = dai->codec; |
447 | struct es8328_priv *es8328 = snd_soc_codec_get_drvdata(codec); | 447 | struct es8328_priv *es8328 = snd_soc_codec_get_drvdata(codec); |
448 | int clk_rate; | 448 | int clk_rate = clk_get_rate(es8328->clk); |
449 | int i; | 449 | int i; |
450 | int reg; | 450 | int reg; |
451 | int val; | ||
451 | u8 ratio; | 452 | u8 ratio; |
452 | 453 | ||
453 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) | 454 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) |
@@ -455,16 +456,24 @@ static int es8328_hw_params(struct snd_pcm_substream *substream, | |||
455 | else | 456 | else |
456 | reg = ES8328_ADCCONTROL5; | 457 | reg = ES8328_ADCCONTROL5; |
457 | 458 | ||
458 | clk_rate = clk_get_rate(es8328->clk); | 459 | switch (clk_rate) { |
459 | 460 | case ES8328_SYSCLK_RATE_1X: | |
460 | if ((clk_rate != ES8328_SYSCLK_RATE_1X) && | 461 | val = 0; |
461 | (clk_rate != ES8328_SYSCLK_RATE_2X)) { | 462 | break; |
463 | case ES8328_SYSCLK_RATE_2X: | ||
464 | val = ES8328_MASTERMODE_MCLKDIV2; | ||
465 | break; | ||
466 | default: | ||
462 | dev_err(codec->dev, | 467 | dev_err(codec->dev, |
463 | "%s: clock is running at %d Hz, not %d or %d Hz\n", | 468 | "%s: clock is running at %d Hz, not %d or %d Hz\n", |
464 | __func__, clk_rate, | 469 | __func__, clk_rate, |
465 | ES8328_SYSCLK_RATE_1X, ES8328_SYSCLK_RATE_2X); | 470 | ES8328_SYSCLK_RATE_1X, ES8328_SYSCLK_RATE_2X); |
466 | return -EINVAL; | 471 | return -EINVAL; |
467 | } | 472 | } |
473 | ret = snd_soc_update_bits(codec, ES8328_MASTERMODE, | ||
474 | ES8328_MASTERMODE_MCLKDIV2, val); | ||
475 | if (ret < 0) | ||
476 | return ret; | ||
468 | 477 | ||
469 | /* find master mode MCLK to sampling frequency ratio */ | 478 | /* find master mode MCLK to sampling frequency ratio */ |
470 | ratio = mclk_ratios[0].rate; | 479 | ratio = mclk_ratios[0].rate; |
@@ -484,8 +493,6 @@ static int es8328_set_dai_fmt(struct snd_soc_dai *codec_dai, | |||
484 | unsigned int fmt) | 493 | unsigned int fmt) |
485 | { | 494 | { |
486 | struct snd_soc_codec *codec = codec_dai->codec; | 495 | struct snd_soc_codec *codec = codec_dai->codec; |
487 | struct es8328_priv *es8328 = snd_soc_codec_get_drvdata(codec); | ||
488 | int clk_rate; | ||
489 | u8 mode = ES8328_DACCONTROL1_DACWL_16; | 496 | u8 mode = ES8328_DACCONTROL1_DACWL_16; |
490 | 497 | ||
491 | /* set master/slave audio interface */ | 498 | /* set master/slave audio interface */ |
@@ -515,14 +522,8 @@ static int es8328_set_dai_fmt(struct snd_soc_dai *codec_dai, | |||
515 | snd_soc_write(codec, ES8328_ADCCONTROL4, mode); | 522 | snd_soc_write(codec, ES8328_ADCCONTROL4, mode); |
516 | 523 | ||
517 | /* Master serial port mode, with BCLK generated automatically */ | 524 | /* Master serial port mode, with BCLK generated automatically */ |
518 | clk_rate = clk_get_rate(es8328->clk); | 525 | snd_soc_update_bits(codec, ES8328_MASTERMODE, |
519 | if (clk_rate == ES8328_SYSCLK_RATE_1X) | 526 | ES8328_MASTERMODE_MSC, ES8328_MASTERMODE_MSC); |
520 | snd_soc_write(codec, ES8328_MASTERMODE, | ||
521 | ES8328_MASTERMODE_MSC); | ||
522 | else | ||
523 | snd_soc_write(codec, ES8328_MASTERMODE, | ||
524 | ES8328_MASTERMODE_MCLKDIV2 | | ||
525 | ES8328_MASTERMODE_MSC); | ||
526 | 527 | ||
527 | return 0; | 528 | return 0; |
528 | } | 529 | } |