--- alsa-driver-1.0.16.orig/alsa-kernel/pci/hda/patch_realtek.c 2008-02-05 12:23:24.000000000 +0300 +++ alsa-driver-1.0.16/alsa-kernel/pci/hda/patch_realtek.c 2008-04-27 16:13:24.000000000 +0400 @@ -146,6 +146,7 @@ ALC861VD_LENOVO, ALC861VD_DALLAS, ALC861VD_HP, + ALC861VD_TOSHIBA, ALC861VD_AUTO, ALC861VD_MODEL_LAST, }; @@ -11865,6 +11866,13 @@ }, }; +static struct hda_input_mux alc861vd_toshiba_capture_source = { + .num_items = 1, + .items = { + { "Mic", 0x0 }, + }, +}; + #define alc861vd_mux_enum_info alc_mux_enum_info #define alc861vd_mux_enum_get alc_mux_enum_get @@ -12081,6 +12089,26 @@ { } /* end */ }; +/* Pin assignment: Front = 0x14, HP = 0x15, + * Mic = 0x18 + */ +static struct snd_kcontrol_new alc861vd_toshiba_mixer[] = { + HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT), + HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), + + HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT), + HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT), + + HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x0b, 0x05, HDA_INPUT), + HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x0b, 0x05, HDA_INPUT), + + HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), + HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), + HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), + + { } /* end */ +}; + /* * generic initialization of ADC, input mixers and output mixers */ @@ -12326,6 +12354,39 @@ alc861vd_dallas_automute(codec); } +#define alc861vd_toshiba_hp_automute alc861vd_dallas_automute + +/* mute mic if it's unplugged */ +static void alc861vd_toshiba_mic_automute(struct hda_codec *codec) +{ + unsigned int present; + unsigned char bits; + + present = snd_hda_codec_read(codec, 0x18, 0, + AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; + bits = present ? 0 : HDA_AMP_MUTE; + snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 0, + HDA_AMP_MUTE, bits); +} + +static void alc861vd_toshiba_automute(struct hda_codec *codec) +{ + alc861vd_toshiba_hp_automute(codec); + alc861vd_toshiba_mic_automute(codec); +} + +static void alc861vd_toshiba_unsol_event(struct hda_codec *codec, unsigned int res) +{ + switch (res >> 26) { + case ALC880_HP_EVENT: + alc861vd_toshiba_hp_automute(codec); + break; + case ALC880_MIC_EVENT: + alc861vd_toshiba_mic_automute(codec); + break; + } +} + #ifdef CONFIG_SND_HDA_POWER_SAVE #define alc861vd_loopbacks alc880_loopbacks #endif @@ -12348,6 +12409,7 @@ [ALC861VD_LENOVO] = "lenovo", [ALC861VD_DALLAS] = "dallas", [ALC861VD_HP] = "hp", + [ALC861VD_TOSHIBA] = "toshiba", [ALC861VD_AUTO] = "auto", }; @@ -12362,6 +12424,7 @@ /*SND_PCI_QUIRK(0x1179, 0xff00, "DALLAS", ALC861VD_DALLAS),*/ /*lenovo*/ SND_PCI_QUIRK(0x1179, 0xff01, "DALLAS", ALC861VD_DALLAS), SND_PCI_QUIRK(0x1179, 0xff03, "Toshiba P205", ALC861VD_LENOVO), + SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30", ALC861VD_TOSHIBA), SND_PCI_QUIRK(0x1565, 0x820d, "Biostar NF61S SE", ALC861VD_6ST_DIG), SND_PCI_QUIRK(0x17aa, 0x2066, "Lenovo", ALC861VD_LENOVO), SND_PCI_QUIRK(0x17aa, 0x3802, "Lenovo 3000 C200", ALC861VD_LENOVO), @@ -12470,6 +12533,20 @@ .unsol_event = alc861vd_dallas_unsol_event, .init_hook = alc861vd_dallas_automute, }, + [ALC861VD_TOSHIBA] = { + .mixers = { alc861vd_toshiba_mixer }, + .init_verbs = { alc861vd_dallas_verbs, + alc861vd_lenovo_unsol_verbs }, + .num_dacs = ARRAY_SIZE(alc861vd_dac_nids), + .dac_nids = alc861vd_dac_nids, + .num_adc_nids = ARRAY_SIZE(alc861vd_adc_nids), + .adc_nids = alc861vd_adc_nids, + .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes), + .channel_mode = alc861vd_3stack_2ch_modes, + .input_mux = &alc861vd_toshiba_capture_source, + .unsol_event = alc861vd_toshiba_unsol_event, + .init_hook = alc861vd_toshiba_automute, + }, }; /*