[alsa-devel] Clevo P170HM / Sager NP8170 audio

Raymond Yau superquad.vortex2 at gmail.com
Fri Nov 25 07:39:56 CET 2011


2011/11/22 Julian Sikorski <belegdol at gmail.com>:
> W dniu 22.11.2011 06:17, Raymond Yau pisze:
>> 2011/11/21 Julian Sikorski <belegdol at gmail.com>:
>>> W dniu 21.11.2011 07:47, Raymond Yau pisze:
>>>> 2011/11/19 Julian Sikorski <belegdol at gmail.com>:
>>>>>>> From the official (non-service) manual, page 309:
>>>>>>>
>>>>>>
>>>>>> Refer to P170HM 's photo in user manual
>>>>>>
>>>>>> There are 3 speakers and a subwoofer at the bottom of the laptop and
>>>>>> two speakers at the top
>>>>>>
>>>>>> Refer to user manual of P150HM,
>>>>>>
>>>>>> Plug the front speaker cables into the Headphone-Out Jack.
>>>>>>
>>>>>> • Line-In Jack = Rear Speaker Out
>>>>>> • Microphone-In Jack = Center/Subwoofer Speaker Out
>>>>>> • S/PDIF-Out Jack = Side Speaker Out (for 7.1 Surround Sound Only)
>>>>
>>>> You may need to ask Takashi , David, PA developers and Media
>>>> controller developers how to handle this case
>>>>
>>>> since it may need to set_pin_ctl to PIN_HP and PIN_OUT of 0x1b and
>>>> retasking of input jacks as output  whether PA or Media controller API
>>>> expect to change the name of the volume control and switch from
>>>> "Headphone" to "Front" by hda-reconfig
>>>>
>>>> http://thread.gmane.org/gmane.linux.alsa.devel/91334
>>>>
>>>>>>
>>>>>> 7. As you plug in each cable a dialog box will pop up (see “Auto Popup
>>>>>> Dialog” on
>>>>>> page 2 - 9).
>>>>>>
>>>>>> Auto Popup Dialog mean support jack detect
>>>>>>
>>>>>> you can try David's hda-jack-sense-test.py
>>>>>>
>>>>>> http://thread.gmane.org/gmane.linux.alsa.devel/85051
>>>>>
>>>>> Yes, it is working:
>>>>> [julas at snowball2 ~]$ sudo python hda-jack-sense-test.py
>>>>> Pin 0x18 (Black Mic): present = No
>>>>> Pin 0x1a (Black Line In): present = No
>>>>> Pin 0x1b (Black HP Out): present = Yes
>>>>> [julas at snowball2 ~]$ sudo python hda-jack-sense-test.py
>>>>> Pin 0x18 (Black Mic): present = No
>>>>> Pin 0x1a (Black Line In): present = No
>>>>> Pin 0x1b (Black HP Out): present = No
>>>>> [julas at snowball2 ~]$ sudo python hda-jack-sense-test.py
>>>>> Pin 0x18 (Black Mic): present = No
>>>>> Pin 0x1a (Black Line In): present = Yes
>>>>> Pin 0x1b (Black HP Out): present = No
>>>>> [julas at snowball2 ~]$ sudo python hda-jack-sense-test.py
>>>>> Pin 0x18 (Black Mic): present = Yes
>>>>> Pin 0x1a (Black Line In): present = No
>>>>> Pin 0x1b (Black HP Out): present = No
>>>>
>>>>>>
>>>>>>
>>>>>> Is Node 0x17 also the side jack of your p150hm ?
>>>>>> pin cap support Detect and Trigger but Misc = NO_PRESENCE
>>>>>
>>>>> Yes, it is between mic and line in jacks, third one from the front. The
>>>>> only difference is that there is red light coming out of it.
>>>>>
>>>>
>>>> you can use hda-verb to set the pin default of 0x17 and use
>>>> hda-jack-sense-test retest the side jack
>>>
>>> Well, it kind of works:
>>> * I was able to assign 0x01011013 to pin 0x17 using user_pin_configs
>>> * it then shows up in hda-jack-sense-test.py, which detects if the jack
>>> is connected
>>> $ sudo python hda-jack-sense-test.py
>>> [sudo] password for julas:
>>> Pin 0x17 (Black Line Out): present = Yes
>>> Pin 0x18 (Black Mic): present = No
>>> Pin 0x1a (Black Line In): present = No
>>> Pin 0x1b (Black HP Out): present = No
>>> * for some reason this program started locking up after showing the
>>> output, I am not sure if this is related.

