sound: oxygen: fix for PI7C9X110 compatibility
If the card is used with a Pericom PI7C9X110 PCI-E/PCI bridge, reconfigure the latter's PCI buffering to fix an unknown problem. Signed-off-by: Clemens Ladisch <clemens@ladisch.de> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
87b61902ce
commit
362bc24d67
|
@ -307,6 +307,28 @@ static void oxygen_restore_eeprom(struct oxygen *chip,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void pci_bridge_magic(void)
|
||||||
|
{
|
||||||
|
struct pci_dev *pci = NULL;
|
||||||
|
u32 tmp;
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
/* If there is any Pericom PI7C9X110 PCI-E/PCI bridge ... */
|
||||||
|
pci = pci_get_device(0x12d8, 0xe110, pci);
|
||||||
|
if (!pci)
|
||||||
|
break;
|
||||||
|
/*
|
||||||
|
* ... configure its secondary internal arbiter to park to
|
||||||
|
* the secondary port, instead of to the last master.
|
||||||
|
*/
|
||||||
|
if (!pci_read_config_dword(pci, 0x40, &tmp)) {
|
||||||
|
tmp |= 1;
|
||||||
|
pci_write_config_dword(pci, 0x40, tmp);
|
||||||
|
}
|
||||||
|
/* Why? Try asking C-Media. */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void oxygen_init(struct oxygen *chip)
|
static void oxygen_init(struct oxygen *chip)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
@ -585,6 +607,7 @@ int oxygen_pci_probe(struct pci_dev *pci, int index, char *id,
|
||||||
snd_card_set_dev(card, &pci->dev);
|
snd_card_set_dev(card, &pci->dev);
|
||||||
card->private_free = oxygen_card_free;
|
card->private_free = oxygen_card_free;
|
||||||
|
|
||||||
|
pci_bridge_magic();
|
||||||
oxygen_init(chip);
|
oxygen_init(chip);
|
||||||
chip->model.init(chip);
|
chip->model.init(chip);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue