Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8bd4bb7a authored by Takashi Iwai's avatar Takashi Iwai
Browse files

ALSA: Add subdevice_mask field to quirk entries



Introduced a new field, subdevice_mask, which specifies the bitmask
to match with the given subdevice ID.

Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 18e352e4
Loading
Loading
Loading
Loading
+14 −2
Original line number Original line Diff line number Diff line
@@ -446,21 +446,33 @@ static inline int __snd_bug_on(int cond)
struct snd_pci_quirk {
struct snd_pci_quirk {
	unsigned short subvendor;	/* PCI subvendor ID */
	unsigned short subvendor;	/* PCI subvendor ID */
	unsigned short subdevice;	/* PCI subdevice ID */
	unsigned short subdevice;	/* PCI subdevice ID */
	unsigned short subdevice_mask;	/* bitmask to match */
	int value;			/* value */
	int value;			/* value */
#ifdef CONFIG_SND_DEBUG_VERBOSE
#ifdef CONFIG_SND_DEBUG_VERBOSE
	const char *name;		/* name of the device (optional) */
	const char *name;		/* name of the device (optional) */
#endif
#endif
};
};


#define _SND_PCI_QUIRK_ID_MASK(vend, mask, dev)	\
	.subvendor = (vend), .subdevice = (dev), .subdevice_mask = (mask)
#define _SND_PCI_QUIRK_ID(vend, dev) \
#define _SND_PCI_QUIRK_ID(vend, dev) \
	.subvendor = (vend), .subdevice = (dev)
	_SND_PCI_QUIRK_ID_MASK(vend, 0xffff, dev)
#define SND_PCI_QUIRK_ID(vend,dev) {_SND_PCI_QUIRK_ID(vend, dev)}
#define SND_PCI_QUIRK_ID(vend,dev) {_SND_PCI_QUIRK_ID(vend, dev)}
#ifdef CONFIG_SND_DEBUG_VERBOSE
#ifdef CONFIG_SND_DEBUG_VERBOSE
#define SND_PCI_QUIRK(vend,dev,xname,val) \
#define SND_PCI_QUIRK(vend,dev,xname,val) \
	{_SND_PCI_QUIRK_ID(vend, dev), .value = (val), .name = (xname)}
	{_SND_PCI_QUIRK_ID(vend, dev), .value = (val), .name = (xname)}
#define SND_PCI_QUIRK_VENDOR(vend, xname, val)			\
	{_SND_PCI_QUIRK_ID_MASK(vend, 0, 0), .value = (val), .name = (xname)}
#define SND_PCI_QUIRK_MASK(vend, mask, dev, xname, val)			\
	{_SND_PCI_QUIRK_ID_MASK(vend, mask, dev),			\
			.value = (val), .name = (xname)}
#else
#else
#define SND_PCI_QUIRK(vend,dev,xname,val) \
#define SND_PCI_QUIRK(vend,dev,xname,val) \
	{_SND_PCI_QUIRK_ID(vend, dev), .value = (val)}
	{_SND_PCI_QUIRK_ID(vend, dev), .value = (val)}
#define SND_PCI_QUIRK_MASK(vend, mask, dev, xname, val)			\
	{_SND_PCI_QUIRK_ID_MASK(vend, mask, dev), .value = (val)}
#define SND_PCI_QUIRK_VENDOR(vend, xname, val)			\
	{_SND_PCI_QUIRK_ID_MASK(vend, 0, 0), .value = (val)}
#endif
#endif


const struct snd_pci_quirk *
const struct snd_pci_quirk *
+6 −4
Original line number Original line Diff line number Diff line
@@ -95,12 +95,14 @@ snd_pci_quirk_lookup(struct pci_dev *pci, const struct snd_pci_quirk *list)
{
{
	const struct snd_pci_quirk *q;
	const struct snd_pci_quirk *q;


	for (q = list; q->subvendor; q++)
	for (q = list; q->subvendor; q++) {
		if (q->subvendor == pci->subsystem_vendor &&
		if (q->subvendor != pci->subsystem_vendor)
		    (!q->subdevice || q->subdevice == pci->subsystem_device))
			continue;
		if (!q->subdevice ||
		    (pci->subsystem_device & q->subdevice_mask) == q->subdevice)
			return q;
			return q;
	}
	return NULL;
	return NULL;
}
}

EXPORT_SYMBOL(snd_pci_quirk_lookup);
EXPORT_SYMBOL(snd_pci_quirk_lookup);
#endif
#endif