aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/codecs/wm8993.c
diff options
context:
space:
mode:
authorMark Brown <broonie@opensource.wolfsonmicro.com>2010-01-20 12:39:45 -0500
committerMark Brown <broonie@opensource.wolfsonmicro.com>2010-02-01 13:35:46 -0500
commit3ed7074c4cc0de5ba77e180e5d96c23ef96859f0 (patch)
treef9a08d09b5ccc96664f385c5c74860802c40e213 /sound/soc/codecs/wm8993.c
parent2f1ff6614cb5938e5c5760358752d92deb67fb63 (diff)
ASoC: Improved wm_hubs headphone handling
Perform DC servo offset calibration using a series update sequence rather than startup update sequence, tuning the configuration of the WM8993 DC servo to make best use of this. Also introduce currently unused data allowing us to correct for any systematic errors in the DC servo calibration results and an alternative startup path for the headphone output which performs better with some chip revisions. The alternative setup sequence is enabled for WM8993. Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com> Acked-by: Liam Girdwood <lrg@slimlogic.co.uk>
Diffstat (limited to 'sound/soc/codecs/wm8993.c')
-rw-r--r--sound/soc/codecs/wm8993.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/sound/soc/codecs/wm8993.c b/sound/soc/codecs/wm8993.c
index 828d8174d5b7..bacfc2f20d70 100644
--- a/sound/soc/codecs/wm8993.c
+++ b/sound/soc/codecs/wm8993.c
@@ -213,6 +213,7 @@ static struct {
213}; 213};
214 214
215struct wm8993_priv { 215struct wm8993_priv {
216 struct wm_hubs_data hubs_data;
216 u16 reg_cache[WM8993_REGISTER_COUNT]; 217 u16 reg_cache[WM8993_REGISTER_COUNT];
217 struct wm8993_platform_data pdata; 218 struct wm8993_platform_data pdata;
218 struct snd_soc_codec codec; 219 struct snd_soc_codec codec;
@@ -997,6 +998,11 @@ static int wm8993_set_bias_level(struct snd_soc_codec *codec,
997 998
998 case SND_SOC_BIAS_STANDBY: 999 case SND_SOC_BIAS_STANDBY:
999 if (codec->bias_level == SND_SOC_BIAS_OFF) { 1000 if (codec->bias_level == SND_SOC_BIAS_OFF) {
1001 /* Tune DC servo configuration */
1002 snd_soc_write(codec, 0x44, 3);
1003 snd_soc_write(codec, 0x56, 3);
1004 snd_soc_write(codec, 0x44, 0);
1005
1000 /* Bring up VMID with fast soft start */ 1006 /* Bring up VMID with fast soft start */
1001 snd_soc_update_bits(codec, WM8993_ANTIPOP2, 1007 snd_soc_update_bits(codec, WM8993_ANTIPOP2,
1002 WM8993_STARTUP_BIAS_ENA | 1008 WM8993_STARTUP_BIAS_ENA |
@@ -1591,6 +1597,8 @@ static int wm8993_i2c_probe(struct i2c_client *i2c,
1591 codec->num_dai = 1; 1597 codec->num_dai = 1;
1592 codec->private_data = wm8993; 1598 codec->private_data = wm8993;
1593 1599
1600 wm8993->hubs_data.hp_startup_mode = 1;
1601
1594 memcpy(wm8993->reg_cache, wm8993_reg_defaults, 1602 memcpy(wm8993->reg_cache, wm8993_reg_defaults,
1595 sizeof(wm8993->reg_cache)); 1603 sizeof(wm8993->reg_cache));
1596 1604