Commit 7cb4ced5 authored by Clemens Ladisch's avatar Clemens Ladisch Committed by Takashi Iwai

ALSA: oxygen: rewrite PCIe bridge initialization

Change the PCIe/PCI bridge initialization code to configure only the
bridge that is actually connected to the sound chip, instead of any
bridge found in the system.  The new code also makes it easier to add
other bridges.
Signed-off-by: default avatarClemens Ladisch <clemens@ladisch.de>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 93943beb
...@@ -308,25 +308,31 @@ static void oxygen_restore_eeprom(struct oxygen *chip, ...@@ -308,25 +308,31 @@ static void oxygen_restore_eeprom(struct oxygen *chip,
} }
} }
static void pci_bridge_magic(void) static void configure_pcie_bridge(struct pci_dev *pci)
{ {
struct pci_dev *pci = NULL; enum { PI7C9X110 };
static const struct pci_device_id bridge_ids[] = {
{ PCI_DEVICE(0x12d8, 0xe110), .driver_data = PI7C9X110 },
{ }
};
struct pci_dev *bridge;
const struct pci_device_id *id;
u32 tmp; u32 tmp;
for (;;) { if (!pci->bus || !pci->bus->self)
/* If there is any Pericom PI7C9X110 PCI-E/PCI bridge ... */ return;
pci = pci_get_device(0x12d8, 0xe110, pci); bridge = pci->bus->self;
if (!pci)
break; id = pci_match_id(bridge_ids, bridge);
/* if (!id)
* ... configure its secondary internal arbiter to park to return;
* the secondary port, instead of to the last master.
*/ switch (id->driver_data) {
if (!pci_read_config_dword(pci, 0x40, &tmp)) { case PI7C9X110: /* Pericom PI7C9X110 PCIe/PCI bridge */
tmp |= 1; pci_read_config_dword(bridge, 0x40, &tmp);
pci_write_config_dword(pci, 0x40, tmp); tmp |= 1; /* park the PCI arbiter to the sound chip */
} pci_write_config_dword(bridge, 0x40, tmp);
/* Why? Try asking C-Media. */ break;
} }
} }
...@@ -613,7 +619,7 @@ int oxygen_pci_probe(struct pci_dev *pci, int index, char *id, ...@@ -613,7 +619,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(); configure_pcie_bridge(pci);
oxygen_init(chip); oxygen_init(chip);
chip->model.init(chip); chip->model.init(chip);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment