Skip to content

Commit

Permalink
ASoC: wm8960: Use snd_soc_update_bits for read-modify-write
Browse files Browse the repository at this point in the history
Use snd_soc_update_bits for read-modify-write register access instead of
open-coding it using snd_soc_read and snd_soc_write

Signed-off-by: Axel Lin <axel.lin@gmail.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
  • Loading branch information
Axel Lin authored and Mark Brown committed Dec 8, 2011
1 parent 4105ab8 commit 16b2488
Showing 1 changed file with 21 additions and 46 deletions.
67 changes: 21 additions & 46 deletions sound/soc/codecs/wm8960.c
Original file line number Diff line number Diff line change
Expand Up @@ -543,30 +543,24 @@ static int wm8960_hw_params(struct snd_pcm_substream *substream,
static int wm8960_mute(struct snd_soc_dai *dai, int mute)
{
struct snd_soc_codec *codec = dai->codec;
u16 mute_reg = snd_soc_read(codec, WM8960_DACCTL1) & 0xfff7;

if (mute)
snd_soc_write(codec, WM8960_DACCTL1, mute_reg | 0x8);
snd_soc_update_bits(codec, WM8960_DACCTL1, 0x8, 0x8);
else
snd_soc_write(codec, WM8960_DACCTL1, mute_reg);
snd_soc_update_bits(codec, WM8960_DACCTL1, 0x8, 0);
return 0;
}

static int wm8960_set_bias_level_out3(struct snd_soc_codec *codec,
enum snd_soc_bias_level level)
{
u16 reg;

switch (level) {
case SND_SOC_BIAS_ON:
break;

case SND_SOC_BIAS_PREPARE:
/* Set VMID to 2x50k */
reg = snd_soc_read(codec, WM8960_POWER1);
reg &= ~0x180;
reg |= 0x80;
snd_soc_write(codec, WM8960_POWER1, reg);
snd_soc_update_bits(codec, WM8960_POWER1, 0x180, 0x80);
break;

case SND_SOC_BIAS_STANDBY:
Expand All @@ -579,23 +573,19 @@ static int wm8960_set_bias_level_out3(struct snd_soc_codec *codec,
WM8960_BUFDCOPEN | WM8960_BUFIOEN);

/* Enable & ramp VMID at 2x50k */
reg = snd_soc_read(codec, WM8960_POWER1);
reg |= 0x80;
snd_soc_write(codec, WM8960_POWER1, reg);
snd_soc_update_bits(codec, WM8960_POWER1, 0x80, 0x80);
msleep(100);

/* Enable VREF */
snd_soc_write(codec, WM8960_POWER1, reg | WM8960_VREF);
snd_soc_update_bits(codec, WM8960_POWER1, WM8960_VREF,
WM8960_VREF);

/* Disable anti-pop features */
snd_soc_write(codec, WM8960_APOP1, WM8960_BUFIOEN);
}

/* Set VMID to 2x250k */
reg = snd_soc_read(codec, WM8960_POWER1);
reg &= ~0x180;
reg |= 0x100;
snd_soc_write(codec, WM8960_POWER1, reg);
snd_soc_update_bits(codec, WM8960_POWER1, 0x180, 0x100);
break;

case SND_SOC_BIAS_OFF:
Expand Down Expand Up @@ -787,10 +777,8 @@ static int wm8960_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id,

/* Disable the PLL: even if we are changing the frequency the
* PLL needs to be disabled while we do so. */
snd_soc_write(codec, WM8960_CLOCK1,
snd_soc_read(codec, WM8960_CLOCK1) & ~1);
snd_soc_write(codec, WM8960_POWER2,
snd_soc_read(codec, WM8960_POWER2) & ~1);
snd_soc_update_bits(codec, WM8960_CLOCK1, 0x1, 0);
snd_soc_update_bits(codec, WM8960_POWER2, 0x1, 0);

if (!freq_in || !freq_out)
return 0;
Expand All @@ -809,11 +797,9 @@ static int wm8960_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id,
snd_soc_write(codec, WM8960_PLL1, reg);

/* Turn it on */
snd_soc_write(codec, WM8960_POWER2,
snd_soc_read(codec, WM8960_POWER2) | 1);
snd_soc_update_bits(codec, WM8960_POWER2, 0x1, 0x1);
msleep(250);
snd_soc_write(codec, WM8960_CLOCK1,
snd_soc_read(codec, WM8960_CLOCK1) | 1);
snd_soc_update_bits(codec, WM8960_CLOCK1, 0x1, 0x1);

return 0;
}
Expand Down Expand Up @@ -913,7 +899,6 @@ static int wm8960_probe(struct snd_soc_codec *codec)
struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec);
struct wm8960_data *pdata = dev_get_platdata(codec->dev);
int ret;
u16 reg;

wm8960->set_bias_level = wm8960_set_bias_level_out3;

Expand Down Expand Up @@ -944,26 +929,16 @@ static int wm8960_probe(struct snd_soc_codec *codec)
wm8960->set_bias_level(codec, SND_SOC_BIAS_STANDBY);

/* Latch the update bits */
reg = snd_soc_read(codec, WM8960_LINVOL);
snd_soc_write(codec, WM8960_LINVOL, reg | 0x100);
reg = snd_soc_read(codec, WM8960_RINVOL);
snd_soc_write(codec, WM8960_RINVOL, reg | 0x100);
reg = snd_soc_read(codec, WM8960_LADC);
snd_soc_write(codec, WM8960_LADC, reg | 0x100);
reg = snd_soc_read(codec, WM8960_RADC);
snd_soc_write(codec, WM8960_RADC, reg | 0x100);
reg = snd_soc_read(codec, WM8960_LDAC);
snd_soc_write(codec, WM8960_LDAC, reg | 0x100);
reg = snd_soc_read(codec, WM8960_RDAC);
snd_soc_write(codec, WM8960_RDAC, reg | 0x100);
reg = snd_soc_read(codec, WM8960_LOUT1);
snd_soc_write(codec, WM8960_LOUT1, reg | 0x100);
reg = snd_soc_read(codec, WM8960_ROUT1);
snd_soc_write(codec, WM8960_ROUT1, reg | 0x100);
reg = snd_soc_read(codec, WM8960_LOUT2);
snd_soc_write(codec, WM8960_LOUT2, reg | 0x100);
reg = snd_soc_read(codec, WM8960_ROUT2);
snd_soc_write(codec, WM8960_ROUT2, reg | 0x100);
snd_soc_update_bits(codec, WM8960_LINVOL, 0x100, 0x100);
snd_soc_update_bits(codec, WM8960_RINVOL, 0x100, 0x100);
snd_soc_update_bits(codec, WM8960_LADC, 0x100, 0x100);
snd_soc_update_bits(codec, WM8960_RADC, 0x100, 0x100);
snd_soc_update_bits(codec, WM8960_LDAC, 0x100, 0x100);
snd_soc_update_bits(codec, WM8960_RDAC, 0x100, 0x100);
snd_soc_update_bits(codec, WM8960_LOUT1, 0x100, 0x100);
snd_soc_update_bits(codec, WM8960_ROUT1, 0x100, 0x100);
snd_soc_update_bits(codec, WM8960_LOUT2, 0x100, 0x100);
snd_soc_update_bits(codec, WM8960_ROUT2, 0x100, 0x100);

snd_soc_add_controls(codec, wm8960_snd_controls,
ARRAY_SIZE(wm8960_snd_controls));
Expand Down

0 comments on commit 16b2488

Please sign in to comment.