aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sound/pci/oxygen/oxygen_lib.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/sound/pci/oxygen/oxygen_lib.c b/sound/pci/oxygen/oxygen_lib.c
index c9f271419eb8..9c5e6450eebb 100644
--- a/sound/pci/oxygen/oxygen_lib.c
+++ b/sound/pci/oxygen/oxygen_lib.c
@@ -307,6 +307,28 @@ static void oxygen_restore_eeprom(struct oxygen *chip,
307 } 307 }
308} 308}
309 309
310static void pci_bridge_magic(void)
311{
312 struct pci_dev *pci = NULL;
313 u32 tmp;
314
315 for (;;) {
316 /* If there is any Pericom PI7C9X110 PCI-E/PCI bridge ... */
317 pci = pci_get_device(0x12d8, 0xe110, pci);
318 if (!pci)
319 break;
320 /*
321 * ... configure its secondary internal arbiter to park to
322 * the secondary port, instead of to the last master.
323 */
324 if (!pci_read_config_dword(pci, 0x40, &tmp)) {
325 tmp |= 1;
326 pci_write_config_dword(pci, 0x40, tmp);
327 }
328 /* Why? Try asking C-Media. */
329 }
330}
331
310static void oxygen_init(struct oxygen *chip) 332static void oxygen_init(struct oxygen *chip)
311{ 333{
312 unsigned int i; 334 unsigned int i;
@@ -585,6 +607,7 @@ int oxygen_pci_probe(struct pci_dev *pci, int index, char *id,
585 snd_card_set_dev(card, &pci->dev); 607 snd_card_set_dev(card, &pci->dev);
586 card->private_free = oxygen_card_free; 608 card->private_free = oxygen_card_free;
587 609
610 pci_bridge_magic();
588 oxygen_init(chip); 611 oxygen_init(chip);
589 chip->model.init(chip); 612 chip->model.init(chip);
590 613