diff options
-rw-r--r-- | sound/pci/oxygen/oxygen_lib.c | 40 |
1 files changed, 23 insertions, 17 deletions
diff --git a/sound/pci/oxygen/oxygen_lib.c b/sound/pci/oxygen/oxygen_lib.c index 7e93cf884437..d10cc6ee1a68 100644 --- a/sound/pci/oxygen/oxygen_lib.c +++ b/sound/pci/oxygen/oxygen_lib.c | |||
@@ -308,25 +308,31 @@ static void oxygen_restore_eeprom(struct oxygen *chip, | |||
308 | } | 308 | } |
309 | } | 309 | } |
310 | 310 | ||
311 | static void pci_bridge_magic(void) | 311 | static void configure_pcie_bridge(struct pci_dev *pci) |
312 | { | 312 | { |
313 | struct pci_dev *pci = NULL; | 313 | enum { PI7C9X110 }; |
314 | static const struct pci_device_id bridge_ids[] = { | ||
315 | { PCI_DEVICE(0x12d8, 0xe110), .driver_data = PI7C9X110 }, | ||
316 | { } | ||
317 | }; | ||
318 | struct pci_dev *bridge; | ||
319 | const struct pci_device_id *id; | ||
314 | u32 tmp; | 320 | u32 tmp; |
315 | 321 | ||
316 | for (;;) { | 322 | if (!pci->bus || !pci->bus->self) |
317 | /* If there is any Pericom PI7C9X110 PCI-E/PCI bridge ... */ | 323 | return; |
318 | pci = pci_get_device(0x12d8, 0xe110, pci); | 324 | bridge = pci->bus->self; |
319 | if (!pci) | 325 | |
320 | break; | 326 | id = pci_match_id(bridge_ids, bridge); |
321 | /* | 327 | if (!id) |
322 | * ... configure its secondary internal arbiter to park to | 328 | return; |
323 | * the secondary port, instead of to the last master. | 329 | |
324 | */ | 330 | switch (id->driver_data) { |
325 | if (!pci_read_config_dword(pci, 0x40, &tmp)) { | 331 | case PI7C9X110: /* Pericom PI7C9X110 PCIe/PCI bridge */ |
326 | tmp |= 1; | 332 | pci_read_config_dword(bridge, 0x40, &tmp); |
327 | pci_write_config_dword(pci, 0x40, tmp); | 333 | tmp |= 1; /* park the PCI arbiter to the sound chip */ |
328 | } | 334 | pci_write_config_dword(bridge, 0x40, tmp); |
329 | /* Why? Try asking C-Media. */ | 335 | break; |
330 | } | 336 | } |
331 | } | 337 | } |
332 | 338 | ||
@@ -613,7 +619,7 @@ int oxygen_pci_probe(struct pci_dev *pci, int index, char *id, | |||
613 | snd_card_set_dev(card, &pci->dev); | 619 | snd_card_set_dev(card, &pci->dev); |
614 | card->private_free = oxygen_card_free; | 620 | card->private_free = oxygen_card_free; |
615 | 621 | ||
616 | pci_bridge_magic(); | 622 | configure_pcie_bridge(pci); |
617 | oxygen_init(chip); | 623 | oxygen_init(chip); |
618 | chip->model.init(chip); | 624 | chip->model.init(chip); |
619 | 625 | ||