From 262c556759cc36fecca894721c91b06a6ce3b8f0 Mon Sep 17 00:00:00 2001
From: Waldemar Brodkorb <wbx@openadk.org>
Date: Fri, 12 Aug 2011 13:23:46 +0200
Subject: enable ipv6 module by default

---
 target/linux/config/Config.in.network | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/target/linux/config/Config.in.network b/target/linux/config/Config.in.network
index 6e4267857..2ec253111 100644
--- a/target/linux/config/Config.in.network
+++ b/target/linux/config/Config.in.network
@@ -158,7 +158,7 @@ config ADK_KPACKAGE_KMOD_NET_IPGRE
 config ADK_KPACKAGE_KMOD_IPV6
 	prompt "kmod-ipv6......................... IPv6 support"
 	tristate
-	default n
+	default m
 	help
 	  This is complemental support for the IP version 6.
 	  You will still be able to do traditional IPv4 networking as well.
-- 
cgit v1.2.3


From 15ea15f2cff68851af19b0e74a7646eb0ce74002 Mon Sep 17 00:00:00 2001
From: Waldemar Brodkorb <wbx@openadk.org>
Date: Wed, 24 Aug 2011 19:04:44 +0200
Subject: remove *.orig files from patch

---
 target/linux/patches/2.6.39/rb4xx.patch | 33577 ++++++++++++++----------------
 1 file changed, 15268 insertions(+), 18309 deletions(-)

diff --git a/target/linux/patches/2.6.39/rb4xx.patch b/target/linux/patches/2.6.39/rb4xx.patch
index 49fd204d7..4f2e1cd84 100644
--- a/target/linux/patches/2.6.39/rb4xx.patch
+++ b/target/linux/patches/2.6.39/rb4xx.patch
@@ -1,681 +1,810 @@
-diff -Nur linux-2.6.39.orig/arch/mips/ar71xx/ar71xx.c linux-2.6.39/arch/mips/ar71xx/ar71xx.c
---- linux-2.6.39.orig/arch/mips/ar71xx/ar71xx.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.39/arch/mips/ar71xx/ar71xx.c	2011-08-24 02:41:55.227990426 +0200
-@@ -0,0 +1,230 @@
-+/*
-+ *  AR71xx SoC routines
-+ *
-+ *  Copyright (C) 2008-2009 Gabor Juhos <juhosg@openwrt.org>
-+ *  Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
-+ *
-+ *  This program is free software; you can redistribute it and/or modify it
-+ *  under the terms of the GNU General Public License version 2 as published
-+ *  by the Free Software Foundation.
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+#include <linux/types.h>
-+#include <linux/mutex.h>
-+#include <linux/spinlock.h>
+diff -Nur linux-2.6.39.orig/arch/mips/Kconfig linux-2.6.39/arch/mips/Kconfig
+--- linux-2.6.39.orig/arch/mips/Kconfig	2011-05-19 06:06:34.000000000 +0200
++++ linux-2.6.39/arch/mips/Kconfig	2011-08-24 18:17:24.000000000 +0200
+@@ -84,6 +84,23 @@
+ 	help
+ 	  Support for the Atheros AR71XX/AR724X/AR913X SoCs.
+ 
++config ATHEROS_AR71XX
++	bool "Atheros AR71xx based boards"
++	select CEVT_R4K
++	select CSRC_R4K
++	select DMA_NONCOHERENT
++	select HW_HAS_PCI
++	select IRQ_CPU
++	select ARCH_REQUIRE_GPIOLIB
++	select SYS_HAS_CPU_MIPS32_R1
++	select SYS_HAS_CPU_MIPS32_R2
++	select SYS_SUPPORTS_32BIT_KERNEL
++	select SYS_SUPPORTS_BIG_ENDIAN
++	select SYS_HAS_EARLY_PRINTK
++	select MIPS_MACHINE
++	help
++	  Support for Atheros AR71xx based boards.
 +
-+#include <asm/mach-ar71xx/ar71xx.h>
+ config BCM47XX
+ 	bool "Broadcom BCM47XX based boards"
+ 	select CEVT_R4K
+@@ -739,6 +756,7 @@
+ endchoice
+ 
+ source "arch/mips/alchemy/Kconfig"
++source "arch/mips/ar71xx/Kconfig"
+ source "arch/mips/ath79/Kconfig"
+ source "arch/mips/bcm63xx/Kconfig"
+ source "arch/mips/jazz/Kconfig"
+@@ -907,6 +925,9 @@
+ config MIPS_DISABLE_OBSOLETE_IDE
+ 	bool
+ 
++config MYLOADER
++	bool
 +
-+static DEFINE_MUTEX(ar71xx_flash_mutex);
-+static DEFINE_SPINLOCK(ar71xx_device_lock);
+ config SYNC_R4K
+ 	bool
+ 
+diff -Nur linux-2.6.39.orig/arch/mips/Makefile linux-2.6.39/arch/mips/Makefile
+--- linux-2.6.39.orig/arch/mips/Makefile	2011-05-19 06:06:34.000000000 +0200
++++ linux-2.6.39/arch/mips/Makefile	2011-08-24 18:17:24.000000000 +0200
+@@ -158,6 +158,13 @@
+ endif
+ cflags-$(CONFIG_CAVIUM_CN63XXP1) += -Wa,-mfix-cn63xxp1
+ 
++#
++# Atheros AR71xx
++#
++core-$(CONFIG_ATHEROS_AR71XX)	+= arch/mips/ar71xx/
++cflags-$(CONFIG_ATHEROS_AR71XX)	+= -I$(srctree)/arch/mips/include/asm/mach-ar71xx
++load-$(CONFIG_ATHEROS_AR71XX)	+= 0xffffffff80060000
 +
-+void __iomem *ar71xx_ddr_base;
-+EXPORT_SYMBOL_GPL(ar71xx_ddr_base);
+ cflags-$(CONFIG_CPU_R4000_WORKAROUNDS)	+= $(call cc-option,-mfix-r4000,)
+ cflags-$(CONFIG_CPU_R4400_WORKAROUNDS)	+= $(call cc-option,-mfix-r4400,)
+ cflags-$(CONFIG_CPU_DADDI_WORKAROUNDS)	+= $(call cc-option,-mno-daddi,)
+@@ -174,6 +181,7 @@
+ #
+ libs-$(CONFIG_ARC)		+= arch/mips/fw/arc/
+ libs-$(CONFIG_CFE)		+= arch/mips/fw/cfe/
++libs-$(CONFIG_MYLOADER)		+= arch/mips/fw/myloader/
+ libs-$(CONFIG_SNIPROM)		+= arch/mips/fw/sni/
+ libs-y				+= arch/mips/fw/lib/
+ 
+diff -Nur linux-2.6.39.orig/arch/mips/ar71xx/Kconfig linux-2.6.39/arch/mips/ar71xx/Kconfig
+--- linux-2.6.39.orig/arch/mips/ar71xx/Kconfig	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.39/arch/mips/ar71xx/Kconfig	2011-08-24 18:17:23.000000000 +0200
+@@ -0,0 +1,420 @@
++if ATHEROS_AR71XX
 +
-+void __iomem *ar71xx_pll_base;
-+EXPORT_SYMBOL_GPL(ar71xx_pll_base);
++menu "Atheros AR71xx machine selection"
 +
-+void __iomem *ar71xx_reset_base;
-+EXPORT_SYMBOL_GPL(ar71xx_reset_base);
++config AR71XX_MACH_AP81
++	bool "Atheros AP81 board support"
++	select SOC_AR913X
++	select AR71XX_DEV_M25P80
++	select AR71XX_DEV_AR9XXX_WMAC
++	select AR71XX_DEV_GPIO_BUTTONS
++	select AR71XX_DEV_LEDS_GPIO
++	select AR71XX_DEV_USB
++	default n
 +
-+void __iomem *ar71xx_gpio_base;
-+EXPORT_SYMBOL_GPL(ar71xx_gpio_base);
++config AR71XX_MACH_AP83
++	bool "Atheros AP83 board support"
++	select SOC_AR913X
++	select AR71XX_DEV_AR9XXX_WMAC
++	select AR71XX_DEV_GPIO_BUTTONS
++	select AR71XX_DEV_LEDS_GPIO
++	select AR71XX_DEV_USB
++	default n
 +
-+void __iomem *ar71xx_usb_ctrl_base;
-+EXPORT_SYMBOL_GPL(ar71xx_usb_ctrl_base);
++config AR71XX_MACH_AP96
++	bool "Atheros AP96 board support"
++	select SOC_AR71XX
++	select AR71XX_DEV_M25P80
++	select AR71XX_DEV_AP94_PCI if PCI
++	select AR71XX_DEV_GPIO_BUTTONS
++	select AR71XX_DEV_LEDS_GPIO
++	select AR71XX_DEV_USB
++	default n
 +
-+void ar71xx_device_stop(u32 mask)
-+{
-+	unsigned long flags;
-+	u32 mask_inv;
-+	u32 t;
++config AR71XX_MACH_AP121
++	bool "Atheros AP121 board support"
++	select AR71XX_DEV_M25P80
++	select AR71XX_DEV_GPIO_BUTTONS
++	select AR71XX_DEV_LEDS_GPIO
++	select AR71XX_DEV_USB
++	select AR71XX_DEV_AR9XXX_WMAC
++	select SOC_AR933X
++	default n
 +
-+	switch (ar71xx_soc) {
-+	case AR71XX_SOC_AR7130:
-+	case AR71XX_SOC_AR7141:
-+	case AR71XX_SOC_AR7161:
-+		spin_lock_irqsave(&ar71xx_device_lock, flags);
-+		t = ar71xx_reset_rr(AR71XX_RESET_REG_RESET_MODULE);
-+		ar71xx_reset_wr(AR71XX_RESET_REG_RESET_MODULE, t | mask);
-+		spin_unlock_irqrestore(&ar71xx_device_lock, flags);
-+		break;
++config AR71XX_MACH_DB120
++	bool "Atheros DB120 board support"
++	select SOC_AR934X
++	select AR71XX_DEV_AR9XXX_WMAC
++	select AR71XX_DEV_DB120_PCI if PCI
++	select AR71XX_DEV_GPIO_BUTTONS
++	select AR71XX_DEV_LEDS_GPIO
++	select AR71XX_DEV_USB
++	default n
 +
-+	case AR71XX_SOC_AR7240:
-+	case AR71XX_SOC_AR7241:
-+	case AR71XX_SOC_AR7242:
-+		mask_inv = mask & RESET_MODULE_USB_OHCI_DLL_7240;
-+		spin_lock_irqsave(&ar71xx_device_lock, flags);
-+		t = ar71xx_reset_rr(AR724X_RESET_REG_RESET_MODULE);
-+		t |= mask;
-+		t &= ~mask_inv;
-+		ar71xx_reset_wr(AR724X_RESET_REG_RESET_MODULE, t);
-+		spin_unlock_irqrestore(&ar71xx_device_lock, flags);
-+		break;
++config AR71XX_MACH_DIR_600_A1
++	bool "D-Link DIR-600 rev. A1 support"
++	select SOC_AR724X
++	select AR71XX_DEV_AP91_PCI if PCI
++	select AR71XX_DEV_M25P80
++	select AR71XX_DEV_GPIO_BUTTONS
++	select AR71XX_DEV_LEDS_GPIO
++	select AR71XX_NVRAM
++	default n
 +
-+	case AR71XX_SOC_AR9130:
-+	case AR71XX_SOC_AR9132:
-+		spin_lock_irqsave(&ar71xx_device_lock, flags);
-+		t = ar71xx_reset_rr(AR91XX_RESET_REG_RESET_MODULE);
-+		ar71xx_reset_wr(AR91XX_RESET_REG_RESET_MODULE, t | mask);
-+		spin_unlock_irqrestore(&ar71xx_device_lock, flags);
-+		break;
++config AR71XX_MACH_DIR_615_C1
++	bool "D-Link DIR-615 rev. C1 support"
++	select SOC_AR913X
++	select AR71XX_DEV_M25P80
++	select AR71XX_DEV_AR9XXX_WMAC
++	select AR71XX_DEV_GPIO_BUTTONS
++	select AR71XX_DEV_LEDS_GPIO
++	select AR71XX_NVRAM
++	default n
 +
-+	case AR71XX_SOC_AR9330:
-+	case AR71XX_SOC_AR9331:
-+		spin_lock_irqsave(&ar71xx_device_lock, flags);
-+		t = ar71xx_reset_rr(AR933X_RESET_REG_RESET_MODULE);
-+		ar71xx_reset_wr(AR933X_RESET_REG_RESET_MODULE, t | mask);
-+		spin_unlock_irqrestore(&ar71xx_device_lock, flags);
-+		break;
++config AR71XX_MACH_DIR_825_B1
++	bool "D-Link DIR-825 rev. B1 board support"
++	select SOC_AR71XX
++	select AR71XX_DEV_M25P80
++	select AR71XX_DEV_AP94_PCI if PCI
++	select AR71XX_DEV_GPIO_BUTTONS
++	select AR71XX_DEV_LEDS_GPIO
++	select AR71XX_DEV_USB
++	default n
 +
-+	case AR71XX_SOC_AR9341:
-+	case AR71XX_SOC_AR9342:
-+	case AR71XX_SOC_AR9344:
-+		spin_lock_irqsave(&ar71xx_device_lock, flags);
-+		t = ar71xx_reset_rr(AR934X_RESET_REG_RESET_MODULE);
-+		ar71xx_reset_wr(AR934X_RESET_REG_RESET_MODULE, t | mask);
-+		spin_unlock_irqrestore(&ar71xx_device_lock, flags);
-+		break;
++config AR71XX_MACH_JA76PF
++	bool "jjPlus JA76PF board support"
++	select SOC_AR71XX
++	select AR71XX_DEV_M25P80
++	select AR71XX_DEV_GPIO_BUTTONS
++	select AR71XX_DEV_PB42_PCI if PCI
++	select AR71XX_DEV_LEDS_GPIO
++	select AR71XX_DEV_USB
++	default n
 +
-+	default:
-+		BUG();
-+	}
-+}
-+EXPORT_SYMBOL_GPL(ar71xx_device_stop);
++config AR71XX_MACH_JWAP003
++	bool "jjPlus JWAP003 board support"
++	select SOC_AR71XX
++	select AR71XX_DEV_M25P80
++	select AR71XX_DEV_GPIO_BUTTONS
++	select AR71XX_DEV_PB42_PCI if PCI
++	select AR71XX_DEV_USB
++	default n
 +
-+void ar71xx_device_start(u32 mask)
-+{
-+	unsigned long flags;
-+	u32 mask_inv;
-+	u32 t;
++config AR71XX_MACH_PB42
++	bool "Atheros PB42 board support"
++	select SOC_AR71XX
++	select AR71XX_DEV_M25P80
++	select AR71XX_DEV_GPIO_BUTTONS
++	select AR71XX_DEV_PB42_PCI if PCI
++	default n
 +
-+	switch (ar71xx_soc) {
-+	case AR71XX_SOC_AR7130:
-+	case AR71XX_SOC_AR7141:
-+	case AR71XX_SOC_AR7161:
-+		spin_lock_irqsave(&ar71xx_device_lock, flags);
-+		t = ar71xx_reset_rr(AR71XX_RESET_REG_RESET_MODULE);
-+		ar71xx_reset_wr(AR71XX_RESET_REG_RESET_MODULE, t & ~mask);
-+		spin_unlock_irqrestore(&ar71xx_device_lock, flags);
-+		break;
++config AR71XX_MACH_PB44
++	bool "Atheros PB44 board support"
++	select SOC_AR71XX
++	select AR71XX_DEV_GPIO_BUTTONS
++	select AR71XX_DEV_PB42_PCI if PCI
++	select AR71XX_DEV_LEDS_GPIO
++	select AR71XX_DEV_USB
++	default n
 +
-+	case AR71XX_SOC_AR7240:
-+	case AR71XX_SOC_AR7241:
-+	case AR71XX_SOC_AR7242:
-+		mask_inv = mask & RESET_MODULE_USB_OHCI_DLL_7240;
-+		spin_lock_irqsave(&ar71xx_device_lock, flags);
-+		t = ar71xx_reset_rr(AR724X_RESET_REG_RESET_MODULE);
-+		t &= ~mask;
-+		t |= mask_inv;
-+		ar71xx_reset_wr(AR724X_RESET_REG_RESET_MODULE, t);
-+		spin_unlock_irqrestore(&ar71xx_device_lock, flags);
-+		break;
++config AR71XX_MACH_PB92
++	bool "Atheros PB92 board support"
++	select SOC_AR724X
++	select AR71XX_DEV_GPIO_BUTTONS
++	select AR71XX_DEV_PB9X_PCI if PCI
++	select AR71XX_DEV_LEDS_GPIO
++	select AR71XX_DEV_USB
++	default n
 +
-+	case AR71XX_SOC_AR9130:
-+	case AR71XX_SOC_AR9132:
-+		spin_lock_irqsave(&ar71xx_device_lock, flags);
-+		t = ar71xx_reset_rr(AR91XX_RESET_REG_RESET_MODULE);
-+		ar71xx_reset_wr(AR91XX_RESET_REG_RESET_MODULE, t & ~mask);
-+		spin_unlock_irqrestore(&ar71xx_device_lock, flags);
-+		break;
++config AR71XX_MACH_AW_NR580
++	bool "AzureWave AW-NR580 board support"
++	select SOC_AR71XX
++	select AR71XX_DEV_M25P80
++	select AR71XX_DEV_GPIO_BUTTONS
++	select AR71XX_DEV_PB42_PCI if PCI
++	select AR71XX_DEV_LEDS_GPIO
++	default n
 +
-+	case AR71XX_SOC_AR9330:
-+	case AR71XX_SOC_AR9331:
-+		spin_lock_irqsave(&ar71xx_device_lock, flags);
-+		t = ar71xx_reset_rr(AR933X_RESET_REG_RESET_MODULE);
-+		ar71xx_reset_wr(AR933X_RESET_REG_RESET_MODULE, t & ~mask);
-+		spin_unlock_irqrestore(&ar71xx_device_lock, flags);
-+		break;
++config AR71XX_MACH_WZR_HP_AG300H
++	bool "Buffalo WZR-HP-AG300H board support"
++	select SOC_AR71XX
++	select AR71XX_DEV_M25P80
++	select AR71XX_DEV_GPIO_BUTTONS
++	select AR71XX_DEV_LEDS_GPIO
++	select AR71XX_DEV_USB
++	default n
 +
-+	case AR71XX_SOC_AR9341:
-+	case AR71XX_SOC_AR9342:
-+	case AR71XX_SOC_AR9344:
-+		spin_lock_irqsave(&ar71xx_device_lock, flags);
-+		t = ar71xx_reset_rr(AR934X_RESET_REG_RESET_MODULE);
-+		ar71xx_reset_wr(AR934X_RESET_REG_RESET_MODULE, t & ~mask);
-+		spin_unlock_irqrestore(&ar71xx_device_lock, flags);
-+		break;
++config AR71XX_MACH_WZR_HP_G300NH
++	bool "Buffalo WZR-HP-G300NH board support"
++	select SOC_AR913X
++	select AR71XX_DEV_AR9XXX_WMAC
++	select AR71XX_DEV_GPIO_BUTTONS
++	select AR71XX_DEV_LEDS_GPIO
++	select AR71XX_DEV_USB
++	select RTL8366_SMI
++	default n
 +
-+	default:
-+		BUG();
-+	}
-+}
-+EXPORT_SYMBOL_GPL(ar71xx_device_start);
++config AR71XX_MACH_WP543
++	bool "Compex WP543/WPJ543 board support"
++	select SOC_AR71XX
++	select MYLOADER
++	select AR71XX_DEV_M25P80
++	select AR71XX_DEV_GPIO_BUTTONS
++	select AR71XX_DEV_PB42_PCI if PCI
++	select AR71XX_DEV_LEDS_GPIO
++	select AR71XX_DEV_USB
++	default n
 +
-+int ar71xx_device_stopped(u32 mask)
-+{
-+	unsigned long flags;
-+	u32 t;
++config AR71XX_MACH_WRT160NL
++	bool "Linksys WRT160NL board support"
++	select SOC_AR913X
++	select AR71XX_DEV_M25P80
++	select AR71XX_DEV_AR9XXX_WMAC
++	select AR71XX_DEV_GPIO_BUTTONS
++	select AR71XX_DEV_LEDS_GPIO
++	select AR71XX_DEV_USB
++	select AR71XX_NVRAM
++	default n
 +
-+	switch (ar71xx_soc) {
-+	case AR71XX_SOC_AR7130:
-+	case AR71XX_SOC_AR7141:
-+	case AR71XX_SOC_AR7161:
-+		spin_lock_irqsave(&ar71xx_device_lock, flags);
-+		t = ar71xx_reset_rr(AR71XX_RESET_REG_RESET_MODULE);
-+		spin_unlock_irqrestore(&ar71xx_device_lock, flags);
-+		break;
++config AR71XX_MACH_WRT400N
++	bool "Linksys WRT400N board support"
++	select SOC_AR71XX
++	select AR71XX_DEV_AP94_PCI if PCI
++	select AR71XX_DEV_M25P80
++	select AR71XX_DEV_GPIO_BUTTONS
++	select AR71XX_DEV_LEDS_GPIO
++	default n
 +
-+	case AR71XX_SOC_AR7240:
-+	case AR71XX_SOC_AR7241:
-+	case AR71XX_SOC_AR7242:
-+		spin_lock_irqsave(&ar71xx_device_lock, flags);
-+		t = ar71xx_reset_rr(AR724X_RESET_REG_RESET_MODULE);
-+		spin_unlock_irqrestore(&ar71xx_device_lock, flags);
-+		break;
++config AR71XX_MACH_RB4XX
++	bool "MikroTik RouterBOARD 4xx series support"
++	select SOC_AR71XX
++	select AR71XX_DEV_GPIO_BUTTONS
++	select AR71XX_DEV_LEDS_GPIO
++	select AR71XX_DEV_USB
++	default n
 +
-+	case AR71XX_SOC_AR9130:
-+	case AR71XX_SOC_AR9132:
-+		spin_lock_irqsave(&ar71xx_device_lock, flags);
-+		t = ar71xx_reset_rr(AR91XX_RESET_REG_RESET_MODULE);
-+		spin_unlock_irqrestore(&ar71xx_device_lock, flags);
-+		break;
++config AR71XX_MACH_RB750
++	bool "MikroTik RouterBOARD 750 support"
++	select SOC_AR724X
++	default n
 +
-+	case AR71XX_SOC_AR9330:
-+	case AR71XX_SOC_AR9331:
-+		spin_lock_irqsave(&ar71xx_device_lock, flags);
-+		t = ar71xx_reset_rr(AR933X_RESET_REG_RESET_MODULE);
-+		spin_unlock_irqrestore(&ar71xx_device_lock, flags);
-+		break;
++config AR71XX_MACH_WNDR3700
++	bool "NETGEAR WNDR3700 board support"
++	select SOC_AR71XX
++	select AR71XX_DEV_M25P80
++	select AR71XX_DEV_AP94_PCI if PCI
++	select AR71XX_DEV_GPIO_BUTTONS
++	select AR71XX_DEV_LEDS_GPIO
++	select AR71XX_DEV_USB
++	default n
 +
-+	case AR71XX_SOC_AR9341:
-+	case AR71XX_SOC_AR9342:
-+	case AR71XX_SOC_AR9344:
-+		spin_lock_irqsave(&ar71xx_device_lock, flags);
-+		t = ar71xx_reset_rr(AR934X_RESET_REG_RESET_MODULE);
-+		spin_unlock_irqrestore(&ar71xx_device_lock, flags);
-+		break;
++config AR71XX_MACH_WNR2000
++	bool "NETGEAR WNR2000 board support"
++	select SOC_AR913X
++	select AR71XX_DEV_M25P80
++	select AR71XX_DEV_AR9XXX_WMAC
++	select AR71XX_DEV_GPIO_BUTTONS
++	select AR71XX_DEV_LEDS_GPIO
++	default n
 +
-+	default:
-+		BUG();
-+	}
++config AR71XX_MACH_MZK_W04NU
++	bool "Planex MZK-W04NU board support"
++	select SOC_AR913X
++	select AR71XX_DEV_M25P80
++	select AR71XX_DEV_AR9XXX_WMAC
++	select AR71XX_DEV_GPIO_BUTTONS
++	select AR71XX_DEV_LEDS_GPIO
++	select AR71XX_DEV_USB
++	default n
 +
-+	return ((t & mask) == mask);
-+}
-+EXPORT_SYMBOL_GPL(ar71xx_device_stopped);
++config AR71XX_MACH_MZK_W300NH
++	bool "Planex MZK-W300NH board support"
++	select SOC_AR913X
++	select AR71XX_DEV_M25P80
++	select AR71XX_DEV_AR9XXX_WMAC
++	select AR71XX_DEV_GPIO_BUTTONS
++	select AR71XX_DEV_LEDS_GPIO
++	default n
 +
-+void ar71xx_ddr_flush(u32 reg)
-+{
-+	ar71xx_ddr_wr(reg, 1);
-+	while ((ar71xx_ddr_rr(reg) & 0x1))
-+		;
++config AR71XX_MACH_NBG460N
++	bool "Zyxel NBG460N/550N/550NH board support"
++	select SOC_AR913X
++	select AR71XX_DEV_M25P80
++	select AR71XX_DEV_AR9XXX_WMAC
++	select AR71XX_DEV_GPIO_BUTTONS
++	select AR71XX_DEV_LEDS_GPIO
++	default n
 +
-+	ar71xx_ddr_wr(reg, 1);
-+	while ((ar71xx_ddr_rr(reg) & 0x1))
-+		;
-+}
-+EXPORT_SYMBOL_GPL(ar71xx_ddr_flush);
++config AR71XX_MACH_TL_MR3X20
++	bool "TP-LINK TL-MR3220/3420 support"
++	select SOC_AR724X
++	select AR71XX_DEV_M25P80
++	select AR71XX_DEV_AP91_PCI if PCI
++	select AR71XX_DEV_GPIO_BUTTONS
++	select AR71XX_DEV_LEDS_GPIO
++	select AR71XX_DEV_USB
++	default n
 +
-+void ar71xx_flash_acquire(void)
-+{
-+	mutex_lock(&ar71xx_flash_mutex);
-+}
-+EXPORT_SYMBOL_GPL(ar71xx_flash_acquire);
++config AR71XX_MACH_TL_WA901ND
++	bool "TP-LINK TL-WA901ND support"
++	select SOC_AR724X
++	select AR71XX_DEV_M25P80
++	select AR71XX_DEV_AP91_PCI if PCI
++	select AR71XX_DEV_GPIO_BUTTONS
++	select AR71XX_DEV_LEDS_GPIO
++	default n
 +
-+void ar71xx_flash_release(void)
-+{
-+	mutex_unlock(&ar71xx_flash_mutex);
-+}
-+EXPORT_SYMBOL_GPL(ar71xx_flash_release);
-diff -Nur linux-2.6.39.orig/arch/mips/ar71xx/dev-ap91-pci.c linux-2.6.39/arch/mips/ar71xx/dev-ap91-pci.c
---- linux-2.6.39.orig/arch/mips/ar71xx/dev-ap91-pci.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.39/arch/mips/ar71xx/dev-ap91-pci.c	2011-08-24 02:41:55.277990824 +0200
-@@ -0,0 +1,71 @@
-+/*
-+ *  Atheros AP91 reference board PCI initialization
-+ *
-+ *  Copyright (C) 2009 Gabor Juhos <juhosg@openwrt.org>
-+ *
-+ *  This program is free software; you can redistribute it and/or modify it
-+ *  under the terms of the GNU General Public License version 2 as published
-+ *  by the Free Software Foundation.
-+ */
++config AR71XX_MACH_TL_WA901ND_V2
++	bool "TP-LINK TL-WA901ND v2 support"
++	select SOC_AR913X
++	select AR71XX_DEV_M25P80
++	select AR71XX_DEV_AR9XXX_WMAC
++	select AR71XX_DEV_GPIO_BUTTONS
++	select AR71XX_DEV_LEDS_GPIO
++	default n
 +
