STAC_REF,
STAC_9200_OQO,
STAC_9200_DELL_D21,
-@@ -62,6 +65,7 @@
+@@ -62,6 +65,7 @@ enum {
};
enum {
STAC_9205_REF,
STAC_9205_DELL_M42,
STAC_9205_DELL_M43,
-@@ -71,6 +75,7 @@
+@@ -71,6 +75,7 @@ enum {
};
enum {
STAC_92HD73XX_NO_JD, /* no jack-detection */
STAC_92HD73XX_REF,
STAC_DELL_M6_AMIC,
-@@ -81,22 +86,28 @@
+@@ -81,22 +86,28 @@ enum {
};
enum {
STAC_925x_REF,
STAC_M1,
STAC_M1_2,
-@@ -109,6 +120,7 @@
+@@ -109,6 +120,7 @@ enum {
};
enum {
STAC_D945_REF,
STAC_D945GTP3,
STAC_D945GTP5,
-@@ -136,10 +148,12 @@
+@@ -136,10 +148,12 @@ enum {
};
enum {
STAC_DELL_3ST,
STAC_DELL_BIOS,
STAC_927X_MODELS
-@@ -152,6 +166,18 @@
+@@ -152,6 +166,18 @@ struct sigmatel_event {
int data;
};
struct sigmatel_spec {
struct snd_kcontrol_new *mixers[4];
unsigned int num_mixers;
-@@ -163,6 +189,7 @@
+@@ -163,6 +189,7 @@ struct sigmatel_spec {
unsigned int hp_detect: 1;
unsigned int spdif_mute: 1;
unsigned int check_volume_offset:1;
/* gpio lines */
unsigned int eapd_mask;
-@@ -170,23 +197,22 @@
+@@ -170,23 +197,22 @@ struct sigmatel_spec {
unsigned int gpio_dir;
unsigned int gpio_data;
unsigned int gpio_mute;
/* playback */
struct hda_input_mux *mono_mux;
-@@ -210,6 +236,15 @@
+@@ -210,6 +236,15 @@ struct sigmatel_spec {
unsigned int num_dmuxes;
hda_nid_t *smux_nids;
unsigned int num_smuxes;
const char **spdif_labels;
hda_nid_t dig_in_nid;
-@@ -245,14 +280,12 @@
+@@ -245,14 +280,12 @@ struct sigmatel_spec {
hda_nid_t line_switch; /* shared line-in for input and output */
hda_nid_t mic_switch; /* shared mic-in for input and output */
hda_nid_t hp_switch; /* NID of HP as line-out */
struct hda_input_mux private_dimux;
struct hda_input_mux private_imux;
struct hda_input_mux private_smux;
-@@ -309,6 +342,13 @@
+@@ -309,6 +342,13 @@ static hda_nid_t stac92hd73xx_smux_nids[
0x22, 0x23,
};
#define STAC92HD83XXX_NUM_DMICS 2
static hda_nid_t stac92hd83xxx_dmic_nids[STAC92HD83XXX_NUM_DMICS + 1] = {
0x11, 0x12, 0
-@@ -340,6 +380,13 @@
+@@ -340,6 +380,13 @@ static hda_nid_t stac92hd83xxx_amp_nids[
0xc,
};
static hda_nid_t stac92hd71bxx_pwr_nids[3] = {
0x0a, 0x0d, 0x0f
};
-@@ -369,6 +416,13 @@
+@@ -369,6 +416,13 @@ static hda_nid_t stac92hd71bxx_slave_dig
0x22, 0
};
static hda_nid_t stac925x_adc_nids[1] = {
0x03,
};
-@@ -390,6 +444,13 @@
+@@ -390,6 +444,13 @@ static hda_nid_t stac925x_dmux_nids[1] =
0x14,
};
static hda_nid_t stac922x_adc_nids[2] = {
0x06, 0x07,
};
-@@ -398,6 +459,17 @@
+@@ -398,6 +459,17 @@ static hda_nid_t stac922x_mux_nids[2] =
0x12, 0x13,
};
static hda_nid_t stac927x_adc_nids[3] = {
0x07, 0x08, 0x09
};
-@@ -423,6 +495,18 @@
+@@ -423,6 +495,18 @@ static hda_nid_t stac927x_dmic_nids[STAC
0x13, 0x14, 0
};
static const char *stac927x_spdif_labels[5] = {
"Digital Playback", "ADAT", "Analog Mux 1",
"Analog Mux 2", "Analog Mux 3"
-@@ -449,6 +533,16 @@
+@@ -449,6 +533,16 @@ static hda_nid_t stac9205_dmic_nids[STAC
0x17, 0x18, 0
};
static hda_nid_t stac9200_pin_nids[8] = {
0x08, 0x09, 0x0d, 0x0e,
0x0f, 0x10, 0x11, 0x12,
-@@ -470,15 +564,21 @@
+@@ -470,15 +564,21 @@ static hda_nid_t stac92hd73xx_pin_nids[1
0x14, 0x22, 0x23
};
};
static hda_nid_t stac927x_pin_nids[14] = {
-@@ -521,36 +621,6 @@
+@@ -521,36 +621,6 @@ static int stac92xx_amp_volume_put(struc
return snd_hda_mixer_amp_volume_put(kcontrol, ucontrol);
}
static int stac92xx_smux_enum_info(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_info *uinfo)
{
-@@ -601,6 +671,40 @@
+@@ -601,6 +671,40 @@ static int stac92xx_smux_enum_put(struct
return 0;
}
static int stac92xx_mux_enum_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
{
struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
-@@ -623,9 +727,35 @@
+@@ -623,9 +727,35 @@ static int stac92xx_mux_enum_put(struct
struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
struct sigmatel_spec *spec = codec->spec;
unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
}
static int stac92xx_mono_mux_enum_info(struct snd_kcontrol *kcontrol,
-@@ -691,60 +821,6 @@
+@@ -691,60 +821,6 @@ static int stac92xx_amp_mux_enum_put(str
0, &spec->cur_amux);
}
static struct hda_verb stac9200_core_init[] = {
/* set dac0mux for dac converter */
{ 0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
-@@ -840,9 +916,9 @@
+@@ -840,9 +916,9 @@ static struct hda_verb stac92hd73xx_10ch
};
static struct hda_verb stac92hd83xxx_core_init[] = {
/* power state controls amps */
{ 0x01, AC_VERB_SET_EAPD, 1 << 2},
-@@ -852,26 +928,12 @@
+@@ -852,26 +928,12 @@ static struct hda_verb stac92hd83xxx_cor
static struct hda_verb stac92hd71bxx_core_init[] = {
/* set master volume and direct control */
{ 0x28, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
{ 0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
{ 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
{}
-@@ -952,31 +1014,20 @@
+@@ -952,31 +1014,20 @@ static struct hda_verb stac9205_core_ini
.private_value = HDA_COMPOSE_AMP_VAL(nid, chs, idx, dir) \
}
HDA_CODEC_VOLUME("Capture Volume", 0x0a, 0, HDA_OUTPUT),
HDA_CODEC_MUTE("Capture Switch", 0x0a, 0, HDA_OUTPUT),
{ } /* end */
-@@ -1001,26 +1052,10 @@
+@@ -1001,26 +1052,10 @@ static struct snd_kcontrol_new stac92hd7
HDA_CODEC_VOLUME("DAC Mixer Capture Volume", 0x1d, 0x3, HDA_INPUT),
HDA_CODEC_MUTE("DAC Mixer Capture Switch", 0x1d, 0x3, HDA_INPUT),
HDA_CODEC_VOLUME("Front Mic Mixer Capture Volume", 0x1d, 0, HDA_INPUT),
HDA_CODEC_MUTE("Front Mic Mixer Capture Switch", 0x1d, 0, HDA_INPUT),
-@@ -1039,14 +1074,6 @@
+@@ -1039,14 +1074,6 @@ static struct snd_kcontrol_new stac92hd7
};
static struct snd_kcontrol_new stac92hd73xx_10ch_mixer[] = {
HDA_CODEC_VOLUME("Front Mic Mixer Capture Volume", 0x1d, 0, HDA_INPUT),
HDA_CODEC_MUTE("Front Mic Mixer Capture Switch", 0x1d, 0, HDA_INPUT),
-@@ -1066,12 +1093,6 @@
+@@ -1066,12 +1093,6 @@ static struct snd_kcontrol_new stac92hd7
static struct snd_kcontrol_new stac92hd83xxx_mixer[] = {
HDA_CODEC_VOLUME("DAC0 Capture Volume", 0x1b, 0x3, HDA_INPUT),
HDA_CODEC_MUTE("DAC0 Capture Switch", 0x1b, 0x3, HDA_INPUT),
-@@ -1091,104 +1112,12 @@
+@@ -1091,104 +1112,12 @@ static struct snd_kcontrol_new stac92hd8
{ } /* end */
};
static struct snd_kcontrol_new stac_smux_mixer = {
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
.name = "IEC958 Playback Source",
-@@ -1205,10 +1134,7 @@
+@@ -1205,10 +1134,7 @@ static const char *slave_vols[] = {
"LFE Playback Volume",
"Side Playback Volume",
"Headphone Playback Volume",
NULL
};
-@@ -1219,33 +1145,27 @@
+@@ -1219,33 +1145,27 @@ static const char *slave_sws[] = {
"LFE Playback Switch",
"Side Playback Switch",
"Headphone Playback Switch",
if (err < 0)
return err;
}
-@@ -1301,6 +1221,8 @@
+@@ -1301,6 +1221,8 @@ static int stac92xx_build_controls(struc
return err;
}
return 0;
}
-@@ -1454,6 +1376,7 @@
+@@ -1454,6 +1376,7 @@ static unsigned int *stac9200_brd_tbl[ST
};
static const char *stac9200_models[STAC_9200_MODELS] = {
[STAC_REF] = "ref",
[STAC_9200_OQO] = "oqo",
[STAC_9200_DELL_D21] = "dell-d21",
-@@ -1471,10 +1394,16 @@
+@@ -1471,10 +1394,16 @@ static const char *stac9200_models[STAC_
[STAC_9200_PANASONIC] = "panasonic",
};
/* Dell laptops have BIOS problem */
SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01a8,
"unknown Dell", STAC_9200_DELL_D21),
-@@ -1597,6 +1526,7 @@
+@@ -1597,6 +1526,7 @@ static unsigned int *stac925x_brd_tbl[ST
};
static const char *stac925x_models[STAC_925x_MODELS] = {
[STAC_REF] = "ref",
[STAC_M1] = "m1",
[STAC_M1_2] = "m1-2",
-@@ -1624,6 +1554,7 @@
+@@ -1624,6 +1554,7 @@ static struct snd_pci_quirk stac925x_cod
static struct snd_pci_quirk stac925x_cfg_tbl[] = {
/* SigmaTel reference board */
SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, "DFI LanParty", STAC_REF),
SND_PCI_QUIRK(0x8384, 0x7632, "Stac9202 Reference Board", STAC_REF),
/* Default table for unknown ID */
-@@ -1655,6 +1586,7 @@
+@@ -1655,6 +1586,7 @@ static unsigned int *stac92hd73xx_brd_tb
};
static const char *stac92hd73xx_models[STAC_92HD73XX_MODELS] = {
[STAC_92HD73XX_NO_JD] = "no-jd",
[STAC_92HD73XX_REF] = "ref",
[STAC_DELL_M6_AMIC] = "dell-m6-amic",
-@@ -1667,6 +1599,8 @@
+@@ -1667,6 +1599,8 @@ static struct snd_pci_quirk stac92hd73xx
/* SigmaTel reference board */
SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
"DFI LanParty", STAC_92HD73XX_REF),
SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0254,
"Dell Studio 1535", STAC_DELL_M6_DMIC),
SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0255,
-@@ -1687,55 +1621,73 @@
+@@ -1687,55 +1621,73 @@ static struct snd_pci_quirk stac92hd73xx
"Dell Studio 1537", STAC_DELL_M6_DMIC),
SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02a0,
"Dell Studio 17", STAC_DELL_M6_DMIC),
};
static unsigned int *stac92hd71bxx_brd_tbl[STAC_92HD71BXX_MODELS] = {
-@@ -1745,39 +1697,42 @@
+@@ -1745,39 +1697,42 @@ static unsigned int *stac92hd71bxx_brd_t
[STAC_DELL_M4_3] = dell_m4_3_pin_configs,
[STAC_HP_M4] = NULL,
[STAC_HP_DV5] = NULL,
SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0233,
"unknown Dell", STAC_DELL_M4_1),
SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0234,
-@@ -1929,6 +1884,7 @@
+@@ -1929,6 +1884,7 @@ static unsigned int *stac922x_brd_tbl[ST
};
static const char *stac922x_models[STAC_922X_MODELS] = {
[STAC_D945_REF] = "ref",
[STAC_D945GTP5] = "5stack",
[STAC_D945GTP3] = "3stack",
-@@ -1956,6 +1912,8 @@
+@@ -1956,6 +1912,8 @@ static struct snd_pci_quirk stac922x_cfg
/* SigmaTel reference board */
SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
"DFI LanParty", STAC_D945_REF),
/* Intel 945G based systems */
SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0101,
"Intel D945G", STAC_D945GTP3),
-@@ -2036,31 +1994,7 @@
+@@ -2036,31 +1994,7 @@ static struct snd_pci_quirk stac922x_cfg
SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d7,
"Dell XPS M1210", STAC_922X_DELL_M82),
/* ECS/PC Chips boards */
"ECS/PC chips", STAC_ECS_202),
{} /* terminator */
};
-@@ -2086,6 +2020,13 @@
+@@ -2086,6 +2020,13 @@ static unsigned int d965_5st_pin_configs
0x40000100, 0x40000100
};
static unsigned int dell_3st_pin_configs[14] = {
0x02211230, 0x02a11220, 0x01a19040, 0x01114210,
0x01111212, 0x01116211, 0x01813050, 0x01112214,
-@@ -2098,15 +2039,18 @@
+@@ -2098,15 +2039,18 @@ static unsigned int *stac927x_brd_tbl[ST
[STAC_D965_REF] = ref927x_pin_configs,
[STAC_D965_3ST] = d965_3st_pin_configs,
[STAC_D965_5ST] = d965_5st_pin_configs,
[STAC_DELL_3ST] = "dell-3stack",
[STAC_DELL_BIOS] = "dell-bios",
};
-@@ -2115,26 +2059,16 @@
+@@ -2115,26 +2059,16 @@ static struct snd_pci_quirk stac927x_cfg
/* SigmaTel reference board */
SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
"DFI LanParty", STAC_D965_REF),
/* Dell 3 stack systems */
SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f7, "Dell XPS M1730", STAC_DELL_3ST),
SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01dd, "Dell Dimension E520", STAC_DELL_3ST),
-@@ -2144,21 +2078,16 @@
+@@ -2144,21 +2078,16 @@ static struct snd_pci_quirk stac927x_cfg
SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f3, "Dell Inspiron 1420", STAC_DELL_BIOS),
SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0227, "Dell Vostro 1400 ", STAC_DELL_BIOS),
SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x022e, "Dell ", STAC_DELL_BIOS),
{} /* terminator */
};
-@@ -2215,6 +2144,7 @@
+@@ -2215,6 +2144,7 @@ static unsigned int *stac9205_brd_tbl[ST
};
static const char *stac9205_models[STAC_9205_MODELS] = {
[STAC_9205_REF] = "ref",
[STAC_9205_DELL_M42] = "dell-m42",
[STAC_9205_DELL_M43] = "dell-m43",
-@@ -2226,6 +2156,10 @@
+@@ -2226,6 +2156,10 @@ static struct snd_pci_quirk stac9205_cfg
/* SigmaTel reference board */
SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
"DFI LanParty", STAC_9205_REF),
/* Dell */
SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f1,
"unknown Dell", STAC_9205_DELL_M42),
-@@ -2258,6 +2192,7 @@
+@@ -2258,6 +2192,7 @@ static struct snd_pci_quirk stac9205_cfg
SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0228,
"Dell Vostro 1500", STAC_9205_DELL_M42),
/* Gateway */
SND_PCI_QUIRK(0x107b, 0x0565, "Gateway T1616", STAC_9205_EAPD),
{} /* terminator */
};
-@@ -2515,10 +2450,18 @@
+@@ -2515,10 +2450,18 @@ static int stac92xx_build_pcms(struct hd
return 0;
}
pincap = (pincap & AC_PINCAP_VREF) >> AC_PINCAP_VREF_SHIFT;
if (pincap & AC_PINCAP_VREF_100)
return AC_PINCTL_VREF_100;
-@@ -2550,8 +2493,7 @@
+@@ -2550,8 +2493,7 @@ static int stac92xx_hp_switch_get(struct
return 0;
}
static int stac92xx_hp_switch_put(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
-@@ -2559,25 +2501,119 @@
- struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
- struct sigmatel_spec *spec = codec->spec;
- int nid = kcontrol->private_value;
--
-+
- spec->hp_switch = ucontrol->value.integer.value[0] ? nid : 0;
-
+@@ -2565,19 +2507,113 @@ static int stac92xx_hp_switch_put(struct
/* check to be sure that the ports are upto date with
* switch changes
*/
return 0;
}
-@@ -2585,9 +2621,9 @@
+@@ -2585,9 +2621,9 @@ static int stac92xx_io_switch_put(struct
{
struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
struct sigmatel_spec *spec = codec->spec;
spec->io_switch[io_idx] = val;
-@@ -2596,7 +2632,7 @@
+@@ -2596,7 +2632,7 @@ static int stac92xx_io_switch_put(struct
else {
unsigned int pinctl = AC_PINCTL_IN_EN;
if (io_idx) /* set VREF for mic */
stac92xx_auto_set_pinctl(codec, nid, pinctl);
}
-@@ -2604,7 +2640,7 @@
+@@ -2604,7 +2640,7 @@ static int stac92xx_io_switch_put(struct
* appropriately according to the pin direction
*/
if (spec->hp_detect)
return 1;
}
-@@ -2677,7 +2713,8 @@
+@@ -2677,7 +2713,8 @@ enum {
STAC_CTL_WIDGET_AMP_VOL,
STAC_CTL_WIDGET_HP_SWITCH,
STAC_CTL_WIDGET_IO_SWITCH,
};
static struct snd_kcontrol_new stac92xx_control_templates[] = {
-@@ -2689,38 +2726,42 @@
+@@ -2689,38 +2726,42 @@ static struct snd_kcontrol_new stac92xx_
STAC_CODEC_HP_SWITCH(NULL),
STAC_CODEC_IO_SWITCH(NULL, 0),
STAC_CODEC_CLFE_SWITCH(NULL, 0),
return 0;
}
-@@ -2741,7 +2782,60 @@
+@@ -2741,8 +2782,61 @@ static inline int stac92xx_add_control(s
return stac92xx_add_control_idx(spec, type, 0, name, val);
}
-/* check whether the line-input can be used as line-out */
+-static hda_nid_t check_line_out_switch(struct hda_codec *codec)
+static struct snd_kcontrol_new stac_input_src_temp = {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .name = "Input Source",
+}
+
+/* check whether the line-input can be used as line-out */
- static hda_nid_t check_line_out_switch(struct hda_codec *codec)
++static hda_nid_t check_line_out_switch(struct hda_codec *codec)
{
struct sigmatel_spec *spec = codec->spec;
-@@ -2752,7 +2846,7 @@
+ struct auto_pin_cfg *cfg = &spec->autocfg;
+@@ -2752,7 +2846,7 @@ static hda_nid_t check_line_out_switch(s
if (cfg->line_out_type != AUTO_PIN_LINE_OUT)
return 0;
nid = cfg->input_pins[AUTO_PIN_LINE];
if (pincap & AC_PINCAP_OUT)
return nid;
return 0;
-@@ -2771,12 +2865,11 @@
+@@ -2771,12 +2865,11 @@ static hda_nid_t check_mic_out_switch(st
mic_pin = AUTO_PIN_MIC;
for (;;) {
hda_nid_t nid = cfg->input_pins[mic_pin];
if (pincap & AC_PINCAP_OUT)
return nid;
}
-@@ -2824,9 +2917,8 @@
+@@ -2824,9 +2917,8 @@ static hda_nid_t get_unassigned_dac(stru
conn_len = snd_hda_get_connections(codec, nid, conn,
HDA_MAX_CONNECTIONS);
for (j = 0; j < conn_len; j++) {
/* we check only analog outputs */
if (wtype != AC_WID_AUD_OUT || (wcaps & AC_WCAP_DIGITAL))
continue;
-@@ -2840,6 +2932,16 @@
+@@ -2840,6 +2932,16 @@ static hda_nid_t get_unassigned_dac(stru
return conn[j];
}
}
return 0;
}
-@@ -2880,6 +2982,26 @@
+@@ -2880,6 +2982,26 @@ static int stac92xx_auto_fill_dac_nids(s
add_spec_dacs(spec, dac);
}
/* add line-in as output */
nid = check_line_out_switch(codec);
if (nid) {
-@@ -2907,26 +3029,6 @@
+@@ -2907,26 +3029,6 @@ static int stac92xx_auto_fill_dac_nids(s
}
}
snd_printd("stac92xx: dac_nids=%d (0x%x/0x%x/0x%x/0x%x/0x%x)\n",
spec->multiout.num_dacs,
spec->multiout.dac_nids[0],
-@@ -2939,8 +3041,8 @@
+@@ -2939,8 +3041,8 @@ static int stac92xx_auto_fill_dac_nids(s
}
/* create volume control/switch for the given prefx type */
{
struct sigmatel_spec *spec = codec->spec;
char name[32];
-@@ -2964,19 +3066,22 @@
+@@ -2964,19 +3066,22 @@ static int create_controls(struct hda_co
}
sprintf(name, "%s Playback Volume", pfx);
static int add_spec_dacs(struct sigmatel_spec *spec, hda_nid_t nid)
{
if (spec->multiout.num_dacs > 4) {
-@@ -3014,12 +3119,6 @@
+@@ -3014,12 +3119,6 @@ static int create_multi_out_ctls(struct
static const char *chname[4] = {
"Front", "Surround", NULL /*CLFE*/, "Side"
};
hda_nid_t nid;
int i, err;
unsigned int wid_caps;
-@@ -3055,18 +3154,22 @@
+@@ -3055,18 +3154,22 @@ static int create_multi_out_ctls(struct
} else {
const char *name;
if (err < 0)
return err;
}
-@@ -3074,12 +3177,29 @@
+@@ -3074,12 +3177,29 @@ static int create_multi_out_ctls(struct
return 0;
}
err = create_multi_out_ctls(codec, cfg->line_outs, cfg->line_out_pins,
spec->multiout.dac_nids,
-@@ -3096,20 +3216,13 @@
+@@ -3096,20 +3216,13 @@ static int stac92xx_auto_create_multi_ou
return err;
}
}
return 0;
-@@ -3152,7 +3265,7 @@
+@@ -3152,7 +3265,7 @@ static int stac92xx_auto_create_mono_out
spec->mono_nid,
con_lst,
HDA_MAX_NUM_INPUTS);
return -EINVAL;
for (i = 0; i < num_cons; i++) {
-@@ -3298,7 +3411,7 @@
+@@ -3298,7 +3411,7 @@ static int stac92xx_auto_create_spdif_mu
spec->smux_nids[0],
con_lst,
HDA_MAX_NUM_INPUTS);
return -EINVAL;
if (!labels)
-@@ -3319,53 +3432,66 @@
+@@ -3319,53 +3432,66 @@ static const char *stac92xx_dmic_labels[
"Digital Mic 3", "Digital Mic 4"
};
err = stac92xx_add_control(spec,
STAC_CTL_WIDGET_VOL,
-@@ -3377,15 +3503,100 @@
+@@ -3377,15 +3503,100 @@ found:
return err;
}
/* create playback/capture controls for input pins */
static int stac92xx_auto_create_analog_input_ctls(struct hda_codec *codec, const struct auto_pin_cfg *cfg)
{
-@@ -3418,6 +3629,7 @@
+@@ -3418,6 +3629,7 @@ static int stac92xx_auto_create_analog_i
imux->items[imux->num_items].index = index;
imux->num_items++;
}
if (imux->num_items) {
/*
-@@ -3469,7 +3681,7 @@
+@@ -3469,7 +3681,7 @@ static int stac92xx_parse_auto_config(st
{
struct sigmatel_spec *spec = codec->spec;
int hp_swap = 0;
if ((err = snd_hda_parse_pin_def_config(codec,
&spec->autocfg,
-@@ -3509,11 +3721,10 @@
+@@ -3509,11 +3721,10 @@ static int stac92xx_parse_auto_config(st
if (snd_hda_get_connections(codec,
spec->autocfg.mono_out_pin, conn_list, 1) &&
snd_hda_get_connections(codec, conn_list[0],
/* LR swap check, some stac925x have a mux that
* changes the DACs output path instead of the
* mono-mux path.
-@@ -3578,6 +3789,8 @@
+@@ -3578,6 +3789,8 @@ static int stac92xx_parse_auto_config(st
err = snd_hda_attach_beep_device(codec, nid);
if (err < 0)
return err;
/* if no beep switch is available, make its own one */
caps = query_amp_caps(codec, nid, HDA_OUTPUT);
if (codec->beep &&
-@@ -3602,6 +3815,21 @@
+@@ -3602,6 +3815,21 @@ static int stac92xx_parse_auto_config(st
spec->autocfg.line_outs = 0;
}
err = stac92xx_auto_create_analog_input_ctls(codec, &spec->autocfg);
if (err < 0)
return err;
-@@ -3631,6 +3859,10 @@
+@@ -3631,6 +3859,10 @@ static int stac92xx_parse_auto_config(st
return err;
}
spec->multiout.max_channels = spec->multiout.num_dacs * 2;
if (spec->multiout.max_channels > 2)
spec->surr_switch = 1;
-@@ -3640,8 +3872,8 @@
+@@ -3640,8 +3872,8 @@ static int stac92xx_parse_auto_config(st
if (dig_in && spec->autocfg.dig_in_pin)
spec->dig_in_nid = dig_in;
spec->input_mux = &spec->private_imux;
if (!spec->dinput_mux)
-@@ -3698,9 +3930,7 @@
+@@ -3698,9 +3930,7 @@ static int stac9200_auto_create_lfe_ctls
for (i = 0; i < spec->autocfg.line_outs && lfe_pin == 0x0; i++) {
hda_nid_t pin = spec->autocfg.line_out_pins[i];
unsigned int defcfg;
if (get_defcfg_device(defcfg) == AC_JACK_SPEAKER) {
unsigned int wcaps = get_wcaps(codec, pin);
wcaps &= (AC_WCAP_STEREO | AC_WCAP_OUT_AMP);
-@@ -3744,13 +3974,17 @@
+@@ -3744,13 +3974,17 @@ static int stac9200_parse_auto_config(st
return err;
}
spec->input_mux = &spec->private_imux;
spec->dinput_mux = &spec->private_dimux;
-@@ -3799,26 +4033,27 @@
+@@ -3799,26 +4033,27 @@ static int stac_add_event(struct sigmate
{
struct sigmatel_event *event;
return event;
}
return NULL;
-@@ -3828,34 +4063,42 @@
+@@ -3828,34 +4063,42 @@ static struct sigmatel_event *stac_get_e
unsigned char tag)
{
struct sigmatel_spec *spec = codec->spec;
}
static int is_nid_hp_pin(struct auto_pin_cfg *cfg, hda_nid_t nid)
-@@ -3915,46 +4158,64 @@
+@@ -3915,46 +4158,64 @@ static int stac92xx_init(struct hda_code
hda_nid_t nid = cfg->hp_pins[i];
enable_pin_detect(codec, nid, STAC_HP_EVENT);
}
}
}
}
-@@ -3990,8 +4251,7 @@
+@@ -3990,8 +4251,7 @@ static int stac92xx_init(struct hda_code
stac_toggle_power_map(codec, nid, 1);
continue;
}
def_conf = get_defcfg_connect(def_conf);
/* skip any ports that don't have jacks since presence
* detection is useless */
-@@ -4000,32 +4260,35 @@
+@@ -4000,32 +4260,35 @@ static int stac92xx_init(struct hda_code
stac_toggle_power_map(codec, nid, 1);
continue;
}
kfree(spec);
snd_hda_detach_beep_device(codec);
-@@ -4034,7 +4297,9 @@
+@@ -4034,7 +4297,9 @@ static void stac92xx_free(struct hda_cod
static void stac92xx_set_pinctl(struct hda_codec *codec, hda_nid_t nid,
unsigned int flag)
{
0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0x00);
if (pin_ctl & AC_PINCTL_IN_EN) {
-@@ -4048,14 +4313,17 @@
+@@ -4048,14 +4313,17 @@ static void stac92xx_set_pinctl(struct h
return;
}
}
static void stac92xx_reset_pinctl(struct hda_codec *codec, hda_nid_t nid,
-@@ -4063,9 +4331,10 @@
+@@ -4063,9 +4331,10 @@ static void stac92xx_reset_pinctl(struct
{
unsigned int pin_ctl = snd_hda_codec_read(codec, nid,
0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0x00);
}
static int get_pin_presence(struct hda_codec *codec, hda_nid_t nid)
-@@ -4078,6 +4347,48 @@
+@@ -4078,6 +4347,48 @@ static int get_pin_presence(struct hda_c
return 0;
}
+ spec->gpio_dir, spec->gpio_data |
+ spec->eapd_mask);
+ }
-+}
++}
+
/* return non-zero if the hp-pin of the given array index isn't
* a jack-detection target
*/
-@@ -4130,13 +4441,6 @@
+@@ -4130,13 +4441,6 @@ static void stac92xx_hp_detect(struct hd
for (i = 0; i < cfg->line_outs; i++)
stac92xx_reset_pinctl(codec, cfg->line_out_pins[i],
AC_PINCTL_OUT_EN);
} else {
/* enable lineouts */
if (spec->hp_switch)
-@@ -4145,14 +4449,8 @@
+@@ -4145,14 +4449,8 @@ static void stac92xx_hp_detect(struct hd
for (i = 0; i < cfg->line_outs; i++)
stac92xx_set_pinctl(codec, cfg->line_out_pins[i],
AC_PINCTL_OUT_EN);
/* toggle hp outs */
for (i = 0; i < cfg->hp_outs; i++) {
unsigned int val = AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN;
-@@ -4210,10 +4508,28 @@
+@@ -4210,10 +4508,28 @@ static void stac92xx_pin_sense(struct hd
stac_toggle_power_map(codec, nid, get_pin_presence(codec, nid));
}
if (!event)
return;
codec->patch_ops.unsol_event(codec, (unsigned)event->tag << 26);
-@@ -4232,12 +4548,40 @@
+@@ -4232,12 +4548,40 @@ static void stac92xx_unsol_event(struct
switch (event->type) {
case STAC_HP_EVENT:
break;
case STAC_VREF_EVENT:
data = snd_hda_codec_read(codec, codec->afg, 0,
-@@ -4254,17 +4598,48 @@
+@@ -4254,17 +4598,48 @@ static int stac92xx_resume(struct hda_co
{
struct sigmatel_spec *spec = codec->spec;
static int stac92xx_suspend(struct hda_codec *codec, pm_message_t state)
{
struct sigmatel_spec *spec = codec->spec;
-@@ -4275,8 +4650,7 @@
+@@ -4275,8 +4650,7 @@ static int stac92xx_suspend(struct hda_c
nid = codec->start_nid;
for (i = 0; i < codec->num_nodes; i++, nid++) {
unsigned int wcaps = get_wcaps(codec, nid);
if (wid_type == AC_WID_PIN)
snd_hda_codec_read(codec, nid, 0,
AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
-@@ -4435,6 +4809,9 @@
+@@ -4435,6 +4809,9 @@ static int patch_stac925x(struct hda_cod
spec->init = stac925x_core_init;
spec->mixer = stac925x_mixer;
err = stac92xx_parse_auto_config(codec, 0x8, 0x7);
if (!err) {
-@@ -4456,16 +4833,6 @@
+@@ -4456,16 +4833,6 @@ static int patch_stac925x(struct hda_cod
return 0;
}
static int patch_stac92hd73xx(struct hda_codec *codec)
{
struct sigmatel_spec *spec;
-@@ -4520,12 +4887,10 @@
+@@ -4520,12 +4887,10 @@ again:
case 0x5: /* 10 Channel */
spec->mixer = stac92hd73xx_10ch_mixer;
spec->init = stac92hd73xx_10ch_core_init;
spec->digbeep_nid = 0x1c;
spec->mux_nids = stac92hd73xx_mux_nids;
spec->adc_nids = stac92hd73xx_adc_nids;
-@@ -4538,8 +4903,10 @@
+@@ -4538,8 +4903,10 @@ again:
spec->num_muxes = ARRAY_SIZE(stac92hd73xx_mux_nids);
spec->num_adcs = ARRAY_SIZE(stac92hd73xx_adc_nids);
spec->num_dmuxes = ARRAY_SIZE(stac92hd73xx_dmux_nids);
switch (spec->board_config) {
case STAC_DELL_EQ:
-@@ -4558,20 +4925,17 @@
+@@ -4558,20 +4925,17 @@ again:
spec->init = dell_m6_core_init;
switch (spec->board_config) {
case STAC_DELL_M6_AMIC: /* Analog Mics */
break;
}
break;
-@@ -4579,13 +4943,13 @@
+@@ -4579,13 +4943,13 @@ again:
spec->num_dmics = STAC92HD73XX_NUM_DMICS;
spec->num_smuxes = ARRAY_SIZE(stac92hd73xx_smux_nids);
spec->eapd_switch = 1;
spec->num_pwrs = ARRAY_SIZE(stac92hd73xx_pwr_nids);
spec->pwr_nids = stac92hd73xx_pwr_nids;
-@@ -4615,21 +4979,13 @@
+@@ -4615,21 +4979,13 @@ again:
return 0;
}
spec = kzalloc(sizeof(*spec), GFP_KERNEL);
if (spec == NULL)
-@@ -4648,14 +5004,6 @@
+@@ -4648,14 +5004,6 @@ static int patch_stac92hd83xxx(struct hd
spec->num_pwrs = ARRAY_SIZE(stac92hd83xxx_pwr_nids);
spec->multiout.dac_nids = spec->dac_nids;
spec->init = stac92hd83xxx_core_init;
spec->mixer = stac92hd83xxx_mixer;
spec->num_pins = ARRAY_SIZE(stac92hd83xxx_pin_nids);
-@@ -4663,8 +5011,11 @@
+@@ -4663,8 +5011,11 @@ static int patch_stac92hd83xxx(struct hd
spec->num_adcs = ARRAY_SIZE(stac92hd83xxx_adc_nids);
spec->num_amps = ARRAY_SIZE(stac92hd83xxx_amp_nids);
spec->num_dmics = STAC92HD83XXX_NUM_DMICS;
spec->board_config = snd_hda_check_board_config(codec,
STAC_92HD83XXX_MODELS,
stac92hd83xxx_models,
-@@ -4687,6 +5038,7 @@
+@@ -4687,6 +5038,7 @@ again:
switch (codec->vendor_id) {
case 0x111d7604:
case 0x111d7605:
if (spec->board_config == STAC_92HD83XXX_PWR_REF)
break;
spec->num_pwrs = 0;
-@@ -4709,24 +5061,89 @@
+@@ -4709,24 +5061,89 @@ again:
return err;
}
int err = 0;
spec = kzalloc(sizeof(*spec), GFP_KERNEL);
-@@ -4735,11 +5152,21 @@
+@@ -4735,11 +5152,21 @@ static int patch_stac92hd71bxx(struct hd
codec->spec = spec;
codec->patch_ops = stac92xx_patch_ops;
spec->board_config = snd_hda_check_board_config(codec,
STAC_92HD71BXX_MODELS,
stac92hd71bxx_models,
-@@ -4766,14 +5193,25 @@
+@@ -4766,14 +5193,25 @@ again:
spec->gpio_data = 0x01;
}
break;
case 0x111d7608: /* 5 Port with Analog Mixer */
switch (spec->board_config) {
-@@ -4797,12 +5235,15 @@
+@@ -4797,12 +5235,15 @@ again:
/* no output amps */
spec->num_pwrs = 0;
break;
case 0x111d7603: /* 6 Port with Analog Mixer */
if ((codec->revision_id & 0xf) == 1)
-@@ -4812,12 +5253,17 @@
+@@ -4812,12 +5253,17 @@ again:
spec->num_pwrs = 0;
/* fallthru */
default:
/* Some HP machines seem to have unstable codec communications
* especially with ATI fglrx driver. For recovering from the
* CORB/RIRB stall, allow the BUS reset and keep always sync
-@@ -4827,25 +5273,22 @@
+@@ -4827,25 +5273,22 @@ again:
codec->bus->allow_bus_reset = 1;
}
stac92xx_auto_set_pinctl(codec, 0x0e,
AC_PINCTL_IN_EN | AC_PINCTL_VREF_80);
/* fallthru */
-@@ -4860,19 +5303,42 @@
+@@ -4860,19 +5303,42 @@ again:
spec->num_smuxes = 0;
spec->num_dmuxes = 1;
break;
+ codec->patch_ops.check_power_status =
+ stac92xx_hp_check_power_status;
+ }
-+#endif
++#endif
spec->multiout.dac_nids = spec->dac_nids;
- if (spec->dinput_mux)
if (!err) {
if (spec->board_config < 0) {
printk(KERN_WARNING "hda_codec: No auto-config is "
-@@ -4889,7 +5355,7 @@
+@@ -4889,7 +5355,7 @@ again:
}
return 0;
static int patch_stac922x(struct hda_codec *codec)
{
-@@ -4967,7 +5433,10 @@
+@@ -4967,7 +5433,10 @@ static int patch_stac922x(struct hda_cod
spec->num_pwrs = 0;
spec->init = stac922x_core_init;
spec->multiout.dac_nids = spec->dac_nids;
-@@ -5008,6 +5477,7 @@
+@@ -5008,6 +5477,7 @@ static int patch_stac927x(struct hda_cod
return -ENOMEM;
codec->spec = spec;
spec->num_pins = ARRAY_SIZE(stac927x_pin_nids);
spec->pin_nids = stac927x_pin_nids;
spec->board_config = snd_hda_check_board_config(codec, STAC_927X_MODELS,
-@@ -5049,32 +5519,37 @@
+@@ -5049,32 +5519,37 @@ static int patch_stac927x(struct hda_cod
spec->num_dmics = 0;
spec->init = d965_core_init;
spec->dmux_nids = stac927x_dmux_nids;
spec->num_dmuxes = ARRAY_SIZE(stac927x_dmux_nids);
break;
-@@ -5087,12 +5562,13 @@
+@@ -5087,12 +5562,13 @@ static int patch_stac927x(struct hda_cod
spec->num_dmics = 0;
spec->init = stac927x_core_init;
spec->eapd_switch = 1;
err = stac92xx_parse_auto_config(codec, 0x1e, 0x20);
-@@ -5174,10 +5650,11 @@
+@@ -5174,10 +5650,11 @@ static int patch_stac9205(struct hda_cod
spec->num_pwrs = 0;
spec->init = stac9205_core_init;
/* Turn on/off EAPD per HP plugging */
if (spec->board_config != STAC_9205_EAPD)
spec->eapd_switch = 1;
-@@ -5186,8 +5663,8 @@
+@@ -5186,8 +5663,8 @@ static int patch_stac9205(struct hda_cod
switch (spec->board_config){
case STAC_9205_DELL_M43:
/* Enable SPDIF in/out */
/* Enable unsol response for GPIO4/Dock HP connection */
err = stac_add_event(spec, codec->afg, STAC_VREF_EVENT, 0x01);
-@@ -5521,6 +5998,7 @@
+@@ -5521,6 +5998,7 @@ struct hda_codec_preset snd_hda_preset_s
{ .id = 0x83847661, .name = "CXD9872RD/K", .patch = patch_stac9872 },
{ .id = 0x83847662, .name = "STAC9872AK", .patch = patch_stac9872 },
{ .id = 0x83847664, .name = "CXD9872AKD", .patch = patch_stac9872 },
{ .id = 0x838476a0, .name = "STAC9205", .patch = patch_stac9205 },
{ .id = 0x838476a1, .name = "STAC9205D", .patch = patch_stac9205 },
{ .id = 0x838476a2, .name = "STAC9204", .patch = patch_stac9205 },
-@@ -5532,6 +6010,7 @@
+@@ -5532,6 +6010,7 @@ struct hda_codec_preset snd_hda_preset_s
{ .id = 0x111d7603, .name = "92HD75B3X5", .patch = patch_stac92hd71bxx},
{ .id = 0x111d7604, .name = "92HD83C1X5", .patch = patch_stac92hd83xxx},
{ .id = 0x111d7605, .name = "92HD81B1X5", .patch = patch_stac92hd83xxx},