====== WM8960 Android tuning ====== ==== resolve pop noise problem ==== 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; } } }