mirror of
https://github.com/team-infusion-developers/android_kernel_samsung_msm8976.git
synced 2024-09-21 20:04:01 +00:00
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: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
27fe48d972
commit
ef940b0403
2 changed files with 7 additions and 4 deletions
|
@ -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)
|
||||||
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;
|
||||||
|
|
Loading…
Reference in a new issue