ASoC: Automatically manage WM8350 sloping stopband filter
authorMark Brown <broonie@opensource.wolfsonmicro.com>
Fri, 12 Jun 2009 21:56:59 +0000 (22:56 +0100)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Sat, 13 Jun 2009 19:06:25 +0000 (20:06 +0100)
For best performance the DAC sloping stopband filter should be enabled
below 24kHz and not enabled above that so remove the user visible
control for this and do it autonomously in the driver.

Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
sound/soc/codecs/wm8350.c

index e7348d3..f6bb599 100644 (file)
@@ -406,7 +406,6 @@ static const char *wm8350_deemp[] = { "None", "32kHz", "44.1kHz", "48kHz" };
 static const char *wm8350_pol[] = { "Normal", "Inv R", "Inv L", "Inv L & R" };
 static const char *wm8350_dacmutem[] = { "Normal", "Soft" };
 static const char *wm8350_dacmutes[] = { "Fast", "Slow" };
-static const char *wm8350_dacfilter[] = { "Normal", "Sloping" };
 static const char *wm8350_adcfilter[] = { "None", "High Pass" };
 static const char *wm8350_adchp[] = { "44.1kHz", "8kHz", "16kHz", "32kHz" };
 static const char *wm8350_lr[] = { "Left", "Right" };
@@ -416,7 +415,6 @@ static const struct soc_enum wm8350_enum[] = {
        SOC_ENUM_SINGLE(WM8350_DAC_CONTROL, 0, 4, wm8350_pol),
        SOC_ENUM_SINGLE(WM8350_DAC_MUTE_VOLUME, 14, 2, wm8350_dacmutem),
        SOC_ENUM_SINGLE(WM8350_DAC_MUTE_VOLUME, 13, 2, wm8350_dacmutes),
-       SOC_ENUM_SINGLE(WM8350_DAC_MUTE_VOLUME, 12, 2, wm8350_dacfilter),
        SOC_ENUM_SINGLE(WM8350_ADC_CONTROL, 15, 2, wm8350_adcfilter),
        SOC_ENUM_SINGLE(WM8350_ADC_CONTROL, 8, 4, wm8350_adchp),
        SOC_ENUM_SINGLE(WM8350_ADC_CONTROL, 0, 4, wm8350_pol),
@@ -444,10 +442,9 @@ static const struct snd_kcontrol_new wm8350_snd_controls[] = {
                                0, 255, 0, dac_pcm_tlv),
        SOC_ENUM("Playback PCM Mute Function", wm8350_enum[2]),
        SOC_ENUM("Playback PCM Mute Speed", wm8350_enum[3]),
-       SOC_ENUM("Playback PCM Filter", wm8350_enum[4]),
-       SOC_ENUM("Capture PCM Filter", wm8350_enum[5]),
-       SOC_ENUM("Capture PCM HP Filter", wm8350_enum[6]),
-       SOC_ENUM("Capture ADC Inversion", wm8350_enum[7]),
+       SOC_ENUM("Capture PCM Filter", wm8350_enum[4]),
+       SOC_ENUM("Capture PCM HP Filter", wm8350_enum[5]),
+       SOC_ENUM("Capture ADC Inversion", wm8350_enum[6]),
        SOC_WM8350_DOUBLE_R_TLV("Capture PCM Volume",
                                WM8350_ADC_DIGITAL_VOLUME_L,
                                WM8350_ADC_DIGITAL_VOLUME_R,
@@ -993,6 +990,7 @@ static int wm8350_pcm_hw_params(struct snd_pcm_substream *substream,
                                struct snd_soc_dai *codec_dai)
 {
        struct snd_soc_codec *codec = codec_dai->codec;
+       struct wm8350 *wm8350 = codec->control_data;
        u16 iface = wm8350_codec_read(codec, WM8350_AI_FORMATING) &
            ~WM8350_AIF_WL_MASK;
 
@@ -1012,6 +1010,19 @@ static int wm8350_pcm_hw_params(struct snd_pcm_substream *substream,
        }
 
        wm8350_codec_write(codec, WM8350_AI_FORMATING, iface);
+
+       /* The sloping stopband filter is recommended for use with
+        * lower sample rates to improve performance.
+        */
+       if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
+               if (params_rate(params) < 24000)
+                       wm8350_set_bits(wm8350, WM8350_DAC_MUTE_VOLUME,
+                                       WM8350_DAC_SB_FILT);
+               else
+                       wm8350_clear_bits(wm8350, WM8350_DAC_MUTE_VOLUME,
+                                         WM8350_DAC_SB_FILT);
+       }
+
        return 0;
 }