diff options
author | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2012-10-10 02:10:08 -0400 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2013-01-04 16:30:21 -0500 |
commit | b272efc8600a7bbf2dd91d0eba8a3b8949e84497 (patch) | |
tree | 39e17b19d93a7b767d4af17920415f3a1febd28c /sound/soc/codecs | |
parent | 66b6eaf23adc77c7a74d0a7149eb49fbca187a9c (diff) |
ASoC: arizona: Factor out rate selection code
In preparation for more advanced sample rate managment move the existing
code out of the main hw_params() function.
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'sound/soc/codecs')
-rw-r--r-- | sound/soc/codecs/arizona.c | 89 |
1 files changed, 53 insertions, 36 deletions
diff --git a/sound/soc/codecs/arizona.c b/sound/soc/codecs/arizona.c index 5afc8110ae3a..6d98cf41f727 100644 --- a/sound/soc/codecs/arizona.c +++ b/sound/soc/codecs/arizona.c | |||
@@ -702,17 +702,63 @@ static int arizona_startup(struct snd_pcm_substream *substream, | |||
702 | constraint); | 702 | constraint); |
703 | } | 703 | } |
704 | 704 | ||
705 | static int arizona_hw_params_rate(struct snd_pcm_substream *substream, | ||
706 | struct snd_pcm_hw_params *params, | ||
707 | struct snd_soc_dai *dai) | ||
708 | { | ||
709 | struct snd_soc_codec *codec = dai->codec; | ||
710 | struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec); | ||
711 | struct arizona_dai_priv *dai_priv = &priv->dai[dai->id - 1]; | ||
712 | int base = dai->driver->base; | ||
713 | int i, sr_val; | ||
714 | |||
715 | /* | ||
716 | * We will need to be more flexible than this in future, | ||
717 | * currently we use a single sample rate for SYSCLK. | ||
718 | */ | ||
719 | for (i = 0; i < ARRAY_SIZE(arizona_sr_vals); i++) | ||
720 | if (arizona_sr_vals[i] == params_rate(params)) | ||
721 | break; | ||
722 | if (i == ARRAY_SIZE(arizona_sr_vals)) { | ||
723 | arizona_aif_err(dai, "Unsupported sample rate %dHz\n", | ||
724 | params_rate(params)); | ||
725 | return -EINVAL; | ||
726 | } | ||
727 | sr_val = i; | ||
728 | |||
729 | switch (dai_priv->clk) { | ||
730 | case ARIZONA_CLK_SYSCLK: | ||
731 | snd_soc_update_bits(codec, ARIZONA_SAMPLE_RATE_1, | ||
732 | ARIZONA_SAMPLE_RATE_1_MASK, sr_val); | ||
733 | if (base) | ||
734 | snd_soc_update_bits(codec, base + ARIZONA_AIF_RATE_CTRL, | ||
735 | ARIZONA_AIF1_RATE_MASK, 0); | ||
736 | break; | ||
737 | case ARIZONA_CLK_ASYNCCLK: | ||
738 | snd_soc_update_bits(codec, ARIZONA_ASYNC_SAMPLE_RATE_1, | ||
739 | ARIZONA_ASYNC_SAMPLE_RATE_MASK, sr_val); | ||
740 | if (base) | ||
741 | snd_soc_update_bits(codec, base + ARIZONA_AIF_RATE_CTRL, | ||
742 | ARIZONA_AIF1_RATE_MASK, | ||
743 | 8 << ARIZONA_AIF1_RATE_SHIFT); | ||
744 | break; | ||
745 | default: | ||
746 | arizona_aif_err(dai, "Invalid clock %d\n", dai_priv->clk); | ||
747 | return -EINVAL; | ||
748 | } | ||
749 | |||
750 | return 0; | ||
751 | } | ||
752 | |||
705 | static int arizona_hw_params(struct snd_pcm_substream *substream, | 753 | static int arizona_hw_params(struct snd_pcm_substream *substream, |
706 | struct snd_pcm_hw_params *params, | 754 | struct snd_pcm_hw_params *params, |
707 | struct snd_soc_dai *dai) | 755 | struct snd_soc_dai *dai) |
708 | { | 756 | { |
709 | struct snd_soc_codec *codec = dai->codec; | 757 | struct snd_soc_codec *codec = dai->codec; |
710 | struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec); | ||
711 | struct arizona_dai_priv *dai_priv = &priv->dai[dai->id - 1]; | ||
712 | int base = dai->driver->base; | 758 | int base = dai->driver->base; |
713 | const int *rates; | 759 | const int *rates; |
714 | int i; | 760 | int i, ret; |
715 | int bclk, lrclk, wl, frame, sr_val; | 761 | int bclk, lrclk, wl, frame; |
716 | 762 | ||
717 | if (params_rate(params) % 8000) | 763 | if (params_rate(params) % 8000) |
718 | rates = &arizona_44k1_bclk_rates[0]; | 764 | rates = &arizona_44k1_bclk_rates[0]; |
@@ -732,16 +778,6 @@ static int arizona_hw_params(struct snd_pcm_substream *substream, | |||
732 | return -EINVAL; | 778 | return -EINVAL; |
733 | } | 779 | } |
734 | 780 | ||
735 | for (i = 0; i < ARRAY_SIZE(arizona_sr_vals); i++) | ||
736 | if (arizona_sr_vals[i] == params_rate(params)) | ||
737 | break; | ||
738 | if (i == ARRAY_SIZE(arizona_sr_vals)) { | ||
739 | arizona_aif_err(dai, "Unsupported sample rate %dHz\n", | ||
740 | params_rate(params)); | ||
741 | return -EINVAL; | ||
742 | } | ||
743 | sr_val = i; | ||
744 | |||
745 | lrclk = snd_soc_params_to_bclk(params) / params_rate(params); | 781 | lrclk = snd_soc_params_to_bclk(params) / params_rate(params); |
746 | 782 | ||
747 | arizona_aif_dbg(dai, "BCLK %dHz LRCLK %dHz\n", | 783 | arizona_aif_dbg(dai, "BCLK %dHz LRCLK %dHz\n", |
@@ -750,28 +786,9 @@ static int arizona_hw_params(struct snd_pcm_substream *substream, | |||
750 | wl = snd_pcm_format_width(params_format(params)); | 786 | wl = snd_pcm_format_width(params_format(params)); |
751 | frame = wl << ARIZONA_AIF1TX_WL_SHIFT | wl; | 787 | frame = wl << ARIZONA_AIF1TX_WL_SHIFT | wl; |
752 | 788 | ||
753 | /* | 789 | ret = arizona_hw_params_rate(substream, params, dai); |
754 | * We will need to be more flexible than this in future, | 790 | if (ret != 0) |
755 | * currently we use a single sample rate for SYSCLK. | 791 | return ret; |
756 | */ | ||
757 | switch (dai_priv->clk) { | ||
758 | case ARIZONA_CLK_SYSCLK: | ||
759 | snd_soc_update_bits(codec, ARIZONA_SAMPLE_RATE_1, | ||
760 | ARIZONA_SAMPLE_RATE_1_MASK, sr_val); | ||
761 | snd_soc_update_bits(codec, base + ARIZONA_AIF_RATE_CTRL, | ||
762 | ARIZONA_AIF1_RATE_MASK, 0); | ||
763 | break; | ||
764 | case ARIZONA_CLK_ASYNCCLK: | ||
765 | snd_soc_update_bits(codec, ARIZONA_ASYNC_SAMPLE_RATE_1, | ||
766 | ARIZONA_ASYNC_SAMPLE_RATE_MASK, sr_val); | ||
767 | snd_soc_update_bits(codec, base + ARIZONA_AIF_RATE_CTRL, | ||
768 | ARIZONA_AIF1_RATE_MASK, | ||
769 | 8 << ARIZONA_AIF1_RATE_SHIFT); | ||
770 | break; | ||
771 | default: | ||
772 | arizona_aif_err(dai, "Invalid clock %d\n", dai_priv->clk); | ||
773 | return -EINVAL; | ||
774 | } | ||
775 | 792 | ||
776 | snd_soc_update_bits(codec, base + ARIZONA_AIF_BCLK_CTRL, | 793 | snd_soc_update_bits(codec, base + ARIZONA_AIF_BCLK_CTRL, |
777 | ARIZONA_AIF1_BCLK_FREQ_MASK, bclk); | 794 | ARIZONA_AIF1_BCLK_FREQ_MASK, bclk); |