From: Felix Fietkau Date: Fri, 13 Mar 2015 03:01:04 +0000 (+0000) Subject: atheros: v3.18: remap main SoC MMR memory X-Git-Tag: reboot~4012 X-Git-Url: http://git.lede-project.org./?a=commitdiff_plain;h=892ef42a7701a50dd05168575f6b13650a1bc9a1;p=openwrt%2Fstaging%2Fxback.git atheros: v3.18: remap main SoC MMR memory Honestly remap main SoC MMR mem and use accessor functions to interact with registers. Now registers defined relatively to base address (e.g. SDRAM controller base address). Signed-off-by: Sergey Ryazanov SVN-Revision: 44723 --- diff --git a/target/linux/atheros/patches-3.18/100-board.patch b/target/linux/atheros/patches-3.18/100-board.patch index f4f79d8f78..afb8217018 100644 --- a/target/linux/atheros/patches-3.18/100-board.patch +++ b/target/linux/atheros/patches-3.18/100-board.patch @@ -629,7 +629,7 @@ +#endif /* __ASM_MACH_ATH25_WAR_H */ --- /dev/null +++ b/arch/mips/include/asm/mach-ath25/ar2315_regs.h -@@ -0,0 +1,470 @@ +@@ -0,0 +1,480 @@ +/* + * Register definitions for AR2315+ + * @@ -676,10 +676,12 @@ +#define AR2315_WLAN0 0x10000000 /* Wireless MMR */ +#define AR2315_PCI 0x10100000 /* PCI MMR */ +#define AR2315_PCI_SIZE 0x00001000 -+#define AR2315_SDRAMCTL 0x10300000 /* SDRAM MMR */ -+#define AR2315_LOCAL 0x10400000 /* LOCAL BUS MMR */ ++#define AR2315_SDRAMCTL_BASE 0x10300000 /* SDRAM MMR */ ++#define AR2315_SDRAMCTL_SIZE 0x00000020 ++#define AR2315_LOCAL_BASE 0x10400000 /* Local bus MMR */ +#define AR2315_ENET0 0x10500000 /* ETHERNET MMR */ -+#define AR2315_DSLBASE 0x11000000 /* RESET CONTROL MMR */ ++#define AR2315_RST_BASE 0x11000000 /* Reset control MMR */ ++#define AR2315_RST_SIZE 0x00000100 +#define AR2315_UART0 0x11100000 /* UART MMR */ +#define AR2315_SPI_MMR 0x11300000 /* SPI FLASH MMR */ +#define AR2315_PCIEXT 0x80000000 /* pci external */ @@ -691,7 +693,7 @@ +/* + * Cold reset register + */ -+#define AR2315_COLD_RESET (AR2315_DSLBASE + 0x0000) ++#define AR2315_COLD_RESET 0x0000 + +#define AR2315_RESET_COLD_AHB 0x00000001 +#define AR2315_RESET_COLD_APB 0x00000002 @@ -706,7 +708,7 @@ +/* + * Reset register + */ -+#define AR2315_RESET (AR2315_DSLBASE + 0x0004) ++#define AR2315_RESET 0x0004 + +/* warm reset WLAN0 MAC */ +#define AR2315_RESET_WARM_WLAN0_MAC 0x00000001 @@ -736,7 +738,7 @@ +/* + * AHB master arbitration control + */ -+#define AR2315_AHB_ARB_CTL (AR2315_DSLBASE + 0x0008) ++#define AR2315_AHB_ARB_CTL 0x0008 + +/* CPU, default */ +#define AR2315_ARB_CPU 0x00000001 @@ -756,7 +758,7 @@ +/* + * Config Register + */ -+#define AR2315_ENDIAN_CTL (AR2315_DSLBASE + 0x000c) ++#define AR2315_ENDIAN_CTL 0x000c + +/* EC - AHB bridge endianess */ +#define AR2315_CONFIG_AHB 0x00000001 @@ -789,14 +791,14 @@ +/* + * NMI control + */ -+#define AR2315_NMI_CTL (AR2315_DSLBASE + 0x0010) ++#define AR2315_NMI_CTL 0x0010 + +#define AR2315_NMI_EN 1 + +/* + * Revision Register - Initial value is 0x3010 (WMAC 3.0, AR231X 1.0). + */ -+#define AR2315_SREV (AR2315_DSLBASE + 0x0014) ++#define AR2315_SREV 0x0014 + +#define AR2315_REV_MAJ 0x00f0 +#define AR2315_REV_MAJ_S 4 @@ -807,7 +809,7 @@ +/* + * Interface Enable + */ -+#define AR2315_IF_CTL (AR2315_DSLBASE + 0x0018) ++#define AR2315_IF_CTL 0x0018 + +#define AR2315_IF_MASK 0x00000007 +#define AR2315_IF_DISABLED 0 @@ -829,9 +831,9 @@ + * APB Interrupt control + */ + -+#define AR2315_ISR (AR2315_DSLBASE + 0x0020) -+#define AR2315_IMR (AR2315_DSLBASE + 0x0024) -+#define AR2315_GISR (AR2315_DSLBASE + 0x0028) ++#define AR2315_ISR 0x0020 ++#define AR2315_IMR 0x0024 ++#define AR2315_GISR 0x0028 + +#define AR2315_ISR_UART0 0x0001 /* high speed UART */ +#define AR2315_ISR_I2C_RSVD 0x0002 /* I2C bus */ @@ -854,10 +856,11 @@ +/* + * Timers + */ -+#define AR2315_TIMER (AR2315_DSLBASE + 0x0030) -+#define AR2315_RELOAD (AR2315_DSLBASE + 0x0034) -+#define AR2315_WD (AR2315_DSLBASE + 0x0038) -+#define AR2315_WDC (AR2315_DSLBASE + 0x003c) ++#define AR2315_TIMER 0x0030 ++#define AR2315_RELOAD 0x0034 ++ ++#define AR2315_WD 0x0038 ++#define AR2315_WDC 0x003c + +#define AR2315_WDC_IGNORE_EXPIRATION 0x00000000 +#define AR2315_WDC_NMI 0x00000001 /* NMI on watchdog */ @@ -866,8 +869,8 @@ +/* + * CPU Performance Counters + */ -+#define AR2315_PERFCNT0 (AR2315_DSLBASE + 0x0048) -+#define AR2315_PERFCNT1 (AR2315_DSLBASE + 0x004c) ++#define AR2315_PERFCNT0 0x0048 ++#define AR2315_PERFCNT1 0x004c + +#define AR2315_PERF0_DATAHIT 0x0001 /* Count Data Cache Hits */ +#define AR2315_PERF0_DATAMISS 0x0002 /* Count Data Cache Misses */ @@ -888,11 +891,11 @@ +/* + * AHB Error Reporting. + */ -+#define AR2315_AHB_ERR0 (AR2315_DSLBASE + 0x0050) /* error */ -+#define AR2315_AHB_ERR1 (AR2315_DSLBASE + 0x0054) /* haddr */ -+#define AR2315_AHB_ERR2 (AR2315_DSLBASE + 0x0058) /* hwdata */ -+#define AR2315_AHB_ERR3 (AR2315_DSLBASE + 0x005c) /* hrdata */ -+#define AR2315_AHB_ERR4 (AR2315_DSLBASE + 0x0060) /* status */ ++#define AR2315_AHB_ERR0 0x0050 /* error */ ++#define AR2315_AHB_ERR1 0x0054 /* haddr */ ++#define AR2315_AHB_ERR2 0x0058 /* hwdata */ ++#define AR2315_AHB_ERR3 0x005c /* hrdata */ ++#define AR2315_AHB_ERR4 0x0060 /* status */ + +#define AHB_ERROR_DET 1 /* AHB Error has been detected, */ + /* write 1 to clear all bits in ERR0 */ @@ -920,13 +923,13 @@ +/* + * Clock Control + */ -+#define AR2315_PLLC_CTL (AR2315_DSLBASE + 0x0064) -+#define AR2315_PLLV_CTL (AR2315_DSLBASE + 0x0068) -+#define AR2315_CPUCLK (AR2315_DSLBASE + 0x006c) -+#define AR2315_AMBACLK (AR2315_DSLBASE + 0x0070) -+#define AR2315_SYNCCLK (AR2315_DSLBASE + 0x0074) -+#define AR2315_DSL_SLEEP_CTL (AR2315_DSLBASE + 0x0080) -+#define AR2315_DSL_SLEEP_DUR (AR2315_DSLBASE + 0x0084) ++#define AR2315_PLLC_CTL 0x0064 ++#define AR2315_PLLV_CTL 0x0068 ++#define AR2315_CPUCLK 0x006c ++#define AR2315_AMBACLK 0x0070 ++#define AR2315_SYNCCLK 0x0074 ++#define AR2315_DSL_SLEEP_CTL 0x0080 ++#define AR2315_DSL_SLEEP_DUR 0x0084 + +/* PLLc Control fields */ +#define PLLC_REF_DIV_M 0x00000003 @@ -953,14 +956,14 @@ +#define AMBACLK_CLK_DIV_S 2 + +/* GPIO MMR base address */ -+#define AR2315_GPIO (AR2315_DSLBASE + 0x0088) ++#define AR2315_GPIO 0x0088 + +#define AR2315_RESET_GPIO 5 + +/* + * PCI Clock Control + */ -+#define AR2315_PCICLK (AR2315_DSLBASE + 0x00a4) ++#define AR2315_PCICLK 0x00a4 + +#define AR2315_PCICLK_INPUT_M 0x3 +#define AR2315_PCICLK_INPUT_S 0 @@ -981,7 +984,8 @@ +/* + * Observation Control Register + */ -+#define AR2315_OCR (AR2315_DSLBASE + 0x00b0) ++#define AR2315_OCR 0x00b0 ++ +#define OCR_GPIO0_IRIN 0x0040 +#define OCR_GPIO1_IROUT 0x0080 +#define OCR_GPIO3_RXCLR 0x0200 @@ -989,8 +993,8 @@ +/* + * General Clock Control + */ ++#define AR2315_MISCCLK 0x00b4 + -+#define AR2315_MISCCLK (AR2315_DSLBASE + 0x00b4) +#define MISCCLK_PLLBYPASS_EN 0x00000001 +#define MISCCLK_PROCREFCLK 0x00000002 + @@ -998,9 +1002,9 @@ + * SDRAM Controller + * - No read or write buffers are included. + */ -+#define AR2315_MEM_CFG (AR2315_SDRAMCTL + 0x00) -+#define AR2315_MEM_CTRL (AR2315_SDRAMCTL + 0x0c) -+#define AR2315_MEM_REF (AR2315_SDRAMCTL + 0x10) ++#define AR2315_MEM_CFG 0x0000 ++#define AR2315_MEM_CTRL 0x000c ++#define AR2315_MEM_REF 0x0010 + +#define SDRAM_DATA_WIDTH_M 0x00006000 +#define SDRAM_DATA_WIDTH_S 13 @@ -1017,7 +1021,8 @@ +/* + * Local Bus Interface Registers + */ -+#define AR2315_LB_CONFIG (AR2315_LOCAL + 0x0000) ++#define AR2315_LB_CONFIG 0x0000 ++ +#define AR2315_LBCONF_OE 0x00000001 /* =1 OE is low-true */ +#define AR2315_LBCONF_CS0 0x00000002 /* =1 first CS is low-true */ +#define AR2315_LBCONF_CS1 0x00000004 /* =1 2nd CS is low-true */ @@ -1044,13 +1049,15 @@ +#define AR2315_LBCONF_INT_PULSE 0x00200000 /* =1 Interrupt is a pulse */ +#define AR2315_LBCONF_ENABLE 0x00400000 /* =1 Falcon respond to LB */ + -+#define AR2315_LB_CLKSEL (AR2315_LOCAL + 0x0004) ++#define AR2315_LB_CLKSEL 0x0004 ++ +#define AR2315_LBCLK_EXT 0x0001 /* use external clk for lb */ + -+#define AR2315_LB_1MS (AR2315_LOCAL + 0x0008) ++#define AR2315_LB_1MS 0x0008 ++ +#define AR2315_LB1MS_MASK 0x3FFFF /* # of AHB clk cycles in 1ms */ + -+#define AR2315_LB_MISCCFG (AR2315_LOCAL + 0x000C) ++#define AR2315_LB_MISCCFG 0x000c +#define AR2315_LBM_TXD_EN 0x00000001 /* Enable TXD for fragments */ +#define AR2315_LBM_RX_INTEN 0x00000002 /* Enable LB ints on RX ready */ +#define AR2315_LBM_MBOXWR_INTEN 0x00000004 /* Enable LB ints on mbox wr */ @@ -1060,24 +1067,27 @@ +#define AR2315_LBM_TIMEOUT_SHFT 7 +#define AR2315_LBM_PORTMUX 0x07000000 + -+#define AR2315_LB_RXTSOFF (AR2315_LOCAL + 0x0010) ++#define AR2315_LB_RXTSOFF 0x0010 ++ ++#define AR2315_LB_TX_CHAIN_EN 0x0100 + -+#define AR2315_LB_TX_CHAIN_EN (AR2315_LOCAL + 0x0100) +#define AR2315_LB_TXEN_0 0x01 +#define AR2315_LB_TXEN_1 0x02 +#define AR2315_LB_TXEN_2 0x04 +#define AR2315_LB_TXEN_3 0x08 + -+#define AR2315_LB_TX_CHAIN_DIS (AR2315_LOCAL + 0x0104) -+#define AR2315_LB_TX_DESC_PTR (AR2315_LOCAL + 0x0200) ++#define AR2315_LB_TX_CHAIN_DIS 0x0104 ++#define AR2315_LB_TX_DESC_PTR 0x0200 ++ ++#define AR2315_LB_RX_CHAIN_EN 0x0400 + -+#define AR2315_LB_RX_CHAIN_EN (AR2315_LOCAL + 0x0400) +#define AR2315_LB_RXEN 0x01 + -+#define AR2315_LB_RX_CHAIN_DIS (AR2315_LOCAL + 0x0404) -+#define AR2315_LB_RX_DESC_PTR (AR2315_LOCAL + 0x0408) ++#define AR2315_LB_RX_CHAIN_DIS 0x0404 ++#define AR2315_LB_RX_DESC_PTR 0x0408 ++ ++#define AR2315_LB_INT_STATUS 0x0500 + -+#define AR2315_LB_INT_STATUS (AR2315_LOCAL + 0x0500) +#define AR2315_INT_TX_DESC 0x0001 +#define AR2315_INT_TX_OK 0x0002 +#define AR2315_INT_TX_ERR 0x0004 @@ -1094,15 +1104,15 @@ +#define AR2315_INT_MBOX_RD 0x2000 + +/* Bit definitions for INT MASK are the same as INT_STATUS */ -+#define AR2315_LB_INT_MASK (AR2315_LOCAL + 0x0504) ++#define AR2315_LB_INT_MASK 0x0504 + -+#define AR2315_LB_INT_EN (AR2315_LOCAL + 0x0508) -+#define AR2315_LB_MBOX (AR2315_LOCAL + 0x0600) ++#define AR2315_LB_INT_EN 0x0508 ++#define AR2315_LB_MBOX 0x0600 + +#endif /* __ASM_MACH_ATH25_AR2315_REGS_H */ --- /dev/null +++ b/arch/mips/include/asm/mach-ath25/ar5312_regs.h -@@ -0,0 +1,224 @@ +@@ -0,0 +1,227 @@ +/* + * 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 @@ -1152,10 +1162,14 @@ +#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_SDRAMCTL_BASE 0x18300000 ++#define AR5312_SDRAMCTL_SIZE 0x00000010 ++#define AR5312_FLASHCTL_BASE 0x18400000 ++#define AR5312_FLASHCTL_SIZE 0x00000010 +#define AR5312_UART0 0x1c000000 /* UART MMR */ ++#define AR5312_GPIO_BASE 0x1c002000 ++#define AR5312_RST_BASE 0x1c003000 ++#define AR5312_RST_SIZE 0x00000100 +#define AR5312_FLASH 0x1e000000 + +/* @@ -1170,21 +1184,21 @@ +#define AR5312_ENET1_MII (AR5312_ENET1 + 0x14) + +/* Reset/Timer Block Address Map */ -+#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 */ ++#define AR5312_TIMER 0x0000 /* countdown timer */ ++#define AR5312_RELOAD 0x0004 /* timer reload value */ ++#define AR5312_WD_CTRL 0x0008 /* watchdog cntrl */ ++#define AR5312_WD_TIMER 0x000c /* watchdog timer */ ++#define AR5312_ISR 0x0010 /* Intr Status Reg */ ++#define AR5312_IMR 0x0014 /* Intr Mask Reg */ ++#define AR5312_RESET 0x0020 ++#define AR5312_CLOCKCTL1 0x0064 ++#define AR5312_SCRATCH 0x006c ++#define AR5312_PROCADDR 0x0070 ++#define AR5312_PROC1 0x0074 ++#define AR5312_DMAADDR 0x0078 ++#define AR5312_DMA1 0x007c ++#define AR5312_ENABLE 0x0080 /* interface enb */ ++#define AR5312_REV 0x0090 /* revision */ + +/* AR5312_WD_CTRL register bit field definitions */ +#define AR5312_WD_CTRL_IGNORE_EXPIRATION 0x0000 @@ -1281,6 +1295,11 @@ +#define AR5312_REV_MIN_DUAL 0x0 /* Dual WLAN version */ +#define AR5312_REV_MIN_SINGLE 0x1 /* Single WLAN version */ + ++/* ARM Flash Controller -- 3 flash banks with either x8 or x16 devices. */ ++#define AR5312_FLASHCTL0 0x0000 ++#define AR5312_FLASHCTL1 0x0004 ++#define AR5312_FLASHCTL2 0x0008 ++ +/* AR5312_FLASHCTL register bit field definitions */ +#define FLASHCTL_IDCY 0x0000000f /* Idle cycle turn around time */ +#define FLASHCTL_IDCY_S 0 @@ -1312,24 +1331,18 @@ +#define FLASHCTL_ATR 0x80000000 /* Access type == retry every */ +#define FLASHCTL_ATR4 0xc0000000 /* Access type == retry every 4 */ + -+/* ARM Flash Controller -- 3 flash banks with either x8 or x16 devices. */ -+#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 AR5312_MEM_CFG1 (AR5312_SDRAMCTL + 0x04) ++#define AR5312_MEM_CFG1 0x0004 ++ +#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 + -+#define AR5312_GPIO (AR5312_APBBASE + 0x2000) -+ +#endif /* __ASM_MACH_ATH25_AR5312_REGS_H */ --- /dev/null +++ b/arch/mips/ath25/ar5312.c -@@ -0,0 +1,449 @@ +@@ -0,0 +1,483 @@ +/* + * 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 @@ -1369,12 +1382,33 @@ +#include "devices.h" +#include "ar5312.h" + ++static void __iomem *ar5312_rst_base; ++ ++static inline u32 ar5312_rst_reg_read(u32 reg) ++{ ++ return __raw_readl(ar5312_rst_base + reg); ++} ++ ++static inline void ar5312_rst_reg_write(u32 reg, u32 val) ++{ ++ __raw_writel(val, ar5312_rst_base + reg); ++} ++ ++static inline void ar5312_rst_reg_mask(u32 reg, u32 mask, u32 val) ++{ ++ u32 ret = ar5312_rst_reg_read(reg); ++ ++ ret &= ~mask; ++ ret |= val; ++ ar5312_rst_reg_write(reg, ret); ++} ++ +static irqreturn_t ar5312_ahb_err_handler(int cpl, void *dev_id) +{ -+ 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 */ ++ u32 proc1 = ar5312_rst_reg_read(AR5312_PROC1); ++ u32 proc_addr = ar5312_rst_reg_read(AR5312_PROCADDR); /* clears error */ ++ u32 dma1 = ar5312_rst_reg_read(AR5312_DMA1); ++ u32 dma_addr = ar5312_rst_reg_read(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, dma1); @@ -1390,12 +1424,12 @@ + +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); ++ unsigned int ar231x_misc_intrs = ar5312_rst_reg_read(AR5312_ISR) & ++ ar5312_rst_reg_read(AR5312_IMR); + + if (ar231x_misc_intrs & AR5312_ISR_TIMER) { + generic_handle_irq(AR5312_MISC_IRQ_TIMER); -+ (void)ar231x_read_reg(AR5312_TIMER); ++ (void)ar5312_rst_reg_read(AR5312_TIMER); + } else if (ar231x_misc_intrs & AR5312_ISR_AHBPROC) + generic_handle_irq(AR5312_MISC_IRQ_AHB_PROC); + else if ((ar231x_misc_intrs & AR5312_ISR_UART0)) @@ -1411,9 +1445,9 @@ +{ + unsigned int imr; + -+ imr = ar231x_read_reg(AR5312_IMR); ++ imr = ar5312_rst_reg_read(AR5312_IMR); + imr |= 1 << (d->irq - AR231X_MISC_IRQ_BASE); -+ ar231x_write_reg(AR5312_IMR, imr); ++ ar5312_rst_reg_write(AR5312_IMR, imr); +} + +/* Disable the specified AR5312_MISC_IRQ interrupt */ @@ -1421,10 +1455,10 @@ +{ + unsigned int imr; + -+ imr = ar231x_read_reg(AR5312_IMR); ++ imr = ar5312_rst_reg_read(AR5312_IMR); + imr &= ~(1 << (d->irq - AR231X_MISC_IRQ_BASE)); -+ ar231x_write_reg(AR5312_IMR, imr); -+ ar231x_read_reg(AR5312_IMR); /* flush write buffer */ ++ ar5312_rst_reg_write(AR5312_IMR, imr); ++ ar5312_rst_reg_read(AR5312_IMR); /* flush write buffer */ +} + +static struct irq_chip ar5312_misc_irq_chip = { @@ -1472,16 +1506,16 @@ +{ + u32 val; + -+ val = ar231x_read_reg(AR5312_RESET); -+ ar231x_write_reg(AR5312_RESET, val | mask); ++ val = ar5312_rst_reg_read(AR5312_RESET); ++ ar5312_rst_reg_write(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); ++ val = ar5312_rst_reg_read(AR5312_RESET); ++ ar5312_rst_reg_write(AR5312_RESET, val & ~mask); +} + +static struct physmap_flash_data ar5312_flash_data = { @@ -1540,7 +1574,26 @@ + */ +static char __init *ar5312_flash_limit(void) +{ ++ void __iomem *flashctl_base; + u32 ctl; ++ ++ flashctl_base = ioremap_nocache(AR5312_FLASHCTL_BASE, ++ AR5312_FLASHCTL_SIZE); ++ ++ ctl = __raw_readl(flashctl_base + AR5312_FLASHCTL0); ++ ctl &= FLASHCTL_MW; ++ ++ /* fixup flash width */ ++ switch (ctl) { ++ case FLASHCTL_MW16: ++ ar5312_flash_data.width = 2; ++ break; ++ case FLASHCTL_MW8: ++ default: ++ ar5312_flash_data.width = 1; ++ break; ++ } ++ + /* + * Configure flash bank 0. + * Assume 8M window size. Flash will be aliased if it's smaller @@ -1551,18 +1604,19 @@ + (0x01 << FLASHCTL_IDCY_S) | + (0x07 << FLASHCTL_WST1_S) | + (0x07 << FLASHCTL_WST2_S) | -+ (ar231x_read_reg(AR5312_FLASHCTL0) & FLASHCTL_MW); ++ ctl; + -+ ar231x_write_reg(AR5312_FLASHCTL0, ctl); ++ __raw_writel(ctl, flashctl_base + AR5312_FLASHCTL0); + + /* Disable other flash banks */ -+ ar231x_write_reg(AR5312_FLASHCTL1, -+ ar231x_read_reg(AR5312_FLASHCTL1) & -+ ~(FLASHCTL_E | FLASHCTL_AC)); ++ ctl = __raw_readl(flashctl_base + AR5312_FLASHCTL1); ++ ctl &= ~(FLASHCTL_E | FLASHCTL_AC); ++ __raw_writel(ctl, flashctl_base + AR5312_FLASHCTL1); ++ ctl = __raw_readl(flashctl_base + AR5312_FLASHCTL2); ++ ctl &= ~(FLASHCTL_E | FLASHCTL_AC); ++ __raw_writel(ctl, flashctl_base + AR5312_FLASHCTL2); + -+ ar231x_write_reg(AR5312_FLASHCTL2, -+ ar231x_read_reg(AR5312_FLASHCTL2) & -+ ~(FLASHCTL_E | FLASHCTL_AC)); ++ iounmap(flashctl_base); + + return (char *)KSEG1ADDR(AR5312_FLASH + 0x800000); +} @@ -1570,7 +1624,6 @@ +void __init ar5312_init_devices(void) +{ + struct ath25_boarddata *config; -+ u32 fctl = 0; + u8 *c; + + /* Locate board/radio config data */ @@ -1589,18 +1642,6 @@ + else + ath25_soc = ATH25_SOC_AR5312; + -+ /* fixup flash width */ -+ fctl = ar231x_read_reg(AR5312_FLASHCTL) & FLASHCTL_MW; -+ switch (fctl) { -+ case FLASHCTL_MW16: -+ ar5312_flash_data.width = 2; -+ break; -+ case FLASHCTL_MW8: -+ default: -+ ar5312_flash_data.width = 1; -+ break; -+ } -+ + platform_device_register(&ar5312_physmap_flash); + +#ifdef CONFIG_LEDS_GPIO @@ -1668,7 +1709,7 @@ + /* reset the system */ + local_irq_disable(); + while (1) -+ ar231x_write_reg(AR5312_RESET, AR5312_RESET_SYSTEM); ++ ar5312_rst_reg_write(AR5312_RESET, AR5312_RESET_SYSTEM); +} + +/* @@ -1687,11 +1728,11 @@ + u16 devid; + + /* Trust the bootrom's idea of cpu frequency. */ -+ scratch = ar231x_read_reg(AR5312_SCRATCH); ++ scratch = ar5312_rst_reg_read(AR5312_SCRATCH); + if (scratch) + return scratch; + -+ devid = ar231x_read_reg(AR5312_REV); ++ devid = ar5312_rst_reg_read(AR5312_REV); + devid &= AR5312_REV_MAJ; + devid >>= AR5312_REV_MAJ_S; + if (devid == AR5312_REV_MAJ_AR2313) { @@ -1726,7 +1767,7 @@ + * We compute the CPU frequency, based on PLL settings. + */ + -+ clock_ctl1 = ar231x_read_reg(AR5312_CLOCKCTL1); ++ clock_ctl1 = ar5312_rst_reg_read(AR5312_CLOCKCTL1); + predivide_select = (clock_ctl1 & predivide_mask) >> predivide_shift; + predivisor = clockctl1_predivide_table[predivide_select]; + multiplier = (clock_ctl1 & multiplier_mask) >> multiplier_shift; @@ -1749,27 +1790,33 @@ + +void __init ar5312_plat_mem_setup(void) +{ ++ void __iomem *sdram_base; + u32 memsize, memcfg, bank0AC, bank1AC; + u32 devid; + + /* Detect memory size */ -+ memcfg = ar231x_read_reg(AR5312_MEM_CFG1); ++ sdram_base = ioremap_nocache(AR5312_SDRAMCTL_BASE, ++ AR5312_SDRAMCTL_SIZE); ++ memcfg = __raw_readl(sdram_base + 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) + + (bank1AC ? (1 << (bank1AC+1)) : 0); + memsize <<= 20; + add_memory_region(0, memsize, BOOT_MEM_RAM); ++ iounmap(sdram_base); + -+ devid = ar231x_read_reg(AR5312_REV); ++ ar5312_rst_base = ioremap_nocache(AR5312_RST_BASE, AR5312_RST_SIZE); ++ ++ devid = ar5312_rst_reg_read(AR5312_REV); + devid >>= AR5312_REV_WMAC_MIN_S; + devid &= AR5312_REV_CHIP; + ath25_board.devid = (u16)devid; + + /* Clear any lingering AHB errors */ -+ ar231x_read_reg(AR5312_PROCADDR); -+ ar231x_read_reg(AR5312_DMAADDR); -+ ar231x_write_reg(AR5312_WD_CTRL, AR5312_WD_CTRL_IGNORE_EXPIRATION); ++ ar5312_rst_reg_read(AR5312_PROCADDR); ++ ar5312_rst_reg_read(AR5312_DMAADDR); ++ ar5312_rst_reg_write(AR5312_WD_CTRL, AR5312_WD_CTRL_IGNORE_EXPIRATION); + + _machine_restart = ar5312_restart; +} @@ -1781,7 +1828,7 @@ +} --- /dev/null +++ b/arch/mips/ath25/ar2315.c -@@ -0,0 +1,401 @@ +@@ -0,0 +1,428 @@ +/* + * 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 @@ -1821,10 +1868,31 @@ +#include "devices.h" +#include "ar2315.h" + ++static void __iomem *ar2315_rst_base; ++ ++static inline u32 ar2315_rst_reg_read(u32 reg) ++{ ++ return __raw_readl(ar2315_rst_base + reg); ++} ++ ++static inline void ar2315_rst_reg_write(u32 reg, u32 val) ++{ ++ __raw_writel(val, ar2315_rst_base + reg); ++} ++ ++static inline void ar2315_rst_reg_mask(u32 reg, u32 mask, u32 val) ++{ ++ u32 ret = ar2315_rst_reg_read(reg); ++ ++ ret &= ~mask; ++ ret |= val; ++ ar2315_rst_reg_write(reg, ret); ++} ++ +static irqreturn_t ar2315_ahb_err_handler(int cpl, void *dev_id) +{ -+ ar231x_write_reg(AR2315_AHB_ERR0, AHB_ERROR_DET); -+ ar231x_read_reg(AR2315_AHB_ERR1); ++ ar2315_rst_reg_write(AR2315_AHB_ERR0, AHB_ERROR_DET); ++ ar2315_rst_reg_read(AR2315_AHB_ERR1); + + pr_emerg("AHB fatal error\n"); + machine_restart("AHB error"); /* Catastrophic failure */ @@ -1839,8 +1907,8 @@ + +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); ++ unsigned int misc_intr = ar2315_rst_reg_read(AR2315_ISR) & ++ ar2315_rst_reg_read(AR2315_IMR); + + if (misc_intr & AR2315_ISR_SPI) + generic_handle_irq(AR2315_MISC_IRQ_SPI); @@ -1849,12 +1917,12 @@ + else if (misc_intr & AR2315_ISR_AHB) + generic_handle_irq(AR2315_MISC_IRQ_AHB); + else if (misc_intr & AR2315_ISR_GPIO) { -+ ar231x_write_reg(AR2315_ISR, AR2315_ISR_GPIO); ++ ar2315_rst_reg_write(AR2315_ISR, AR2315_ISR_GPIO); + generic_handle_irq(AR2315_MISC_IRQ_GPIO); + } else if (misc_intr & AR2315_ISR_UART0) + generic_handle_irq(AR2315_MISC_IRQ_UART0); + else if (misc_intr & AR2315_ISR_WD) { -+ ar231x_write_reg(AR2315_ISR, AR2315_ISR_WD); ++ ar2315_rst_reg_write(AR2315_ISR, AR2315_ISR_WD); + generic_handle_irq(AR2315_MISC_IRQ_WATCHDOG); + } else + spurious_interrupt(); @@ -1864,18 +1932,18 @@ +{ + unsigned int imr; + -+ imr = ar231x_read_reg(AR2315_IMR); ++ imr = ar2315_rst_reg_read(AR2315_IMR); + imr |= 1 << (d->irq - AR231X_MISC_IRQ_BASE); -+ ar231x_write_reg(AR2315_IMR, imr); ++ ar2315_rst_reg_write(AR2315_IMR, imr); +} + +static void ar2315_misc_irq_mask(struct irq_data *d) +{ + unsigned int imr; + -+ imr = ar231x_read_reg(AR2315_IMR); ++ imr = ar2315_rst_reg_read(AR2315_IMR); + imr &= ~(1 << (d->irq - AR231X_MISC_IRQ_BASE)); -+ ar231x_write_reg(AR2315_IMR, imr); ++ ar2315_rst_reg_write(AR2315_IMR, imr); +} + +static struct irq_chip ar2315_misc_irq_chip = { @@ -1927,16 +1995,16 @@ +{ + u32 val; + -+ val = ar231x_read_reg(AR2315_RESET); -+ ar231x_write_reg(AR2315_RESET, val | mask); ++ val = ar2315_rst_reg_read(AR2315_RESET); ++ ar2315_rst_reg_write(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); ++ val = ar2315_rst_reg_read(AR2315_RESET); ++ ar2315_rst_reg_write(AR2315_RESET, val & ~mask); +} + +static struct ar231x_eth ar2315_eth_data = { @@ -1971,8 +2039,8 @@ +static struct resource ar2315_wdt_res[] = { + { + .flags = IORESOURCE_MEM, -+ .start = AR2315_WD, -+ .end = AR2315_WD + 8 - 1, ++ .start = AR2315_RST_BASE + AR2315_WD, ++ .end = AR2315_RST_BASE + AR2315_WD + 8 - 1, + }, + { + .flags = IORESOURCE_IRQ, @@ -2063,7 +2131,7 @@ + local_irq_disable(); + + /* try reset the system via reset control */ -+ ar231x_write_reg(AR2315_COLD_RESET, AR2317_RESET_SYSTEM); ++ ar2315_rst_reg_write(AR2315_COLD_RESET, AR2317_RESET_SYSTEM); + + /* Cold reset does not work on the AR2315/6, use the GPIO reset bits + * a workaround. Give it some time to attempt a gpio based hardware @@ -2090,7 +2158,7 @@ + unsigned int pllc_out, refdiv, fdiv, divby2; + unsigned int clk_div; + -+ pllc_ctrl = ar231x_read_reg(AR2315_PLLC_CTL); ++ pllc_ctrl = ar2315_rst_reg_read(AR2315_PLLC_CTL); + refdiv = (pllc_ctrl & PLLC_REF_DIV_M) >> PLLC_REF_DIV_S; + refdiv = clockctl1_predivide_table[refdiv]; + fdiv = (pllc_ctrl & PLLC_FDBACK_DIV_M) >> PLLC_FDBACK_DIV_S; @@ -2123,12 +2191,12 @@ + +static inline unsigned ar2315_cpu_frequency(void) +{ -+ return ar2315_sys_clk(ar231x_read_reg(AR2315_CPUCLK)); ++ return ar2315_sys_clk(ar2315_rst_reg_read(AR2315_CPUCLK)); +} + +static inline unsigned ar2315_apb_frequency(void) +{ -+ return ar2315_sys_clk(ar231x_read_reg(AR2315_AMBACLK)); ++ return ar2315_sys_clk(ar2315_rst_reg_read(AR2315_AMBACLK)); +} + +void __init ar2315_plat_time_init(void) @@ -2138,19 +2206,25 @@ + +void __init ar2315_plat_mem_setup(void) +{ ++ void __iomem *sdram_base; + u32 memsize, memcfg; + u32 devid; + u32 config; + -+ memcfg = ar231x_read_reg(AR2315_MEM_CFG); ++ sdram_base = ioremap_nocache(AR2315_SDRAMCTL_BASE, ++ AR2315_SDRAMCTL_SIZE); ++ memcfg = __raw_readl(sdram_base + AR2315_MEM_CFG); + memsize = 1 + ((memcfg & SDRAM_DATA_WIDTH_M) >> SDRAM_DATA_WIDTH_S); + memsize <<= 1 + ((memcfg & SDRAM_COL_WIDTH_M) >> SDRAM_COL_WIDTH_S); + memsize <<= 1 + ((memcfg & SDRAM_ROW_WIDTH_M) >> SDRAM_ROW_WIDTH_S); + memsize <<= 3; + add_memory_region(0, memsize, BOOT_MEM_RAM); ++ iounmap(sdram_base); ++ ++ ar2315_rst_base = ioremap_nocache(AR2315_RST_BASE, AR2315_RST_SIZE); + + /* Detect the hardware based on the device ID */ -+ devid = ar231x_read_reg(AR2315_SREV) & AR2315_REV_CHIP; ++ devid = ar2315_rst_reg_read(AR2315_SREV) & AR2315_REV_CHIP; + switch (devid) { + case 0x91: /* Need to check */ + ath25_soc = ATH25_SOC_AR2318; @@ -2171,9 +2245,9 @@ + /* Clear any lingering AHB errors */ + config = read_c0_config(); + write_c0_config(config & ~0x3); -+ ar231x_write_reg(AR2315_AHB_ERR0, AHB_ERROR_DET); -+ ar231x_read_reg(AR2315_AHB_ERR1); -+ ar231x_write_reg(AR2315_WDC, AR2315_WDC_IGNORE_EXPIRATION); ++ ar2315_rst_reg_write(AR2315_AHB_ERR0, AHB_ERROR_DET); ++ ar2315_rst_reg_read(AR2315_AHB_ERR1); ++ ar2315_rst_reg_write(AR2315_WDC, AR2315_WDC_IGNORE_EXPIRATION); + + _machine_restart = ar2315_restart; +} @@ -2263,7 +2337,7 @@ +#endif --- /dev/null +++ b/arch/mips/include/asm/mach-ath25/ar231x.h -@@ -0,0 +1,38 @@ +@@ -0,0 +1,13 @@ +#ifndef __ASM_MACH_ATH25_AR231X_H +#define __ASM_MACH_ATH25_AR231X_H + @@ -2276,31 +2350,6 @@ +/* Software's idea of interrupts handled by "CPU Interrupt Controller" */ +#define AR231X_IRQ_CPU_CLOCK (MIPS_CPU_IRQ_BASE+7) /* C0_CAUSE: 0x8000 */ + -+static inline u32 -+ar231x_read_reg(u32 reg) -+{ -+ return __raw_readl((void __iomem *)KSEG1ADDR(reg)); -+} -+ -+static inline void -+ar231x_write_reg(u32 reg, u32 val) -+{ -+ __raw_writel(val, (void __iomem *)KSEG1ADDR(reg)); -+} -+ -+static inline u32 -+ar231x_mask_reg(u32 reg, u32 mask, u32 val) -+{ -+ u32 ret; -+ -+ ret = ar231x_read_reg(reg); -+ ret &= ~mask; -+ ret |= val; -+ ar231x_write_reg(reg, ret); -+ -+ return ret; -+} -+ +#endif /* __ASM_MACH_ATH25_AR231X_H */ --- /dev/null +++ b/arch/mips/ath25/devices.h diff --git a/target/linux/atheros/patches-3.18/102-ar5312_gpio.patch b/target/linux/atheros/patches-3.18/102-ar5312_gpio.patch index 47da6de70f..3493e8e434 100644 --- a/target/linux/atheros/patches-3.18/102-ar5312_gpio.patch +++ b/target/linux/atheros/patches-3.18/102-ar5312_gpio.patch @@ -10,7 +10,7 @@ config SOC_AR2315 --- a/arch/mips/ath25/ar5312.c +++ b/arch/mips/ath25/ar5312.c -@@ -184,6 +184,22 @@ static struct platform_device ar5312_phy +@@ -205,6 +205,22 @@ static struct platform_device ar5312_phy .num_resources = 1, }; @@ -18,8 +18,8 @@ + { + .name = "ar5312-gpio", + .flags = IORESOURCE_MEM, -+ .start = AR5312_GPIO, -+ .end = AR5312_GPIO + 0x0c - 1, ++ .start = AR5312_GPIO_BASE, ++ .end = AR5312_GPIO_BASE + 0x0c - 1, + }, +}; + @@ -33,7 +33,7 @@ #ifdef CONFIG_LEDS_GPIO static struct gpio_led ar5312_leds[] = { { .name = "wlan", .gpio = 0, .active_low = 1, }, -@@ -271,6 +287,8 @@ void __init ar5312_init_devices(void) +@@ -299,6 +315,8 @@ void __init ar5312_init_devices(void) platform_device_register(&ar5312_physmap_flash); diff --git a/target/linux/atheros/patches-3.18/103-ar2315_gpio.patch b/target/linux/atheros/patches-3.18/103-ar2315_gpio.patch index 5c72ee1fbf..f0ab110400 100644 --- a/target/linux/atheros/patches-3.18/103-ar2315_gpio.patch +++ b/target/linux/atheros/patches-3.18/103-ar2315_gpio.patch @@ -8,7 +8,7 @@ default y --- a/arch/mips/ath25/ar2315.c +++ b/arch/mips/ath25/ar2315.c -@@ -204,6 +204,34 @@ static struct platform_device ar2315_wdt +@@ -225,6 +225,34 @@ static struct platform_device ar2315_wdt .num_resources = ARRAY_SIZE(ar2315_wdt_res) }; @@ -16,8 +16,8 @@ + { + .name = "ar2315-gpio", + .flags = IORESOURCE_MEM, -+ .start = AR2315_GPIO, -+ .end = AR2315_GPIO + 0x10 - 1, ++ .start = AR2315_RST_BASE + AR2315_GPIO, ++ .end = AR2315_RST_BASE + AR2315_GPIO + 0x10 - 1, + }, + { + .name = "ar2315-gpio", @@ -43,7 +43,7 @@ /* * NB: We use mapping size that is larger than the actual flash size, * but this shouldn't be a problem here, because the flash will simply -@@ -264,6 +292,7 @@ void __init ar2315_init_devices(void) +@@ -285,6 +313,7 @@ void __init ar2315_init_devices(void) ath25_find_config(ar2315_flash_limit()); ar2315_eth_data.macaddr = ath25_board.config->enet0_mac; diff --git a/target/linux/atheros/patches-3.18/105-ar2315_pci.patch b/target/linux/atheros/patches-3.18/105-ar2315_pci.patch index 267053cc8a..6665a1138b 100644 --- a/target/linux/atheros/patches-3.18/105-ar2315_pci.patch +++ b/target/linux/atheros/patches-3.18/105-ar2315_pci.patch @@ -520,7 +520,7 @@ + default y --- a/arch/mips/ath25/ar2315.c +++ b/arch/mips/ath25/ar2315.c -@@ -116,6 +116,10 @@ static void ar2315_irq_dispatch(void) +@@ -137,6 +137,10 @@ static void ar2315_irq_dispatch(void) do_IRQ(AR2315_IRQ_WLAN0_INTRS); else if (pending & CAUSEF_IP4) do_IRQ(AR2315_IRQ_ENET0_INTRS); @@ -531,7 +531,7 @@ else if (pending & CAUSEF_IP2) do_IRQ(AR2315_IRQ_MISC_INTRS); else if (pending & CAUSEF_IP7) -@@ -423,8 +427,60 @@ void __init ar2315_plat_mem_setup(void) +@@ -450,8 +454,60 @@ void __init ar2315_plat_mem_setup(void) _machine_restart = ar2315_restart; } @@ -566,25 +566,25 @@ +#ifdef CONFIG_PCI_AR2315 + if (ath25_soc == ATH25_SOC_AR2315) { + /* Reset PCI DMA logic */ -+ ar231x_mask_reg(AR2315_RESET, 0, AR2315_RESET_PCIDMA); ++ ar2315_rst_reg_mask(AR2315_RESET, 0, AR2315_RESET_PCIDMA); + msleep(20); -+ ar231x_mask_reg(AR2315_RESET, AR2315_RESET_PCIDMA, 0); ++ ar2315_rst_reg_mask(AR2315_RESET, AR2315_RESET_PCIDMA, 0); + msleep(20); + + /* Configure endians */ -+ ar231x_mask_reg(AR2315_ENDIAN_CTL, 0, AR2315_CONFIG_PCIAHB | -+ AR2315_CONFIG_PCIAHB_BRIDGE); ++ ar2315_rst_reg_mask(AR2315_ENDIAN_CTL, 0, AR2315_CONFIG_PCIAHB | ++ AR2315_CONFIG_PCIAHB_BRIDGE); + + /* Configure as PCI host with DMA */ -+ ar231x_write_reg(AR2315_PCICLK, AR2315_PCICLK_PLLC_CLKM | -+ (AR2315_PCICLK_IN_FREQ_DIV_6 << -+ AR2315_PCICLK_DIV_S)); -+ ar231x_mask_reg(AR2315_AHB_ARB_CTL, 0, AR2315_ARB_PCI); -+ ar231x_mask_reg(AR2315_IF_CTL, AR2315_IF_PCI_CLK_MASK | -+ AR2315_IF_MASK, AR2315_IF_PCI | -+ AR2315_IF_PCI_HOST | AR2315_IF_PCI_INTR | -+ (AR2315_IF_PCI_CLK_OUTPUT_CLK << -+ AR2315_IF_PCI_CLK_SHIFT)); ++ ar2315_rst_reg_write(AR2315_PCICLK, AR2315_PCICLK_PLLC_CLKM | ++ (AR2315_PCICLK_IN_FREQ_DIV_6 << ++ AR2315_PCICLK_DIV_S)); ++ ar2315_rst_reg_mask(AR2315_AHB_ARB_CTL, 0, AR2315_ARB_PCI); ++ ar2315_rst_reg_mask(AR2315_IF_CTL, AR2315_IF_PCI_CLK_MASK | ++ AR2315_IF_MASK, AR2315_IF_PCI | ++ AR2315_IF_PCI_HOST | AR2315_IF_PCI_INTR | ++ (AR2315_IF_PCI_CLK_OUTPUT_CLK << ++ AR2315_IF_PCI_CLK_SHIFT)); + + platform_device_register_simple("ar2315-pci", -1, + ar2315_pci_res,