diff options
Diffstat (limited to 'target/linux/ar71xx/files/arch/mips/ar71xx/mach-wndr3700.c')
-rw-r--r-- | target/linux/ar71xx/files/arch/mips/ar71xx/mach-wndr3700.c | 148 |
1 files changed, 13 insertions, 135 deletions
diff --git a/target/linux/ar71xx/files/arch/mips/ar71xx/mach-wndr3700.c b/target/linux/ar71xx/files/arch/mips/ar71xx/mach-wndr3700.c index e408ef6eb..3216ede16 100644 --- a/target/linux/ar71xx/files/arch/mips/ar71xx/mach-wndr3700.c +++ b/target/linux/ar71xx/files/arch/mips/ar71xx/mach-wndr3700.c @@ -13,17 +13,15 @@ #include <linux/mtd/mtd.h> #include <linux/mtd/partitions.h> #include <linux/input.h> -#include <linux/pci.h> -#include <linux/ath9k_platform.h> #include <linux/delay.h> #include <linux/rtl8366_smi.h> #include <asm/mips_machine.h> #include <asm/mach-ar71xx/ar71xx.h> -#include <asm/mach-ar71xx/pci.h> #include "devices.h" #include "dev-m25p80.h" +#include "dev-ap94-pci.h" #define WNDR3700_GPIO_LED_WPS_ORANGE 0 #define WNDR3700_GPIO_LED_POWER_ORANGE 1 @@ -39,6 +37,11 @@ #define WNDR3700_BUTTONS_POLL_INTERVAL 20 +#define WNDR3700_WMAC0_MAC_OFFSET 0 +#define WNDR3700_WMAC1_MAC_OFFSET 0xc +#define WNDR3700_CALDATA0_OFFSET 0x1000 +#define WNDR3700_CALDATA1_OFFSET 0x5000 + #ifdef CONFIG_MTD_PARTITIONS static struct mtd_partition wndr3700_partitions[] = { { @@ -96,135 +99,6 @@ static struct flash_platform_data wndr3700_flash_data = { #endif }; -#ifdef CONFIG_PCI -static struct ar71xx_pci_irq wndr3700_pci_irqs[] __initdata = { - { - .slot = 0, - .pin = 1, - .irq = AR71XX_PCI_IRQ_DEV0, - }, { - .slot = 1, - .pin = 1, - .irq = AR71XX_PCI_IRQ_DEV1, - } -}; - -static struct ath9k_platform_data wndr3700_wmac0_data; -static u8 wndr3700_wmac0_macaddr[6]; -static struct ath9k_platform_data wndr3700_wmac1_data; -static u8 wndr3700_wmac1_macaddr[6]; - -static void wndr3700_pci_fixup(struct pci_dev *dev) -{ - void __iomem *mem; - u16 *cal_data; - u16 cmd; - u32 bar0; - u32 val; - - if (ar71xx_mach != AR71XX_MACH_WNDR3700) - return; - - switch (PCI_SLOT(dev->devfn)) { - case 17: - cal_data = wndr3700_wmac0_data.eeprom_data; - break; - case 18: - cal_data = wndr3700_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, - wndr3700_pci_fixup); - -static int wndr3700_pci_plat_dev_init(struct pci_dev *dev) -{ - switch (PCI_SLOT(dev->devfn)) { - case 17: - dev->dev.platform_data = &wndr3700_wmac0_data; - break; - case 18: - dev->dev.platform_data = &wndr3700_wmac1_data; - break; - } - - return 0; -} - -static void __init wndr3700_pci_init(void) -{ - u8 *ee = (u8 *) KSEG1ADDR(0x1fff0000); - - memcpy(wndr3700_wmac0_data.eeprom_data, ee + 0x1000, - sizeof(wndr3700_wmac0_data.eeprom_data)); - memcpy(wndr3700_wmac0_macaddr, ee, sizeof(wndr3700_wmac0_macaddr)); - wndr3700_wmac0_data.macaddr = wndr3700_wmac0_macaddr; - - memcpy(wndr3700_wmac1_data.eeprom_data, ee + 0x5000, - sizeof(wndr3700_wmac1_data.eeprom_data)); - memcpy(wndr3700_wmac1_macaddr, ee + 12, sizeof(wndr3700_wmac1_macaddr)); - wndr3700_wmac1_data.macaddr = wndr3700_wmac1_macaddr; - - ar71xx_pci_plat_dev_init = wndr3700_pci_plat_dev_init; - ar71xx_pci_init(ARRAY_SIZE(wndr3700_pci_irqs), wndr3700_pci_irqs); -} -#else -static inline void wndr3700_pci_init(void) { }; -#endif /* CONFIG_PCI */ - static struct gpio_led wndr3700_leds_gpio[] __initdata = { { .name = "wndr3700:green:power", @@ -282,9 +156,9 @@ static struct platform_device wndr3700_rtl8366_smi_device = { static void __init wndr3700_setup(void) { - u8 *mac = (u8 *) KSEG1ADDR(0x1fff0000); + u8 *art = (u8 *) KSEG1ADDR(0x1fff0000); - ar71xx_set_mac_base(mac); + ar71xx_set_mac_base(art); ar71xx_eth0_pll_data.pll_1000 = 0x11110000; ar71xx_eth0_data.mii_bus_dev = &wndr3700_rtl8366_smi_device.dev; @@ -314,7 +188,11 @@ static void __init wndr3700_setup(void) platform_device_register(&wndr3700_rtl8366_smi_device); platform_device_register_simple("wndr3700-led-usb", -1, NULL, 0); - wndr3700_pci_init(); + + ap94_pci_init(art + WNDR3700_CALDATA0_OFFSET, + art + WNDR3700_WMAC0_MAC_OFFSET, + art + WNDR3700_CALDATA1_OFFSET, + art + WNDR3700_WMAC1_MAC_OFFSET); } MIPS_MACHINE(AR71XX_MACH_WNDR3700, "NETGEAR WNDR3700", wndr3700_setup); |