WM8960 Android tuning
resolve pop noise problem
<sxh c> static void wm8960_work_func(struct work_struct *work) {
struct wm8960_private_data *pdata = NULL; struct snd_soc_codec *codec = NULL; int flag = -1; int status = SND_JACK_HEADPHONE; int jack_type = 0;
pdata = container_of(work, struct wm8960_private_data, work); codec = (struct snd_soc_codec *)pdata->data;
flag = wm8960_detect_hp();
if(pdata->detect_flag != flag) { if(!use_antipop) { /* Enable anti pop mode */ snd_soc_update_bits(codec, WM8960_APOP1, WM8960_POBCTRL | WM8960_SOFT_ST | WM8960_BUFDCOPEN, WM8960_POBCTRL | WM8960_SOFT_ST | WM8960_BUFDCOPEN);
/* Enable VMID at 2*50k */ snd_soc_update_bits(codec, WM8960_POWER1, WM8960_VMID_MASK, 0x80);
/* Ramp */ msleep(100);
/* Enable VREF */ snd_soc_update_bits(codec, WM8960_POWER1, WM8960_VREF, WM8960_VREF);
msleep(100);
} if (flag == 1) {
#ifdef CONFIG_V2_HDMI_AUDIO
printk(KERN_INFO "wm8960 hp pluged\n");
/* Speaker */ snd_soc_update_bits(codec, WM8960_LOUT2, 0x7f, 0x0); snd_soc_update_bits(codec, WM8960_ROUT2, 0x7f, 0x0); /* Headphone */ snd_soc_update_bits(codec, WM8960_LOUT1, 0x7f, 0x7f); snd_soc_update_bits(codec, WM8960_ROUT1, 0x7f, 0x7f);
/* DAC Mono Mix clear */ snd_soc_update_bits(codec, WM8960_ADDCTL1, 1 << 4, 0); printk(" 1 === USYS_KKJ clear DAC Mono ===\n");
/* jack report */ snd_soc_jack_report(&pdata->jack, status, SND_JACK_HEADSET);
#else
snd_soc_update_bits(codec, WM8960_POWER1, 2, 2); msleep(100); jack_type = wm8960_detect_hp(); if(jack_type == 1){ printk("wm8960 3 ports hp pluged\n"); /* jack report */ snd_soc_jack_report(&pdata->jack, SND_JACK_HEADPHONE, SND_JACK_HEADPHONE); switch_set_state(&pdata->sdev, 2); }else{ printk("wm8960 4 ports hs pluged\n"); /* jack report */ snd_soc_jack_report(&pdata->jack, status, SND_JACK_HEADSET); switch_set_state(&pdata->sdev, 1); }
#endif
} else { printk(KERN_INFO "wm8960 hp unpluged\n");
#ifdef CONFIG_V2_HDMI_AUDIO
/* Speaker */ snd_soc_update_bits(codec, WM8960_LOUT2, 0x7f, 0x7f); snd_soc_update_bits(codec, WM8960_ROUT2, 0x7f, 0x7f); /* Headphone */ snd_soc_update_bits(codec, WM8960_LOUT1, 0x7f, 0x0); snd_soc_update_bits(codec, WM8960_ROUT1, 0x7f, 0x0);
/* DAC Mono Mix set */ snd_soc_update_bits(codec, WM8960_ADDCTL1, 1 << 4, 1 << 4); printk(" 1 === USYS_KKJ set DAC Mono ===\n");
#else #if 0
/* Speaker */ snd_soc_update_bits(codec, WM8960_LOUT2, 0x70, 0x70); snd_soc_update_bits(codec, WM8960_ROUT2, 0x70, 0x70); /* Headphone */ snd_soc_update_bits(codec, WM8960_LOUT1, 0x70, 0); snd_soc_update_bits(codec, WM8960_ROUT1, 0x70, 0);
/* DAC Mono Mix set */ snd_soc_update_bits(codec, WM8960_ADDCTL1, 1 << 4, 1 << 4);
#endif
switch_set_state(&pdata->sdev, 0);
#endif
/* jack report */ snd_soc_jack_report(&pdata->jack, 0, SND_JACK_HEADSET); }
pdata->detect_flag = flag; if(!use_antipop) {
/* Disable VMID and VREF */ snd_soc_update_bits(codec, WM8960_POWER1, WM8960_VREF | WM8960_VMID_MASK, 0);
/* Disable HP discharge */ snd_soc_update_bits(codec, WM8960_APOP2, WM8960_DISOP | WM8960_DRES_MASK, 0);
/* Disable anti-pop features */ snd_soc_update_bits(codec, WM8960_APOP1, WM8960_POBCTRL | WM8960_SOFT_ST | WM8960_BUFDCOPEN, WM8960_POBCTRL | WM8960_SOFT_ST | WM8960_BUFDCOPEN);
use_antipop = 1; } }
} </sxh>