-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
MIPS: lantiq: implement support for FALCON soc
Adds support for the FALCON SoC. This SoC is from the FTTH/GPON SoC family. Signed-off-by: Thomas Langer <thomas.langer@lantiq.com> Signed-off-by: John Crispin <blogic@openwrt.org> Cc: linux-mips@linux-mips.org Patchwork: https://patchwork.linux-mips.org/patch/3814/ Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
- Loading branch information
John Crispin
authored and
Ralf Baechle
committed
May 21, 2012
1 parent
fa09ede
commit d41ced0
Showing
10 changed files
with
552 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
/* | ||
* This program is free software; you can redistribute it and/or modify it | ||
* under the terms of the GNU General Public License version 2 as published | ||
* by the Free Software Foundation. | ||
* | ||
* Copyright (C) 2010 Thomas Langer <thomas.langer@lantiq.com> | ||
*/ | ||
|
||
#ifndef _FALCON_IRQ__ | ||
#define _FALCON_IRQ__ | ||
|
||
#define INT_NUM_IRQ0 8 | ||
#define INT_NUM_IM0_IRL0 (INT_NUM_IRQ0 + 0) | ||
#define INT_NUM_IM1_IRL0 (INT_NUM_IM0_IRL0 + 32) | ||
#define INT_NUM_IM2_IRL0 (INT_NUM_IM1_IRL0 + 32) | ||
#define INT_NUM_IM3_IRL0 (INT_NUM_IM2_IRL0 + 32) | ||
#define INT_NUM_IM4_IRL0 (INT_NUM_IM3_IRL0 + 32) | ||
#define INT_NUM_EXTRA_START (INT_NUM_IM4_IRL0 + 32) | ||
#define INT_NUM_IM_OFFSET (INT_NUM_IM1_IRL0 - INT_NUM_IM0_IRL0) | ||
|
||
#define MIPS_CPU_TIMER_IRQ 7 | ||
|
||
#endif /* _FALCON_IRQ__ */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
/* | ||
* This program is free software; you can redistribute it and/or modify it | ||
* under the terms of the GNU General Public License version 2 as published | ||
* by the Free Software Foundation. | ||
* | ||
* Copyright (C) 2011 Thomas Langer <thomas.langer@lantiq.com> | ||
*/ | ||
|
||
#ifndef __FALCON_IRQ_H | ||
#define __FALCON_IRQ_H | ||
|
||
#include <falcon_irq.h> | ||
|
||
#define NR_IRQS 328 | ||
|
||
#include_next <irq.h> | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
/* | ||
* This program is free software; you can redistribute it and/or modify it | ||
* under the terms of the GNU General Public License version 2 as published | ||
* by the Free Software Foundation. | ||
* | ||
* Copyright (C) 2010 John Crispin <blogic@openwrt.org> | ||
*/ | ||
|
||
#ifndef _LTQ_FALCON_H__ | ||
#define _LTQ_FALCON_H__ | ||
|
||
#ifdef CONFIG_SOC_FALCON | ||
|
||
#include <linux/pinctrl/pinctrl.h> | ||
#include <lantiq.h> | ||
|
||
/* Chip IDs */ | ||
#define SOC_ID_FALCON 0x01B8 | ||
|
||
/* SoC Types */ | ||
#define SOC_TYPE_FALCON 0x01 | ||
|
||
/* | ||
* during early_printk no ioremap possible at this early stage | ||
* lets use KSEG1 instead | ||
*/ | ||
#define LTQ_ASC0_BASE_ADDR 0x1E100C00 | ||
#define LTQ_EARLY_ASC KSEG1ADDR(LTQ_ASC0_BASE_ADDR) | ||
|
||
/* WDT */ | ||
#define LTQ_RST_CAUSE_WDTRST 0x0002 | ||
|
||
/* CHIP ID */ | ||
#define LTQ_STATUS_BASE_ADDR 0x1E802000 | ||
|
||
#define FALCON_CHIPID ((u32 *)(KSEG1 + LTQ_STATUS_BASE_ADDR + 0x0c)) | ||
#define FALCON_CHIPTYPE ((u32 *)(KSEG1 + LTQ_STATUS_BASE_ADDR + 0x38)) | ||
#define FALCON_CHIPCONF ((u32 *)(KSEG1 + LTQ_STATUS_BASE_ADDR + 0x40)) | ||
|
||
/* SYSCTL - start/stop/restart/configure/... different parts of the Soc */ | ||
#define SYSCTL_SYS1 0 | ||
#define SYSCTL_SYSETH 1 | ||
#define SYSCTL_SYSGPE 2 | ||
|
||
/* BOOT_SEL - find what boot media we have */ | ||
#define BS_FLASH 0x1 | ||
#define BS_SPI 0x4 | ||
|
||
/* global register ranges */ | ||
extern __iomem void *ltq_ebu_membase; | ||
extern __iomem void *ltq_sys1_membase; | ||
#define ltq_ebu_w32(x, y) ltq_w32((x), ltq_ebu_membase + (y)) | ||
#define ltq_ebu_r32(x) ltq_r32(ltq_ebu_membase + (x)) | ||
|
||
#define ltq_sys1_w32(x, y) ltq_w32((x), ltq_sys1_membase + (y)) | ||
#define ltq_sys1_r32(x) ltq_r32(ltq_sys1_membase + (x)) | ||
#define ltq_sys1_w32_mask(clear, set, reg) \ | ||
ltq_sys1_w32((ltq_sys1_r32(reg) & ~(clear)) | (set), reg) | ||
|
||
/* | ||
* to keep the irq code generic we need to define this to 0 as falcon | ||
* has no EIU/EBU | ||
*/ | ||
#define LTQ_EBU_PCC_ISTAT 0 | ||
|
||
#endif /* CONFIG_SOC_FALCON */ | ||
#endif /* _LTQ_XWAY_H__ */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
obj-y := prom.o reset.o sysctrl.o |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,87 @@ | ||
/* | ||
* This program is free software; you can redistribute it and/or modify it | ||
* under the terms of the GNU General Public License version 2 as published | ||
* by the Free Software Foundation. | ||
* | ||
* Copyright (C) 2012 Thomas Langer <thomas.langer@lantiq.com> | ||
* Copyright (C) 2012 John Crispin <blogic@openwrt.org> | ||
*/ | ||
|
||
#include <linux/kernel.h> | ||
#include <asm/io.h> | ||
|
||
#include <lantiq_soc.h> | ||
|
||
#include "../prom.h" | ||
|
||
#define SOC_FALCON "Falcon" | ||
#define SOC_FALCON_D "Falcon-D" | ||
#define SOC_FALCON_V "Falcon-V" | ||
#define SOC_FALCON_M "Falcon-M" | ||
|
||
#define COMP_FALCON "lantiq,falcon" | ||
|
||
#define PART_SHIFT 12 | ||
#define PART_MASK 0x0FFFF000 | ||
#define REV_SHIFT 28 | ||
#define REV_MASK 0xF0000000 | ||
#define SREV_SHIFT 22 | ||
#define SREV_MASK 0x03C00000 | ||
#define TYPE_SHIFT 26 | ||
#define TYPE_MASK 0x3C000000 | ||
|
||
/* reset, nmi and ejtag exception vectors */ | ||
#define BOOT_REG_BASE (KSEG1 | 0x1F200000) | ||
#define BOOT_RVEC (BOOT_REG_BASE | 0x00) | ||
#define BOOT_NVEC (BOOT_REG_BASE | 0x04) | ||
#define BOOT_EVEC (BOOT_REG_BASE | 0x08) | ||
|
||
void __init ltq_soc_nmi_setup(void) | ||
{ | ||
extern void (*nmi_handler)(void); | ||
|
||
ltq_w32((unsigned long)&nmi_handler, (void *)BOOT_NVEC); | ||
} | ||
|
||
void __init ltq_soc_ejtag_setup(void) | ||
{ | ||
extern void (*ejtag_debug_handler)(void); | ||
|
||
ltq_w32((unsigned long)&ejtag_debug_handler, (void *)BOOT_EVEC); | ||
} | ||
|
||
void __init ltq_soc_detect(struct ltq_soc_info *i) | ||
{ | ||
u32 type; | ||
i->partnum = (ltq_r32(FALCON_CHIPID) & PART_MASK) >> PART_SHIFT; | ||
i->rev = (ltq_r32(FALCON_CHIPID) & REV_MASK) >> REV_SHIFT; | ||
i->srev = ((ltq_r32(FALCON_CHIPCONF) & SREV_MASK) >> SREV_SHIFT); | ||
i->compatible = COMP_FALCON; | ||
i->type = SOC_TYPE_FALCON; | ||
sprintf(i->rev_type, "%c%d%d", (i->srev & 0x4) ? ('B') : ('A'), | ||
i->rev & 0x7, (i->srev & 0x3) + 1); | ||
|
||
switch (i->partnum) { | ||
case SOC_ID_FALCON: | ||
type = (ltq_r32(FALCON_CHIPTYPE) & TYPE_MASK) >> TYPE_SHIFT; | ||
switch (type) { | ||
case 0: | ||
i->name = SOC_FALCON_D; | ||
break; | ||
case 1: | ||
i->name = SOC_FALCON_V; | ||
break; | ||
case 2: | ||
i->name = SOC_FALCON_M; | ||
break; | ||
default: | ||
i->name = SOC_FALCON; | ||
break; | ||
} | ||
break; | ||
|
||
default: | ||
unreachable(); | ||
break; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,90 @@ | ||
/* | ||
* This program is free software; you can redistribute it and/or modify it | ||
* under the terms of the GNU General Public License version 2 as published | ||
* by the Free Software Foundation. | ||
* | ||
* Copyright (C) 2012 Thomas Langer <thomas.langer@lantiq.com> | ||
* Copyright (C) 2012 John Crispin <blogic@openwrt.org> | ||
*/ | ||
|
||
#include <linux/init.h> | ||
#include <linux/io.h> | ||
#include <linux/pm.h> | ||
#include <asm/reboot.h> | ||
#include <linux/export.h> | ||
|
||
#include <lantiq_soc.h> | ||
|
||
/* CPU0 Reset Source Register */ | ||
#define SYS1_CPU0RS 0x0040 | ||
/* reset cause mask */ | ||
#define CPU0RS_MASK 0x0003 | ||
/* CPU0 Boot Mode Register */ | ||
#define SYS1_BM 0x00a0 | ||
/* boot mode mask */ | ||
#define BM_MASK 0x0005 | ||
|
||
/* allow platform code to find out what surce we booted from */ | ||
unsigned char ltq_boot_select(void) | ||
{ | ||
return ltq_sys1_r32(SYS1_BM) & BM_MASK; | ||
} | ||
|
||
/* allow the watchdog driver to find out what the boot reason was */ | ||
int ltq_reset_cause(void) | ||
{ | ||
return ltq_sys1_r32(SYS1_CPU0RS) & CPU0RS_MASK; | ||
} | ||
EXPORT_SYMBOL_GPL(ltq_reset_cause); | ||
|
||
#define BOOT_REG_BASE (KSEG1 | 0x1F200000) | ||
#define BOOT_PW1_REG (BOOT_REG_BASE | 0x20) | ||
#define BOOT_PW2_REG (BOOT_REG_BASE | 0x24) | ||
#define BOOT_PW1 0x4C545100 | ||
#define BOOT_PW2 0x0051544C | ||
|
||
#define WDT_REG_BASE (KSEG1 | 0x1F8803F0) | ||
#define WDT_PW1 0x00BE0000 | ||
#define WDT_PW2 0x00DC0000 | ||
|
||
static void machine_restart(char *command) | ||
{ | ||
local_irq_disable(); | ||
|
||
/* reboot magic */ | ||
ltq_w32(BOOT_PW1, (void *)BOOT_PW1_REG); /* 'LTQ\0' */ | ||
ltq_w32(BOOT_PW2, (void *)BOOT_PW2_REG); /* '\0QTL' */ | ||
ltq_w32(0, (void *)BOOT_REG_BASE); /* reset Bootreg RVEC */ | ||
|
||
/* watchdog magic */ | ||
ltq_w32(WDT_PW1, (void *)WDT_REG_BASE); | ||
ltq_w32(WDT_PW2 | | ||
(0x3 << 26) | /* PWL */ | ||
(0x2 << 24) | /* CLKDIV */ | ||
(0x1 << 31) | /* enable */ | ||
(1), /* reload */ | ||
(void *)WDT_REG_BASE); | ||
unreachable(); | ||
} | ||
|
||
static void machine_halt(void) | ||
{ | ||
local_irq_disable(); | ||
unreachable(); | ||
} | ||
|
||
static void machine_power_off(void) | ||
{ | ||
local_irq_disable(); | ||
unreachable(); | ||
} | ||
|
||
static int __init mips_reboot_setup(void) | ||
{ | ||
_machine_restart = machine_restart; | ||
_machine_halt = machine_halt; | ||
pm_power_off = machine_power_off; | ||
return 0; | ||
} | ||
|
||
arch_initcall(mips_reboot_setup); |
Oops, something went wrong.