aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2006-11-24 09:34:06 -0500
committerJaroslav Kysela <perex@suse.cz>2007-02-09 03:01:48 -0500
commitd9ea472c743ccd7344055cb118bc210befbd8007 (patch)
tree144815385e7c37c36ac79e5235919828120a64e7
parent048b945077bdc7e8dff5d5810ff2a0ced3590ca9 (diff)
[ALSA] Add PCI quirk list helper function
Added a helper function snd_pci_quirk_lookup() to look up PCI SSID quirk list. Signed-off-by: Takashi Iwai <tiwai@suse.de> Signed-off-by: Jaroslav Kysela <perex@suse.cz>
-rw-r--r--include/sound/core.h25
-rw-r--r--sound/core/misc.c28
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 */
431struct 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
451const struct snd_pci_quirk *
452snd_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
79EXPORT_SYMBOL(snd_verbose_printd); 79EXPORT_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 */
95const struct snd_pci_quirk *
96snd_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
107EXPORT_SYMBOL(snd_pci_quirk_lookup);
108#endif