aboutsummaryrefslogtreecommitdiffstats
path: root/sound/pci/hda/patch_realtek.c
diff options
context:
space:
mode:
authorIngo Molnar <mingo@elte.hu>2008-09-05 12:56:57 -0400
committerIngo Molnar <mingo@elte.hu>2008-09-05 12:56:57 -0400
commit616ad8c44281c0c6711a72b560e01ec335ff27e0 (patch)
tree0a20453ffedb09db6fb41a0c2208ccc2c7751d3a /sound/pci/hda/patch_realtek.c
parent99809963c99e1ed868d9ebeb4a5e7ee1cbe0309f (diff)
parentb380b0d4f7dffcc235c0facefa537d4655619101 (diff)
Merge branch 'linus' into x86/defconfig
Diffstat (limited to 'sound/pci/hda/patch_realtek.c')
-rw-r--r--sound/pci/hda/patch_realtek.c75
1 files changed, 71 insertions, 4 deletions
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index add4e87e0b20..66025161bd69 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -952,7 +952,7 @@ do_sku:
952 tmp | 0x2010); 952 tmp | 0x2010);
953 break; 953 break;
954 case 0x10ec0888: 954 case 0x10ec0888:
955 alc888_coef_init(codec); 955 /*alc888_coef_init(codec);*/ /* called in alc_init() */
956 break; 956 break;
957 case 0x10ec0267: 957 case 0x10ec0267:
958 case 0x10ec0268: 958 case 0x10ec0268:
@@ -2439,6 +2439,8 @@ static int alc_init(struct hda_codec *codec)
2439 unsigned int i; 2439 unsigned int i;
2440 2440
2441 alc_fix_pll(codec); 2441 alc_fix_pll(codec);
2442 if (codec->vendor_id == 0x10ec0888)
2443 alc888_coef_init(codec);
2442 2444
2443 for (i = 0; i < spec->num_init_verbs; i++) 2445 for (i = 0; i < spec->num_init_verbs; i++)
2444 snd_hda_sequence_write(codec, spec->init_verbs[i]); 2446 snd_hda_sequence_write(codec, spec->init_verbs[i]);
@@ -6195,7 +6197,6 @@ static struct snd_pci_quirk alc882_cfg_tbl[] = {
6195 SND_PCI_QUIRK(0x1043, 0x817f, "Asus P5LD2", ALC882_6ST_DIG), 6197 SND_PCI_QUIRK(0x1043, 0x817f, "Asus P5LD2", ALC882_6ST_DIG),
6196 SND_PCI_QUIRK(0x1043, 0x81d8, "Asus P5WD", ALC882_6ST_DIG), 6198 SND_PCI_QUIRK(0x1043, 0x81d8, "Asus P5WD", ALC882_6ST_DIG),
6197 SND_PCI_QUIRK(0x105b, 0x6668, "Foxconn", ALC882_6ST_DIG), 6199 SND_PCI_QUIRK(0x105b, 0x6668, "Foxconn", ALC882_6ST_DIG),
6198 SND_PCI_QUIRK(0x106b, 0x00a0, "Apple iMac 24''", ALC885_IMAC24),
6199 SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte P35 DS3R", ALC882_6ST_DIG), 6200 SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte P35 DS3R", ALC882_6ST_DIG),
6200 SND_PCI_QUIRK(0x1462, 0x28fb, "Targa T8", ALC882_TARGA), /* MSI-1049 T8 */ 6201 SND_PCI_QUIRK(0x1462, 0x28fb, "Targa T8", ALC882_TARGA), /* MSI-1049 T8 */
6201 SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC882_6ST_DIG), 6202 SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC882_6ST_DIG),
@@ -6437,6 +6438,39 @@ static void alc882_auto_init_analog_input(struct hda_codec *codec)
6437 } 6438 }
6438} 6439}
6439 6440
6441static void alc882_auto_init_input_src(struct hda_codec *codec)
6442{
6443 struct alc_spec *spec = codec->spec;
6444 const struct hda_input_mux *imux = spec->input_mux;
6445 int c;
6446
6447 for (c = 0; c < spec->num_adc_nids; c++) {
6448 hda_nid_t conn_list[HDA_MAX_NUM_INPUTS];
6449 hda_nid_t nid = spec->capsrc_nids[c];
6450 int conns, mute, idx, item;
6451
6452 conns = snd_hda_get_connections(codec, nid, conn_list,
6453 ARRAY_SIZE(conn_list));
6454 if (conns < 0)
6455 continue;
6456 for (idx = 0; idx < conns; idx++) {
6457 /* if the current connection is the selected one,
6458 * unmute it as default - otherwise mute it
6459 */
6460 mute = AMP_IN_MUTE(idx);
6461 for (item = 0; item < imux->num_items; item++) {
6462 if (imux->items[item].index == idx) {
6463 if (spec->cur_mux[c] == item)
6464 mute = AMP_IN_UNMUTE(idx);
6465 break;
6466 }
6467 }
6468 snd_hda_codec_write(codec, nid, 0,
6469 AC_VERB_SET_AMP_GAIN_MUTE, mute);
6470 }
6471 }
6472}
6473
6440/* add mic boosts if needed */ 6474/* add mic boosts if needed */
6441static int alc_auto_add_mic_boost(struct hda_codec *codec) 6475static int alc_auto_add_mic_boost(struct hda_codec *codec)
6442{ 6476{
@@ -6491,6 +6525,7 @@ static void alc882_auto_init(struct hda_codec *codec)
6491 alc882_auto_init_multi_out(codec); 6525 alc882_auto_init_multi_out(codec);
6492 alc882_auto_init_hp_out(codec); 6526 alc882_auto_init_hp_out(codec);
6493 alc882_auto_init_analog_input(codec); 6527 alc882_auto_init_analog_input(codec);
6528 alc882_auto_init_input_src(codec);
6494 if (spec->unsol_event) 6529 if (spec->unsol_event)
6495 alc_sku_automute(codec); 6530 alc_sku_automute(codec);
6496} 6531}
@@ -8285,6 +8320,8 @@ static void alc883_auto_init_analog_input(struct hda_codec *codec)
8285 } 8320 }
8286} 8321}
8287 8322
8323#define alc883_auto_init_input_src alc882_auto_init_input_src
8324
8288/* almost identical with ALC880 parser... */ 8325/* almost identical with ALC880 parser... */
8289static int alc883_parse_auto_config(struct hda_codec *codec) 8326static int alc883_parse_auto_config(struct hda_codec *codec)
8290{ 8327{
@@ -8315,6 +8352,7 @@ static void alc883_auto_init(struct hda_codec *codec)
8315 alc883_auto_init_multi_out(codec); 8352 alc883_auto_init_multi_out(codec);
8316 alc883_auto_init_hp_out(codec); 8353 alc883_auto_init_hp_out(codec);
8317 alc883_auto_init_analog_input(codec); 8354 alc883_auto_init_analog_input(codec);
8355 alc883_auto_init_input_src(codec);
8318 if (spec->unsol_event) 8356 if (spec->unsol_event)
8319 alc_sku_automute(codec); 8357 alc_sku_automute(codec);
8320} 8358}
@@ -8389,8 +8427,6 @@ static int patch_alc883(struct hda_codec *codec)
8389 codec->patch_ops = alc_patch_ops; 8427 codec->patch_ops = alc_patch_ops;
8390 if (board_config == ALC883_AUTO) 8428 if (board_config == ALC883_AUTO)
8391 spec->init_hook = alc883_auto_init; 8429 spec->init_hook = alc883_auto_init;
8392 else if (codec->vendor_id == 0x10ec0888)
8393 spec->init_hook = alc888_coef_init;
8394 8430
8395#ifdef CONFIG_SND_HDA_POWER_SAVE 8431#ifdef CONFIG_SND_HDA_POWER_SAVE
8396 if (!spec->loopback.amplist) 8432 if (!spec->loopback.amplist)
@@ -9663,6 +9699,7 @@ static int alc262_parse_auto_config(struct hda_codec *codec)
9663#define alc262_auto_init_multi_out alc882_auto_init_multi_out 9699#define alc262_auto_init_multi_out alc882_auto_init_multi_out
9664#define alc262_auto_init_hp_out alc882_auto_init_hp_out 9700#define alc262_auto_init_hp_out alc882_auto_init_hp_out
9665#define alc262_auto_init_analog_input alc882_auto_init_analog_input 9701#define alc262_auto_init_analog_input alc882_auto_init_analog_input
9702#define alc262_auto_init_input_src alc882_auto_init_input_src
9666 9703
9667 9704
9668/* init callback for auto-configuration model -- overriding the default init */ 9705/* init callback for auto-configuration model -- overriding the default init */
@@ -9672,6 +9709,7 @@ static void alc262_auto_init(struct hda_codec *codec)
9672 alc262_auto_init_multi_out(codec); 9709 alc262_auto_init_multi_out(codec);
9673 alc262_auto_init_hp_out(codec); 9710 alc262_auto_init_hp_out(codec);
9674 alc262_auto_init_analog_input(codec); 9711 alc262_auto_init_analog_input(codec);
9712 alc262_auto_init_input_src(codec);
9675 if (spec->unsol_event) 9713 if (spec->unsol_event)
9676 alc_sku_automute(codec); 9714 alc_sku_automute(codec);
9677} 9715}
@@ -13330,6 +13368,8 @@ static void alc861vd_auto_init_analog_input(struct hda_codec *codec)
13330 } 13368 }
13331} 13369}
13332 13370
13371#define alc861vd_auto_init_input_src alc882_auto_init_input_src
13372
13333#define alc861vd_idx_to_mixer_vol(nid) ((nid) + 0x02) 13373#define alc861vd_idx_to_mixer_vol(nid) ((nid) + 0x02)
13334#define alc861vd_idx_to_mixer_switch(nid) ((nid) + 0x0c) 13374#define alc861vd_idx_to_mixer_switch(nid) ((nid) + 0x0c)
13335 13375
@@ -13512,6 +13552,7 @@ static void alc861vd_auto_init(struct hda_codec *codec)
13512 alc861vd_auto_init_multi_out(codec); 13552 alc861vd_auto_init_multi_out(codec);
13513 alc861vd_auto_init_hp_out(codec); 13553 alc861vd_auto_init_hp_out(codec);
13514 alc861vd_auto_init_analog_input(codec); 13554 alc861vd_auto_init_analog_input(codec);
13555 alc861vd_auto_init_input_src(codec);
13515 if (spec->unsol_event) 13556 if (spec->unsol_event)
13516 alc_sku_automute(codec); 13557 alc_sku_automute(codec);
13517} 13558}
@@ -14025,6 +14066,13 @@ static struct hda_verb alc662_auto_init_verbs[] = {
14025 { } 14066 { }
14026}; 14067};
14027 14068
14069/* additional verbs for ALC663 */
14070static struct hda_verb alc663_auto_init_verbs[] = {
14071 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14072 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14073 { }
14074};
14075
14028static struct hda_verb alc663_m51va_init_verbs[] = { 14076static struct hda_verb alc663_m51va_init_verbs[] = {
14029 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 14077 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
14030 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 14078 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
@@ -14553,6 +14601,14 @@ static int alc662_auto_create_extra_out(struct alc_spec *spec, hda_nid_t pin,
14553 if (!pin) 14601 if (!pin)
14554 return 0; 14602 return 0;
14555 14603
14604 if (pin == 0x17) {
14605 /* ALC663 has a mono output pin on 0x17 */
14606 sprintf(name, "%s Playback Switch", pfx);
14607 err = add_control(spec, ALC_CTL_WIDGET_MUTE, name,
14608 HDA_COMPOSE_AMP_VAL(pin, 2, 0, HDA_OUTPUT));
14609 return err;
14610 }
14611
14556 if (alc880_is_fixed_pin(pin)) { 14612 if (alc880_is_fixed_pin(pin)) {
14557 nid = alc880_idx_to_dac(alc880_fixed_pin_idx(pin)); 14613 nid = alc880_idx_to_dac(alc880_fixed_pin_idx(pin));
14558 /* printk("DAC nid=%x\n",nid); */ 14614 /* printk("DAC nid=%x\n",nid); */
@@ -14677,6 +14733,8 @@ static void alc662_auto_init_analog_input(struct hda_codec *codec)
14677 } 14733 }
14678} 14734}
14679 14735
14736#define alc662_auto_init_input_src alc882_auto_init_input_src
14737
14680static int alc662_parse_auto_config(struct hda_codec *codec) 14738static int alc662_parse_auto_config(struct hda_codec *codec)
14681{ 14739{
14682 struct alc_spec *spec = codec->spec; 14740 struct alc_spec *spec = codec->spec;
@@ -14721,6 +14779,14 @@ static int alc662_parse_auto_config(struct hda_codec *codec)
14721 spec->input_mux = &spec->private_imux; 14779 spec->input_mux = &spec->private_imux;
14722 14780
14723 spec->init_verbs[spec->num_init_verbs++] = alc662_auto_init_verbs; 14781 spec->init_verbs[spec->num_init_verbs++] = alc662_auto_init_verbs;
14782 if (codec->vendor_id == 0x10ec0663)
14783 spec->init_verbs[spec->num_init_verbs++] =
14784 alc663_auto_init_verbs;
14785
14786 err = alc_auto_add_mic_boost(codec);
14787 if (err < 0)
14788 return err;
14789
14724 spec->mixers[spec->num_mixers] = alc662_capture_mixer; 14790 spec->mixers[spec->num_mixers] = alc662_capture_mixer;
14725 spec->num_mixers++; 14791 spec->num_mixers++;
14726 return 1; 14792 return 1;
@@ -14733,6 +14799,7 @@ static void alc662_auto_init(struct hda_codec *codec)
14733 alc662_auto_init_multi_out(codec); 14799 alc662_auto_init_multi_out(codec);
14734 alc662_auto_init_hp_out(codec); 14800 alc662_auto_init_hp_out(codec);
14735 alc662_auto_init_analog_input(codec); 14801 alc662_auto_init_analog_input(codec);
14802 alc662_auto_init_input_src(codec);
14736 if (spec->unsol_event) 14803 if (spec->unsol_event)
14737 alc_sku_automute(codec); 14804 alc_sku_automute(codec);
14738} 14805}