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

Commit 362bc24d authored by Clemens Ladisch's avatar Clemens Ladisch Committed by Takashi Iwai
Browse files

sound: oxygen: fix for PI7C9X110 compatibility



If the card is used with a Pericom PI7C9X110 PCI-E/PCI bridge,
reconfigure the latter's PCI buffering to fix an unknown problem.

Signed-off-by: default avatarClemens Ladisch <clemens@ladisch.de>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 87b61902
Loading
Loading
Loading
Loading
+23 −0
Original line number Diff line number Diff line
@@ -307,6 +307,28 @@ static void oxygen_restore_eeprom(struct oxygen *chip,
	}
}

static void pci_bridge_magic(void)
{
	struct pci_dev *pci = NULL;
	u32 tmp;

	for (;;) {
		/* If there is any Pericom PI7C9X110 PCI-E/PCI bridge ... */
		pci = pci_get_device(0x12d8, 0xe110, pci);
		if (!pci)
			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. */
	}
}

static void oxygen_init(struct oxygen *chip)
{
	unsigned int i;
@@ -585,6 +607,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();
	oxygen_init(chip);
	chip->model.init(chip);