aboutsummaryrefslogtreecommitdiffstats
path: root/sound/pci/hda/patch_conexant.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/pci/hda/patch_conexant.c')
-rw-r--r--sound/pci/hda/patch_conexant.c39
1 files changed, 33 insertions, 6 deletions
diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c
index a09c03c3f62b..ca9ad9fddbf2 100644
--- a/sound/pci/hda/patch_conexant.c
+++ b/sound/pci/hda/patch_conexant.c
@@ -111,6 +111,7 @@ struct conexant_spec {
111 unsigned int dell_automute; 111 unsigned int dell_automute;
112 unsigned int port_d_mode; 112 unsigned int port_d_mode;
113 unsigned char ext_mic_bias; 113 unsigned char ext_mic_bias;
114 unsigned int dell_vostro;
114}; 115};
115 116
116static int conexant_playback_pcm_open(struct hda_pcm_stream *hinfo, 117static int conexant_playback_pcm_open(struct hda_pcm_stream *hinfo,
@@ -2109,9 +2110,12 @@ static int cxt5066_mic_boost_mux_enum_get(struct snd_kcontrol *kcontrol,
2109{ 2110{
2110 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 2111 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2111 int val; 2112 int val;
2113 hda_nid_t nid = kcontrol->private_value & 0xff;
2114 int inout = (kcontrol->private_value & 0x100) ?
2115 AC_AMP_GET_INPUT : AC_AMP_GET_OUTPUT;
2112 2116
2113 val = snd_hda_codec_read(codec, 0x17, 0, 2117 val = snd_hda_codec_read(codec, nid, 0,
2114 AC_VERB_GET_AMP_GAIN_MUTE, AC_AMP_GET_OUTPUT); 2118 AC_VERB_GET_AMP_GAIN_MUTE, inout);
2115 2119
2116 ucontrol->value.enumerated.item[0] = val & AC_AMP_GAIN; 2120 ucontrol->value.enumerated.item[0] = val & AC_AMP_GAIN;
2117 return 0; 2121 return 0;
@@ -2123,6 +2127,9 @@ static int cxt5066_mic_boost_mux_enum_put(struct snd_kcontrol *kcontrol,
2123 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 2127 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2124 const struct hda_input_mux *imux = &cxt5066_analog_mic_boost; 2128 const struct hda_input_mux *imux = &cxt5066_analog_mic_boost;
2125 unsigned int idx; 2129 unsigned int idx;
2130 hda_nid_t nid = kcontrol->private_value & 0xff;
2131 int inout = (kcontrol->private_value & 0x100) ?
2132 AC_AMP_SET_INPUT : AC_AMP_SET_OUTPUT;
2126 2133
2127 if (!imux->num_items) 2134 if (!imux->num_items)
2128 return 0; 2135 return 0;
@@ -2130,9 +2137,9 @@ static int cxt5066_mic_boost_mux_enum_put(struct snd_kcontrol *kcontrol,
2130 if (idx >= imux->num_items) 2137 if (idx >= imux->num_items)
2131 idx = imux->num_items - 1; 2138 idx = imux->num_items - 1;
2132 2139
2133 snd_hda_codec_write_cache(codec, 0x17, 0, 2140 snd_hda_codec_write_cache(codec, nid, 0,
2134 AC_VERB_SET_AMP_GAIN_MUTE, 2141 AC_VERB_SET_AMP_GAIN_MUTE,
2135 AC_AMP_SET_RIGHT | AC_AMP_SET_LEFT | AC_AMP_SET_OUTPUT | 2142 AC_AMP_SET_RIGHT | AC_AMP_SET_LEFT | inout |
2136 imux->items[idx].index); 2143 imux->items[idx].index);
2137 2144
2138 return 1; 2145 return 1;
@@ -2201,10 +2208,11 @@ static struct snd_kcontrol_new cxt5066_mixers[] = {
2201 2208
2202 { 2209 {
2203 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 2210 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2204 .name = "Analog Mic Boost Capture Enum", 2211 .name = "Ext Mic Boost Capture Enum",
2205 .info = cxt5066_mic_boost_mux_enum_info, 2212 .info = cxt5066_mic_boost_mux_enum_info,
2206 .get = cxt5066_mic_boost_mux_enum_get, 2213 .get = cxt5066_mic_boost_mux_enum_get,
2207 .put = cxt5066_mic_boost_mux_enum_put, 2214 .put = cxt5066_mic_boost_mux_enum_put,
2215 .private_value = 0x17,
2208 }, 2216 },
2209 2217
2210 HDA_BIND_VOL("Capture Volume", &cxt5066_bind_capture_vol_others), 2218 HDA_BIND_VOL("Capture Volume", &cxt5066_bind_capture_vol_others),
@@ -2212,6 +2220,18 @@ static struct snd_kcontrol_new cxt5066_mixers[] = {
2212 {} 2220 {}
2213}; 2221};
2214 2222
2223static struct snd_kcontrol_new cxt5066_vostro_mixers[] = {
2224 {
2225 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2226 .name = "Int Mic Boost Capture Enum",
2227 .info = cxt5066_mic_boost_mux_enum_info,
2228 .get = cxt5066_mic_boost_mux_enum_get,
2229 .put = cxt5066_mic_boost_mux_enum_put,
2230 .private_value = 0x23 | 0x100,
2231 },
2232 {}
2233};
2234
2215static struct hda_verb cxt5066_init_verbs[] = { 2235static struct hda_verb cxt5066_init_verbs[] = {
2216 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, /* Port B */ 2236 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, /* Port B */
2217 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, /* Port C */ 2237 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, /* Port C */
@@ -2397,11 +2417,16 @@ static struct hda_verb cxt5066_init_verbs_portd_lo[] = {
2397/* initialize jack-sensing, too */ 2417/* initialize jack-sensing, too */
2398static int cxt5066_init(struct hda_codec *codec) 2418static int cxt5066_init(struct hda_codec *codec)
2399{ 2419{
2420 struct conexant_spec *spec = codec->spec;
2421
2400 snd_printdd("CXT5066: init\n"); 2422 snd_printdd("CXT5066: init\n");
2401 conexant_init(codec); 2423 conexant_init(codec);
2402 if (codec->patch_ops.unsol_event) { 2424 if (codec->patch_ops.unsol_event) {
2403 cxt5066_hp_automute(codec); 2425 cxt5066_hp_automute(codec);
2404 cxt5066_automic(codec); 2426 if (spec->dell_vostro)
2427 cxt5066_vostro_automic(codec);
2428 else
2429 cxt5066_automic(codec);
2405 } 2430 }
2406 return 0; 2431 return 0;
2407} 2432}
@@ -2500,7 +2525,9 @@ static int patch_cxt5066(struct hda_codec *codec)
2500 spec->init_verbs[0] = cxt5066_init_verbs_vostro; 2525 spec->init_verbs[0] = cxt5066_init_verbs_vostro;
2501 spec->mixers[spec->num_mixers++] = cxt5066_mixer_master_olpc; 2526 spec->mixers[spec->num_mixers++] = cxt5066_mixer_master_olpc;
2502 spec->mixers[spec->num_mixers++] = cxt5066_mixers; 2527 spec->mixers[spec->num_mixers++] = cxt5066_mixers;
2528 spec->mixers[spec->num_mixers++] = cxt5066_vostro_mixers;
2503 spec->port_d_mode = 0; 2529 spec->port_d_mode = 0;
2530 spec->dell_vostro = 1;
2504 2531
2505 /* no S/PDIF out */ 2532 /* no S/PDIF out */
2506 spec->multiout.dig_out_nid = 0; 2533 spec->multiout.dig_out_nid = 0;