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>