0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/kernel.h>
0009 #include <asm/cacheflush.h>
0010 #include <asm/traps.h>
0011 #include <asm/io.h>
0012
0013 #include <lantiq_soc.h>
0014
0015 #include "../prom.h"
0016
0017 #define SOC_FALCON "Falcon"
0018 #define SOC_FALCON_D "Falcon-D"
0019 #define SOC_FALCON_V "Falcon-V"
0020 #define SOC_FALCON_M "Falcon-M"
0021
0022 #define COMP_FALCON "lantiq,falcon"
0023
0024 #define PART_SHIFT 12
0025 #define PART_MASK 0x0FFFF000
0026 #define REV_SHIFT 28
0027 #define REV_MASK 0xF0000000
0028 #define SREV_SHIFT 22
0029 #define SREV_MASK 0x03C00000
0030 #define TYPE_SHIFT 26
0031 #define TYPE_MASK 0x3C000000
0032
0033
0034 #define BOOT_REG_BASE (KSEG1 | 0x1F200000)
0035 #define BOOT_RVEC (BOOT_REG_BASE | 0x00)
0036 #define BOOT_NVEC (BOOT_REG_BASE | 0x04)
0037 #define BOOT_EVEC (BOOT_REG_BASE | 0x08)
0038
0039 void __init ltq_soc_nmi_setup(void)
0040 {
0041 extern void (*nmi_handler)(void);
0042
0043 ltq_w32((unsigned long)&nmi_handler, (void *)BOOT_NVEC);
0044 }
0045
0046 void __init ltq_soc_ejtag_setup(void)
0047 {
0048 extern void (*ejtag_debug_handler)(void);
0049
0050 ltq_w32((unsigned long)&ejtag_debug_handler, (void *)BOOT_EVEC);
0051 }
0052
0053 void __init ltq_soc_detect(struct ltq_soc_info *i)
0054 {
0055 u32 type;
0056 i->partnum = (ltq_r32(FALCON_CHIPID) & PART_MASK) >> PART_SHIFT;
0057 i->rev = (ltq_r32(FALCON_CHIPID) & REV_MASK) >> REV_SHIFT;
0058 i->srev = ((ltq_r32(FALCON_CHIPCONF) & SREV_MASK) >> SREV_SHIFT);
0059 i->compatible = COMP_FALCON;
0060 i->type = SOC_TYPE_FALCON;
0061 sprintf(i->rev_type, "%c%d%d", (i->srev & 0x4) ? ('B') : ('A'),
0062 i->rev & 0x7, (i->srev & 0x3) + 1);
0063
0064 switch (i->partnum) {
0065 case SOC_ID_FALCON:
0066 type = (ltq_r32(FALCON_CHIPTYPE) & TYPE_MASK) >> TYPE_SHIFT;
0067 switch (type) {
0068 case 0:
0069 i->name = SOC_FALCON_D;
0070 break;
0071 case 1:
0072 i->name = SOC_FALCON_V;
0073 break;
0074 case 2:
0075 i->name = SOC_FALCON_M;
0076 break;
0077 default:
0078 i->name = SOC_FALCON;
0079 break;
0080 }
0081 break;
0082
0083 default:
0084 unreachable();
0085 break;
0086 }
0087
0088 board_nmi_handler_setup = ltq_soc_nmi_setup;
0089 board_ejtag_handler_setup = ltq_soc_ejtag_setup;
0090 }