Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  *
0004  * Copyright (C) 2012 Thomas Langer <thomas.langer@lantiq.com>
0005  * Copyright (C) 2012 John Crispin <john@phrozen.org>
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 /* reset, nmi and ejtag exception vectors */
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 }