aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn Keeping <john@metanate.com>2016-05-09 07:24:29 -0400
committerMark Brown <broonie@kernel.org>2016-05-10 13:56:01 -0400
commit420c470d6b5c2924a3182edf5b002870ff770331 (patch)
tree32d618759c262a3db32fadbd37a100540c94440b
parentf55532a0c0b8bb6148f4e07853b876ef73bc69ca (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.c31
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}