ASoC: wm8741: Set OSR mode in hw_params()
authorSergej Sawazki <sergej@taudac.com>
Sun, 10 Feb 2019 15:29:29 +0000 (16:29 +0100)
committerMark Brown <broonie@kernel.org>
Mon, 11 Feb 2019 16:05:56 +0000 (16:05 +0000)
For correct operation of the digital filtering and other processing on the
WM8741, the user must ensure the correct value of OSR[1:0] is set at all
times.[1] Hence, depending the selected sampling rate, set the OSR (over-
sampling rate) mode in hw_params().

References:
[1] "WM8741 Data Sheet"

Signed-off-by: Sergej Sawazki <sergej@taudac.com>
Acked-by: Charles Keepax <ckeepax@opensource.cirrus.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/wm8741.c

index fdda83b7ca82950b1d34e130e3d21bdd954b7eee..a4b8c459ea57b3e9214c56b705f719faaac0cbd9 100644 (file)
@@ -196,7 +196,7 @@ static int wm8741_hw_params(struct snd_pcm_substream *substream,
 {
        struct snd_soc_component *component = dai->component;
        struct wm8741_priv *wm8741 = snd_soc_component_get_drvdata(component);
-       unsigned int iface;
+       unsigned int iface, mode;
        int i;
 
        /* The set of sample rates that can be supported depends on the
@@ -240,11 +240,21 @@ static int wm8741_hw_params(struct snd_pcm_substream *substream,
                return -EINVAL;
        }
 
+       /* oversampling rate */
+       if (params_rate(params) > 96000)
+               mode = 0x40;
+       else if (params_rate(params) > 48000)
+               mode = 0x20;
+       else
+               mode = 0x00;
+
        dev_dbg(component->dev, "wm8741_hw_params:    bit size param = %d, rate param = %d",
                params_width(params), params_rate(params));
 
        snd_soc_component_update_bits(component, WM8741_FORMAT_CONTROL, WM8741_IWL_MASK,
                            iface);
+       snd_soc_component_update_bits(component, WM8741_MODE_CONTROL_1, WM8741_OSR_MASK,
+                           mode);
 
        return 0;
 }