aboutsummaryrefslogtreecommitdiffstats
path: root/sound
diff options
context:
space:
mode:
authorClemens Ladisch <clemens@ladisch.de>2010-10-06 04:58:50 -0400
committerTakashi Iwai <tiwai@suse.de>2010-10-06 10:27:18 -0400
commitebebeece4ba596973c0c181a8cce5fd77bae427c (patch)
tree15cc6cab2f3a39ca9caaf99288f5f72b774ae346 /sound
parent7cb4ced5aa83b681c76b004c8960b4f2a6471fef (diff)
ALSA: oxygen: add PEX8111 initialization
Configure the PEX8111 bridge on the PCI Express cards so that the audio DMA controller can do proper burst reads and is less likely to lose data. This is usually done automatically, but is required on older cards where the user has not applied the PLX firmware update. Signed-off-by: Clemens Ladisch <clemens@ladisch.de> Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound')
-rw-r--r--sound/pci/oxygen/oxygen_lib.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/sound/pci/oxygen/oxygen_lib.c b/sound/pci/oxygen/oxygen_lib.c
index d10cc6ee1a68..e5ebe56fb0c5 100644
--- a/sound/pci/oxygen/oxygen_lib.c
+++ b/sound/pci/oxygen/oxygen_lib.c
@@ -310,8 +310,10 @@ static void oxygen_restore_eeprom(struct oxygen *chip,
310 310
311static void configure_pcie_bridge(struct pci_dev *pci) 311static void configure_pcie_bridge(struct pci_dev *pci)
312{ 312{
313 enum { PI7C9X110 }; 313 enum { PEX811X, PI7C9X110 };
314 static const struct pci_device_id bridge_ids[] = { 314 static const struct pci_device_id bridge_ids[] = {
315 { PCI_VDEVICE(PLX, 0x8111), .driver_data = PEX811X },
316 { PCI_VDEVICE(PLX, 0x8112), .driver_data = PEX811X },
315 { PCI_DEVICE(0x12d8, 0xe110), .driver_data = PI7C9X110 }, 317 { PCI_DEVICE(0x12d8, 0xe110), .driver_data = PI7C9X110 },
316 { } 318 { }
317 }; 319 };
@@ -328,6 +330,19 @@ static void configure_pcie_bridge(struct pci_dev *pci)
328 return; 330 return;
329 331
330 switch (id->driver_data) { 332 switch (id->driver_data) {
333 case PEX811X: /* PLX PEX8111/PEX8112 PCIe/PCI bridge */
334 pci_read_config_dword(bridge, 0x48, &tmp);
335 tmp |= 1; /* enable blind prefetching */
336 tmp |= 1 << 11; /* enable beacon generation */
337 pci_write_config_dword(bridge, 0x48, tmp);
338
339 pci_write_config_dword(bridge, 0x84, 0x0c);
340 pci_read_config_dword(bridge, 0x88, &tmp);
341 tmp &= ~(7 << 27);
342 tmp |= 2 << 27; /* set prefetch size to 128 bytes */
343 pci_write_config_dword(bridge, 0x88, tmp);
344 break;
345
331 case PI7C9X110: /* Pericom PI7C9X110 PCIe/PCI bridge */ 346 case PI7C9X110: /* Pericom PI7C9X110 PCIe/PCI bridge */
332 pci_read_config_dword(bridge, 0x40, &tmp); 347 pci_read_config_dword(bridge, 0x40, &tmp);
333 tmp |= 1; /* park the PCI arbiter to the sound chip */ 348 tmp |= 1; /* park the PCI arbiter to the sound chip */