diff options
Diffstat (limited to 'sound/pci/oxygen')
-rw-r--r-- | sound/pci/oxygen/oxygen_lib.c | 23 |
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 | ||
310 | static 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 | |||
310 | static void oxygen_init(struct oxygen *chip) | 332 | static 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 | ||