mirror of
https://github.com/torvalds/linux.git
synced 2024-11-05 19:41:54 +00:00
ALSA: hda - Check pincap while parsing the configuration
Sometimes (or rather often) BIOS sets the pin default configurations obviously wrongly. Looking through these failures, one common pattern is to enable some dead pins that are usually marked as speaker pins. In such a case, we can skip them if the pins don't have the output capability. In this patch, add a check for the valid pin cap bit for each parsed pin, and filter out when it's invalid. The fix was originally suggested by Raymond Yau. Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
ae177c3fd0
commit
52fd5cbc9b
@ -97,6 +97,28 @@ static void reorder_outputs(unsigned int nums, hda_nid_t *pins)
|
||||
}
|
||||
}
|
||||
|
||||
/* check whether the given pin has a proper pin I/O capability bit */
|
||||
static bool check_pincap_validity(struct hda_codec *codec, hda_nid_t pin,
|
||||
unsigned int dev)
|
||||
{
|
||||
unsigned int pincap = snd_hda_query_pin_caps(codec, pin);
|
||||
|
||||
/* some old hardware don't return the proper pincaps */
|
||||
if (!pincap)
|
||||
return true;
|
||||
|
||||
switch (dev) {
|
||||
case AC_JACK_LINE_OUT:
|
||||
case AC_JACK_SPEAKER:
|
||||
case AC_JACK_HP_OUT:
|
||||
case AC_JACK_SPDIF_OUT:
|
||||
case AC_JACK_DIG_OTHER_OUT:
|
||||
return !!(pincap & AC_PINCAP_OUT);
|
||||
default:
|
||||
return !!(pincap & AC_PINCAP_IN);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Parse all pin widgets and store the useful pin nids to cfg
|
||||
*
|
||||
@ -164,6 +186,9 @@ int snd_hda_parse_pin_defcfg(struct hda_codec *codec,
|
||||
dev = AC_JACK_SPEAKER;
|
||||
}
|
||||
|
||||
if (!check_pincap_validity(codec, nid, dev))
|
||||
continue;
|
||||
|
||||
switch (dev) {
|
||||
case AC_JACK_LINE_OUT:
|
||||
seq = get_defcfg_sequence(def_conf);
|
||||
|
Loading…
Reference in New Issue
Block a user