Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+23 −17
Original line number Diff line number Diff line
@@ -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;

	for (;;) {
		/* If there is any Pericom PI7C9X110 PCI-E/PCI bridge ... */
		pci = pci_get_device(0x12d8, 0xe110, pci);
		if (!pci)
	if (!pci->bus || !pci->bus->self)
		return;
	bridge = pci->bus->self;

	id = pci_match_id(bridge_ids, bridge);
	if (!id)
		return;

	switch (id->driver_data) {
	case PI7C9X110:	/* Pericom PI7C9X110 PCIe/PCI bridge */
		pci_read_config_dword(bridge, 0x40, &tmp);
		tmp |= 1;	/* park the PCI arbiter to the sound chip */
		pci_write_config_dword(bridge, 0x40, tmp);
		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. */
	}
}

@@ -613,7 +619,7 @@ int oxygen_pci_probe(struct pci_dev *pci, int index, char *id,
	snd_card_set_dev(card, &pci->dev);
	card->private_free = oxygen_card_free;

	pci_bridge_magic();
	configure_pcie_bridge(pci);
	oxygen_init(chip);
	chip->model.init(chip);