source: trunk/target/linux/atheros/patches-2.6.28/100-board.patch @ 14969

Last change on this file since 14969 was 14969, checked in by nbd, 8 years ago

atheros: split out the pci support patch

File size: 91.4 KB
  • arch/mips/Kconfig

    a b config BCM47XX 
    6060        help 
    6161         Support for BCM47XX based boards 
    6262 
     63config ATHEROS 
     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 WR_PPMC 
    597610 
    598611endchoice 
    599612 
     613source "arch/mips/ar231x/Kconfig" 
    600614source "arch/mips/alchemy/Kconfig" 
    601615source "arch/mips/basler/excite/Kconfig" 
    602616source "arch/mips/emma/Kconfig" 
  • arch/mips/Makefile

    a b libs-$(CONFIG_MIPS_XXS1500) += arch/mips 
    278278load-$(CONFIG_MIPS_XXS1500)     += 0xffffffff80100000 
    279279 
    280280# 
     281# Atheros AR5312/AR2312 WiSoC 
     282# 
     283core-$(CONFIG_ATHEROS)          += arch/mips/ar231x/ 
     284cflags-$(CONFIG_ATHEROS)        += -I$(srctree)/arch/mips/include/asm/mach-ar231x 
     285load-$(CONFIG_ATHEROS)          += 0xffffffff80041000 
     286 
     287# 
    281288# Cobalt Server 
    282289# 
    283290core-$(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 
     4        default y 
     5 
     6config ATHEROS_AR2315 
     7        bool "Atheros 2315+ support" 
     8        depends on ATHEROS 
     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                        random_ether_addr(config->enet0_mac); 
     170                        random_ether_addr(config->enet1_mac); 
     171                } 
     172        } 
     173 
     174 
     175        /* Radio config starts 0x100 bytes after board config, regardless 
     176         * of what the physical layout on the flash chip looks like */ 
     177 
     178        if (ar231x_board.radio) 
     179                rcfg = (u8 *) ar231x_board.radio; 
     180        else 
     181                rcfg = find_radio_config(flash_limit, bcfg); 
     182 
     183        if (!rcfg) 
     184                return -ENODEV; 
     185 
     186        radio_data = board_data + 0x100 + ((rcfg - bcfg) & 0xfff); 
     187        ar231x_board.radio = radio_data; 
     188        offset = radio_data - board_data; 
     189        printk(KERN_INFO "Radio config found at offset 0x%x(0x%x)\n", rcfg - bcfg, offset); 
     190        rcfg_size = BOARD_CONFIG_BUFSZ - offset; 
     191        memcpy(radio_data, rcfg, rcfg_size); 
     192 
     193        return 0; 
     194} 
     195 
     196static void 
     197ar231x_halt(void) 
     198{ 
     199        local_irq_disable(); 
     200        while (1); 
     201} 
     202 
     203void __init 
     204plat_mem_setup(void) 
     205{ 
     206        _machine_halt = ar231x_halt; 
     207        pm_power_off = ar231x_halt; 
     208 
     209        ar5312_plat_setup(); 
     210        ar2315_plat_setup(); 
     211 
     212        /* Disable data watchpoints */ 
     213        write_c0_watchlo0(0); 
     214} 
     215 
     216 
     217asmlinkage void 
     218plat_irq_dispatch(void) 
     219{ 
     220        ar231x_irq_dispatch(); 
     221} 
     222 
     223void __init 
     224plat_time_init(void) 
     225{ 
     226        ar5312_time_init(); 
     227        ar2315_time_init(); 
     228} 
     229 
     230unsigned int __cpuinit 
     231get_c0_compare_irq(void) 
     232{ 
     233        return CP0_LEGACY_COMPARE_IRQ; 
     234} 
     235 
     236void __init 
     237arch_init_irq(void) 
     238{ 
     239        clear_c0_status(ST0_IM); 
     240        mips_cpu_irq_init(); 
     241 
     242        /* Initialize interrupt controllers */ 
     243        ar5312_irq_init(); 
     244        ar2315_irq_init(); 
     245} 
     246 
     247 
  • 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 void plat_unmap_dma_mem(dma_addr_t dma_addr) 
     33{ 
     34} 
     35 
     36static inline int plat_device_is_coherent(struct device *dev) 
     37{ 
     38        return 0; 
     39} 
     40 
     41#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 
     39#define IS_5312() (current_cpu_data.cputype != CPU_4KEC) 
     40 
     41static void 
     42ar5312_misc_irq_dispatch(void) 
     43{ 
     44        unsigned int ar231x_misc_intrs = ar231x_read_reg(AR531X_ISR) & ar231x_read_reg(AR531X_IMR); 
     45 
     46        if (ar231x_misc_intrs & AR531X_ISR_TIMER) { 
     47                do_IRQ(AR531X_MISC_IRQ_TIMER); 
     48                (void)ar231x_read_reg(AR531X_TIMER); 
     49        } else if (ar231x_misc_intrs & AR531X_ISR_AHBPROC) 
     50                do_IRQ(AR531X_MISC_IRQ_AHB_PROC); 
     51        else if ((ar231x_misc_intrs & AR531X_ISR_UART0)) 
     52                do_IRQ(AR531X_MISC_IRQ_UART0); 
     53        else if (ar231x_misc_intrs & AR531X_ISR_WD) 
     54                do_IRQ(AR531X_MISC_IRQ_WATCHDOG); 
     55        else 
     56                do_IRQ(AR531X_MISC_IRQ_NONE); 
     57} 
     58 
     59void 
     60ar5312_irq_dispatch(void) 
     61{ 
     62        int pending = read_c0_status() & read_c0_cause(); 
     63 
     64        if (pending & CAUSEF_IP2) 
     65                do_IRQ(AR5312_IRQ_WLAN0_INTRS); 
     66        else if (pending & CAUSEF_IP3) 
     67                do_IRQ(AR5312_IRQ_ENET0_INTRS); 
     68        else if (pending & CAUSEF_IP4) 
     69                do_IRQ(AR5312_IRQ_ENET1_INTRS); 
     70        else if (pending & CAUSEF_IP5) 
     71                do_IRQ(AR5312_IRQ_WLAN1_INTRS); 
     72        else if (pending & CAUSEF_IP6) 
     73                ar5312_misc_irq_dispatch(); 
     74        else if (pending & CAUSEF_IP7) 
     75                do_IRQ(AR531X_IRQ_CPU_CLOCK); 
     76} 
     77 
     78 
     79/* Enable the specified AR531X_MISC_IRQ interrupt */ 
     80static void 
     81ar5312_misc_intr_enable(unsigned int irq) 
     82{ 
     83        unsigned int imr; 
     84 
     85        imr = ar231x_read_reg(AR531X_IMR); 
     86        imr |= (1 << (irq - AR531X_MISC_IRQ_BASE - 1)); 
     87        ar231x_write_reg(AR531X_IMR, imr); 
     88} 
     89 
     90/* Disable the specified AR531X_MISC_IRQ interrupt */ 
     91static void 
     92ar5312_misc_intr_disable(unsigned int irq) 
     93{ 
     94        unsigned int imr; 
     95 
     96        imr = ar231x_read_reg(AR531X_IMR); 
     97        imr &= ~(1 << (irq - AR531X_MISC_IRQ_BASE - 1)); 
     98        ar231x_write_reg(AR531X_IMR, imr); 
     99        ar231x_read_reg(AR531X_IMR); /* flush write buffer */ 
     100} 
     101 
     102static unsigned int 
     103ar5312_misc_intr_startup(unsigned int irq) 
     104{ 
     105        ar5312_misc_intr_enable(irq); 
     106        return 0; 
     107} 
     108 
     109static void 
     110ar5312_misc_intr_end(unsigned int irq) 
     111{ 
     112        if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) 
     113                ar5312_misc_intr_enable(irq); 
     114} 
     115 
     116static struct irq_chip ar5312_misc_intr_controller = { 
     117        .name     = "AR5312-MISC", 
     118        .startup  = ar5312_misc_intr_startup, 
     119        .shutdown = ar5312_misc_intr_disable, 
     120        .enable   = ar5312_misc_intr_enable, 
     121        .disable  = ar5312_misc_intr_disable, 
     122        .ack      = ar5312_misc_intr_disable, 
     123        .end      = ar5312_misc_intr_end, 
     124}; 
     125 
     126 
     127static irqreturn_t ar5312_ahb_proc_handler(int cpl, void *dev_id) 
     128{ 
     129        u32 proc1 = ar231x_read_reg(AR531X_PROC1); 
     130        u32 procAddr = ar231x_read_reg(AR531X_PROCADDR); /* clears error state */ 
     131        u32 dma1 = ar231x_read_reg(AR531X_DMA1); 
     132        u32 dmaAddr = ar231x_read_reg(AR531X_DMAADDR);   /* clears error state */ 
     133 
     134        printk("AHB interrupt: PROCADDR=0x%8.8x  PROC1=0x%8.8x  DMAADDR=0x%8.8x  DMA1=0x%8.8x\n", 
     135                        procAddr, proc1, dmaAddr, dma1); 
     136 
     137        machine_restart("AHB error"); /* Catastrophic failure */ 
     138        return IRQ_HANDLED; 
     139} 
     140 
     141 
     142static struct irqaction ar5312_ahb_proc_interrupt  = { 
     143        .handler = ar5312_ahb_proc_handler, 
     144        .flags   = IRQF_DISABLED, 
     145        .name    = "ar5312_ahb_proc_interrupt", 
     146}; 
     147 
     148 
     149static struct irqaction cascade  = { 
     150        .handler = no_action, 
     151        .flags   = IRQF_DISABLED, 
     152        .name    = "cascade", 
     153}; 
     154 
     155void __init ar5312_irq_init(void) 
     156{ 
     157        int i; 
     158 
     159        if (!IS_5312()) 
     160                return; 
     161 
     162        ar231x_irq_dispatch = ar5312_irq_dispatch; 
     163        for (i = 0; i < AR531X_MISC_IRQ_COUNT; i++) { 
     164                int irq = AR531X_MISC_IRQ_BASE + i; 
     165                irq_desc[irq].status = IRQ_DISABLED; 
     166                irq_desc[irq].action = NULL; 
     167                irq_desc[irq].depth = 1; 
     168                irq_desc[irq].chip = &ar5312_misc_intr_controller; 
     169        } 
     170        setup_irq(AR531X_MISC_IRQ_AHB_PROC, &ar5312_ahb_proc_interrupt); 
     171        setup_irq(AR5312_IRQ_MISC_INTRS, &cascade); 
     172} 
     173 
     174const struct ar231x_gpiodev ar5312_gpiodev; 
     175 
     176static u32 
     177ar5312_gpio_get_output(void) 
     178{ 
     179        u32 reg; 
     180        reg = ~(ar231x_read_reg(AR531X_GPIO_CR)); 
     181        reg &= ar5312_gpiodev.valid_mask; 
     182        return reg; 
     183} 
     184 
     185static u32 
     186ar5312_gpio_set_output(u32 mask, u32 val) 
     187{ 
     188        u32 reg; 
     189 
     190        reg = ar231x_read_reg(AR531X_GPIO_CR); 
     191        reg |= mask; 
     192        reg &= ~val; 
     193        ar231x_write_reg(AR531X_GPIO_CR, reg); 
     194        return reg; 
     195} 
     196 
     197static u32 
     198ar5312_gpio_get(void) 
     199{ 
     200        u32 reg; 
     201        reg = ar231x_read_reg(AR531X_GPIO_DI); 
     202        reg &= ar5312_gpiodev.valid_mask; 
     203        return reg; 
     204} 
     205 
     206static u32 
     207ar5312_gpio_set(u32 mask, u32 value) 
     208{ 
     209        u32 reg; 
     210        reg = ar231x_read_reg(AR531X_GPIO_DO); 
     211        reg &= ~mask; 
     212        reg |= value; 
     213        ar231x_write_reg(AR531X_GPIO_DO, reg); 
     214        return reg; 
     215} 
     216 
     217const struct ar231x_gpiodev ar5312_gpiodev = { 
     218        .valid_mask = (1 << 8) - 1, 
     219        .get_output = ar5312_gpio_get_output, 
     220        .set_output = ar5312_gpio_set_output, 
     221        .get = ar5312_gpio_get, 
     222        .set = ar5312_gpio_set, 
     223}; 
     224 
     225static struct physmap_flash_data ar5312_flash_data = { 
     226        .width = 2, 
     227}; 
     228 
     229static struct resource ar5312_flash_resource = { 
     230        .start = AR531X_FLASH, 
     231        .end = AR531X_FLASH + 0x800000 - 1, 
     232        .flags = IORESOURCE_MEM, 
     233}; 
     234 
     235static struct ar231x_eth ar5312_eth0_data = { 
     236        .reset_base = AR531X_RESET, 
     237        .reset_mac = AR531X_RESET_ENET0, 
     238        .reset_phy = AR531X_RESET_EPHY0, 
     239        .phy_base = KSEG1ADDR(AR531X_ENET0), 
     240        .config = &ar231x_board, 
     241}; 
     242 
     243static struct ar231x_eth ar5312_eth1_data = { 
     244        .reset_base = AR531X_RESET, 
     245        .reset_mac = AR531X_RESET_ENET1, 
     246        .reset_phy = AR531X_RESET_EPHY1, 
     247        .phy_base = KSEG1ADDR(AR531X_ENET1), 
     248        .config = &ar231x_board, 
     249}; 
     250 
     251static struct platform_device ar5312_physmap_flash = { 
     252        .name = "physmap-flash", 
     253        .id = 0, 
     254        .dev.platform_data = &ar5312_flash_data, 
     255        .resource = &ar5312_flash_resource, 
     256        .num_resources = 1, 
     257}; 
     258 
     259#ifdef CONFIG_LEDS_GPIO 
     260static struct gpio_led ar5312_leds[] = { 
     261        { .name = "wlan", .gpio = 0, .active_low = 1, }, 
     262}; 
     263 
     264static const struct gpio_led_platform_data ar5312_led_data = { 
     265        .num_leds = ARRAY_SIZE(ar5312_leds), 
     266        .leds = (void *) ar5312_leds, 
     267}; 
     268 
     269static struct platform_device ar5312_gpio_leds = { 
     270        .name = "leds-gpio", 
     271        .id = -1, 
     272        .dev.platform_data = (void *) &ar5312_led_data, 
     273        .num_resources  = 1, 
     274}; 
     275#endif 
     276 
     277/* 
     278 * NB: This mapping size is larger than the actual flash size, 
     279 * but this shouldn't be a problem here, because the flash 
     280 * will simply be mapped multiple times. 
     281 */ 
     282static char __init *ar5312_flash_limit(void) 
     283{ 
     284        u32 ctl; 
     285        /* 
     286         * Configure flash bank 0. 
     287         * Assume 8M window size. Flash will be aliased if it's smaller 
     288         */ 
     289        ctl = FLASHCTL_E | 
     290                FLASHCTL_AC_8M | 
     291                FLASHCTL_RBLE | 
     292                (0x01 << FLASHCTL_IDCY_S) | 
     293                (0x07 << FLASHCTL_WST1_S) | 
     294                (0x07 << FLASHCTL_WST2_S) | 
     295                (ar231x_read_reg(AR531X_FLASHCTL0) & FLASHCTL_MW); 
     296 
     297        ar231x_write_reg(AR531X_FLASHCTL0, ctl); 
     298 
     299        /* Disable other flash banks */ 
     300        ar231x_write_reg(AR531X_FLASHCTL1, 
     301                ar231x_read_reg(AR531X_FLASHCTL1) & ~(FLASHCTL_E | FLASHCTL_AC)); 
     302 
     303        ar231x_write_reg(AR531X_FLASHCTL2, 
     304                ar231x_read_reg(AR531X_FLASHCTL2) & ~(FLASHCTL_E | FLASHCTL_AC)); 
     305 
     306        return (char *) KSEG1ADDR(AR531X_FLASH + 0x800000); 
     307} 
     308 
     309int __init ar5312_init_devices(void) 
     310{ 
     311        struct ar231x_boarddata *config; 
     312        u32 fctl = 0; 
     313        const u8 *radio; 
     314        u8 *c; 
     315 
     316        if (!IS_5312()) 
     317                return 0; 
     318 
     319        /* Locate board/radio config data */ 
     320        ar231x_find_config(ar5312_flash_limit()); 
     321        config = ar231x_board.config; 
     322 
     323 
     324        /* 
     325         * Chip IDs and hardware detection for some Atheros 
     326         * models are really broken! 
     327         * 
     328         * Atheros uses a disabled WMAC0 and Silicon ID of AR5312 
     329         * as indication for AR2312, which is otherwise 
     330         * indistinguishable from the real AR5312. 
     331         */ 
     332        if (ar231x_board.radio) { 
     333                radio = ar231x_board.radio + AR531X_RADIO_MASK_OFF; 
     334                if ((*((const u32 *) radio) & AR531X_RADIO0_MASK) == 0) 
     335                        config->flags |= BD_ISCASPER; 
     336        } else 
     337                radio = NULL; 
     338 
     339        /* AR2313 has CPU minor rev. 10 */ 
     340        if ((current_cpu_data.processor_id & 0xff) == 0x0a) 
     341                ar231x_devtype = DEV_TYPE_AR2313; 
     342 
     343        /* AR2312 shares the same Silicon ID as AR5312 */ 
     344        else if (config->flags & BD_ISCASPER) 
     345                ar231x_devtype = DEV_TYPE_AR2312; 
     346 
     347        /* Everything else is probably AR5312 or compatible */ 
     348        else 
     349                ar231x_devtype = DEV_TYPE_AR5312; 
     350 
     351        /* fixup flash width */ 
     352        fctl = ar231x_read_reg(AR531X_FLASHCTL) & FLASHCTL_MW; 
     353        switch (fctl) { 
     354        case FLASHCTL_MWx16: 
     355                ar5312_flash_data.width = 2; 
     356                break; 
     357        case FLASHCTL_MWx8: 
     358        default: 
     359                ar5312_flash_data.width = 1; 
     360                break; 
     361        } 
     362 
     363        platform_device_register(&ar5312_physmap_flash); 
     364 
     365#ifdef CONFIG_LEDS_GPIO 
     366        ar5312_leds[0].gpio = config->sysLedGpio; 
     367        platform_device_register(&ar5312_gpio_leds); 
     368#endif 
     369 
     370        /* Fix up MAC addresses if necessary */ 
     371        if (!memcmp(config->enet0_mac, "\xff\xff\xff\xff\xff\xff", 6)) 
     372                memcpy(config->enet0_mac, config->enet1_mac, 6); 
     373 
     374        /* If ENET0 and ENET1 have the same mac address, 
     375         * increment the one from ENET1 */ 
     376        if (memcmp(config->enet0_mac, config->enet1_mac, 6) == 0) { 
     377                c = config->enet1_mac + 5; 
     378                while ((c >= config->enet1_mac) && !(++(*c))) 
     379                        c--; 
     380        } 
     381 
     382        switch(ar231x_devtype) { 
     383        case DEV_TYPE_AR5312: 
     384                ar5312_eth0_data.macaddr = config->enet0_mac; 
     385                ar231x_add_ethernet(0, KSEG1ADDR(AR531X_ENET0), 
     386                        AR5312_IRQ_ENET0_INTRS, &ar5312_eth0_data); 
     387 
     388                ar5312_eth1_data.macaddr = config->enet1_mac; 
     389                ar231x_add_ethernet(1, KSEG1ADDR(AR531X_ENET1), 
     390                        AR5312_IRQ_ENET1_INTRS, &ar5312_eth1_data); 
     391 
     392                if (!ar231x_board.radio) 
     393                        return 0; 
     394 
     395                if (*((u32 *) ar231x_board.radio) & AR531X_RADIO0_MASK) 
     396                        ar231x_add_wmac(0, AR531X_WLAN0, 
     397                                AR5312_IRQ_WLAN0_INTRS); 
     398 
     399                break; 
     400        /* 
     401         * AR2312/3 ethernet uses the PHY of ENET0, but the MAC 
     402         * of ENET1. Atheros calls it 'twisted' for a reason :) 
     403         */ 
     404        case DEV_TYPE_AR2312: 
     405        case DEV_TYPE_AR2313: 
     406                ar5312_eth1_data.phy_base = ar5312_eth0_data.phy_base; 
     407                ar5312_eth1_data.reset_phy = ar5312_eth0_data.reset_phy; 
     408                ar5312_eth1_data.macaddr = config->enet0_mac; 
     409                ar231x_add_ethernet(0, KSEG1ADDR(AR531X_ENET1), 
     410                        AR5312_IRQ_ENET1_INTRS, &ar5312_eth1_data); 
     411 
     412                if (!ar231x_board.radio) 
     413                        return 0; 
     414                break; 
     415        default: 
     416                break; 
     417        } 
     418 
     419        if (*((u32 *) ar231x_board.radio) & AR531X_RADIO1_MASK) 
     420                ar231x_add_wmac(1, AR531X_WLAN1, 
     421                        AR5312_IRQ_WLAN1_INTRS); 
     422 
     423        return 0; 
     424} 
     425 
     426 
     427static void ar5312_restart(char *command) 
     428{ 
     429        /* reset the system */ 
     430        local_irq_disable(); 
     431        while(1) { 
     432                ar231x_write_reg(AR531X_RESET, AR531X_RESET_SYSTEM); 
     433        } 
     434} 
     435 
     436 
     437/* 
     438 * This table is indexed by bits 5..4 of the CLOCKCTL1 register 
     439 * to determine the predevisor value. 
     440 */ 
     441static int __initdata CLOCKCTL1_PREDIVIDE_TABLE[4] = { 
     442        1, 
     443        2, 
     444        4, 
     445        5 
     446}; 
     447 
     448 
     449static int __init 
     450ar5312_cpu_frequency(void) 
     451{ 
     452        unsigned int result; 
     453        unsigned int predivide_mask, predivide_shift; 
     454        unsigned int multiplier_mask, multiplier_shift; 
     455        unsigned int clockCtl1, preDivideSelect, preDivisor, multiplier; 
     456        unsigned int doubler_mask; 
     457        u16 devid; 
     458 
     459        /* Trust the bootrom's idea of cpu frequency. */ 
     460        if ((result = ar231x_read_reg(AR5312_SCRATCH))) 
     461                return result; 
     462 
     463        devid = ar231x_board.devid; 
     464        devid &= AR531X_REV_MAJ; 
     465        devid >>= AR531X_REV_MAJ_S; 
     466        if (devid == AR531X_REV_MAJ_AR2313) { 
     467                predivide_mask = AR2313_CLOCKCTL1_PREDIVIDE_MASK; 
     468                predivide_shift = AR2313_CLOCKCTL1_PREDIVIDE_SHIFT; 
     469                multiplier_mask = AR2313_CLOCKCTL1_MULTIPLIER_MASK; 
     470                multiplier_shift = AR2313_CLOCKCTL1_MULTIPLIER_SHIFT; 
     471                doubler_mask = AR2313_CLOCKCTL1_DOUBLER_MASK; 
     472        } else { /* AR5312 and AR2312 */ 
     473                predivide_mask = AR5312_CLOCKCTL1_PREDIVIDE_MASK; 
     474                predivide_shift = AR5312_CLOCKCTL1_PREDIVIDE_SHIFT; 
     475                multiplier_mask = AR5312_CLOCKCTL1_MULTIPLIER_MASK; 
     476                multiplier_shift = AR5312_CLOCKCTL1_MULTIPLIER_SHIFT; 
     477                doubler_mask = AR5312_CLOCKCTL1_DOUBLER_MASK; 
     478        } 
     479 
     480        /* 
     481         * Clocking is derived from a fixed 40MHz input clock. 
     482         * 
     483         *  cpuFreq = InputClock * MULT (where MULT is PLL multiplier) 
     484         *  sysFreq = cpuFreq / 4          (used for APB clock, serial, 
     485         *                                                         flash, Timer, Watchdog Timer) 
     486         * 
     487         *  cntFreq = cpuFreq / 2          (use for CPU count/compare) 
     488         * 
     489         * So, for example, with a PLL multiplier of 5, we have 
     490         * 
     491         *  cpuFreq = 200MHz 
     492         *  sysFreq = 50MHz 
     493         *  cntFreq = 100MHz 
     494         * 
     495         * We compute the CPU frequency, based on PLL settings. 
     496         */ 
     497 
     498        clockCtl1 = ar231x_read_reg(AR5312_CLOCKCTL1); 
     499        preDivideSelect = (clockCtl1 & predivide_mask) >> predivide_shift; 
     500        preDivisor = CLOCKCTL1_PREDIVIDE_TABLE[preDivideSelect]; 
     501        multiplier = (clockCtl1 & multiplier_mask) >> multiplier_shift; 
     502 
     503        if (clockCtl1 & doubler_mask) { 
     504                multiplier = multiplier << 1; 
     505        } 
     506        return (40000000 / preDivisor) * multiplier; 
     507} 
     508 
     509static inline int 
     510ar5312_sys_frequency(void) 
     511{ 
     512        return ar5312_cpu_frequency() / 4; 
     513} 
     514 
     515void __init 
     516ar5312_time_init(void) 
     517{ 
     518        if (!IS_5312()) 
     519                return; 
     520 
     521        mips_hpt_frequency = ar5312_cpu_frequency() / 2; 
     522} 
     523 
     524 
     525void __init 
     526ar5312_prom_init(void) 
     527{ 
     528        u32 memsize, memcfg, bank0AC, bank1AC; 
     529        u32 devid; 
     530 
     531        if (!IS_5312()) 
     532                return; 
     533 
     534        devid = ar231x_read_reg(AR531X_REV); 
     535        devid &= AR531X_REV_MAJ | AR531X_REV_MIN; 
     536 
     537        /* Detect memory size */ 
     538        memcfg = ar231x_read_reg(AR531X_MEM_CFG1); 
     539        bank0AC = (memcfg & MEM_CFG1_AC0) >> MEM_CFG1_AC0_S; 
     540        bank1AC = (memcfg & MEM_CFG1_AC1) >> MEM_CFG1_AC1_S; 
     541        memsize = (bank0AC ? (1 << (bank0AC+1)) : 0) 
     542                + (bank1AC ? (1 << (bank1AC+1)) : 0); 
     543        memsize <<= 20; 
     544        add_memory_region(0, memsize, BOOT_MEM_RAM); 
     545        ar231x_gpiodev = &ar5312_gpiodev; 
     546        ar231x_board.devid = (u16) devid; 
     547} 
     548 
     549void __init 
     550ar5312_plat_setup(void) 
     551{ 
     552        if (!IS_5312()) 
     553                return; 
     554 
     555        /* Clear any lingering AHB errors */ 
     556        ar231x_read_reg(AR531X_PROCADDR); 
     557        ar231x_read_reg(AR531X_DMAADDR); 
     558        ar231x_write_reg(AR531X_WD_CTRL, AR531X_WD_CTRL_IGNORE_EXPIRATION); 
     559 
     560        _machine_restart = ar5312_restart; 
     561        ar231x_serial_setup(KSEG1ADDR(AR531X_UART0), ar5312_sys_frequency()); 
     562} 
     563 
  • 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 
     39#define IS_2315() (current_cpu_data.cputype == CPU_4KEC) 
     40 
     41static u32 gpiointmask = 0, gpiointval = 0; 
     42 
     43static inline void ar2315_gpio_irq(void) 
     44{ 
     45        u32 pend; 
     46        int bit; 
     47 
     48        /* only do one gpio interrupt at a time */ 
     49        pend = (ar231x_read_reg(AR2315_GPIO_DI) ^ gpiointval) & gpiointmask; 
     50        if (!pend) 
     51                return; 
     52 
     53        bit = fls(pend); 
     54        pend ^= (1 << bit); 
     55        gpiointval ^= (1 << bit); 
     56 
     57        /* ACK the interrupt only if we handled all bits */ 
     58        if (!pend) 
     59                ar231x_write_reg(AR2315_ISR, ar231x_read_reg(AR2315_IMR) | ~AR2315_ISR_GPIO); 
     60 
     61        do_IRQ(AR531X_GPIO_IRQ_BASE + fls(pend) - 1); 
     62} 
     63 
     64 
     65/* 
     66 * Called when an interrupt is received, this function 
     67 * determines exactly which interrupt it was, and it 
     68 * invokes the appropriate handler. 
     69 * 
     70 * Implicitly, we also define interrupt priority by 
     71 * choosing which to dispatch first. 
     72 */ 
     73static void 
     74ar2315_irq_dispatch(void) 
     75{ 
     76        int pending = read_c0_status() & read_c0_cause(); 
     77 
     78        if (pending & CAUSEF_IP3) 
     79                do_IRQ(AR2315_IRQ_WLAN0_INTRS); 
     80        else if (pending & CAUSEF_IP4) 
     81                do_IRQ(AR2315_IRQ_ENET0_INTRS); 
     82        else if (pending & CAUSEF_IP2) { 
     83                unsigned int misc_intr = ar231x_read_reg(AR2315_ISR) & ar231x_read_reg(AR2315_IMR); 
     84 
     85                if (misc_intr & AR2315_ISR_SPI) 
     86                        do_IRQ(AR531X_MISC_IRQ_SPI); 
     87                else if (misc_intr & AR2315_ISR_TIMER) 
     88                        do_IRQ(AR531X_MISC_IRQ_TIMER); 
     89                else if (misc_intr & AR2315_ISR_AHB) 
     90                        do_IRQ(AR531X_MISC_IRQ_AHB_PROC); 
     91                else if (misc_intr & AR2315_ISR_GPIO) 
     92                        ar2315_gpio_irq(); 
     93                else if (misc_intr & AR2315_ISR_UART0) 
     94                        do_IRQ(AR531X_MISC_IRQ_UART0); 
     95                else if (misc_intr & AR2315_ISR_WD) 
     96                        do_IRQ(AR531X_MISC_IRQ_WATCHDOG); 
     97                else 
     98                        do_IRQ(AR531X_MISC_IRQ_NONE); 
     99        } else if (pending & CAUSEF_IP7) 
     100                do_IRQ(AR531X_IRQ_CPU_CLOCK); 
     101} 
     102 
     103static void ar2315_set_gpiointmask(int gpio, int level) 
     104{ 
     105        u32 reg; 
     106 
     107 
     108        reg = ar231x_read_reg(AR2315_GPIO_INT); 
     109        reg &= ~(AR2315_GPIO_INT_M | AR2315_GPIO_INT_LVL_M); 
     110        reg |= gpio | AR2315_GPIO_INT_LVL(level); 
     111        ar231x_write_reg(AR2315_GPIO_INT, reg); 
     112} 
     113 
     114static void ar2315_gpio_intr_enable(unsigned int irq) 
     115{ 
     116        unsigned int gpio = irq - AR531X_GPIO_IRQ_BASE; 
     117        u32 reg; 
     118 
     119        gpiointmask &= ~(1 << gpio); 
     120 
     121        /* reconfigure GPIO line as input */ 
     122        reg = ar231x_read_reg(AR2315_GPIO_CR); 
     123        reg &= ~(AR2315_GPIO_CR_M(gpio)); 
     124        reg |= AR2315_GPIO_CR_I(gpio); 
     125        ar231x_write_reg(AR2315_GPIO_CR, reg); 
     126 
     127        /* Enable interrupt with edge detection */ 
     128        ar2315_set_gpiointmask(gpio, 3); 
     129} 
     130 
     131static void ar2315_gpio_intr_disable(unsigned int irq) 
     132{ 
     133        unsigned int gpio = irq - AR531X_GPIO_IRQ_BASE; 
     134 
     135        gpiointmask |= (1 << gpio); 
     136 
     137        /* Disable interrupt */ 
     138        ar2315_set_gpiointmask(gpio, 0); 
     139} 
     140 
     141static struct irq_chip ar2315_gpio_intr_controller = { 
     142        .typename       = "AR2315-GPIO", 
     143        .disable  = ar2315_gpio_intr_disable, 
     144        .ack      = ar2315_gpio_intr_disable, 
     145        .mask_ack = ar2315_gpio_intr_disable, 
     146        .unmask   = ar2315_gpio_intr_enable, 
     147        .eoi   = ar2315_gpio_intr_enable, 
     148}; 
     149 
     150static void 
     151ar2315_misc_intr_enable(unsigned int irq) 
     152{ 
     153        unsigned int imr; 
     154 
     155        imr = ar231x_read_reg(AR2315_IMR); 
     156        switch(irq) { 
     157        case AR531X_MISC_IRQ_SPI: 
     158                 imr |= AR2315_ISR_SPI; 
     159                 break; 
     160        case AR531X_MISC_IRQ_TIMER: 
     161             imr |= AR2315_ISR_TIMER; 
     162             break; 
     163        case AR531X_MISC_IRQ_AHB_PROC: 
     164             imr |= AR2315_ISR_AHB; 
     165             break; 
     166        case AR531X_MISC_IRQ_GPIO: 
     167             imr |= AR2315_ISR_GPIO; 
     168             break; 
     169        case AR531X_MISC_IRQ_UART0: 
     170             imr |= AR2315_ISR_UART0; 
     171             break; 
     172        case AR531X_MISC_IRQ_WATCHDOG: 
     173             imr |= AR2315_ISR_WD; 
     174             break; 
     175        default: 
     176                break; 
     177        } 
     178        ar231x_write_reg(AR2315_IMR, imr); 
     179} 
     180 
     181static void 
     182ar2315_misc_intr_disable(unsigned int irq) 
     183{ 
     184        unsigned int imr; 
     185 
     186        imr = ar231x_read_reg(AR2315_IMR); 
     187        switch(irq) { 
     188        case AR531X_MISC_IRQ_SPI: 
     189                 imr &= ~AR2315_ISR_SPI; 
     190                 break; 
     191        case AR531X_MISC_IRQ_TIMER: 
     192             imr &= ~AR2315_ISR_TIMER; 
     193             break; 
     194        case AR531X_MISC_IRQ_AHB_PROC: 
     195             imr &= ~AR2315_ISR_AHB; 
     196             break; 
     197        case AR531X_MISC_IRQ_GPIO: 
     198             imr &= ~AR2315_ISR_GPIO; 
     199             break; 
     200        case AR531X_MISC_IRQ_UART0: 
     201             imr &= ~AR2315_ISR_UART0; 
     202             break; 
     203        case AR531X_MISC_IRQ_WATCHDOG: 
     204             imr &= ~AR2315_ISR_WD; 
     205             break; 
     206        default: 
     207                break; 
     208        } 
     209        ar231x_write_reg(AR2315_IMR, imr); 
     210} 
     211 
     212static unsigned int 
     213ar2315_misc_intr_startup(unsigned int irq) 
     214{ 
     215        ar2315_misc_intr_enable(irq); 
     216        return 0; 
     217} 
     218 
     219static void 
     220ar2315_misc_intr_end(unsigned int irq) 
     221{ 
     222        if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) 
     223                ar2315_misc_intr_enable(irq); 
     224} 
     225 
     226 
     227static struct irq_chip ar2315_misc_intr_controller = { 
     228        .typename       = "AR2315-MISC", 
     229        .startup  = ar2315_misc_intr_startup, 
     230        .shutdown = ar2315_misc_intr_disable, 
     231        .enable   = ar2315_misc_intr_enable, 
     232        .disable  = ar2315_misc_intr_disable, 
     233        .ack      = ar2315_misc_intr_disable, 
     234        .end      = ar2315_misc_intr_end, 
     235}; 
     236 
     237static irqreturn_t ar2315_ahb_proc_handler(int cpl, void *dev_id) 
     238{ 
     239    ar231x_write_reg(AR2315_AHB_ERR0, AHB_ERROR_DET); 
     240    ar231x_read_reg(AR2315_AHB_ERR1); 
     241 
     242    printk(KERN_ERR "AHB fatal error\n"); 
     243    machine_restart("AHB error"); /* Catastrophic failure */ 
     244 
     245    return IRQ_HANDLED; 
     246} 
     247 
     248static struct irqaction ar2315_ahb_proc_interrupt  = { 
     249        .handler        = ar2315_ahb_proc_handler, 
     250        .flags          = IRQF_DISABLED, 
     251        .name           = "ar2315_ahb_proc_interrupt", 
     252}; 
     253 
     254static struct irqaction cascade  = { 
     255        .handler        = no_action, 
     256        .flags          = IRQF_DISABLED, 
     257        .name           = "cascade", 
     258}; 
     259 
     260void 
     261ar2315_irq_init(void) 
     262{ 
     263        int i; 
     264 
     265        ar231x_irq_dispatch = ar2315_irq_dispatch; 
     266        gpiointval = ar231x_read_reg(AR2315_GPIO_DI); 
     267        for (i = 0; i < AR531X_MISC_IRQ_COUNT; i++) { 
     268                int irq = AR531X_MISC_IRQ_BASE + i; 
     269                irq_desc[irq].status = IRQ_DISABLED; 
     270                irq_desc[irq].action = NULL; 
     271                irq_desc[irq].depth = 1; 
     272                irq_desc[irq].chip = &ar2315_misc_intr_controller; 
     273        } 
     274        for (i = 0; i < AR531X_GPIO_IRQ_COUNT; i++) { 
     275                int irq = AR531X_GPIO_IRQ_BASE + i; 
     276                irq_desc[irq].status = IRQ_DISABLED; 
     277                irq_desc[irq].action = NULL; 
     278                irq_desc[irq].depth = 1; 
     279                irq_desc[irq].chip = &ar2315_gpio_intr_controller; 
     280        } 
     281        setup_irq(AR531X_MISC_IRQ_GPIO, &cascade); 
     282        setup_irq(AR531X_MISC_IRQ_AHB_PROC, &ar2315_ahb_proc_interrupt); 
     283        setup_irq(AR2315_IRQ_MISC_INTRS, &cascade); 
     284} 
     285 
     286const struct ar231x_gpiodev ar2315_gpiodev; 
     287 
     288static u32 
     289ar2315_gpio_get_output(void) 
     290{ 
     291        u32 reg; 
     292        reg = ar231x_read_reg(AR2315_GPIO_CR); 
     293        reg &= ar2315_gpiodev.valid_mask; 
     294        return reg; 
     295} 
     296 
     297static u32 
     298ar2315_gpio_set_output(u32 mask, u32 val) 
     299{ 
     300        u32 reg; 
     301 
     302        reg = ar231x_read_reg(AR2315_GPIO_CR); 
     303        reg &= ~mask; 
     304        reg |= val; 
     305        ar231x_write_reg(AR2315_GPIO_CR, reg); 
     306        return reg; 
     307} 
     308 
     309static u32 
     310ar2315_gpio_get(void) 
     311{ 
     312        u32 reg; 
     313        reg = ar231x_read_reg(AR2315_GPIO_DI); 
     314        reg &= ar2315_gpiodev.valid_mask; 
     315        return reg; 
     316} 
     317 
     318static u32 
     319ar2315_gpio_set(u32 mask, u32 value) 
     320{ 
     321        u32 reg; 
     322        reg = ar231x_read_reg(AR2315_GPIO_DO); 
     323        reg &= ~mask; 
     324        reg |= value; 
     325        ar231x_write_reg(AR2315_GPIO_DO, reg); 
     326        return reg; 
     327} 
     328 
     329const struct ar231x_gpiodev ar2315_gpiodev = { 
     330        .valid_mask = (1 << 22) - 1, 
     331        .get_output = ar2315_gpio_get_output, 
     332        .set_output = ar2315_gpio_set_output, 
     333        .get = ar2315_gpio_get, 
     334        .set = ar2315_gpio_set, 
     335}; 
     336 
     337static struct ar231x_eth ar2315_eth_data = { 
     338        .reset_base = AR2315_RESET, 
     339        .reset_mac = AR2315_RESET_ENET0, 
     340        .reset_phy = AR2315_RESET_EPHY0, 
     341        .phy_base = AR2315_ENET0, 
     342        .config = &ar231x_board, 
     343}; 
     344 
     345static struct resource ar2315_spiflash_res[] = { 
     346        { 
     347                .name = "flash_base", 
     348                .flags = IORESOURCE_MEM, 
     349                .start = KSEG1ADDR(AR2315_SPI_READ), 
     350                .end = KSEG1ADDR(AR2315_SPI_READ) + 0x1000000 - 1, 
     351        }, 
     352        { 
     353                .name = "flash_regs", 
     354                .flags = IORESOURCE_MEM, 
     355                .start = 0x11300000, 
     356                .end = 0x11300012, 
     357        }, 
     358}; 
     359 
     360static struct platform_device ar2315_spiflash = { 
     361        .id = 0, 
     362        .name = "spiflash", 
     363        .resource = ar2315_spiflash_res, 
     364        .num_resources = ARRAY_SIZE(ar2315_spiflash_res) 
     365}; 
     366 
     367static struct platform_device ar2315_wdt = { 
     368        .id = 0, 
     369        .name = "ar2315_wdt", 
     370}; 
     371 
     372#define SPI_FLASH_CTL      0x00 
     373#define SPI_FLASH_OPCODE   0x04 
     374#define SPI_FLASH_DATA     0x08 
     375 
     376static inline u32 
     377spiflash_read_reg(int reg) 
     378{ 
     379        return ar231x_read_reg(KSEG1ADDR(AR2315_SPI) + reg); 
     380} 
     381 
     382static inline void 
     383spiflash_write_reg(int reg, u32 data) 
     384{ 
     385        ar231x_write_reg(KSEG1ADDR(AR2315_SPI) + reg, data); 
     386} 
     387 
     388static u32 
     389spiflash_wait_status(void) 
     390{ 
     391        u32 reg; 
     392 
     393        do { 
     394                reg = spiflash_read_reg(SPI_FLASH_CTL); 
     395        } while (reg & SPI_CTL_BUSY); 
     396 
     397        return reg; 
     398} 
     399 
     400static u8 
     401spiflash_probe(void) 
     402{ 
     403        u32 reg; 
     404 
     405        reg = spiflash_wait_status(); 
     406        reg &= ~SPI_CTL_TX_RX_CNT_MASK; 
     407        reg |= (1 << 4) | 4 | SPI_CTL_START; 
     408 
     409        spiflash_write_reg(SPI_FLASH_OPCODE, 0xab); 
     410        spiflash_write_reg(SPI_FLASH_CTL, reg); 
     411 
     412        reg = spiflash_wait_status(); 
     413        reg = spiflash_read_reg(SPI_FLASH_DATA); 
     414        reg &= 0xff; 
     415 
     416        return (u8) reg; 
     417} 
     418 
     419 
     420#define STM_8MBIT_SIGNATURE     0x13 
     421#define STM_16MBIT_SIGNATURE    0x14 
     422#define STM_32MBIT_SIGNATURE    0x15 
     423#define STM_64MBIT_SIGNATURE    0x16 
     424#define STM_128MBIT_SIGNATURE   0x17 
     425 
     426static u8 __init * 
     427ar2315_flash_limit(void) 
     428{ 
     429        u32 flash_size = 0; 
     430 
     431        /* probe the flash chip size */ 
     432        switch(spiflash_probe()) { 
     433                case STM_8MBIT_SIGNATURE: 
     434                        flash_size = 0x00100000; 
     435                        break; 
     436                case STM_16MBIT_SIGNATURE: 
     437                        flash_size = 0x00200000; 
     438                        break; 
     439                case STM_32MBIT_SIGNATURE: 
     440                        flash_size = 0x00400000; 
     441                        break; 
     442                case STM_64MBIT_SIGNATURE: 
     443                        flash_size = 0x00800000; 
     444                        break; 
     445                case STM_128MBIT_SIGNATURE: 
     446                        flash_size = 0x01000000; 
     447                        break; 
     448        } 
     449 
     450        ar2315_spiflash_res[0].end = ar2315_spiflash_res[0].start + 
     451                flash_size - 1; 
     452        return (u8 *) ar2315_spiflash_res[0].end + 1; 
     453} 
     454 
     455#ifdef CONFIG_LEDS_GPIO 
     456static struct gpio_led ar2315_leds[6]; 
     457static struct gpio_led_platform_data ar2315_led_data = { 
     458        .leds = (void *) ar2315_leds, 
     459}; 
     460 
     461static struct platform_device ar2315_gpio_leds = { 
     462        .name = "leds-gpio", 
     463        .id = -1, 
     464        .dev = { 
     465                .platform_data = (void *) &ar2315_led_data, 
     466        } 
     467}; 
     468 
     469static void __init 
     470ar2315_init_gpio(void) 
     471{ 
     472        static char led_names[6][6]; 
     473        int i, led = 0; 
     474 
     475        ar2315_led_data.num_leds = 0; 
     476        for(i = 1; i < 8; i++) 
     477        { 
     478                if((i == AR2315_RESET_GPIO) || 
     479                   (i == ar231x_board.config->resetConfigGpio)) 
     480                        continue; 
     481 
     482                if(i == ar231x_board.config->sysLedGpio) 
     483                        strcpy(led_names[led], "wlan"); 
     484                else 
     485                        sprintf(led_names[led], "gpio%d", i); 
     486 
     487                ar2315_leds[led].name = led_names[led]; 
     488                ar2315_leds[led].gpio = i; 
     489                ar2315_leds[led].active_low = 0; 
     490                led++; 
     491        } 
     492        ar2315_led_data.num_leds = led; 
     493        platform_device_register(&ar2315_gpio_leds); 
     494} 
     495#else 
     496static inline void ar2315_init_gpio(void) 
     497{ 
     498} 
     499#endif 
     500 
     501int __init 
     502ar2315_init_devices(void) 
     503{ 
     504        if (!IS_2315()) 
     505                return 0; 
     506 
     507        /* Find board configuration */ 
     508        ar231x_find_config(ar2315_flash_limit()); 
     509        ar2315_eth_data.macaddr = ar231x_board.config->enet0_mac; 
     510 
     511        ar2315_init_gpio(); 
     512        platform_device_register(&ar2315_wdt); 
     513        platform_device_register(&ar2315_spiflash); 
     514        ar231x_add_ethernet(0, AR2315_ENET0, AR2315_IRQ_ENET0_INTRS, 
     515                &ar2315_eth_data); 
     516        ar231x_add_wmac(0, AR2315_WLAN0, AR2315_IRQ_WLAN0_INTRS); 
     517 
     518        return 0; 
     519} 
     520 
     521static void 
     522ar2315_restart(char *command) 
     523{ 
     524        void (*mips_reset_vec)(void) = (void *) 0xbfc00000; 
     525 
     526        local_irq_disable(); 
     527 
     528        /* try reset the system via reset control */ 
     529        ar231x_write_reg(AR2315_COLD_RESET,AR2317_RESET_SYSTEM); 
     530 
     531        /* Cold reset does not work on the AR2315/6, use the GPIO reset bits a workaround. 
     532         * give it some time to attempt a gpio based hardware reset 
     533         * (atheros reference design workaround) */ 
     534        gpio_direction_output(AR2315_RESET_GPIO, 0); 
     535        mdelay(100); 
     536 
     537        /* Some boards (e.g. Senao EOC-2610) don't implement the reset logic 
     538         * workaround. Attempt to jump to the mips reset location - 
     539         * the boot loader itself might be able to recover the system */ 
     540        mips_reset_vec(); 
     541} 
     542 
     543 
     544/* 
     545 * This table is indexed by bits 5..4 of the CLOCKCTL1 register 
     546 * to determine the predevisor value. 
     547 */ 
     548static int __initdata CLOCKCTL1_PREDIVIDE_TABLE[4] = { 
     549    1, 
     550    2, 
     551    4, 
     552    5 
     553}; 
     554 
     555static int __initdata PLLC_DIVIDE_TABLE[5] = { 
     556    2, 
     557    3, 
     558    4, 
     559    6, 
     560    3 
     561}; 
     562 
     563static unsigned int __init 
     564ar2315_sys_clk(unsigned int clockCtl) 
     565{ 
     566    unsigned int pllcCtrl,cpuDiv; 
     567    unsigned int pllcOut,refdiv,fdiv,divby2; 
     568        unsigned int clkDiv; 
     569 
     570    pllcCtrl = ar231x_read_reg(AR2315_PLLC_CTL); 
     571    refdiv = (pllcCtrl & PLLC_REF_DIV_M) >> PLLC_REF_DIV_S; 
     572    refdiv = CLOCKCTL1_PREDIVIDE_TABLE[refdiv]; 
     573    fdiv = (pllcCtrl & PLLC_FDBACK_DIV_M) >> PLLC_FDBACK_DIV_S; 
     574    divby2 = (pllcCtrl & PLLC_ADD_FDBACK_DIV_M) >> PLLC_ADD_FDBACK_DIV_S; 
     575    divby2 += 1; 
     576    pllcOut = (40000000/refdiv)*(2*divby2)*fdiv; 
     577 
     578 
     579    /* clkm input selected */ 
     580        switch(clockCtl & CPUCLK_CLK_SEL_M) { 
     581                case 0: 
     582                case 1: 
     583                        clkDiv = PLLC_DIVIDE_TABLE[(pllcCtrl & PLLC_CLKM_DIV_M) >> PLLC_CLKM_DIV_S]; 
     584                        break; 
     585                case 2: 
     586                        clkDiv = PLLC_DIVIDE_TABLE[(pllcCtrl & PLLC_CLKC_DIV_M) >> PLLC_CLKC_DIV_S]; 
     587                        break; 
     588                default: 
     589                        pllcOut = 40000000; 
     590                        clkDiv = 1; 
     591                        break; 
     592        } 
     593        cpuDiv = (clockCtl & CPUCLK_CLK_DIV_M) >> CPUCLK_CLK_DIV_S; 
     594        cpuDiv = cpuDiv * 2 ?: 1; 
     595        return (pllcOut/(clkDiv * cpuDiv)); 
     596} 
     597 
     598static inline unsigned int 
     599ar2315_cpu_frequency(void) 
     600{ 
     601    return ar2315_sys_clk(ar231x_read_reg(AR2315_CPUCLK)); 
     602} 
     603 
     604static inline unsigned int 
     605ar2315_apb_frequency(void) 
     606{ 
     607    return ar2315_sys_clk(ar231x_read_reg(AR2315_AMBACLK)); 
     608} 
     609 
     610void __init 
     611ar2315_time_init(void) 
     612{ 
     613        mips_hpt_frequency = ar2315_cpu_frequency() / 2; 
     614} 
     615 
     616void __init 
     617ar2315_prom_init(void) 
     618{ 
     619        u32 memsize, memcfg, devid; 
     620 
     621        if (!IS_2315()) 
     622                return; 
     623 
     624        memcfg = ar231x_read_reg(AR2315_MEM_CFG); 
     625        memsize   = 1 + ((memcfg & SDRAM_DATA_WIDTH_M) >> SDRAM_DATA_WIDTH_S); 
     626        memsize <<= 1 + ((memcfg & SDRAM_COL_WIDTH_M) >> SDRAM_COL_WIDTH_S); 
     627        memsize <<= 1 + ((memcfg & SDRAM_ROW_WIDTH_M) >> SDRAM_ROW_WIDTH_S); 
     628        memsize <<= 3; 
     629        add_memory_region(0, memsize, BOOT_MEM_RAM); 
     630 
     631        /* Detect the hardware based on the device ID */ 
     632        devid = ar231x_read_reg(AR2315_SREV) & AR2315_REV_CHIP; 
     633        switch(devid) { 
     634                case 0x90: 
     635                case 0x91: 
     636                        ar231x_devtype = DEV_TYPE_AR2317; 
     637                        break; 
     638                default: 
     639                        ar231x_devtype = DEV_TYPE_AR2315; 
     640                        break; 
     641        } 
     642        ar231x_gpiodev = &ar2315_gpiodev; 
     643        ar231x_board.devid = devid; 
     644} 
     645 
     646void __init 
     647ar2315_plat_setup(void) 
     648{ 
     649        u32 config; 
     650 
     651        if (!IS_2315()) 
     652                return; 
     653 
     654        /* Clear any lingering AHB errors */ 
     655        config = read_c0_config(); 
     656        write_c0_config(config & ~0x3); 
     657        ar231x_write_reg(AR2315_AHB_ERR0,AHB_ERROR_DET); 
     658        ar231x_read_reg(AR2315_AHB_ERR1); 
     659        ar231x_write_reg(AR2315_WDC, AR2315_WDC_IGNORE_EXPIRATION); 
     660 
     661        _machine_restart = ar2315_restart; 
     662        ar231x_serial_setup(KSEG1ADDR(AR2315_UART0), ar2315_apb_frequency()); 
     663} 
  • 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 *) reg); 
     33} 
     34 
     35static inline void 
     36ar231x_write_reg(u32 reg, u32 val) 
     37{ 
     38        __raw_writel(val, (u32 *)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 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 
     27#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; 
     16 
     17static struct resource ar231x_eth0_res[] = { 
     18        { 
     19                .name = "eth0_membase", 
     20                .flags = IORESOURCE_MEM, 
     21        }, 
     22        { 
     23                .name = "eth0_irq", 
     24                .flags = IORESOURCE_IRQ, 
     25        } 
     26}; 
     27 
     28static struct resource ar231x_eth1_res[] = { 
     29        { 
     30                .name = "eth1_membase", 
     31                .flags = IORESOURCE_MEM, 
     32        }, 
     33        { 
     34                .name = "eth1_irq", 
     35                .flags = IORESOURCE_IRQ, 
     36        } 
     37}; 
     38 
     39static struct platform_device ar231x_eth[] = { 
     40        { 
     41                .id = 0, 
     42                .name = "ar231x-eth", 
     43                .resource = ar231x_eth0_res, 
     44                .num_resources = ARRAY_SIZE(ar231x_eth0_res) 
     45        }, 
     46        { 
     47                .id = 1, 
     48                .name = "ar231x-eth", 
     49                .resource = ar231x_eth1_res, 
     50                .num_resources = ARRAY_SIZE(ar231x_eth1_res) 
     51        } 
     52}; 
     53 
     54static struct resource ar231x_wmac0_res[] = { 
     55        { 
     56                .name = "wmac0_membase", 
     57                .flags = IORESOURCE_MEM, 
     58        }, 
     59        { 
     60                .name = "wmac0_irq", 
     61                .flags = IORESOURCE_IRQ, 
     62        } 
     63}; 
     64 
     65static struct resource ar231x_wmac1_res[] = { 
     66        { 
     67                .name = "wmac1_membase", 
     68                .flags = IORESOURCE_MEM, 
     69        }, 
     70        { 
     71                .name = "wmac1_irq", 
     72                .flags = IORESOURCE_IRQ, 
     73        } 
     74}; 
     75 
     76 
     77static struct platform_device ar231x_wmac[] = { 
     78        { 
     79                .id = 0, 
     80                .name = "ar231x-wmac", 
     81                .resource = ar231x_wmac0_res, 
     82                .num_resources = ARRAY_SIZE(ar231x_wmac0_res), 
     83                .dev.platform_data = &ar231x_board, 
     84        }, 
     85        { 
     86                .id = 1, 
     87                .name = "ar231x-wmac", 
     88                .resource = ar231x_wmac1_res, 
     89                .num_resources = ARRAY_SIZE(ar231x_wmac1_res), 
     90                .dev.platform_data = &ar231x_board, 
     91        }, 
     92}; 
     93 
     94static const char *devtype_strings[] = { 
     95        [DEV_TYPE_AR5312] = "Atheros AR5312", 
     96        [DEV_TYPE_AR2312] = "Atheros AR2312", 
     97        [DEV_TYPE_AR2313] = "Atheros AR2313", 
     98        [DEV_TYPE_AR2315] = "Atheros AR2315", 
     99        [DEV_TYPE_AR2316] = "Atheros AR2316", 
     100        [DEV_TYPE_AR2317] = "Atheros AR2317", 
     101        [DEV_TYPE_UNKNOWN] = "Atheros (unknown)", 
     102}; 
     103 
     104const char *get_system_type(void) 
     105{ 
     106        if ((ar231x_devtype >= ARRAY_SIZE(devtype_strings)) || 
     107                !devtype_strings[ar231x_devtype]) 
     108                return devtype_strings[DEV_TYPE_UNKNOWN]; 
     109        return devtype_strings[ar231x_devtype]; 
     110} 
     111 
     112 
     113int __init 
     114ar231x_add_ethernet(int nr, u32 base, int irq, void *pdata) 
     115{ 
     116        struct resource *res; 
     117 
     118        ar231x_eth[nr].dev.platform_data = pdata; 
     119        res = &ar231x_eth[nr].resource[0]; 
     120        res->start = base; 
     121        res->end = base + 0x2000 - 1; 
     122        res++; 
     123        res->start = irq; 
     124        res->end = irq; 
     125        return platform_device_register(&ar231x_eth[nr]); 
     126} 
     127 
     128void __init 
     129ar231x_serial_setup(u32 mapbase, unsigned int uartclk) 
     130{ 
     131        struct uart_port s; 
     132 
     133        memset(&s, 0, sizeof(s)); 
     134 
     135        s.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST; 
     136        s.iotype = UPIO_MEM; 
     137        s.irq = AR531X_MISC_IRQ_UART0; 
     138        s.regshift = 2; 
     139        s.mapbase = mapbase; 
     140        s.uartclk = uartclk; 
     141        s.membase = (void __iomem *)s.mapbase; 
     142 
     143        early_serial_setup(&s); 
     144} 
     145 
     146int __init 
     147ar231x_add_wmac(int nr, u32 base, int irq) 
     148{ 
     149        struct resource *res; 
     150 
     151        ar231x_wmac[nr].dev.platform_data = &ar231x_board; 
     152        res = &ar231x_wmac[nr].resource[0]; 
     153        res->start = base; 
     154        res->end = base + 0x10000 - 1; 
     155        res++; 
     156        res->start = irq; 
     157        res->end = irq; 
     158        return platform_device_register(&ar231x_wmac[nr]); 
     159} 
     160 
     161static int __init ar231x_register_devices(void) 
     162{ 
     163        static struct resource res = { 
     164                .start = 0xFFFFFFFF, 
     165        }; 
     166 
     167        platform_device_register_simple("GPIODEV", 0, &res, 1); 
     168        ar5312_init_devices(); 
     169        ar2315_init_devices(); 
     170 
     171        return 0; 
     172} 
     173 
     174device_initcall(ar231x_register_devices); 
Note: See TracBrowser for help on using the repository browser.