[alsa-devel] [PATCH] ASoC: WM8962: Remove remaining direct register cache accesses
Also fix return values for headphone switch updates.
Signed-off-by: Nicolin Chen b42378@freescale.com --- sound/soc/codecs/wm8962.c | 23 ++++++++++++----------- 1 files changed, 12 insertions(+), 11 deletions(-)
diff --git a/sound/soc/codecs/wm8962.c b/sound/soc/codecs/wm8962.c index 40f0e71..a24f6dd 100644 --- a/sound/soc/codecs/wm8962.c +++ b/sound/soc/codecs/wm8962.c @@ -1601,7 +1601,6 @@ static int wm8962_put_hp_sw(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); - u16 *reg_cache = codec->reg_cache; int ret;
/* Apply the update (if any) */ @@ -1610,16 +1609,19 @@ static int wm8962_put_hp_sw(struct snd_kcontrol *kcontrol, return 0;
/* If the left PGA is enabled hit that VU bit... */ - if (snd_soc_read(codec, WM8962_PWR_MGMT_2) & WM8962_HPOUTL_PGA_ENA) - return snd_soc_write(codec, WM8962_HPOUTL_VOLUME, - reg_cache[WM8962_HPOUTL_VOLUME]); + ret = snd_soc_read(codec, WM8962_PWR_MGMT_2); + if (ret & WM8962_HPOUTL_PGA_ENA) { + snd_soc_write(codec, WM8962_HPOUTL_VOLUME, + snd_soc_read(codec, WM8962_HPOUTL_VOLUME)); + return 1; + }
/* ...otherwise the right. The VU is stereo. */ - if (snd_soc_read(codec, WM8962_PWR_MGMT_2) & WM8962_HPOUTR_PGA_ENA) - return snd_soc_write(codec, WM8962_HPOUTR_VOLUME, - reg_cache[WM8962_HPOUTR_VOLUME]); + if (ret & WM8962_HPOUTR_PGA_ENA) + snd_soc_write(codec, WM8962_HPOUTR_VOLUME, + snd_soc_read(codec, WM8962_HPOUTR_VOLUME));
- return 0; + return 1; }
/* The VU bits for the speakers are in a different register to the mute @@ -3376,7 +3378,6 @@ static int wm8962_probe(struct snd_soc_codec *codec) int ret; struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); struct wm8962_pdata *pdata = &wm8962->pdata; - u16 *reg_cache = codec->reg_cache; int i, trigger, irq_pol; bool dmicclk, dmicdat;
@@ -3433,8 +3434,8 @@ static int wm8962_probe(struct snd_soc_codec *codec)
/* Put the speakers into mono mode? */ if (pdata->spk_mono) - reg_cache[WM8962_CLASS_D_CONTROL_2] - |= WM8962_SPK_MONO; + snd_soc_update_bits(codec, WM8962_CLASS_D_CONTROL_2, + WM8962_SPK_MONO_MASK, WM8962_SPK_MONO);
/* Micbias setup, detection enable and detection * threasholds. */
On Fri, Jun 14, 2013 at 12:34:50PM +0800, Nicolin Chen wrote:
Also fix return values for headphone switch updates.
Applied, thanks. I applied this as a bug fix so it needed some manual fixup and merging - it was fairly simple but it'd be good to check it all worked properly.
Hi,
On Fri, Jun 14, 2013 at 10:18:53AM +0100, Mark Brown wrote:
Applied, thanks. I applied this as a bug fix so it needed some manual fixup and merging - it was fairly simple but it'd be good to check it all worked properly.
I've tested it with spk-mono case, and without this bug fix, my kernel would crash at the point.
And in hp_sw(), most cases would successfully return after put_volsw(). There still might be an infinitesimal chance to run into the revised parts but it should be okay.
Best regards, Nicolin Chen
participants (2)
-
Mark Brown
-
Nicolin Chen