--- /usr/src/linux/sound/pci/hda/patch_realtek.c.bk 2012-02-14 22:04:36.351729299 +0800 +++ /usr/src/linux/sound/pci/hda/patch_realtek.c 2012-02-16 17:41:59.022196749 +0800 @@ -80,6 +80,7 @@ enum { ALC260_WILL, ALC260_REPLACER_672V, ALC260_FAVORIT100, + ALC260_B1900, #ifdef CONFIG_SND_DEBUG ALC260_TEST, #endif @@ -1323,6 +1324,24 @@ static void alc_inithook(struct hda_code alc_mic_automute(codec); } +/* toggle speaker-output according to the hp-jack state */ +static void alc260_b1900_automute(struct hda_codec *codec) +{ + unsigned int present; + + present = snd_hda_jack_detect(codec, 0x0f); + if (present) { + snd_hda_codec_write_cache(codec, 0x01, 0, + AC_VERB_SET_GPIO_DATA, + 1); + } else { + snd_hda_codec_write_cache(codec, 0x01, 0, + AC_VERB_SET_GPIO_DATA, + 0); + } +} + + /* additional initialization for ALC888 variants */ static void alc888_coef_init(struct hda_codec *codec) { @@ -6899,6 +6918,20 @@ static const struct hda_verb alc260_will {} }; +static const struct hda_verb alc260_b1900_verbs[] = { + {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, + {0x0b, AC_VERB_SET_CONNECT_SEL, 0x00}, + {0x0d, AC_VERB_SET_CONNECT_SEL, 0x00}, + {0x0f, AC_VERB_SET_EAPD_BTLENABLE, 0x02}, + {0x1a, AC_VERB_SET_COEF_INDEX, 0x07}, + {0x1a, AC_VERB_SET_PROC_COEF, 0x3040}, + {0x01, AC_VERB_SET_GPIO_MASK, 0x01}, + {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01}, + {0x0f, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, + {} +}; + + static const struct hda_verb alc260_replacer_672v_verbs[] = { {0x0f, AC_VERB_SET_EAPD_BTLENABLE, 0x02}, {0x1a, AC_VERB_SET_COEF_INDEX, 0x07}, @@ -6941,6 +6974,12 @@ static void alc260_replacer_672v_unsol_e alc260_replacer_672v_automute(codec); } +static void alc260_b1900_unsol_event(struct hda_codec *codec, + unsigned int res) +{ + if ((res >> 26) == ALC880_HP_EVENT) + alc260_b1900_automute(codec); +} static const struct hda_verb alc260_hp_dc7600_verbs[] = { {0x05, AC_VERB_SET_CONNECT_SEL, 0x01}, {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, @@ -7431,6 +7470,7 @@ static const char * const alc260_models[ [ALC260_WILL] = "will", [ALC260_REPLACER_672V] = "replacer", [ALC260_FAVORIT100] = "favorit100", + [ALC260_B1900] = "b1900", #ifdef CONFIG_SND_DEBUG [ALC260_TEST] = "test", #endif @@ -7458,6 +7498,7 @@ static const struct snd_pci_quirk alc260 SND_PCI_QUIRK(0x152d, 0x0729, "CTL U553W", ALC260_BASIC), SND_PCI_QUIRK(0x161f, 0x2057, "Replacer 672V", ALC260_REPLACER_672V), SND_PCI_QUIRK(0x1631, 0xc017, "PB V7900", ALC260_WILL), + SND_PCI_QUIRK(0x103c, 0x007f, "HP COMPAQ", ALC260_B1900), {} }; @@ -7570,6 +7611,20 @@ static const struct alc_config_preset al .channel_mode = alc260_modes, .input_mux = &alc260_capture_source, }, + [ALC260_B1900] = { + .mixers = { alc260_will_mixer }, + .init_verbs = { alc260_init_verbs, alc260_b1900_verbs }, + .num_dacs = ARRAY_SIZE(alc260_dac_nids), + .dac_nids = alc260_dac_nids, + .num_adc_nids = ARRAY_SIZE(alc260_adc_nids), + .adc_nids = alc260_adc_nids, + .dig_out_nid = ALC260_DIGOUT_NID, + .num_channel_mode = ARRAY_SIZE(alc260_modes), + .channel_mode = alc260_modes, + .input_mux = &alc260_capture_source, + .unsol_event = alc260_b1900_unsol_event, + .init_hook = alc260_b1900_automute, + }, [ALC260_REPLACER_672V] = { .mixers = { alc260_replacer_672v_mixer }, .init_verbs = { alc260_init_verbs, alc260_replacer_672v_verbs },