source: trunk/target/linux/atheros/patches-2.6.30/100-board.patch @ 21038

Last change on this file since 21038 was 21038, checked in by juhosg, 7 years ago

atheros: register wmac device only if it is enabled in the board config

File size: 92.2 KB
  • arch/mips/Kconfig

    a b config BCM47XX 
    6060        help 
    6161         Support for BCM47XX based boards 
    6262 
     63config ATHEROS_AR231X 
     64        bool "Atheros 231x/531x SoC support" 
     65        select CEVT_R4K 
     66        select CSRC_R4K 
     67        select DMA_NONCOHERENT 
     68        select IRQ_CPU 
     69        select SYS_HAS_CPU_MIPS32_R1 
     70        select SYS_SUPPORTS_BIG_ENDIAN 
     71        select SYS_SUPPORTS_32BIT_KERNEL 
     72        select GENERIC_GPIO 
     73        help 
     74          Support for AR231x and AR531x based boards 
     75 
    6376config MIPS_COBALT 
    6477        bool "Cobalt Server" 
    6578        select CEVT_R4K 
    config CAVIUM_OCTEON_REFERENCE_BOARD 
    633646 
    634647endchoice 
    635648 
     649source "arch/mips/ar231x/Kconfig" 
    636650source "arch/mips/alchemy/Kconfig" 
    637651source "arch/mips/basler/excite/Kconfig" 
    638652source "arch/mips/jazz/Kconfig" 
  • arch/mips/Makefile

    a b libs-$(CONFIG_MIPS_XXS1500) += arch/mips 
    283283load-$(CONFIG_MIPS_XXS1500)     += 0xffffffff80100000 
    284284 
    285285# 
     286# Atheros AR5312/AR2312 WiSoC 
     287# 
     288core-$(CONFIG_ATHEROS_AR231X)           += arch/mips/ar231x/ 
     289cflags-$(CONFIG_ATHEROS_AR231X) += -I$(srctree)/arch/mips/include/asm/mach-ar231x 
     290load-$(CONFIG_ATHEROS_AR231X)           += 0xffffffff80041000 
     291 
     292# 
    286293# Cobalt Server 
    287294# 
    288295core-$(CONFIG_MIPS_COBALT)      += arch/mips/cobalt/ 
  • new file arch/mips/ar231x/Kconfig

    - +  
     1config ATHEROS_AR5312 
     2        bool "Atheros 5312/2312+ support" 
     3        depends on ATHEROS_AR231X 
     4        default y 
     5 
     6config ATHEROS_AR2315 
     7        bool "Atheros 2315+ support" 
     8        depends on ATHEROS_AR231X 
     9        select DMA_NONCOHERENT 
     10        select CEVT_R4K 
     11        select CSRC_R4K 
     12        select IRQ_CPU 
     13        select SYS_HAS_CPU_MIPS32_R1 
     14        select SYS_SUPPORTS_32BIT_KERNEL 
     15        select SYS_SUPPORTS_BIG_ENDIAN 
     16        select GENERIC_GPIO 
     17        default y 
  • new file arch/mips/ar231x/Makefile

    - +  
     1# 
     2# This file is subject to the terms and conditions of the GNU General Public 
     3# License.  See the file "COPYING" in the main directory of this archive 
     4# for more details. 
     5# 
     6# Copyright (C) 2006 FON Technology, SL. 
     7# Copyright (C) 2006 Imre Kaloz <kaloz@openwrt.org> 
     8# Copyright (C) 2006-2009 Felix Fietkau <nbd@openwrt.org> 
     9# 
     10 
     11obj-y += board.o prom.o devices.o 
     12obj-$(CONFIG_ATHEROS_AR5312) += ar5312.o 
     13obj-$(CONFIG_ATHEROS_AR2315) += ar2315.o 
  • new file arch/mips/ar231x/board.c

    - +  
     1/* 
     2 * This file is subject to the terms and conditions of the GNU General Public 
     3 * License.  See the file "COPYING" in the main directory of this archive 
     4 * for more details. 
     5 * 
     6 * Copyright (C) 2003 Atheros Communications, Inc.,  All Rights Reserved. 
     7 * Copyright (C) 2006 FON Technology, SL. 
     8 * Copyright (C) 2006 Imre Kaloz <kaloz@openwrt.org> 
     9 * Copyright (C) 2006-2009 Felix Fietkau <nbd@openwrt.org> 
     10 */ 
     11 
     12#include <linux/autoconf.h> 
     13#include <linux/init.h> 
     14#include <linux/module.h> 
     15#include <linux/types.h> 
     16#include <linux/string.h> 
     17#include <linux/platform_device.h> 
     18#include <linux/kernel.h> 
     19#include <linux/random.h> 
     20#include <linux/etherdevice.h> 
     21#include <asm/irq_cpu.h> 
     22#include <asm/reboot.h> 
     23#include <asm/io.h> 
     24 
     25#include <ar231x_platform.h> 
     26#include "devices.h" 
     27#include "ar5312.h" 
     28#include "ar2315.h" 
     29 
     30void (*ar231x_irq_dispatch)(void); 
     31 
     32static inline bool 
     33check_radio_magic(u8 *addr) 
     34{ 
     35        addr += 0x7a; /* offset for flash magic */ 
     36        if ((addr[0] == 0x5a) && (addr[1] == 0xa5)) { 
     37                return 1; 
     38        } 
     39        return 0; 
     40} 
     41 
     42static inline bool 
     43check_board_data(u8 *flash_limit, u8 *addr, bool broken) 
     44{ 
     45        /* config magic found */ 
     46        if (*((u32 *)addr) == AR531X_BD_MAGIC) 
     47                return 1; 
     48 
     49        if (!broken) 
     50                return 0; 
     51 
     52        if (check_radio_magic(addr + 0xf8)) 
     53                ar231x_board.radio = addr + 0xf8; 
     54        if ((addr < flash_limit + 0x10000) && 
     55             check_radio_magic(addr + 0x10000)) 
     56                ar231x_board.radio = addr + 0x10000; 
     57 
     58        if (ar231x_board.radio) { 
     59                /* broken board data detected, use radio data to find the offset, 
     60                 * user will fix this */ 
     61                return 1; 
     62        } 
     63        return 0; 
     64} 
     65 
     66static u8 * 
     67find_board_config(u8 *flash_limit, bool broken) 
     68{ 
     69        u8 *addr; 
     70        int found = 0; 
     71 
     72        for (addr = flash_limit - 0x1000; 
     73                addr >= flash_limit - 0x30000; 
     74                addr -= 0x1000) { 
     75 
     76                if (check_board_data(flash_limit, addr, broken)) { 
     77                        found = 1; 
     78                        break; 
     79                } 
     80        } 
     81 
     82        if (!found) 
     83                addr = NULL; 
     84 
     85        return addr; 
     86} 
     87 
     88static u8 * 
     89find_radio_config(u8 *flash_limit, u8 *board_config) 
     90{ 
     91        int found; 
     92        u8 *radio_config; 
     93 
     94        /* 
     95         * Now find the start of Radio Configuration data, using heuristics: 
     96         * Search forward from Board Configuration data by 0x1000 bytes 
     97         * at a time until we find non-0xffffffff. 
     98         */ 
     99        found = 0; 
     100        for (radio_config = board_config + 0x1000; 
     101             (radio_config < flash_limit); 
     102             radio_config += 0x1000) { 
     103                if ((*(u32 *)radio_config != 0xffffffff) && 
     104                    check_radio_magic(radio_config)) { 
     105                        found = 1; 
     106                        break; 
     107                } 
     108        } 
     109 
     110        /* AR2316 relocates radio config to new location */ 
     111        if (!found) { 
     112            for (radio_config = board_config + 0xf8; 
     113                        (radio_config < flash_limit - 0x1000 + 0xf8); 
     114                         radio_config += 0x1000) { 
     115                        if ((*(u32 *)radio_config != 0xffffffff) && 
     116                                check_radio_magic(radio_config)) { 
     117                                found = 1; 
     118                                break; 
     119                        } 
     120            } 
     121        } 
     122 
     123        if (!found) { 
     124                printk("Could not find Radio Configuration data\n"); 
     125                radio_config = 0; 
     126        } 
     127 
     128        return (u8 *) radio_config; 
     129} 
     130 
     131int __init 
     132ar231x_find_config(u8 *flash_limit) 
     133{ 
     134        struct ar231x_boarddata *config; 
     135        unsigned int rcfg_size; 
     136        int broken_boarddata = 0; 
     137        u8 *bcfg, *rcfg; 
     138        u8 *board_data; 
     139        u8 *radio_data; 
     140        u32 offset; 
     141 
     142        ar231x_board.config = NULL; 
     143        ar231x_board.radio = NULL; 
     144        /* Copy the board and radio data to RAM, because accessing the mapped 
     145         * memory of the flash directly after booting is not safe */ 
     146 
     147        /* Try to find valid board and radio data */ 
     148        bcfg = find_board_config(flash_limit, false); 
     149 
     150        /* If that fails, try to at least find valid radio data */ 
     151        if (!bcfg) { 
     152                bcfg = find_board_config(flash_limit, true); 
     153                broken_boarddata = 1; 
     154        } 
     155 
     156        if (!bcfg) { 
     157                printk(KERN_WARNING "WARNING: No board configuration data found!\n"); 
     158                return -ENODEV; 
     159        } 
     160 
     161        board_data = kzalloc(BOARD_CONFIG_BUFSZ, GFP_KERNEL); 
     162        ar231x_board.config = (struct ar231x_boarddata *) board_data; 
     163        memcpy(board_data, bcfg, 0x100); 
     164        if (broken_boarddata) { 
     165                printk(KERN_WARNING "WARNING: broken board data detected\n"); 
     166                config = ar231x_board.config; 
     167                if (!memcmp(config->enet0_mac, "\x00\x00\x00\x00\x00\x00", 6)) { 
     168                        printk(KERN_INFO "Fixing up empty mac addresses\n"); 
     169                        config->resetConfigGpio = 0xffff; 
     170                        config->sysLedGpio = 0xffff; 
     171                        random_ether_addr(config->wlan0_mac); 
     172                        config->wlan0_mac[0] &= ~0x06; 
     173                        random_ether_addr(config->enet0_mac); 
     174                        random_ether_addr(config->enet1_mac); 
     175                } 
     176        } 
     177 
     178 
     179        /* Radio config starts 0x100 bytes after board config, regardless 
     180         * of what the physical layout on the flash chip looks like */ 
     181 
     182        if (ar231x_board.radio) 
     183                rcfg = (u8 *) ar231x_board.radio; 
     184        else 
     185                rcfg = find_radio_config(flash_limit, bcfg); 
     186 
     187        if (!rcfg) 
     188                return -ENODEV; 
     189 
     190        radio_data = board_data + 0x100 + ((rcfg - bcfg) & 0xfff); 
     191        ar231x_board.radio = radio_data; 
     192        offset = radio_data - board_data; 
     193        printk(KERN_INFO "Radio config found at offset 0x%x(0x%x)\n", rcfg - bcfg, offset); 
     194        rcfg_size = BOARD_CONFIG_BUFSZ - offset; 
     195        memcpy(radio_data, rcfg, rcfg_size); 
     196 
     197        return 0; 
     198} 
     199 
     200static void 
     201ar231x_halt(void) 
     202{ 
     203        local_irq_disable(); 
     204        while (1); 
     205} 
     206 
     207void __init 
     208plat_mem_setup(void) 
     209{ 
     210        _machine_halt = ar231x_halt; 
     211        pm_power_off = ar231x_halt; 
     212 
     213        ar5312_plat_setup(); 
     214        ar2315_plat_setup(); 
     215 
     216        /* Disable data watchpoints */ 
     217        write_c0_watchlo0(0); 
     218} 
     219 
     220 
     221asmlinkage void 
     222plat_irq_dispatch(void) 
     223{ 
     224        ar231x_irq_dispatch(); 
     225} 
     226 
     227void __init 
     228plat_time_init(void) 
     229{ 
     230        ar5312_time_init(); 
     231        ar2315_time_init(); 
     232} 
     233 
     234unsigned int __cpuinit 
     235get_c0_compare_int(void) 
     236{ 
     237        return CP0_LEGACY_COMPARE_IRQ; 
     238} 
     239 
     240void __init 
     241arch_init_irq(void) 
     242{ 
     243        clear_c0_status(ST0_IM); 
     244        mips_cpu_irq_init(); 
     245 
     246        /* Initialize interrupt controllers */ 
     247        ar5312_irq_init(); 
     248        ar2315_irq_init(); 
     249} 
     250 
     251 
  • new file arch/mips/ar231x/prom.c

    - +  
     1/* 
     2 * This file is subject to the terms and conditions of the GNU General Public 
     3 * License.  See the file "COPYING" in the main directory of this archive 
     4 * for more details. 
     5 * 
     6 * Copyright MontaVista Software Inc 
     7 * Copyright (C) 2003 Atheros Communications, Inc.,  All Rights Reserved. 
     8 * Copyright (C) 2006 FON Technology, SL. 
     9 * Copyright (C) 2006 Imre Kaloz <kaloz@openwrt.org> 
     10 * Copyright (C) 2006 Felix Fietkau <nbd@openwrt.org> 
     11 */ 
     12 
     13/* 
     14 * Prom setup file for ar531x 
     15 */ 
     16 
     17#include <linux/init.h> 
     18#include <linux/autoconf.h> 
     19#include <linux/kernel.h> 
     20#include <linux/string.h> 
     21#include <linux/mm.h> 
     22#include <linux/bootmem.h> 
     23 
     24#include <asm/bootinfo.h> 
     25#include <asm/addrspace.h> 
     26#include "ar5312.h" 
     27#include "ar2315.h" 
     28 
     29void __init prom_init(void) 
     30{ 
     31        ar5312_prom_init(); 
     32        ar2315_prom_init(); 
     33} 
     34 
     35void __init prom_free_prom_memory(void) 
     36{ 
     37} 
  • new file arch/mips/include/asm/mach-ar231x/ar231x_platform.h

    - +  
     1#ifndef __AR531X_PLATFORM_H 
     2#define __AR531X_PLATFORM_H 
     3 
     4/* 
     5 * This is board-specific data that is stored in a "fixed" location in flash. 
     6 * It is shared across operating systems, so it should not be changed lightly. 
     7 * The main reason we need it is in order to extract the ethernet MAC 
     8 * address(es). 
     9 */ 
     10struct ar231x_boarddata { 
     11    u32 magic;                       /* board data is valid */ 
     12#define AR531X_BD_MAGIC 0x35333131   /* "5311", for all 531x platforms */ 
     13    u16 cksum;                       /* checksum (starting with BD_REV 2) */ 
     14    u16 rev;                         /* revision of this struct */ 
     15#define BD_REV  4 
     16    char boardName[64];            /* Name of board */ 
     17    u16 major;                       /* Board major number */ 
     18    u16 minor;                       /* Board minor number */ 
     19    u32 flags;                      /* Board configuration */ 
     20#define BD_ENET0        0x00000001   /* ENET0 is stuffed */ 
     21#define BD_ENET1        0x00000002   /* ENET1 is stuffed */ 
     22#define BD_UART1        0x00000004   /* UART1 is stuffed */ 
     23#define BD_UART0        0x00000008   /* UART0 is stuffed (dma) */ 
     24#define BD_RSTFACTORY   0x00000010   /* Reset factory defaults stuffed */ 
     25#define BD_SYSLED       0x00000020   /* System LED stuffed */ 
     26#define BD_EXTUARTCLK   0x00000040   /* External UART clock */ 
     27#define BD_CPUFREQ      0x00000080   /* cpu freq is valid in nvram */ 
     28#define BD_SYSFREQ      0x00000100   /* sys freq is set in nvram */ 
     29#define BD_WLAN0        0x00000200   /* Enable WLAN0 */ 
     30#define BD_MEMCAP       0x00000400   /* CAP SDRAM @ memCap for testing */ 
     31#define BD_DISWATCHDOG  0x00000800   /* disable system watchdog */ 
     32#define BD_WLAN1        0x00001000   /* Enable WLAN1 (ar5212) */ 
     33#define BD_ISCASPER     0x00002000   /* FLAG for AR2312 */ 
     34#define BD_WLAN0_2G_EN  0x00004000   /* FLAG for radio0_2G */ 
     35#define BD_WLAN0_5G_EN  0x00008000   /* FLAG for radio0_2G */ 
     36#define BD_WLAN1_2G_EN  0x00020000   /* FLAG for radio0_2G */ 
     37#define BD_WLAN1_5G_EN  0x00040000   /* FLAG for radio0_2G */ 
     38    u16 resetConfigGpio;             /* Reset factory GPIO pin */ 
     39    u16 sysLedGpio;                  /* System LED GPIO pin */ 
     40 
     41    u32 cpuFreq;                     /* CPU core frequency in Hz */ 
     42    u32 sysFreq;                     /* System frequency in Hz */ 
     43    u32 cntFreq;                     /* Calculated C0_COUNT frequency */ 
     44 
     45    u8  wlan0_mac[6]; 
     46    u8  enet0_mac[6]; 
     47    u8  enet1_mac[6]; 
     48 
     49    u16 pciId;                       /* Pseudo PCIID for common code */ 
     50    u16 memCap;                      /* cap bank1 in MB */ 
     51 
     52    /* version 3 */ 
     53    u8  wlan1_mac[6];                 /* (ar5212) */ 
     54}; 
     55 
     56#define BOARD_CONFIG_BUFSZ              0x1000 
     57 
     58/* 
     59 * Platform device information for the Wireless MAC 
     60 */ 
     61struct ar231x_board_config { 
     62        u16 devid; 
     63 
     64        /* board config data */ 
     65        struct ar231x_boarddata *config; 
     66 
     67        /* radio calibration data */ 
     68        const char *radio; 
     69}; 
     70 
     71/* 
     72 * Platform device information for the Ethernet MAC 
     73 */ 
     74struct ar231x_eth { 
     75        u32 reset_base; 
     76        u32 reset_mac; 
     77        u32 reset_phy; 
     78        u32 phy_base; 
     79        struct ar231x_board_config *config; 
     80        char *macaddr; 
     81}; 
     82 
     83#endif /* __AR531X_PLATFORM_H */ 
  • new file arch/mips/include/asm/mach-ar231x/cpu-feature-overrides.h

    - +  
     1/* 
     2 *  Atheros SoC specific CPU feature overrides 
     3 * 
     4 *  Copyright (C) 2008 Gabor Juhos <juhosg@openwrt.org> 
     5 * 
     6 *  This file was derived from: include/asm-mips/cpu-features.h 
     7 *      Copyright (C) 2003, 2004 Ralf Baechle 
     8 *      Copyright (C) 2004 Maciej W. Rozycki 
     9 * 
     10 *  This program is free software; you can redistribute it and/or modify it 
     11 *  under the terms of the GNU General Public License version 2 as published 
     12 *  by the Free Software Foundation. 
     13 * 
     14 */ 
     15#ifndef __ASM_MACH_ATHEROS_CPU_FEATURE_OVERRIDES_H 
     16#define __ASM_MACH_ATHEROS_CPU_FEATURE_OVERRIDES_H 
     17 
     18/* 
     19 * The ATHEROS SoCs have MIPS 4Kc/4KEc core. 
     20 */ 
     21#define cpu_has_tlb                     1 
     22#define cpu_has_4kex                    1 
     23#define cpu_has_3k_cache                0 
     24#define cpu_has_4k_cache                1 
     25#define cpu_has_tx39_cache              0 
     26#define cpu_has_sb1_cache               0 
     27#define cpu_has_fpu                     0 
     28#define cpu_has_32fpr                   0 
     29#define cpu_has_counter                 1 
     30/* #define cpu_has_watch                ? */ 
     31/* #define cpu_has_divec                ? */ 
     32/* #define cpu_has_vce                  ? */ 
     33/* #define cpu_has_cache_cdex_p         ? */ 
     34/* #define cpu_has_cache_cdex_s         ? */ 
     35/* #define cpu_has_prefetch             ? */ 
     36/* #define cpu_has_mcheck               ? */ 
     37#define cpu_has_ejtag                   1 
     38 
     39#if !defined(CONFIG_ATHEROS_AR5312) 
     40#  define cpu_has_llsc                  1 
     41#else 
     42/* 
     43 * The MIPS 4Kc V0.9 core in the AR5312/AR2312 have problems with the 
     44 * ll/sc instructions. 
     45 */ 
     46#  define cpu_has_llsc                  0 
     47#endif 
     48 
     49#define cpu_has_mips16                  0 
     50#define cpu_has_mdmx                    0 
     51#define cpu_has_mips3d                  0 
     52#define cpu_has_smartmips               0 
     53 
     54/* #define cpu_has_vtag_icache          ? */ 
     55/* #define cpu_has_dc_aliases           ? */ 
     56/* #define cpu_has_ic_fills_f_dc        ? */ 
     57/* #define cpu_has_pindexed_dcache      ? */ 
     58 
     59/* #define cpu_icache_snoops_remote_store       ? */ 
     60 
     61#define cpu_has_mips32r1                1 
     62 
     63#if !defined(CONFIG_ATHEROS_AR5312) 
     64#  define cpu_has_mips32r2              1 
     65#endif 
     66 
     67#define cpu_has_mips64r1                0 
     68#define cpu_has_mips64r2                0 
     69 
     70#define cpu_has_dsp                     0 
     71#define cpu_has_mipsmt                  0 
     72 
     73/* #define cpu_has_nofpuex              ? */ 
     74#define cpu_has_64bits                  0 
     75#define cpu_has_64bit_zero_reg          0 
     76#define cpu_has_64bit_gp_regs           0 
     77#define cpu_has_64bit_addresses         0 
     78 
     79/* #define cpu_has_inclusive_pcaches    ? */ 
     80 
     81/* #define cpu_dcache_line_size()       ? */ 
     82/* #define cpu_icache_line_size()       ? */ 
     83 
     84#endif /* __ASM_MACH_ATHEROS_CPU_FEATURE_OVERRIDES_H */ 
  • new file arch/mips/include/asm/mach-ar231x/dma-coherence.h

    - +  
     1/* 
     2 * This file is subject to the terms and conditions of the GNU General Public 
     3 * License.  See the file "COPYING" in the main directory of this archive 
     4 * for more details. 
     5 * 
     6 * Copyright (C) 2006  Ralf Baechle <ralf@linux-mips.org> 
     7 * Copyright (C) 2007  Felix Fietkau <nbd@openwrt.org> 
     8 * 
     9 */ 
     10#ifndef __ASM_MACH_GENERIC_DMA_COHERENCE_H 
     11#define __ASM_MACH_GENERIC_DMA_COHERENCE_H 
     12 
     13#define PCI_DMA_OFFSET  0x20000000 
     14 
     15struct device; 
     16 
     17static dma_addr_t plat_map_dma_mem(struct device *dev, void *addr, size_t size) 
     18{ 
     19        return virt_to_phys(addr) + (dev != NULL ? PCI_DMA_OFFSET : 0); 
     20} 
     21 
     22static dma_addr_t plat_map_dma_mem_page(struct device *dev, struct page *page) 
     23{ 
     24        return page_to_phys(page) + (dev != NULL ? PCI_DMA_OFFSET : 0); 
     25} 
     26 
     27static unsigned long plat_dma_addr_to_phys(dma_addr_t dma_addr) 
     28{ 
     29        return (dma_addr > PCI_DMA_OFFSET ? dma_addr - PCI_DMA_OFFSET : dma_addr); 
     30} 
     31 
     32static inline void plat_unmap_dma_mem(struct device *dev, dma_addr_t dma_addr) 
     33{ 
     34} 
     35 
     36static inline int plat_dma_supported(struct device *dev, u64 mask) 
     37{ 
     38        return 1; 
     39} 
     40 
     41static inline void plat_extra_sync_for_device(struct device *dev) 
     42{ 
     43        return; 
     44} 
     45 
     46static inline int plat_dma_mapping_error(struct device *dev, 
     47                                         dma_addr_t dma_addr) 
     48{ 
     49        return 0; 
     50} 
     51 
     52static inline int plat_device_is_coherent(struct device *dev) 
     53{ 
     54#ifdef CONFIG_DMA_COHERENT 
     55        return 1; 
     56#endif 
     57#ifdef CONFIG_DMA_NONCOHERENT 
     58        return 0; 
     59#endif 
     60} 
     61 
     62#endif /* __ASM_MACH_GENERIC_DMA_COHERENCE_H */ 
  • new file arch/mips/include/asm/mach-ar231x/gpio.h

    - +  
     1#ifndef _ATHEROS_GPIO_H_ 
     2#define _ATHEROS_GPIO_H_ 
     3 
     4#include <ar231x.h> 
     5 
     6struct ar231x_gpiodev { 
     7        u32 valid_mask; 
     8        u32 (*get_output)(void); 
     9        u32 (*set_output)(u32 mask, u32 val); 
     10        u32 (*get)(void); 
     11        u32 (*set)(u32 mask, u32 val); 
     12}; 
     13 
     14extern const struct ar231x_gpiodev *ar231x_gpiodev; 
     15 
     16/* 
     17 * Wrappers for the generic GPIO layer 
     18 */ 
     19 
     20static inline int gpio_direction_input(unsigned gpio) { 
     21        u32 mask = 1 << gpio; 
     22 
     23        if (!(ar231x_gpiodev->valid_mask & mask)) 
     24                return -ENXIO; 
     25 
     26        ar231x_gpiodev->set_output(mask, 0); 
     27        return 0; 
     28} 
     29 
     30static inline void gpio_set_value(unsigned gpio, int value) { 
     31        u32 mask = 1 << gpio; 
     32 
     33        if (!(ar231x_gpiodev->valid_mask & mask)) 
     34                return; 
     35 
     36        ar231x_gpiodev->set(mask, (!!value) * mask); 
     37} 
     38 
     39static inline int gpio_direction_output(unsigned gpio, int value) { 
     40        u32 mask = 1 << gpio; 
     41 
     42        if (!(ar231x_gpiodev->valid_mask & mask)) 
     43                return -ENXIO; 
     44 
     45        ar231x_gpiodev->set_output(mask, mask); 
     46        ar231x_gpiodev->set(mask, (!!value) * mask); 
     47        return 0; 
     48} 
     49 
     50/* Reads the gpio pin.  Unchecked function */ 
     51static inline int gpio_get_value(unsigned gpio) { 
     52        u32 mask = 1 << gpio; 
     53 
     54        if (!(ar231x_gpiodev->valid_mask & mask)) 
     55                return 0; 
     56 
     57        return !!(ar231x_gpiodev->get() & mask); 
     58} 
     59 
     60static inline int gpio_request(unsigned gpio, const char *label) { 
     61        return 0; 
     62} 
     63 
     64static inline void gpio_free(unsigned gpio) { 
     65} 
     66 
     67/* Returns IRQ to attach for gpio.  Unchecked function */ 
     68static inline int gpio_to_irq(unsigned gpio) { 
     69        return AR531X_GPIO_IRQ(gpio); 
     70} 
     71 
     72/* Returns gpio for IRQ attached.  Unchecked function */ 
     73static inline int irq_to_gpio(unsigned irq) { 
     74        return (irq - (AR531X_GPIO_IRQ(0))); 
     75} 
     76 
     77#include <asm-generic/gpio.h> /* cansleep wrappers */ 
     78 
     79#endif 
  • new file arch/mips/include/asm/mach-ar231x/reset.h

    - +  
     1#ifndef __AR531X_RESET_H 
     2#define __AR531X_RESET_H 
     3 
     4void ar531x_disable_reset_button(void); 
     5 
     6#endif /* __AR531X_RESET_H */ 
  • new file arch/mips/include/asm/mach-ar231x/war.h

    - +  
     1/* 
     2 * This file is subject to the terms and conditions of the GNU General Public 
     3 * License.  See the file "COPYING" in the main directory of this archive 
     4 * for more details. 
     5 * 
     6 * Copyright (C) 2008 Felix Fietkau <nbd@openwrt.org> 
     7 */ 
     8#ifndef __ASM_MIPS_MACH_ATHEROS_WAR_H 
     9#define __ASM_MIPS_MACH_ATHEROS_WAR_H 
     10 
     11#define R4600_V1_INDEX_ICACHEOP_WAR     0 
     12#define R4600_V1_HIT_CACHEOP_WAR        0 
     13#define R4600_V2_HIT_CACHEOP_WAR        0 
     14#define R5432_CP0_INTERRUPT_WAR         0 
     15#define BCM1250_M3_WAR                  0 
     16#define SIBYTE_1956_WAR                 0 
     17#define MIPS4K_ICACHE_REFILL_WAR        0 
     18#define MIPS_CACHE_SYNC_WAR             0 
     19#define TX49XX_ICACHE_INDEX_INV_WAR     0 
     20#define RM9000_CDEX_SMP_WAR             0 
     21#define ICACHE_REFILLS_WORKAROUND_WAR   0 
     22#define R10000_LLSC_WAR                 0 
     23#define MIPS34K_MISSED_ITLB_WAR         0 
     24 
     25#endif /* __ASM_MIPS_MACH_ATHEROS_WAR_H */ 
  • new file arch/mips/include/asm/mach-ar231x/ar2315_regs.h

    - +  
     1/* 
     2 * Register definitions for AR2315+ 
     3 * 
     4 * This file is subject to the terms and conditions of the GNU General Public 
     5 * License.  See the file "COPYING" in the main directory of this archive 
     6 * for more details. 
     7 * 
     8 * Copyright (C) 2003 Atheros Communications, Inc.,  All Rights Reserved. 
     9 * Copyright (C) 2006 FON Technology, SL. 
     10 * Copyright (C) 2006 Imre Kaloz <kaloz@openwrt.org> 
     11 * Copyright (C) 2006-2008 Felix Fietkau <nbd@openwrt.org> 
     12 */ 
     13 
     14#ifndef __AR2315_REG_H 
     15#define __AR2315_REG_H 
     16 
     17/* 
     18 * IRQs 
     19 */ 
     20#define AR2315_IRQ_MISC_INTRS   MIPS_CPU_IRQ_BASE+2 /* C0_CAUSE: 0x0400 */ 
     21#define AR2315_IRQ_WLAN0_INTRS  MIPS_CPU_IRQ_BASE+3 /* C0_CAUSE: 0x0800 */ 
     22#define AR2315_IRQ_ENET0_INTRS  MIPS_CPU_IRQ_BASE+4 /* C0_CAUSE: 0x1000 */ 
     23#define AR2315_IRQ_LCBUS_PCI    MIPS_CPU_IRQ_BASE+5 /* C0_CAUSE: 0x2000 */ 
     24#define AR2315_IRQ_WLAN0_POLL   MIPS_CPU_IRQ_BASE+6 /* C0_CAUSE: 0x4000 */ 
     25 
     26/* 
     27 * Address map 
     28 */ 
     29#define AR2315_SPI_READ         0x08000000      /* SPI FLASH */ 
     30#define AR2315_WLAN0            0xB0000000      /* Wireless MMR */ 
     31#define AR2315_PCI              0xB0100000      /* PCI MMR */ 
     32#define AR2315_SDRAMCTL         0xB0300000      /* SDRAM MMR */ 
     33#define AR2315_LOCAL            0xB0400000      /* LOCAL BUS MMR */ 
     34#define AR2315_ENET0            0xB0500000      /* ETHERNET MMR */ 
     35#define AR2315_DSLBASE          0xB1000000      /* RESET CONTROL MMR */ 
     36#define AR2315_UART0            0xB1100003      /* UART MMR */ 
     37#define AR2315_SPI              0xB1300000      /* SPI FLASH MMR */ 
     38#define AR2315_PCIEXT           0x80000000      /* pci external */ 
     39 
     40/* 
     41 * Reset Register 
     42 */ 
     43#define AR2315_COLD_RESET       (AR2315_DSLBASE + 0x0000) 
     44 
     45#define AR2315_RESET_COLD_AHB              0x00000001 
     46#define AR2315_RESET_COLD_APB              0x00000002 
     47#define AR2315_RESET_COLD_CPU              0x00000004 
     48#define AR2315_RESET_COLD_CPUWARM          0x00000008 
     49#define AR2315_RESET_SYSTEM                (RESET_COLD_CPU | RESET_COLD_APB | RESET_COLD_AHB)      /* full system */ 
     50#define AR2317_RESET_SYSTEM                0x00000010 
     51 
     52 
     53#define AR2315_RESET            (AR2315_DSLBASE + 0x0004) 
     54 
     55#define AR2315_RESET_WARM_WLAN0_MAC        0x00000001      /* warm reset WLAN0 MAC */ 
     56#define AR2315_RESET_WARM_WLAN0_BB         0x00000002      /* warm reset WLAN0 BaseBand */ 
     57#define AR2315_RESET_MPEGTS_RSVD           0x00000004      /* warm reset MPEG-TS */ 
     58#define AR2315_RESET_PCIDMA                0x00000008      /* warm reset PCI ahb/dma */ 
     59#define AR2315_RESET_MEMCTL                0x00000010      /* warm reset memory controller */ 
     60#define AR2315_RESET_LOCAL                 0x00000020      /* warm reset local bus */ 
     61#define AR2315_RESET_I2C_RSVD              0x00000040      /* warm reset I2C bus */ 
     62#define AR2315_RESET_SPI                   0x00000080      /* warm reset SPI interface */ 
     63#define AR2315_RESET_UART0                 0x00000100      /* warm reset UART0 */ 
     64#define AR2315_RESET_IR_RSVD               0x00000200      /* warm reset IR interface */ 
     65#define AR2315_RESET_EPHY0                 0x00000400      /* cold reset ENET0 phy */ 
     66#define AR2315_RESET_ENET0                 0x00000800      /* cold reset ENET0 mac */ 
     67 
     68/* 
     69 * AHB master arbitration control 
     70 */ 
     71#define AR2315_AHB_ARB_CTL      (AR2315_DSLBASE + 0x0008) 
     72 
     73#define AR2315_ARB_CPU                     0x00000001      /* CPU, default */ 
     74#define AR2315_ARB_WLAN                    0x00000002      /* WLAN */ 
     75#define AR2315_ARB_MPEGTS_RSVD             0x00000004      /* MPEG-TS */ 
     76#define AR2315_ARB_LOCAL                   0x00000008      /* LOCAL */ 
     77#define AR2315_ARB_PCI                     0x00000010      /* PCI */ 
     78#define AR2315_ARB_ETHERNET                0x00000020      /* Ethernet */ 
     79#define AR2315_ARB_RETRY                   0x00000100      /* retry policy, debug only */ 
     80 
     81/* 
     82 * Config Register 
     83 */ 
     84#define AR2315_ENDIAN_CTL       (AR2315_DSLBASE + 0x000c) 
     85 
     86#define AR2315_CONFIG_AHB                  0x00000001      /* EC - AHB bridge endianess */ 
     87#define AR2315_CONFIG_WLAN                 0x00000002      /* WLAN byteswap */ 
     88#define AR2315_CONFIG_MPEGTS_RSVD          0x00000004      /* MPEG-TS byteswap */ 
     89#define AR2315_CONFIG_PCI                  0x00000008      /* PCI byteswap */ 
     90#define AR2315_CONFIG_MEMCTL               0x00000010      /* Memory controller endianess */ 
     91#define AR2315_CONFIG_LOCAL                0x00000020      /* Local bus byteswap */ 
     92#define AR2315_CONFIG_ETHERNET             0x00000040      /* Ethernet byteswap */ 
     93 
     94#define AR2315_CONFIG_MERGE                0x00000200      /* CPU write buffer merge */ 
     95#define AR2315_CONFIG_CPU                  0x00000400      /* CPU big endian */ 
     96#define AR2315_CONFIG_PCIAHB               0x00000800 
     97#define AR2315_CONFIG_PCIAHB_BRIDGE        0x00001000 
     98#define AR2315_CONFIG_SPI                  0x00008000      /* SPI byteswap */ 
     99#define AR2315_CONFIG_CPU_DRAM             0x00010000 
     100#define AR2315_CONFIG_CPU_PCI              0x00020000 
     101#define AR2315_CONFIG_CPU_MMR              0x00040000 
     102#define AR2315_CONFIG_BIG                  0x00000400 
     103 
     104 
     105/* 
     106 * NMI control 
     107 */ 
     108#define AR2315_NMI_CTL          (AR2315_DSLBASE + 0x0010) 
     109 
     110#define AR2315_NMI_EN  1 
     111 
     112/* 
     113 * Revision Register - Initial value is 0x3010 (WMAC 3.0, AR531X 1.0). 
     114 */ 
     115#define AR2315_SREV             (AR2315_DSLBASE + 0x0014) 
     116 
     117#define AR2315_REV_MAJ                     0x00f0 
     118#define AR2315_REV_MAJ_S                   4 
     119#define AR2315_REV_MIN                     0x000f 
     120#define AR2315_REV_MIN_S                   0 
     121#define AR2315_REV_CHIP                    (AR2315_REV_MAJ|AR2315_REV_MIN) 
     122 
     123/* 
     124 * Interface Enable 
     125 */ 
     126#define AR2315_IF_CTL           (AR2315_DSLBASE + 0x0018) 
     127 
     128#define AR2315_IF_MASK                     0x00000007 
     129#define AR2315_IF_DISABLED                 0 
     130#define AR2315_IF_PCI                      1 
     131#define AR2315_IF_TS_LOCAL                 2 
     132#define AR2315_IF_ALL                      3   /* only for emulation with separate pins */ 
     133#define AR2315_IF_LOCAL_HOST               0x00000008 
     134#define AR2315_IF_PCI_HOST                 0x00000010 
     135#define AR2315_IF_PCI_INTR                 0x00000020 
     136#define AR2315_IF_PCI_CLK_MASK             0x00030000 
     137#define AR2315_IF_PCI_CLK_INPUT            0 
     138#define AR2315_IF_PCI_CLK_OUTPUT_LOW       1 
     139#define AR2315_IF_PCI_CLK_OUTPUT_CLK       2 
     140#define AR2315_IF_PCI_CLK_OUTPUT_HIGH      3 
     141#define AR2315_IF_PCI_CLK_SHIFT            16 
     142 
     143/* 
     144 * APB Interrupt control 
     145 */ 
     146 
     147#define AR2315_ISR              (AR2315_DSLBASE + 0x0020) 
     148#define AR2315_IMR              (AR2315_DSLBASE + 0x0024) 
     149#define AR2315_GISR             (AR2315_DSLBASE + 0x0028) 
     150 
     151#define AR2315_ISR_UART0                   0x0001           /* high speed UART */ 
     152#define AR2315_ISR_I2C_RSVD                0x0002           /* I2C bus */ 
     153#define AR2315_ISR_SPI                     0x0004           /* SPI bus */ 
     154#define AR2315_ISR_AHB                     0x0008           /* AHB error */ 
     155#define AR2315_ISR_APB                     0x0010           /* APB error */ 
     156#define AR2315_ISR_TIMER                   0x0020           /* timer */ 
     157#define AR2315_ISR_GPIO                    0x0040           /* GPIO */ 
     158#define AR2315_ISR_WD                      0x0080           /* watchdog */ 
     159#define AR2315_ISR_IR_RSVD                 0x0100           /* IR */ 
     160 
     161#define AR2315_GISR_MISC                   0x0001 
     162#define AR2315_GISR_WLAN0                  0x0002 
     163#define AR2315_GISR_MPEGTS_RSVD            0x0004 
     164#define AR2315_GISR_LOCALPCI               0x0008 
     165#define AR2315_GISR_WMACPOLL               0x0010 
     166#define AR2315_GISR_TIMER                  0x0020 
     167#define AR2315_GISR_ETHERNET               0x0040 
     168 
     169/* 
     170 * Interrupt routing from IO to the processor IP bits 
     171 * Define our inter mask and level 
     172 */ 
     173#define AR2315_INTR_MISCIO      SR_IBIT3 
     174#define AR2315_INTR_WLAN0       SR_IBIT4 
     175#define AR2315_INTR_ENET0       SR_IBIT5 
     176#define AR2315_INTR_LOCALPCI    SR_IBIT6 
     177#define AR2315_INTR_WMACPOLL    SR_IBIT7 
     178#define AR2315_INTR_COMPARE     SR_IBIT8 
     179 
     180/* 
     181 * Timers 
     182 */ 
     183#define AR2315_TIMER            (AR2315_DSLBASE + 0x0030) 
     184#define AR2315_RELOAD           (AR2315_DSLBASE + 0x0034) 
     185#define AR2315_WD               (AR2315_DSLBASE + 0x0038) 
     186#define AR2315_WDC              (AR2315_DSLBASE + 0x003c) 
     187 
     188#define AR2315_WDC_IGNORE_EXPIRATION       0x00000000 
     189#define AR2315_WDC_NMI                     0x00000001               /* NMI on watchdog */ 
     190#define AR2315_WDC_RESET                   0x00000002               /* reset on watchdog */ 
     191 
     192/* 
     193 * CPU Performance Counters 
     194 */ 
     195#define AR2315_PERFCNT0         (AR2315_DSLBASE + 0x0048) 
     196#define AR2315_PERFCNT1         (AR2315_DSLBASE + 0x004c) 
     197 
     198#define AR2315_PERF0_DATAHIT                0x0001  /* Count Data Cache Hits */ 
     199#define AR2315_PERF0_DATAMISS               0x0002  /* Count Data Cache Misses */ 
     200#define AR2315_PERF0_INSTHIT                0x0004  /* Count Instruction Cache Hits */ 
     201#define AR2315_PERF0_INSTMISS               0x0008  /* Count Instruction Cache Misses */ 
     202#define AR2315_PERF0_ACTIVE                 0x0010  /* Count Active Processor Cycles */ 
     203#define AR2315_PERF0_WBHIT                  0x0020  /* Count CPU Write Buffer Hits */ 
     204#define AR2315_PERF0_WBMISS                 0x0040  /* Count CPU Write Buffer Misses */ 
     205 
     206#define AR2315_PERF1_EB_ARDY                0x0001  /* Count EB_ARdy signal */ 
     207#define AR2315_PERF1_EB_AVALID              0x0002  /* Count EB_AValid signal */ 
     208#define AR2315_PERF1_EB_WDRDY               0x0004  /* Count EB_WDRdy signal */ 
     209#define AR2315_PERF1_EB_RDVAL               0x0008  /* Count EB_RdVal signal */ 
     210#define AR2315_PERF1_VRADDR                 0x0010  /* Count valid read address cycles */ 
     211#define AR2315_PERF1_VWADDR                 0x0020  /* Count valid write address cycles */ 
     212#define AR2315_PERF1_VWDATA                 0x0040  /* Count valid write data cycles */ 
     213 
     214/* 
     215 * AHB Error Reporting. 
     216 */ 
     217#define AR2315_AHB_ERR0         (AR2315_DSLBASE + 0x0050)  /* error  */ 
     218#define AR2315_AHB_ERR1         (AR2315_DSLBASE + 0x0054)  /* haddr  */ 
     219#define AR2315_AHB_ERR2         (AR2315_DSLBASE + 0x0058)  /* hwdata */ 
     220#define AR2315_AHB_ERR3         (AR2315_DSLBASE + 0x005c)  /* hrdata */ 
     221#define AR2315_AHB_ERR4         (AR2315_DSLBASE + 0x0060)  /* status */ 
     222 
     223#define AHB_ERROR_DET               1   /* AHB Error has been detected,          */ 
     224                                        /* write 1 to clear all bits in ERR0     */ 
     225#define AHB_ERROR_OVR               2   /* AHB Error overflow has been detected  */ 
     226#define AHB_ERROR_WDT               4   /* AHB Error due to wdt instead of hresp */ 
     227 
     228#define AR2315_PROCERR_HMAST               0x0000000f 
     229#define AR2315_PROCERR_HMAST_DFLT          0 
     230#define AR2315_PROCERR_HMAST_WMAC          1 
     231#define AR2315_PROCERR_HMAST_ENET          2 
     232#define AR2315_PROCERR_HMAST_PCIENDPT      3 
     233#define AR2315_PROCERR_HMAST_LOCAL         4 
     234#define AR2315_PROCERR_HMAST_CPU           5 
     235#define AR2315_PROCERR_HMAST_PCITGT        6 
     236 
     237#define AR2315_PROCERR_HMAST_S             0 
     238#define AR2315_PROCERR_HWRITE              0x00000010 
     239#define AR2315_PROCERR_HSIZE               0x00000060 
     240#define AR2315_PROCERR_HSIZE_S             5 
     241#define AR2315_PROCERR_HTRANS              0x00000180 
     242#define AR2315_PROCERR_HTRANS_S            7 
     243#define AR2315_PROCERR_HBURST              0x00000e00 
     244#define AR2315_PROCERR_HBURST_S            9 
     245 
     246/* 
     247 * Clock Control 
     248 */ 
     249#define AR2315_PLLC_CTL         (AR2315_DSLBASE + 0x0064) 
     250#define AR2315_PLLV_CTL         (AR2315_DSLBASE + 0x0068) 
     251#define AR2315_CPUCLK           (AR2315_DSLBASE + 0x006c) 
     252#define AR2315_AMBACLK          (AR2315_DSLBASE + 0x0070) 
     253#define AR2315_SYNCCLK          (AR2315_DSLBASE + 0x0074) 
     254#define AR2315_DSL_SLEEP_CTL    (AR2315_DSLBASE + 0x0080) 
     255#define AR2315_DSL_SLEEP_DUR    (AR2315_DSLBASE + 0x0084) 
     256 
     257/* PLLc Control fields */ 
     258#define PLLC_REF_DIV_M              0x00000003 
     259#define PLLC_REF_DIV_S              0 
     260#define PLLC_FDBACK_DIV_M           0x0000007C 
     261#define PLLC_FDBACK_DIV_S           2 
     262#define PLLC_ADD_FDBACK_DIV_M       0x00000080 
     263#define PLLC_ADD_FDBACK_DIV_S       7 
     264#define PLLC_CLKC_DIV_M             0x0001c000 
     265#define PLLC_CLKC_DIV_S             14 
     266#define PLLC_CLKM_DIV_M             0x00700000 
     267#define PLLC_CLKM_DIV_S             20 
     268 
     269/* CPU CLK Control fields */ 
     270#define CPUCLK_CLK_SEL_M            0x00000003 
     271#define CPUCLK_CLK_SEL_S            0 
     272#define CPUCLK_CLK_DIV_M            0x0000000c 
     273#define CPUCLK_CLK_DIV_S            2 
     274 
     275/* AMBA CLK Control fields */ 
     276#define AMBACLK_CLK_SEL_M           0x00000003 
     277#define AMBACLK_CLK_SEL_S           0 
     278#define AMBACLK_CLK_DIV_M           0x0000000c 
     279#define AMBACLK_CLK_DIV_S           2 
     280 
     281/* 
     282 * GPIO 
     283 */ 
     284#define AR2315_GPIO_DI          (AR2315_DSLBASE + 0x0088) 
     285#define AR2315_GPIO_DO          (AR2315_DSLBASE + 0x0090) 
     286#define AR2315_GPIO_CR          (AR2315_DSLBASE + 0x0098) 
     287#define AR2315_GPIO_INT         (AR2315_DSLBASE + 0x00a0) 
     288 
     289#define AR2315_GPIO_CR_M(x)                (1 << (x))                  /* mask for i/o */ 
     290#define AR2315_GPIO_CR_O(x)                (1 << (x))                  /* output */ 
     291#define AR2315_GPIO_CR_I(x)                (0)                         /* input */ 
     292 
     293#define AR2315_GPIO_INT_S(x)               (x)                         /* interrupt enable */ 
     294#define AR2315_GPIO_INT_M                  (0x3F)                      /* mask for int */ 
     295#define AR2315_GPIO_INT_LVL(x)             ((x) << 6)                  /* interrupt level */ 
     296#define AR2315_GPIO_INT_LVL_M              ((0x3) << 6)                /* mask for int level */ 
     297 
     298#define AR2315_GPIO_INT_MAX_Y                           1   /* Maximum value of Y for AR5313_GPIO_INT_* macros */ 
     299#define AR2315_GPIO_INT_LVL_OFF                         0   /* Triggerring off */ 
     300#define AR2315_GPIO_INT_LVL_LOW                         1   /* Low Level Triggered */ 
     301#define AR2315_GPIO_INT_LVL_HIGH                        2   /* High Level Triggered */ 
     302#define AR2315_GPIO_INT_LVL_EDGE                        3   /* Edge Triggered */ 
     303 
     304#define AR2315_RESET_GPIO       5 
     305#define AR2315_NUM_GPIO         22 
     306 
     307/* 
     308 *  PCI Clock Control 
     309 */ 
     310#define AR2315_PCICLK           (AR2315_DSLBASE + 0x00a4) 
     311 
     312#define AR2315_PCICLK_INPUT_M              0x3 
     313#define AR2315_PCICLK_INPUT_S              0 
     314 
     315#define AR2315_PCICLK_PLLC_CLKM            0 
     316#define AR2315_PCICLK_PLLC_CLKM1           1 
     317#define AR2315_PCICLK_PLLC_CLKC            2 
     318#define AR2315_PCICLK_REF_CLK              3 
     319 
     320#define AR2315_PCICLK_DIV_M                0xc 
     321#define AR2315_PCICLK_DIV_S                2 
     322 
     323#define AR2315_PCICLK_IN_FREQ              0 
     324#define AR2315_PCICLK_IN_FREQ_DIV_6        1 
     325#define AR2315_PCICLK_IN_FREQ_DIV_8        2 
     326#define AR2315_PCICLK_IN_FREQ_DIV_10       3 
     327 
     328/* 
     329 * Observation Control Register 
     330 */ 
     331#define AR2315_OCR              (AR2315_DSLBASE + 0x00b0) 
     332#define OCR_GPIO0_IRIN              0x0040 
     333#define OCR_GPIO1_IROUT             0x0080 
     334#define OCR_GPIO3_RXCLR             0x0200 
     335 
     336/* 
     337 *  General Clock Control 
     338 */ 
     339 
     340#define AR2315_MISCCLK          (AR2315_DSLBASE + 0x00b4) 
     341#define MISCCLK_PLLBYPASS_EN        0x00000001 
     342#define MISCCLK_PROCREFCLK          0x00000002 
     343 
     344/* 
     345 * SDRAM Controller 
     346 *   - No read or write buffers are included. 
     347 */ 
     348#define AR2315_MEM_CFG          (AR2315_SDRAMCTL + 0x00) 
     349#define AR2315_MEM_CTRL         (AR2315_SDRAMCTL + 0x0c) 
     350#define AR2315_MEM_REF          (AR2315_SDRAMCTL + 0x10) 
     351 
     352#define SDRAM_DATA_WIDTH_M          0x00006000 
     353#define SDRAM_DATA_WIDTH_S          13 
     354 
     355#define SDRAM_COL_WIDTH_M           0x00001E00 
     356#define SDRAM_COL_WIDTH_S           9 
     357 
     358#define SDRAM_ROW_WIDTH_M           0x000001E0 
     359#define SDRAM_ROW_WIDTH_S           5 
     360 
     361#define SDRAM_BANKADDR_BITS_M       0x00000018 
     362#define SDRAM_BANKADDR_BITS_S       3 
     363 
     364/* 
     365 * SPI Flash Interface Registers 
     366 */ 
     367 
     368#define AR2315_SPI_CTL      (AR2315_SPI + 0x00) 
     369#define AR2315_SPI_OPCODE   (AR2315_SPI + 0x04) 
     370#define AR2315_SPI_DATA     (AR2315_SPI + 0x08) 
     371 
     372#define SPI_CTL_START           0x00000100 
     373#define SPI_CTL_BUSY            0x00010000 
     374#define SPI_CTL_TXCNT_MASK      0x0000000f 
     375#define SPI_CTL_RXCNT_MASK      0x000000f0 
     376#define SPI_CTL_TX_RX_CNT_MASK  0x000000ff 
     377#define SPI_CTL_SIZE_MASK       0x00060000 
     378 
     379#define SPI_CTL_CLK_SEL_MASK    0x03000000 
     380#define SPI_OPCODE_MASK         0x000000ff 
     381 
     382/* 
     383 * PCI Bus Interface Registers 
     384 */ 
     385#define AR2315_PCI_1MS_REG      (AR2315_PCI + 0x0008) 
     386#define AR2315_PCI_1MS_MASK     0x3FFFF         /* # of AHB clk cycles in 1ms */ 
     387 
     388#define AR2315_PCI_MISC_CONFIG  (AR2315_PCI + 0x000c) 
     389#define AR2315_PCIMISC_TXD_EN   0x00000001      /* Enable TXD for fragments */ 
     390#define AR2315_PCIMISC_CFG_SEL  0x00000002      /* mem or config cycles */ 
     391#define AR2315_PCIMISC_GIG_MASK 0x0000000C      /* bits 31-30 for pci req */ 
     392#define AR2315_PCIMISC_RST_MODE 0x00000030 
     393#define AR2315_PCIRST_INPUT     0x00000000      /* 4:5=0 rst is input */ 
     394#define AR2315_PCIRST_LOW       0x00000010      /* 4:5=1 rst to GND */ 
     395#define AR2315_PCIRST_HIGH      0x00000020      /* 4:5=2 rst to VDD */ 
     396#define AR2315_PCIGRANT_EN      0x00000000      /* 6:7=0 early grant en */ 
     397#define AR2315_PCIGRANT_FRAME   0x00000040      /* 6:7=1 grant waits 4 frame */ 
     398#define AR2315_PCIGRANT_IDLE    0x00000080      /* 6:7=2 grant waits 4 idle */ 
     399#define AR2315_PCIGRANT_GAP     0x00000000      /* 6:7=2 grant waits 4 idle */ 
     400#define AR2315_PCICACHE_DIS     0x00001000      /* PCI external access cache disable */ 
     401 
     402#define AR2315_PCI_OUT_TSTAMP   (AR2315_PCI + 0x0010) 
     403 
     404#define AR2315_PCI_UNCACHE_CFG  (AR2315_PCI + 0x0014) 
     405 
     406#define AR2315_PCI_IN_EN        (AR2315_PCI + 0x0100) 
     407#define AR2315_PCI_IN_EN0       0x01            /* Enable chain 0 */ 
     408#define AR2315_PCI_IN_EN1       0x02            /* Enable chain 1 */ 
     409#define AR2315_PCI_IN_EN2       0x04            /* Enable chain 2 */ 
     410#define AR2315_PCI_IN_EN3       0x08            /* Enable chain 3 */ 
     411 
     412#define AR2315_PCI_IN_DIS       (AR2315_PCI + 0x0104) 
     413#define AR2315_PCI_IN_DIS0      0x01            /* Disable chain 0 */ 
     414#define AR2315_PCI_IN_DIS1      0x02            /* Disable chain 1 */ 
     415#define AR2315_PCI_IN_DIS2      0x04            /* Disable chain 2 */ 
     416#define AR2315_PCI_IN_DIS3      0x08            /* Disable chain 3 */ 
     417 
     418#define AR2315_PCI_IN_PTR       (AR2315_PCI + 0x0200) 
     419 
     420#define AR2315_PCI_OUT_EN       (AR2315_PCI + 0x0400) 
     421#define AR2315_PCI_OUT_EN0      0x01            /* Enable chain 0 */ 
     422 
     423#define AR2315_PCI_OUT_DIS      (AR2315_PCI + 0x0404) 
     424#define AR2315_PCI_OUT_DIS0     0x01            /* Disable chain 0 */ 
     425 
     426#define AR2315_PCI_OUT_PTR      (AR2315_PCI + 0x0408) 
     427 
     428#define AR2315_PCI_INT_STATUS   (AR2315_PCI + 0x0500)   /* write one to clr */ 
     429#define AR2315_PCI_TXINT        0x00000001      /* Desc In Completed */ 
     430#define AR2315_PCI_TXOK         0x00000002      /* Desc In OK */ 
     431#define AR2315_PCI_TXERR        0x00000004      /* Desc In ERR */ 
     432#define AR2315_PCI_TXEOL        0x00000008      /* Desc In End-of-List */ 
     433#define AR2315_PCI_RXINT        0x00000010      /* Desc Out Completed */ 
     434#define AR2315_PCI_RXOK         0x00000020      /* Desc Out OK */ 
     435#define AR2315_PCI_RXERR        0x00000040      /* Desc Out ERR */ 
     436#define AR2315_PCI_RXEOL        0x00000080      /* Desc Out EOL */ 
     437#define AR2315_PCI_TXOOD        0x00000200      /* Desc In Out-of-Desc */ 
     438#define AR2315_PCI_MASK         0x0000FFFF      /* Desc Mask */ 
     439#define AR2315_PCI_EXT_INT      0x02000000 
     440#define AR2315_PCI_ABORT_INT    0x04000000 
     441 
     442#define AR2315_PCI_INT_MASK     (AR2315_PCI + 0x0504)   /* same as INT_STATUS */ 
     443 
     444#define AR2315_PCI_INTEN_REG    (AR2315_PCI + 0x0508) 
     445#define AR2315_PCI_INT_DISABLE  0x00            /* disable pci interrupts */ 
     446#define AR2315_PCI_INT_ENABLE   0x01            /* enable pci interrupts */ 
     447 
     448#define AR2315_PCI_HOST_IN_EN   (AR2315_PCI + 0x0800) 
     449#define AR2315_PCI_HOST_IN_DIS  (AR2315_PCI + 0x0804) 
     450#define AR2315_PCI_HOST_IN_PTR  (AR2315_PCI + 0x0810) 
     451#define AR2315_PCI_HOST_OUT_EN  (AR2315_PCI + 0x0900) 
     452#define AR2315_PCI_HOST_OUT_DIS (AR2315_PCI + 0x0904) 
     453#define AR2315_PCI_HOST_OUT_PTR (AR2315_PCI + 0x0908) 
     454 
     455 
     456/* 
     457 * Local Bus Interface Registers 
     458 */ 
     459#define AR2315_LB_CONFIG        (AR2315_LOCAL + 0x0000) 
     460#define AR2315_LBCONF_OE        0x00000001      /* =1 OE is low-true */ 
     461#define AR2315_LBCONF_CS0       0x00000002      /* =1 first CS is low-true */ 
     462#define AR2315_LBCONF_CS1       0x00000004      /* =1 2nd CS is low-true */ 
     463#define AR2315_LBCONF_RDY       0x00000008      /* =1 RDY is low-true */ 
     464#define AR2315_LBCONF_WE        0x00000010      /* =1 Write En is low-true */ 
     465#define AR2315_LBCONF_WAIT      0x00000020      /* =1 WAIT is low-true */ 
     466#define AR2315_LBCONF_ADS       0x00000040      /* =1 Adr Strobe is low-true */ 
     467#define AR2315_LBCONF_MOT       0x00000080      /* =0 Intel, =1 Motorola */ 
     468#define AR2315_LBCONF_8CS       0x00000100      /* =1 8 bits CS, 0= 16bits */ 
     469#define AR2315_LBCONF_8DS       0x00000200      /* =1 8 bits Data S, 0=16bits */ 
     470#define AR2315_LBCONF_ADS_EN    0x00000400      /* =1 Enable ADS */ 
     471#define AR2315_LBCONF_ADR_OE    0x00000800      /* =1 Adr cap on OE, WE or DS */ 
     472#define AR2315_LBCONF_ADDT_MUX  0x00001000      /* =1 Adr and Data share bus */ 
     473#define AR2315_LBCONF_DATA_OE   0x00002000      /* =1 Data cap on OE, WE, DS */ 
     474#define AR2315_LBCONF_16DATA    0x00004000      /* =1 Data is 16 bits wide */ 
     475#define AR2315_LBCONF_SWAPDT    0x00008000      /* =1 Byte swap data */ 
     476#define AR2315_LBCONF_SYNC      0x00010000      /* =1 Bus synchronous to clk */ 
     477#define AR2315_LBCONF_INT       0x00020000      /* =1 Intr is low true */ 
     478#define AR2315_LBCONF_INT_CTR0  0x00000000      /* GND high-Z, Vdd is high-Z */ 
     479#define AR2315_LBCONF_INT_CTR1  0x00040000      /* GND drive, Vdd is high-Z */ 
     480#define AR2315_LBCONF_INT_CTR2  0x00080000      /* GND high-Z, Vdd drive */ 
     481#define AR2315_LBCONF_INT_CTR3  0x000C0000      /* GND drive, Vdd drive */ 
     482#define AR2315_LBCONF_RDY_WAIT  0x00100000      /* =1 RDY is negative of WAIT */ 
     483#define AR2315_LBCONF_INT_PULSE 0x00200000      /* =1 Interrupt is a pulse */ 
     484#define AR2315_LBCONF_ENABLE    0x00400000      /* =1 Falcon respond to LB */ 
     485 
     486#define AR2315_LB_CLKSEL        (AR2315_LOCAL + 0x0004) 
     487#define AR2315_LBCLK_EXT        0x0001          /* use external clk for lb */ 
     488 
     489#define AR2315_LB_1MS           (AR2315_LOCAL + 0x0008) 
     490#define AR2315_LB1MS_MASK       0x3FFFF         /* # of AHB clk cycles in 1ms */ 
     491 
     492#define AR2315_LB_MISCCFG       (AR2315_LOCAL + 0x000C) 
     493#define AR2315_LBM_TXD_EN       0x00000001      /* Enable TXD for fragments */ 
     494#define AR2315_LBM_RX_INTEN     0x00000002      /* Enable LB ints on RX ready */ 
     495#define AR2315_LBM_MBOXWR_INTEN 0x00000004      /* Enable LB ints on mbox wr */ 
     496#define AR2315_LBM_MBOXRD_INTEN 0x00000008      /* Enable LB ints on mbox rd */ 
     497#define AR2315_LMB_DESCSWAP_EN  0x00000010      /* Byte swap desc enable */ 
     498#define AR2315_LBM_TIMEOUT_MASK 0x00FFFF80 
     499#define AR2315_LBM_TIMEOUT_SHFT 7 
     500#define AR2315_LBM_PORTMUX      0x07000000 
     501 
     502 
     503#define AR2315_LB_RXTSOFF       (AR2315_LOCAL + 0x0010) 
     504 
     505#define AR2315_LB_TX_CHAIN_EN   (AR2315_LOCAL + 0x0100) 
     506#define AR2315_LB_TXEN_0        0x01 
     507#define AR2315_LB_TXEN_1        0x02 
     508#define AR2315_LB_TXEN_2        0x04 
     509#define AR2315_LB_TXEN_3        0x08 
     510 
     511#define AR2315_LB_TX_CHAIN_DIS  (AR2315_LOCAL + 0x0104) 
     512#define AR2315_LB_TX_DESC_PTR   (AR2315_LOCAL + 0x0200) 
     513 
     514#define AR2315_LB_RX_CHAIN_EN   (AR2315_LOCAL + 0x0400) 
     515#define AR2315_LB_RXEN          0x01 
     516 
     517#define AR2315_LB_RX_CHAIN_DIS  (AR2315_LOCAL + 0x0404) 
     518#define AR2315_LB_RX_DESC_PTR   (AR2315_LOCAL + 0x0408) 
     519 
     520#define AR2315_LB_INT_STATUS    (AR2315_LOCAL + 0x0500) 
     521#define AR2315_INT_TX_DESC      0x0001 
     522#define AR2315_INT_TX_OK        0x0002 
     523#define AR2315_INT_TX_ERR       0x0004 
     524#define AR2315_INT_TX_EOF       0x0008 
     525#define AR2315_INT_RX_DESC      0x0010 
     526#define AR2315_INT_RX_OK        0x0020 
     527#define AR2315_INT_RX_ERR       0x0040 
     528#define AR2315_INT_RX_EOF       0x0080 
     529#define AR2315_INT_TX_TRUNC     0x0100 
     530#define AR2315_INT_TX_STARVE    0x0200 
     531#define AR2315_INT_LB_TIMEOUT   0x0400 
     532#define AR2315_INT_LB_ERR       0x0800 
     533#define AR2315_INT_MBOX_WR      0x1000 
     534#define AR2315_INT_MBOX_RD      0x2000 
     535 
     536/* Bit definitions for INT MASK are the same as INT_STATUS */ 
     537#define AR2315_LB_INT_MASK      (AR2315_LOCAL + 0x0504) 
     538 
     539#define AR2315_LB_INT_EN        (AR2315_LOCAL + 0x0508) 
     540#define AR2315_LB_MBOX          (AR2315_LOCAL + 0x0600) 
     541 
     542/* 
     543 * IR Interface Registers 
     544 */ 
     545#define AR2315_IR_PKTDATA                   (AR2315_IR + 0x0000) 
     546 
     547#define AR2315_IR_PKTLEN                    (AR2315_IR + 0x07fc) /* 0 - 63 */ 
     548 
     549#define AR2315_IR_CONTROL                   (AR2315_IR + 0x0800) 
     550#define AR2315_IRCTL_TX                     0x00000000  /* use as tranmitter */ 
     551#define AR2315_IRCTL_RX                     0x00000001  /* use as receiver   */ 
     552#define AR2315_IRCTL_SAMPLECLK_MASK         0x00003ffe  /* Sample clk divisor mask */ 
     553#define AR2315_IRCTL_SAMPLECLK_SHFT                  1 
     554#define AR2315_IRCTL_OUTPUTCLK_MASK         0x03ffc000  /* Output clk divisor mask */ 
     555#define AR2315_IRCTL_OUTPUTCLK_SHFT                 14 
     556 
     557#define AR2315_IR_STATUS                    (AR2315_IR + 0x0804) 
     558#define AR2315_IRSTS_RX                     0x00000001  /* receive in progress */ 
     559#define AR2315_IRSTS_TX                     0x00000002  /* transmit in progress */ 
     560 
     561#define AR2315_IR_CONFIG                    (AR2315_IR + 0x0808) 
     562#define AR2315_IRCFG_INVIN                  0x00000001  /* invert input polarity */ 
     563#define AR2315_IRCFG_INVOUT                 0x00000002  /* invert output polarity */ 
     564#define AR2315_IRCFG_SEQ_START_WIN_SEL      0x00000004  /* 1 => 28, 0 => 7 */ 
     565#define AR2315_IRCFG_SEQ_START_THRESH       0x000000f0  /*  */ 
     566#define AR2315_IRCFG_SEQ_END_UNIT_SEL       0x00000100  /*  */ 
     567#define AR2315_IRCFG_SEQ_END_UNIT_THRESH    0x00007e00  /*  */ 
     568#define AR2315_IRCFG_SEQ_END_WIN_SEL        0x00008000  /*  */ 
     569#define AR2315_IRCFG_SEQ_END_WIN_THRESH     0x001f0000  /*  */ 
     570#define AR2315_IRCFG_NUM_BACKOFF_WORDS      0x01e00000  /*  */ 
     571 
     572#define HOST_PCI_DEV_ID         3 
     573#define HOST_PCI_MBAR0          0x10000000 
     574#define HOST_PCI_MBAR1          0x20000000 
     575#define HOST_PCI_MBAR2          0x30000000 
     576 
     577#define HOST_PCI_SDRAM_BASEADDR HOST_PCI_MBAR1 
     578#define PCI_DEVICE_MEM_SPACE    0x800000 
     579 
     580#endif /* __AR2315_REG_H */ 
  • new file arch/mips/include/asm/mach-ar231x/ar5312_regs.h

    - +  
     1/* 
     2 * This file is subject to the terms and conditions of the GNU General Public 
     3 * License.  See the file "COPYING" in the main directory of this archive 
     4 * for more details. 
     5 * 
     6 * Copyright (C) 2003 Atheros Communications, Inc.,  All Rights Reserved. 
     7 * Copyright (C) 2006 Imre Kaloz <kaloz@openwrt.org> 
     8 * Copyright (C) 2006 Felix Fietkau <nbd@openwrt.org> 
     9 */ 
     10 
     11#ifndef AR5312_H 
     12#define AR5312_H 
     13 
     14#include <asm/addrspace.h> 
     15 
     16/* 
     17 * IRQs 
     18 */ 
     19 
     20#define AR5312_IRQ_WLAN0_INTRS  MIPS_CPU_IRQ_BASE+2 /* C0_CAUSE: 0x0400 */ 
     21#define AR5312_IRQ_ENET0_INTRS  MIPS_CPU_IRQ_BASE+3 /* C0_CAUSE: 0x0800 */ 
     22#define AR5312_IRQ_ENET1_INTRS  MIPS_CPU_IRQ_BASE+4 /* C0_CAUSE: 0x1000 */ 
     23#define AR5312_IRQ_WLAN1_INTRS  MIPS_CPU_IRQ_BASE+5 /* C0_CAUSE: 0x2000 */ 
     24#define AR5312_IRQ_MISC_INTRS   MIPS_CPU_IRQ_BASE+6 /* C0_CAUSE: 0x4000 */ 
     25 
     26 
     27/* Address Map */ 
     28#define AR531X_WLAN0            0x18000000 
     29#define AR531X_WLAN1            0x18500000 
     30#define AR531X_ENET0            0x18100000 
     31#define AR531X_ENET1            0x18200000 
     32#define AR531X_SDRAMCTL         0x18300000 
     33#define AR531X_FLASHCTL         0x18400000 
     34#define AR531X_APBBASE          0x1c000000 
     35#define AR531X_FLASH            0x1e000000 
     36#define AR531X_UART0            0xbc000003      /* UART MMR */ 
     37 
     38/* 
     39 * AR531X_NUM_ENET_MAC defines the number of ethernet MACs that 
     40 * should be considered available.  The AR5312 supports 2 enet MACS, 
     41 * even though many reference boards only actually use 1 of them 
     42 * (i.e. Only MAC 0 is actually connected to an enet PHY or PHY switch. 
     43 * The AR2312 supports 1 enet MAC. 
     44 */ 
     45#define AR531X_NUM_ENET_MAC             2 
     46 
     47/* 
     48 * Need these defines to determine true number of ethernet MACs 
     49 */ 
     50#define AR5212_AR5312_REV2      0x0052          /* AR5312 WMAC (AP31) */ 
     51#define AR5212_AR5312_REV7      0x0057          /* AR5312 WMAC (AP30-040) */ 
     52#define AR5212_AR2313_REV8      0x0058          /* AR2313 WMAC (AP43-030) */ 
     53#define AR531X_RADIO_MASK_OFF  0xc8 
     54#define AR531X_RADIO0_MASK     0x0003 
     55#define AR531X_RADIO1_MASK     0x000c 
     56#define AR531X_RADIO1_S        2 
     57 
     58/* 
     59 * AR531X_NUM_WMAC defines the number of Wireless MACs that\ 
     60 * should be considered available. 
     61 */ 
     62#define AR531X_NUM_WMAC                 2 
     63 
     64/* Reset/Timer Block Address Map */ 
     65#define AR531X_RESETTMR         (AR531X_APBBASE  + 0x3000) 
     66#define AR531X_TIMER            (AR531X_RESETTMR + 0x0000) /* countdown timer */ 
     67#define AR531X_WD_CTRL          (AR531X_RESETTMR + 0x0008) /* watchdog cntrl */ 
     68#define AR531X_WD_TIMER         (AR531X_RESETTMR + 0x000c) /* watchdog timer */ 
     69#define AR531X_ISR              (AR531X_RESETTMR + 0x0010) /* Intr Status Reg */ 
     70#define AR531X_IMR              (AR531X_RESETTMR + 0x0014) /* Intr Mask Reg */ 
     71#define AR531X_RESET            (AR531X_RESETTMR + 0x0020) 
     72#define AR5312_CLOCKCTL1        (AR531X_RESETTMR + 0x0064) 
     73#define AR5312_SCRATCH          (AR531X_RESETTMR + 0x006c) 
     74#define AR531X_PROCADDR         (AR531X_RESETTMR + 0x0070) 
     75#define AR531X_PROC1            (AR531X_RESETTMR + 0x0074) 
     76#define AR531X_DMAADDR          (AR531X_RESETTMR + 0x0078) 
     77#define AR531X_DMA1             (AR531X_RESETTMR + 0x007c) 
     78#define AR531X_ENABLE           (AR531X_RESETTMR + 0x0080) /* interface enb */ 
     79#define AR531X_REV              (AR531X_RESETTMR + 0x0090) /* revision */ 
     80 
     81/* AR531X_WD_CTRL register bit field definitions */ 
     82#define AR531X_WD_CTRL_IGNORE_EXPIRATION 0x0000 
     83#define AR531X_WD_CTRL_NMI               0x0001 
     84#define AR531X_WD_CTRL_RESET             0x0002 
     85 
     86/* AR531X_ISR register bit field definitions */ 
     87#define AR531X_ISR_NONE         0x0000 
     88#define AR531X_ISR_TIMER        0x0001 
     89#define AR531X_ISR_AHBPROC      0x0002 
     90#define AR531X_ISR_AHBDMA       0x0004 
     91#define AR531X_ISR_GPIO         0x0008 
     92#define AR531X_ISR_UART0        0x0010 
     93#define AR531X_ISR_UART0DMA     0x0020 
     94#define AR531X_ISR_WD           0x0040 
     95#define AR531X_ISR_LOCAL        0x0080 
     96 
     97/* AR531X_RESET register bit field definitions */ 
     98#define AR531X_RESET_SYSTEM     0x00000001  /* cold reset full system */ 
     99#define AR531X_RESET_PROC       0x00000002  /* cold reset MIPS core */ 
     100#define AR531X_RESET_WLAN0      0x00000004  /* cold reset WLAN MAC and BB */ 
     101#define AR531X_RESET_EPHY0      0x00000008  /* cold reset ENET0 phy */ 
     102#define AR531X_RESET_EPHY1      0x00000010  /* cold reset ENET1 phy */ 
     103#define AR531X_RESET_ENET0      0x00000020  /* cold reset ENET0 mac */ 
     104#define AR531X_RESET_ENET1      0x00000040  /* cold reset ENET1 mac */ 
     105#define AR531X_RESET_UART0      0x00000100  /* cold reset UART0 (high speed) */ 
     106#define AR531X_RESET_WLAN1      0x00000200  /* cold reset WLAN MAC/BB */ 
     107#define AR531X_RESET_APB        0x00000400  /* cold reset APB (ar5312) */ 
     108#define AR531X_RESET_WARM_PROC  0x00001000  /* warm reset MIPS core */ 
     109#define AR531X_RESET_WARM_WLAN0_MAC 0x00002000  /* warm reset WLAN0 MAC */ 
     110#define AR531X_RESET_WARM_WLAN0_BB  0x00004000  /* warm reset WLAN0 BaseBand */ 
     111#define AR531X_RESET_NMI        0x00010000  /* send an NMI to the processor */ 
     112#define AR531X_RESET_WARM_WLAN1_MAC 0x00020000  /* warm reset WLAN1 mac */ 
     113#define AR531X_RESET_WARM_WLAN1_BB  0x00040000  /* warm reset WLAN1 baseband */ 
     114#define AR531X_RESET_LOCAL_BUS  0x00080000  /* reset local bus */ 
     115#define AR531X_RESET_WDOG       0x00100000  /* last reset was a watchdog */ 
     116 
     117#define AR531X_RESET_WMAC0_BITS \ 
     118        AR531X_RESET_WLAN0 |\ 
     119        AR531X_RESET_WARM_WLAN0_MAC |\ 
     120        AR531X_RESET_WARM_WLAN0_BB 
     121 
     122#define AR531X_RESERT_WMAC1_BITS \ 
     123        AR531X_RESET_WLAN1 |\ 
     124        AR531X_RESET_WARM_WLAN1_MAC |\ 
     125        AR531X_RESET_WARM_WLAN1_BB 
     126 
     127/* AR5312_CLOCKCTL1 register bit field definitions */ 
     128#define AR5312_CLOCKCTL1_PREDIVIDE_MASK    0x00000030 
     129#define AR5312_CLOCKCTL1_PREDIVIDE_SHIFT            4 
     130#define AR5312_CLOCKCTL1_MULTIPLIER_MASK   0x00001f00 
     131#define AR5312_CLOCKCTL1_MULTIPLIER_SHIFT           8 
     132#define AR5312_CLOCKCTL1_DOUBLER_MASK      0x00010000 
     133 
     134/* Valid for AR5312 and AR2312 */ 
     135#define AR5312_CLOCKCTL1_PREDIVIDE_MASK    0x00000030 
     136#define AR5312_CLOCKCTL1_PREDIVIDE_SHIFT            4 
     137#define AR5312_CLOCKCTL1_MULTIPLIER_MASK   0x00001f00 
     138#define AR5312_CLOCKCTL1_MULTIPLIER_SHIFT           8 
     139#define AR5312_CLOCKCTL1_DOUBLER_MASK      0x00010000 
     140 
     141/* Valid for AR2313 */ 
     142#define AR2313_CLOCKCTL1_PREDIVIDE_MASK    0x00003000 
     143#define AR2313_CLOCKCTL1_PREDIVIDE_SHIFT           12 
     144#define AR2313_CLOCKCTL1_MULTIPLIER_MASK   0x001f0000 
     145#define AR2313_CLOCKCTL1_MULTIPLIER_SHIFT          16 
     146#define AR2313_CLOCKCTL1_DOUBLER_MASK      0x00000000 
     147 
     148 
     149/* AR531X_ENABLE register bit field definitions */ 
     150#define AR531X_ENABLE_WLAN0              0x0001 
     151#define AR531X_ENABLE_ENET0              0x0002 
     152#define AR531X_ENABLE_ENET1              0x0004 
     153#define AR531X_ENABLE_UART_AND_WLAN1_PIO 0x0008   /* UART, and WLAN1 PIOs */ 
     154#define AR531X_ENABLE_WLAN1_DMA          0x0010   /* WLAN1 DMAs */ 
     155#define AR531X_ENABLE_WLAN1 \ 
     156            (AR531X_ENABLE_UART_AND_WLAN1_PIO | AR531X_ENABLE_WLAN1_DMA) 
     157 
     158/* AR531X_REV register bit field definitions */ 
     159#define AR531X_REV_WMAC_MAJ    0xf000 
     160#define AR531X_REV_WMAC_MAJ_S  12 
     161#define AR531X_REV_WMAC_MIN    0x0f00 
     162#define AR531X_REV_WMAC_MIN_S  8 
     163#define AR531X_REV_MAJ         0x00f0 
     164#define AR531X_REV_MAJ_S       4 
     165#define AR531X_REV_MIN         0x000f 
     166#define AR531X_REV_MIN_S       0 
     167#define AR531X_REV_CHIP        (AR531X_REV_MAJ|AR531X_REV_MIN) 
     168 
     169/* Major revision numbers, bits 7..4 of Revision ID register */ 
     170#define AR531X_REV_MAJ_AR5312          0x4 
     171#define AR531X_REV_MAJ_AR2313          0x5 
     172 
     173/* Minor revision numbers, bits 3..0 of Revision ID register */ 
     174#define AR5312_REV_MIN_DUAL     0x0     /* Dual WLAN version */ 
     175#define AR5312_REV_MIN_SINGLE   0x1     /* Single WLAN version */ 
     176 
     177/* AR531X_FLASHCTL register bit field definitions */ 
     178#define FLASHCTL_IDCY   0x0000000f      /* Idle cycle turn around time */ 
     179#define FLASHCTL_IDCY_S 0 
     180#define FLASHCTL_WST1   0x000003e0      /* Wait state 1 */ 
     181#define FLASHCTL_WST1_S 5 
     182#define FLASHCTL_RBLE   0x00000400      /* Read byte lane enable */ 
     183#define FLASHCTL_WST2   0x0000f800      /* Wait state 2 */ 
     184#define FLASHCTL_WST2_S 11 
     185#define FLASHCTL_AC     0x00070000      /* Flash address check (added) */ 
     186#define FLASHCTL_AC_S   16 
     187#define FLASHCTL_AC_128K 0x00000000 
     188#define FLASHCTL_AC_256K 0x00010000 
     189#define FLASHCTL_AC_512K 0x00020000 
     190#define FLASHCTL_AC_1M   0x00030000 
     191#define FLASHCTL_AC_2M   0x00040000 
     192#define FLASHCTL_AC_4M   0x00050000 
     193#define FLASHCTL_AC_8M   0x00060000 
     194#define FLASHCTL_AC_RES  0x00070000     /* 16MB is not supported */ 
     195#define FLASHCTL_E      0x00080000      /* Flash bank enable (added) */ 
     196#define FLASHCTL_BUSERR 0x01000000      /* Bus transfer error status flag */ 
     197#define FLASHCTL_WPERR  0x02000000      /* Write protect error status flag */ 
     198#define FLASHCTL_WP     0x04000000      /* Write protect */ 
     199#define FLASHCTL_BM     0x08000000      /* Burst mode */ 
     200#define FLASHCTL_MW     0x30000000      /* Memory width */ 
     201#define FLASHCTL_MWx8   0x00000000      /* Memory width x8 */ 
     202#define FLASHCTL_MWx16  0x10000000      /* Memory width x16 */ 
     203#define FLASHCTL_MWx32  0x20000000      /* Memory width x32 (not supported) */ 
     204#define FLASHCTL_ATNR   0x00000000      /* Access type == no retry */ 
     205#define FLASHCTL_ATR    0x80000000      /* Access type == retry every */ 
     206#define FLASHCTL_ATR4   0xc0000000      /* Access type == retry every 4 */ 
     207 
     208/* ARM Flash Controller -- 3 flash banks with either x8 or x16 devices.  */ 
     209#define AR531X_FLASHCTL0        (AR531X_FLASHCTL + 0x00) 
     210#define AR531X_FLASHCTL1        (AR531X_FLASHCTL + 0x04) 
     211#define AR531X_FLASHCTL2        (AR531X_FLASHCTL + 0x08) 
     212 
     213/* ARM SDRAM Controller -- just enough to determine memory size */ 
     214#define AR531X_MEM_CFG1 (AR531X_SDRAMCTL + 0x04) 
     215#define MEM_CFG1_AC0    0x00000700      /* bank 0: SDRAM addr check (added) */ 
     216#define MEM_CFG1_AC0_S  8 
     217#define MEM_CFG1_AC1    0x00007000      /* bank 1: SDRAM addr check (added) */ 
     218#define MEM_CFG1_AC1_S  12 
     219 
     220/* GPIO Address Map */ 
     221#define AR531X_GPIO         (AR531X_APBBASE  + 0x2000) 
     222#define AR531X_GPIO_DO      (AR531X_GPIO + 0x00)        /* output register */ 
     223#define AR531X_GPIO_DI      (AR531X_GPIO + 0x04)        /* intput register */ 
     224#define AR531X_GPIO_CR      (AR531X_GPIO + 0x08)        /* control register */ 
     225 
     226/* GPIO Control Register bit field definitions */ 
     227#define AR531X_GPIO_CR_M(x)    (1 << (x))                      /* mask for i/o */ 
     228#define AR531X_GPIO_CR_O(x)    (0 << (x))                      /* mask for output */ 
     229#define AR531X_GPIO_CR_I(x)    (1 << (x))                      /* mask for input */ 
     230#define AR531X_GPIO_CR_INT(x)  (1 << ((x)+8))                  /* mask for interrupt */ 
     231#define AR531X_GPIO_CR_UART(x) (1 << ((x)+16))                 /* uart multiplex */ 
     232#define AR531X_NUM_GPIO         8 
     233 
     234 
     235#endif 
     236 
  • new file arch/mips/ar231x/ar5312.c

    - +  
     1/* 
     2 * This file is subject to the terms and conditions of the GNU General Public 
     3 * License.  See the file "COPYING" in the main directory of this archive 
     4 * for more details. 
     5 * 
     6 * Copyright (C) 2003 Atheros Communications, Inc.,  All Rights Reserved. 
     7 * Copyright (C) 2006 FON Technology, SL. 
     8 * Copyright (C) 2006 Imre Kaloz <kaloz@openwrt.org> 
     9 * Copyright (C) 2006-2009 Felix Fietkau <nbd@openwrt.org> 
     10 */ 
     11 
     12/* 
     13 * Platform devices for Atheros SoCs 
     14 */ 
     15 
     16#include <linux/autoconf.h> 
     17#include <linux/init.h> 
     18#include <linux/module.h> 
     19#include <linux/types.h> 
     20#include <linux/string.h> 
     21#include <linux/mtd/physmap.h> 
     22#include <linux/platform_device.h> 
     23#include <linux/kernel.h> 
     24#include <linux/reboot.h> 
     25#include <linux/leds.h> 
     26#include <asm/bootinfo.h> 
     27#include <asm/reboot.h> 
     28#include <asm/time.h> 
     29#include <asm/irq.h> 
     30#include <asm/io.h> 
     31#include <gpio.h> 
     32 
     33#include <ar231x_platform.h> 
     34#include <ar5312_regs.h> 
     35#include <ar231x.h> 
     36#include "devices.h" 
     37#include "ar5312.h" 
     38 
     39static void 
     40ar5312_misc_irq_dispatch(void) 
     41{ 
     42        unsigned int ar231x_misc_intrs = ar231x_read_reg(AR531X_ISR) & ar231x_read_reg(AR531X_IMR); 
     43 
     44        if (ar231x_misc_intrs & AR531X_ISR_TIMER) { 
     45                do_IRQ(AR531X_MISC_IRQ_TIMER); 
     46                (void)ar231x_read_reg(AR531X_TIMER); 
     47        } else if (ar231x_misc_intrs & AR531X_ISR_AHBPROC) 
     48                do_IRQ(AR531X_MISC_IRQ_AHB_PROC); 
     49        else if ((ar231x_misc_intrs & AR531X_ISR_UART0)) 
     50                do_IRQ(AR531X_MISC_IRQ_UART0); 
     51        else if (ar231x_misc_intrs & AR531X_ISR_WD) 
     52                do_IRQ(AR531X_MISC_IRQ_WATCHDOG); 
     53        else 
     54                do_IRQ(AR531X_MISC_IRQ_NONE); 
     55} 
     56 
     57static asmlinkage void 
     58ar5312_irq_dispatch(void) 
     59{ 
     60        int pending = read_c0_status() & read_c0_cause(); 
     61 
     62        if (pending & CAUSEF_IP2) 
     63                do_IRQ(AR5312_IRQ_WLAN0_INTRS); 
     64        else if (pending & CAUSEF_IP3) 
     65                do_IRQ(AR5312_IRQ_ENET0_INTRS); 
     66        else if (pending & CAUSEF_IP4) 
     67                do_IRQ(AR5312_IRQ_ENET1_INTRS); 
     68        else if (pending & CAUSEF_IP5) 
     69                do_IRQ(AR5312_IRQ_WLAN1_INTRS); 
     70        else if (pending & CAUSEF_IP6) 
     71                ar5312_misc_irq_dispatch(); 
     72        else if (pending & CAUSEF_IP7) 
     73                do_IRQ(AR531X_IRQ_CPU_CLOCK); 
     74} 
     75 
     76 
     77/* Enable the specified AR531X_MISC_IRQ interrupt */ 
     78static void 
     79ar5312_misc_intr_enable(unsigned int irq) 
     80{ 
     81        unsigned int imr; 
     82 
     83        imr = ar231x_read_reg(AR531X_IMR); 
     84        imr |= (1 << (irq - AR531X_MISC_IRQ_BASE - 1)); 
     85        ar231x_write_reg(AR531X_IMR, imr); 
     86} 
     87 
     88/* Disable the specified AR531X_MISC_IRQ interrupt */ 
     89static void 
     90ar5312_misc_intr_disable(unsigned int irq) 
     91{ 
     92        unsigned int imr; 
     93 
     94        imr = ar231x_read_reg(AR531X_IMR); 
     95        imr &= ~(1 << (irq - AR531X_MISC_IRQ_BASE - 1)); 
     96        ar231x_write_reg(AR531X_IMR, imr); 
     97        ar231x_read_reg(AR531X_IMR); /* flush write buffer */ 
     98} 
     99 
     100static void 
     101ar5312_misc_intr_end(unsigned int irq) 
     102{ 
     103        if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) 
     104                ar5312_misc_intr_enable(irq); 
     105} 
     106 
     107static struct irq_chip ar5312_misc_intr_controller = { 
     108        .name     = "AR5312-MISC", 
     109        .disable  = ar5312_misc_intr_disable, 
     110        .ack      = ar5312_misc_intr_disable, 
     111        .mask_ack = ar5312_misc_intr_disable, 
     112        .mask     = ar5312_misc_intr_disable, 
     113        .unmask   = ar5312_misc_intr_enable, 
     114        .end      = ar5312_misc_intr_end, 
     115}; 
     116 
     117 
     118static irqreturn_t ar5312_ahb_proc_handler(int cpl, void *dev_id) 
     119{ 
     120        u32 proc1 = ar231x_read_reg(AR531X_PROC1); 
     121        u32 procAddr = ar231x_read_reg(AR531X_PROCADDR); /* clears error state */ 
     122        u32 dma1 = ar231x_read_reg(AR531X_DMA1); 
     123        u32 dmaAddr = ar231x_read_reg(AR531X_DMAADDR);   /* clears error state */ 
     124 
     125        printk("AHB interrupt: PROCADDR=0x%8.8x  PROC1=0x%8.8x  DMAADDR=0x%8.8x  DMA1=0x%8.8x\n", 
     126                        procAddr, proc1, dmaAddr, dma1); 
     127 
     128        machine_restart("AHB error"); /* Catastrophic failure */ 
     129        return IRQ_HANDLED; 
     130} 
     131 
     132 
     133static struct irqaction ar5312_ahb_proc_interrupt  = { 
     134        .handler = ar5312_ahb_proc_handler, 
     135        .flags   = IRQF_DISABLED, 
     136        .name    = "ar5312_ahb_proc_interrupt", 
     137}; 
     138 
     139 
     140static struct irqaction cascade  = { 
     141        .handler = no_action, 
     142        .flags   = IRQF_DISABLED, 
     143        .name    = "cascade", 
     144}; 
     145 
     146void __init ar5312_irq_init(void) 
     147{ 
     148        int i; 
     149 
     150        if (!is_5312()) 
     151                return; 
     152 
     153        ar231x_irq_dispatch = ar5312_irq_dispatch; 
     154        for (i = 0; i < AR531X_MISC_IRQ_COUNT; i++) { 
     155                int irq = AR531X_MISC_IRQ_BASE + i; 
     156                set_irq_chip_and_handler(irq, &ar5312_misc_intr_controller, 
     157                        handle_level_irq); 
     158        } 
     159        setup_irq(AR531X_MISC_IRQ_AHB_PROC, &ar5312_ahb_proc_interrupt); 
     160        setup_irq(AR5312_IRQ_MISC_INTRS, &cascade); 
     161} 
     162 
     163const struct ar231x_gpiodev ar5312_gpiodev; 
     164 
     165static u32 
     166ar5312_gpio_get_output(void) 
     167{ 
     168        u32 reg; 
     169        reg = ~(ar231x_read_reg(AR531X_GPIO_CR)); 
     170        reg &= ar5312_gpiodev.valid_mask; 
     171        return reg; 
     172} 
     173 
     174static u32 
     175ar5312_gpio_set_output(u32 mask, u32 val) 
     176{ 
     177        u32 reg; 
     178 
     179        reg = ar231x_read_reg(AR531X_GPIO_CR); 
     180        reg |= mask; 
     181        reg &= ~val; 
     182        ar231x_write_reg(AR531X_GPIO_CR, reg); 
     183        return reg; 
     184} 
     185 
     186static u32 
     187ar5312_gpio_get(void) 
     188{ 
     189        u32 reg; 
     190        reg = ar231x_read_reg(AR531X_GPIO_DI); 
     191        reg &= ar5312_gpiodev.valid_mask; 
     192        return reg; 
     193} 
     194 
     195static u32 
     196ar5312_gpio_set(u32 mask, u32 value) 
     197{ 
     198        u32 reg; 
     199        reg = ar231x_read_reg(AR531X_GPIO_DO); 
     200        reg &= ~mask; 
     201        reg |= value; 
     202        ar231x_write_reg(AR531X_GPIO_DO, reg); 
     203        return reg; 
     204} 
     205 
     206const struct ar231x_gpiodev ar5312_gpiodev = { 
     207        .valid_mask = (1 << 8) - 1, 
     208        .get_output = ar5312_gpio_get_output, 
     209        .set_output = ar5312_gpio_set_output, 
     210        .get = ar5312_gpio_get, 
     211        .set = ar5312_gpio_set, 
     212}; 
     213 
     214static struct physmap_flash_data ar5312_flash_data = { 
     215        .width = 2, 
     216}; 
     217 
     218static struct resource ar5312_flash_resource = { 
     219        .start = AR531X_FLASH, 
     220        .end = AR531X_FLASH + 0x800000 - 1, 
     221        .flags = IORESOURCE_MEM, 
     222}; 
     223 
     224static struct ar231x_eth ar5312_eth0_data = { 
     225        .reset_base = AR531X_RESET, 
     226        .reset_mac = AR531X_RESET_ENET0, 
     227        .reset_phy = AR531X_RESET_EPHY0, 
     228        .phy_base = KSEG1ADDR(AR531X_ENET0), 
     229        .config = &ar231x_board, 
     230}; 
     231 
     232static struct ar231x_eth ar5312_eth1_data = { 
     233        .reset_base = AR531X_RESET, 
     234        .reset_mac = AR531X_RESET_ENET1, 
     235        .reset_phy = AR531X_RESET_EPHY1, 
     236        .phy_base = KSEG1ADDR(AR531X_ENET1), 
     237        .config = &ar231x_board, 
     238}; 
     239 
     240static struct platform_device ar5312_physmap_flash = { 
     241        .name = "physmap-flash", 
     242        .id = 0, 
     243        .dev.platform_data = &ar5312_flash_data, 
     244        .resource = &ar5312_flash_resource, 
     245        .num_resources = 1, 
     246}; 
     247 
     248#ifdef CONFIG_LEDS_GPIO 
     249static struct gpio_led ar5312_leds[] = { 
     250        { .name = "wlan", .gpio = 0, .active_low = 1, }, 
     251}; 
     252 
     253static const struct gpio_led_platform_data ar5312_led_data = { 
     254        .num_leds = ARRAY_SIZE(ar5312_leds), 
     255        .leds = (void *) ar5312_leds, 
     256}; 
     257 
     258static struct platform_device ar5312_gpio_leds = { 
     259        .name = "leds-gpio", 
     260        .id = -1, 
     261        .dev.platform_data = (void *) &ar5312_led_data, 
     262}; 
     263#endif 
     264 
     265/* 
     266 * NB: This mapping size is larger than the actual flash size, 
     267 * but this shouldn't be a problem here, because the flash 
     268 * will simply be mapped multiple times. 
     269 */ 
     270static char __init *ar5312_flash_limit(void) 
     271{ 
     272        u32 ctl; 
     273        /* 
     274         * Configure flash bank 0. 
     275         * Assume 8M window size. Flash will be aliased if it's smaller 
     276         */ 
     277        ctl = FLASHCTL_E | 
     278                FLASHCTL_AC_8M | 
     279                FLASHCTL_RBLE | 
     280                (0x01 << FLASHCTL_IDCY_S) | 
     281                (0x07 << FLASHCTL_WST1_S) | 
     282                (0x07 << FLASHCTL_WST2_S) | 
     283                (ar231x_read_reg(AR531X_FLASHCTL0) & FLASHCTL_MW); 
     284 
     285        ar231x_write_reg(AR531X_FLASHCTL0, ctl); 
     286 
     287        /* Disable other flash banks */ 
     288        ar231x_write_reg(AR531X_FLASHCTL1, 
     289                ar231x_read_reg(AR531X_FLASHCTL1) & ~(FLASHCTL_E | FLASHCTL_AC)); 
     290 
     291        ar231x_write_reg(AR531X_FLASHCTL2, 
     292                ar231x_read_reg(AR531X_FLASHCTL2) & ~(FLASHCTL_E | FLASHCTL_AC)); 
     293 
     294        return (char *) KSEG1ADDR(AR531X_FLASH + 0x800000); 
     295} 
     296 
     297int __init ar5312_init_devices(void) 
     298{ 
     299        struct ar231x_boarddata *config; 
     300        u32 fctl = 0; 
     301        const u8 *radio; 
     302        u8 *c; 
     303 
     304        if (!is_5312()) 
     305                return 0; 
     306 
     307        /* Locate board/radio config data */ 
     308        ar231x_find_config(ar5312_flash_limit()); 
     309        config = ar231x_board.config; 
     310 
     311 
     312        /* 
     313         * Chip IDs and hardware detection for some Atheros 
     314         * models are really broken! 
     315         * 
     316         * Atheros uses a disabled WMAC0 and Silicon ID of AR5312 
     317         * as indication for AR2312, which is otherwise 
     318         * indistinguishable from the real AR5312. 
     319         */ 
     320        if (ar231x_board.radio) { 
     321                radio = ar231x_board.radio + AR531X_RADIO_MASK_OFF; 
     322                if ((*((const u32 *) radio) & AR531X_RADIO0_MASK) == 0) 
     323                        config->flags |= BD_ISCASPER; 
     324        } else 
     325                radio = NULL; 
     326 
     327        /* AR2313 has CPU minor rev. 10 */ 
     328        if ((current_cpu_data.processor_id & 0xff) == 0x0a) 
     329                ar231x_devtype = DEV_TYPE_AR2313; 
     330 
     331        /* AR2312 shares the same Silicon ID as AR5312 */ 
     332        else if (config->flags & BD_ISCASPER) 
     333                ar231x_devtype = DEV_TYPE_AR2312; 
     334 
     335        /* Everything else is probably AR5312 or compatible */ 
     336        else 
     337                ar231x_devtype = DEV_TYPE_AR5312; 
     338 
     339        /* fixup flash width */ 
     340        fctl = ar231x_read_reg(AR531X_FLASHCTL) & FLASHCTL_MW; 
     341        switch (fctl) { 
     342        case FLASHCTL_MWx16: 
     343                ar5312_flash_data.width = 2; 
     344                break; 
     345        case FLASHCTL_MWx8: 
     346        default: 
     347                ar5312_flash_data.width = 1; 
     348                break; 
     349        } 
     350 
     351        platform_device_register(&ar5312_physmap_flash); 
     352 
     353#ifdef CONFIG_LEDS_GPIO 
     354        ar5312_leds[0].gpio = config->sysLedGpio; 
     355        platform_device_register(&ar5312_gpio_leds); 
     356#endif 
     357 
     358        /* Fix up MAC addresses if necessary */ 
     359        if (!memcmp(config->enet0_mac, "\xff\xff\xff\xff\xff\xff", 6)) 
     360                memcpy(config->enet0_mac, config->enet1_mac, 6); 
     361 
     362        /* If ENET0 and ENET1 have the same mac address, 
     363         * increment the one from ENET1 */ 
     364        if (memcmp(config->enet0_mac, config->enet1_mac, 6) == 0) { 
     365                c = config->enet1_mac + 5; 
     366                while ((c >= config->enet1_mac) && !(++(*c))) 
     367                        c--; 
     368        } 
     369 
     370        switch(ar231x_devtype) { 
     371        case DEV_TYPE_AR5312: 
     372                ar5312_eth0_data.macaddr = config->enet0_mac; 
     373                ar231x_add_ethernet(0, KSEG1ADDR(AR531X_ENET0), 
     374                        AR5312_IRQ_ENET0_INTRS, &ar5312_eth0_data); 
     375 
     376                ar5312_eth1_data.macaddr = config->enet1_mac; 
     377                ar231x_add_ethernet(1, KSEG1ADDR(AR531X_ENET1), 
     378                        AR5312_IRQ_ENET1_INTRS, &ar5312_eth1_data); 
     379 
     380                if (!ar231x_board.radio) 
     381                        return 0; 
     382 
     383                if ((*((u32 *) radio) & AR531X_RADIO0_MASK) && 
     384                    (config->flags & BD_WLAN0)) 
     385                        ar231x_add_wmac(0, AR531X_WLAN0, 
     386                                AR5312_IRQ_WLAN0_INTRS); 
     387 
     388                break; 
     389        /* 
     390         * AR2312/3 ethernet uses the PHY of ENET0, but the MAC 
     391         * of ENET1. Atheros calls it 'twisted' for a reason :) 
     392         */ 
     393        case DEV_TYPE_AR2312: 
     394        case DEV_TYPE_AR2313: 
     395                ar5312_eth1_data.phy_base = ar5312_eth0_data.phy_base; 
     396                ar5312_eth1_data.reset_phy = ar5312_eth0_data.reset_phy; 
     397                ar5312_eth1_data.macaddr = config->enet0_mac; 
     398                ar231x_add_ethernet(0, KSEG1ADDR(AR531X_ENET1), 
     399                        AR5312_IRQ_ENET1_INTRS, &ar5312_eth1_data); 
     400 
     401                if (!ar231x_board.radio) 
     402                        return 0; 
     403                break; 
     404        default: 
     405                break; 
     406        } 
     407 
     408        if ((*((u32 *) radio) & AR531X_RADIO1_MASK) && 
     409            (config->flags & BD_WLAN1)) 
     410                ar231x_add_wmac(1, AR531X_WLAN1, 
     411                        AR5312_IRQ_WLAN1_INTRS); 
     412 
     413        return 0; 
     414} 
     415 
     416 
     417static void ar5312_restart(char *command) 
     418{ 
     419        /* reset the system */ 
     420        local_irq_disable(); 
     421        while(1) { 
     422                ar231x_write_reg(AR531X_RESET, AR531X_RESET_SYSTEM); 
     423        } 
     424} 
     425 
     426 
     427/* 
     428 * This table is indexed by bits 5..4 of the CLOCKCTL1 register 
     429 * to determine the predevisor value. 
     430 */ 
     431static int __initdata CLOCKCTL1_PREDIVIDE_TABLE[4] = { 1, 2, 4, 5 }; 
     432 
     433 
     434static int __init 
     435ar5312_cpu_frequency(void) 
     436{ 
     437        unsigned int result; 
     438        unsigned int predivide_mask, predivide_shift; 
     439        unsigned int multiplier_mask, multiplier_shift; 
     440        unsigned int clockCtl1, preDivideSelect, preDivisor, multiplier; 
     441        unsigned int doubler_mask; 
     442        u16 devid; 
     443 
     444        /* Trust the bootrom's idea of cpu frequency. */ 
     445        if ((result = ar231x_read_reg(AR5312_SCRATCH))) 
     446                return result; 
     447 
     448        devid = ar231x_read_reg(AR531X_REV); 
     449        devid &= AR531X_REV_MAJ; 
     450        devid >>= AR531X_REV_MAJ_S; 
     451        if (devid == AR531X_REV_MAJ_AR2313) { 
     452                predivide_mask = AR2313_CLOCKCTL1_PREDIVIDE_MASK; 
     453                predivide_shift = AR2313_CLOCKCTL1_PREDIVIDE_SHIFT; 
     454                multiplier_mask = AR2313_CLOCKCTL1_MULTIPLIER_MASK; 
     455                multiplier_shift = AR2313_CLOCKCTL1_MULTIPLIER_SHIFT; 
     456                doubler_mask = AR2313_CLOCKCTL1_DOUBLER_MASK; 
     457        } else { /* AR5312 and AR2312 */ 
     458                predivide_mask = AR5312_CLOCKCTL1_PREDIVIDE_MASK; 
     459                predivide_shift = AR5312_CLOCKCTL1_PREDIVIDE_SHIFT; 
     460                multiplier_mask = AR5312_CLOCKCTL1_MULTIPLIER_MASK; 
     461                multiplier_shift = AR5312_CLOCKCTL1_MULTIPLIER_SHIFT; 
     462                doubler_mask = AR5312_CLOCKCTL1_DOUBLER_MASK; 
     463        } 
     464 
     465        /* 
     466         * Clocking is derived from a fixed 40MHz input clock. 
     467         * 
     468         *  cpuFreq = InputClock * MULT (where MULT is PLL multiplier) 
     469         *  sysFreq = cpuFreq / 4          (used for APB clock, serial, 
     470         *                                                         flash, Timer, Watchdog Timer) 
     471         * 
     472         *  cntFreq = cpuFreq / 2          (use for CPU count/compare) 
     473         * 
     474         * So, for example, with a PLL multiplier of 5, we have 
     475         * 
     476         *  cpuFreq = 200MHz 
     477         *  sysFreq = 50MHz 
     478         *  cntFreq = 100MHz 
     479         * 
     480         * We compute the CPU frequency, based on PLL settings. 
     481         */ 
     482 
     483        clockCtl1 = ar231x_read_reg(AR5312_CLOCKCTL1); 
     484        preDivideSelect = (clockCtl1 & predivide_mask) >> predivide_shift; 
     485        preDivisor = CLOCKCTL1_PREDIVIDE_TABLE[preDivideSelect]; 
     486        multiplier = (clockCtl1 & multiplier_mask) >> multiplier_shift; 
     487 
     488        if (clockCtl1 & doubler_mask) { 
     489                multiplier = multiplier << 1; 
     490        } 
     491        return (40000000 / preDivisor) * multiplier; 
     492} 
     493 
     494static inline int 
     495ar5312_sys_frequency(void) 
     496{ 
     497        return ar5312_cpu_frequency() / 4; 
     498} 
     499 
     500void __init 
     501ar5312_time_init(void) 
     502{ 
     503        if (!is_5312()) 
     504                return; 
     505 
     506        mips_hpt_frequency = ar5312_cpu_frequency() / 2; 
     507} 
     508 
     509 
     510void __init 
     511ar5312_prom_init(void) 
     512{ 
     513        u32 memsize, memcfg, bank0AC, bank1AC; 
     514        u32 devid; 
     515 
     516        if (!is_5312()) 
     517                return; 
     518 
     519        /* Detect memory size */ 
     520        memcfg = ar231x_read_reg(AR531X_MEM_CFG1); 
     521        bank0AC = (memcfg & MEM_CFG1_AC0) >> MEM_CFG1_AC0_S; 
     522        bank1AC = (memcfg & MEM_CFG1_AC1) >> MEM_CFG1_AC1_S; 
     523        memsize = (bank0AC ? (1 << (bank0AC+1)) : 0) 
     524                + (bank1AC ? (1 << (bank1AC+1)) : 0); 
     525        memsize <<= 20; 
     526        add_memory_region(0, memsize, BOOT_MEM_RAM); 
     527 
     528        devid = ar231x_read_reg(AR531X_REV); 
     529        devid >>= AR531X_REV_WMAC_MIN_S; 
     530        devid &= AR531X_REV_CHIP; 
     531        ar231x_board.devid = (u16) devid; 
     532        ar231x_gpiodev = &ar5312_gpiodev; 
     533} 
     534 
     535void __init 
     536ar5312_plat_setup(void) 
     537{ 
     538        if (!is_5312()) 
     539                return; 
     540 
     541        /* Clear any lingering AHB errors */ 
     542        ar231x_read_reg(AR531X_PROCADDR); 
     543        ar231x_read_reg(AR531X_DMAADDR); 
     544        ar231x_write_reg(AR531X_WD_CTRL, AR531X_WD_CTRL_IGNORE_EXPIRATION); 
     545 
     546        _machine_restart = ar5312_restart; 
     547        ar231x_serial_setup(KSEG1ADDR(AR531X_UART0), ar5312_sys_frequency()); 
     548} 
     549 
  • new file arch/mips/ar231x/ar2315.c

    - +  
     1/* 
     2 * This file is subject to the terms and conditions of the GNU General Public 
     3 * License.  See the file "COPYING" in the main directory of this archive 
     4 * for more details. 
     5 * 
     6 * Copyright (C) 2003 Atheros Communications, Inc.,  All Rights Reserved. 
     7 * Copyright (C) 2006 FON Technology, SL. 
     8 * Copyright (C) 2006 Imre Kaloz <kaloz@openwrt.org> 
     9 * Copyright (C) 2006 Felix Fietkau <nbd@openwrt.org> 
     10 */ 
     11 
     12/* 
     13 * Platform devices for Atheros SoCs 
     14 */ 
     15 
     16#include <linux/autoconf.h> 
     17#include <linux/init.h> 
     18#include <linux/module.h> 
     19#include <linux/types.h> 
     20#include <linux/string.h> 
     21#include <linux/platform_device.h> 
     22#include <linux/kernel.h> 
     23#include <linux/reboot.h> 
     24#include <linux/delay.h> 
     25#include <linux/leds.h> 
     26#include <asm/bootinfo.h> 
     27#include <asm/reboot.h> 
     28#include <asm/time.h> 
     29#include <asm/irq.h> 
     30#include <asm/io.h> 
     31#include <asm/gpio.h> 
     32 
     33#include <ar231x_platform.h> 
     34#include <ar2315_regs.h> 
     35#include <ar231x.h> 
     36#include "devices.h" 
     37#include "ar2315.h" 
     38 
     39static u32 gpiointmask = 0, gpiointval = 0; 
     40 
     41static inline void ar2315_gpio_irq(void) 
     42{ 
     43        u32 pend; 
     44        int bit = -1; 
     45 
     46        /* only do one gpio interrupt at a time */ 
     47        pend = (ar231x_read_reg(AR2315_GPIO_DI) ^ gpiointval) & gpiointmask; 
     48 
     49        if (pend) { 
     50                bit = fls(pend) - 1; 
     51                pend &= ~(1 << bit); 
     52                gpiointval ^= (1 << bit); 
     53        } 
     54 
     55        if (!pend) 
     56                ar231x_write_reg(AR2315_ISR, AR2315_ISR_GPIO); 
     57 
     58        /* Enable interrupt with edge detection */ 
     59        if ((ar231x_read_reg(AR2315_GPIO_CR) & AR2315_GPIO_CR_M(bit)) != AR2315_GPIO_CR_I(bit)) 
     60                return; 
     61 
     62        if (bit >= 0) 
     63                do_IRQ(AR531X_GPIO_IRQ_BASE + bit); 
     64} 
     65 
     66 
     67/* 
     68 * Called when an interrupt is received, this function 
     69 * determines exactly which interrupt it was, and it 
     70 * invokes the appropriate handler. 
     71 * 
     72 * Implicitly, we also define interrupt priority by 
     73 * choosing which to dispatch first. 
     74 */ 
     75static asmlinkage void 
     76ar2315_irq_dispatch(void) 
     77{ 
     78        int pending = read_c0_status() & read_c0_cause(); 
     79 
     80        if (pending & CAUSEF_IP3) 
     81                do_IRQ(AR2315_IRQ_WLAN0_INTRS); 
     82        else if (pending & CAUSEF_IP4) 
     83                do_IRQ(AR2315_IRQ_ENET0_INTRS); 
     84        else if (pending & CAUSEF_IP2) { 
     85                unsigned int misc_intr = ar231x_read_reg(AR2315_ISR) & ar231x_read_reg(AR2315_IMR); 
     86 
     87                if (misc_intr & AR2315_ISR_SPI) 
     88                        do_IRQ(AR531X_MISC_IRQ_SPI); 
     89                else if (misc_intr & AR2315_ISR_TIMER) 
     90                        do_IRQ(AR531X_MISC_IRQ_TIMER); 
     91                else if (misc_intr & AR2315_ISR_AHB) 
     92                        do_IRQ(AR531X_MISC_IRQ_AHB_PROC); 
     93                else if (misc_intr & AR2315_ISR_GPIO) 
     94                        ar2315_gpio_irq(); 
     95                else if (misc_intr & AR2315_ISR_UART0) 
     96                        do_IRQ(AR531X_MISC_IRQ_UART0); 
     97                else if (misc_intr & AR2315_ISR_WD) 
     98                        do_IRQ(AR531X_MISC_IRQ_WATCHDOG); 
     99                else 
     100                        do_IRQ(AR531X_MISC_IRQ_NONE); 
     101        } else if (pending & CAUSEF_IP7) 
     102                do_IRQ(AR531X_IRQ_CPU_CLOCK); 
     103} 
     104 
     105static void ar2315_set_gpiointmask(int gpio, int level) 
     106{ 
     107        u32 reg; 
     108 
     109        reg = ar231x_read_reg(AR2315_GPIO_INT); 
     110        reg &= ~(AR2315_GPIO_INT_M | AR2315_GPIO_INT_LVL_M); 
     111        reg |= gpio | AR2315_GPIO_INT_LVL(level); 
     112        ar231x_write_reg(AR2315_GPIO_INT, reg); 
     113} 
     114 
     115static void ar2315_gpio_intr_enable(unsigned int irq) 
     116{ 
     117        unsigned int gpio = irq - AR531X_GPIO_IRQ_BASE; 
     118 
     119        /* Enable interrupt with edge detection */ 
     120        if ((ar231x_read_reg(AR2315_GPIO_CR) & AR2315_GPIO_CR_M(gpio)) != AR2315_GPIO_CR_I(gpio)) 
     121                return; 
     122 
     123        gpiointmask |= (1 << gpio); 
     124        ar2315_set_gpiointmask(gpio, 3); 
     125} 
     126 
     127static unsigned int ar2315_gpio_intr_startup(unsigned int irq) 
     128{ 
     129        unsigned int gpio = irq - AR531X_GPIO_IRQ_BASE; 
     130 
     131        /* reconfigure GPIO line as input */ 
     132        ar231x_mask_reg(AR2315_GPIO_CR, AR2315_GPIO_CR_M(gpio), AR2315_GPIO_CR_I(gpio)); 
     133        ar2315_gpio_intr_enable(irq); 
     134        return 0; 
     135} 
     136 
     137static void ar2315_gpio_intr_disable(unsigned int irq) 
     138{ 
     139        unsigned int gpio = irq - AR531X_GPIO_IRQ_BASE; 
     140 
     141        /* Disable interrupt */ 
     142        gpiointmask &= ~(1 << gpio); 
     143        ar2315_set_gpiointmask(gpio, 0); 
     144} 
     145 
     146static void 
     147ar2315_gpio_intr_end(unsigned int irq) 
     148{ 
     149        if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) 
     150                ar2315_gpio_intr_enable(irq); 
     151} 
     152 
     153static struct irq_chip ar2315_gpio_intr_controller = { 
     154        .typename       = "AR2315-GPIO", 
     155        .startup  = ar2315_gpio_intr_startup, 
     156        .ack      = ar2315_gpio_intr_disable, 
     157        .mask_ack = ar2315_gpio_intr_disable, 
     158        .mask     = ar2315_gpio_intr_disable, 
     159        .unmask   = ar2315_gpio_intr_enable, 
     160        .end      = ar2315_gpio_intr_end, 
     161}; 
     162 
     163static void 
     164ar2315_misc_intr_enable(unsigned int irq) 
     165{ 
     166        unsigned int imr; 
     167 
     168        imr = ar231x_read_reg(AR2315_IMR); 
     169        switch(irq) { 
     170        case AR531X_MISC_IRQ_SPI: 
     171                 imr |= AR2315_ISR_SPI; 
     172                 break; 
     173        case AR531X_MISC_IRQ_TIMER: 
     174             imr |= AR2315_ISR_TIMER; 
     175             break; 
     176        case AR531X_MISC_IRQ_AHB_PROC: 
     177             imr |= AR2315_ISR_AHB; 
     178             break; 
     179        case AR531X_MISC_IRQ_GPIO: 
     180             imr |= AR2315_ISR_GPIO; 
     181             break; 
     182        case AR531X_MISC_IRQ_UART0: 
     183             imr |= AR2315_ISR_UART0; 
     184             break; 
     185        case AR531X_MISC_IRQ_WATCHDOG: 
     186             imr |= AR2315_ISR_WD; 
     187             break; 
     188        default: 
     189                break; 
     190        } 
     191        ar231x_write_reg(AR2315_IMR, imr); 
     192} 
     193 
     194static void 
     195ar2315_misc_intr_disable(unsigned int irq) 
     196{ 
     197        unsigned int imr; 
     198 
     199        imr = ar231x_read_reg(AR2315_IMR); 
     200        switch(irq) { 
     201        case AR531X_MISC_IRQ_SPI: 
     202                 imr &= ~AR2315_ISR_SPI; 
     203                 break; 
     204        case AR531X_MISC_IRQ_TIMER: 
     205             imr &= ~AR2315_ISR_TIMER; 
     206             break; 
     207        case AR531X_MISC_IRQ_AHB_PROC: 
     208             imr &= ~AR2315_ISR_AHB; 
     209             break; 
     210        case AR531X_MISC_IRQ_GPIO: 
     211             imr &= ~AR2315_ISR_GPIO; 
     212             break; 
     213        case AR531X_MISC_IRQ_UART0: 
     214             imr &= ~AR2315_ISR_UART0; 
     215             break; 
     216        case AR531X_MISC_IRQ_WATCHDOG: 
     217             imr &= ~AR2315_ISR_WD; 
     218             break; 
     219        default: 
     220                break; 
     221        } 
     222        ar231x_write_reg(AR2315_IMR, imr); 
     223} 
     224 
     225static void 
     226ar2315_misc_intr_end(unsigned int irq) 
     227{ 
     228        if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) 
     229                ar2315_misc_intr_enable(irq); 
     230} 
     231 
     232 
     233static struct irq_chip ar2315_misc_intr_controller = { 
     234        .typename       = "AR2315-MISC", 
     235        .ack      = ar2315_misc_intr_disable, 
     236        .mask_ack = ar2315_misc_intr_disable, 
     237        .mask     = ar2315_misc_intr_disable, 
     238        .unmask   = ar2315_misc_intr_enable, 
     239        .end      = ar2315_misc_intr_end, 
     240}; 
     241 
     242static irqreturn_t ar2315_ahb_proc_handler(int cpl, void *dev_id) 
     243{ 
     244    ar231x_write_reg(AR2315_AHB_ERR0, AHB_ERROR_DET); 
     245    ar231x_read_reg(AR2315_AHB_ERR1); 
     246 
     247    printk(KERN_ERR "AHB fatal error\n"); 
     248    machine_restart("AHB error"); /* Catastrophic failure */ 
     249 
     250    return IRQ_HANDLED; 
     251} 
     252 
     253static struct irqaction ar2315_ahb_proc_interrupt  = { 
     254        .handler        = ar2315_ahb_proc_handler, 
     255        .flags          = IRQF_DISABLED, 
     256        .name           = "ar2315_ahb_proc_interrupt", 
     257}; 
     258 
     259static struct irqaction cascade  = { 
     260        .handler        = no_action, 
     261        .flags          = IRQF_DISABLED, 
     262        .name           = "cascade", 
     263}; 
     264 
     265void 
     266ar2315_irq_init(void) 
     267{ 
     268        int i; 
     269 
     270        if (!is_2315()) 
     271                return; 
     272 
     273        ar231x_irq_dispatch = ar2315_irq_dispatch; 
     274        gpiointval = ar231x_read_reg(AR2315_GPIO_DI); 
     275        for (i = 0; i < AR531X_MISC_IRQ_COUNT; i++) { 
     276                int irq = AR531X_MISC_IRQ_BASE + i; 
     277                set_irq_chip_and_handler(irq, &ar2315_misc_intr_controller, 
     278                        handle_level_irq); 
     279        } 
     280        for (i = 0; i < AR531X_GPIO_IRQ_COUNT; i++) { 
     281                int irq = AR531X_GPIO_IRQ_BASE + i; 
     282                set_irq_chip_and_handler(irq, &ar2315_gpio_intr_controller, 
     283                        handle_level_irq); 
     284        } 
     285        setup_irq(AR531X_MISC_IRQ_GPIO, &cascade); 
     286        setup_irq(AR531X_MISC_IRQ_AHB_PROC, &ar2315_ahb_proc_interrupt); 
     287        setup_irq(AR2315_IRQ_MISC_INTRS, &cascade); 
     288} 
     289 
     290const struct ar231x_gpiodev ar2315_gpiodev; 
     291 
     292static u32 
     293ar2315_gpio_get_output(void) 
     294{ 
     295        u32 reg; 
     296        reg = ar231x_read_reg(AR2315_GPIO_CR); 
     297        reg &= ar2315_gpiodev.valid_mask; 
     298        return reg; 
     299} 
     300 
     301static u32 
     302ar2315_gpio_set_output(u32 mask, u32 val) 
     303{ 
     304        u32 reg; 
     305 
     306        reg = ar231x_read_reg(AR2315_GPIO_CR); 
     307        reg &= ~mask; 
     308        reg |= val; 
     309        ar231x_write_reg(AR2315_GPIO_CR, reg); 
     310        return reg; 
     311} 
     312 
     313static u32 
     314ar2315_gpio_get(void) 
     315{ 
     316        u32 reg; 
     317        reg = ar231x_read_reg(AR2315_GPIO_DI); 
     318        reg &= ar2315_gpiodev.valid_mask; 
     319        return reg; 
     320} 
     321 
     322static u32 
     323ar2315_gpio_set(u32 mask, u32 value) 
     324{ 
     325        u32 reg; 
     326        reg = ar231x_read_reg(AR2315_GPIO_DO); 
     327        reg &= ~mask; 
     328        reg |= value; 
     329        ar231x_write_reg(AR2315_GPIO_DO, reg); 
     330        return reg; 
     331} 
     332 
     333const struct ar231x_gpiodev ar2315_gpiodev = { 
     334        .valid_mask = (1 << 22) - 1, 
     335        .get_output = ar2315_gpio_get_output, 
     336        .set_output = ar2315_gpio_set_output, 
     337        .get = ar2315_gpio_get, 
     338        .set = ar2315_gpio_set, 
     339}; 
     340 
     341static struct ar231x_eth ar2315_eth_data = { 
     342        .reset_base = AR2315_RESET, 
     343        .reset_mac = AR2315_RESET_ENET0, 
     344        .reset_phy = AR2315_RESET_EPHY0, 
     345        .phy_base = AR2315_ENET0, 
     346        .config = &ar231x_board, 
     347}; 
     348 
     349static struct resource ar2315_spiflash_res[] = { 
     350        { 
     351                .name = "flash_base", 
     352                .flags = IORESOURCE_MEM, 
     353                .start = KSEG1ADDR(AR2315_SPI_READ), 
     354                .end = KSEG1ADDR(AR2315_SPI_READ) + 0x1000000 - 1, 
     355        }, 
     356        { 
     357                .name = "flash_regs", 
     358                .flags = IORESOURCE_MEM, 
     359                .start = 0x11300000, 
     360                .end = 0x11300012, 
     361        }, 
     362}; 
     363 
     364static struct platform_device ar2315_spiflash = { 
     365        .id = 0, 
     366        .name = "spiflash", 
     367        .resource = ar2315_spiflash_res, 
     368        .num_resources = ARRAY_SIZE(ar2315_spiflash_res) 
     369}; 
     370 
     371static struct platform_device ar2315_wdt = { 
     372        .id = 0, 
     373        .name = "ar2315_wdt", 
     374}; 
     375 
     376#define SPI_FLASH_CTL      0x00 
     377#define SPI_FLASH_OPCODE   0x04 
     378#define SPI_FLASH_DATA     0x08 
     379 
     380static inline u32 
     381spiflash_read_reg(int reg) 
     382{ 
     383        return ar231x_read_reg(KSEG1ADDR(AR2315_SPI) + reg); 
     384} 
     385 
     386static inline void 
     387spiflash_write_reg(int reg, u32 data) 
     388{ 
     389        ar231x_write_reg(KSEG1ADDR(AR2315_SPI) + reg, data); 
     390} 
     391 
     392static u32 
     393spiflash_wait_status(void) 
     394{ 
     395        u32 reg; 
     396 
     397        do { 
     398                reg = spiflash_read_reg(SPI_FLASH_CTL); 
     399        } while (reg & SPI_CTL_BUSY); 
     400 
     401        return reg; 
     402} 
     403 
     404static u8 
     405spiflash_probe(void) 
     406{ 
     407        u32 reg; 
     408 
     409        reg = spiflash_wait_status(); 
     410        reg &= ~SPI_CTL_TX_RX_CNT_MASK; 
     411        reg |= (1 << 4) | 4 | SPI_CTL_START; 
     412 
     413        spiflash_write_reg(SPI_FLASH_OPCODE, 0xab); 
     414        spiflash_write_reg(SPI_FLASH_CTL, reg); 
     415 
     416        reg = spiflash_wait_status(); 
     417        reg = spiflash_read_reg(SPI_FLASH_DATA); 
     418        reg &= 0xff; 
     419 
     420        return (u8) reg; 
     421} 
     422 
     423 
     424#define STM_8MBIT_SIGNATURE     0x13 
     425#define STM_16MBIT_SIGNATURE    0x14 
     426#define STM_32MBIT_SIGNATURE    0x15 
     427#define STM_64MBIT_SIGNATURE    0x16 
     428#define STM_128MBIT_SIGNATURE   0x17 
     429 
     430static u8 __init * 
     431ar2315_flash_limit(void) 
     432{ 
     433        u32 flash_size = 0; 
     434 
     435        /* probe the flash chip size */ 
     436        switch(spiflash_probe()) { 
     437                case STM_8MBIT_SIGNATURE: 
     438                        flash_size = 0x00100000; 
     439                        break; 
     440                case STM_16MBIT_SIGNATURE: 
     441                        flash_size = 0x00200000; 
     442                        break; 
     443                case STM_32MBIT_SIGNATURE: 
     444                        flash_size = 0x00400000; 
     445                        break; 
     446                case STM_64MBIT_SIGNATURE: 
     447                        flash_size = 0x00800000; 
     448                        break; 
     449                case STM_128MBIT_SIGNATURE: 
     450                        flash_size = 0x01000000; 
     451                        break; 
     452        } 
     453 
     454        ar2315_spiflash_res[0].end = ar2315_spiflash_res[0].start + 
     455                flash_size - 1; 
     456        return (u8 *) ar2315_spiflash_res[0].end + 1; 
     457} 
     458 
     459#ifdef CONFIG_LEDS_GPIO 
     460static struct gpio_led ar2315_leds[6]; 
     461static struct gpio_led_platform_data ar2315_led_data = { 
     462        .leds = (void *) ar2315_leds, 
     463}; 
     464 
     465static struct platform_device ar2315_gpio_leds = { 
     466        .name = "leds-gpio", 
     467        .id = -1, 
     468        .dev = { 
     469                .platform_data = (void *) &ar2315_led_data, 
     470        } 
     471}; 
     472 
     473static void __init 
     474ar2315_init_gpio(void) 
     475{ 
     476        static char led_names[6][6]; 
     477        int i, led = 0; 
     478 
     479        ar2315_led_data.num_leds = 0; 
     480        for(i = 1; i < 8; i++) 
     481        { 
     482                if((i == AR2315_RESET_GPIO) || 
     483                   (i == ar231x_board.config->resetConfigGpio)) 
     484                        continue; 
     485 
     486                if(i == ar231x_board.config->sysLedGpio) 
     487                        strcpy(led_names[led], "wlan"); 
     488                else 
     489                        sprintf(led_names[led], "gpio%d", i); 
     490 
     491                ar2315_leds[led].name = led_names[led]; 
     492                ar2315_leds[led].gpio = i; 
     493                ar2315_leds[led].active_low = 0; 
     494                led++; 
     495        } 
     496        ar2315_led_data.num_leds = led; 
     497        platform_device_register(&ar2315_gpio_leds); 
     498} 
     499#else 
     500static inline void ar2315_init_gpio(void) 
     501{ 
     502} 
     503#endif 
     504 
     505int __init 
     506ar2315_init_devices(void) 
     507{ 
     508        if (!is_2315()) 
     509                return 0; 
     510 
     511        /* Find board configuration */ 
     512        ar231x_find_config(ar2315_flash_limit()); 
     513        ar2315_eth_data.macaddr = ar231x_board.config->enet0_mac; 
     514 
     515        ar2315_init_gpio(); 
     516        platform_device_register(&ar2315_wdt); 
     517        platform_device_register(&ar2315_spiflash); 
     518        ar231x_add_ethernet(0, AR2315_ENET0, AR2315_IRQ_ENET0_INTRS, 
     519                &ar2315_eth_data); 
     520        ar231x_add_wmac(0, AR2315_WLAN0, AR2315_IRQ_WLAN0_INTRS); 
     521 
     522        return 0; 
     523} 
     524 
     525static void 
     526ar2315_restart(char *command) 
     527{ 
     528        void (*mips_reset_vec)(void) = (void *) 0xbfc00000; 
     529 
     530        local_irq_disable(); 
     531 
     532        /* try reset the system via reset control */ 
     533        ar231x_write_reg(AR2315_COLD_RESET,AR2317_RESET_SYSTEM); 
     534 
     535        /* Cold reset does not work on the AR2315/6, use the GPIO reset bits a workaround. 
     536         * give it some time to attempt a gpio based hardware reset 
     537         * (atheros reference design workaround) */ 
     538        gpio_direction_output(AR2315_RESET_GPIO, 0); 
     539        mdelay(100); 
     540 
     541        /* Some boards (e.g. Senao EOC-2610) don't implement the reset logic 
     542         * workaround. Attempt to jump to the mips reset location - 
     543         * the boot loader itself might be able to recover the system */ 
     544        mips_reset_vec(); 
     545} 
     546 
     547 
     548/* 
     549 * This table is indexed by bits 5..4 of the CLOCKCTL1 register 
     550 * to determine the predevisor value. 
     551 */ 
     552static int __initdata CLOCKCTL1_PREDIVIDE_TABLE[4] = { 1, 2, 4, 5 }; 
     553static int __initdata PLLC_DIVIDE_TABLE[5] = { 2, 3, 4, 6, 3 }; 
     554 
     555static unsigned int __init 
     556ar2315_sys_clk(unsigned int clockCtl) 
     557{ 
     558    unsigned int pllcCtrl,cpuDiv; 
     559    unsigned int pllcOut,refdiv,fdiv,divby2; 
     560        unsigned int clkDiv; 
     561 
     562    pllcCtrl = ar231x_read_reg(AR2315_PLLC_CTL); 
     563    refdiv = (pllcCtrl & PLLC_REF_DIV_M) >> PLLC_REF_DIV_S; 
     564    refdiv = CLOCKCTL1_PREDIVIDE_TABLE[refdiv]; 
     565    fdiv = (pllcCtrl & PLLC_FDBACK_DIV_M) >> PLLC_FDBACK_DIV_S; 
     566    divby2 = (pllcCtrl & PLLC_ADD_FDBACK_DIV_M) >> PLLC_ADD_FDBACK_DIV_S; 
     567    divby2 += 1; 
     568    pllcOut = (40000000/refdiv)*(2*divby2)*fdiv; 
     569 
     570 
     571    /* clkm input selected */ 
     572        switch(clockCtl & CPUCLK_CLK_SEL_M) { 
     573                case 0: 
     574                case 1: 
     575                        clkDiv = PLLC_DIVIDE_TABLE[(pllcCtrl & PLLC_CLKM_DIV_M) >> PLLC_CLKM_DIV_S]; 
     576                        break; 
     577                case 2: 
     578                        clkDiv = PLLC_DIVIDE_TABLE[(pllcCtrl & PLLC_CLKC_DIV_M) >> PLLC_CLKC_DIV_S]; 
     579                        break; 
     580                default: 
     581                        pllcOut = 40000000; 
     582                        clkDiv = 1; 
     583                        break; 
     584        } 
     585        cpuDiv = (clockCtl & CPUCLK_CLK_DIV_M) >> CPUCLK_CLK_DIV_S; 
     586        cpuDiv = cpuDiv * 2 ?: 1; 
     587        return (pllcOut/(clkDiv * cpuDiv)); 
     588} 
     589 
     590static inline unsigned int 
     591ar2315_cpu_frequency(void) 
     592{ 
     593    return ar2315_sys_clk(ar231x_read_reg(AR2315_CPUCLK)); 
     594} 
     595 
     596static inline unsigned int 
     597ar2315_apb_frequency(void) 
     598{ 
     599    return ar2315_sys_clk(ar231x_read_reg(AR2315_AMBACLK)); 
     600} 
     601 
     602void __init 
     603ar2315_time_init(void) 
     604{ 
     605        if (!is_2315()) 
     606                return; 
     607 
     608        mips_hpt_frequency = ar2315_cpu_frequency() / 2; 
     609} 
     610 
     611void __init 
     612ar2315_prom_init(void) 
     613{ 
     614        u32 memsize, memcfg, devid; 
     615 
     616        if (!is_2315()) 
     617                return; 
     618 
     619        memcfg = ar231x_read_reg(AR2315_MEM_CFG); 
     620        memsize   = 1 + ((memcfg & SDRAM_DATA_WIDTH_M) >> SDRAM_DATA_WIDTH_S); 
     621        memsize <<= 1 + ((memcfg & SDRAM_COL_WIDTH_M) >> SDRAM_COL_WIDTH_S); 
     622        memsize <<= 1 + ((memcfg & SDRAM_ROW_WIDTH_M) >> SDRAM_ROW_WIDTH_S); 
     623        memsize <<= 3; 
     624        add_memory_region(0, memsize, BOOT_MEM_RAM); 
     625 
     626        /* Detect the hardware based on the device ID */ 
     627        devid = ar231x_read_reg(AR2315_SREV) & AR2315_REV_CHIP; 
     628        switch(devid) { 
     629                case 0x90: 
     630                case 0x91: 
     631                        ar231x_devtype = DEV_TYPE_AR2317; 
     632                        break; 
     633                default: 
     634                        ar231x_devtype = DEV_TYPE_AR2315; 
     635                        break; 
     636        } 
     637        ar231x_gpiodev = &ar2315_gpiodev; 
     638        ar231x_board.devid = devid; 
     639} 
     640 
     641void __init 
     642ar2315_plat_setup(void) 
     643{ 
     644        u32 config; 
     645 
     646        if (!is_2315()) 
     647                return; 
     648 
     649        /* Clear any lingering AHB errors */ 
     650        config = read_c0_config(); 
     651        write_c0_config(config & ~0x3); 
     652        ar231x_write_reg(AR2315_AHB_ERR0,AHB_ERROR_DET); 
     653        ar231x_read_reg(AR2315_AHB_ERR1); 
     654        ar231x_write_reg(AR2315_WDC, AR2315_WDC_IGNORE_EXPIRATION); 
     655 
     656        _machine_restart = ar2315_restart; 
     657        ar231x_serial_setup(KSEG1ADDR(AR2315_UART0), ar2315_apb_frequency()); 
     658} 
  • new file arch/mips/ar231x/ar2315.h

    - +  
     1#ifndef __AR2315_H 
     2#define __AR2315_H 
     3 
     4#ifdef CONFIG_ATHEROS_AR2315 
     5 
     6extern void ar2315_irq_init(void); 
     7extern int ar2315_init_devices(void); 
     8extern void ar2315_prom_init(void); 
     9extern void ar2315_plat_setup(void); 
     10extern void ar2315_time_init(void); 
     11 
     12#else 
     13 
     14static inline void ar2315_irq_init(void) 
     15{ 
     16} 
     17 
     18static inline int ar2315_init_devices(void) 
     19{ 
     20        return 0; 
     21} 
     22 
     23static inline void ar2315_prom_init(void) 
     24{ 
     25} 
     26 
     27static inline void ar2315_plat_setup(void) 
     28{ 
     29} 
     30 
     31static inline void ar2315_time_init(void) 
     32{ 
     33} 
     34 
     35#endif 
     36 
     37#endif 
  • new file arch/mips/ar231x/ar5312.h

    - +  
     1#ifndef __AR5312_H 
     2#define __AR5312_H 
     3 
     4#ifdef CONFIG_ATHEROS_AR5312 
     5 
     6extern void ar5312_irq_init(void); 
     7extern int ar5312_init_devices(void); 
     8extern void ar5312_prom_init(void); 
     9extern void ar5312_plat_setup(void); 
     10extern void ar5312_time_init(void); 
     11extern void ar5312_time_init(void); 
     12 
     13#else 
     14 
     15static inline void ar5312_irq_init(void) 
     16{ 
     17} 
     18 
     19static inline int ar5312_init_devices(void) 
     20{ 
     21        return 0; 
     22} 
     23 
     24static inline void ar5312_prom_init(void) 
     25{ 
     26} 
     27 
     28static inline void ar5312_plat_setup(void) 
     29{ 
     30} 
     31 
     32static inline void ar5312_time_init(void) 
     33{ 
     34} 
     35 
     36#endif 
     37 
     38#endif 
  • new file arch/mips/include/asm/mach-ar231x/ar231x.h

    - +  
     1#ifndef __AR531X_H 
     2#define __AR531X_H 
     3 
     4#define AR531X_MISC_IRQ_BASE            0x20 
     5#define AR531X_GPIO_IRQ_BASE            0x30 
     6 
     7/* Software's idea of interrupts handled by "CPU Interrupt Controller" */ 
     8#define AR531X_IRQ_NONE         MIPS_CPU_IRQ_BASE+0 
     9#define AR531X_IRQ_CPU_CLOCK    MIPS_CPU_IRQ_BASE+7 /* C0_CAUSE: 0x8000 */ 
     10 
     11/* Miscellaneous interrupts, which share IP6 */ 
     12#define AR531X_MISC_IRQ_NONE            AR531X_MISC_IRQ_BASE+0 
     13#define AR531X_MISC_IRQ_TIMER           AR531X_MISC_IRQ_BASE+1 
     14#define AR531X_MISC_IRQ_AHB_PROC        AR531X_MISC_IRQ_BASE+2 
     15#define AR531X_MISC_IRQ_AHB_DMA         AR531X_MISC_IRQ_BASE+3 
     16#define AR531X_MISC_IRQ_GPIO            AR531X_MISC_IRQ_BASE+4 
     17#define AR531X_MISC_IRQ_UART0           AR531X_MISC_IRQ_BASE+5 
     18#define AR531X_MISC_IRQ_UART0_DMA       AR531X_MISC_IRQ_BASE+6 
     19#define AR531X_MISC_IRQ_WATCHDOG        AR531X_MISC_IRQ_BASE+7 
     20#define AR531X_MISC_IRQ_LOCAL           AR531X_MISC_IRQ_BASE+8 
     21#define AR531X_MISC_IRQ_SPI             AR531X_MISC_IRQ_BASE+9 
     22#define AR531X_MISC_IRQ_COUNT           10 
     23 
     24/* GPIO Interrupts [0..7], share AR531X_MISC_IRQ_GPIO */ 
     25#define AR531X_GPIO_IRQ_NONE            AR531X_GPIO_IRQ_BASE+0 
     26#define AR531X_GPIO_IRQ(n)              AR531X_GPIO_IRQ_BASE+n 
     27#define AR531X_GPIO_IRQ_COUNT           22 
     28 
     29static inline u32 
     30ar231x_read_reg(u32 reg) 
     31{ 
     32        return __raw_readl((u32 *) KSEG1ADDR(reg)); 
     33} 
     34 
     35static inline void 
     36ar231x_write_reg(u32 reg, u32 val) 
     37{ 
     38        __raw_writel(val, (u32 *) KSEG1ADDR(reg)); 
     39} 
     40 
     41static inline u32 
     42ar231x_mask_reg(u32 reg, u32 mask, u32 val) 
     43{ 
     44        u32 ret; 
     45 
     46        ret = ar231x_read_reg(reg); 
     47        ret &= ~mask; 
     48        ret |= val; 
     49        ar231x_write_reg(reg, ret); 
     50 
     51        return ret; 
     52} 
     53 
     54#endif 
  • new file arch/mips/ar231x/devices.h

    - +  
     1#ifndef __AR231X_DEVICES_H 
     2#define __AR231X_DEVICES_H 
     3 
     4enum { 
     5        /* handled by ar5312.c */ 
     6        DEV_TYPE_AR2312, 
     7        DEV_TYPE_AR2313, 
     8        DEV_TYPE_AR5312, 
     9 
     10        /* handled by ar2315.c */ 
     11        DEV_TYPE_AR2315, 
     12        DEV_TYPE_AR2316, 
     13        DEV_TYPE_AR2317, 
     14 
     15        DEV_TYPE_UNKNOWN 
     16}; 
     17 
     18extern int ar231x_devtype; 
     19extern struct ar231x_board_config ar231x_board; 
     20extern asmlinkage void (*ar231x_irq_dispatch)(void); 
     21 
     22extern int ar231x_find_config(u8 *flash_limit); 
     23extern void ar231x_serial_setup(u32 mapbase, unsigned int uartclk); 
     24extern int ar231x_add_wmac(int nr, u32 base, int irq); 
     25extern int ar231x_add_ethernet(int nr, u32 base, int irq, void *pdata); 
     26 
     27static inline bool is_2315(void) 
     28{ 
     29        return (current_cpu_data.cputype == CPU_4KEC); 
     30} 
     31 
     32static inline bool is_5312(void) 
     33{ 
     34        return !is_2315(); 
     35} 
     36 
     37#endif 
  • new file arch/mips/ar231x/devices.c

    - +  
     1#include <linux/kernel.h> 
     2#include <linux/init.h> 
     3#include <linux/serial.h> 
     4#include <linux/serial_core.h> 
     5#include <linux/serial_8250.h> 
     6#include <linux/platform_device.h> 
     7#include <ar231x_platform.h> 
     8#include <ar231x.h> 
     9#include "devices.h" 
     10#include "ar5312.h" 
     11#include "ar2315.h" 
     12 
     13struct ar231x_board_config ar231x_board; 
     14int ar231x_devtype = DEV_TYPE_UNKNOWN; 
     15const struct ar231x_gpiodev *ar231x_gpiodev; 
     16EXPORT_SYMBOL(ar231x_gpiodev); 
     17 
     18static struct resource ar231x_eth0_res[] = { 
     19        { 
     20                .name = "eth0_membase", 
     21                .flags = IORESOURCE_MEM, 
     22        }, 
     23        { 
     24                .name = "eth0_irq", 
     25                .flags = IORESOURCE_IRQ, 
     26        } 
     27}; 
     28 
     29static struct resource ar231x_eth1_res[] = { 
     30        { 
     31                .name = "eth1_membase", 
     32                .flags = IORESOURCE_MEM, 
     33        }, 
     34        { 
     35                .name = "eth1_irq", 
     36                .flags = IORESOURCE_IRQ, 
     37        } 
     38}; 
     39 
     40static struct platform_device ar231x_eth[] = { 
     41        { 
     42                .id = 0, 
     43                .name = "ar231x-eth", 
     44                .resource = ar231x_eth0_res, 
     45                .num_resources = ARRAY_SIZE(ar231x_eth0_res) 
     46        }, 
     47        { 
     48                .id = 1, 
     49                .name = "ar231x-eth", 
     50                .resource = ar231x_eth1_res, 
     51                .num_resources = ARRAY_SIZE(ar231x_eth1_res) 
     52        } 
     53}; 
     54 
     55static struct resource ar231x_wmac0_res[] = { 
     56        { 
     57                .name = "wmac0_membase", 
     58                .flags = IORESOURCE_MEM, 
     59        }, 
     60        { 
     61                .name = "wmac0_irq", 
     62                .flags = IORESOURCE_IRQ, 
     63        } 
     64}; 
     65 
     66static struct resource ar231x_wmac1_res[] = { 
     67        { 
     68                .name = "wmac1_membase", 
     69                .flags = IORESOURCE_MEM, 
     70        }, 
     71        { 
     72                .name = "wmac1_irq", 
     73                .flags = IORESOURCE_IRQ, 
     74        } 
     75}; 
     76 
     77 
     78static struct platform_device ar231x_wmac[] = { 
     79        { 
     80                .id = 0, 
     81                .name = "ar231x-wmac", 
     82                .resource = ar231x_wmac0_res, 
     83                .num_resources = ARRAY_SIZE(ar231x_wmac0_res), 
     84                .dev.platform_data = &ar231x_board, 
     85        }, 
     86        { 
     87                .id = 1, 
     88                .name = "ar231x-wmac", 
     89                .resource = ar231x_wmac1_res, 
     90                .num_resources = ARRAY_SIZE(ar231x_wmac1_res), 
     91                .dev.platform_data = &ar231x_board, 
     92        }, 
     93}; 
     94 
     95static const char *devtype_strings[] = { 
     96        [DEV_TYPE_AR5312] = "Atheros AR5312", 
     97        [DEV_TYPE_AR2312] = "Atheros AR2312", 
     98        [DEV_TYPE_AR2313] = "Atheros AR2313", 
     99        [DEV_TYPE_AR2315] = "Atheros AR2315", 
     100        [DEV_TYPE_AR2316] = "Atheros AR2316", 
     101        [DEV_TYPE_AR2317] = "Atheros AR2317", 
     102        [DEV_TYPE_UNKNOWN] = "Atheros (unknown)", 
     103}; 
     104 
     105const char *get_system_type(void) 
     106{ 
     107        if ((ar231x_devtype >= ARRAY_SIZE(devtype_strings)) || 
     108                !devtype_strings[ar231x_devtype]) 
     109                return devtype_strings[DEV_TYPE_UNKNOWN]; 
     110        return devtype_strings[ar231x_devtype]; 
     111} 
     112 
     113 
     114int __init 
     115ar231x_add_ethernet(int nr, u32 base, int irq, void *pdata) 
     116{ 
     117        struct resource *res; 
     118 
     119        ar231x_eth[nr].dev.platform_data = pdata; 
     120        res = &ar231x_eth[nr].resource[0]; 
     121        res->start = base; 
     122        res->end = base + 0x2000 - 1; 
     123        res++; 
     124        res->start = irq; 
     125        res->end = irq; 
     126        return platform_device_register(&ar231x_eth[nr]); 
     127} 
     128 
     129void __init 
     130ar231x_serial_setup(u32 mapbase, unsigned int uartclk) 
     131{ 
     132        struct uart_port s; 
     133 
     134        memset(&s, 0, sizeof(s)); 
     135 
     136        s.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST; 
     137        s.iotype = UPIO_MEM; 
     138        s.irq = AR531X_MISC_IRQ_UART0; 
     139        s.regshift = 2; 
     140        s.mapbase = mapbase; 
     141        s.uartclk = uartclk; 
     142        s.membase = (void __iomem *)s.mapbase; 
     143 
     144        early_serial_setup(&s); 
     145} 
     146 
     147int __init 
     148ar231x_add_wmac(int nr, u32 base, int irq) 
     149{ 
     150        struct resource *res; 
     151 
     152        ar231x_wmac[nr].dev.platform_data = &ar231x_board; 
     153        res = &ar231x_wmac[nr].resource[0]; 
     154        res->start = base; 
     155        res->end = base + 0x10000 - 1; 
     156        res++; 
     157        res->start = irq; 
     158        res->end = irq; 
     159        return platform_device_register(&ar231x_wmac[nr]); 
     160} 
     161 
     162static int __init ar231x_register_devices(void) 
     163{ 
     164        static struct resource res = { 
     165                .start = 0xFFFFFFFF, 
     166        }; 
     167 
     168        platform_device_register_simple("GPIODEV", 0, &res, 1); 
     169        ar5312_init_devices(); 
     170        ar2315_init_devices(); 
     171 
     172        return 0; 
     173} 
     174 
     175device_initcall(ar231x_register_devices); 
Note: See TracBrowser for help on using the repository browser.