Don't have any realtek codec, not sure why hda-jack-sense-test.py
locked up when you use user_pin_configs

>>> I then applied your patch on top of Fedora 3.1.1 kernel (crude patch
>>> attached). After reboot:
>>> * hda-jack-sense-test.py was still working, without lockups this time
>>> * alsamixer -c0 revealed a new "Front" slider, which was controlling the
>>> volume on 0x17
>>> * there was still no 8-channel mode (probably related to what you wrote
>>> below)
>>> * there were more options for auto mute (Disabled, Speaker Only, Line
>>> Out+Speaker)
>>> * here is the new alsa-info.sh:
>>> http://www.alsa-project.org/db/?f=923b75ad3997dc8f5878852e327f9b999a196052
>>>
>>
>>
>>>>
>>>> To add the missing pin default of side jack 0x17
>>>>
>>>>       ALC662_FIXUP_ASUS_MODE8,
>>>> +     ALC892_FIXUP_CLEVO_4ST_8CH,
>>>> };
>>>>
>>>> static const struct alc_fixup alc662_fixups[] = {
>>>>
>>>>
>>>> +     [ALC892_FIXUP_CLEVO_4ST_8CH] = {
>>>> +             .type = ALC_FIXUP_PINS,
>>>> +             .v.pins = (const struct alc_pincfg[]) {
>>>> +/*
>>>> +  need to be same location as the other jack
>>>> +  may need to change the default association and sequence since
>>>> +  Lower Default Association values would be higher in priority for resources
>>>> +  such as processing nodes or Input and Output Converters.
>>>> +  A value of 0000b is reserved and should not be used
>>>> +*/
>>>> +                     { 0x17, 0x01011013 }, /* Side */
>>>> +                     { }
>>>> +             },
>>>> +     },
>>>>
>>>>
>>>> +     SND_PCI_QUIRK(0x1558, 0x5102, "Clevo P150HM", ALC892_FIXUP_CLEVO_4ST_8CH),
>>>> +     SND_PCI_QUIRK(0x1558, 0x7100, "Clevo P170HM", ALC892_FIXUP_CLEVO_4ST_8CH),
>>>>
>>>> SImilar case are those notebooks  hda-emu/codecs/alc1200-msi-gx620
>>>> which has 1 hp(green), 1 line-in(blue), 1 ext-mic(pink) and 1 line
>>>> out(grey) at same location (ext rear)   for surround71 (and also 1
>>>> speakers, 1 int mic)
>>>>
>>>>
>>>> hda_codec: ALC1200: BIOS auto-probing.
>>>> hda_codec: ALC1200: SKU not ready 0x598301f0
>>>> autoconfig: line_outs=1 (0x17/0x0/0x0/0x0/0x0) type:line
>>>>    speaker_outs=1 (0x1b/0x0/0x0/0x0/0x0)
>>>>    hp_outs=1 (0x14/0x0/0x0/0x0/0x0)
>>>>    mono: mono_out=0x0
>>>>    dig-out=0x1e/0x0
>>>>    inputs: Mic=0x18 Internal Mic=0x19 Line=0x1a
>>>>
>>>>
>>>> CTRL: add: Line-Out Jack:0
>>>> CTRL: add: Headphone Jack:0
>>>> CTRL: add: Mic Jack:0
>>>> CTRL: add: Line Jack:0
>>>>
>>>>> get 1
>>>> 1 Channel Mode:0
>>>> ITEM: 0:2ch, 1:4ch, 2:6ch, VAL: [2ch]
>>>>

After the pin fixup, your notebook is almost like alc1200 msi gx460
except speaker and hp are swapped, this mean that those volume
controls and switches are similar to targa_mixer , targa_8ch_mixer of
model="targa-8ch-dig"

>>>>
>>>> This mean that when switch to 6/8 channel mode, it will conflict with
>>>> automic detection since the pin cap alc892 's mic jack does not
>>>> support impedance sense and the driver does not know the plug is mic
>>>> or speaker by measuring the impedance
>>>>
>>>> The driver have to disable automic detection when user switch "channel
>>>> mode" to 6ch/8ch as the user should still able to use the internal mic
>>>> when the external mic jack is retasked as output
>>>>

The are some difference between p170hm and your p150hm if p170hm has
5.1 speakers which still can have auto mic detection enabled.


you can add the following code in alc_auto_ch_mode_put() for debugging
and need to switch "auto mute mode" to "speaker" for 8 channels


	if (spec->need_dac_fix && !spec->const_channel_count)
		spec->multiout.num_dacs = spec->multiout.max_channels / 2;

+	printk(KERN_INFO "ch = %d\n",ch);
+	printk(KERN_INFO "max channel %d\n",spec->multiout.max_channels);
+	for (i=0; i<spec->autocfg.hp_outs; i++)
+		printk(KERN_INFO "hp dac(%d) %x pin %x\n", i,
spec->multiout.hp_out_nid[i], spec->autocfg.hp_pins[i]);
+	for (i=0; i<spec->multiout.num_dacs; i++)
+		printk(KERN_INFO "private_dac(%d) %x\n", i, spec->private_dac_nids[i]);
+	for (i=0; i<spec->autocfg.line_outs; i++)
+		printk(KERN_INFO "line_out(%d) pin %x\n", i, spec->autocfg.line_out_pins[i]);
+	for (i=0; i<spec->multiout.num_dacs-1; i++)
+		printk(KERN_INFO "multi_io(%d) dac %x pin %x\n", i,
spec->multi_io[i].dac, spec->multi_io[i].pin);
+	for (i=0; i<spec->autocfg.speaker_outs; i++)
+		printk(KERN_INFO "extra_out(%d) dac %x pin %x\n", i,
spec->multiout.extra_out_nid[i], spec->autocfg.speaker_pins[i]);
               return 1

Try the following code  which try to assign dac 02, 03, 04, and 05 to
spec->private_dac front, surround, clfe and side.

static int alc_auto_fill_dac_nids(struct hda_codec *codec)
{
...
 again:
	/* set num_dacs once to full for alc_auto_look_for_dac() */
	spec->multiout.num_dacs = cfg->line_outs;
	spec->multiout.hp_out_nid[0] = 0;
	spec->multiout.extra_out_nid[0] = 0;
	memset(spec->private_dac_nids, 0, sizeof(spec->private_dac_nids));
	spec->multiout.dac_nids = spec->private_dac_nids;

+	if (cfg->hp_outs == 1 && cfg->line_outs == 1 &&
+		cfg->num_inputs >= 3 && cfg->speaker_outs >= 1) {
+/* assign 0x02 as Front DAC by using speaker or hp pins*/
+		spec->private_dac_nids[0]  = alc_auto_look_for_dac(codec,
cfg->speaker_pins[0]);
+/* hp , mic and line-in at the same location
+   use alc_auto_fill_multi_ios() to assign surround and clfe dacs
+*/
+		defcfg = snd_hda_codec_get_pincfg(codec, cfg->hp_pins[0]);
+		location = get_defcfg_location(defcfg);
+		spec->multiout.num_dacs = 1;
+		num_pins = alc_auto_fill_multi_ios(codec, location, 1);
+		if (num_pins > 0) {
+			spec->multi_ios = num_pins;
+			spec->ext_channel_count = 2;
+			spec->multiout.num_dacs = num_pins + 1;
+		}
+/* an ugly hack to add side as multi io even side does not support input
+   set pin ctl to PIN_OUT to set multi_io[2].ctl_in to PIN_OUT */
+		if (location == get_defcfg_location(snd_hda_codec_get_pincfg(codec,
cfg->line_out_pins[0]))) {
+			spec->private_dac_nids[3] = alc_auto_look_for_dac(codec,
cfg->line_out_pins[0]);
+			spec->multi_io[2].dac = spec->private_dac_nids[3];
+			spec->multi_io[2].pin = cfg->line_out_pins[0];
+			snd_hda_codec_write(codec, cfg->line_out_pins[0], 0,
				AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
+			spec->multi_ios++;
+			spec->multiout.num_dacs++;
+		}
+		return 0;
+	}


More information about the Alsa-devel mailing list