diff options
| -rw-r--r-- | include/sound/core.h | 25 | ||||
| -rw-r--r-- | sound/core/misc.c | 28 |
2 files changed, 53 insertions, 0 deletions
diff --git a/include/sound/core.h b/include/sound/core.h index 506aa9f1e20f..3c493ad620d1 100644 --- a/include/sound/core.h +++ b/include/sound/core.h | |||
| @@ -427,4 +427,29 @@ void snd_verbose_printd(const char *file, int line, const char *format, ...) | |||
| 427 | #endif | 427 | #endif |
| 428 | #endif | 428 | #endif |
| 429 | 429 | ||
| 430 | /* PCI quirk list helper */ | ||
| 431 | struct snd_pci_quirk { | ||
| 432 | unsigned short subvendor; /* PCI subvendor ID */ | ||
| 433 | unsigned short subdevice; /* PCI subdevice ID */ | ||
| 434 | int value; /* value */ | ||
| 435 | #ifdef CONFIG_SND_DEBUG_DETECT | ||
| 436 | const char *name; /* name of the device (optional) */ | ||
| 437 | #endif | ||
| 438 | }; | ||
| 439 | |||
| 440 | #define _SND_PCI_QUIRK_ID(vend,dev) \ | ||
| 441 | .subvendor = (vend), .subdevice = (dev) | ||
| 442 | #define SND_PCI_QUIRK_ID(vend,dev) {_SND_PCI_QUIRK_ID(vend, dev)} | ||
| 443 | #ifdef CONFIG_SND_DEBUG_DETECT | ||
| 444 | #define SND_PCI_QUIRK(vend,dev,xname,val) \ | ||
| 445 | {_SND_PCI_QUIRK_ID(vend, dev), .value = (val), .name = (xname)} | ||
| 446 | #else | ||
| 447 | #define SND_PCI_QUIRK(vend,dev,xname,val) \ | ||
| 448 | {_SND_PCI_QUIRK_ID(vend, dev), .value = (val)} | ||
| 449 | #endif | ||
| 450 | |||
| 451 | const struct snd_pci_quirk * | ||
| 452 | snd_pci_quirk_lookup(struct pci_dev *pci, const struct snd_pci_quirk *list); | ||
| 453 | |||
| 454 | |||
| 430 | #endif /* __SOUND_CORE_H */ | 455 | #endif /* __SOUND_CORE_H */ |
diff --git a/sound/core/misc.c b/sound/core/misc.c index 03fc711f4127..6db86a7c9704 100644 --- a/sound/core/misc.c +++ b/sound/core/misc.c | |||
| @@ -78,3 +78,31 @@ void snd_verbose_printd(const char *file, int line, const char *format, ...) | |||
| 78 | 78 | ||
| 79 | EXPORT_SYMBOL(snd_verbose_printd); | 79 | EXPORT_SYMBOL(snd_verbose_printd); |
| 80 | #endif | 80 | #endif |
| 81 | |||
| 82 | #ifdef CONFIG_PCI | ||
| 83 | #include <linux/pci.h> | ||
| 84 | /** | ||
| 85 | * snd_pci_quirk_lookup - look up a PCI SSID quirk list | ||
| 86 | * @pci: pci_dev handle | ||
| 87 | * @list: quirk list, terminated by a null entry | ||
| 88 | * | ||
| 89 | * Look through the given quirk list and finds a matching entry | ||
| 90 | * with the same PCI SSID. When subdevice is 0, all subdevice | ||
| 91 | * values may match. | ||
| 92 | * | ||
| 93 | * Returns the matched entry pointer, or NULL if nothing matched. | ||
| 94 | */ | ||
| 95 | const struct snd_pci_quirk * | ||
| 96 | snd_pci_quirk_lookup(struct pci_dev *pci, const struct snd_pci_quirk *list) | ||
| 97 | { | ||
| 98 | const struct snd_pci_quirk *q; | ||
| 99 | |||
| 100 | for (q = list; q->subvendor; q++) | ||
| 101 | if (q->subvendor == pci->subsystem_vendor && | ||
| 102 | (!q->subdevice || q->subdevice == pci->subsystem_device)) | ||
| 103 | return q; | ||
| 104 | return NULL; | ||
| 105 | } | ||
| 106 | |||
| 107 | EXPORT_SYMBOL(snd_pci_quirk_lookup); | ||
| 108 | #endif | ||
