diff options
Diffstat (limited to 'target/linux/ar71xx/files/arch/mips/ar71xx/dev-ap94-pci.c')
-rw-r--r-- | target/linux/ar71xx/files/arch/mips/ar71xx/dev-ap94-pci.c | 80 |
1 files changed, 3 insertions, 77 deletions
diff --git a/target/linux/ar71xx/files/arch/mips/ar71xx/dev-ap94-pci.c b/target/linux/ar71xx/files/arch/mips/ar71xx/dev-ap94-pci.c index bfa668f74..2436491b4 100644 --- a/target/linux/ar71xx/files/arch/mips/ar71xx/dev-ap94-pci.c +++ b/target/linux/ar71xx/files/arch/mips/ar71xx/dev-ap94-pci.c @@ -16,12 +16,12 @@ #include <asm/mach-ar71xx/pci.h> #include "dev-ap94-pci.h" +#include "pci-ath9k-fixup.h" static struct ath9k_platform_data ap94_wmac0_data; static struct ath9k_platform_data ap94_wmac1_data; static char ap94_wmac0_mac[6]; static char ap94_wmac1_mac[6]; -static int ap94_pci_fixup_enabled; static struct ar71xx_pci_irq ap94_pci_irqs[] __initdata = { { @@ -50,81 +50,6 @@ static int ap94_pci_plat_dev_init(struct pci_dev *dev) return 0; } -static void ap94_pci_fixup(struct pci_dev *dev) -{ - void __iomem *mem; - u16 *cal_data; - u16 cmd; - u32 bar0; - u32 val; - - if (!ap94_pci_fixup_enabled) - return; - - switch (PCI_SLOT(dev->devfn)) { - case 17: - cal_data = ap94_wmac0_data.eeprom_data; - break; - case 18: - cal_data = ap94_wmac1_data.eeprom_data; - break; - default: - return; - } - - if (*cal_data != 0xa55a) { - printk(KERN_ERR "PCI: no calibration data found for %s\n", - pci_name(dev)); - return; - } - - mem = ioremap(AR71XX_PCI_MEM_BASE, 0x10000); - if (!mem) { - printk(KERN_ERR "PCI: ioremap error for device %s\n", - pci_name(dev)); - return; - } - - printk(KERN_INFO "PCI: fixup device %s\n", pci_name(dev)); - - pci_read_config_dword(dev, PCI_BASE_ADDRESS_0, &bar0); - - /* Setup the PCI device to allow access to the internal registers */ - pci_write_config_dword(dev, PCI_BASE_ADDRESS_0, AR71XX_PCI_MEM_BASE); - pci_read_config_word(dev, PCI_COMMAND, &cmd); - cmd |= PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY; - pci_write_config_word(dev, PCI_COMMAND, cmd); - - /* set pointer to first reg address */ - cal_data += 3; - while (*cal_data != 0xffff) { - u32 reg; - reg = *cal_data++; - val = *cal_data++; - val |= (*cal_data++) << 16; - - __raw_writel(val, mem + reg); - udelay(100); - } - - pci_read_config_dword(dev, PCI_VENDOR_ID, &val); - dev->vendor = val & 0xffff; - dev->device = (val >> 16) & 0xffff; - - pci_read_config_dword(dev, PCI_CLASS_REVISION, &val); - dev->revision = val & 0xff; - dev->class = val >> 8; /* upper 3 bytes */ - - pci_read_config_word(dev, PCI_COMMAND, &cmd); - cmd &= ~(PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY); - pci_write_config_word(dev, PCI_COMMAND, cmd); - - pci_write_config_dword(dev, PCI_BASE_ADDRESS_0, bar0); - - iounmap(mem); -} -DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_ATHEROS, PCI_ANY_ID, ap94_pci_fixup); - void __init ap94_pci_enable_quirk_wndr3700(void) { ap94_wmac0_data.quirk_wndr3700 = 1; @@ -155,5 +80,6 @@ void __init ap94_pci_init(u8 *cal_data0, u8 *mac_addr0, ar71xx_pci_plat_dev_init = ap94_pci_plat_dev_init; ar71xx_pci_init(ARRAY_SIZE(ap94_pci_irqs), ap94_pci_irqs); - ap94_pci_fixup_enabled = 1; + pci_enable_ath9k_fixup(17, ap94_wmac0_data.eeprom_data); + pci_enable_ath9k_fixup(18, ap94_wmac1_data.eeprom_data); } |