Skip to content

Commit

Permalink
ASoC: wm8960: Move register initialisation to I2C driver probe()
Browse files Browse the repository at this point in the history
We must ensure that the clocking configuration is valid as rapidly as possible.
And do software reset before the others registers updates, or the registers
will be reset to the default state.

Signed-off-by: Zidan Wang <b50113@freescale.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
  • Loading branch information
Zidan Wang authored and Mark Brown committed Nov 27, 2014
1 parent 0a87a6e commit 3ad5e86
Showing 1 changed file with 20 additions and 21 deletions.
41 changes: 20 additions & 21 deletions sound/soc/codecs/wm8960.c
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ struct wm8960_priv {
struct wm8960_data pdata;
};

#define wm8960_reset(c) snd_soc_write(c, WM8960_RESET, 0)
#define wm8960_reset(c) regmap_write(c, WM8960_RESET, 0)

/* enumerated controls */
static const char *wm8960_polarity[] = {"No Inversion", "Left Inverted",
Expand Down Expand Up @@ -947,31 +947,12 @@ static int wm8960_probe(struct snd_soc_codec *codec)
{
struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec);
struct wm8960_data *pdata = &wm8960->pdata;
int ret;

if (pdata->capless)
wm8960->set_bias_level = wm8960_set_bias_level_capless;
else
wm8960->set_bias_level = wm8960_set_bias_level_out3;

ret = wm8960_reset(codec);
if (ret < 0) {
dev_err(codec->dev, "Failed to issue reset\n");
return ret;
}

/* Latch the update bits */
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_codec_controls(codec, wm8960_snd_controls,
ARRAY_SIZE(wm8960_snd_controls));
wm8960_add_widgets(codec);
Expand Down Expand Up @@ -1030,7 +1011,13 @@ static int wm8960_i2c_probe(struct i2c_client *i2c,
else if (i2c->dev.of_node)
wm8960_set_pdata_from_of(i2c, &wm8960->pdata);

if (pdata && pdata->shared_lrclk) {
ret = wm8960_reset(wm8960->regmap);
if (ret != 0) {
dev_err(&i2c->dev, "Failed to issue reset\n");
return ret;
}

if (wm8960->pdata.shared_lrclk) {
ret = regmap_update_bits(wm8960->regmap, WM8960_ADDCTL2,
0x4, 0x4);
if (ret != 0) {
Expand All @@ -1040,6 +1027,18 @@ static int wm8960_i2c_probe(struct i2c_client *i2c,
}
}

/* Latch the update bits */
regmap_update_bits(wm8960->regmap, WM8960_LINVOL, 0x100, 0x100);
regmap_update_bits(wm8960->regmap, WM8960_RINVOL, 0x100, 0x100);
regmap_update_bits(wm8960->regmap, WM8960_LADC, 0x100, 0x100);
regmap_update_bits(wm8960->regmap, WM8960_RADC, 0x100, 0x100);
regmap_update_bits(wm8960->regmap, WM8960_LDAC, 0x100, 0x100);
regmap_update_bits(wm8960->regmap, WM8960_RDAC, 0x100, 0x100);
regmap_update_bits(wm8960->regmap, WM8960_LOUT1, 0x100, 0x100);
regmap_update_bits(wm8960->regmap, WM8960_ROUT1, 0x100, 0x100);
regmap_update_bits(wm8960->regmap, WM8960_LOUT2, 0x100, 0x100);
regmap_update_bits(wm8960->regmap, WM8960_ROUT2, 0x100, 0x100);

i2c_set_clientdata(i2c, wm8960);

ret = snd_soc_register_codec(&i2c->dev,
Expand Down

0 comments on commit 3ad5e86

Please sign in to comment.