Commit ef940b04 authored by Takashi Iwai's avatar Takashi Iwai

ALSA: hda - Allow patching with any vendor/subsystem ids

In the ugly real world, there area really broken devices that don't set
codec SSID correctly.  In such a case, the ID can be random, thus the
patching won't work reliably.

For applying the patch forcibly to such a device, the driver will skip
the vendor and/or subsystem ID checks when zero or a negative number is
given in [codec] section.
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 27fe48d9
...@@ -447,7 +447,10 @@ The file needs to have a line `[codec]`. The next line should contain ...@@ -447,7 +447,10 @@ The file needs to have a line `[codec]`. The next line should contain
three numbers indicating the codec vendor-id (0x12345678 in the three numbers indicating the codec vendor-id (0x12345678 in the
example), the codec subsystem-id (0xabcd1234) and the address (2) of example), the codec subsystem-id (0xabcd1234) and the address (2) of
the codec. The rest patch entries are applied to this specified codec the codec. The rest patch entries are applied to this specified codec
until another codec entry is given. until another codec entry is given. Passing 0 or a negative number to
the first or the second value will make the check of the corresponding
field be skipped. It'll be useful for really broken devices that don't
initialize SSID properly.
The `[model]` line allows to change the model name of the each codec. The `[model]` line allows to change the model name of the each codec.
In the example above, it will be changed to model=auto. In the example above, it will be changed to model=auto.
......
...@@ -643,14 +643,14 @@ static inline int strmatch(const char *a, const char *b) ...@@ -643,14 +643,14 @@ static inline int strmatch(const char *a, const char *b)
static void parse_codec_mode(char *buf, struct hda_bus *bus, static void parse_codec_mode(char *buf, struct hda_bus *bus,
struct hda_codec **codecp) struct hda_codec **codecp)
{ {
unsigned int vendorid, subid, caddr; int vendorid, subid, caddr;
struct hda_codec *codec; struct hda_codec *codec;
*codecp = NULL; *codecp = NULL;
if (sscanf(buf, "%i %i %i", &vendorid, &subid, &caddr) == 3) { if (sscanf(buf, "%i %i %i", &vendorid, &subid, &caddr) == 3) {
list_for_each_entry(codec, &bus->codec_list, list) { list_for_each_entry(codec, &bus->codec_list, list) {
if (codec->vendor_id == vendorid && if ((vendorid <= 0 || codec->vendor_id == vendorid) &&
codec->subsystem_id == subid && (subid <= 0 || codec->subsystem_id == subid) &&
codec->addr == caddr) { codec->addr == caddr) {
*codecp = codec; *codecp = codec;
break; break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment