wm8994:
author邱建斌 <qjb@rock-chips.com>
Wed, 10 Oct 2012 06:56:00 +0000 (14:56 +0800)
committer邱建斌 <qjb@rock-chips.com>
Wed, 10 Oct 2012 06:56:00 +0000 (14:56 +0800)
Merger i8 driver

sound/soc/codecs/wm8994.c
sound/soc/codecs/wm_hubs.c
sound/soc/rk29/rk29_wm8994.c

index 0c877ffeddccd3dbe4f2e93b8d11bb859405f465..351e98749c51ff94dd8539c2f9546888d137fff7 100755 (executable)
@@ -863,18 +863,26 @@ static int late_disable_ev(struct snd_soc_dapm_widget *w,
 {
        struct snd_soc_codec *codec = w->codec;
        struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);
-
+       DBG("%s::%d event = %d active = %d\n",__FUNCTION__,__LINE__,event,codec->active);
+       
+       if(codec->active)
+       {
+               DBG("%s::%d codec is %s\n",__FUNCTION__,__LINE__,codec->active?"active":"inactive");
+               return 0;
+       }
        switch (event) {
        case SND_SOC_DAPM_POST_PMD:
                if (wm8994->aif1clk_disable) {
                        snd_soc_update_bits(codec, WM8994_AIF1_CLOCKING_1,
                                            WM8994_AIF1CLK_ENA_MASK, 0);
                        wm8994->aif1clk_disable = 0;
+                       wm8994->aif1clk_enable = 1;
                }
                if (wm8994->aif2clk_disable) {
                        snd_soc_update_bits(codec, WM8994_AIF2_CLOCKING_1,
                                            WM8994_AIF2CLK_ENA_MASK, 0);
                        wm8994->aif2clk_disable = 0;
+                       //wm8994->aif2clk_enable = 1;
                }
                break;
        }
@@ -1402,7 +1410,7 @@ SND_SOC_DAPM_MUX("AIF2DAC Mux", SND_SOC_NOPM, 0, 0, &aif2dac_mux),
 SND_SOC_DAPM_MUX("AIF2ADC Mux", SND_SOC_NOPM, 0, 0, &aif2adc_mux),
 
 SND_SOC_DAPM_AIF_IN("AIF3DACDAT", "AIF3 Playback", 0, SND_SOC_NOPM, 0, 0),
-SND_SOC_DAPM_AIF_OUT("AIF3ADCDAT", "AIF3 Capture", 0, SND_SOC_NOPM, 0, 0),
+SND_SOC_DAPM_AIF_IN("AIF3ADCDAT", "AIF3 Capture", 0, SND_SOC_NOPM, 0, 0),
 
 SND_SOC_DAPM_SUPPLY("TOCLK", WM8994_CLOCKING_1, 4, 0, NULL, 0),
 
@@ -1622,10 +1630,10 @@ static const struct snd_soc_dapm_route intercon[] = {
        { "Left Headphone Mux", "DAC", "DAC1L" },
        { "Right Headphone Mux", "DAC", "DAC1R" },
        
-       { "IN1L PGA", NULL , "MICBIAS2" },
+//     { "IN1L PGA", NULL , "MICBIAS2" },
        { "IN1R PGA", NULL , "MICBIAS1" },
-       { "MICBIAS2", NULL , "IN1LP"},//headset
-       { "MICBIAS2", NULL , "IN1LN"},
+//     { "MICBIAS2", NULL , "IN1LP"},//headset
+//     { "MICBIAS2", NULL , "IN1LN"},
        { "MICBIAS1", NULL , "IN1RP"},//mainMIC
        { "MICBIAS1", NULL , "IN1RN"},
        
@@ -2270,9 +2278,9 @@ static int wm8994_hw_params(struct snd_pcm_substream *substream,
 
        int i, cur_val, best_val, bclk_rate, best;
        
-       snd_soc_update_bits(codec, WM8994_POWER_MANAGEMENT_1,
-                       WM8994_MICB2_ENA ,
-                       WM8994_MICB2_ENA);
+       //snd_soc_update_bits(codec, WM8994_POWER_MANAGEMENT_1,
+               //      WM8994_MICB2_ENA ,
+               //      WM8994_MICB2_ENA);
 
        switch (dai->id) {
        case 1:
@@ -2933,6 +2941,41 @@ int wm8994_mic_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack,
 }
 EXPORT_SYMBOL_GPL(wm8994_mic_detect);
 
+int wm8994_headset_mic_detect(bool headset_status)
+{
+       struct wm8994_priv *wm8994 = NULL;
+       int jack_type = 0;
+       printk("%s::%d\n",__FUNCTION__,__LINE__);
+       
+       if(wm8994_codec == NULL)
+               return -1;
+       wm8994 = snd_soc_codec_get_drvdata(wm8994_codec);
+       if(wm8994 == NULL)
+               return -1;
+       if(headset_status)
+       {
+               while(wm8994_codec->dapm.bias_level == SND_SOC_BIAS_OFF)
+               {
+                       printk("----------wm8994 unnot standby-----------------\n");
+                       msleep(300);
+               }
+               
+               snd_soc_update_bits(wm8994_codec, WM8994_POWER_MANAGEMENT_1,
+                       WM8994_MICB2_ENA ,
+                       WM8994_MICB2_ENA);              
+               
+               msleep(400);
+       }
+       else
+       {// headset is out,disable MIC2 Bias
+               printk("headset is out,disable Mic2 Bias\n");
+               snd_soc_update_bits(wm8994_codec, WM8994_POWER_MANAGEMENT_1,
+                       WM8994_MICB2_ENA,
+                       0);             
+       }
+       return jack_type;
+}
+EXPORT_SYMBOL(wm8994_headset_mic_detect);
 static irqreturn_t wm8994_mic_irq(int irq, void *data)
 {
        struct wm8994_priv *priv = data;
@@ -3073,6 +3116,40 @@ static irqreturn_t wm8958_mic_irq(int irq, void *data)
 out:
        return IRQ_HANDLED;
 }
+#ifdef CONFIG_HDMI
+#include <linux/hdmi.h>
+void codec_set_spk(bool on)
+{
+        struct snd_soc_codec *codec = wm8994_codec;
+
+        DBG("%s: %d\n", __func__, on);
+
+        if(!codec)
+                return;
+
+        if(on){
+                DBG("snd_soc_dapm_enable_pin\n");
+                snd_soc_dapm_enable_pin(&codec->dapm, "Ext Left Spk");
+                snd_soc_dapm_enable_pin(&codec->dapm, "Ext Right Spk");
+                snd_soc_dapm_enable_pin(&codec->dapm, "Headset Stereophone");
+        }
+        else{
+
+                DBG("snd_soc_dapm_disable_pin\n");
+                snd_soc_dapm_disable_pin(&codec->dapm, "Ext Left Spk");
+                snd_soc_dapm_disable_pin(&codec->dapm, "Ext Right Spk");
+                snd_soc_dapm_disable_pin(&codec->dapm, "Headset Stereophone");
+        }
+
+        snd_soc_dapm_sync(&codec->dapm);
+
+        return;
+}
+static struct hdmi_codec_driver hdmi_codec_driver = {
+    .hdmi_get_spk = NULL,
+    .hdmi_set_spk = codec_set_spk,
+};
+#endif 
 
 #ifdef WM8994_PROC     
 static int wm8994_proc_init(void);
@@ -3401,7 +3478,14 @@ static int wm8994_codec_probe(struct snd_soc_codec *codec)
 //                              ARRAY_SIZE(wm8994_lineout_status_dapm_widgets));       
 //     snd_soc_dapm_add_routes(dapm, wm8994_lineout_status_intercon, 
 //                             ARRAY_SIZE(wm8994_lineout_status_intercon));
-               
+       #ifdef CONFIG_HDMI
+               hdmi_codec_driver.name = "wm8994";
+               ret = hdmi_codec_register(&hdmi_codec_driver);
+               if (ret != 0) {
+                       printk("Failed to register HDMI_codec: %d\n", ret);
+    }
+       #endif
+       
        return 0;
 
 err_irq:
index 7fdb014ec2a575c1b2c6d1aa833548c44f13f74c..caff8376b57c5ccf2231142fc64453094eb315c2 100755 (executable)
@@ -213,6 +213,14 @@ static int wm8993_put_dc_servo(struct snd_kcontrol *kcontrol,
 }
 
 static const struct snd_kcontrol_new analogue_snd_controls[] = {
+//for mic mute         
+SOC_SINGLE_TLV("Main Mic Capture Volume", WM8993_RIGHT_LINE_INPUT_1_2_VOLUME, 0, 31, 0,
+                 inpga_tlv),
+SOC_SINGLE("Main Mic Capture Switch", WM8993_RIGHT_LINE_INPUT_1_2_VOLUME, 7, 1, 1),            
+SOC_SINGLE("Headset Mic Capture Switch", WM8993_LEFT_LINE_INPUT_1_2_VOLUME, 7, 1, 1),          
+SOC_SINGLE_TLV("Headset Mic Capture Volume", WM8993_LEFT_LINE_INPUT_1_2_VOLUME, 0, 31, 0,
+       inpga_tlv),             
+//end  
 SOC_SINGLE_TLV("IN1L Volume", WM8993_LEFT_LINE_INPUT_1_2_VOLUME, 0, 31, 0,
               inpga_tlv),
 SOC_SINGLE("IN1L Switch", WM8993_LEFT_LINE_INPUT_1_2_VOLUME, 7, 1, 1),
@@ -409,6 +417,19 @@ static int hp_event(struct snd_soc_dapm_widget *w,
 
        switch (event) {
        case SND_SOC_DAPM_POST_PMU:
+               snd_soc_update_bits(codec, WM8993_LEFT_OUTPUT_VOLUME,
+                                       WM8993_HPOUT1_VU ,
+                                       0 | 0);
+               snd_soc_update_bits(codec, WM8993_RIGHT_OUTPUT_VOLUME,
+                                       WM8993_HPOUT1_VU ,
+                                       0 | 0);
+               snd_soc_update_bits(codec, WM8993_LEFT_OUTPUT_VOLUME,
+                                       WM8993_HPOUT1_VU ,
+                                       WM8993_HPOUT1_VU );
+               snd_soc_update_bits(codec, WM8993_RIGHT_OUTPUT_VOLUME,
+                                       WM8993_HPOUT1_VU ,
+                                       WM8993_HPOUT1_VU );
+                                       
                snd_soc_update_bits(codec, WM8993_CHARGE_PUMP_1,
                                    WM8993_CP_ENA, WM8993_CP_ENA);
 
index 397131b1e49956e8d79ce58d3f4cf04c867130c8..1b43a84ba76062042fb7bd1d01706879ab295af9 100755 (executable)
@@ -325,7 +325,12 @@ static int rk29_wm8994_init(struct snd_soc_pcm_runtime *rtd)
 //     snd_soc_dapm_nc_pin(dapm, "LINEOUT1P");
        snd_soc_dapm_nc_pin(dapm, "LINEOUT2N");
        snd_soc_dapm_nc_pin(dapm, "LINEOUT2P");
-
+#ifdef CONFIG_HDMI
+extern int hdmi_is_insert(void);
+extern void codec_set_spk(bool on);
+       if(hdmi_is_insert())
+               codec_set_spk(false);
+#endif
        snd_soc_dapm_sync(dapm);
 
        /* Headset jack detection */