[alsa-devel] [PATCH 1/2] ASoC: Implement new DC servo readback mode for late WM8994 revisions
Liam Girdwood
lrg at ti.com
Mon Aug 1 15:13:59 CEST 2011
On 01/08/11 06:12, Mark Brown wrote:
> Later WM8994 devices implement a new DC servo readback mode with the
> register used to access the offset moved to register 0x59. Implement
> support for this and enable it on the appropriate devices.
>
> Signed-off-by: Mark Brown <broonie at opensource.wolfsonmicro.com>
both
Acked-by: Liam Girdwood <lrg at ti.com>
> ---
> include/linux/mfd/wm8994/registers.h | 1 +
> sound/soc/codecs/wm8994.c | 3 ++-
> sound/soc/codecs/wm_hubs.c | 19 +++++++++++++++----
> 3 files changed, 18 insertions(+), 5 deletions(-)
>
> diff --git a/include/linux/mfd/wm8994/registers.h b/include/linux/mfd/wm8994/registers.h
> index f3ee842..6152914 100644
> --- a/include/linux/mfd/wm8994/registers.h
> +++ b/include/linux/mfd/wm8994/registers.h
> @@ -72,6 +72,7 @@
> #define WM8994_DC_SERVO_2 0x55
> #define WM8994_DC_SERVO_4 0x57
> #define WM8994_DC_SERVO_READBACK 0x58
> +#define WM8994_DC_SERVO_4E 0x59
> #define WM8994_ANALOGUE_HP_1 0x60
> #define WM8958_MIC_DETECT_1 0xD0
> #define WM8958_MIC_DETECT_2 0xD1
> diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c
> index cc8222c..e1e9aca 100644
> --- a/sound/soc/codecs/wm8994.c
> +++ b/sound/soc/codecs/wm8994.c
> @@ -107,6 +107,7 @@ static int wm8994_volatile(struct snd_soc_codec *codec, unsigned int reg)
> case WM8994_LDO_2:
> case WM8958_DSP2_EXECCONTROL:
> case WM8958_MIC_DETECT_3:
> + case WM8994_DC_SERVO_4E:
> return 1;
> default:
> return 0;
> @@ -2965,7 +2966,7 @@ static int wm8994_codec_probe(struct snd_soc_codec *codec)
> wm8994->hubs.series_startup = 1;
> break;
> default:
> - wm8994->hubs.dcs_readback_mode = 1;
> + wm8994->hubs.dcs_readback_mode = 2;
> break;
> }
>
> diff --git a/sound/soc/codecs/wm_hubs.c b/sound/soc/codecs/wm_hubs.c
> index 4416a76..524bdc6 100644
> --- a/sound/soc/codecs/wm_hubs.c
> +++ b/sound/soc/codecs/wm_hubs.c
> @@ -18,6 +18,7 @@
> #include <linux/pm.h>
> #include <linux/i2c.h>
> #include <linux/platform_device.h>
> +#include <linux/mfd/wm8994/registers.h>
> #include <sound/core.h>
> #include <sound/pcm.h>
> #include <sound/pcm_params.h>
> @@ -116,14 +117,23 @@ static void calibrate_dc_servo(struct snd_soc_codec *codec)
> {
> struct wm_hubs_data *hubs = snd_soc_codec_get_drvdata(codec);
> s8 offset;
> - u16 reg, reg_l, reg_r, dcs_cfg;
> + u16 reg, reg_l, reg_r, dcs_cfg, dcs_reg;
> +
> + switch (hubs->dcs_readback_mode) {
> + case 2:
> + dcs_reg = WM8994_DC_SERVO_4E;
> + break;
> + default:
> + dcs_reg = WM8993_DC_SERVO_3;
> + break;
> + }
>
> /* If we're using a digital only path and have a previously
> * callibrated DC servo offset stored then use that. */
> if (hubs->class_w && hubs->class_w_dcs) {
> dev_dbg(codec->dev, "Using cached DC servo offset %x\n",
> hubs->class_w_dcs);
> - snd_soc_write(codec, WM8993_DC_SERVO_3, hubs->class_w_dcs);
> + snd_soc_write(codec, dcs_reg, hubs->class_w_dcs);
> wait_for_dc_servo(codec,
> WM8993_DCS_TRIG_DAC_WR_0 |
> WM8993_DCS_TRIG_DAC_WR_1);
> @@ -154,8 +164,9 @@ static void calibrate_dc_servo(struct snd_soc_codec *codec)
> reg_r = snd_soc_read(codec, WM8993_DC_SERVO_READBACK_2)
> & WM8993_DCS_INTEG_CHAN_1_MASK;
> break;
> + case 2:
> case 1:
> - reg = snd_soc_read(codec, WM8993_DC_SERVO_3);
> + reg = snd_soc_read(codec, dcs_reg);
> reg_r = (reg & WM8993_DCS_DAC_WR_VAL_1_MASK)
> >> WM8993_DCS_DAC_WR_VAL_1_SHIFT;
> reg_l = reg & WM8993_DCS_DAC_WR_VAL_0_MASK;
> @@ -185,7 +196,7 @@ static void calibrate_dc_servo(struct snd_soc_codec *codec)
> dev_dbg(codec->dev, "DCS result: %x\n", dcs_cfg);
>
> /* Do it */
> - snd_soc_write(codec, WM8993_DC_SERVO_3, dcs_cfg);
> + snd_soc_write(codec, dcs_reg, dcs_cfg);
> wait_for_dc_servo(codec,
> WM8993_DCS_TRIG_DAC_WR_0 |
> WM8993_DCS_TRIG_DAC_WR_1);
More information about the Alsa-devel
mailing list