[ALSA] maestro3 - Use quirk list helper function
Clean up maestro3 amp and GPIO quirks using snd_pci_quirk_lookup(). Signed-off-by: Takashi Iwai <tiwai@suse.de> Signed-off-by: Jaroslav Kysela <perex@suse.cz>
This commit is contained in:
parent
e2b6d13be4
commit
1061eeb444
1 changed files with 127 additions and 167 deletions
|
@ -770,21 +770,6 @@ MODULE_PARM_DESC(amp_gpio, "GPIO pin number for external amp. (default = -1)");
|
||||||
/*
|
/*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* quirk lists */
|
|
||||||
struct m3_quirk {
|
|
||||||
const char *name; /* device name */
|
|
||||||
u16 vendor, device; /* subsystem ids */
|
|
||||||
int amp_gpio; /* gpio pin # for external amp, -1 = default */
|
|
||||||
int irda_workaround; /* non-zero if avoid to touch 0x10 on GPIO_DIRECTION
|
|
||||||
(e.g. for IrDA on Dell Inspirons) */
|
|
||||||
};
|
|
||||||
|
|
||||||
struct m3_hv_quirk {
|
|
||||||
u16 vendor, device, subsystem_vendor, subsystem_device;
|
|
||||||
u32 config; /* ALLEGRO_CONFIG hardware volume bits */
|
|
||||||
int is_omnibook; /* Do HP OmniBook GPIO magic? */
|
|
||||||
};
|
|
||||||
|
|
||||||
struct m3_list {
|
struct m3_list {
|
||||||
int curlen;
|
int curlen;
|
||||||
int mem_addr;
|
int mem_addr;
|
||||||
|
@ -832,8 +817,6 @@ struct snd_m3 {
|
||||||
struct snd_pcm *pcm;
|
struct snd_pcm *pcm;
|
||||||
|
|
||||||
struct pci_dev *pci;
|
struct pci_dev *pci;
|
||||||
const struct m3_quirk *quirk;
|
|
||||||
const struct m3_hv_quirk *hv_quirk;
|
|
||||||
|
|
||||||
int dacs_active;
|
int dacs_active;
|
||||||
int timer_users;
|
int timer_users;
|
||||||
|
@ -847,7 +830,11 @@ struct snd_m3 {
|
||||||
u8 reset_state;
|
u8 reset_state;
|
||||||
|
|
||||||
int external_amp;
|
int external_amp;
|
||||||
int amp_gpio;
|
int amp_gpio; /* gpio pin # for external amp, -1 = default */
|
||||||
|
unsigned int hv_config; /* hardware-volume config bits */
|
||||||
|
unsigned irda_workaround :1; /* avoid to touch 0x10 on GPIO_DIRECTION
|
||||||
|
(e.g. for IrDA on Dell Inspirons) */
|
||||||
|
unsigned is_omnibook :1; /* Do HP OmniBook GPIO magic? */
|
||||||
|
|
||||||
/* midi */
|
/* midi */
|
||||||
struct snd_rawmidi *rmidi;
|
struct snd_rawmidi *rmidi;
|
||||||
|
@ -896,127 +883,104 @@ static struct pci_device_id snd_m3_ids[] = {
|
||||||
|
|
||||||
MODULE_DEVICE_TABLE(pci, snd_m3_ids);
|
MODULE_DEVICE_TABLE(pci, snd_m3_ids);
|
||||||
|
|
||||||
static const struct m3_quirk m3_quirk_list[] = {
|
static struct snd_pci_quirk m3_amp_quirk_list[] __devinitdata = {
|
||||||
/* panasonic CF-28 "toughbook" */
|
SND_PCI_QUIRK(0x10f7, 0x833e, "Panasonic CF-28", 0x0d),
|
||||||
{
|
SND_PCI_QUIRK(0x10f7, 0x833d, "Panasonic CF-72", 0x0d),
|
||||||
.name = "Panasonic CF-28",
|
SND_PCI_QUIRK(0x1033, 0x80f1, "NEC LM800J/7", 0x03),
|
||||||
.vendor = 0x10f7,
|
SND_PCI_QUIRK(0x1509, 0x1740, "LEGEND ZhaoYang 3100CF", 0x03),
|
||||||
.device = 0x833e,
|
{ } /* END */
|
||||||
.amp_gpio = 0x0d,
|
|
||||||
},
|
|
||||||
/* panasonic CF-72 "toughbook" */
|
|
||||||
{
|
|
||||||
.name = "Panasonic CF-72",
|
|
||||||
.vendor = 0x10f7,
|
|
||||||
.device = 0x833d,
|
|
||||||
.amp_gpio = 0x0d,
|
|
||||||
},
|
|
||||||
/* Dell Inspiron 4000 */
|
|
||||||
{
|
|
||||||
.name = "Dell Inspiron 4000",
|
|
||||||
.vendor = 0x1028,
|
|
||||||
.device = 0x00b0,
|
|
||||||
.amp_gpio = -1,
|
|
||||||
.irda_workaround = 1,
|
|
||||||
},
|
|
||||||
/* Dell Inspiron 8000 */
|
|
||||||
{
|
|
||||||
.name = "Dell Inspiron 8000",
|
|
||||||
.vendor = 0x1028,
|
|
||||||
.device = 0x00a4,
|
|
||||||
.amp_gpio = -1,
|
|
||||||
.irda_workaround = 1,
|
|
||||||
},
|
|
||||||
/* Dell Inspiron 8100 */
|
|
||||||
{
|
|
||||||
.name = "Dell Inspiron 8100",
|
|
||||||
.vendor = 0x1028,
|
|
||||||
.device = 0x00e6,
|
|
||||||
.amp_gpio = -1,
|
|
||||||
.irda_workaround = 1,
|
|
||||||
},
|
|
||||||
/* NEC LM800J/7 */
|
|
||||||
{
|
|
||||||
.name = "NEC LM800J/7",
|
|
||||||
.vendor = 0x1033,
|
|
||||||
.device = 0x80f1,
|
|
||||||
.amp_gpio = 0x03,
|
|
||||||
},
|
|
||||||
/* LEGEND ZhaoYang 3100CF */
|
|
||||||
{
|
|
||||||
.name = "LEGEND ZhaoYang 3100CF",
|
|
||||||
.vendor = 0x1509,
|
|
||||||
.device = 0x1740,
|
|
||||||
.amp_gpio = 0x03,
|
|
||||||
},
|
|
||||||
/* END */
|
|
||||||
{ NULL }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* These values came from the Windows driver. */
|
static struct snd_pci_quirk m3_irda_quirk_list[] __devinitdata = {
|
||||||
static const struct m3_hv_quirk m3_hv_quirk_list[] = {
|
SND_PCI_QUIRK(0x1028, 0x00b0, "Dell Inspiron 4000", 1),
|
||||||
|
SND_PCI_QUIRK(0x1028, 0x00a4, "Dell Inspiron 8000", 1),
|
||||||
|
SND_PCI_QUIRK(0x1028, 0x00e6, "Dell Inspiron 8100", 1),
|
||||||
|
{ } /* END */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* hardware volume quirks */
|
||||||
|
static struct snd_pci_quirk m3_hv_quirk_list[] __devinitdata = {
|
||||||
/* Allegro chips */
|
/* Allegro chips */
|
||||||
{ 0x125D, 0x1988, 0x0E11, 0x002E, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD, 0 },
|
SND_PCI_QUIRK(0x0E11, 0x002E, NULL, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD),
|
||||||
{ 0x125D, 0x1988, 0x0E11, 0x0094, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD, 0 },
|
SND_PCI_QUIRK(0x0E11, 0x0094, NULL, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD),
|
||||||
{ 0x125D, 0x1988, 0x0E11, 0xB112, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD, 0 },
|
SND_PCI_QUIRK(0x0E11, 0xB112, NULL, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD),
|
||||||
{ 0x125D, 0x1988, 0x0E11, 0xB114, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD, 0 },
|
SND_PCI_QUIRK(0x0E11, 0xB114, NULL, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD),
|
||||||
{ 0x125D, 0x1988, 0x103C, 0x0012, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD, 0 },
|
SND_PCI_QUIRK(0x103C, 0x0012, NULL, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD),
|
||||||
{ 0x125D, 0x1988, 0x103C, 0x0018, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD, 0 },
|
SND_PCI_QUIRK(0x103C, 0x0018, NULL, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD),
|
||||||
{ 0x125D, 0x1988, 0x103C, 0x001C, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD, 0 },
|
SND_PCI_QUIRK(0x103C, 0x001C, NULL, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD),
|
||||||
{ 0x125D, 0x1988, 0x103C, 0x001D, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD, 0 },
|
SND_PCI_QUIRK(0x103C, 0x001D, NULL, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD),
|
||||||
{ 0x125D, 0x1988, 0x103C, 0x001E, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD, 0 },
|
SND_PCI_QUIRK(0x103C, 0x001E, NULL, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD),
|
||||||
{ 0x125D, 0x1988, 0x107B, 0x3350, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD, 0 },
|
SND_PCI_QUIRK(0x107B, 0x3350, NULL, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD),
|
||||||
{ 0x125D, 0x1988, 0x10F7, 0x8338, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD, 0 },
|
SND_PCI_QUIRK(0x10F7, 0x8338, NULL, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD),
|
||||||
{ 0x125D, 0x1988, 0x10F7, 0x833C, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD, 0 },
|
SND_PCI_QUIRK(0x10F7, 0x833C, NULL, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD),
|
||||||
{ 0x125D, 0x1988, 0x10F7, 0x833D, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD, 0 },
|
SND_PCI_QUIRK(0x10F7, 0x833D, NULL, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD),
|
||||||
{ 0x125D, 0x1988, 0x10F7, 0x833E, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD, 0 },
|
SND_PCI_QUIRK(0x10F7, 0x833E, NULL, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD),
|
||||||
{ 0x125D, 0x1988, 0x10F7, 0x833F, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD, 0 },
|
SND_PCI_QUIRK(0x10F7, 0x833F, NULL, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD),
|
||||||
{ 0x125D, 0x1988, 0x13BD, 0x1018, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD, 0 },
|
SND_PCI_QUIRK(0x13BD, 0x1018, NULL, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD),
|
||||||
{ 0x125D, 0x1988, 0x13BD, 0x1019, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD, 0 },
|
SND_PCI_QUIRK(0x13BD, 0x1019, NULL, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD),
|
||||||
{ 0x125D, 0x1988, 0x13BD, 0x101A, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD, 0 },
|
SND_PCI_QUIRK(0x13BD, 0x101A, NULL, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD),
|
||||||
{ 0x125D, 0x1988, 0x14FF, 0x0F03, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD, 0 },
|
SND_PCI_QUIRK(0x14FF, 0x0F03, NULL, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD),
|
||||||
{ 0x125D, 0x1988, 0x14FF, 0x0F04, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD, 0 },
|
SND_PCI_QUIRK(0x14FF, 0x0F04, NULL, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD),
|
||||||
{ 0x125D, 0x1988, 0x14FF, 0x0F05, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD, 0 },
|
SND_PCI_QUIRK(0x14FF, 0x0F05, NULL, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD),
|
||||||
{ 0x125D, 0x1988, 0x156D, 0xB400, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD, 0 },
|
SND_PCI_QUIRK(0x156D, 0xB400, NULL, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD),
|
||||||
{ 0x125D, 0x1988, 0x156D, 0xB795, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD, 0 },
|
SND_PCI_QUIRK(0x156D, 0xB795, NULL, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD),
|
||||||
{ 0x125D, 0x1988, 0x156D, 0xB797, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD, 0 },
|
SND_PCI_QUIRK(0x156D, 0xB797, NULL, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD),
|
||||||
{ 0x125D, 0x1988, 0x156D, 0xC700, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD, 0 },
|
SND_PCI_QUIRK(0x156D, 0xC700, NULL, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD),
|
||||||
{ 0x125D, 0x1988, 0x1033, 0x80F1, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD | REDUCED_DEBOUNCE, 0 },
|
SND_PCI_QUIRK(0x1033, 0x80F1, NULL,
|
||||||
{ 0x125D, 0x1988, 0x103C, 0x001A, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD | REDUCED_DEBOUNCE, 0 }, /* HP OmniBook 6100 */
|
HV_CTRL_ENABLE | HV_BUTTON_FROM_GD | REDUCED_DEBOUNCE),
|
||||||
{ 0x125D, 0x1988, 0x107B, 0x340A, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD | REDUCED_DEBOUNCE, 0 },
|
SND_PCI_QUIRK(0x103C, 0x001A, NULL, /* HP OmniBook 6100 */
|
||||||
{ 0x125D, 0x1988, 0x107B, 0x3450, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD | REDUCED_DEBOUNCE, 0 },
|
HV_CTRL_ENABLE | HV_BUTTON_FROM_GD | REDUCED_DEBOUNCE),
|
||||||
{ 0x125D, 0x1988, 0x109F, 0x3134, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD | REDUCED_DEBOUNCE, 0 },
|
SND_PCI_QUIRK(0x107B, 0x340A, NULL,
|
||||||
{ 0x125D, 0x1988, 0x109F, 0x3161, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD | REDUCED_DEBOUNCE, 0 },
|
HV_CTRL_ENABLE | HV_BUTTON_FROM_GD | REDUCED_DEBOUNCE),
|
||||||
{ 0x125D, 0x1988, 0x144D, 0x3280, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD | REDUCED_DEBOUNCE, 0 },
|
SND_PCI_QUIRK(0x107B, 0x3450, NULL,
|
||||||
{ 0x125D, 0x1988, 0x144D, 0x3281, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD | REDUCED_DEBOUNCE, 0 },
|
HV_CTRL_ENABLE | HV_BUTTON_FROM_GD | REDUCED_DEBOUNCE),
|
||||||
{ 0x125D, 0x1988, 0x144D, 0xC002, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD | REDUCED_DEBOUNCE, 0 },
|
SND_PCI_QUIRK(0x109F, 0x3134, NULL,
|
||||||
{ 0x125D, 0x1988, 0x144D, 0xC003, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD | REDUCED_DEBOUNCE, 0 },
|
HV_CTRL_ENABLE | HV_BUTTON_FROM_GD | REDUCED_DEBOUNCE),
|
||||||
{ 0x125D, 0x1988, 0x1509, 0x1740, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD | REDUCED_DEBOUNCE, 0 },
|
SND_PCI_QUIRK(0x109F, 0x3161, NULL,
|
||||||
{ 0x125D, 0x1988, 0x1610, 0x0010, HV_CTRL_ENABLE | HV_BUTTON_FROM_GD | REDUCED_DEBOUNCE, 0 },
|
HV_CTRL_ENABLE | HV_BUTTON_FROM_GD | REDUCED_DEBOUNCE),
|
||||||
{ 0x125D, 0x1988, 0x1042, 0x1042, HV_CTRL_ENABLE, 0 },
|
SND_PCI_QUIRK(0x144D, 0x3280, NULL,
|
||||||
{ 0x125D, 0x1988, 0x107B, 0x9500, HV_CTRL_ENABLE, 0 },
|
HV_CTRL_ENABLE | HV_BUTTON_FROM_GD | REDUCED_DEBOUNCE),
|
||||||
{ 0x125D, 0x1988, 0x14FF, 0x0F06, HV_CTRL_ENABLE, 0 },
|
SND_PCI_QUIRK(0x144D, 0x3281, NULL,
|
||||||
{ 0x125D, 0x1988, 0x1558, 0x8586, HV_CTRL_ENABLE, 0 },
|
HV_CTRL_ENABLE | HV_BUTTON_FROM_GD | REDUCED_DEBOUNCE),
|
||||||
{ 0x125D, 0x1988, 0x161F, 0x2011, HV_CTRL_ENABLE, 0 },
|
SND_PCI_QUIRK(0x144D, 0xC002, NULL,
|
||||||
|
HV_CTRL_ENABLE | HV_BUTTON_FROM_GD | REDUCED_DEBOUNCE),
|
||||||
|
SND_PCI_QUIRK(0x144D, 0xC003, NULL,
|
||||||
|
HV_CTRL_ENABLE | HV_BUTTON_FROM_GD | REDUCED_DEBOUNCE),
|
||||||
|
SND_PCI_QUIRK(0x1509, 0x1740, NULL,
|
||||||
|
HV_CTRL_ENABLE | HV_BUTTON_FROM_GD | REDUCED_DEBOUNCE),
|
||||||
|
SND_PCI_QUIRK(0x1610, 0x0010, NULL,
|
||||||
|
HV_CTRL_ENABLE | HV_BUTTON_FROM_GD | REDUCED_DEBOUNCE),
|
||||||
|
SND_PCI_QUIRK(0x1042, 0x1042, NULL, HV_CTRL_ENABLE),
|
||||||
|
SND_PCI_QUIRK(0x107B, 0x9500, NULL, HV_CTRL_ENABLE),
|
||||||
|
SND_PCI_QUIRK(0x14FF, 0x0F06, NULL, HV_CTRL_ENABLE),
|
||||||
|
SND_PCI_QUIRK(0x1558, 0x8586, NULL, HV_CTRL_ENABLE),
|
||||||
|
SND_PCI_QUIRK(0x161F, 0x2011, NULL, HV_CTRL_ENABLE),
|
||||||
/* Maestro3 chips */
|
/* Maestro3 chips */
|
||||||
{ 0x125D, 0x1998, 0x103C, 0x000E, HV_CTRL_ENABLE, 0 },
|
SND_PCI_QUIRK(0x103C, 0x000E, NULL, HV_CTRL_ENABLE),
|
||||||
{ 0x125D, 0x1998, 0x103C, 0x0010, HV_CTRL_ENABLE, 1 }, /* HP OmniBook 6000 */
|
SND_PCI_QUIRK(0x103C, 0x0010, NULL, HV_CTRL_ENABLE),
|
||||||
{ 0x125D, 0x1998, 0x103C, 0x0011, HV_CTRL_ENABLE, 1 }, /* HP OmniBook 500 */
|
SND_PCI_QUIRK(0x103C, 0x0011, NULL, HV_CTRL_ENABLE),
|
||||||
{ 0x125D, 0x1998, 0x103C, 0x001B, HV_CTRL_ENABLE, 0 },
|
SND_PCI_QUIRK(0x103C, 0x001B, NULL, HV_CTRL_ENABLE),
|
||||||
{ 0x125D, 0x1998, 0x104D, 0x80A6, HV_CTRL_ENABLE, 0 },
|
SND_PCI_QUIRK(0x104D, 0x80A6, NULL, HV_CTRL_ENABLE),
|
||||||
{ 0x125D, 0x1998, 0x104D, 0x80AA, HV_CTRL_ENABLE, 0 },
|
SND_PCI_QUIRK(0x104D, 0x80AA, NULL, HV_CTRL_ENABLE),
|
||||||
{ 0x125D, 0x1998, 0x107B, 0x5300, HV_CTRL_ENABLE, 0 },
|
SND_PCI_QUIRK(0x107B, 0x5300, NULL, HV_CTRL_ENABLE),
|
||||||
{ 0x125D, 0x1998, 0x110A, 0x1998, HV_CTRL_ENABLE, 0 },
|
SND_PCI_QUIRK(0x110A, 0x1998, NULL, HV_CTRL_ENABLE),
|
||||||
{ 0x125D, 0x1998, 0x13BD, 0x1015, HV_CTRL_ENABLE, 0 },
|
SND_PCI_QUIRK(0x13BD, 0x1015, NULL, HV_CTRL_ENABLE),
|
||||||
{ 0x125D, 0x1998, 0x13BD, 0x101C, HV_CTRL_ENABLE, 0 },
|
SND_PCI_QUIRK(0x13BD, 0x101C, NULL, HV_CTRL_ENABLE),
|
||||||
{ 0x125D, 0x1998, 0x13BD, 0x1802, HV_CTRL_ENABLE, 0 },
|
SND_PCI_QUIRK(0x13BD, 0x1802, NULL, HV_CTRL_ENABLE),
|
||||||
{ 0x125D, 0x1998, 0x1599, 0x0715, HV_CTRL_ENABLE, 0 },
|
SND_PCI_QUIRK(0x1599, 0x0715, NULL, HV_CTRL_ENABLE),
|
||||||
{ 0x125D, 0x1998, 0x5643, 0x5643, HV_CTRL_ENABLE, 0 },
|
SND_PCI_QUIRK(0x5643, 0x5643, NULL, HV_CTRL_ENABLE),
|
||||||
{ 0x125D, 0x199A, 0x144D, 0x3260, HV_CTRL_ENABLE | REDUCED_DEBOUNCE, 0 },
|
SND_PCI_QUIRK(0x144D, 0x3260, NULL, HV_CTRL_ENABLE | REDUCED_DEBOUNCE),
|
||||||
{ 0x125D, 0x199A, 0x144D, 0x3261, HV_CTRL_ENABLE | REDUCED_DEBOUNCE, 0 },
|
SND_PCI_QUIRK(0x144D, 0x3261, NULL, HV_CTRL_ENABLE | REDUCED_DEBOUNCE),
|
||||||
{ 0x125D, 0x199A, 0x144D, 0xC000, HV_CTRL_ENABLE | REDUCED_DEBOUNCE, 0 },
|
SND_PCI_QUIRK(0x144D, 0xC000, NULL, HV_CTRL_ENABLE | REDUCED_DEBOUNCE),
|
||||||
{ 0x125D, 0x199A, 0x144D, 0xC001, HV_CTRL_ENABLE | REDUCED_DEBOUNCE, 0 },
|
SND_PCI_QUIRK(0x144D, 0xC001, NULL, HV_CTRL_ENABLE | REDUCED_DEBOUNCE),
|
||||||
{ 0 }
|
{ } /* END */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* HP Omnibook quirks */
|
||||||
|
static struct snd_pci_quirk m3_omnibook_quirk_list[] __devinitdata = {
|
||||||
|
SND_PCI_QUIRK_ID(0x103c, 0x0010), /* HP OmniBook 6000 */
|
||||||
|
SND_PCI_QUIRK_ID(0x103c, 0x0011), /* HP OmniBook 500 */
|
||||||
|
{ } /* END */
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -2055,7 +2019,7 @@ static void snd_m3_ac97_reset(struct snd_m3 *chip)
|
||||||
|
|
||||||
for (i = 0; i < 5; i++) {
|
for (i = 0; i < 5; i++) {
|
||||||
dir = inw(io + GPIO_DIRECTION);
|
dir = inw(io + GPIO_DIRECTION);
|
||||||
if (! chip->quirk || ! chip->quirk->irda_workaround)
|
if (!chip->irda_workaround)
|
||||||
dir |= 0x10; /* assuming pci bus master? */
|
dir |= 0x10; /* assuming pci bus master? */
|
||||||
|
|
||||||
snd_m3_remote_codec_config(io, 0);
|
snd_m3_remote_codec_config(io, 0);
|
||||||
|
@ -2478,7 +2442,7 @@ snd_m3_chip_init(struct snd_m3 *chip)
|
||||||
DISABLE_LEGACY);
|
DISABLE_LEGACY);
|
||||||
pci_write_config_word(pcidev, PCI_LEGACY_AUDIO_CTRL, w);
|
pci_write_config_word(pcidev, PCI_LEGACY_AUDIO_CTRL, w);
|
||||||
|
|
||||||
if (chip->hv_quirk && chip->hv_quirk->is_omnibook) {
|
if (chip->is_omnibook) {
|
||||||
/*
|
/*
|
||||||
* Volume buttons on some HP OmniBook laptops don't work
|
* Volume buttons on some HP OmniBook laptops don't work
|
||||||
* correctly. This makes them work for the most part.
|
* correctly. This makes them work for the most part.
|
||||||
|
@ -2495,8 +2459,7 @@ snd_m3_chip_init(struct snd_m3 *chip)
|
||||||
}
|
}
|
||||||
pci_read_config_dword(pcidev, PCI_ALLEGRO_CONFIG, &n);
|
pci_read_config_dword(pcidev, PCI_ALLEGRO_CONFIG, &n);
|
||||||
n &= ~(HV_CTRL_ENABLE | REDUCED_DEBOUNCE | HV_BUTTON_FROM_GD);
|
n &= ~(HV_CTRL_ENABLE | REDUCED_DEBOUNCE | HV_BUTTON_FROM_GD);
|
||||||
if (chip->hv_quirk)
|
n |= chip->hv_config;
|
||||||
n |= chip->hv_quirk->config;
|
|
||||||
/* For some reason we must always use reduced debounce. */
|
/* For some reason we must always use reduced debounce. */
|
||||||
n |= REDUCED_DEBOUNCE;
|
n |= REDUCED_DEBOUNCE;
|
||||||
n |= PM_CTRL_ENABLE | CLK_DIV_BY_49 | USE_PCI_TIMING;
|
n |= PM_CTRL_ENABLE | CLK_DIV_BY_49 | USE_PCI_TIMING;
|
||||||
|
@ -2544,7 +2507,7 @@ snd_m3_enable_ints(struct snd_m3 *chip)
|
||||||
|
|
||||||
/* TODO: MPU401 not supported yet */
|
/* TODO: MPU401 not supported yet */
|
||||||
val = ASSP_INT_ENABLE /*| MPU401_INT_ENABLE*/;
|
val = ASSP_INT_ENABLE /*| MPU401_INT_ENABLE*/;
|
||||||
if (chip->hv_quirk && (chip->hv_quirk->config & HV_CTRL_ENABLE))
|
if (chip->hv_config & HV_CTRL_ENABLE)
|
||||||
val |= HV_INT_ENABLE;
|
val |= HV_INT_ENABLE;
|
||||||
outw(val, io + HOST_INT_CTRL);
|
outw(val, io + HOST_INT_CTRL);
|
||||||
outb(inb(io + ASSP_CONTROL_C) | ASSP_HOST_INT_ENABLE,
|
outb(inb(io + ASSP_CONTROL_C) | ASSP_HOST_INT_ENABLE,
|
||||||
|
@ -2708,8 +2671,7 @@ snd_m3_create(struct snd_card *card, struct pci_dev *pci,
|
||||||
{
|
{
|
||||||
struct snd_m3 *chip;
|
struct snd_m3 *chip;
|
||||||
int i, err;
|
int i, err;
|
||||||
const struct m3_quirk *quirk;
|
const struct snd_pci_quirk *quirk;
|
||||||
const struct m3_hv_quirk *hv_quirk;
|
|
||||||
static struct snd_device_ops ops = {
|
static struct snd_device_ops ops = {
|
||||||
.dev_free = snd_m3_dev_free,
|
.dev_free = snd_m3_dev_free,
|
||||||
};
|
};
|
||||||
|
@ -2749,34 +2711,32 @@ snd_m3_create(struct snd_card *card, struct pci_dev *pci,
|
||||||
chip->pci = pci;
|
chip->pci = pci;
|
||||||
chip->irq = -1;
|
chip->irq = -1;
|
||||||
|
|
||||||
for (quirk = m3_quirk_list; quirk->vendor; quirk++) {
|
|
||||||
if (pci->subsystem_vendor == quirk->vendor &&
|
|
||||||
pci->subsystem_device == quirk->device) {
|
|
||||||
printk(KERN_INFO "maestro3: enabled hack for '%s'\n", quirk->name);
|
|
||||||
chip->quirk = quirk;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (hv_quirk = m3_hv_quirk_list; hv_quirk->vendor; hv_quirk++) {
|
|
||||||
if (pci->vendor == hv_quirk->vendor &&
|
|
||||||
pci->device == hv_quirk->device &&
|
|
||||||
pci->subsystem_vendor == hv_quirk->subsystem_vendor &&
|
|
||||||
pci->subsystem_device == hv_quirk->subsystem_device) {
|
|
||||||
chip->hv_quirk = hv_quirk;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
chip->external_amp = enable_amp;
|
chip->external_amp = enable_amp;
|
||||||
if (amp_gpio >= 0 && amp_gpio <= 0x0f)
|
if (amp_gpio >= 0 && amp_gpio <= 0x0f)
|
||||||
chip->amp_gpio = amp_gpio;
|
chip->amp_gpio = amp_gpio;
|
||||||
else if (chip->quirk && chip->quirk->amp_gpio >= 0)
|
else {
|
||||||
chip->amp_gpio = chip->quirk->amp_gpio;
|
quirk = snd_pci_quirk_lookup(pci, m3_amp_quirk_list);
|
||||||
else if (chip->allegro_flag)
|
if (quirk) {
|
||||||
chip->amp_gpio = GPO_EXT_AMP_ALLEGRO;
|
snd_printdd(KERN_INFO "maestro3: set amp-gpio "
|
||||||
else /* presumably this is for all 'maestro3's.. */
|
"for '%s'\n", quirk->name);
|
||||||
chip->amp_gpio = GPO_EXT_AMP_M3;
|
chip->amp_gpio = quirk->value;
|
||||||
|
} else if (chip->allegro_flag)
|
||||||
|
chip->amp_gpio = GPO_EXT_AMP_ALLEGRO;
|
||||||
|
else /* presumably this is for all 'maestro3's.. */
|
||||||
|
chip->amp_gpio = GPO_EXT_AMP_M3;
|
||||||
|
}
|
||||||
|
|
||||||
|
quirk = snd_pci_quirk_lookup(pci, m3_irda_quirk_list);
|
||||||
|
if (quirk) {
|
||||||
|
snd_printdd(KERN_INFO "maestro3: enabled irda workaround "
|
||||||
|
"for '%s'\n", quirk->name);
|
||||||
|
chip->irda_workaround = 1;
|
||||||
|
}
|
||||||
|
quirk = snd_pci_quirk_lookup(pci, m3_hv_quirk_list);
|
||||||
|
if (quirk)
|
||||||
|
chip->hv_config = quirk->value;
|
||||||
|
if (snd_pci_quirk_lookup(pci, m3_omnibook_quirk_list))
|
||||||
|
chip->is_omnibook = 1;
|
||||||
|
|
||||||
chip->num_substreams = NR_DSPS;
|
chip->num_substreams = NR_DSPS;
|
||||||
chip->substreams = kcalloc(chip->num_substreams, sizeof(struct m3_dma),
|
chip->substreams = kcalloc(chip->num_substreams, sizeof(struct m3_dma),
|
||||||
|
|
Loading…
Reference in a new issue