diff options
| -rw-r--r-- | sound/pci/hda/patch_conexant.c | 39 |
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 | ||
| 116 | static int conexant_playback_pcm_open(struct hda_pcm_stream *hinfo, | 117 | static 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 | ||
| 2223 | static 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 | |||
| 2215 | static struct hda_verb cxt5066_init_verbs[] = { | 2235 | static 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 */ |
| 2398 | static int cxt5066_init(struct hda_codec *codec) | 2418 | static 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; |
