{
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;
}
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),
{ "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"},
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:
}
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;
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);
// 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:
}
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),
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);