[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