-+#include <linux/pci.h>
-+#include <linux/ath9k_platform.h>
-+#include <linux/delay.h>
++config AR71XX_MACH_TL_WR741ND
++	bool "TP-LINK TL-WR741ND support"
++	select SOC_AR724X
++	select AR71XX_DEV_M25P80
++	select AR71XX_DEV_AP91_PCI if PCI
++	select AR71XX_DEV_GPIO_BUTTONS
++	select AR71XX_DEV_LEDS_GPIO
++	default n
 +
-+#include <asm/mach-ar71xx/ar71xx.h>
-+#include <asm/mach-ar71xx/pci.h>
++config AR71XX_MACH_TL_WR841N_V1
++	bool "TP-LINK TL-WR841N v1 support"
++	select SOC_AR71XX
++	select AR71XX_DEV_M25P80
++	select AR71XX_DEV_PB42_PCI if PCI
++	select AR71XX_DEV_DSA
++	select AR71XX_DEV_GPIO_BUTTONS
++	select AR71XX_DEV_LEDS_GPIO
++	default n
 +
-+#include "dev-ap91-pci.h"
-+#include "pci-ath9k-fixup.h"
++config AR71XX_MACH_TL_WR941ND
++	bool "TP-LINK TL-WR941ND support"
++	select SOC_AR913X
++	select AR71XX_DEV_M25P80
++	select AR71XX_DEV_AR9XXX_WMAC
++	select AR71XX_DEV_DSA
++	select AR71XX_DEV_GPIO_BUTTONS
++	select AR71XX_DEV_LEDS_GPIO
++	default n
 +
-+static struct ath9k_platform_data ap91_wmac_data = {
-+	.led_pin = -1,
-+};
-+static char ap91_wmac_mac[6];
++config AR71XX_MACH_TL_WR1043ND
++	bool "TP-LINK TL-WR1043ND support"
++	select SOC_AR913X
++	select AR71XX_DEV_M25P80
++	select AR71XX_DEV_AR9XXX_WMAC
++	select AR71XX_DEV_GPIO_BUTTONS
++	select AR71XX_DEV_LEDS_GPIO
++	select AR71XX_DEV_USB
++	default n
 +
-+static struct ar71xx_pci_irq ap91_pci_irqs[] __initdata = {
-+	{
-+		.slot	= 0,
-+		.pin	= 1,
-+		.irq	= AR71XX_PCI_IRQ_DEV0,
-+	}
-+};
++config AR71XX_MACH_TEW_632BRP
++	bool "TRENDnet TEW-632BRP support"
++	select SOC_AR913X
++	select AR71XX_DEV_M25P80
++	select AR71XX_DEV_AR9XXX_WMAC
++	select AR71XX_DEV_GPIO_BUTTONS
++	select AR71XX_DEV_LEDS_GPIO
++	select AR71XX_NVRAM
++	default n
 +
-+static int ap91_pci_plat_dev_init(struct pci_dev *dev)
-+{
-+	switch (PCI_SLOT(dev->devfn)) {
-+	case 0:
-+		dev->dev.platform_data = &ap91_wmac_data;
-+		break;
-+	}
++config AR71XX_MACH_UBNT
++	bool "Ubiquiti AR71xx based boards support"
++	select SOC_AR71XX
++	select SOC_AR724X
++	select AR71XX_DEV_M25P80
++	select AR71XX_DEV_AP91_PCI if PCI
++	select AR71XX_DEV_GPIO_BUTTONS
++	select AR71XX_DEV_LEDS_GPIO
++	select AR71XX_DEV_PB42_PCI if PCI
++	select AR71XX_DEV_USB
++	default n
 +
-+	return 0;
-+}
++config AR71XX_MACH_EAP7660D
++	bool "Senao EAP7660D support"
++	select SOC_AR71XX
++	select AR71XX_DEV_M25P80
++	select AR71XX_DEV_GPIO_BUTTONS
++	select AR71XX_DEV_LEDS_GPIO
++	default n
 +
-+__init void ap91_pci_setup_wmac_led_pin(int pin)
-+{
-+	ap91_wmac_data.led_pin = pin;
-+}
++config AR71XX_MACH_ZCN_1523H
++	bool "Zcomax ZCN-1523H support"
++	select SOC_AR724X
++	select AR71XX_DEV_M25P80
++	select AR71XX_DEV_AP91_PCI if PCI
++	select AR71XX_DEV_GPIO_BUTTONS
++	select AR71XX_DEV_LEDS_GPIO
++	default n
 +
-+__init void ap91_pci_setup_wmac_gpio(u32 mask, u32 val)
-+{
-+	ap91_wmac_data.gpio_mask = mask;
-+	ap91_wmac_data.gpio_val = val;
-+}
++endmenu
 +
-+void __init ap91_pci_init(u8 *cal_data, u8 *mac_addr)
-+{
-+	if (cal_data)
-+		memcpy(ap91_wmac_data.eeprom_data, cal_data,
-+		       sizeof(ap91_wmac_data.eeprom_data));
++config SOC_AR71XX
++	bool
++	select USB_ARCH_HAS_EHCI
++	select USB_ARCH_HAS_OHCI
 +
-+	if (mac_addr) {
-+		memcpy(ap91_wmac_mac, mac_addr, sizeof(ap91_wmac_mac));
-+		ap91_wmac_data.macaddr = ap91_wmac_mac;
-+	}
++config SOC_AR724X
++	bool
++	select USB_ARCH_HAS_EHCI
++	select USB_ARCH_HAS_OHCI
 +
-+	ar71xx_pci_plat_dev_init = ap91_pci_plat_dev_init;
-+	ar71xx_pci_init(ARRAY_SIZE(ap91_pci_irqs), ap91_pci_irqs);
++config SOC_AR913X
++	bool
++	select USB_ARCH_HAS_EHCI
 +
-+	pci_enable_ath9k_fixup(0, ap91_wmac_data.eeprom_data);
-+}
-diff -Nur linux-2.6.39.orig/arch/mips/ar71xx/dev-ap91-pci.h linux-2.6.39/arch/mips/ar71xx/dev-ap91-pci.h
---- linux-2.6.39.orig/arch/mips/ar71xx/dev-ap91-pci.h	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.39/arch/mips/ar71xx/dev-ap91-pci.h	2011-08-24 02:41:55.287981779 +0200
-@@ -0,0 +1,25 @@
-+/*
-+ *  Atheros AP91 reference board PCI initialization
-+ *
-+ *  Copyright (C) 2009 Gabor Juhos <juhosg@openwrt.org>
-+ *
-+ *  This program is free software; you can redistribute it and/or modify it
-+ *  under the terms of the GNU General Public License version 2 as published
-+ *  by the Free Software Foundation.
-+ */
++config SOC_AR934X
++	bool
++	select USB_ARCH_HAS_EHCI
 +
-+#ifndef _AR71XX_DEV_AP91_PCI_H
-+#define _AR71XX_DEV_AP91_PCI_H
++config AR71XX_DEV_M25P80
++	def_bool n
 +
-+#if defined(CONFIG_AR71XX_DEV_AP91_PCI)
-+void ap91_pci_init(u8 *cal_data, u8 *mac_addr) __init;
-+void ap91_pci_setup_wmac_led_pin(int pin) __init;
-+void ap91_pci_setup_wmac_gpio(u32 mask, u32 val) __init;
-+#else
-+static inline void ap91_pci_init(u8 *cal_data, u8 *mac_addr) { }
-+static inline void ap91_pci_setup_wmac_led_pin(int pin) { }
-+static inline void ap91_pci_setup_wmac_gpio(u32 mask, u32 gpio) { }
-+#endif
++config AR71XX_DEV_AP91_PCI
++	select AR71XX_PCI_ATH9K_FIXUP
++	def_bool n
 +
-+#endif /* _AR71XX_DEV_AP91_PCI_H */
++config AR71XX_DEV_AP94_PCI
++	select AR71XX_PCI_ATH9K_FIXUP
++	def_bool n
 +
-diff -Nur linux-2.6.39.orig/arch/mips/ar71xx/dev-ap94-pci.c linux-2.6.39/arch/mips/ar71xx/dev-ap94-pci.c
---- linux-2.6.39.orig/arch/mips/ar71xx/dev-ap94-pci.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.39/arch/mips/ar71xx/dev-ap94-pci.c	2011-08-24 02:41:55.287981779 +0200
-@@ -0,0 +1,109 @@
-+/*
-+ *  Atheros AP94 reference board PCI initialization
-+ *
-+ *  Copyright (C) 2009-2010 Gabor Juhos <juhosg@openwrt.org>
-+ *
-+ *  This program is free software; you can redistribute it and/or modify it
-+ *  under the terms of the GNU General Public License version 2 as published
-+ *  by the Free Software Foundation.
-+ */
++config AR71XX_DEV_AR9XXX_WMAC
++	def_bool n
 +
-+#include <linux/pci.h>
-+#include <linux/ath9k_platform.h>
-+#include <linux/delay.h>
++config AR71XX_DEV_DB120_PCI
++	select AR71XX_PCI_ATH9K_FIXUP
++	def_bool n
 +
-+#include <asm/mach-ar71xx/ar71xx.h>
-+#include <asm/mach-ar71xx/pci.h>
++config AR71XX_DEV_DSA
++	def_bool n
 +
-+#include "dev-ap94-pci.h"
-+#include "pci-ath9k-fixup.h"
++config AR71XX_DEV_GPIO_BUTTONS
++	def_bool n
 +
-+static struct ath9k_platform_data ap94_wmac0_data = {
-+	.led_pin = -1,
-+};
-+static struct ath9k_platform_data ap94_wmac1_data = {
-+	.led_pin = -1,
-+};
-+static char ap94_wmac0_mac[6];
-+static char ap94_wmac1_mac[6];
++config AR71XX_DEV_LEDS_GPIO
++	def_bool n
 +
-+static struct ar71xx_pci_irq ap94_pci_irqs[] __initdata = {
-+	{
-+		.slot   = 0,
-+		.pin    = 1,
-+		.irq    = AR71XX_PCI_IRQ_DEV0,
-+	}, {
-+		.slot   = 1,
-+		.pin    = 1,
-+		.irq    = AR71XX_PCI_IRQ_DEV1,
-+	}
-+};
++config AR71XX_DEV_PB42_PCI
++	def_bool n
 +
-+static int ap94_pci_plat_dev_init(struct pci_dev *dev)
-+{
-+	switch (PCI_SLOT(dev->devfn)) {
-+	case 17:
-+		dev->dev.platform_data = &ap94_wmac0_data;
-+		break;
++config AR71XX_DEV_PB9X_PCI
++	def_bool n
 +
-+	case 18:
-+		dev->dev.platform_data = &ap94_wmac1_data;
-+		break;
-+	}
++config AR71XX_DEV_USB
++	def_bool n
 +
-+	return 0;
-+}
++config AR71XX_NVRAM
++	def_bool n
 +
-+__init void ap94_pci_setup_wmac_led_pin(unsigned wmac, int pin)
-+{
-+	switch (wmac) {
-+	case 0:
-+		ap94_wmac0_data.led_pin = pin;
-+		break;
-+	case 1:
-+		ap94_wmac1_data.led_pin = pin;
-+		break;
-+	}
-+}
-+
-+__init void ap94_pci_setup_wmac_gpio(unsigned wmac, u32 mask, u32 val)
-+{
-+	switch (wmac) {
-+	case 0:
-+		ap94_wmac0_data.gpio_mask = mask;
-+		ap94_wmac0_data.gpio_val = val;
-+		break;
-+	case 1:
-+		ap94_wmac1_data.gpio_mask = mask;
-+		ap94_wmac1_data.gpio_val = val;
-+		break;
-+	}
-+}
-+
-+void __init ap94_pci_init(u8 *cal_data0, u8 *mac_addr0,
-+			  u8 *cal_data1, u8 *mac_addr1)
-+{
-+	if (cal_data0)
-+		memcpy(ap94_wmac0_data.eeprom_data, cal_data0,
-+		       sizeof(ap94_wmac0_data.eeprom_data));
-+
-+	if (cal_data1)
-+		memcpy(ap94_wmac1_data.eeprom_data, cal_data1,
-+		       sizeof(ap94_wmac1_data.eeprom_data));
-+
-+	if (mac_addr0) {
-+		memcpy(ap94_wmac0_mac, mac_addr0, sizeof(ap94_wmac0_mac));
-+		ap94_wmac0_data.macaddr = ap94_wmac0_mac;
-+	}
-+
-+	if (mac_addr1) {
-+		memcpy(ap94_wmac1_mac, mac_addr1, sizeof(ap94_wmac1_mac));
-+		ap94_wmac1_data.macaddr = ap94_wmac1_mac;
-+	}
-+
-+	ar71xx_pci_plat_dev_init = ap94_pci_plat_dev_init;
-+	ar71xx_pci_init(ARRAY_SIZE(ap94_pci_irqs), ap94_pci_irqs);
-+
-+	pci_enable_ath9k_fixup(17, ap94_wmac0_data.eeprom_data);
-+	pci_enable_ath9k_fixup(18, ap94_wmac1_data.eeprom_data);
-+}
-diff -Nur linux-2.6.39.orig/arch/mips/ar71xx/dev-ap94-pci.h linux-2.6.39/arch/mips/ar71xx/dev-ap94-pci.h
---- linux-2.6.39.orig/arch/mips/ar71xx/dev-ap94-pci.h	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.39/arch/mips/ar71xx/dev-ap94-pci.h	2011-08-24 02:41:55.287981779 +0200
-@@ -0,0 +1,31 @@
-+/*
-+ *  Atheros AP94 reference board PCI initialization
-+ *
-+ *  Copyright (C) 2009-2010 Gabor Juhos <juhosg@openwrt.org>
-+ *
-+ *  This program is free software; you can redistribute it and/or modify it
-+ *  under the terms of the GNU General Public License version 2 as published
-+ *  by the Free Software Foundation.
-+ */
++config AR71XX_PCI_ATH9K_FIXUP
++	def_bool n
 +
-+#ifndef _AR71XX_DEV_AP94_PCI_H
-+#define _AR71XX_DEV_AP94_PCI_H
++config SOC_AR933X
++	bool
++	select USB_ARCH_HAS_EHCI
 +
-+#if defined(CONFIG_AR71XX_DEV_AP94_PCI)
-+void ap94_pci_init(u8 *cal_data0, u8 *mac_addr0,
-+		   u8 *cal_data1, u8 *mac_addr1) __init;
++endif
+diff -Nur linux-2.6.39.orig/arch/mips/ar71xx/Makefile linux-2.6.39/arch/mips/ar71xx/Makefile
+--- linux-2.6.39.orig/arch/mips/ar71xx/Makefile	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.39/arch/mips/ar71xx/Makefile	2011-08-24 18:17:23.000000000 +0200
+@@ -0,0 +1,67 @@
++#
++# Makefile for the Atheros AR71xx SoC specific parts of the kernel
++#
++# Copyright (C) 2008-2009 Gabor Juhos <juhosg@openwrt.org>
++# Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
++#
++# This program is free software; you can redistribute it and/or modify it
++# under the terms of the GNU General Public License version 2 as published
++# by the Free Software Foundation.
 +
-+void ap94_pci_setup_wmac_led_pin(unsigned wmac, int pin) __init;
-+void ap94_pci_setup_wmac_gpio(unsigned wmac, u32 mask, u32 val) __init;
++obj-y	:= prom.o irq.o setup.o devices.o gpio.o ar71xx.o
 +
-+#else
-+static inline void ap94_pci_init(u8 *cal_data0, u8 *mac_addr0,
-+				 u8 *cal_data1, u8 *mac_addr1) {}
++obj-$(CONFIG_EARLY_PRINTK)		+= early_printk.o
++obj-$(CONFIG_PCI)			+= pci.o
 +
-+static inline void ap94_pci_setup_wmac_led_pin(unsigned wmac, int pin) {}
-+static inline void ap94_pci_setup_wmac_gpio(unsigned wmac,
-+					    u32 mask, u32 val) {}
-+#endif
++obj-$(CONFIG_AR71XX_DEV_AP91_PCI)	+= dev-ap91-pci.o
++obj-$(CONFIG_AR71XX_DEV_AP94_PCI)	+= dev-ap94-pci.o
++obj-$(CONFIG_AR71XX_DEV_AR9XXX_WMAC)	+= dev-ar9xxx-wmac.o
++obj-$(CONFIG_AR71XX_DEV_DB120_PCI)	+= dev-db120-pci.o
++obj-$(CONFIG_AR71XX_DEV_DSA)		+= dev-dsa.o
++obj-$(CONFIG_AR71XX_DEV_GPIO_BUTTONS)	+= dev-gpio-buttons.o
++obj-$(CONFIG_AR71XX_DEV_LEDS_GPIO)	+= dev-leds-gpio.o
++obj-$(CONFIG_AR71XX_DEV_M25P80)		+= dev-m25p80.o
++obj-$(CONFIG_AR71XX_DEV_PB42_PCI)	+= dev-pb42-pci.o
++obj-$(CONFIG_AR71XX_DEV_PB9X_PCI)	+= dev-pb9x-pci.o
++obj-$(CONFIG_AR71XX_DEV_USB)		+= dev-usb.o
 +
-+#endif /* _AR71XX_DEV_AP94_PCI_H */
++obj-$(CONFIG_AR71XX_NVRAM)		+= nvram.o
++obj-$(CONFIG_AR71XX_PCI_ATH9K_FIXUP)	+= pci-ath9k-fixup.o
 +
-diff -Nur linux-2.6.39.orig/arch/mips/ar71xx/dev-ar9xxx-wmac.c linux-2.6.39/arch/mips/ar71xx/dev-ar9xxx-wmac.c
---- linux-2.6.39.orig/arch/mips/ar71xx/dev-ar9xxx-wmac.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.39/arch/mips/ar71xx/dev-ar9xxx-wmac.c	2011-08-24 02:41:55.287981779 +0200
-@@ -0,0 +1,154 @@
++obj-$(CONFIG_AR71XX_MACH_AP121)		+= mach-ap121.o
++obj-$(CONFIG_AR71XX_MACH_AP81)		+= mach-ap81.o
++obj-$(CONFIG_AR71XX_MACH_AP83)		+= mach-ap83.o
++obj-$(CONFIG_AR71XX_MACH_AP96)		+= mach-ap96.o
++obj-$(CONFIG_AR71XX_MACH_AW_NR580)	+= mach-aw-nr580.o
++obj-$(CONFIG_AR71XX_MACH_DB120)		+= mach-db120.o
++obj-$(CONFIG_AR71XX_MACH_DIR_600_A1)	+= mach-dir-600-a1.o
++obj-$(CONFIG_AR71XX_MACH_DIR_615_C1)	+= mach-dir-615-c1.o
++obj-$(CONFIG_AR71XX_MACH_DIR_825_B1)	+= mach-dir-825-b1.o
++obj-$(CONFIG_AR71XX_MACH_EAP7660D)	+= mach-eap7660d.o
++obj-$(CONFIG_AR71XX_MACH_JA76PF)	+= mach-ja76pf.o
++obj-$(CONFIG_AR71XX_MACH_JWAP003)	+= mach-jwap003.o
++obj-$(CONFIG_AR71XX_MACH_MZK_W04NU)	+= mach-mzk-w04nu.o
++obj-$(CONFIG_AR71XX_MACH_MZK_W300NH)	+= mach-mzk-w300nh.o
++obj-$(CONFIG_AR71XX_MACH_NBG460N)	+= mach-nbg460n.o
++obj-$(CONFIG_AR71XX_MACH_PB42)		+= mach-pb42.o
++obj-$(CONFIG_AR71XX_MACH_PB44)		+= mach-pb44.o
++obj-$(CONFIG_AR71XX_MACH_PB92)		+= mach-pb92.o
++obj-$(CONFIG_AR71XX_MACH_RB4XX)		+= mach-rb4xx.o
++obj-$(CONFIG_AR71XX_MACH_RB750)		+= mach-rb750.o
++obj-$(CONFIG_AR71XX_MACH_TEW_632BRP)	+= mach-tew-632brp.o
++obj-$(CONFIG_AR71XX_MACH_TL_MR3X20)	+= mach-tl-mr3x20.o
++obj-$(CONFIG_AR71XX_MACH_TL_WA901ND)	+= mach-tl-wa901nd.o
++obj-$(CONFIG_AR71XX_MACH_TL_WA901ND_V2)	+= mach-tl-wa901nd-v2.o
++obj-$(CONFIG_AR71XX_MACH_TL_WR741ND)	+= mach-tl-wr741nd.o
++obj-$(CONFIG_AR71XX_MACH_TL_WR841N_V1)	+= mach-tl-wr841n.o
++obj-$(CONFIG_AR71XX_MACH_TL_WR941ND)	+= mach-tl-wr941nd.o
++obj-$(CONFIG_AR71XX_MACH_TL_WR1043ND)	+= mach-tl-wr1043nd.o
++obj-$(CONFIG_AR71XX_MACH_UBNT)		+= mach-ubnt.o
++obj-$(CONFIG_AR71XX_MACH_WNDR3700)	+= mach-wndr3700.o
++obj-$(CONFIG_AR71XX_MACH_WNR2000)	+= mach-wnr2000.o
++obj-$(CONFIG_AR71XX_MACH_WP543)		+= mach-wp543.o
++obj-$(CONFIG_AR71XX_MACH_WRT160NL)	+= mach-wrt160nl.o
++obj-$(CONFIG_AR71XX_MACH_WRT400N)	+= mach-wrt400n.o
++obj-$(CONFIG_AR71XX_MACH_WZR_HP_G300NH)	+= mach-wzr-hp-g300nh.o
++obj-$(CONFIG_AR71XX_MACH_WZR_HP_AG300H)	+= mach-wzr-hp-ag300h.o
++obj-$(CONFIG_AR71XX_MACH_ZCN_1523H)	+= mach-zcn-1523h.o
+diff -Nur linux-2.6.39.orig/arch/mips/ar71xx/ar71xx.c linux-2.6.39/arch/mips/ar71xx/ar71xx.c
+--- linux-2.6.39.orig/arch/mips/ar71xx/ar71xx.c	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.39/arch/mips/ar71xx/ar71xx.c	2011-08-24 18:17:23.000000000 +0200
+@@ -0,0 +1,230 @@
 +/*
-+ *  Atheros AR9XXX SoCs built-in WMAC device support
++ *  AR71xx SoC routines
 + *
-+ *  Copyright (C) 2010-2011 Jaiganesh Narayanan <jnarayanan@atheros.com>
 + *  Copyright (C) 2008-2009 Gabor Juhos <juhosg@openwrt.org>
 + *  Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
 + *
-+ *  Parts of this file are based on Atheros 2.6.15/2.6.31 BSP
-+ *
 + *  This program is free software; you can redistribute it and/or modify it
 + *  under the terms of the GNU General Public License version 2 as published
 + *  by the Free Software Foundation.
 + */
 +
 +#include <linux/kernel.h>
-+#include <linux/init.h>
-+#include <linux/delay.h>
-+#include <linux/etherdevice.h>
-+#include <linux/platform_device.h>
-+#include <linux/ath9k_platform.h>
++#include <linux/module.h>
++#include <linux/types.h>
++#include <linux/mutex.h>
++#include <linux/spinlock.h>
 +
 +#include <asm/mach-ar71xx/ar71xx.h>
 +
-+#include "dev-ar9xxx-wmac.h"
-+
-+#define MHZ_25	(25 * 1000 * 1000)
-+
-+static struct ath9k_platform_data ar9xxx_wmac_data = {
-+	.led_pin = -1,
-+};
-+static char ar9xxx_wmac_mac[6];
-+
-+static struct resource ar9xxx_wmac_resources[] = {
-+	{
-+		/* .start and .end fields are filled dynamically */
-+		.flags	= IORESOURCE_MEM,
-+	}, {
-+		.start	= AR71XX_CPU_IRQ_IP2,
-+		.end	= AR71XX_CPU_IRQ_IP2,
-+		.flags	= IORESOURCE_IRQ,
-+	},
-+};
++static DEFINE_MUTEX(ar71xx_flash_mutex);
++static DEFINE_SPINLOCK(ar71xx_device_lock);
 +
-+static struct platform_device ar9xxx_wmac_device = {
-+	.name		= "ath9k",
-+	.id		= -1,
-+	.resource	= ar9xxx_wmac_resources,
-+	.num_resources	= ARRAY_SIZE(ar9xxx_wmac_resources),
-+	.dev = {
-+		.platform_data = &ar9xxx_wmac_data,
-+	},
-+};
++void __iomem *ar71xx_ddr_base;
++EXPORT_SYMBOL_GPL(ar71xx_ddr_base);
 +
-+static void ar913x_wmac_init(void)
-+{
-+	ar71xx_device_stop(RESET_MODULE_AMBA2WMAC);
-+	mdelay(10);
++void __iomem *ar71xx_pll_base;
++EXPORT_SYMBOL_GPL(ar71xx_pll_base);
 +
-+	ar71xx_device_start(RESET_MODULE_AMBA2WMAC);
-+	mdelay(10);
++void __iomem *ar71xx_reset_base;
++EXPORT_SYMBOL_GPL(ar71xx_reset_base);
 +
-+	ar9xxx_wmac_resources[0].start = AR91XX_WMAC_BASE;
-+	ar9xxx_wmac_resources[0].end = AR91XX_WMAC_BASE + AR91XX_WMAC_SIZE - 1;
-+}
++void __iomem *ar71xx_gpio_base;
++EXPORT_SYMBOL_GPL(ar71xx_gpio_base);
 +
-+static int ar933x_r1_get_wmac_revision(void)
-+{
-+	return ar71xx_soc_rev;
-+}
++void __iomem *ar71xx_usb_ctrl_base;
++EXPORT_SYMBOL_GPL(ar71xx_usb_ctrl_base);
 +
-+static int ar933x_wmac_reset(void)
++void ar71xx_device_stop(u32 mask)
 +{
-+	unsigned retries = 0;
++	unsigned long flags;
++	u32 mask_inv;
++	u32 t;
 +
-+	ar71xx_device_stop(AR933X_RESET_WMAC);
-+	ar71xx_device_start(AR933X_RESET_WMAC);
++	switch (ar71xx_soc) {
++	case AR71XX_SOC_AR7130:
++	case AR71XX_SOC_AR7141:
++	case AR71XX_SOC_AR7161:
++		spin_lock_irqsave(&ar71xx_device_lock, flags);
++		t = ar71xx_reset_rr(AR71XX_RESET_REG_RESET_MODULE);
++		ar71xx_reset_wr(AR71XX_RESET_REG_RESET_MODULE, t | mask);
++		spin_unlock_irqrestore(&ar71xx_device_lock, flags);
++		break;
 +
-+	while (1) {
-+		u32 bootstrap;
++	case AR71XX_SOC_AR7240:
++	case AR71XX_SOC_AR7241:
++	case AR71XX_SOC_AR7242:
++		mask_inv = mask & RESET_MODULE_USB_OHCI_DLL_7240;
++		spin_lock_irqsave(&ar71xx_device_lock, flags);
++		t = ar71xx_reset_rr(AR724X_RESET_REG_RESET_MODULE);
++		t |= mask;
++		t &= ~mask_inv;
++		ar71xx_reset_wr(AR724X_RESET_REG_RESET_MODULE, t);
++		spin_unlock_irqrestore(&ar71xx_device_lock, flags);
++		break;
 +
-+		bootstrap = ar71xx_reset_rr(AR933X_RESET_REG_BOOTSTRAP);
-+		if ((bootstrap & AR933X_BOOTSTRAP_EEPBUSY) == 0)
-+			return 0;
++	case AR71XX_SOC_AR9130:
++	case AR71XX_SOC_AR9132:
++		spin_lock_irqsave(&ar71xx_device_lock, flags);
++		t = ar71xx_reset_rr(AR91XX_RESET_REG_RESET_MODULE);
++		ar71xx_reset_wr(AR91XX_RESET_REG_RESET_MODULE, t | mask);
++		spin_unlock_irqrestore(&ar71xx_device_lock, flags);
++		break;
 +
-+		if (retries > 20)
-+			break;
++	case AR71XX_SOC_AR9330:
++	case AR71XX_SOC_AR9331:
++		spin_lock_irqsave(&ar71xx_device_lock, flags);
++		t = ar71xx_reset_rr(AR933X_RESET_REG_RESET_MODULE);
++		ar71xx_reset_wr(AR933X_RESET_REG_RESET_MODULE, t | mask);
++		spin_unlock_irqrestore(&ar71xx_device_lock, flags);
++		break;
 +
-+		udelay(10000);
-+		retries++;
-+	}
++	case AR71XX_SOC_AR9341:
++	case AR71XX_SOC_AR9342:
++	case AR71XX_SOC_AR9344:
++		spin_lock_irqsave(&ar71xx_device_lock, flags);
++		t = ar71xx_reset_rr(AR934X_RESET_REG_RESET_MODULE);
++		ar71xx_reset_wr(AR934X_RESET_REG_RESET_MODULE, t | mask);
++		spin_unlock_irqrestore(&ar71xx_device_lock, flags);
++		break;
 +
-+	pr_err("ar93xx: WMAC reset timed out");
-+	return -ETIMEDOUT;
++	default:
++		BUG();
++	}
 +}
++EXPORT_SYMBOL_GPL(ar71xx_device_stop);
 +
-+static void ar933x_wmac_init(void)
++void ar71xx_device_start(u32 mask)
 +{
-+	ar9xxx_wmac_device.name = "ar933x_wmac";
-+	ar9xxx_wmac_resources[0].start = AR933X_WMAC_BASE;
-+	ar9xxx_wmac_resources[0].end = AR933X_WMAC_BASE + AR933X_WMAC_SIZE - 1;
-+	if (ar71xx_ref_freq == MHZ_25)
-+		ar9xxx_wmac_data.is_clk_25mhz = true;
++	unsigned long flags;
++	u32 mask_inv;
++	u32 t;
 +
-+	if (ar71xx_soc_rev == 1)
-+		ar9xxx_wmac_data.get_mac_revision = ar933x_r1_get_wmac_revision;
++	switch (ar71xx_soc) {
++	case AR71XX_SOC_AR7130:
++	case AR71XX_SOC_AR7141:
++	case AR71XX_SOC_AR7161:
++		spin_lock_irqsave(&ar71xx_device_lock, flags);
++		t = ar71xx_reset_rr(AR71XX_RESET_REG_RESET_MODULE);
++		ar71xx_reset_wr(AR71XX_RESET_REG_RESET_MODULE, t & ~mask);
++		spin_unlock_irqrestore(&ar71xx_device_lock, flags);
++		break;
 +
-+	ar9xxx_wmac_data.external_reset = ar933x_wmac_reset;
++	case AR71XX_SOC_AR7240:
++	case AR71XX_SOC_AR7241:
++	case AR71XX_SOC_AR7242:
++		mask_inv = mask & RESET_MODULE_USB_OHCI_DLL_7240;
++		spin_lock_irqsave(&ar71xx_device_lock, flags);
++		t = ar71xx_reset_rr(AR724X_RESET_REG_RESET_MODULE);
++		t &= ~mask;
++		t |= mask_inv;
++		ar71xx_reset_wr(AR724X_RESET_REG_RESET_MODULE, t);
++		spin_unlock_irqrestore(&ar71xx_device_lock, flags);
++		break;
 +
-+	ar933x_wmac_reset();
-+}
++	case AR71XX_SOC_AR9130:
++	case AR71XX_SOC_AR9132:
++		spin_lock_irqsave(&ar71xx_device_lock, flags);
++		t = ar71xx_reset_rr(AR91XX_RESET_REG_RESET_MODULE);
++		ar71xx_reset_wr(AR91XX_RESET_REG_RESET_MODULE, t & ~mask);
++		spin_unlock_irqrestore(&ar71xx_device_lock, flags);
++		break;
 +
-+static void ar934x_wmac_init(void)
-+{
-+	ar9xxx_wmac_device.name = "ar934x_wmac";
-+	ar9xxx_wmac_resources[0].start = AR934X_WMAC_BASE;
-+	ar9xxx_wmac_resources[0].end = AR934X_WMAC_BASE + AR934X_WMAC_SIZE - 1;
-+	if (ar71xx_ref_freq == MHZ_25)
-+		ar9xxx_wmac_data.is_clk_25mhz = true;
++	case AR71XX_SOC_AR9330:
++	case AR71XX_SOC_AR9331:
++		spin_lock_irqsave(&ar71xx_device_lock, flags);
++		t = ar71xx_reset_rr(AR933X_RESET_REG_RESET_MODULE);
++		ar71xx_reset_wr(AR933X_RESET_REG_RESET_MODULE, t & ~mask);
++		spin_unlock_irqrestore(&ar71xx_device_lock, flags);
++		break;
++
++	case AR71XX_SOC_AR9341:
++	case AR71XX_SOC_AR9342:
++	case AR71XX_SOC_AR9344:
++		spin_lock_irqsave(&ar71xx_device_lock, flags);
++		t = ar71xx_reset_rr(AR934X_RESET_REG_RESET_MODULE);
++		ar71xx_reset_wr(AR934X_RESET_REG_RESET_MODULE, t & ~mask);
++		spin_unlock_irqrestore(&ar71xx_device_lock, flags);
++		break;
++
++	default:
++		BUG();
++	}
 +}
++EXPORT_SYMBOL_GPL(ar71xx_device_start);
 +
-+void __init ar9xxx_add_device_wmac(u8 *cal_data, u8 *mac_addr)
++int ar71xx_device_stopped(u32 mask)
 +{
++	unsigned long flags;
++	u32 t;
++
 +	switch (ar71xx_soc) {
++	case AR71XX_SOC_AR7130:
++	case AR71XX_SOC_AR7141:
++	case AR71XX_SOC_AR7161:
++		spin_lock_irqsave(&ar71xx_device_lock, flags);
++		t = ar71xx_reset_rr(AR71XX_RESET_REG_RESET_MODULE);
++		spin_unlock_irqrestore(&ar71xx_device_lock, flags);
++		break;
++
++	case AR71XX_SOC_AR7240:
++	case AR71XX_SOC_AR7241:
++	case AR71XX_SOC_AR7242:
++		spin_lock_irqsave(&ar71xx_device_lock, flags);
++		t = ar71xx_reset_rr(AR724X_RESET_REG_RESET_MODULE);
++		spin_unlock_irqrestore(&ar71xx_device_lock, flags);
++		break;
++
 +	case AR71XX_SOC_AR9130:
 +	case AR71XX_SOC_AR9132:
-+		ar913x_wmac_init();
++		spin_lock_irqsave(&ar71xx_device_lock, flags);
++		t = ar71xx_reset_rr(AR91XX_RESET_REG_RESET_MODULE);
++		spin_unlock_irqrestore(&ar71xx_device_lock, flags);
 +		break;
 +
 +	case AR71XX_SOC_AR9330:
 +	case AR71XX_SOC_AR9331:
-+		ar933x_wmac_init();
++		spin_lock_irqsave(&ar71xx_device_lock, flags);
++		t = ar71xx_reset_rr(AR933X_RESET_REG_RESET_MODULE);
++		spin_unlock_irqrestore(&ar71xx_device_lock, flags);
 +		break;
 +
 +	case AR71XX_SOC_AR9341:
 +	case AR71XX_SOC_AR9342:
 +	case AR71XX_SOC_AR9344:
-+		ar934x_wmac_init();
++		spin_lock_irqsave(&ar71xx_device_lock, flags);
++		t = ar71xx_reset_rr(AR934X_RESET_REG_RESET_MODULE);
++		spin_unlock_irqrestore(&ar71xx_device_lock, flags);
 +		break;
 +
 +	default:
 +		BUG();
 +	}
 +
-+	if (cal_data)
-+		memcpy(ar9xxx_wmac_data.eeprom_data, cal_data,
-+		       sizeof(ar9xxx_wmac_data.eeprom_data));
++	return ((t & mask) == mask);
++}
++EXPORT_SYMBOL_GPL(ar71xx_device_stopped);
 +
-+	if (mac_addr) {
-+		memcpy(ar9xxx_wmac_mac, mac_addr, sizeof(ar9xxx_wmac_mac));
-+		ar9xxx_wmac_data.macaddr = ar9xxx_wmac_mac;
-+	}
++void ar71xx_ddr_flush(u32 reg)
++{
++	ar71xx_ddr_wr(reg, 1);
++	while ((ar71xx_ddr_rr(reg) & 0x1))
++		;
 +
-+	platform_device_register(&ar9xxx_wmac_device);
++	ar71xx_ddr_wr(reg, 1);
++	while ((ar71xx_ddr_rr(reg) & 0x1))
++		;
 +}
-diff -Nur linux-2.6.39.orig/arch/mips/ar71xx/dev-ar9xxx-wmac.h linux-2.6.39/arch/mips/ar71xx/dev-ar9xxx-wmac.h
---- linux-2.6.39.orig/arch/mips/ar71xx/dev-ar9xxx-wmac.h	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.39/arch/mips/ar71xx/dev-ar9xxx-wmac.h	2011-08-24 02:41:55.297981663 +0200
-@@ -0,0 +1,20 @@
-+/*
-+ *  Atheros AR9XXX SoCs built-in WMAC device support
-+ *
-+ *  Copyright (C) 2010-2011 Jaiganesh Narayanan <jnarayanan@atheros.com>
-+ *  Copyright (C) 2008-2009 Gabor Juhos <juhosg@openwrt.org>
-+ *  Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
-+ *
-+ *  Parts of this file are based on Atheros 2.6.15/2.6.31 BSP
-+ *
-+ *  This program is free software; you can redistribute it and/or modify it
-+ *  under the terms of the GNU General Public License version 2 as published
-+ *  by the Free Software Foundation.
-+ */
-+
-+#ifndef _AR71XX_DEV_AR9XXX_WMAC_H
-+#define _AR71XX_DEV_AR9XXX_WMAC_H
++EXPORT_SYMBOL_GPL(ar71xx_ddr_flush);
 +
-+void ar9xxx_add_device_wmac(u8 *cal_data, u8 *mac_addr) __init;
++void ar71xx_flash_acquire(void)
++{
++	mutex_lock(&ar71xx_flash_mutex);
++}
++EXPORT_SYMBOL_GPL(ar71xx_flash_acquire);
 +
-+#endif /* _AR71XX_DEV_AR9XXX_WMAC_H */
-diff -Nur linux-2.6.39.orig/arch/mips/ar71xx/dev-db120-pci.c linux-2.6.39/arch/mips/ar71xx/dev-db120-pci.c
---- linux-2.6.39.orig/arch/mips/ar71xx/dev-db120-pci.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.39/arch/mips/ar71xx/dev-db120-pci.c	2011-08-24 02:41:55.317990461 +0200
-@@ -0,0 +1,31 @@
++void ar71xx_flash_release(void)
++{
++	mutex_unlock(&ar71xx_flash_mutex);
++}
++EXPORT_SYMBOL_GPL(ar71xx_flash_release);
+diff -Nur linux-2.6.39.orig/arch/mips/ar71xx/dev-ap91-pci.c linux-2.6.39/arch/mips/ar71xx/dev-ap91-pci.c
+--- linux-2.6.39.orig/arch/mips/ar71xx/dev-ap91-pci.c	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.39/arch/mips/ar71xx/dev-ap91-pci.c	2011-08-24 18:17:23.000000000 +0200
+@@ -0,0 +1,71 @@
 +/*
-+ *  Atheros db120 reference board PCI initialization
-+ *
-+ *  Copyright (C) 2010-2011 Jaiganesh Narayanan <jnarayanan@atheros.com>
++ *  Atheros AP91 reference board PCI initialization
 + *
-+ *  Parts of this file are based on Atheros linux 2.6.31 BSP
++ *  Copyright (C) 2009 Gabor Juhos <juhosg@openwrt.org>
 + *
 + *  This program is free software; you can redistribute it and/or modify it
 + *  under the terms of the GNU General Public License version 2 as published
@@ -683,13 +812,21 @@ diff -Nur linux-2.6.39.orig/arch/mips/ar71xx/dev-db120-pci.c linux-2.6.39/arch/m
 + */
 +
 +#include <linux/pci.h>
++#include <linux/ath9k_platform.h>
++#include <linux/delay.h>
 +
 +#include <asm/mach-ar71xx/ar71xx.h>
 +#include <asm/mach-ar71xx/pci.h>
 +
-+#include "dev-db120-pci.h"
++#include "dev-ap91-pci.h"
++#include "pci-ath9k-fixup.h"
 +
-+static struct ar71xx_pci_irq db120_pci_irqs[] __initdata = {
++static struct ath9k_platform_data ap91_wmac_data = {
++	.led_pin = -1,
++};
++static char ap91_wmac_mac[6];
++
++static struct ar71xx_pci_irq ap91_pci_irqs[] __initdata = {
 +	{
 +		.slot	= 0,
 +		.pin	= 1,
@@ -697,216 +834,233 @@ diff -Nur linux-2.6.39.orig/arch/mips/ar71xx/dev-db120-pci.c linux-2.6.39/arch/m
 +	}
 +};
 +
-+void __init db120_pci_init(void)
++static int ap91_pci_plat_dev_init(struct pci_dev *dev)
 +{
-+	ar71xx_pci_init(ARRAY_SIZE(db120_pci_irqs), db120_pci_irqs);
++	switch (PCI_SLOT(dev->devfn)) {
++	case 0:
++		dev->dev.platform_data = &ap91_wmac_data;
++		break;
++	}
++
++	return 0;
 +}
-diff -Nur linux-2.6.39.orig/arch/mips/ar71xx/dev-db120-pci.h linux-2.6.39/arch/mips/ar71xx/dev-db120-pci.h
---- linux-2.6.39.orig/arch/mips/ar71xx/dev-db120-pci.h	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.39/arch/mips/ar71xx/dev-db120-pci.h	2011-08-24 02:41:55.327990934 +0200
-@@ -0,0 +1,22 @@
++
++__init void ap91_pci_setup_wmac_led_pin(int pin)
++{
++	ap91_wmac_data.led_pin = pin;
++}
++
++__init void ap91_pci_setup_wmac_gpio(u32 mask, u32 val)
++{
++	ap91_wmac_data.gpio_mask = mask;
++	ap91_wmac_data.gpio_val = val;
++}
++
++void __init ap91_pci_init(u8 *cal_data, u8 *mac_addr)
++{
++	if (cal_data)
++		memcpy(ap91_wmac_data.eeprom_data, cal_data,
++		       sizeof(ap91_wmac_data.eeprom_data));
++
++	if (mac_addr) {
++		memcpy(ap91_wmac_mac, mac_addr, sizeof(ap91_wmac_mac));
++		ap91_wmac_data.macaddr = ap91_wmac_mac;
++	}
++
++	ar71xx_pci_plat_dev_init = ap91_pci_plat_dev_init;
++	ar71xx_pci_init(ARRAY_SIZE(ap91_pci_irqs), ap91_pci_irqs);
++
++	pci_enable_ath9k_fixup(0, ap91_wmac_data.eeprom_data);
++}
+diff -Nur linux-2.6.39.orig/arch/mips/ar71xx/dev-ap91-pci.h linux-2.6.39/arch/mips/ar71xx/dev-ap91-pci.h
+--- linux-2.6.39.orig/arch/mips/ar71xx/dev-ap91-pci.h	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.39/arch/mips/ar71xx/dev-ap91-pci.h	2011-08-24 18:17:23.000000000 +0200
+@@ -0,0 +1,25 @@
 +/*
-+ *  Atheros DB120 reference board PCI initialization
-+ *
-+ *  Copyright (C) 2010-2011 Jaiganesh Narayanan <jnarayanan@atheros.com>
++ *  Atheros AP91 reference board PCI initialization
 + *
-+ *  Parts of this file are based on Atheros linux 2.6.31 BSP
++ *  Copyright (C) 2009 Gabor Juhos <juhosg@openwrt.org>
 + *
 + *  This program is free software; you can redistribute it and/or modify it
 + *  under the terms of the GNU General Public License version 2 as published
 + *  by the Free Software Foundation.
 + */
 +
-+#ifndef _AR71XX_DEV_DB120_PCI_H
-+#define _AR71XX_DEV_DB120_PCI_H
-+
-+#if defined(CONFIG_AR71XX_DEV_DB120_PCI)
-+void db120_pci_init(void);
++#ifndef _AR71XX_DEV_AP91_PCI_H
++#define _AR71XX_DEV_AP91_PCI_H
++
++#if defined(CONFIG_AR71XX_DEV_AP91_PCI)
++void ap91_pci_init(u8 *cal_data, u8 *mac_addr) __init;
++void ap91_pci_setup_wmac_led_pin(int pin) __init;
++void ap91_pci_setup_wmac_gpio(u32 mask, u32 val) __init;
 +#else
-+static inline void db120_pci_init(void) { }
++static inline void ap91_pci_init(u8 *cal_data, u8 *mac_addr) { }
++static inline void ap91_pci_setup_wmac_led_pin(int pin) { }
++static inline void ap91_pci_setup_wmac_gpio(u32 mask, u32 gpio) { }
 +#endif
 +
-+#endif /* _AR71XX_DEV_DB120_PCI_H */
-diff -Nur linux-2.6.39.orig/arch/mips/ar71xx/dev-dsa.c linux-2.6.39/arch/mips/ar71xx/dev-dsa.c
---- linux-2.6.39.orig/arch/mips/ar71xx/dev-dsa.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.39/arch/mips/ar71xx/dev-dsa.c	2011-08-24 02:41:55.337990441 +0200
-@@ -0,0 +1,50 @@
++#endif /* _AR71XX_DEV_AP91_PCI_H */
++
+diff -Nur linux-2.6.39.orig/arch/mips/ar71xx/dev-ap94-pci.c linux-2.6.39/arch/mips/ar71xx/dev-ap94-pci.c
+--- linux-2.6.39.orig/arch/mips/ar71xx/dev-ap94-pci.c	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.39/arch/mips/ar71xx/dev-ap94-pci.c	2011-08-24 18:17:23.000000000 +0200
+@@ -0,0 +1,109 @@
 +/*
-+ *  Atheros AR71xx DSA switch device support
++ *  Atheros AP94 reference board PCI initialization
 + *
-+ *  Copyright (C) 2008-2009 Gabor Juhos <juhosg@openwrt.org>
-+ *  Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
++ *  Copyright (C) 2009-2010 Gabor Juhos <juhosg@openwrt.org>
 + *
 + *  This program is free software; you can redistribute it and/or modify it
 + *  under the terms of the GNU General Public License version 2 as published
 + *  by the Free Software Foundation.
 + */
 +
-+#include <linux/init.h>
-+#include <linux/platform_device.h>
++#include <linux/pci.h>
++#include <linux/ath9k_platform.h>
++#include <linux/delay.h>
 +
 +#include <asm/mach-ar71xx/ar71xx.h>
++#include <asm/mach-ar71xx/pci.h>
 +
-+#include "devices.h"
-+#include "dev-dsa.h"
++#include "dev-ap94-pci.h"
++#include "pci-ath9k-fixup.h"
 +
-+static struct platform_device ar71xx_dsa_switch_device = {
-+	.name		= "dsa",
-+	.id		= 0,
++static struct ath9k_platform_data ap94_wmac0_data = {
++	.led_pin = -1,
++};
++static struct ath9k_platform_data ap94_wmac1_data = {
++	.led_pin = -1,
 +};
++static char ap94_wmac0_mac[6];
++static char ap94_wmac1_mac[6];
 +
-+void __init ar71xx_add_device_dsa(unsigned int id,
-+				  struct dsa_platform_data *d)
++static struct ar71xx_pci_irq ap94_pci_irqs[] __initdata = {
++	{
++		.slot   = 0,
++		.pin    = 1,
++		.irq    = AR71XX_PCI_IRQ_DEV0,
++	}, {
++		.slot   = 1,
++		.pin    = 1,
++		.irq    = AR71XX_PCI_IRQ_DEV1,
++	}
++};
++
++static int ap94_pci_plat_dev_init(struct pci_dev *dev)
 +{
-+	int i;
++	switch (PCI_SLOT(dev->devfn)) {
++	case 17:
++		dev->dev.platform_data = &ap94_wmac0_data;
++		break;
 +
-+	switch (id) {
++	case 18:
++		dev->dev.platform_data = &ap94_wmac1_data;
++		break;
++	}
++
++	return 0;
++}
++
++__init void ap94_pci_setup_wmac_led_pin(unsigned wmac, int pin)
++{
++	switch (wmac) {
 +	case 0:
-+		d->netdev = &ar71xx_eth0_device.dev;
++		ap94_wmac0_data.led_pin = pin;
 +		break;
 +	case 1:
-+		d->netdev = &ar71xx_eth1_device.dev;
++		ap94_wmac1_data.led_pin = pin;
 +		break;
-+	default:
-+		printk(KERN_ERR
-+			"ar71xx: invalid ethernet id %d for DSA switch\n",
-+			id);
-+		return;
 +	}
-+
-+	for (i = 0; i < d->nr_chips; i++)
-+		d->chip[i].mii_bus = &ar71xx_mdio_device.dev;
-+
-+	ar71xx_dsa_switch_device.dev.platform_data = d;
-+
-+	platform_device_register(&ar71xx_dsa_switch_device);
 +}
-diff -Nur linux-2.6.39.orig/arch/mips/ar71xx/dev-dsa.h linux-2.6.39/arch/mips/ar71xx/dev-dsa.h
---- linux-2.6.39.orig/arch/mips/ar71xx/dev-dsa.h	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.39/arch/mips/ar71xx/dev-dsa.h	2011-08-24 02:41:55.347990727 +0200
-@@ -0,0 +1,20 @@
-+/*
-+ *  Atheros AR71xx DSA switch device support
-+ *
-+ *  Copyright (C) 2008-2009 Gabor Juhos <juhosg@openwrt.org>
-+ *  Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
-+ *
-+ *  This program is free software; you can redistribute it and/or modify it
-+ *  under the terms of the GNU General Public License version 2 as published
-+ *  by the Free Software Foundation.
-+ */
-+
-+#ifndef _AR71XX_DEV_DSA_H
-+#define _AR71XX_DEV_DSA_H
-+
-+#include <net/dsa.h>
-+
-+void ar71xx_add_device_dsa(unsigned int id,
-+			   struct dsa_platform_data *d) __init;
-+
-+#endif /* _AR71XX_DEV_DSA_H */
-diff -Nur linux-2.6.39.orig/arch/mips/ar71xx/dev-gpio-buttons.c linux-2.6.39/arch/mips/ar71xx/dev-gpio-buttons.c
---- linux-2.6.39.orig/arch/mips/ar71xx/dev-gpio-buttons.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.39/arch/mips/ar71xx/dev-gpio-buttons.c	2011-08-24 02:41:55.347990727 +0200
-@@ -0,0 +1,58 @@
-+/*
-+ *  Atheros AR71xx GPIO button support
-+ *
-+ *  Copyright (C) 2008-2009 Gabor Juhos <juhosg@openwrt.org>
-+ *  Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
-+ *
-+ *  This program is free software; you can redistribute it and/or modify it
-+ *  under the terms of the GNU General Public License version 2 as published
-+ *  by the Free Software Foundation.
-+ */
-+
-+#include "linux/init.h"
-+#include "linux/slab.h"
-+#include <linux/platform_device.h>
-+
-+#include "dev-gpio-buttons.h"
 +
-+void __init ar71xx_register_gpio_keys_polled(int id,
-+					     unsigned poll_interval,
-+					     unsigned nbuttons,
-+					     struct gpio_keys_button *buttons)
++__init void ap94_pci_setup_wmac_gpio(unsigned wmac, u32 mask, u32 val)
 +{
-+	struct platform_device *pdev;
-+	struct gpio_keys_platform_data pdata;
-+	struct gpio_keys_button *p;
-+	int err;
-+
-+	p = kmalloc(nbuttons * sizeof(*p), GFP_KERNEL);
-+	if (!p)
-+		return;
-+
-+	memcpy(p, buttons, nbuttons * sizeof(*p));
-+
-+	pdev = platform_device_alloc("gpio-keys-polled", id);
-+	if (!pdev)
-+		goto err_free_buttons;
++	switch (wmac) {
++	case 0:
++		ap94_wmac0_data.gpio_mask = mask;
++		ap94_wmac0_data.gpio_val = val;
++		break;
++	case 1:
++		ap94_wmac1_data.gpio_mask = mask;
++		ap94_wmac1_data.gpio_val = val;
++		break;
++	}
++}
 +
-+	memset(&pdata, 0, sizeof(pdata));
-+	pdata.poll_interval = poll_interval;
-+	pdata.nbuttons = nbuttons;
-+	pdata.buttons = p;
++void __init ap94_pci_init(u8 *cal_data0, u8 *mac_addr0,
++			  u8 *cal_data1, u8 *mac_addr1)
++{
++	if (cal_data0)
++		memcpy(ap94_wmac0_data.eeprom_data, cal_data0,
++		       sizeof(ap94_wmac0_data.eeprom_data));
 +
-+	err = platform_device_add_data(pdev, &pdata, sizeof(pdata));
-+	if (err)
-+		goto err_put_pdev;
++	if (cal_data1)
++		memcpy(ap94_wmac1_data.eeprom_data, cal_data1,
++		       sizeof(ap94_wmac1_data.eeprom_data));
 +
-+	err = platform_device_add(pdev);
-+	if (err)
-+		goto err_put_pdev;
++	if (mac_addr0) {
++		memcpy(ap94_wmac0_mac, mac_addr0, sizeof(ap94_wmac0_mac));
++		ap94_wmac0_data.macaddr = ap94_wmac0_mac;
++	}
 +
-+	return;
++	if (mac_addr1) {
++		memcpy(ap94_wmac1_mac, mac_addr1, sizeof(ap94_wmac1_mac));
++		ap94_wmac1_data.macaddr = ap94_wmac1_mac;
++	}
 +
-+err_put_pdev:
-+	platform_device_put(pdev);
++	ar71xx_pci_plat_dev_init = ap94_pci_plat_dev_init;
++	ar71xx_pci_init(ARRAY_SIZE(ap94_pci_irqs), ap94_pci_irqs);
 +
-+err_free_buttons:
-+	kfree(p);
++	pci_enable_ath9k_fixup(17, ap94_wmac0_data.eeprom_data);
++	pci_enable_ath9k_fixup(18, ap94_wmac1_data.eeprom_data);
 +}
-diff -Nur linux-2.6.39.orig/arch/mips/ar71xx/dev-gpio-buttons.h linux-2.6.39/arch/mips/ar71xx/dev-gpio-buttons.h
---- linux-2.6.39.orig/arch/mips/ar71xx/dev-gpio-buttons.h	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.39/arch/mips/ar71xx/dev-gpio-buttons.h	2011-08-24 02:41:55.347990727 +0200
-@@ -0,0 +1,23 @@
+diff -Nur linux-2.6.39.orig/arch/mips/ar71xx/dev-ap94-pci.h linux-2.6.39/arch/mips/ar71xx/dev-ap94-pci.h
+--- linux-2.6.39.orig/arch/mips/ar71xx/dev-ap94-pci.h	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.39/arch/mips/ar71xx/dev-ap94-pci.h	2011-08-24 18:17:23.000000000 +0200
+@@ -0,0 +1,31 @@
 +/*
-+ *  Atheros AR71xx GPIO button support
++ *  Atheros AP94 reference board PCI initialization
 + *
-+ *  Copyright (C) 2008-2009 Gabor Juhos <juhosg@openwrt.org>
-+ *  Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
++ *  Copyright (C) 2009-2010 Gabor Juhos <juhosg@openwrt.org>
 + *
 + *  This program is free software; you can redistribute it and/or modify it
 + *  under the terms of the GNU General Public License version 2 as published
 + *  by the Free Software Foundation.
 + */
 +
-+#ifndef _AR71XX_DEV_GPIO_BUTTONS_H
-+#define _AR71XX_DEV_GPIO_BUTTONS_H
++#ifndef _AR71XX_DEV_AP94_PCI_H
++#define _AR71XX_DEV_AP94_PCI_H
 +
-+#include <linux/input.h>
-+#include <linux/gpio_keys.h>
++#if defined(CONFIG_AR71XX_DEV_AP94_PCI)
++void ap94_pci_init(u8 *cal_data0, u8 *mac_addr0,
++		   u8 *cal_data1, u8 *mac_addr1) __init;
 +
-+void ar71xx_register_gpio_keys_polled(int id,
-+				      unsigned poll_interval,
-+				      unsigned nbuttons,
-+				      struct gpio_keys_button *buttons);
++void ap94_pci_setup_wmac_led_pin(unsigned wmac, int pin) __init;
++void ap94_pci_setup_wmac_gpio(unsigned wmac, u32 mask, u32 val) __init;
 +
-+#endif /* _AR71XX_DEV_GPIO_BUTTONS_H */
-diff -Nur linux-2.6.39.orig/arch/mips/ar71xx/devices.c linux-2.6.39/arch/mips/ar71xx/devices.c
---- linux-2.6.39.orig/arch/mips/ar71xx/devices.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.39/arch/mips/ar71xx/devices.c	2011-08-24 02:41:55.347990727 +0200
-@@ -0,0 +1,765 @@
++#else
++static inline void ap94_pci_init(u8 *cal_data0, u8 *mac_addr0,
++				 u8 *cal_data1, u8 *mac_addr1) {}
++
++static inline void ap94_pci_setup_wmac_led_pin(unsigned wmac, int pin) {}
++static inline void ap94_pci_setup_wmac_gpio(unsigned wmac,
++					    u32 mask, u32 val) {}
++#endif
++
++#endif /* _AR71XX_DEV_AP94_PCI_H */
++
+diff -Nur linux-2.6.39.orig/arch/mips/ar71xx/dev-ar9xxx-wmac.c linux-2.6.39/arch/mips/ar71xx/dev-ar9xxx-wmac.c
+--- linux-2.6.39.orig/arch/mips/ar71xx/dev-ar9xxx-wmac.c	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.39/arch/mips/ar71xx/dev-ar9xxx-wmac.c	2011-08-24 18:17:23.000000000 +0200
+@@ -0,0 +1,154 @@
 +/*
-+ *  Atheros AR71xx SoC platform devices
++ *  Atheros AR9XXX SoCs built-in WMAC device support
 + *
 + *  Copyright (C) 2010-2011 Jaiganesh Narayanan <jnarayanan@atheros.com>
 + *  Copyright (C) 2008-2009 Gabor Juhos <juhosg@openwrt.org>
 + *  Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
 + *
-+ *  Parts of this file are based on Atheros 2.6.15 BSP
-+ *  Parts of this file are based on Atheros 2.6.31 BSP
++ *  Parts of this file are based on Atheros 2.6.15/2.6.31 BSP
 + *
 + *  This program is free software; you can redistribute it and/or modify it
 + *  under the terms of the GNU General Public License version 2 as published
@@ -918,1144 +1072,732 @@ diff -Nur linux-2.6.39.orig/arch/mips/ar71xx/devices.c linux-2.6.39/arch/mips/ar
 +#include <linux/delay.h>
 +#include <linux/etherdevice.h>
 +#include <linux/platform_device.h>
-+#include <linux/serial_8250.h>
++#include <linux/ath9k_platform.h>
 +
 +#include <asm/mach-ar71xx/ar71xx.h>
-+#include <asm/mach-ar71xx/ar933x_uart_platform.h>
 +
-+#include "devices.h"
++#include "dev-ar9xxx-wmac.h"
 +
-+unsigned char ar71xx_mac_base[ETH_ALEN] __initdata;
++#define MHZ_25	(25 * 1000 * 1000)
 +
-+static struct resource ar71xx_uart_resources[] = {
-+	{
-+		.start	= AR71XX_UART_BASE,
-+		.end	= AR71XX_UART_BASE + AR71XX_UART_SIZE - 1,
-+		.flags	= IORESOURCE_MEM,
-+	},
++static struct ath9k_platform_data ar9xxx_wmac_data = {
++	.led_pin = -1,
 +};
++static char ar9xxx_wmac_mac[6];
 +
-+#define AR71XX_UART_FLAGS (UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_IOREMAP)
-+static struct plat_serial8250_port ar71xx_uart_data[] = {
++static struct resource ar9xxx_wmac_resources[] = {
 +	{
-+		.mapbase	= AR71XX_UART_BASE,
-+		.irq		= AR71XX_MISC_IRQ_UART,
-+		.flags		= AR71XX_UART_FLAGS,
-+		.iotype		= UPIO_MEM32,
-+		.regshift	= 2,
++		/* .start and .end fields are filled dynamically */
++		.flags	= IORESOURCE_MEM,
 +	}, {
-+		/* terminating entry */
-+	}
-+};
-+
-+static struct platform_device ar71xx_uart_device = {
-+	.name		= "serial8250",
-+	.id		= PLAT8250_DEV_PLATFORM,
-+	.resource	= ar71xx_uart_resources,
-+	.num_resources	= ARRAY_SIZE(ar71xx_uart_resources),
-+	.dev = {
-+		.platform_data	= ar71xx_uart_data
-+	},
-+};
-+
-+static struct resource ar933x_uart_resources[] = {
-+	{
-+		.start  = AR933X_UART_BASE,
-+		.end    = AR933X_UART_BASE + AR71XX_UART_SIZE - 1,
-+		.flags  = IORESOURCE_MEM,
-+	},
-+	{
-+		.start  = AR71XX_MISC_IRQ_UART,
-+		.end    = AR71XX_MISC_IRQ_UART,
-+		.flags  = IORESOURCE_IRQ,
++		.start	= AR71XX_CPU_IRQ_IP2,
++		.end	= AR71XX_CPU_IRQ_IP2,
++		.flags	= IORESOURCE_IRQ,
 +	},
 +};
 +
-+static struct ar933x_uart_platform_data ar933x_uart_data;
-+static struct platform_device ar933x_uart_device = {
-+	.name           = "ar933x-uart",
-+	.id             = -1,
-+	.resource       = ar933x_uart_resources,
-+	.num_resources  = ARRAY_SIZE(ar933x_uart_resources),
++static struct platform_device ar9xxx_wmac_device = {
++	.name		= "ath9k",
++	.id		= -1,
++	.resource	= ar9xxx_wmac_resources,
++	.num_resources	= ARRAY_SIZE(ar9xxx_wmac_resources),
 +	.dev = {
-+		.platform_data  = &ar933x_uart_data,
++		.platform_data = &ar9xxx_wmac_data,
 +	},
 +};
 +
-+void __init ar71xx_add_device_uart(void)
++static void ar913x_wmac_init(void)
 +{
-+	struct platform_device *pdev;
-+
-+	switch (ar71xx_soc) {
-+	case AR71XX_SOC_AR7130:
-+	case AR71XX_SOC_AR7141:
-+	case AR71XX_SOC_AR7161:
-+	case AR71XX_SOC_AR7240:
-+	case AR71XX_SOC_AR7241:
-+	case AR71XX_SOC_AR7242:
-+	case AR71XX_SOC_AR9130:
-+	case AR71XX_SOC_AR9132:
-+		pdev = &ar71xx_uart_device;
-+		ar71xx_uart_data[0].uartclk = ar71xx_ahb_freq;
-+		break;
-+
-+	case AR71XX_SOC_AR9330:
-+	case AR71XX_SOC_AR9331:
-+		pdev = &ar933x_uart_device;
-+		ar933x_uart_data.uartclk = ar71xx_ref_freq;
-+		break;
++	ar71xx_device_stop(RESET_MODULE_AMBA2WMAC);
++	mdelay(10);
 +
-+	case AR71XX_SOC_AR9341:
-+	case AR71XX_SOC_AR9342:
-+	case AR71XX_SOC_AR9344:
-+		pdev = &ar71xx_uart_device;
-+		ar71xx_uart_data[0].uartclk = ar71xx_ref_freq;
-+		break;
++	ar71xx_device_start(RESET_MODULE_AMBA2WMAC);
++	mdelay(10);
 +
-+	default:
-+		BUG();
-+	}
++	ar9xxx_wmac_resources[0].start = AR91XX_WMAC_BASE;
++	ar9xxx_wmac_resources[0].end = AR91XX_WMAC_BASE + AR91XX_WMAC_SIZE - 1;
++}
 +
-+	platform_device_register(pdev);
++static int ar933x_r1_get_wmac_revision(void)
++{
++	return ar71xx_soc_rev;
 +}
 +
-+static struct resource ar71xx_mdio_resources[] = {
-+	{
-+		.name	= "mdio_base",
-+		.flags	= IORESOURCE_MEM,
-+		.start	= AR71XX_GE0_BASE,
-+		.end	= AR71XX_GE0_BASE + 0x200 - 1,
-+	}
-+};
++static int ar933x_wmac_reset(void)
++{
++	unsigned retries = 0;
 +
-+static struct ag71xx_mdio_platform_data ar71xx_mdio_data;
++	ar71xx_device_stop(AR933X_RESET_WMAC);
++	ar71xx_device_start(AR933X_RESET_WMAC);
 +
-+struct platform_device ar71xx_mdio_device = {
-+	.name		= "ag71xx-mdio",
-+	.id		= -1,
-+	.resource	= ar71xx_mdio_resources,
-+	.num_resources	= ARRAY_SIZE(ar71xx_mdio_resources),
-+	.dev = {
-+		.platform_data = &ar71xx_mdio_data,
-+	},
-+};
++	while (1) {
++		u32 bootstrap;
 +
-+static void ar71xx_set_pll(u32 cfg_reg, u32 pll_reg, u32 pll_val, u32 shift)
-+{
-+	void __iomem *base;
-+	u32 t;
++		bootstrap = ar71xx_reset_rr(AR933X_RESET_REG_BOOTSTRAP);
++		if ((bootstrap & AR933X_BOOTSTRAP_EEPBUSY) == 0)
++			return 0;
 +
-+	base = ioremap_nocache(AR71XX_PLL_BASE, AR71XX_PLL_SIZE);
++		if (retries > 20)
++			break;
 +
-+	t = __raw_readl(base + cfg_reg);
-+	t &= ~(3 << shift);
-+	t |=  (2 << shift);
-+	__raw_writel(t, base + cfg_reg);
-+	udelay(100);
++		udelay(10000);
++		retries++;
++	}
 +
-+	__raw_writel(pll_val, base + pll_reg);
++	pr_err("ar93xx: WMAC reset timed out");
++	return -ETIMEDOUT;
++}
 +
-+	t |= (3 << shift);
-+	__raw_writel(t, base + cfg_reg);
-+	udelay(100);
++static void ar933x_wmac_init(void)
++{
++	ar9xxx_wmac_device.name = "ar933x_wmac";
++	ar9xxx_wmac_resources[0].start = AR933X_WMAC_BASE;
++	ar9xxx_wmac_resources[0].end = AR933X_WMAC_BASE + AR933X_WMAC_SIZE - 1;
++	if (ar71xx_ref_freq == MHZ_25)
++		ar9xxx_wmac_data.is_clk_25mhz = true;
 +
-+	t &= ~(3 << shift);
-+	__raw_writel(t, base + cfg_reg);
-+	udelay(100);
++	if (ar71xx_soc_rev == 1)
++		ar9xxx_wmac_data.get_mac_revision = ar933x_r1_get_wmac_revision;
 +
-+	printk(KERN_DEBUG "ar71xx: pll_reg %#x: %#x\n",
-+		(unsigned int)(base + pll_reg), __raw_readl(base + pll_reg));
++	ar9xxx_wmac_data.external_reset = ar933x_wmac_reset;
 +
-+	iounmap(base);
++	ar933x_wmac_reset();
 +}
 +
-+void __init ar71xx_add_device_mdio(u32 phy_mask)
++static void ar934x_wmac_init(void)
++{
++	ar9xxx_wmac_device.name = "ar934x_wmac";
++	ar9xxx_wmac_resources[0].start = AR934X_WMAC_BASE;
++	ar9xxx_wmac_resources[0].end = AR934X_WMAC_BASE + AR934X_WMAC_SIZE - 1;
++	if (ar71xx_ref_freq == MHZ_25)
++		ar9xxx_wmac_data.is_clk_25mhz = true;
++}
++
++void __init ar9xxx_add_device_wmac(u8 *cal_data, u8 *mac_addr)
 +{
 +	switch (ar71xx_soc) {
-+	case AR71XX_SOC_AR7240:
-+		ar71xx_mdio_data.is_ar7240 = 1;
-+		break;
-+	case AR71XX_SOC_AR7241:
-+		ar71xx_mdio_data.is_ar7240 = 1;
-+		ar71xx_mdio_resources[0].start = AR71XX_GE1_BASE;
-+		ar71xx_mdio_resources[0].end = AR71XX_GE1_BASE + 0x200 - 1;
-+		break;
-+	case AR71XX_SOC_AR7242:
-+		ar71xx_set_pll(AR71XX_PLL_REG_SEC_CONFIG,
-+			       AR7242_PLL_REG_ETH0_INT_CLOCK, 0x62000000,
-+			       AR71XX_ETH0_PLL_SHIFT);
++	case AR71XX_SOC_AR9130:
++	case AR71XX_SOC_AR9132:
++		ar913x_wmac_init();
 +		break;
++
 +	case AR71XX_SOC_AR9330:
 +	case AR71XX_SOC_AR9331:
-+		ar71xx_mdio_data.is_ar7240 = 1;
-+		ar71xx_mdio_resources[0].start = AR71XX_GE1_BASE;
-+		ar71xx_mdio_resources[0].end = AR71XX_GE1_BASE + 0x200 - 1;
-+		break;
-+	default:
++		ar933x_wmac_init();
 +		break;
-+	}
-+
-+	ar71xx_mdio_data.phy_mask = phy_mask;
-+
-+	platform_device_register(&ar71xx_mdio_device);
-+}
-+
-+struct ar71xx_eth_pll_data ar71xx_eth0_pll_data;
-+struct ar71xx_eth_pll_data ar71xx_eth1_pll_data;
-+
-+static u32 ar71xx_get