+++ b/arch/mips/ar231x/Platform
@@ -0,0 +1,6 @@
+#
-+# Atheros AR5312/AR2312 WiSoC
++# Atheros AR531X/AR231X WiSoC
+#
+platform-$(CONFIG_ATHEROS_AR231X) += ar231x/
+cflags-$(CONFIG_ATHEROS_AR231X) += -I$(srctree)/arch/mips/include/asm/mach-ar231x
+check_board_data(u8 *flash_limit, u8 *addr, bool broken)
+{
+ /* config magic found */
-+ if (*((u32 *)addr) == AR531X_BD_MAGIC)
++ if (*((u32 *)addr) == AR231X_BD_MAGIC)
+ return 1;
+
+ if (!broken)
+ */
+
+/*
-+ * Prom setup file for ar531x
++ * Prom setup file for ar231x
+ */
+
+#include <linux/init.h>
--- /dev/null
+++ b/arch/mips/include/asm/mach-ar231x/ar231x_platform.h
@@ -0,0 +1,83 @@
-+#ifndef __AR531X_PLATFORM_H
-+#define __AR531X_PLATFORM_H
++#ifndef __ASM_MACH_AR231X_PLATFORM_H
++#define __ASM_MACH_AR231X_PLATFORM_H
+
+/*
+ * This is board-specific data that is stored in a "fixed" location in flash.
+ */
+struct ar231x_boarddata {
+ u32 magic; /* board data is valid */
-+#define AR531X_BD_MAGIC 0x35333131 /* "5311", for all 531x platforms */
++#define AR231X_BD_MAGIC 0x35333131 /* "5311", for all 531x/231x platforms */
+ u16 cksum; /* checksum (starting with BD_REV 2) */
+ u16 rev; /* revision of this struct */
+#define BD_REV 4
+ * Platform device information for the Ethernet MAC
+ */
+struct ar231x_eth {
-+ u32 reset_base;
++ void (*reset_set)(u32);
++ void (*reset_clear)(u32);
+ u32 reset_mac;
+ u32 reset_phy;
-+ u32 phy_base;
+ struct ar231x_board_config *config;
+ char *macaddr;
+};
+
-+#endif /* __AR531X_PLATFORM_H */
++#endif /* __ASM_MACH_AR231X_PLATFORM_H */
--- /dev/null
+++ b/arch/mips/include/asm/mach-ar231x/cpu-feature-overrides.h
@@ -0,0 +1,84 @@
+/*
-+ * Atheros SoC specific CPU feature overrides
++ * Atheros AR231x/AR531x SoC specific CPU feature overrides
+ *
+ * Copyright (C) 2008 Gabor Juhos <juhosg@openwrt.org>
+ *
+ * by the Free Software Foundation.
+ *
+ */
-+#ifndef __ASM_MACH_ATHEROS_CPU_FEATURE_OVERRIDES_H
-+#define __ASM_MACH_ATHEROS_CPU_FEATURE_OVERRIDES_H
++#ifndef __ASM_MACH_AR231X_CPU_FEATURE_OVERRIDES_H
++#define __ASM_MACH_AR231X_CPU_FEATURE_OVERRIDES_H
+
+/*
-+ * The ATHEROS SoCs have MIPS 4Kc/4KEc core.
++ * The Atheros AR531x/AR231x SoCs have MIPS 4Kc/4KEc core.
+ */
+#define cpu_has_tlb 1
+#define cpu_has_4kex 1
+/* #define cpu_dcache_line_size() ? */
+/* #define cpu_icache_line_size() ? */
+
-+#endif /* __ASM_MACH_ATHEROS_CPU_FEATURE_OVERRIDES_H */
++#endif /* __ASM_MACH_AR231X_CPU_FEATURE_OVERRIDES_H */
--- /dev/null
+++ b/arch/mips/include/asm/mach-ar231x/dma-coherence.h
@@ -0,0 +1,79 @@
+ * Copyright (C) 2007 Felix Fietkau <nbd@openwrt.org>
+ *
+ */
-+#ifndef __ASM_MACH_GENERIC_DMA_COHERENCE_H
-+#define __ASM_MACH_GENERIC_DMA_COHERENCE_H
++#ifndef __ASM_MACH_AR231X_DMA_COHERENCE_H
++#define __ASM_MACH_AR231X_DMA_COHERENCE_H
+
+#define PCI_DMA_OFFSET 0x20000000
+
+#endif
+}
+
-+#endif /* __ASM_MACH_GENERIC_DMA_COHERENCE_H */
++#endif /* __ASM_MACH_AR231X_DMA_COHERENCE_H */
--- /dev/null
+++ b/arch/mips/include/asm/mach-ar231x/gpio.h
@@ -0,0 +1,30 @@
-+#ifndef _ATHEROS_GPIO_H_
-+#define _ATHEROS_GPIO_H_
++#ifndef __ASM_MACH_AR231X_GPIO_H
++#define __ASM_MACH_AR231X_GPIO_H
+
+#include <ar231x.h>
+
+/* Returns IRQ to attach for gpio. Unchecked function */
+static inline int gpio_to_irq(unsigned gpio)
+{
-+ return AR531X_GPIO_IRQ(gpio);
++ return AR231X_GPIO_IRQ(gpio);
+}
+
+/* Returns gpio for IRQ attached. Unchecked function */
+static inline int irq_to_gpio(unsigned irq)
+{
-+ return irq - AR531X_GPIO_IRQ(0);
++ return irq - AR231X_GPIO_IRQ(0);
+}
+
+#include <asm-generic/gpio.h> /* cansleep wrappers */
+
-+#endif
++#endif /* __ASM_MACH_AR231X_GPIO_H */
--- /dev/null
+++ b/arch/mips/include/asm/mach-ar231x/reset.h
@@ -0,0 +1,6 @@
-+#ifndef __AR531X_RESET_H
-+#define __AR531X_RESET_H
++#ifndef __ASM_MACH_AR231X_RESET_H
++#define __ASM_MACH_AR231X_RESET_H
+
-+void ar531x_disable_reset_button(void);
++void ar231x_disable_reset_button(void);
+
-+#endif /* __AR531X_RESET_H */
++#endif /* __ASM_MACH_AR231X_RESET_H */
--- /dev/null
+++ b/arch/mips/include/asm/mach-ar231x/war.h
@@ -0,0 +1,25 @@
+ *
+ * Copyright (C) 2008 Felix Fietkau <nbd@openwrt.org>
+ */
-+#ifndef __ASM_MIPS_MACH_ATHEROS_WAR_H
-+#define __ASM_MIPS_MACH_ATHEROS_WAR_H
++#ifndef __ASM_MACH_AR231X_WAR_H
++#define __ASM_MACH_AR231X_WAR_H
+
+#define R4600_V1_INDEX_ICACHEOP_WAR 0
+#define R4600_V1_HIT_CACHEOP_WAR 0
+#define R10000_LLSC_WAR 0
+#define MIPS34K_MISSED_ITLB_WAR 0
+
-+#endif /* __ASM_MIPS_MACH_ATHEROS_WAR_H */
++#endif /* __ASM_MACH_AR231X_WAR_H */
--- /dev/null
+++ b/arch/mips/include/asm/mach-ar231x/ar2315_regs.h
-@@ -0,0 +1,615 @@
+@@ -0,0 +1,617 @@
+/*
+ * Register definitions for AR2315+
+ *
+ * Copyright (C) 2006-2008 Felix Fietkau <nbd@openwrt.org>
+ */
+
-+#ifndef __AR2315_REG_H
-+#define __AR2315_REG_H
++#ifndef __ASM_MACH_AR231X_AR2315_REGS_H
++#define __ASM_MACH_AR231X_AR2315_REGS_H
+
+/*
+ * IRQs
+#define AR2315_IRQ_LCBUS_PCI (MIPS_CPU_IRQ_BASE+5) /* C0_CAUSE: 0x2000 */
+#define AR2315_IRQ_WLAN0_POLL (MIPS_CPU_IRQ_BASE+6) /* C0_CAUSE: 0x4000 */
+
++
++/*
++ * Miscellaneous interrupts, which share IP2.
++ */
++#define AR2315_MISC_IRQ_NONE (AR231X_MISC_IRQ_BASE+0)
++#define AR2315_MISC_IRQ_UART0 (AR231X_MISC_IRQ_BASE+1)
++#define AR2315_MISC_IRQ_I2C_RSVD (AR231X_MISC_IRQ_BASE+2)
++#define AR2315_MISC_IRQ_SPI (AR231X_MISC_IRQ_BASE+3)
++#define AR2315_MISC_IRQ_AHB (AR231X_MISC_IRQ_BASE+4)
++#define AR2315_MISC_IRQ_APB (AR231X_MISC_IRQ_BASE+5)
++#define AR2315_MISC_IRQ_TIMER (AR231X_MISC_IRQ_BASE+6)
++#define AR2315_MISC_IRQ_GPIO (AR231X_MISC_IRQ_BASE+7)
++#define AR2315_MISC_IRQ_WATCHDOG (AR231X_MISC_IRQ_BASE+8)
++#define AR2315_MISC_IRQ_IR_RSVD (AR231X_MISC_IRQ_BASE+9)
++#define AR2315_MISC_IRQ_COUNT 10
++
++
+/*
+ * Address map
+ */
+#define AR2315_LOCAL 0x10400000 /* LOCAL BUS MMR */
+#define AR2315_ENET0 0x10500000 /* ETHERNET MMR */
+#define AR2315_DSLBASE 0x11000000 /* RESET CONTROL MMR */
-+#define AR2315_UART0 0x11100003 /* UART MMR */
-+#define AR2315_SPI 0x11300000 /* SPI FLASH MMR */
++#define AR2315_UART0 0x11100000 /* UART MMR */
++#define AR2315_SPI_MMR 0x11300000 /* SPI FLASH MMR */
+#define AR2315_PCIEXT 0x80000000 /* pci external */
+
++/* MII registers offset inside Ethernet MMR region */
++#define AR2315_ENET0_MII (AR2315_ENET0 + 0x14)
++
+/*
+ * Reset Register
+ */
+#define AR2315_NMI_EN 1
+
+/*
-+ * Revision Register - Initial value is 0x3010 (WMAC 3.0, AR531X 1.0).
++ * Revision Register - Initial value is 0x3010 (WMAC 3.0, AR231X 1.0).
+ */
+#define AR2315_SREV (AR2315_DSLBASE + 0x0014)
+
+ */
+#define AR2315_GPIO_DI (AR2315_DSLBASE + 0x0088)
+#define AR2315_GPIO_DO (AR2315_DSLBASE + 0x0090)
-+#define AR2315_GPIO_CR (AR2315_DSLBASE + 0x0098)
++#define AR2315_GPIO_DIR (AR2315_DSLBASE + 0x0098)
+#define AR2315_GPIO_INT (AR2315_DSLBASE + 0x00a0)
+
-+#define AR2315_GPIO_CR_M(x) (1 << (x)) /* mask for i/o */
-+#define AR2315_GPIO_CR_O(x) (1 << (x)) /* output */
-+#define AR2315_GPIO_CR_I(x) (0) /* input */
++#define AR2315_GPIO_DIR_M(x) (1 << (x)) /* mask for i/o */
++#define AR2315_GPIO_DIR_O(x) (1 << (x)) /* output */
++#define AR2315_GPIO_DIR_I(x) (0) /* input */
+
+#define AR2315_GPIO_INT_S(x) (x) /* interrupt enable */
+#define AR2315_GPIO_INT_M (0x3F) /* mask for int */
+#define AR2315_GPIO_INT_LVL_M ((0x3) << 6) /* mask for int level */
+
+#define AR2315_GPIO_INT_MAX_Y 1 /* Maximum value of Y for
-+ * AR5313_GPIO_INT_* macros */
++ * AR2315_GPIO_INT_* macros */
+#define AR2315_GPIO_INT_LVL_OFF 0 /* Triggerring off */
+#define AR2315_GPIO_INT_LVL_LOW 1 /* Low Level Triggered */
+#define AR2315_GPIO_INT_LVL_HIGH 2 /* High Level Triggered */
+#define SDRAM_BANKADDR_BITS_S 3
+
+/*
-+ * SPI Flash Interface Registers
-+ */
-+
-+#define AR2315_SPI_CTL (AR2315_SPI + 0x00)
-+#define AR2315_SPI_OPCODE (AR2315_SPI + 0x04)
-+#define AR2315_SPI_DATA (AR2315_SPI + 0x08)
-+
-+#define SPI_CTL_START 0x00000100
-+#define SPI_CTL_BUSY 0x00010000
-+#define SPI_CTL_TXCNT_MASK 0x0000000f
-+#define SPI_CTL_RXCNT_MASK 0x000000f0
-+#define SPI_CTL_TX_RX_CNT_MASK 0x000000ff
-+#define SPI_CTL_SIZE_MASK 0x00060000
-+
-+#define SPI_CTL_CLK_SEL_MASK 0x03000000
-+#define SPI_OPCODE_MASK 0x000000ff
-+
-+/*
+ * PCI Bus Interface Registers
+ */
+#define AR2315_PCI_1MS_REG (AR2315_PCI + 0x0008)
+#define HOST_PCI_SDRAM_BASEADDR HOST_PCI_MBAR1
+#define PCI_DEVICE_MEM_SPACE 0x800000
+
-+#endif /* __AR2315_REG_H */
++#endif /* __ASM_MACH_AR231X_AR2315_REGS_H */
--- /dev/null
+++ b/arch/mips/include/asm/mach-ar231x/ar5312_regs.h
-@@ -0,0 +1,233 @@
+@@ -0,0 +1,253 @@
+/*
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file "COPYING" in the main directory of this archive
+ * Copyright (C) 2006 Felix Fietkau <nbd@openwrt.org>
+ */
+
-+#ifndef AR5312_H
-+#define AR5312_H
++#ifndef __ASM_MACH_AR231X_AR5312_REGS_H
++#define __ASM_MACH_AR231X_AR5312_REGS_H
+
+#include <asm/addrspace.h>
+
+#define AR5312_IRQ_MISC_INTRS (MIPS_CPU_IRQ_BASE+6) /* C0_CAUSE: 0x4000 */
+
+
++/*
++ * Miscellaneous interrupts, which share IP6.
++ */
++#define AR5312_MISC_IRQ_NONE (AR231X_MISC_IRQ_BASE+0)
++#define AR5312_MISC_IRQ_TIMER (AR231X_MISC_IRQ_BASE+1)
++#define AR5312_MISC_IRQ_AHB_PROC (AR231X_MISC_IRQ_BASE+2)
++#define AR5312_MISC_IRQ_AHB_DMA (AR231X_MISC_IRQ_BASE+3)
++#define AR5312_MISC_IRQ_GPIO (AR231X_MISC_IRQ_BASE+4)
++#define AR5312_MISC_IRQ_UART0 (AR231X_MISC_IRQ_BASE+5)
++#define AR5312_MISC_IRQ_UART0_DMA (AR231X_MISC_IRQ_BASE+6)
++#define AR5312_MISC_IRQ_WATCHDOG (AR231X_MISC_IRQ_BASE+7)
++#define AR5312_MISC_IRQ_LOCAL (AR231X_MISC_IRQ_BASE+8)
++#define AR5312_MISC_IRQ_SPI (AR231X_MISC_IRQ_BASE+9)
++#define AR5312_MISC_IRQ_COUNT 10
++
++
+/* Address Map */
-+#define AR531X_WLAN0 0x18000000
-+#define AR531X_WLAN1 0x18500000
-+#define AR531X_ENET0 0x18100000
-+#define AR531X_ENET1 0x18200000
-+#define AR531X_SDRAMCTL 0x18300000
-+#define AR531X_FLASHCTL 0x18400000
-+#define AR531X_APBBASE 0x1c000000
-+#define AR531X_FLASH 0x1e000000
-+#define AR531X_UART0 0xbc000003 /* UART MMR */
++#define AR5312_WLAN0 0x18000000
++#define AR5312_WLAN1 0x18500000
++#define AR5312_ENET0 0x18100000
++#define AR5312_ENET1 0x18200000
++#define AR5312_SDRAMCTL 0x18300000
++#define AR5312_FLASHCTL 0x18400000
++#define AR5312_APBBASE 0x1c000000
++#define AR5312_UART0 0x1c000000 /* UART MMR */
++#define AR5312_FLASH 0x1e000000
+
+/*
-+ * AR531X_NUM_ENET_MAC defines the number of ethernet MACs that
++ * AR5312_NUM_ENET_MAC defines the number of ethernet MACs that
+ * should be considered available. The AR5312 supports 2 enet MACS,
+ * even though many reference boards only actually use 1 of them
+ * (i.e. Only MAC 0 is actually connected to an enet PHY or PHY switch.
+ * The AR2312 supports 1 enet MAC.
+ */
-+#define AR531X_NUM_ENET_MAC 2
++#define AR5312_NUM_ENET_MAC 2
+
+/*
+ * Need these defines to determine true number of ethernet MACs
+ */
-+#define AR5212_AR5312_REV2 0x0052 /* AR5312 WMAC (AP31) */
-+#define AR5212_AR5312_REV7 0x0057 /* AR5312 WMAC (AP30-040) */
-+#define AR5212_AR2313_REV8 0x0058 /* AR2313 WMAC (AP43-030) */
++#define AR5312_AR5312_REV2 0x0052 /* AR5312 WMAC (AP31) */
++#define AR5312_AR5312_REV7 0x0057 /* AR5312 WMAC (AP30-040) */
++#define AR5312_AR2313_REV8 0x0058 /* AR2313 WMAC (AP43-030) */
++
++/* MII registers offset inside Ethernet MMR region */
++#define AR5312_ENET0_MII (AR5312_ENET0 + 0x14)
++#define AR5312_ENET1_MII (AR5312_ENET1 + 0x14)
+
+/*
-+ * AR531X_NUM_WMAC defines the number of Wireless MACs that\
++ * AR5312_NUM_WMAC defines the number of Wireless MACs that\
+ * should be considered available.
+ */
-+#define AR531X_NUM_WMAC 2
++#define AR5312_NUM_WMAC 2
+
+/* Reset/Timer Block Address Map */
-+#define AR531X_RESETTMR (AR531X_APBBASE + 0x3000)
-+#define AR531X_TIMER (AR531X_RESETTMR + 0x0000) /* countdown timer */
-+#define AR531X_WD_CTRL (AR531X_RESETTMR + 0x0008) /* watchdog cntrl */
-+#define AR531X_WD_TIMER (AR531X_RESETTMR + 0x000c) /* watchdog timer */
-+#define AR531X_ISR (AR531X_RESETTMR + 0x0010) /* Intr Status Reg */
-+#define AR531X_IMR (AR531X_RESETTMR + 0x0014) /* Intr Mask Reg */
-+#define AR531X_RESET (AR531X_RESETTMR + 0x0020)
-+#define AR5312_CLOCKCTL1 (AR531X_RESETTMR + 0x0064)
-+#define AR5312_SCRATCH (AR531X_RESETTMR + 0x006c)
-+#define AR531X_PROCADDR (AR531X_RESETTMR + 0x0070)
-+#define AR531X_PROC1 (AR531X_RESETTMR + 0x0074)
-+#define AR531X_DMAADDR (AR531X_RESETTMR + 0x0078)
-+#define AR531X_DMA1 (AR531X_RESETTMR + 0x007c)
-+#define AR531X_ENABLE (AR531X_RESETTMR + 0x0080) /* interface enb */
-+#define AR531X_REV (AR531X_RESETTMR + 0x0090) /* revision */
-+
-+/* AR531X_WD_CTRL register bit field definitions */
-+#define AR531X_WD_CTRL_IGNORE_EXPIRATION 0x0000
-+#define AR531X_WD_CTRL_NMI 0x0001
-+#define AR531X_WD_CTRL_RESET 0x0002
-+
-+/* AR531X_ISR register bit field definitions */
-+#define AR531X_ISR_NONE 0x0000
-+#define AR531X_ISR_TIMER 0x0001
-+#define AR531X_ISR_AHBPROC 0x0002
-+#define AR531X_ISR_AHBDMA 0x0004
-+#define AR531X_ISR_GPIO 0x0008
-+#define AR531X_ISR_UART0 0x0010
-+#define AR531X_ISR_UART0DMA 0x0020
-+#define AR531X_ISR_WD 0x0040
-+#define AR531X_ISR_LOCAL 0x0080
-+
-+/* AR531X_RESET register bit field definitions */
-+#define AR531X_RESET_SYSTEM 0x00000001 /* cold reset full system */
-+#define AR531X_RESET_PROC 0x00000002 /* cold reset MIPS core */
-+#define AR531X_RESET_WLAN0 0x00000004 /* cold reset WLAN MAC and BB */
-+#define AR531X_RESET_EPHY0 0x00000008 /* cold reset ENET0 phy */
-+#define AR531X_RESET_EPHY1 0x00000010 /* cold reset ENET1 phy */
-+#define AR531X_RESET_ENET0 0x00000020 /* cold reset ENET0 mac */
-+#define AR531X_RESET_ENET1 0x00000040 /* cold reset ENET1 mac */
-+#define AR531X_RESET_UART0 0x00000100 /* cold reset UART0 (high speed) */
-+#define AR531X_RESET_WLAN1 0x00000200 /* cold reset WLAN MAC/BB */
-+#define AR531X_RESET_APB 0x00000400 /* cold reset APB (ar5312) */
-+#define AR531X_RESET_WARM_PROC 0x00001000 /* warm reset MIPS core */
-+#define AR531X_RESET_WARM_WLAN0_MAC 0x00002000 /* warm reset WLAN0 MAC */
-+#define AR531X_RESET_WARM_WLAN0_BB 0x00004000 /* warm reset WLAN0 BaseBand */
-+#define AR531X_RESET_NMI 0x00010000 /* send an NMI to the processor */
-+#define AR531X_RESET_WARM_WLAN1_MAC 0x00020000 /* warm reset WLAN1 mac */
-+#define AR531X_RESET_WARM_WLAN1_BB 0x00040000 /* warm reset WLAN1 baseband */
-+#define AR531X_RESET_LOCAL_BUS 0x00080000 /* reset local bus */
-+#define AR531X_RESET_WDOG 0x00100000 /* last reset was a watchdog */
-+
-+#define AR531X_RESET_WMAC0_BITS \
-+ (AR531X_RESET_WLAN0 |\
-+ AR531X_RESET_WARM_WLAN0_MAC |\
-+ AR531X_RESET_WARM_WLAN0_BB)
-+
-+#define AR531X_RESERT_WMAC1_BITS \
-+ (AR531X_RESET_WLAN1 |\
-+ AR531X_RESET_WARM_WLAN1_MAC |\
-+ AR531X_RESET_WARM_WLAN1_BB)
++#define AR5312_RESETTMR (AR5312_APBBASE + 0x3000)
++#define AR5312_TIMER (AR5312_RESETTMR + 0x0000) /* countdown timer */
++#define AR5312_WD_CTRL (AR5312_RESETTMR + 0x0008) /* watchdog cntrl */
++#define AR5312_WD_TIMER (AR5312_RESETTMR + 0x000c) /* watchdog timer */
++#define AR5312_ISR (AR5312_RESETTMR + 0x0010) /* Intr Status Reg */
++#define AR5312_IMR (AR5312_RESETTMR + 0x0014) /* Intr Mask Reg */
++#define AR5312_RESET (AR5312_RESETTMR + 0x0020)
++#define AR5312_CLOCKCTL1 (AR5312_RESETTMR + 0x0064)
++#define AR5312_SCRATCH (AR5312_RESETTMR + 0x006c)
++#define AR5312_PROCADDR (AR5312_RESETTMR + 0x0070)
++#define AR5312_PROC1 (AR5312_RESETTMR + 0x0074)
++#define AR5312_DMAADDR (AR5312_RESETTMR + 0x0078)
++#define AR5312_DMA1 (AR5312_RESETTMR + 0x007c)
++#define AR5312_ENABLE (AR5312_RESETTMR + 0x0080) /* interface enb */
++#define AR5312_REV (AR5312_RESETTMR + 0x0090) /* revision */
++
++/* AR5312_WD_CTRL register bit field definitions */
++#define AR5312_WD_CTRL_IGNORE_EXPIRATION 0x0000
++#define AR5312_WD_CTRL_NMI 0x0001
++#define AR5312_WD_CTRL_RESET 0x0002
++
++/* AR5312_ISR register bit field definitions */
++#define AR5312_ISR_NONE 0x0000
++#define AR5312_ISR_TIMER 0x0001
++#define AR5312_ISR_AHBPROC 0x0002
++#define AR5312_ISR_AHBDMA 0x0004
++#define AR5312_ISR_GPIO 0x0008
++#define AR5312_ISR_UART0 0x0010
++#define AR5312_ISR_UART0DMA 0x0020
++#define AR5312_ISR_WD 0x0040
++#define AR5312_ISR_LOCAL 0x0080
++
++/* AR5312_RESET register bit field definitions */
++#define AR5312_RESET_SYSTEM 0x00000001 /* cold reset full system */
++#define AR5312_RESET_PROC 0x00000002 /* cold reset MIPS core */
++#define AR5312_RESET_WLAN0 0x00000004 /* cold reset WLAN MAC and BB */
++#define AR5312_RESET_EPHY0 0x00000008 /* cold reset ENET0 phy */
++#define AR5312_RESET_EPHY1 0x00000010 /* cold reset ENET1 phy */
++#define AR5312_RESET_ENET0 0x00000020 /* cold reset ENET0 mac */
++#define AR5312_RESET_ENET1 0x00000040 /* cold reset ENET1 mac */
++#define AR5312_RESET_UART0 0x00000100 /* cold reset UART0 (high speed) */
++#define AR5312_RESET_WLAN1 0x00000200 /* cold reset WLAN MAC/BB */
++#define AR5312_RESET_APB 0x00000400 /* cold reset APB (ar5312) */
++#define AR5312_RESET_WARM_PROC 0x00001000 /* warm reset MIPS core */
++#define AR5312_RESET_WARM_WLAN0_MAC 0x00002000 /* warm reset WLAN0 MAC */
++#define AR5312_RESET_WARM_WLAN0_BB 0x00004000 /* warm reset WLAN0 BaseBand */
++#define AR5312_RESET_NMI 0x00010000 /* send an NMI to the processor */
++#define AR5312_RESET_WARM_WLAN1_MAC 0x00020000 /* warm reset WLAN1 mac */
++#define AR5312_RESET_WARM_WLAN1_BB 0x00040000 /* warm reset WLAN1 baseband */
++#define AR5312_RESET_LOCAL_BUS 0x00080000 /* reset local bus */
++#define AR5312_RESET_WDOG 0x00100000 /* last reset was a watchdog */
++
++#define AR5312_RESET_WMAC0_BITS \
++ (AR5312_RESET_WLAN0 |\
++ AR5312_RESET_WARM_WLAN0_MAC |\
++ AR5312_RESET_WARM_WLAN0_BB)
++
++#define AR5312_RESET_WMAC1_BITS \
++ (AR5312_RESET_WLAN1 |\
++ AR5312_RESET_WARM_WLAN1_MAC |\
++ AR5312_RESET_WARM_WLAN1_BB)
+
+/* AR5312_CLOCKCTL1 register bit field definitions */
+#define AR5312_CLOCKCTL1_PREDIVIDE_MASK 0x00000030
+#define AR2313_CLOCKCTL1_DOUBLER_MASK 0x00000000
+
+
-+/* AR531X_ENABLE register bit field definitions */
-+#define AR531X_ENABLE_WLAN0 0x0001
-+#define AR531X_ENABLE_ENET0 0x0002
-+#define AR531X_ENABLE_ENET1 0x0004
-+#define AR531X_ENABLE_UART_AND_WLAN1_PIO 0x0008 /* UART, and WLAN1 PIOs */
-+#define AR531X_ENABLE_WLAN1_DMA 0x0010 /* WLAN1 DMAs */
-+#define AR531X_ENABLE_WLAN1 \
-+ (AR531X_ENABLE_UART_AND_WLAN1_PIO |\
-+ AR531X_ENABLE_WLAN1_DMA)
-+
-+/* AR531X_REV register bit field definitions */
-+#define AR531X_REV_WMAC_MAJ 0xf000
-+#define AR531X_REV_WMAC_MAJ_S 12
-+#define AR531X_REV_WMAC_MIN 0x0f00
-+#define AR531X_REV_WMAC_MIN_S 8
-+#define AR531X_REV_MAJ 0x00f0
-+#define AR531X_REV_MAJ_S 4
-+#define AR531X_REV_MIN 0x000f
-+#define AR531X_REV_MIN_S 0
-+#define AR531X_REV_CHIP (AR531X_REV_MAJ|AR531X_REV_MIN)
++/* AR5312_ENABLE register bit field definitions */
++#define AR5312_ENABLE_WLAN0 0x0001
++#define AR5312_ENABLE_ENET0 0x0002
++#define AR5312_ENABLE_ENET1 0x0004
++#define AR5312_ENABLE_UART_AND_WLAN1_PIO 0x0008 /* UART, and WLAN1 PIOs */
++#define AR5312_ENABLE_WLAN1_DMA 0x0010 /* WLAN1 DMAs */
++#define AR5312_ENABLE_WLAN1 \
++ (AR5312_ENABLE_UART_AND_WLAN1_PIO |\
++ AR5312_ENABLE_WLAN1_DMA)
++
++/* AR5312_REV register bit field definitions */
++#define AR5312_REV_WMAC_MAJ 0xf000
++#define AR5312_REV_WMAC_MAJ_S 12
++#define AR5312_REV_WMAC_MIN 0x0f00
++#define AR5312_REV_WMAC_MIN_S 8
++#define AR5312_REV_MAJ 0x00f0
++#define AR5312_REV_MAJ_S 4
++#define AR5312_REV_MIN 0x000f
++#define AR5312_REV_MIN_S 0
++#define AR5312_REV_CHIP (AR5312_REV_MAJ|AR5312_REV_MIN)
+
+/* Major revision numbers, bits 7..4 of Revision ID register */
-+#define AR531X_REV_MAJ_AR5312 0x4
-+#define AR531X_REV_MAJ_AR2313 0x5
++#define AR5312_REV_MAJ_AR5312 0x4
++#define AR5312_REV_MAJ_AR2313 0x5
+
+/* Minor revision numbers, bits 3..0 of Revision ID register */
+#define AR5312_REV_MIN_DUAL 0x0 /* Dual WLAN version */
+#define AR5312_REV_MIN_SINGLE 0x1 /* Single WLAN version */
+
-+/* AR531X_FLASHCTL register bit field definitions */
++/* AR5312_FLASHCTL register bit field definitions */
+#define FLASHCTL_IDCY 0x0000000f /* Idle cycle turn around time */
+#define FLASHCTL_IDCY_S 0
+#define FLASHCTL_WST1 0x000003e0 /* Wait state 1 */
+#define FLASHCTL_ATR4 0xc0000000 /* Access type == retry every 4 */
+
+/* ARM Flash Controller -- 3 flash banks with either x8 or x16 devices. */
-+#define AR531X_FLASHCTL0 (AR531X_FLASHCTL + 0x00)
-+#define AR531X_FLASHCTL1 (AR531X_FLASHCTL + 0x04)
-+#define AR531X_FLASHCTL2 (AR531X_FLASHCTL + 0x08)
++#define AR5312_FLASHCTL0 (AR5312_FLASHCTL + 0x00)
++#define AR5312_FLASHCTL1 (AR5312_FLASHCTL + 0x04)
++#define AR5312_FLASHCTL2 (AR5312_FLASHCTL + 0x08)
+
+/* ARM SDRAM Controller -- just enough to determine memory size */
-+#define AR531X_MEM_CFG1 (AR531X_SDRAMCTL + 0x04)
++#define AR5312_MEM_CFG1 (AR5312_SDRAMCTL + 0x04)
+#define MEM_CFG1_AC0 0x00000700 /* bank 0: SDRAM addr check (added) */
+#define MEM_CFG1_AC0_S 8
+#define MEM_CFG1_AC1 0x00007000 /* bank 1: SDRAM addr check (added) */
+#define MEM_CFG1_AC1_S 12
+
+/* GPIO Address Map */
-+#define AR531X_GPIO (AR531X_APBBASE + 0x2000)
-+#define AR531X_GPIO_DO (AR531X_GPIO + 0x00) /* output register */
-+#define AR531X_GPIO_DI (AR531X_GPIO + 0x04) /* intput register */
-+#define AR531X_GPIO_CR (AR531X_GPIO + 0x08) /* control register */
++#define AR5312_GPIO (AR5312_APBBASE + 0x2000)
++#define AR5312_GPIO_DO (AR5312_GPIO + 0x00) /* output register */
++#define AR5312_GPIO_DI (AR5312_GPIO + 0x04) /* intput register */
++#define AR5312_GPIO_CR (AR5312_GPIO + 0x08) /* control register */
+
+/* GPIO Control Register bit field definitions */
-+#define AR531X_GPIO_CR_M(x) (1 << (x)) /* mask for i/o */
-+#define AR531X_GPIO_CR_O(x) (0 << (x)) /* mask for output */
-+#define AR531X_GPIO_CR_I(x) (1 << (x)) /* mask for input */
-+#define AR531X_GPIO_CR_INT(x) (1 << ((x)+8)) /* mask for interrupt*/
-+#define AR531X_GPIO_CR_UART(x) (1 << ((x)+16)) /* uart multiplex */
-+#define AR531X_NUM_GPIO 8
++#define AR5312_GPIO_CR_M(x) (1 << (x)) /* mask for i/o */
++#define AR5312_GPIO_CR_O(x) (0 << (x)) /* mask for output */
++#define AR5312_GPIO_CR_I(x) (1 << (x)) /* mask for input */
++#define AR5312_GPIO_CR_INT(x) (1 << ((x)+8)) /* mask for interrupt*/
++#define AR5312_GPIO_CR_UART(x) (1 << ((x)+16)) /* uart multiplex */
++#define AR5312_NUM_GPIO 8
+
+
-+#endif
++#endif /* __ASM_MACH_AR231X_AR5312_REGS_H */
+
--- /dev/null
+++ b/arch/mips/ar231x/ar5312.c
-@@ -0,0 +1,582 @@
+@@ -0,0 +1,540 @@
+/*
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file "COPYING" in the main directory of this archive
+#include "devices.h"
+#include "ar5312.h"
+
-+static void
-+ar5312_misc_irq_dispatch(void)
-+{
-+ unsigned int ar231x_misc_intrs = ar231x_read_reg(AR531X_ISR) &
-+ ar231x_read_reg(AR531X_IMR);
-+
-+ if (ar231x_misc_intrs & AR531X_ISR_TIMER) {
-+ do_IRQ(AR531X_MISC_IRQ_TIMER);
-+ (void)ar231x_read_reg(AR531X_TIMER);
-+ } else if (ar231x_misc_intrs & AR531X_ISR_AHBPROC)
-+ do_IRQ(AR531X_MISC_IRQ_AHB_PROC);
-+ else if ((ar231x_misc_intrs & AR531X_ISR_UART0))
-+ do_IRQ(AR531X_MISC_IRQ_UART0);
-+ else if (ar231x_misc_intrs & AR531X_ISR_WD)
-+ do_IRQ(AR531X_MISC_IRQ_WATCHDOG);
++static void ar5312_misc_irq_handler(unsigned irq, struct irq_desc *desc)
++{
++ unsigned int ar231x_misc_intrs = ar231x_read_reg(AR5312_ISR) &
++ ar231x_read_reg(AR5312_IMR);
++
++ if (ar231x_misc_intrs & AR5312_ISR_TIMER) {
++ do_IRQ(AR5312_MISC_IRQ_TIMER);
++ (void)ar231x_read_reg(AR5312_TIMER);
++ } else if (ar231x_misc_intrs & AR5312_ISR_AHBPROC)
++ do_IRQ(AR5312_MISC_IRQ_AHB_PROC);
++ else if ((ar231x_misc_intrs & AR5312_ISR_UART0))
++ do_IRQ(AR5312_MISC_IRQ_UART0);
++ else if (ar231x_misc_intrs & AR5312_ISR_WD)
++ do_IRQ(AR5312_MISC_IRQ_WATCHDOG);
+ else
-+ do_IRQ(AR531X_MISC_IRQ_NONE);
++ do_IRQ(AR5312_MISC_IRQ_NONE);
+}
+
+static asmlinkage void
+ else if (pending & CAUSEF_IP5)
+ do_IRQ(AR5312_IRQ_WLAN1_INTRS);
+ else if (pending & CAUSEF_IP6)
-+ ar5312_misc_irq_dispatch();
++ do_IRQ(AR5312_IRQ_MISC_INTRS);
+ else if (pending & CAUSEF_IP7)
-+ do_IRQ(AR531X_IRQ_CPU_CLOCK);
++ do_IRQ(AR231X_IRQ_CPU_CLOCK);
+}
+
+
-+/* Enable the specified AR531X_MISC_IRQ interrupt */
++/* Enable the specified AR5312_MISC_IRQ interrupt */
+static void
-+ar5312_misc_intr_enable(struct irq_data *d)
++ar5312_misc_irq_unmask(struct irq_data *d)
+{
+ unsigned int imr;
+
-+ imr = ar231x_read_reg(AR531X_IMR);
-+ imr |= (1 << (d->irq - AR531X_MISC_IRQ_BASE - 1));
-+ ar231x_write_reg(AR531X_IMR, imr);
++ imr = ar231x_read_reg(AR5312_IMR);
++ imr |= (1 << (d->irq - AR231X_MISC_IRQ_BASE - 1));
++ ar231x_write_reg(AR5312_IMR, imr);
+}
+
-+/* Disable the specified AR531X_MISC_IRQ interrupt */
++/* Disable the specified AR5312_MISC_IRQ interrupt */
+static void
-+ar5312_misc_intr_disable(struct irq_data *d)
++ar5312_misc_irq_mask(struct irq_data *d)
+{
+ unsigned int imr;
+
-+ imr = ar231x_read_reg(AR531X_IMR);
-+ imr &= ~(1 << (d->irq - AR531X_MISC_IRQ_BASE - 1));
-+ ar231x_write_reg(AR531X_IMR, imr);
-+ ar231x_read_reg(AR531X_IMR); /* flush write buffer */
++ imr = ar231x_read_reg(AR5312_IMR);
++ imr &= ~(1 << (d->irq - AR231X_MISC_IRQ_BASE - 1));
++ ar231x_write_reg(AR5312_IMR, imr);
++ ar231x_read_reg(AR5312_IMR); /* flush write buffer */
+}
+
-+static struct irq_chip ar5312_misc_intr_controller = {
-+ .irq_mask = ar5312_misc_intr_disable,
-+ .irq_unmask = ar5312_misc_intr_enable,
++static struct irq_chip ar5312_misc_irq_chip = {
++ .name = "AR5312-MISC",
++ .irq_unmask = ar5312_misc_irq_unmask,
++ .irq_mask = ar5312_misc_irq_mask,
+};
+
+
+static irqreturn_t ar5312_ahb_proc_handler(int cpl, void *dev_id)
+{
-+ u32 proc1 = ar231x_read_reg(AR531X_PROC1);
-+ u32 proc_addr = ar231x_read_reg(AR531X_PROCADDR); /* clears error */
-+ u32 dma1 = ar231x_read_reg(AR531X_DMA1);
-+ u32 dma_addr = ar231x_read_reg(AR531X_DMAADDR); /* clears error */
++ u32 proc1 = ar231x_read_reg(AR5312_PROC1);
++ u32 proc_addr = ar231x_read_reg(AR5312_PROCADDR); /* clears error */
++ u32 dma1 = ar231x_read_reg(AR5312_DMA1);
++ u32 dma_addr = ar231x_read_reg(AR5312_DMAADDR); /* clears error */
+
+ pr_emerg("AHB interrupt: PROCADDR=0x%8.8x PROC1=0x%8.8x "
+ "DMAADDR=0x%8.8x DMA1=0x%8.8x\n", proc_addr, proc1, dma_addr,
+};
+
+
-+static struct irqaction cascade = {
-+ .handler = no_action,
-+ .name = "cascade",
-+};
-+
+void __init ar5312_irq_init(void)
+{
+ int i;
+ return;
+
+ ar231x_irq_dispatch = ar5312_irq_dispatch;
-+ for (i = 0; i < AR531X_MISC_IRQ_COUNT; i++) {
-+ int irq = AR531X_MISC_IRQ_BASE + i;
-+ irq_set_chip_and_handler(irq, &ar5312_misc_intr_controller,
-+ handle_level_irq);
++ for (i = 0; i < AR5312_MISC_IRQ_COUNT; i++) {
++ int irq = AR231X_MISC_IRQ_BASE + i;
++ irq_set_chip_and_handler(irq, &ar5312_misc_irq_chip,
++ handle_level_irq);
+ }
-+ setup_irq(AR531X_MISC_IRQ_AHB_PROC, &ar5312_ahb_proc_interrupt);
-+ setup_irq(AR5312_IRQ_MISC_INTRS, &cascade);
-+}
-+
-+static u32
-+ar5312_gpio_set_output(u32 mask, u32 val)
-+{
-+ u32 reg;
-+
-+ reg = ar231x_read_reg(AR531X_GPIO_CR);
-+ reg |= mask;
-+ reg &= ~val;
-+ ar231x_write_reg(AR531X_GPIO_CR, reg);
-+ return reg;
-+}
-+
-+static u32
-+ar5312_gpio_get(u32 valid_mask)
-+{
-+ u32 reg;
-+ reg = ar231x_read_reg(AR531X_GPIO_DI);
-+ reg &= valid_mask;
-+ return reg;
-+}
-+
-+static u32
-+ar5312_gpio_set(u32 mask, u32 value)
-+{
-+ u32 reg;
-+ reg = ar231x_read_reg(AR531X_GPIO_DO);
-+ reg &= ~mask;
-+ reg |= value;
-+ ar231x_write_reg(AR531X_GPIO_DO, reg);
-+ return reg;
++ setup_irq(AR5312_MISC_IRQ_AHB_PROC, &ar5312_ahb_proc_interrupt);
++ irq_set_chained_handler(AR5312_IRQ_MISC_INTRS, ar5312_misc_irq_handler);
+}
+
+/*
-+ * gpiolib implementations. Original mask based methods preserved
++ * gpiolib implementations
+ */
+static int
+ar5312_gpio_get_value(struct gpio_chip *chip, unsigned gpio)
+{
-+ struct ar231x_gpio_chip *gpch =
-+ container_of(chip, struct ar231x_gpio_chip, chip);
-+ u32 mask = 1 << gpio;
-+ u32 rett;
-+ if (!(gpch->valid_mask & mask))
-+ return 0;
-+ rett = ar5312_gpio_get(gpch->valid_mask);
-+ return !!(rett & mask);
++ return (ar231x_read_reg(AR5312_GPIO_DI) >> gpio) & 1;
+}
+
+static void
+ar5312_gpio_set_value(struct gpio_chip *chip, unsigned gpio, int value)
+{
-+ struct ar231x_gpio_chip *gpch =
-+ container_of(chip, struct ar231x_gpio_chip, chip);
-+ u32 mask = 1 << gpio;
-+ if (!(gpch->valid_mask & mask))
-+ return;
-+ ar5312_gpio_set(mask, (!!value) * mask);
++ u32 reg = ar231x_read_reg(AR5312_GPIO_DO);
++ reg = value ? reg | (1 << gpio) : reg & ~(1 << gpio);
++ ar231x_write_reg(AR5312_GPIO_DO, reg);
+}
+
+static int
+ar5312_gpio_direction_input(struct gpio_chip *chip, unsigned gpio)
+{
-+ struct ar231x_gpio_chip *gpch =
-+ container_of(chip, struct ar231x_gpio_chip, chip);
-+ u32 mask = 1 << gpio;
-+ if (!(gpch->valid_mask & mask))
-+ return -ENXIO;
-+ ar5312_gpio_set_output(mask, 0);
++ ar231x_mask_reg(AR5312_GPIO_CR, 0, 1 << gpio);
+ return 0;
+}
++
+static int
+ar5312_gpio_direction_output(struct gpio_chip *chip, unsigned gpio, int value)
+{
-+ struct ar231x_gpio_chip *gpch =
-+ container_of(chip, struct ar231x_gpio_chip, chip);
-+ u32 mask = 1 << gpio;
-+ if (!(gpch->valid_mask & mask))
-+ return -ENXIO;
-+ ar5312_gpio_set_output(mask, mask);
-+ ar5312_gpio_set(mask, (!!value) * mask);
++ ar231x_mask_reg(AR5312_GPIO_CR, 1 << gpio, 0);
++ ar5312_gpio_set_value(chip, gpio, value);
+ return 0;
+}
+
-+static struct ar231x_gpio_chip ar5312_gpio_chip = {
-+ .valid_mask = (1 << 22) - 1,
-+ .chip = {
-+ .label = "ar5312-gpio",
-+ .direction_input = ar5312_gpio_direction_input,
-+ .direction_output = ar5312_gpio_direction_output,
-+ .set = ar5312_gpio_set_value,
-+ .get = ar5312_gpio_get_value,
-+ .base = 0,
-+ .ngpio = AR531X_GPIO_IRQ_COUNT, /* 22 */
-+ }
++static struct gpio_chip ar5312_gpio_chip = {
++ .label = "ar5312-gpio",
++ .direction_input = ar5312_gpio_direction_input,
++ .direction_output = ar5312_gpio_direction_output,
++ .set = ar5312_gpio_set_value,
++ .get = ar5312_gpio_get_value,
++ .base = 0,
++ .ngpio = AR5312_NUM_GPIO, /* 8 */
+};
+
+/* end of gpiolib */
+
++static void ar5312_device_reset_set(u32 mask)
++{
++ u32 val;
++
++ val = ar231x_read_reg(AR5312_RESET);
++ ar231x_write_reg(AR5312_RESET, val | mask);
++}
++
++static void ar5312_device_reset_clear(u32 mask)
++{
++ u32 val;
++
++ val = ar231x_read_reg(AR5312_RESET);
++ ar231x_write_reg(AR5312_RESET, val & ~mask);
++}
++
+static struct physmap_flash_data ar5312_flash_data = {
+ .width = 2,
+};
+
+static struct resource ar5312_flash_resource = {
-+ .start = AR531X_FLASH,
-+ .end = AR531X_FLASH + 0x800000 - 1,
++ .start = AR5312_FLASH,
++ .end = AR5312_FLASH + 0x800000 - 1,
+ .flags = IORESOURCE_MEM,
+};
+
+static struct ar231x_eth ar5312_eth0_data = {
-+ .reset_base = AR531X_RESET,
-+ .reset_mac = AR531X_RESET_ENET0,
-+ .reset_phy = AR531X_RESET_EPHY0,
-+ .phy_base = KSEG1ADDR(AR531X_ENET0),
++ .reset_set = ar5312_device_reset_set,
++ .reset_clear = ar5312_device_reset_clear,
++ .reset_mac = AR5312_RESET_ENET0,
++ .reset_phy = AR5312_RESET_EPHY0,
+ .config = &ar231x_board,
+};
+
+static struct ar231x_eth ar5312_eth1_data = {
-+ .reset_base = AR531X_RESET,
-+ .reset_mac = AR531X_RESET_ENET1,
-+ .reset_phy = AR531X_RESET_EPHY1,
-+ .phy_base = KSEG1ADDR(AR531X_ENET1),
++ .reset_set = ar5312_device_reset_set,
++ .reset_clear = ar5312_device_reset_clear,
++ .reset_mac = AR5312_RESET_ENET1,
++ .reset_phy = AR5312_RESET_EPHY1,
+ .config = &ar231x_board,
+};
+
+ (0x01 << FLASHCTL_IDCY_S) |
+ (0x07 << FLASHCTL_WST1_S) |
+ (0x07 << FLASHCTL_WST2_S) |
-+ (ar231x_read_reg(AR531X_FLASHCTL0) & FLASHCTL_MW);
++ (ar231x_read_reg(AR5312_FLASHCTL0) & FLASHCTL_MW);
+
-+ ar231x_write_reg(AR531X_FLASHCTL0, ctl);
++ ar231x_write_reg(AR5312_FLASHCTL0, ctl);
+
+ /* Disable other flash banks */
-+ ar231x_write_reg(AR531X_FLASHCTL1,
-+ ar231x_read_reg(AR531X_FLASHCTL1) &
++ ar231x_write_reg(AR5312_FLASHCTL1,
++ ar231x_read_reg(AR5312_FLASHCTL1) &
+ ~(FLASHCTL_E | FLASHCTL_AC));
+
-+ ar231x_write_reg(AR531X_FLASHCTL2,
-+ ar231x_read_reg(AR531X_FLASHCTL2) &
++ ar231x_write_reg(AR5312_FLASHCTL2,
++ ar231x_read_reg(AR5312_FLASHCTL2) &
+ ~(FLASHCTL_E | FLASHCTL_AC));
+
-+ return (char *)KSEG1ADDR(AR531X_FLASH + 0x800000);
++ return (char *)KSEG1ADDR(AR5312_FLASH + 0x800000);
+}
+
+int __init ar5312_init_devices(void)
+ ar231x_devtype = DEV_TYPE_AR5312;
+
+ /* fixup flash width */
-+ fctl = ar231x_read_reg(AR531X_FLASHCTL) & FLASHCTL_MW;
++ fctl = ar231x_read_reg(AR5312_FLASHCTL) & FLASHCTL_MW;
+ switch (fctl) {
+ case FLASHCTL_MWx16:
+ ar5312_flash_data.width = 2;
+ switch (ar231x_devtype) {
+ case DEV_TYPE_AR5312:
+ ar5312_eth0_data.macaddr = config->enet0_mac;
-+ ar231x_add_ethernet(0, KSEG1ADDR(AR531X_ENET0),
-+ AR5312_IRQ_ENET0_INTRS, &ar5312_eth0_data);
++ ar231x_add_ethernet(0, AR5312_ENET0, "eth0_mii",
++ AR5312_ENET0_MII, AR5312_IRQ_ENET0_INTRS,
++ &ar5312_eth0_data);
+
+ ar5312_eth1_data.macaddr = config->enet1_mac;
-+ ar231x_add_ethernet(1, KSEG1ADDR(AR531X_ENET1),
-+ AR5312_IRQ_ENET1_INTRS, &ar5312_eth1_data);
++ ar231x_add_ethernet(1, AR5312_ENET1, "eth1_mii",
++ AR5312_ENET1_MII, AR5312_IRQ_ENET1_INTRS,
++ &ar5312_eth1_data);
+
+ if (!ar231x_board.radio)
+ return 0;
+ if (!(config->flags & BD_WLAN0))
+ break;
+
-+ ar231x_add_wmac(0, AR531X_WLAN0, AR5312_IRQ_WLAN0_INTRS);
++ ar231x_add_wmac(0, AR5312_WLAN0, AR5312_IRQ_WLAN0_INTRS);
+ break;
+ /*
+ * AR2312/3 ethernet uses the PHY of ENET0, but the MAC
+ */
+ case DEV_TYPE_AR2312:
+ case DEV_TYPE_AR2313:
-+ ar5312_eth1_data.phy_base = ar5312_eth0_data.phy_base;
+ ar5312_eth1_data.reset_phy = ar5312_eth0_data.reset_phy;
+ ar5312_eth1_data.macaddr = config->enet0_mac;
-+ ar231x_add_ethernet(0, KSEG1ADDR(AR531X_ENET1),
-+ AR5312_IRQ_ENET1_INTRS, &ar5312_eth1_data);
++ ar231x_add_ethernet(1, AR5312_ENET1, "eth0_mii",
++ AR5312_ENET0_MII, AR5312_IRQ_ENET1_INTRS,
++ &ar5312_eth1_data);
+
+ if (!ar231x_board.radio)
+ return 0;
+ }
+
+ if (config->flags & BD_WLAN1)
-+ ar231x_add_wmac(1, AR531X_WLAN1, AR5312_IRQ_WLAN1_INTRS);
++ ar231x_add_wmac(1, AR5312_WLAN1, AR5312_IRQ_WLAN1_INTRS);
+
+ return 0;
+}
+ /* reset the system */
+ local_irq_disable();
+ while (1)
-+ ar231x_write_reg(AR531X_RESET, AR531X_RESET_SYSTEM);
++ ar231x_write_reg(AR5312_RESET, AR5312_RESET_SYSTEM);
+}
+
+
+ if (scratch)
+ return scratch;
+
-+ devid = ar231x_read_reg(AR531X_REV);
-+ devid &= AR531X_REV_MAJ;
-+ devid >>= AR531X_REV_MAJ_S;
-+ if (devid == AR531X_REV_MAJ_AR2313) {
++ devid = ar231x_read_reg(AR5312_REV);
++ devid &= AR5312_REV_MAJ;
++ devid >>= AR5312_REV_MAJ_S;
++ if (devid == AR5312_REV_MAJ_AR2313) {
+ predivide_mask = AR2313_CLOCKCTL1_PREDIVIDE_MASK;
+ predivide_shift = AR2313_CLOCKCTL1_PREDIVIDE_SHIFT;
+ multiplier_mask = AR2313_CLOCKCTL1_MULTIPLIER_MASK;
+ mips_hpt_frequency = ar5312_cpu_frequency() / 2;
+}
+
-+int __init
++static int __init
+ar5312_gpio_init(void)
+{
+ int ret;
-+ struct ar231x_gpio_chip *gpch;
-+ gpch = &ar5312_gpio_chip;
-+ ret = gpiochip_add(&gpch->chip);
++ ret = gpiochip_add(&ar5312_gpio_chip);
+ if (ret) {
-+ pr_err("%s: failed to add gpiochip\n", gpch->chip.label);
++ pr_err("%s: failed to add gpiochip\n", ar5312_gpio_chip.label);
+ return ret;
+ }
-+ pr_info("%s: registered %d GPIOs\n", gpch->chip.label,
-+ gpch->chip.ngpio);
++ pr_info("%s: registered %d GPIOs\n", ar5312_gpio_chip.label,
++ ar5312_gpio_chip.ngpio);
+ return ret;
+}
+
+ return;
+
+ /* Detect memory size */
-+ memcfg = ar231x_read_reg(AR531X_MEM_CFG1);
++ memcfg = ar231x_read_reg(AR5312_MEM_CFG1);
+ bank0AC = (memcfg & MEM_CFG1_AC0) >> MEM_CFG1_AC0_S;
+ bank1AC = (memcfg & MEM_CFG1_AC1) >> MEM_CFG1_AC1_S;
+ memsize = (bank0AC ? (1 << (bank0AC+1)) : 0) +
+ memsize <<= 20;
+ add_memory_region(0, memsize, BOOT_MEM_RAM);
+
-+ devid = ar231x_read_reg(AR531X_REV);
-+ devid >>= AR531X_REV_WMAC_MIN_S;
-+ devid &= AR531X_REV_CHIP;
++ devid = ar231x_read_reg(AR5312_REV);
++ devid >>= AR5312_REV_WMAC_MIN_S;
++ devid &= AR5312_REV_CHIP;
+ ar231x_board.devid = (u16) devid;
+ ar5312_gpio_init();
+}
+ return;
+
+ /* Clear any lingering AHB errors */
-+ ar231x_read_reg(AR531X_PROCADDR);
-+ ar231x_read_reg(AR531X_DMAADDR);
-+ ar231x_write_reg(AR531X_WD_CTRL, AR531X_WD_CTRL_IGNORE_EXPIRATION);
++ ar231x_read_reg(AR5312_PROCADDR);
++ ar231x_read_reg(AR5312_DMAADDR);
++ ar231x_write_reg(AR5312_WD_CTRL, AR5312_WD_CTRL_IGNORE_EXPIRATION);
+
+ _machine_restart = ar5312_restart;
-+ ar231x_serial_setup(KSEG1ADDR(AR531X_UART0), ar5312_sys_frequency());
++ ar231x_serial_setup(AR5312_UART0, AR5312_MISC_IRQ_UART0,
++ ar5312_sys_frequency());
+}
+
--- /dev/null
+++ b/arch/mips/ar231x/ar2315.c
-@@ -0,0 +1,623 @@
+@@ -0,0 +1,556 @@
+/*
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file "COPYING" in the main directory of this archive
+
+static u32 gpiointmask, gpiointval;
+
-+static inline void ar2315_gpio_irq(void)
++static void ar2315_gpio_irq_handler(unsigned irq, struct irq_desc *desc)
+{
+ u32 pend;
+ int bit = -1;
+ ar231x_write_reg(AR2315_ISR, AR2315_ISR_GPIO);
+
+ /* Enable interrupt with edge detection */
-+ if ((ar231x_read_reg(AR2315_GPIO_CR) & AR2315_GPIO_CR_M(bit)) !=
-+ AR2315_GPIO_CR_I(bit))
++ if ((ar231x_read_reg(AR2315_GPIO_DIR) & AR2315_GPIO_DIR_M(bit)) !=
++ AR2315_GPIO_DIR_I(bit))
+ return;
+
+ if (bit >= 0)
-+ do_IRQ(AR531X_GPIO_IRQ_BASE + bit);
++ do_IRQ(AR231X_GPIO_IRQ_BASE + bit);
+}
+
++static void ar2315_misc_irq_handler(unsigned irq, struct irq_desc *desc)
++{
++ unsigned int misc_intr = ar231x_read_reg(AR2315_ISR) &
++ ar231x_read_reg(AR2315_IMR);
++
++ if (misc_intr & AR2315_ISR_SPI)
++ do_IRQ(AR2315_MISC_IRQ_SPI);
++ else if (misc_intr & AR2315_ISR_TIMER)
++ do_IRQ(AR2315_MISC_IRQ_TIMER);
++ else if (misc_intr & AR2315_ISR_AHB)
++ do_IRQ(AR2315_MISC_IRQ_AHB);
++ else if (misc_intr & AR2315_ISR_GPIO)
++ do_IRQ(AR2315_MISC_IRQ_GPIO);
++ else if (misc_intr & AR2315_ISR_UART0)
++ do_IRQ(AR2315_MISC_IRQ_UART0);
++ else if (misc_intr & AR2315_ISR_WD) {
++ ar231x_write_reg(AR2315_ISR, AR2315_ISR_WD);
++ do_IRQ(AR2315_MISC_IRQ_WATCHDOG);
++ } else
++ do_IRQ(AR2315_MISC_IRQ_NONE);
++}
+
+/*
+ * Called when an interrupt is received, this function
+ do_IRQ(AR2315_IRQ_WLAN0_INTRS);
+ else if (pending & CAUSEF_IP4)
+ do_IRQ(AR2315_IRQ_ENET0_INTRS);
-+ else if (pending & CAUSEF_IP2) {
-+ unsigned int misc_intr = ar231x_read_reg(AR2315_ISR) &
-+ ar231x_read_reg(AR2315_IMR);
-+
-+ if (misc_intr & AR2315_ISR_SPI)
-+ do_IRQ(AR531X_MISC_IRQ_SPI);
-+ else if (misc_intr & AR2315_ISR_TIMER)
-+ do_IRQ(AR531X_MISC_IRQ_TIMER);
-+ else if (misc_intr & AR2315_ISR_AHB)
-+ do_IRQ(AR531X_MISC_IRQ_AHB_PROC);
-+ else if (misc_intr & AR2315_ISR_GPIO)
-+ ar2315_gpio_irq();
-+ else if (misc_intr & AR2315_ISR_UART0)
-+ do_IRQ(AR531X_MISC_IRQ_UART0);
-+ else if (misc_intr & AR2315_ISR_WD)
-+ do_IRQ(AR531X_MISC_IRQ_WATCHDOG);
-+ else
-+ do_IRQ(AR531X_MISC_IRQ_NONE);
-+ } else if (pending & CAUSEF_IP7)
-+ do_IRQ(AR531X_IRQ_CPU_CLOCK);
++ else if (pending & CAUSEF_IP2)
++ do_IRQ(AR2315_IRQ_MISC_INTRS);
++ else if (pending & CAUSEF_IP7)
++ do_IRQ(AR231X_IRQ_CPU_CLOCK);
+}
+
+static void ar2315_set_gpiointmask(int gpio, int level)
+ ar231x_write_reg(AR2315_GPIO_INT, reg);
+}
+
-+static void ar2315_gpio_intr_enable(struct irq_data *d)
++static void ar2315_gpio_irq_unmask(struct irq_data *d)
+{
-+ unsigned int gpio = d->irq - AR531X_GPIO_IRQ_BASE;
++ unsigned int gpio = d->irq - AR231X_GPIO_IRQ_BASE;
+
+ /* Enable interrupt with edge detection */
-+ if ((ar231x_read_reg(AR2315_GPIO_CR) & AR2315_GPIO_CR_M(gpio)) !=
-+ AR2315_GPIO_CR_I(gpio))
++ if ((ar231x_read_reg(AR2315_GPIO_DIR) & AR2315_GPIO_DIR_M(gpio)) !=
++ AR2315_GPIO_DIR_I(gpio))
+ return;
+
+ gpiointmask |= (1 << gpio);
+ ar2315_set_gpiointmask(gpio, 3);
+}
+
-+static void ar2315_gpio_intr_disable(struct irq_data *d)
++static void ar2315_gpio_irq_mask(struct irq_data *d)
+{
-+ unsigned int gpio = d->irq - AR531X_GPIO_IRQ_BASE;
++ unsigned int gpio = d->irq - AR231X_GPIO_IRQ_BASE;
+
+ /* Disable interrupt */
+ gpiointmask &= ~(1 << gpio);
+ ar2315_set_gpiointmask(gpio, 0);
+}
+
-+static struct irq_chip ar2315_gpio_intr_controller = {
-+ .irq_mask = ar2315_gpio_intr_disable,
-+ .irq_unmask = ar2315_gpio_intr_enable,
++static struct irq_chip ar2315_gpio_irq_chip = {
++ .name = "AR2315-GPIO",
++ .irq_unmask = ar2315_gpio_irq_unmask,
++ .irq_mask = ar2315_gpio_irq_mask,
+};
+
+static void
-+ar2315_misc_intr_enable(struct irq_data *d)
++ar2315_misc_irq_unmask(struct irq_data *d)
+{
+ unsigned int imr;
+
+ imr = ar231x_read_reg(AR2315_IMR);
-+ switch (d->irq) {
-+ case AR531X_MISC_IRQ_SPI:
-+ imr |= AR2315_ISR_SPI;
-+ break;
-+ case AR531X_MISC_IRQ_TIMER:
-+ imr |= AR2315_ISR_TIMER;
-+ break;
-+ case AR531X_MISC_IRQ_AHB_PROC:
-+ imr |= AR2315_ISR_AHB;
-+ break;
-+ case AR531X_MISC_IRQ_GPIO:
-+ imr |= AR2315_ISR_GPIO;
-+ break;
-+ case AR531X_MISC_IRQ_UART0:
-+ imr |= AR2315_ISR_UART0;
-+ break;
-+ case AR531X_MISC_IRQ_WATCHDOG:
-+ imr |= AR2315_ISR_WD;
-+ break;
-+ default:
-+ break;
-+ }
++ imr |= 1 << (d->irq - AR231X_MISC_IRQ_BASE - 1);
+ ar231x_write_reg(AR2315_IMR, imr);
+}
+
+static void
-+ar2315_misc_intr_disable(struct irq_data *d)
++ar2315_misc_irq_mask(struct irq_data *d)
+{
+ unsigned int imr;
+
+ imr = ar231x_read_reg(AR2315_IMR);
-+ switch (d->irq) {
-+ case AR531X_MISC_IRQ_SPI:
-+ imr &= ~AR2315_ISR_SPI;
-+ break;
-+ case AR531X_MISC_IRQ_TIMER:
-+ imr &= ~AR2315_ISR_TIMER;
-+ break;
-+ case AR531X_MISC_IRQ_AHB_PROC:
-+ imr &= ~AR2315_ISR_AHB;
-+ break;
-+ case AR531X_MISC_IRQ_GPIO:
-+ imr &= ~AR2315_ISR_GPIO;
-+ break;
-+ case AR531X_MISC_IRQ_UART0:
-+ imr &= ~AR2315_ISR_UART0;
-+ break;
-+ case AR531X_MISC_IRQ_WATCHDOG:
-+ imr &= ~AR2315_ISR_WD;
-+ break;
-+ default:
-+ break;
-+ }
++ imr &= ~(1 << (d->irq - AR231X_MISC_IRQ_BASE - 1));
+ ar231x_write_reg(AR2315_IMR, imr);
+}
+
-+static struct irq_chip ar2315_misc_intr_controller = {
-+ .irq_mask = ar2315_misc_intr_disable,
-+ .irq_unmask = ar2315_misc_intr_enable,
++static struct irq_chip ar2315_misc_irq_chip = {
++ .name = "AR2315-MISC",
++ .irq_unmask = ar2315_misc_irq_unmask,
++ .irq_mask = ar2315_misc_irq_mask,
+};
+
+static irqreturn_t ar2315_ahb_proc_handler(int cpl, void *dev_id)
+ .name = "ar2315_ahb_proc_interrupt",
+};
+
-+static struct irqaction cascade = {
-+ .handler = no_action,
-+ .name = "cascade",
-+};
-+
+void
+ar2315_irq_init(void)
+{
+
+ ar231x_irq_dispatch = ar2315_irq_dispatch;
+ gpiointval = ar231x_read_reg(AR2315_GPIO_DI);
-+ for (i = 0; i < AR531X_MISC_IRQ_COUNT; i++) {
-+ int irq = AR531X_MISC_IRQ_BASE + i;
-+ irq_set_chip_and_handler(irq, &ar2315_misc_intr_controller,
++ for (i = 0; i < AR2315_MISC_IRQ_COUNT; i++) {
++ int irq = AR231X_MISC_IRQ_BASE + i;
++ irq_set_chip_and_handler(irq, &ar2315_misc_irq_chip,
+ handle_level_irq);
+ }
-+ for (i = 0; i < AR531X_GPIO_IRQ_COUNT; i++) {
-+ int irq = AR531X_GPIO_IRQ_BASE + i;
-+ irq_set_chip_and_handler(irq, &ar2315_gpio_intr_controller,
++ for (i = 0; i < AR2315_NUM_GPIO; i++) {
++ int irq = AR231X_GPIO_IRQ_BASE + i;
++ irq_set_chip_and_handler(irq, &ar2315_gpio_irq_chip,
+ handle_level_irq);
+ }
-+ setup_irq(AR531X_MISC_IRQ_GPIO, &cascade);
-+ setup_irq(AR531X_MISC_IRQ_AHB_PROC, &ar2315_ahb_proc_interrupt);
-+ setup_irq(AR2315_IRQ_MISC_INTRS, &cascade);
-+}
-+
-+static u32
-+ar2315_gpio_set_output(u32 mask, u32 val)
-+{
-+ u32 reg;
-+
-+ reg = ar231x_read_reg(AR2315_GPIO_CR);
-+ reg &= ~mask;
-+ reg |= val;
-+ ar231x_write_reg(AR2315_GPIO_CR, reg);
-+ return reg;
-+}
-+
-+static u32
-+ar2315_gpio_get(u32 valid_mask)
-+{
-+ u32 reg;
-+ reg = ar231x_read_reg(AR2315_GPIO_DI);
-+ reg &= valid_mask;
-+ return reg;
-+}
-+
-+static u32
-+ar2315_gpio_set(u32 mask, u32 value)
-+{
-+ u32 reg;
-+ reg = ar231x_read_reg(AR2315_GPIO_DO);
-+ reg &= ~mask;
-+ reg |= value;
-+ ar231x_write_reg(AR2315_GPIO_DO, reg);
-+ return reg;
++ irq_set_chained_handler(AR2315_MISC_IRQ_GPIO, ar2315_gpio_irq_handler);
++ setup_irq(AR2315_MISC_IRQ_AHB, &ar2315_ahb_proc_interrupt);
++ irq_set_chained_handler(AR2315_IRQ_MISC_INTRS, ar2315_misc_irq_handler);
+}
+
+/*
-+ * gpiolib implementation. Original legacy mask based methods
-+ * preserved for now.
++ * gpiolib implementation
+ */
+static int
+ar2315_gpio_get_value(struct gpio_chip *chip, unsigned gpio)
+{
-+ struct ar231x_gpio_chip *gpch =
-+ container_of(chip, struct ar231x_gpio_chip, chip);
-+ u32 mask = 1 << gpio;
-+ u32 rett;
-+ if (!(gpch->valid_mask & mask))
-+ return 0;
-+ rett = ar2315_gpio_get(gpch->valid_mask); /* legacy code */
-+ return !!(rett & mask);
++ return (ar231x_read_reg(AR2315_GPIO_DI) >> gpio) & 1;
+}
+
+static void
+ar2315_gpio_set_value(struct gpio_chip *chip, unsigned gpio, int value)
+{
-+ struct ar231x_gpio_chip *gpch =
-+ container_of(chip, struct ar231x_gpio_chip, chip);
-+ u32 mask = 1 << gpio;
-+ if (!(gpch->valid_mask & mask))
-+ return;
-+ ar2315_gpio_set(mask, (!!value) * mask); /* legacy */
++ u32 reg = ar231x_read_reg(AR2315_GPIO_DO);
++ reg = value ? reg | (1 << gpio) : reg & ~(1 << gpio);
++ ar231x_write_reg(AR2315_GPIO_DO, reg);
+}
+
+static int
+ar2315_gpio_direction_input(struct gpio_chip *chip, unsigned gpio)
+{
-+ struct ar231x_gpio_chip *gpch =
-+ container_of(chip, struct ar231x_gpio_chip, chip);
-+ u32 mask = 1 << gpio;
-+ if (!(gpch->valid_mask & mask))
-+ return -ENXIO;
-+ ar2315_gpio_set_output(mask, 0); /* legacy */
++ ar231x_mask_reg(AR2315_GPIO_DIR, 1 << gpio, 0);
+ return 0;
+}
+
+static int
+ar2315_gpio_direction_output(struct gpio_chip *chip, unsigned gpio, int value)
+{
-+ struct ar231x_gpio_chip *gpch =
-+ container_of(chip, struct ar231x_gpio_chip, chip);
-+ u32 mask = 1 << gpio;
-+ if (!(gpch->valid_mask & mask))
-+ return -ENXIO;
-+ ar2315_gpio_set_output(mask, mask); /* both legacy */
-+ ar2315_gpio_set(mask, (!!value) * mask);
++ ar231x_mask_reg(AR2315_GPIO_DIR, 0, 1 << gpio);
++ ar2315_gpio_set_value(chip, gpio, value);
+ return 0;
+}
+
-+static struct ar231x_gpio_chip ar2315_gpio_chip = {
-+ .valid_mask = (1 << 22) - 1,
-+ .chip = {
-+ .label = "ar2315-gpio",
-+ .direction_input = ar2315_gpio_direction_input,
-+ .direction_output = ar2315_gpio_direction_output,
-+ .set = ar2315_gpio_set_value,
-+ .get = ar2315_gpio_get_value,
-+ .base = 0,
-+ .ngpio = AR531X_GPIO_IRQ_COUNT, /* 22 */
-+ }
++static struct gpio_chip ar2315_gpio_chip = {
++ .label = "ar2315-gpio",
++ .direction_input = ar2315_gpio_direction_input,
++ .direction_output = ar2315_gpio_direction_output,
++ .set = ar2315_gpio_set_value,
++ .get = ar2315_gpio_get_value,
++ .base = 0,
++ .ngpio = AR2315_NUM_GPIO, /* 22 */
+};
+
+/* end of gpiolib */
+
++static void ar2315_device_reset_set(u32 mask)
++{
++ u32 val;
++
++ val = ar231x_read_reg(AR2315_RESET);
++ ar231x_write_reg(AR2315_RESET, val | mask);
++}
++
++static void ar2315_device_reset_clear(u32 mask)
++{
++ u32 val;
++
++ val = ar231x_read_reg(AR2315_RESET);
++ ar231x_write_reg(AR2315_RESET, val & ~mask);
++}
+
+static struct ar231x_eth ar2315_eth_data = {
-+ .reset_base = AR2315_RESET,
++ .reset_set = ar2315_device_reset_set,
++ .reset_clear = ar2315_device_reset_clear,
+ .reset_mac = AR2315_RESET_ENET0,
+ .reset_phy = AR2315_RESET_EPHY0,
-+ .phy_base = KSEG1ADDR(AR2315_ENET0),
+ .config = &ar231x_board,
+};
+
+static struct resource ar2315_spiflash_res[] = {
+ {
-+ .name = "flash_base",
++ .name = "spiflash_read",
+ .flags = IORESOURCE_MEM,
-+ .start = KSEG1ADDR(AR2315_SPI_READ),
-+ .end = KSEG1ADDR(AR2315_SPI_READ) + 0x1000000 - 1,
++ .start = AR2315_SPI_READ,
++ .end = AR2315_SPI_READ + 0x1000000 - 1,
+ },
+ {
-+ .name = "flash_regs",
++ .name = "spiflash_mmr",
+ .flags = IORESOURCE_MEM,
-+ .start = 0x11300000,
-+ .end = 0x11300012,
++ .start = AR2315_SPI_MMR,
++ .end = AR2315_SPI_MMR + 12 - 1,
+ },
+};
+
+static struct platform_device ar2315_spiflash = {
+ .id = 0,
-+ .name = "spiflash",
++ .name = "ar2315-spiflash",
+ .resource = ar2315_spiflash_res,
+ .num_resources = ARRAY_SIZE(ar2315_spiflash_res)
+};
+
++static struct resource ar2315_wdt_res[] = {
++ {
++ .flags = IORESOURCE_MEM,
++ .start = AR2315_WD,
++ .end = AR2315_WD + 8 - 1,
++ },
++ {
++ .flags = IORESOURCE_IRQ,
++ .start = AR2315_MISC_IRQ_WATCHDOG,
++ .end = AR2315_MISC_IRQ_WATCHDOG,
++ }
++};
++
+static struct platform_device ar2315_wdt = {
+ .id = 0,
-+ .name = "ar2315_wdt",
++ .name = "ar2315-wdt",
++ .resource = ar2315_wdt_res,
++ .num_resources = ARRAY_SIZE(ar2315_wdt_res)
+};
+
+/*
+ */
+static u8 __init *ar2315_flash_limit(void)
+{
-+ return (u8 *)ar2315_spiflash_res[0].end + 1;
++ return (u8 *)KSEG1ADDR(ar2315_spiflash_res[0].end + 1);
+}
+
+#ifdef CONFIG_LEDS_GPIO
+ ar2315_init_gpio_leds();
+ platform_device_register(&ar2315_wdt);
+ platform_device_register(&ar2315_spiflash);
-+ ar231x_add_ethernet(0, KSEG1ADDR(AR2315_ENET0), AR2315_IRQ_ENET0_INTRS,
-+ &ar2315_eth_data);
++ ar231x_add_ethernet(0, AR2315_ENET0, "eth0_mii", AR2315_ENET0_MII,
++ AR2315_IRQ_ENET0_INTRS, &ar2315_eth_data);
+ ar231x_add_wmac(0, AR2315_WLAN0, AR2315_IRQ_WLAN0_INTRS);
+
+ return 0;
+ mips_hpt_frequency = ar2315_cpu_frequency() / 2;
+}
+
-+int __init
++static int __init
+ar2315_gpio_init(void)
+{
+ int ret;
-+ struct ar231x_gpio_chip *gpch;
-+ gpch = &ar2315_gpio_chip;
-+ ret = gpiochip_add(&gpch->chip);
++ ret = gpiochip_add(&ar2315_gpio_chip);
+ if (ret) {
-+ pr_err("%s: failed to add gpiochip\n", gpch->chip.label);
++ pr_err("%s: failed to add gpiochip\n", ar2315_gpio_chip.label);
+ return ret;
+ }
-+ pr_info("%s: registered %d GPIOs\n", gpch->chip.label,
-+ gpch->chip.ngpio);
++ pr_info("%s: registered %d GPIOs\n", ar2315_gpio_chip.label,
++ ar2315_gpio_chip.ngpio);
+ return ret;
+}
+
+ ar231x_write_reg(AR2315_WDC, AR2315_WDC_IGNORE_EXPIRATION);
+
+ _machine_restart = ar2315_restart;
-+ ar231x_serial_setup(KSEG1ADDR(AR2315_UART0), ar2315_apb_frequency());
++ ar231x_serial_setup(AR2315_UART0, AR2315_MISC_IRQ_UART0,
++ ar2315_apb_frequency());
+}
--- /dev/null
+++ b/arch/mips/ar231x/ar2315.h
+#endif
--- /dev/null
+++ b/arch/mips/include/asm/mach-ar231x/ar231x.h
-@@ -0,0 +1,57 @@
-+#ifndef __AR531X_H
-+#define __AR531X_H
+@@ -0,0 +1,43 @@
++#ifndef __ASM_MACH_AR231X_H
++#define __ASM_MACH_AR231X_H
+
+#include <linux/types.h>
+#include <linux/io.h>
+
-+#define AR531X_MISC_IRQ_BASE 0x20
-+#define AR531X_GPIO_IRQ_BASE 0x30
++#define AR231X_MISC_IRQ_BASE 0x20
++#define AR231X_GPIO_IRQ_BASE 0x30
+
+/* Software's idea of interrupts handled by "CPU Interrupt Controller" */
-+#define AR531X_IRQ_NONE (MIPS_CPU_IRQ_BASE+0)
-+#define AR531X_IRQ_CPU_CLOCK (MIPS_CPU_IRQ_BASE+7) /* C0_CAUSE: 0x8000 */
-+
-+/* Miscellaneous interrupts, which share IP6 */
-+#define AR531X_MISC_IRQ_NONE (AR531X_MISC_IRQ_BASE+0)
-+#define AR531X_MISC_IRQ_TIMER (AR531X_MISC_IRQ_BASE+1)
-+#define AR531X_MISC_IRQ_AHB_PROC (AR531X_MISC_IRQ_BASE+2)
-+#define AR531X_MISC_IRQ_AHB_DMA (AR531X_MISC_IRQ_BASE+3)
-+#define AR531X_MISC_IRQ_GPIO (AR531X_MISC_IRQ_BASE+4)
-+#define AR531X_MISC_IRQ_UART0 (AR531X_MISC_IRQ_BASE+5)
-+#define AR531X_MISC_IRQ_UART0_DMA (AR531X_MISC_IRQ_BASE+6)
-+#define AR531X_MISC_IRQ_WATCHDOG (AR531X_MISC_IRQ_BASE+7)
-+#define AR531X_MISC_IRQ_LOCAL (AR531X_MISC_IRQ_BASE+8)
-+#define AR531X_MISC_IRQ_SPI (AR531X_MISC_IRQ_BASE+9)
-+#define AR531X_MISC_IRQ_COUNT 10
-+
-+/* GPIO Interrupts [0..7], share AR531X_MISC_IRQ_GPIO */
-+#define AR531X_GPIO_IRQ_NONE (AR531X_GPIO_IRQ_BASE+0)
-+#define AR531X_GPIO_IRQ(n) (AR531X_GPIO_IRQ_BASE+n)
-+#define AR531X_GPIO_IRQ_COUNT 22
++#define AR231X_IRQ_NONE (MIPS_CPU_IRQ_BASE+0)
++#define AR231X_IRQ_CPU_CLOCK (MIPS_CPU_IRQ_BASE+7) /* C0_CAUSE: 0x8000 */
++
++/* GPIO Interrupts, share ARXXXX_MISC_IRQ_GPIO */
++#define AR231X_GPIO_IRQ_NONE (AR231X_GPIO_IRQ_BASE+0)
++#define AR231X_GPIO_IRQ(n) (AR231X_GPIO_IRQ_BASE+n)
+
+static inline u32
+ar231x_read_reg(u32 reg)
+{
-+ return __raw_readl((u32 *)KSEG1ADDR(reg));
++ return __raw_readl((void __iomem *)KSEG1ADDR(reg));
+}
+
+static inline void
+ar231x_write_reg(u32 reg, u32 val)
+{
-+ __raw_writel(val, (u32 *)KSEG1ADDR(reg));
++ __raw_writel(val, (void __iomem *)KSEG1ADDR(reg));
+}
+
+static inline u32
+ return ret;
+}
+
-+#endif
++#endif /* __ASM_MACH_AR231X_H */
--- /dev/null
+++ b/arch/mips/ar231x/devices.h
-@@ -0,0 +1,42 @@
+@@ -0,0 +1,38 @@
+#ifndef __AR231X_DEVICES_H
+#define __AR231X_DEVICES_H
-+#include <linux/gpio.h>
+
+enum {
+ /* handled by ar5312.c */
+extern asmlinkage void (*ar231x_irq_dispatch)(void);
+
+extern int ar231x_find_config(u8 *flash_limit);
-+extern void ar231x_serial_setup(u32 mapbase, unsigned int uartclk);
++extern void ar231x_serial_setup(u32 mapbase, int irq, unsigned int uartclk);
+extern int ar231x_add_wmac(int nr, u32 base, int irq);
-+extern int ar231x_add_ethernet(int nr, u32 base, int irq, void *pdata);
++extern int ar231x_add_ethernet(int nr, u32 base, const char *mii_name,
++ u32 mii_base, int irq, void *pdata);
+
+static inline bool is_2315(void)
+{
+ return !is_2315();
+}
+
-+struct ar231x_gpio_chip {
-+ u32 valid_mask;
-+ struct gpio_chip chip;
-+};
+#endif
--- /dev/null
+++ b/arch/mips/ar231x/devices.c
-@@ -0,0 +1,168 @@
+@@ -0,0 +1,180 @@
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/serial.h>
+ .flags = IORESOURCE_MEM,
+ },
+ {
++ .name = "eth0_mii",
++ .flags = IORESOURCE_MEM,
++ },
++ {
+ .name = "eth0_irq",
+ .flags = IORESOURCE_IRQ,
+ }
+ .flags = IORESOURCE_MEM,
+ },
+ {
++ .name = "eth1_mii",
++ .flags = IORESOURCE_MEM,
++ },
++ {
+ .name = "eth1_irq",
+ .flags = IORESOURCE_IRQ,
+ }
+
+
+int __init
-+ar231x_add_ethernet(int nr, u32 base, int irq, void *pdata)
++ar231x_add_ethernet(int nr, u32 base, const char *mii_name, u32 mii_base,
++ int irq, void *pdata)
+{
+ struct resource *res;
+
+ res->start = base;
+ res->end = base + 0x2000 - 1;
+ res++;
++ res->name = mii_name;
++ res->start = mii_base;
++ res->end = mii_base + 8 - 1;
++ res++;
+ res->start = irq;
+ res->end = irq;
+ return platform_device_register(&ar231x_eth[nr]);
+}
+
+void __init
-+ar231x_serial_setup(u32 mapbase, unsigned int uartclk)
++ar231x_serial_setup(u32 mapbase, int irq, unsigned int uartclk)
+{
+ struct uart_port s;
+
+ memset(&s, 0, sizeof(s));
+
-+ s.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST;
-+ s.iotype = UPIO_MEM;
-+ s.irq = AR531X_MISC_IRQ_UART0;
++ s.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_IOREMAP;
++ s.iotype = UPIO_MEM32;
++ s.irq = irq;
+ s.regshift = 2;
+ s.mapbase = mapbase;
+ s.uartclk = uartclk;
-+ s.membase = (void __iomem *)s.mapbase;
+
+ early_serial_setup(&s);
+}