[alsa-devel] [PATCH 2/3] ASoC: wm8741: Set OSR mode in hw_params()

Sergej Sawazki sergej at taudac.com
Mon Sep 4 21:34:12 CEST 2017


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] https://d3uzseaevmutz1.cloudfront.net/pubs/proDatasheet/WM8741_v4.3.pdf
	    "WM8741 Data Sheet"

Signed-off-by: Sergej Sawazki <sergej at taudac.com>
---
 sound/soc/codecs/wm8741.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/sound/soc/codecs/wm8741.c b/sound/soc/codecs/wm8741.c
index d552a8a..7e8a7fe 100644
--- a/sound/soc/codecs/wm8741.c
+++ b/sound/soc/codecs/wm8741.c
@@ -197,6 +197,7 @@ static int wm8741_hw_params(struct snd_pcm_substream *substream,
 	struct snd_soc_codec *codec = dai->codec;
 	struct wm8741_priv *wm8741 = snd_soc_codec_get_drvdata(codec);
 	u16 iface = snd_soc_read(codec, WM8741_FORMAT_CONTROL) & 0x1FC;
+	u16 mode = snd_soc_read(codec, WM8741_MODE_CONTROL_1) & 0x183;
 	int i;
 
 	/* The set of sample rates that can be supported depends on the
@@ -220,6 +221,12 @@ static int wm8741_hw_params(struct snd_pcm_substream *substream,
 		return -EINVAL;
 	}
 
+	/* oversampling rate */
+	if (params_rate(params) > 96000)
+		mode |= 0x0040;
+	else if (params_rate(params) > 48000)
+		mode |= 0x0020;
+
 	/* bit size */
 	switch (params_width(params)) {
 	case 16:
@@ -243,6 +250,7 @@ static int wm8741_hw_params(struct snd_pcm_substream *substream,
 		params_width(params), params_rate(params));
 
 	snd_soc_write(codec, WM8741_FORMAT_CONTROL, iface);
+	snd_soc_write(codec, WM8741_MODE_CONTROL_1, mode);
 	return 0;
 }
 
-- 
2.7.4



More information about the Alsa-devel mailing list