1 From 3f3b7c1aed70fa25c6811f830c5fb1a7054681ae Mon Sep 17 00:00:00 2001
2 From: Takashi Iwai <tiwai@suse.de>
3 Date: Fri, 17 Jul 2009 14:36:59 +0200
4 Subject: ALSA: hda - Fix ALC268 parser for mono speaker
8 - Parse the mono output pin 0x16 correctly even as the primary output
9 - Create "Speaker" volume control if the primary output is a speaker
10 - Fix the wrong direction of (optional) "Mono" switch
12 Signed-off-by: Takashi Iwai <tiwai@suse.de>
15 sound/pci/hda/patch_realtek.c | 62 +++++++++++++++++++++++++++++-------------
16 1 file changed, 43 insertions(+), 19 deletions(-)
18 --- a/sound/pci/hda/patch_realtek.c
19 +++ b/sound/pci/hda/patch_realtek.c
20 @@ -11421,26 +11421,38 @@ static int alc268_new_analog_output(stru
21 const char *ctlname, int idx)
27 sprintf(name, "%s Playback Volume", ctlname);
29 - err = add_control(spec, ALC_CTL_WIDGET_VOL, name,
30 - HDA_COMPOSE_AMP_VAL(0x02, 3, idx,
34 - } else if (nid == 0x15) {
46 + if (spec->multiout.dac_nids[0] != dac &&
47 + spec->multiout.dac_nids[1] != dac) {
48 err = add_control(spec, ALC_CTL_WIDGET_VOL, name,
49 - HDA_COMPOSE_AMP_VAL(0x03, 3, idx,
50 + HDA_COMPOSE_AMP_VAL(dac, 3, idx,
56 + spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
59 sprintf(name, "%s Playback Switch", ctlname);
60 - err = add_control(spec, ALC_CTL_WIDGET_MUTE, name,
62 + err = add_control(spec, ALC_CTL_WIDGET_MUTE, name,
63 HDA_COMPOSE_AMP_VAL(nid, 3, idx, HDA_OUTPUT));
65 + err = add_control(spec, ALC_CTL_WIDGET_MUTE, name,
66 + HDA_COMPOSE_AMP_VAL(nid, 2, idx, HDA_OUTPUT));
70 @@ -11453,14 +11465,19 @@ static int alc268_auto_create_multi_out_
74 - spec->multiout.num_dacs = 2; /* only use one dac */
75 spec->multiout.dac_nids = spec->private_dac_nids;
76 - spec->multiout.dac_nids[0] = 2;
77 - spec->multiout.dac_nids[1] = 3;
79 nid = cfg->line_out_pins[0];
81 - alc268_new_analog_output(spec, nid, "Front", 0);
84 + if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
88 + err = alc268_new_analog_output(spec, nid, name, 0);
93 nid = cfg->speaker_pins[0];
95 @@ -11469,16 +11486,23 @@ static int alc268_auto_create_multi_out_
96 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
100 + err = alc268_new_analog_output(spec, nid, "Speaker", 0);
104 nid = cfg->hp_pins[0];
106 - alc268_new_analog_output(spec, nid, "Headphone", 0);
108 + err = alc268_new_analog_output(spec, nid, "Headphone", 0);
113 nid = cfg->line_out_pins[1] | cfg->line_out_pins[2];
115 err = add_control(spec, ALC_CTL_WIDGET_MUTE,
116 "Mono Playback Switch",
117 - HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_INPUT));
118 + HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT));