Created
November 19, 2016 08:16
-
-
Save yamori813/55788fbf2f50ebaa9c1995dd163f2fe9 to your computer and use it in GitHub Desktop.
Add Mindspeed Comcerto platform support
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
[PATCH 1/3] Add Mindspeed Comcerto platform support | |
stanleymiao at gmail.com stanleymiao at gmail.com | |
Thu Oct 14 04:38:07 EDT 2010 | |
Previous message: Add Mindspeed Comcerto platform support | |
Next message: [PATCH 1/3] Add Mindspeed Comcerto platform support | |
Messages sorted by: [ date ] [ thread ] [ subject ] [ author ] | |
From: Stanley.Miao <stanley.miao at windriver.com> | |
Add Mindspeed Comcerto platform support. Now this patch includes only | |
Multifunction EVM board with Comcerto-1000 CPU. | |
Signed-off-by: Stanley.Miao <stanley.miao at windriver.com> | |
--- | |
arch/arm/Kconfig | 11 ++ | |
arch/arm/Makefile | 1 + | |
arch/arm/boot/compressed/Makefile | 4 + | |
arch/arm/boot/compressed/head-comcerto.S | 6 + | |
arch/arm/boot/compressed/head.S | 5 + | |
arch/arm/mach-comcerto/Kconfig | 32 +++++ | |
arch/arm/mach-comcerto/Makefile | 10 ++ | |
arch/arm/mach-comcerto/Makefile.boot | 2 + | |
arch/arm/mach-comcerto/board-c1kmfcn_evm.c | 88 ++++++++++++ | |
arch/arm/mach-comcerto/comcerto-1000.c | 146 ++++++++++++++++++++ | |
.../arm/mach-comcerto/include/mach/comcerto-1000.h | 91 ++++++++++++ | |
arch/arm/mach-comcerto/include/mach/debug-macro.S | 46 ++++++ | |
arch/arm/mach-comcerto/include/mach/entry-macro.S | 70 ++++++++++ | |
arch/arm/mach-comcerto/include/mach/hardware.h | 37 +++++ | |
arch/arm/mach-comcerto/include/mach/io.h | 32 +++++ | |
arch/arm/mach-comcerto/include/mach/memory.h | 33 +++++ | |
arch/arm/mach-comcerto/include/mach/system.h | 39 +++++ | |
arch/arm/mach-comcerto/include/mach/timex.h | 28 ++++ | |
arch/arm/mach-comcerto/include/mach/uncompress.h | 58 ++++++++ | |
arch/arm/mach-comcerto/include/mach/vmalloc.h | 21 +++ | |
20 files changed, 760 insertions(+), 0 deletions(-) | |
create mode 100644 arch/arm/boot/compressed/head-comcerto.S | |
create mode 100644 arch/arm/mach-comcerto/Kconfig | |
create mode 100644 arch/arm/mach-comcerto/Makefile | |
create mode 100644 arch/arm/mach-comcerto/Makefile.boot | |
create mode 100644 arch/arm/mach-comcerto/board-c1kmfcn_evm.c | |
create mode 100644 arch/arm/mach-comcerto/comcerto-1000.c | |
create mode 100644 arch/arm/mach-comcerto/include/mach/comcerto-1000.h | |
create mode 100644 arch/arm/mach-comcerto/include/mach/debug-macro.S | |
create mode 100644 arch/arm/mach-comcerto/include/mach/entry-macro.S | |
create mode 100644 arch/arm/mach-comcerto/include/mach/hardware.h | |
create mode 100644 arch/arm/mach-comcerto/include/mach/io.h | |
create mode 100644 arch/arm/mach-comcerto/include/mach/memory.h | |
create mode 100644 arch/arm/mach-comcerto/include/mach/system.h | |
create mode 100644 arch/arm/mach-comcerto/include/mach/timex.h | |
create mode 100644 arch/arm/mach-comcerto/include/mach/uncompress.h | |
create mode 100644 arch/arm/mach-comcerto/include/mach/vmalloc.h | |
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig | |
index 88c97bc..ca6ccf7 100644 | |
--- a/arch/arm/Kconfig | |
+++ b/arch/arm/Kconfig | |
@@ -334,6 +334,15 @@ config ARCH_EP93XX | |
help | |
This enables support for the Cirrus EP93xx series of CPUs. | |
+config ARCH_COMCERTO | |
+ bool "Mindspeed Comcerto" | |
+ select ZONE_DMA | |
+ select CPU_V6 | |
+ help | |
+ This enables support for Mindspeed's Comcerto development boards. | |
+ If you would like to build your kernel to run on one of these boards | |
+ then you must say 'Y' here. Otherwise say 'N' | |
+ | |
config ARCH_FOOTBRIDGE | |
bool "FootBridge" | |
select CPU_SA110 | |
@@ -841,6 +850,8 @@ source "arch/arm/mach-clps711x/Kconfig" | |
source "arch/arm/mach-cns3xxx/Kconfig" | |
+source "arch/arm/mach-comcerto/Kconfig" | |
+ | |
source "arch/arm/mach-davinci/Kconfig" | |
source "arch/arm/mach-dove/Kconfig" | |
diff --git a/arch/arm/Makefile b/arch/arm/Makefile | |
index 59c1ce8..2daad67 100644 | |
--- a/arch/arm/Makefile | |
+++ b/arch/arm/Makefile | |
@@ -141,6 +141,7 @@ machine-$(CONFIG_ARCH_INTEGRATOR) := integrator | |
machine-$(CONFIG_ARCH_IOP13XX) := iop13xx | |
machine-$(CONFIG_ARCH_IOP32X) := iop32x | |
machine-$(CONFIG_ARCH_IOP33X) := iop33x | |
+machine-$(CONFIG_ARCH_COMCERTO) := comcerto | |
machine-$(CONFIG_ARCH_IXP2000) := ixp2000 | |
machine-$(CONFIG_ARCH_IXP23XX) := ixp23xx | |
machine-$(CONFIG_ARCH_IXP4XX) := ixp4xx | |
diff --git a/arch/arm/boot/compressed/Makefile b/arch/arm/boot/compressed/Makefile | |
index 65a7c1c..e8419db 100644 | |
--- a/arch/arm/boot/compressed/Makefile | |
+++ b/arch/arm/boot/compressed/Makefile | |
@@ -33,6 +33,10 @@ ifeq ($(CONFIG_CPU_XSCALE),y) | |
OBJS += head-xscale.o | |
endif | |
+ifeq ($(CONFIG_ARCH_COMCERTO),y) | |
+OBJS += head-comcerto.o | |
+endif | |
+ | |
ifeq ($(CONFIG_PXA_SHARPSL_DETECT_MACH_ID),y) | |
OBJS += head-sharpsl.o | |
endif | |
diff --git a/arch/arm/boot/compressed/head-comcerto.S b/arch/arm/boot/compressed/head-comcerto.S | |
new file mode 100644 | |
index 0000000..60160f6 | |
--- /dev/null | |
+++ b/arch/arm/boot/compressed/head-comcerto.S | |
@@ -0,0 +1,6 @@ | |
+#include <asm/mach-types.h> | |
+ | |
+ .section ".start", "ax" | |
+ ldr r7, mach_type | |
+ | |
+mach_type: .word MACH_TYPE_COMCERTO | |
diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S | |
index 6825c34..8f38fbf 100644 | |
--- a/arch/arm/boot/compressed/head.S | |
+++ b/arch/arm/boot/compressed/head.S | |
@@ -66,6 +66,11 @@ wait: mrc p14, 0, pc, c0, c1, 0 | |
add \rb, \rb, #0x00010000 @ Ser1 | |
#endif | |
.endm | |
+#elif defined(CONFIG_ARCH_COMCERTO) | |
+ .macro loadsp, rb, tmp | |
+ mov \rb, #0x10000000 | |
+ orr \rb, \rb, #0x00090000 | |
+ .endm | |
#elif defined(CONFIG_ARCH_S3C2410) | |
.macro loadsp, rb, tmp | |
mov \rb, #0x50000000 | |
diff --git a/arch/arm/mach-comcerto/Kconfig b/arch/arm/mach-comcerto/Kconfig | |
new file mode 100644 | |
index 0000000..a61a31a | |
--- /dev/null | |
+++ b/arch/arm/mach-comcerto/Kconfig | |
@@ -0,0 +1,32 @@ | |
+if ARCH_COMCERTO | |
+ | |
+menu "Comcerto Implementation Options" | |
+ | |
+choice | |
+ prompt "Comcerto System Type" | |
+ default ARCH_M83XXX | |
+ | |
+config ARCH_M83XXX | |
+ bool "M83xxx" | |
+ select GENERIC_TIME | |
+ select GENERIC_CLOCKEVENTS | |
+ help | |
+ Say Y here if you intend to run this kernel with a Comcerto1000 device. | |
+ | |
+endchoice | |
+ | |
+choice | |
+ prompt "Comcerto Board type" | |
+ default EVM_C1KMFCN_EVM | |
+ | |
+config EVM_C1KMFCN_EVM | |
+ bool "C1KMFCN_EVM" | |
+ depends on ARCH_M83XXX | |
+ help | |
+ Say Y here if you intend to run this kernel with a C1K Multifunction EVM board. | |
+ | |
+endchoice | |
+ | |
+endmenu | |
+ | |
+endif | |
diff --git a/arch/arm/mach-comcerto/Makefile b/arch/arm/mach-comcerto/Makefile | |
new file mode 100644 | |
index 0000000..70aac61 | |
--- /dev/null | |
+++ b/arch/arm/mach-comcerto/Makefile | |
@@ -0,0 +1,10 @@ | |
+# | |
+# Makefile for the linux kernel. | |
+# | |
+ | |
+# Object file lists. | |
+ | |
+obj-y := | |
+ | |
+obj-$(CONFIG_ARCH_M83XXX) += comcerto-1000.o | |
+obj-$(CONFIG_EVM_C1KMFCN_EVM) += board-c1kmfcn_evm.o | |
diff --git a/arch/arm/mach-comcerto/Makefile.boot b/arch/arm/mach-comcerto/Makefile.boot | |
new file mode 100644 | |
index 0000000..6262c4b | |
--- /dev/null | |
+++ b/arch/arm/mach-comcerto/Makefile.boot | |
@@ -0,0 +1,2 @@ | |
+zreladdr-y := 0x80808000 | |
+params_phys-y := 0x80800100 | |
diff --git a/arch/arm/mach-comcerto/board-c1kmfcn_evm.c b/arch/arm/mach-comcerto/board-c1kmfcn_evm.c | |
new file mode 100644 | |
index 0000000..74a7da3 | |
--- /dev/null | |
+++ b/arch/arm/mach-comcerto/board-c1kmfcn_evm.c | |
@@ -0,0 +1,88 @@ | |
+/* | |
+ * linux/arch/arm/mach-comcerto/board-c1kmfcn_evm.c | |
+ * | |
+ * Copyright (C) 2004,2008 Mindspeed Technologies, Inc. | |
+ * Copyright (c) 2010 Wind River Systems, Inc. | |
+ * | |
+ * This program is free software; you can redistribute it and/or modify | |
+ * it under the terms of the GNU General Public License as published by | |
+ * the Free Software Foundation; either version 2 of the License, or | |
+ * (at your option) any later version. | |
+ * | |
+ * This program is distributed in the hope that it will be useful, | |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
+ * GNU General Public License for more details. | |
+ * | |
+ * You should have received a copy of the GNU General Public License | |
+ * along with this program; if not, write to the Free Software | |
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
+ */ | |
+#include <linux/sched.h> | |
+#include <linux/device.h> | |
+#include <linux/serial_8250.h> | |
+#include <asm/sizes.h> | |
+#include <asm/setup.h> | |
+#include <asm/mach-types.h> | |
+#include <asm/io.h> | |
+#include <asm/mach/arch.h> | |
+#include <mach/hardware.h> | |
+ | |
+/* -------------------------------------------------------------------- | |
+ * Serial interface | |
+ * -------------------------------------------------------------------- */ | |
+static struct plat_serial8250_port comcerto_uart_data[] = { | |
+ { | |
+ .mapbase = COMCERTO_APB_UART0_BASE, | |
+ .membase = (void *)APB_VADDR(COMCERTO_APB_UART0_BASE), | |
+ .irq = IRQ_UART0, | |
+ .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST, | |
+ .iotype = UPIO_MEM, | |
+ .regshift = 2, | |
+ .uartclk = COMCERTO_DEFAULTAHBCLK * 1000000, | |
+ }, | |
+ { | |
+ .flags = 0, | |
+ }, | |
+}; | |
+ | |
+static struct platform_device comcerto_uart = { | |
+ .name = "serial8250", | |
+ .id = PLAT8250_DEV_PLATFORM, | |
+ .dev = { | |
+ .platform_data = comcerto_uart_data, | |
+ }, | |
+}; | |
+ | |
+static struct platform_device *comcerto_devices[] __initdata = { | |
+ &comcerto_uart, | |
+}; | |
+ | |
+/************************************************************************ | |
+ * Machine definition | |
+ * | |
+ ************************************************************************/ | |
+static void __init platform_map_io(void) | |
+{ | |
+ device_map_io(); | |
+} | |
+ | |
+static void __init platform_irq_init(void) | |
+{ | |
+} | |
+ | |
+static void __init platform_init(void) | |
+{ | |
+ platform_add_devices(comcerto_devices, ARRAY_SIZE(comcerto_devices)); | |
+} | |
+ | |
+MACHINE_START(COMCERTO, "Comcerto 1000 (Multifunction EVM)") | |
+ /* Mindspeed Technologies Inc. */ | |
+ .phys_io = COMCERTO_AHB_APB_BASE, | |
+ .io_pg_offst = ((COMCERTO_AHB_APB_BASE) >> 18) & 0xfffc, | |
+ .boot_params = COMCERTO_SDRAM_BASE + 0x100, | |
+ .map_io = platform_map_io, | |
+ .init_irq = platform_irq_init, | |
+ .init_machine = platform_init, | |
+ .timer = &comcerto_timer, | |
+MACHINE_END | |
diff --git a/arch/arm/mach-comcerto/comcerto-1000.c b/arch/arm/mach-comcerto/comcerto-1000.c | |
new file mode 100644 | |
index 0000000..09032ea | |
--- /dev/null | |
+++ b/arch/arm/mach-comcerto/comcerto-1000.c | |
@@ -0,0 +1,146 @@ | |
+/* | |
+ * linux/arch/arm/mach-comcerto/comcerto-1000.c | |
+ * | |
+ * Copyright (C) 2004,2008 Mindspeed Technologies, Inc. | |
+ * Copyright (c) 2010 Wind River Systems, Inc. | |
+ * | |
+ * This program is free software; you can redistribute it and/or modify | |
+ * it under the terms of the GNU General Public License as published by | |
+ * the Free Software Foundation; either version 2 of the License, or | |
+ * (at your option) any later version. | |
+ * | |
+ * This program is distributed in the hope that it will be useful, | |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
+ * GNU General Public License for more details. | |
+ * | |
+ * You should have received a copy of the GNU General Public License | |
+ * along with this program; if not, write to the Free Software | |
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
+ */ | |
+#include <linux/sched.h> | |
+#include <linux/mm.h> | |
+#include <linux/init.h> | |
+#include <asm/setup.h> | |
+#include <asm/mach-types.h> | |
+#include <asm/io.h> | |
+#include <asm/sizes.h> | |
+#include <asm/mach/arch.h> | |
+#include <asm/mach/map.h> | |
+#include <mach/hardware.h> | |
+ | |
+/*********************************************************** | |
+ * Virtual address Mapping * | |
+ * * | |
+ ***********************************************************/ | |
+ | |
+static struct map_desc comcerto_io_desc[] __initdata = { | |
+ { | |
+ .virtual = SDRAM_MSP_MEMORY_VADDR, | |
+ .pfn = __phys_to_pfn(SDRAM_MSP_MEMORY_PHY), | |
+ .length = SDRAM_MSP_MEMORY_SIZE, | |
+ .type = MT_DEVICE | |
+ }, | |
+ { | |
+ .virtual = ARAM_MEMORY_VADDR, | |
+ .pfn = __phys_to_pfn(COMCERTO_AHB_ARAM_BASE), | |
+ .length = ARAM_MEMORY_SIZE, | |
+ .type = MT_DEVICE | |
+ }, | |
+ { | |
+ .virtual = (ARAM_MEMORY_VADDR + 0x100000), | |
+ .pfn = __phys_to_pfn(COMCERTO_AHB_ARAM_BASE + 0x100000), | |
+ .length = ARAM_MEMORY_SIZE, | |
+ .type = MT_DEVICE | |
+ }, | |
+ { | |
+ .virtual = ARAM_MEMORY_VADDR + 0x100000, | |
+ .pfn = __phys_to_pfn(COMCERTO_AHB_ARAM_BASE + 0x100000), | |
+ .length = ARAM_MEMORY_SIZE, | |
+ .type = MT_DEVICE | |
+ }, | |
+ { | |
+ .virtual = APB_VADDR(COMCERTO_APB_TIMER_BASE), | |
+ .pfn = __phys_to_pfn(COMCERTO_APB_TIMER_BASE), | |
+ .length = SZ_64K, | |
+ .type = MT_DEVICE | |
+ }, | |
+ { | |
+ .virtual = APB_VADDR(COMCERTO_APB_GPIO_BASE), | |
+ .pfn = __phys_to_pfn(COMCERTO_APB_GPIO_BASE), | |
+ .length = SZ_64K, | |
+ .type = MT_DEVICE | |
+ }, | |
+ { | |
+ .virtual = APB_VADDR(COMCERTO_APB_UART0_BASE), | |
+ .pfn = __phys_to_pfn(COMCERTO_APB_UART0_BASE), | |
+ .length = SZ_64K, | |
+ .type = MT_DEVICE | |
+ }, | |
+ { | |
+ .virtual = APB_VADDR(COMCERTO_APB_UART1_BASE), | |
+ .pfn = __phys_to_pfn(COMCERTO_APB_UART1_BASE), | |
+ .length = SZ_64K, | |
+ .type = MT_DEVICE | |
+ }, | |
+ { | |
+ .virtual = APB_VADDR(COMCERTO_APB_SPI_BASE), | |
+ .pfn = __phys_to_pfn(COMCERTO_APB_SPI_BASE), | |
+ .length = SZ_64K, | |
+ .type = MT_DEVICE | |
+ }, | |
+ { | |
+ .virtual = APB_VADDR(COMCERTO_APB_I2C_BASE), | |
+ .pfn = __phys_to_pfn(COMCERTO_APB_I2C_BASE), | |
+ .length = SZ_16K, | |
+ .type = MT_DEVICE | |
+ }, | |
+ { | |
+ .virtual = APB_VADDR(COMCERTO_APB_INTC_BASE), | |
+ .pfn = __phys_to_pfn(COMCERTO_APB_INTC_BASE), | |
+ .length = SZ_64K, | |
+ .type = MT_DEVICE | |
+ }, | |
+ { | |
+ .virtual = APB_VADDR(COMCERTO_APB_CLK_BASE), | |
+ .pfn = __phys_to_pfn(COMCERTO_APB_CLK_BASE), | |
+ .length = SZ_64K, | |
+ .type = MT_DEVICE | |
+ }, | |
+ { | |
+ .virtual = APB_VADDR(COMCERTO_APB_EMAC0_BASE), | |
+ .pfn = __phys_to_pfn(COMCERTO_APB_EMAC0_BASE), | |
+ .length = SZ_64K, | |
+ .type = MT_DEVICE | |
+ }, | |
+ { | |
+ .virtual = APB_VADDR(COMCERTO_APB_EMAC1_BASE), | |
+ .pfn = __phys_to_pfn(COMCERTO_APB_EMAC1_BASE), | |
+ .length = SZ_64K, | |
+ .type = MT_DEVICE | |
+ }, | |
+ { | |
+ .virtual = APB_VADDR(COMCERTO_APB_ARAM_BASE), | |
+ .pfn = __phys_to_pfn(COMCERTO_APB_ARAM_BASE), | |
+ .length = SZ_4K, | |
+ .type = MT_DEVICE | |
+ }, | |
+ { | |
+ .virtual = APB_VADDR(COMCERTO_APB_EXPBUS_BASE), | |
+ .pfn = __phys_to_pfn(COMCERTO_APB_EXPBUS_BASE), | |
+ .length = SZ_64K, | |
+ .type = MT_DEVICE | |
+ }, | |
+ { | |
+ .virtual = COMCERTO_IPSEC_VADDR_BASE, | |
+ .pfn = __phys_to_pfn(COMCERTO_AHB_IPSEC_BASE), | |
+ .length = SZ_1M, | |
+ .type = MT_DEVICE | |
+ }, | |
+}; | |
+ | |
+void __init device_map_io(void) | |
+{ | |
+ iotable_init(comcerto_io_desc, ARRAY_SIZE(comcerto_io_desc)); | |
+} | |
+ | |
diff --git a/arch/arm/mach-comcerto/include/mach/comcerto-1000.h b/arch/arm/mach-comcerto/include/mach/comcerto-1000.h | |
new file mode 100644 | |
index 0000000..f48ae34 | |
--- /dev/null | |
+++ b/arch/arm/mach-comcerto/include/mach/comcerto-1000.h | |
@@ -0,0 +1,91 @@ | |
+/* | |
+ * arch/arm/mach-comcerto/include/mach/comcerto-1000.h | |
+ * | |
+ * Copyright (C) 2008 Mindspeed Technologies, Inc. | |
+ * | |
+ * This program is free software; you can redistribute it and/or modify | |
+ * it under the terms of the GNU General Public License as published by | |
+ * the Free Software Foundation; either version 2 of the License, or | |
+ * (at your option) any later version. | |
+ * | |
+ * This program is distributed in the hope that it will be useful, | |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
+ * GNU General Public License for more details. | |
+ * | |
+ * You should have received a copy of the GNU General Public License | |
+ * along with this program; if not, write to the Free Software | |
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
+ */ | |
+ | |
+#ifndef __ASM_ARCH_COMCERTO1000_H__ | |
+#define __ASM_ARCH_COMCERTO1000_H__ | |
+ | |
+#define COMCERTO_DEFAULTAHBCLK 187 /* MHz */ | |
+#define COMCERTO_PHYCLK 250 /* MHz */ | |
+#define COMCERTO_ARMCLK 650 /* MHz */ | |
+ | |
+/***** Physical address of IO on APB Bus *****/ | |
+ | |
+/* 0x001F0000 Reserved*/ | |
+#define COMCERTO_APB_MDMA_BASE 0x101E0000 | |
+#define COMCERTO_APB_TDMA2_BASE 0x101D0000 | |
+/* 0x101B0000 --> 0x101C0000 Reserved*/ | |
+#define COMCERTO_APB_EXPBUS_BASE 0x101A0000 | |
+#define COMCERTO_APB_EMAC1_BASE 0x10190000 | |
+/* 0x10100000 --> 0x00180000 Reserved*/ | |
+#define COMCERTO_APB_ARAM_BASE 0x100F0000 | |
+/* 0x100E0000 Reserved*/ | |
+#define COMCERTO_APB_EMAC0_BASE 0x100D0000 | |
+/* 0x100C0000 Reserved*/ | |
+#define COMCERTO_APB_CLK_BASE 0x100B0000 | |
+#define COMCERTO_APB_INTC_BASE 0x100A0000 | |
+#define COMCERTO_APB_I2C_BASE 0x1009C000 | |
+#define COMCERTO_APB_SPI_BASE 0x10098000 | |
+#define COMCERTO_APB_UART1_BASE 0x10094000 | |
+#define COMCERTO_APB_UART0_BASE 0x10090000 | |
+/* 0x10080000 Reserved*/ | |
+#define COMCERTO_APB_GPIO_BASE 0x10070000 | |
+#define COMCERTO_APB_PCIePHY_BASE 0x10060000 | |
+#define COMCERTO_APB_TIMER_BASE 0x10050000 | |
+#define COMCERTO_APB_AHB_BASE 0x10040000 | |
+#define COMCERTO_APB_PCIe1_BASE 0x10030000 | |
+#define COMCERTO_APB_TDMA_BASE 0x10020000 | |
+#define COMCERTO_APB_PCIe0_BASE 0x10010000 | |
+#define COMCERTO_APB_TDM_BASE 0x10000000 | |
+ | |
+/***** Physical address on AHB Bus *****/ | |
+#define COMCERTO_AHB_HIGHMEMDDR_BASE 0xFFFF0000 | |
+#define COMCERTO_AHB_DDR_BASE 0x80000000 | |
+#define COMCERTO_AHB_PCIe1_BASE 0x50000000 | |
+#define COMCERTO_AHB_PCIe0_BASE 0x40000000 | |
+#define COMCERTO_AHB_EXP_BASE 0x20000000 | |
+#define COMCERTO_AHB_PCIe1CMD_BASE 0x11410000 | |
+#define COMCERTO_AHB_PCIe0CMD_BASE 0x11400000 | |
+#define COMCERTO_AHB_IBR_BASE 0x11000000 | |
+#define COMCERTO_AHB_APB_BASE 0x10000000 | |
+#define COMCERTO_AHB_USB0_BASE 0x0F000000 | |
+#define COMCERTO_AHB_IPSEC_BASE 0x0E000000 | |
+#define COMCERTO_AHB_DDRCONFIG_BASE 0x0D000000 | |
+#define COMCERTO_AHB_ARAM_BASE 0x0A000000 | |
+ | |
+/* Physical addresses of memories */ | |
+#define COMCERTO_SDRAM_BASE (COMCERTO_AHB_DDR_BASE + SZ_8M) | |
+#define ARAM_MEMORY_SIZE SZ_128K | |
+#define SDRAM_MSP_MEMORY_PHY COMCERTO_AHB_DDR_BASE | |
+#define SDRAM_MSP_MEMORY_SIZE SZ_8M | |
+ | |
+#define IO_SPACE_LIMIT 0 | |
+ | |
+/* | |
+ * Virtual address mapping | |
+ */ | |
+#define SDRAM_MSP_MEMORY_VADDR 0xf0000000 | |
+#define ARAM_MEMORY_VADDR 0xfa000000 | |
+#define COMCERTO_PCIe0CMD_VADDR_BASE 0xfa020000 | |
+#define COMCERTO_PCIe1CMD_VADDR_BASE 0xfa030000 | |
+#define COMCERTO_IPSEC_VADDR_BASE 0xfb000000 | |
+#define APB_VADDR_BASE 0xfc000000 /* VA of IO on APB bus */ | |
+ | |
+#define APB_VADDR(x) ((x) - COMCERTO_AHB_APB_BASE + APB_VADDR_BASE) | |
+#endif | |
diff --git a/arch/arm/mach-comcerto/include/mach/debug-macro.S b/arch/arm/mach-comcerto/include/mach/debug-macro.S | |
new file mode 100644 | |
index 0000000..42bc5a0 | |
--- /dev/null | |
+++ b/arch/arm/mach-comcerto/include/mach/debug-macro.S | |
@@ -0,0 +1,46 @@ | |
+/* | |
+ * arch/arm/mach-comcerto/include/mach/debug-macro.S | |
+ * | |
+ * Copyright (C) 2004,2005 Mindspeed Technologies, Inc. | |
+ * | |
+ * This program is free software; you can redistribute it and/or modify | |
+ * it under the terms of the GNU General Public License as published by | |
+ * the Free Software Foundation; either version 2 of the License, or | |
+ * (at your option) any later version. | |
+ * | |
+ * This program is distributed in the hope that it will be useful, | |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
+ * GNU General Public License for more details. | |
+ * | |
+ * You should have received a copy of the GNU General Public License | |
+ * along with this program; if not, write to the Free Software | |
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
+ */ | |
+ | |
+#define UART_LSR 0x14 | |
+ | |
+ .macro addruart,rx, tmp | |
+ mrc p15, 0, \rx, c1, c0 | |
+ tst \rx, #1 @ MMU enabled? | |
+ moveq \rx, #0x10000000 @ physical base address | |
+ movne \rx, #0xfc000000 @ virtual base | |
+ orr \rx, \rx, #0x00090000 @ UART0 | |
+ .endm | |
+ | |
+ .macro senduart,rd,rx | |
+ strb \rd, [\rx, #0x00] | |
+ .endm | |
+ | |
+ .macro waituart,rd,rx | |
+1001: ldrb \rd, [\rx, #UART_LSR] | |
+ tst \rd, #0x20 @ wait for THRE | |
+ beq 1001b | |
+ .endm | |
+ | |
+ .macro busyuart,rd,rx | |
+1001: ldrb \rd, [\rx, #UART_LSR] | |
+ and \rd, \rd, #0x60 | |
+ teq \rd, #0x60 @ wait for TEMT and THRE | |
+ bne 1001b | |
+ .endm | |
diff --git a/arch/arm/mach-comcerto/include/mach/entry-macro.S b/arch/arm/mach-comcerto/include/mach/entry-macro.S | |
new file mode 100644 | |
index 0000000..442ad92 | |
--- /dev/null | |
+++ b/arch/arm/mach-comcerto/include/mach/entry-macro.S | |
@@ -0,0 +1,70 @@ | |
+/* | |
+ * arch/arm/mach-comcerto/include/mach/entry-macro.S | |
+ * | |
+ * Copyright (C) 2004,2005 Mindspeed Technologies, Inc. | |
+ * | |
+ * This program is free software; you can redistribute it and/or modify | |
+ * it under the terms of the GNU General Public License as published by | |
+ * the Free Software Foundation; either version 2 of the License, or | |
+ * (at your option) any later version. | |
+ * | |
+ * This program is distributed in the hope that it will be useful, | |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
+ * GNU General Public License for more details. | |
+ * | |
+ * You should have received a copy of the GNU General Public License | |
+ * along with this program; if not, write to the Free Software | |
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
+ */ | |
+#include <mach/hardware.h> | |
+ | |
+#if defined(CONFIG_ARCH_COMCERTO) | |
+ .macro disable_fiq | |
+ .endm | |
+ | |
+ .macro get_irqnr_preamble, base, tmp | |
+ .endm | |
+ | |
+ .macro arch_ret_to_user, tmp1, tmp2 | |
+ .endm | |
+ | |
+ .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | |
+ | |
+ mov \irqnr, #0 | |
+ ldr \base, =COMCERTO_INTC_CSP_IRQ_WNR | |
+ ldr \tmp, [\base] | |
+ cmp \tmp, #0 | |
+ beq 10011f | |
+ cmp \tmp, #32 | |
+ movne \irqnr, \tmp | |
+ bne 1004f | |
+ | |
+ | |
+10011: | |
+ mov \irqnr, #0 | |
+ ldr \base, =COMCERTO_INTC_STATUS_REG_1 | |
+ ldr \tmp, =COMCERTO_INTC_CSP_IRQMASK_1 | |
+ ldr \irqstat, [\base] | |
+ ldr \tmp, [\tmp] | |
+ ands \irqstat, \irqstat, \tmp | |
+ beq 1004f | |
+ | |
+ tst \irqstat, #0x2000 | |
+ movne \irqnr,#13 | |
+ bne 1003f | |
+ | |
+1001: tst \irqstat, #1 | |
+ bne 1003f | |
+ add \irqnr, \irqnr, #1 | |
+ mov \irqstat, \irqstat, lsr #1 | |
+ cmp \irqnr, #32 | |
+ bcc 1001b | |
+1003: add \irqnr, \irqnr, #32 | |
+ | |
+1004: | |
+ .endm | |
+ | |
+ .macro irq_prio_table | |
+ .endm | |
+#endif | |
diff --git a/arch/arm/mach-comcerto/include/mach/hardware.h b/arch/arm/mach-comcerto/include/mach/hardware.h | |
new file mode 100644 | |
index 0000000..577289d | |
--- /dev/null | |
+++ b/arch/arm/mach-comcerto/include/mach/hardware.h | |
@@ -0,0 +1,37 @@ | |
+/* | |
+ * arch/arm/mach-comcerto/include/mach/hardware.h | |
+ * | |
+ * Copyright (C) 2006 Mindspeed Technologies, Inc. | |
+ * | |
+ * This program is free software; you can redistribute it and/or modify | |
+ * it under the terms of the GNU General Public License as published by | |
+ * the Free Software Foundation; either version 2 of the License, or | |
+ * (at your option) any later version. | |
+ * | |
+ * This program is distributed in the hope that it will be useful, | |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
+ * GNU General Public License for more details. | |
+ * | |
+ * You should have received a copy of the GNU General Public License | |
+ * along with this program; if not, write to the Free Software | |
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
+ */ | |
+ | |
+#ifndef __ASM_ARCH_HARDWARE_H | |
+#define __ASM_ARCH_HARDWARE_H | |
+ | |
+/***** Device *****/ | |
+#if defined(CONFIG_ARCH_M83XXX) | |
+ #include <mach/comcerto-1000.h> | |
+#else | |
+ #error "mach/hardware.h : Unknown architecture" | |
+#endif | |
+ | |
+#ifndef __ASSEMBLY__ | |
+struct sys_timer; | |
+extern struct sys_timer comcerto_timer; | |
+extern void device_map_io(void); | |
+#endif | |
+ | |
+#endif | |
diff --git a/arch/arm/mach-comcerto/include/mach/io.h b/arch/arm/mach-comcerto/include/mach/io.h | |
new file mode 100644 | |
index 0000000..be3320f | |
--- /dev/null | |
+++ b/arch/arm/mach-comcerto/include/mach/io.h | |
@@ -0,0 +1,32 @@ | |
+/* | |
+ * arch/arm/mach-comcerto/include/mach/io.h | |
+ * | |
+ * Copyright (C) 2004,2005 Mindspeed Technologies, Inc. | |
+ * | |
+ * This program is free software; you can redistribute it and/or modify | |
+ * it under the terms of the GNU General Public License as published by | |
+ * the Free Software Foundation; either version 2 of the License, or | |
+ * (at your option) any later version. | |
+ * | |
+ * This program is distributed in the hope that it will be useful, | |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
+ * GNU General Public License for more details. | |
+ * | |
+ * You should have received a copy of the GNU General Public License | |
+ * along with this program; if not, write to the Free Software | |
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
+ */ | |
+#ifndef __ASM_ARCH_COMCERTO1000_IO_H | |
+#define __ASM_ARCH_COMCERTO1000_IO_H | |
+ | |
+#include <asm/io.h> | |
+ | |
+#if !defined(CONFIG_PCI) | |
+ | |
+#define __io(a) ((void __iomem *)(a)) | |
+#define __mem_pci(a) (a) | |
+ | |
+#endif | |
+ | |
+#endif /* __ASM_ARCH_COMCERTO1000_IO_H */ | |
diff --git a/arch/arm/mach-comcerto/include/mach/memory.h b/arch/arm/mach-comcerto/include/mach/memory.h | |
new file mode 100644 | |
index 0000000..6d42d06 | |
--- /dev/null | |
+++ b/arch/arm/mach-comcerto/include/mach/memory.h | |
@@ -0,0 +1,33 @@ | |
+/* | |
+ * arch/arm/mach-comcerto/include/mach/memory.h | |
+ * | |
+ * Copyright (C) 2006 Mindspeed Technologies, Inc. | |
+ * | |
+ * This program is free software; you can redistribute it and/or modify | |
+ * it under the terms of the GNU General Public License as published by | |
+ * the Free Software Foundation; either version 2 of the License, or | |
+ * (at your option) any later version. | |
+ * | |
+ * This program is distributed in the hope that it will be useful, | |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
+ * GNU General Public License for more details. | |
+ * | |
+ * You should have received a copy of the GNU General Public License | |
+ * along with this program; if not, write to the Free Software | |
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
+ */ | |
+ | |
+#ifndef __ASM_ARCH_MEMORY_H | |
+#define __ASM_ARCH_MEMORY_H | |
+ | |
+#include <mach/hardware.h> | |
+ | |
+#define PHYS_OFFSET COMCERTO_SDRAM_BASE | |
+ | |
+#define __virt_to_bus(x) __virt_to_phys(x) | |
+#define __bus_to_virt(x) __phys_to_virt(x) | |
+#define __pfn_to_bus(x) __pfn_to_phys(x) | |
+#define __bus_to_pfn(x) __phys_to_pfn(x) | |
+ | |
+#endif | |
diff --git a/arch/arm/mach-comcerto/include/mach/system.h b/arch/arm/mach-comcerto/include/mach/system.h | |
new file mode 100644 | |
index 0000000..364cc7e | |
--- /dev/null | |
+++ b/arch/arm/mach-comcerto/include/mach/system.h | |
@@ -0,0 +1,39 @@ | |
+/* | |
+ * arch/arm/mach-comcerto/include/mach/system.h | |
+ * | |
+ * Copyright (C) 2004,2005 Mindspeed Technologies, Inc. | |
+ * | |
+ * This program is free software; you can redistribute it and/or modify | |
+ * it under the terms of the GNU General Public License as published by | |
+ * the Free Software Foundation; either version 2 of the License, or | |
+ * (at your option) any later version. | |
+ * | |
+ * This program is distributed in the hope that it will be useful, | |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
+ * GNU General Public License for more details. | |
+ * | |
+ * You should have received a copy of the GNU General Public License | |
+ * along with this program; if not, write to the Free Software | |
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
+ */ | |
+#ifndef __ASM_ARCH_SYSTEM_H | |
+#define __ASM_ARCH_SYSTEM_H | |
+ | |
+#include <mach/hardware.h> | |
+#include <asm/io.h> | |
+ | |
+static inline void arch_idle(void) | |
+{ | |
+ /* | |
+ * This should do all the clock switching | |
+ * and wait for interrupt tricks | |
+ */ | |
+ cpu_do_idle(); | |
+} | |
+ | |
+static inline void arch_reset(char mode, const char *cmd) | |
+{ | |
+} | |
+ | |
+#endif /* __ASM_ARCH_SYSTEM_H */ | |
diff --git a/arch/arm/mach-comcerto/include/mach/timex.h b/arch/arm/mach-comcerto/include/mach/timex.h | |
new file mode 100644 | |
index 0000000..4ca125d | |
--- /dev/null | |
+++ b/arch/arm/mach-comcerto/include/mach/timex.h | |
@@ -0,0 +1,28 @@ | |
+/* | |
+ * linux/include/asm-arm/arch-comcerto/timex.h | |
+ * | |
+ * Copyright (C) 2006 Mindspeed Technologies, Inc. | |
+ * | |
+ * This program is free software; you can redistribute it and/or modify | |
+ * it under the terms of the GNU General Public License as published by | |
+ * the Free Software Foundation; either version 2 of the License, or | |
+ * (at your option) any later version. | |
+ * | |
+ * This program is distributed in the hope that it will be useful, | |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
+ * GNU General Public License for more details. | |
+ * | |
+ * You should have received a copy of the GNU General Public License | |
+ * along with this program; if not, write to the Free Software | |
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
+ */ | |
+ | |
+#ifndef __ASM_ARCH_TIMEX_H__ | |
+#define __ASM_ARCH_TIMEX_H__ | |
+ | |
+#include <mach/hardware.h> | |
+ | |
+#define CLOCK_TICK_RATE (COMCERTO_DEFAULTAHBCLK * 1000 * 1000) | |
+ | |
+#endif | |
diff --git a/arch/arm/mach-comcerto/include/mach/uncompress.h b/arch/arm/mach-comcerto/include/mach/uncompress.h | |
new file mode 100644 | |
index 0000000..e3e6938 | |
--- /dev/null | |
+++ b/arch/arm/mach-comcerto/include/mach/uncompress.h | |
@@ -0,0 +1,58 @@ | |
+/* | |
+ * arch/arm/mach-comcerto/include/mach/uncompress.h | |
+ * | |
+ * Copyright (C) 2004,2008 Mindspeed Technologies, Inc. | |
+ * | |
+ * This program is free software; you can redistribute it and/or modify | |
+ * it under the terms of the GNU General Public License as published by | |
+ * the Free Software Foundation; either version 2 of the License, or | |
+ * (at your option) any later version. | |
+ * | |
+ * This program is distributed in the hope that it will be useful, | |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
+ * GNU General Public License for more details. | |
+ * | |
+ * You should have received a copy of the GNU General Public License | |
+ * along with this program; if not, write to the Free Software | |
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
+ */ | |
+#ifndef __ASM_ARCH_UNCOMPRESS_H | |
+#define __ASM_ARCH_UNCOMPRESS_H | |
+ | |
+#define UART_DR (*(volatile unsigned long *)0x10090000) | |
+#define UART_LSR (*(volatile unsigned long *)0x10090014) | |
+ | |
+static inline void putc(int c) | |
+{ | |
+ while (!(UART_LSR & 0x20)) | |
+ barrier(); | |
+ | |
+ UART_DR = c; | |
+} | |
+ | |
+static void flush(void) | |
+{ | |
+} | |
+static inline void puts(const char *ptr) | |
+{ | |
+ char c; | |
+ | |
+ while ((c = *ptr++) != '\0') { | |
+ if (c == '\n') | |
+ putc('\r'); | |
+ putc(c); | |
+ } | |
+ | |
+ flush(); | |
+ | |
+} | |
+ | |
+/* | |
+ * nothing to do | |
+ */ | |
+#define arch_decomp_setup() | |
+ | |
+#define arch_decomp_wdog() | |
+ | |
+#endif /* __ASM_ARCH_UNCOMPRESS_H */ | |
diff --git a/arch/arm/mach-comcerto/include/mach/vmalloc.h b/arch/arm/mach-comcerto/include/mach/vmalloc.h | |
new file mode 100644 | |
index 0000000..f807501 | |
--- /dev/null | |
+++ b/arch/arm/mach-comcerto/include/mach/vmalloc.h | |
@@ -0,0 +1,21 @@ | |
+/* | |
+ * arch/arm/mach-comcerto/include/mach/vmalloc.h | |
+ * | |
+ * Copyright (C) 2004,2005 Mindspeed Technologies, Inc. | |
+ * | |
+ * This program is free software; you can redistribute it and/or modify | |
+ * it under the terms of the GNU General Public License as published by | |
+ * the Free Software Foundation; either version 2 of the License, or | |
+ * (at your option) any later version. | |
+ * | |
+ * This program is distributed in the hope that it will be useful, | |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
+ * GNU General Public License for more details. | |
+ * | |
+ * You should have received a copy of the GNU General Public License | |
+ * along with this program; if not, write to the Free Software | |
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
+ */ | |
+ | |
+#define VMALLOC_END (0xF0000000) | |
-- | |
1.5.4.3 | |
Previous message: Add Mindspeed Comcerto platform support | |
Next message: [PATCH 1/3] Add Mindspeed Comcerto platform support | |
Messages sorted by: [ date ] [ thread ] [ subject ] [ author ] | |
More information about the linux-arm-kernel mailing list |
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
[PATCH 2/3] Add hardware timer support for Mindspeed Comcerto platflorm | |
stanleymiao at gmail.com stanleymiao at gmail.com | |
Thu Oct 14 04:38:08 EDT 2010 | |
Previous message: Add Mindspeed Comcerto platform support | |
Next message: [PATCH 3/3] Add irqs definition and handler for Mindspeed Comcerto platform | |
Messages sorted by: [ date ] [ thread ] [ subject ] [ author ] | |
From: Stanley.Miao <stanley.miao at windriver.com> | |
Add hardware timer support for Comcerto platflorm. Timer0 is used by MSP | |
and timer2 is used by fpp, so we choose timer1 for clockevent and timer3 for | |
clocksource. | |
Signed-off-by: Stanley.Miao <stanley.miao at windriver.com> | |
--- | |
arch/arm/mach-comcerto/Makefile | 2 +- | |
.../arm/mach-comcerto/include/mach/comcerto-1000.h | 3 + | |
.../include/mach/comcerto-1000/timer.h | 62 ++++++ | |
arch/arm/mach-comcerto/include/mach/system.h | 3 + | |
arch/arm/mach-comcerto/time.c | 227 ++++++++++++++++++++ | |
5 files changed, 296 insertions(+), 1 deletions(-) | |
create mode 100644 arch/arm/mach-comcerto/include/mach/comcerto-1000/timer.h | |
create mode 100644 arch/arm/mach-comcerto/time.c | |
diff --git a/arch/arm/mach-comcerto/Makefile b/arch/arm/mach-comcerto/Makefile | |
index 70aac61..c514d20 100644 | |
--- a/arch/arm/mach-comcerto/Makefile | |
+++ b/arch/arm/mach-comcerto/Makefile | |
@@ -4,7 +4,7 @@ | |
# Object file lists. | |
-obj-y := | |
+obj-y := time.o | |
obj-$(CONFIG_ARCH_M83XXX) += comcerto-1000.o | |
obj-$(CONFIG_EVM_C1KMFCN_EVM) += board-c1kmfcn_evm.o | |
diff --git a/arch/arm/mach-comcerto/include/mach/comcerto-1000.h b/arch/arm/mach-comcerto/include/mach/comcerto-1000.h | |
index f48ae34..10086c4 100644 | |
--- a/arch/arm/mach-comcerto/include/mach/comcerto-1000.h | |
+++ b/arch/arm/mach-comcerto/include/mach/comcerto-1000.h | |
@@ -88,4 +88,7 @@ | |
#define APB_VADDR_BASE 0xfc000000 /* VA of IO on APB bus */ | |
#define APB_VADDR(x) ((x) - COMCERTO_AHB_APB_BASE + APB_VADDR_BASE) | |
+ | |
+#include <mach/comcerto-1000/timer.h> | |
+ | |
#endif | |
diff --git a/arch/arm/mach-comcerto/include/mach/comcerto-1000/timer.h b/arch/arm/mach-comcerto/include/mach/comcerto-1000/timer.h | |
new file mode 100644 | |
index 0000000..5372e37 | |
--- /dev/null | |
+++ b/arch/arm/mach-comcerto/include/mach/comcerto-1000/timer.h | |
@@ -0,0 +1,62 @@ | |
+/* | |
+ * arch/arm/mach-comcerto/include/mach/comcerto-1000/timer.h | |
+ * | |
+ * Copyright (C) 2004-2008 Mindspeed Technologies, Inc. | |
+ * | |
+ * This program is free software; you can redistribute it and/or modify | |
+ * it under the terms of the GNU General Public License as published by | |
+ * the Free Software Foundation; either version 2 of the License, or | |
+ * (at your option) any later version. | |
+ * | |
+ * This program is distributed in the hope that it will be useful, | |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
+ * GNU General Public License for more details. | |
+ * | |
+ * You should have received a copy of the GNU General Public License | |
+ * along with this program; if not, write to the Free Software | |
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
+ */ | |
+ | |
+#ifndef __TIMER_H__ | |
+#define __TIMER_H__ | |
+ | |
+/* Comcerto Timers */ | |
+#define COMCERTO_TIMER0_HIGH_BOUND APB_VADDR(COMCERTO_APB_TIMER_BASE + 0x00) | |
+#define COMCERTO_TIMER0_CURRENT_COUNT APB_VADDR(COMCERTO_APB_TIMER_BASE + 0x04) | |
+#define COMCERTO_TIMER1_HIGH_BOUND APB_VADDR(COMCERTO_APB_TIMER_BASE + 0x08) | |
+#define COMCERTO_TIMER1_CURRENT_COUNT APB_VADDR(COMCERTO_APB_TIMER_BASE + 0x0C) | |
+#define COMCERTO_TIMER1_LOW_BOUND APB_VADDR(COMCERTO_APB_TIMER_BASE + 0x0C) | |
+#define COMCERTO_TIMER2_LOW_BOUND APB_VADDR(COMCERTO_APB_TIMER_BASE + 0x10) | |
+#define COMCERTO_TIMER2_HIGH_BOUND APB_VADDR(COMCERTO_APB_TIMER_BASE + 0x14) | |
+#define COMCERTO_TIMER2_CTRL APB_VADDR(COMCERTO_APB_TIMER_BASE + 0x18) | |
+#define COMCERTO_TIMER2_CURRENT_COUNT APB_VADDR(COMCERTO_APB_TIMER_BASE + 0x1C) | |
+#define COMCERTO_TIMER3_LOW_BOUND APB_VADDR(COMCERTO_APB_TIMER_BASE + 0x20) | |
+#define COMCERTO_TIMER3_HIGH_BOUND APB_VADDR(COMCERTO_APB_TIMER_BASE + 0x24) | |
+#define COMCERTO_TIMER3_CTRL APB_VADDR(COMCERTO_APB_TIMER_BASE + 0x28) | |
+#define COMCERTO_TIMER3_CURRENT_COUNT APB_VADDR(COMCERTO_APB_TIMER_BASE + 0x2C) | |
+#define COMCERTO_TIMER4_HIGH_BOUND APB_VADDR(COMCERTO_APB_TIMER_BASE + 0x30) | |
+#define COMCERTO_TIMER4_CURRENT_COUNT APB_VADDR(COMCERTO_APB_TIMER_BASE + 0x34) | |
+#define COMCERTO_TIMER5_LOW_BOUND APB_VADDR(COMCERTO_APB_TIMER_BASE + 0x38) | |
+#define COMCERTO_TIMER5_HIGH_BOUND APB_VADDR(COMCERTO_APB_TIMER_BASE + 0x3C) | |
+#define COMCERTO_TIMER5_CURRENT_COUNT APB_VADDR(COMCERTO_APB_TIMER_BASE + 0x40) | |
+#define COMCERTO_TIMER5_CTRL APB_VADDR(COMCERTO_APB_TIMER_BASE + 0x44) | |
+#define COMCERTO_TIMER_IRQ_MASK APB_VADDR(COMCERTO_APB_TIMER_BASE + 0x48) | |
+#define COMCERTO_TIMER_STATUS APB_VADDR(COMCERTO_APB_TIMER_BASE + 0x50) | |
+#define COMCERTO_TIMER_STATUS_CLR APB_VADDR(COMCERTO_APB_TIMER_BASE + 0x50) | |
+#define COMCERTO_TIMER_WDT_HIGH_BOUND APB_VADDR(COMCERTO_APB_TIMER_BASE + 0xD0) | |
+#define COMCERTO_TIMER_WDT_CONTROL APB_VADDR(COMCERTO_APB_TIMER_BASE + 0xD4) | |
+#define COMCERTO_TIMER_WDT_CURRENT_COUNT APB_VADDR(COMCERTO_APB_TIMER_BASE + 0xD8) | |
+ | |
+#define COMCERTO_TIMER_WDT_CONTROL_TIMER_ENABLE (1 << 0) | |
+ | |
+/* COMCERTO_TIMER_IRQ_MASK */ | |
+#define COMCERTO_TIMER0 0x01 | |
+#define COMCERTO_TIMER1 0x02 | |
+#define COMCERTO_TIMER2 0x04 | |
+#define COMCERTO_TIMER3 0x08 | |
+#define COMCERTO_TIMER4 0x10 | |
+#define COMCERTO_TIMER5 0x20 | |
+#define COMCERTO_ALL 0xFF | |
+#define COMCERTO_TIMER_CSP (COMCERTO_TIMER1 | COMCERTO_TIMER2 | COMCERTO_TIMER3 | COMCERTO_TIMER4 | COMCERTO_TIMER5) | |
+#endif | |
diff --git a/arch/arm/mach-comcerto/include/mach/system.h b/arch/arm/mach-comcerto/include/mach/system.h | |
index 364cc7e..d24914d 100644 | |
--- a/arch/arm/mach-comcerto/include/mach/system.h | |
+++ b/arch/arm/mach-comcerto/include/mach/system.h | |
@@ -34,6 +34,9 @@ static inline void arch_idle(void) | |
static inline void arch_reset(char mode, const char *cmd) | |
{ | |
+ /* use watch dog timer to reset the board */ | |
+ __raw_writel(0x1, COMCERTO_TIMER_WDT_CONTROL); | |
+ __raw_writel(0x1, COMCERTO_TIMER_WDT_HIGH_BOUND); | |
} | |
#endif /* __ASM_ARCH_SYSTEM_H */ | |
diff --git a/arch/arm/mach-comcerto/time.c b/arch/arm/mach-comcerto/time.c | |
new file mode 100644 | |
index 0000000..40e3515 | |
--- /dev/null | |
+++ b/arch/arm/mach-comcerto/time.c | |
@@ -0,0 +1,227 @@ | |
+/* | |
+ * linux/arch/arm/mach-comcerto/time.c | |
+ * | |
+ * Copyright (C) 2008 Mindspeed Technologies, Inc. | |
+ * Copyright (c) 2010 Wind River Systems, Inc. | |
+ * | |
+ * 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. | |
+ * | |
+ * This program is distributed in the hope that it will be useful, | |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | |
+ * See the GNU General Public License for more details. | |
+ * | |
+ * You should have received a copy of the GNU General Public License | |
+ * along with this program; if not, write to the Free Software | |
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
+ */ | |
+ | |
+#include <linux/kernel.h> | |
+#include <linux/init.h> | |
+#include <linux/types.h> | |
+#include <linux/interrupt.h> | |
+#include <linux/clocksource.h> | |
+#include <linux/clockchips.h> | |
+#include <linux/io.h> | |
+#include <linux/clk.h> | |
+#include <linux/irq.h> | |
+#include <linux/err.h> | |
+ | |
+#include <mach/hardware.h> | |
+#include <asm/mach/time.h> | |
+ | |
+#define TID_CLOCKEVENT 1 | |
+#define TID_CLOCKSOURCE 3 | |
+ | |
+static DEFINE_SPINLOCK(timer_lock); | |
+ | |
+struct comcerto_gptimer { | |
+ char *name; | |
+ unsigned long id; /* maybe not needed */ | |
+ unsigned long mask; | |
+ unsigned long hbound; | |
+ unsigned long lbound; | |
+ unsigned long count; | |
+}; | |
+ | |
+static void gptimer_enable(struct comcerto_gptimer *gptimer) | |
+{ | |
+ unsigned long flags; | |
+ unsigned long irq_mask; | |
+ | |
+ spin_lock_irqsave(&timer_lock, flags); | |
+ irq_mask = __raw_readl(COMCERTO_TIMER_IRQ_MASK); | |
+ irq_mask |= gptimer->mask; | |
+ __raw_writel(irq_mask, COMCERTO_TIMER_IRQ_MASK); | |
+ spin_unlock_irqrestore(&timer_lock, flags); | |
+} | |
+ | |
+static void gptimer_disable(struct comcerto_gptimer *gptimer) | |
+{ | |
+ unsigned long flags; | |
+ unsigned long irq_mask; | |
+ | |
+ spin_lock_irqsave(&timer_lock, flags); | |
+ irq_mask = __raw_readl(COMCERTO_TIMER_IRQ_MASK); | |
+ irq_mask &= ~gptimer->mask; | |
+ __raw_writel(irq_mask, COMCERTO_TIMER_IRQ_MASK); | |
+ spin_unlock_irqrestore(&timer_lock, flags); | |
+} | |
+ | |
+static struct comcerto_gptimer timers[] = { | |
+ [TID_CLOCKEVENT] = { | |
+ .name = "timer1", | |
+ .id = TID_CLOCKEVENT, | |
+ .mask = COMCERTO_TIMER1, | |
+ .hbound = COMCERTO_TIMER1_HIGH_BOUND, | |
+ .lbound = COMCERTO_TIMER1_LOW_BOUND, | |
+ .count = COMCERTO_TIMER1_CURRENT_COUNT, | |
+ }, | |
+ [TID_CLOCKSOURCE] = { | |
+ .name = "timer3", | |
+ .id = TID_CLOCKSOURCE, | |
+ .mask = COMCERTO_TIMER3, | |
+ .hbound = COMCERTO_TIMER3_HIGH_BOUND, | |
+ .lbound = COMCERTO_TIMER3_LOW_BOUND, | |
+ .count = COMCERTO_TIMER3_CURRENT_COUNT, | |
+ }, | |
+}; | |
+ | |
+static void gptimer_set_bound(struct comcerto_gptimer *gptimer, | |
+ unsigned low, unsigned high) | |
+{ | |
+ __raw_writel(high, gptimer->hbound); | |
+ /* __raw_writel(low, gptimer->lbound); */ | |
+} | |
+ | |
+static void gptimer_clear_status(struct comcerto_gptimer *gptimer) | |
+{ | |
+ __raw_writel(gptimer->mask, COMCERTO_TIMER_STATUS_CLR); | |
+} | |
+ | |
+static unsigned long gptimer_get_current_count(struct comcerto_gptimer *timer) | |
+{ | |
+ return __raw_readl(timer->count); | |
+} | |
+ | |
+static int comcerto_set_next_event(unsigned long cycles, | |
+ struct clock_event_device *evt) | |
+{ | |
+ struct comcerto_gptimer *t = &timers[TID_CLOCKEVENT]; | |
+ | |
+ if (evt->mode == CLOCK_EVT_MODE_ONESHOT) | |
+ gptimer_enable(t); | |
+ return 0; | |
+} | |
+ | |
+static void comcerto_set_mode(enum clock_event_mode mode, | |
+ struct clock_event_device *evt) | |
+{ | |
+ struct comcerto_gptimer *t = &timers[TID_CLOCKEVENT]; | |
+ | |
+ if (mode != CLOCK_EVT_MODE_PERIODIC) | |
+ gptimer_disable(t); | |
+ else | |
+ gptimer_enable(t); | |
+} | |
+ | |
+static struct clock_event_device clockevent = { | |
+ .name = "clockevent", | |
+ .features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT, | |
+ .rating = 200, | |
+ .shift = 24, | |
+ .set_mode = comcerto_set_mode, | |
+ .set_next_event = comcerto_set_next_event, | |
+}; | |
+ | |
+static cycle_t comcerto_timer3_read(struct clocksource *cs) | |
+{ | |
+ return (cycle_t)gptimer_get_current_count(&timers[TID_CLOCKSOURCE]); | |
+} | |
+ | |
+static struct clocksource clocksource = { | |
+ .name = "clocksource", | |
+ .rating = 200, | |
+ .read = comcerto_timer3_read, | |
+ .mask = CLOCKSOURCE_MASK(32), | |
+ .shift = 24, | |
+ .flags = CLOCK_SOURCE_IS_CONTINUOUS, | |
+}; | |
+ | |
+static void __init comcerto_clocksource_init(void) | |
+{ | |
+ struct comcerto_gptimer *t = &timers[TID_CLOCKSOURCE]; | |
+ | |
+ gptimer_set_bound(t, 0, 0xffffffff); | |
+ clocksource.mult = clocksource_hz2mult(COMCERTO_DEFAULTAHBCLK, clocksource.shift); | |
+ if (clocksource_register(&clocksource)) | |
+ printk(KERN_ERR "%s: can't register clocksource!\n", clocksource.name); | |
+} | |
+ | |
+static irqreturn_t comcerto_timer1_interrupt(int irq, void *dev_id) | |
+{ | |
+ u32 status; | |
+ struct comcerto_gptimer *t = &timers[TID_CLOCKEVENT]; | |
+ struct clock_event_device *dev = &clockevent; | |
+ | |
+ status = __raw_readl(COMCERTO_TIMER_STATUS) & __raw_readl(COMCERTO_TIMER_IRQ_MASK); | |
+ | |
+ /* timer1 expired */ | |
+ if (status & t->mask) { | |
+ /* we need to disable interrupt to simulate ONESHOT mode, | |
+ * do it before clearing the interrupt to avoid race */ | |
+ if (dev->mode != CLOCK_EVT_MODE_PERIODIC) | |
+ gptimer_disable(t); | |
+ | |
+ gptimer_clear_status(t); | |
+ dev->event_handler(dev); | |
+ | |
+ return IRQ_HANDLED; | |
+ } | |
+ | |
+ return IRQ_NONE; | |
+} | |
+ | |
+static struct irqaction comcerto_timer1_irq = { | |
+ .name = "timer1", | |
+ .flags = IRQF_DISABLED | IRQF_TIMER, | |
+ .handler = comcerto_timer1_interrupt, | |
+}; | |
+ | |
+static void __init comcerto_clockevents_init(void) | |
+{ | |
+ struct comcerto_gptimer *t = &timers[TID_CLOCKEVENT]; | |
+ | |
+ clockevent.mult = div_sc(COMCERTO_DEFAULTAHBCLK, NSEC_PER_SEC, clockevent.shift); | |
+ clockevent.max_delta_ns = clockevent_delta2ns(0x3fffffff, &clockevent); | |
+ clockevent.min_delta_ns = clockevent_delta2ns(1, &clockevent); | |
+ clockevent.cpumask = cpumask_of(0); | |
+ clockevents_register_device(&clockevent); | |
+ | |
+ /* Clear all the timers except timer0 */ | |
+ __raw_writel(COMCERTO_TIMER_CSP, COMCERTO_TIMER_STATUS); | |
+ | |
+ /* Register interrupt handler for interrupt on IRQ_TIMERB*/ | |
+ setup_irq(IRQ_TIMER1, &comcerto_timer1_irq); | |
+ | |
+ /* Set and enable the system timer */ | |
+ gptimer_set_bound(t, 0, COMCERTO_DEFAULTAHBCLK * 1000000 / HZ); | |
+} | |
+ | |
+static void __init comcerto_timer_init(void) | |
+{ | |
+ /* | |
+ * DO NOT MODIFY THE CONFIGURATION OF TIMER0 | |
+ * It is used by the MSP | |
+ * For C1000 FPP will be using TIMER2 | |
+ */ | |
+ | |
+ comcerto_clocksource_init(); | |
+ comcerto_clockevents_init(); | |
+} | |
+ | |
+struct sys_timer comcerto_timer = { | |
+ .init = comcerto_timer_init, | |
+}; | |
-- | |
1.5.4.3 | |
Previous message: Add Mindspeed Comcerto platform support | |
Next message: [PATCH 3/3] Add irqs definition and handler for Mindspeed Comcerto platform | |
Messages sorted by: [ date ] [ thread ] [ subject ] [ author ] | |
More information about the linux-arm-kernel mailing list |
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
[PATCH 3/3] Add irqs definition and handler for Mindspeed Comcerto platform | |
stanleymiao at gmail.com stanleymiao at gmail.com | |
Thu Oct 14 04:38:09 EDT 2010 | |
Previous message: [PATCH 2/3] Add hardware timer support for Mindspeed Comcerto platflorm | |
Next message: [PATCH 2/3] Add hardware timer support for Mindspeed Comcerto platflorm | |
Messages sorted by: [ date ] [ thread ] [ subject ] [ author ] | |
From: Stanley.Miao <stanley.miao at windriver.com> | |
the Comcerto interrupt controller supports more than 32 peripheral interrupts, | |
so two interrupt status registers and associated mask registers are required. | |
Signed-off-by: Stanley.Miao <stanley.miao at windriver.com> | |
--- | |
arch/arm/mach-comcerto/Makefile | 2 +- | |
arch/arm/mach-comcerto/board-c1kmfcn_evm.c | 1 + | |
arch/arm/mach-comcerto/comcerto-1000.c | 41 ++++ | |
.../arm/mach-comcerto/include/mach/comcerto-1000.h | 1 + | |
.../include/mach/comcerto-1000/intr.h | 78 ++++++++ | |
.../include/mach/comcerto-1000/irqs.h | 121 ++++++++++++ | |
arch/arm/mach-comcerto/include/mach/hardware.h | 1 + | |
arch/arm/mach-comcerto/include/mach/irq.h | 155 +++++++++++++++ | |
arch/arm/mach-comcerto/include/mach/irqs.h | 21 ++ | |
arch/arm/mach-comcerto/irq.c | 200 ++++++++++++++++++++ | |
10 files changed, 620 insertions(+), 1 deletions(-) | |
create mode 100644 arch/arm/mach-comcerto/include/mach/comcerto-1000/intr.h | |
create mode 100644 arch/arm/mach-comcerto/include/mach/comcerto-1000/irqs.h | |
create mode 100644 arch/arm/mach-comcerto/include/mach/irq.h | |
create mode 100644 arch/arm/mach-comcerto/include/mach/irqs.h | |
create mode 100644 arch/arm/mach-comcerto/irq.c | |
diff --git a/arch/arm/mach-comcerto/Makefile b/arch/arm/mach-comcerto/Makefile | |
index c514d20..b4c369d 100644 | |
--- a/arch/arm/mach-comcerto/Makefile | |
+++ b/arch/arm/mach-comcerto/Makefile | |
@@ -4,7 +4,7 @@ | |
# Object file lists. | |
-obj-y := time.o | |
+obj-y := irq.o time.o | |
obj-$(CONFIG_ARCH_M83XXX) += comcerto-1000.o | |
obj-$(CONFIG_EVM_C1KMFCN_EVM) += board-c1kmfcn_evm.o | |
diff --git a/arch/arm/mach-comcerto/board-c1kmfcn_evm.c b/arch/arm/mach-comcerto/board-c1kmfcn_evm.c | |
index 74a7da3..3dd0b6f 100644 | |
--- a/arch/arm/mach-comcerto/board-c1kmfcn_evm.c | |
+++ b/arch/arm/mach-comcerto/board-c1kmfcn_evm.c | |
@@ -69,6 +69,7 @@ static void __init platform_map_io(void) | |
static void __init platform_irq_init(void) | |
{ | |
+ device_irq_init(); | |
} | |
static void __init platform_init(void) | |
diff --git a/arch/arm/mach-comcerto/comcerto-1000.c b/arch/arm/mach-comcerto/comcerto-1000.c | |
index 09032ea..2503871 100644 | |
--- a/arch/arm/mach-comcerto/comcerto-1000.c | |
+++ b/arch/arm/mach-comcerto/comcerto-1000.c | |
@@ -28,6 +28,8 @@ | |
#include <asm/mach/arch.h> | |
#include <asm/mach/map.h> | |
#include <mach/hardware.h> | |
+#include <mach/irq.h> | |
+#include <mach/irqs.h> | |
/*********************************************************** | |
* Virtual address Mapping * | |
@@ -144,3 +146,42 @@ void __init device_map_io(void) | |
iotable_init(comcerto_io_desc, ARRAY_SIZE(comcerto_io_desc)); | |
} | |
+/* IRQ configuration table */ | |
+static struct comcerto_irq_desc comcerto_irq_table[] __initdata = { | |
+ {IRQ_EMAC0_BATCH, handle_level_irq, 1}, | |
+ {IRQ_EMAC1_BATCH, handle_level_irq, 2}, | |
+ {IRQ_ARAM, comcerto_handle_secondary_level_irq, 3}, | |
+ {IRQ_PCIe0_EXT, handle_level_irq, 4}, | |
+ {IRQ_PCIe1_EXT, handle_level_irq, 5}, | |
+ {IRQ_PCIe0_INT, comcerto_handle_secondary_level_irq, 6}, | |
+ {IRQ_PCIe1_INT, comcerto_handle_secondary_level_irq, 7}, | |
+ {IRQ_USB0, comcerto_handle_secondary_level_irq, 8}, | |
+ {STATUS_REG_1, NULL, 9}, | |
+ {IRQ_PTP0, handle_level_irq, 10}, | |
+ {IRQ_TIMER1, comcerto_handle_secondary_level_irq, 11}, | |
+ {IRQ_TIMER3, comcerto_handle_secondary_level_irq, 12}, | |
+ {IRQ_TIMER4, comcerto_handle_secondary_level_irq, 13}, | |
+ {IRQ_TIMER5, comcerto_handle_secondary_level_irq, 14}, | |
+ {IRQ_SPI, comcerto_handle_secondary_level_irq, 15}, | |
+ {IRQ_EMAC0, comcerto_handle_secondary_level_irq, 16}, | |
+ {IRQ_EMAC1, comcerto_handle_secondary_level_irq, 17}, | |
+ {IRQ_IPSEC_WRAP, handle_level_irq, 18}, | |
+ {IRQ_I2C, comcerto_handle_secondary_level_irq, 19}, | |
+ {IRQ_CSP_PMU, handle_level_irq, -1}, | |
+ {IRQ_UART1, comcerto_handle_secondary_level_irq, -1}, | |
+ {IRQ_UART0, comcerto_handle_secondary_level_irq, -1}, | |
+ {IRQ_G2, handle_level_irq, -1}, | |
+ {IRQ_G1, handle_level_irq, -1}, | |
+ {IRQ_G0, handle_level_irq, -1}, | |
+ {IRQ_FPP, handle_level_irq, -1}, | |
+ {IRQ_CSPVED1RX, handle_level_irq, -1}, | |
+ {IRQ_CSPVED0RX, handle_level_irq, -1}, | |
+ {IRQ_SPDRV_ACP_REQ, handle_level_irq, -1}, | |
+ {IRQ_SPDRV_ACP_WORK_DONE, handle_level_irq, -1} | |
+}; | |
+ | |
+void __init device_irq_init(void) | |
+{ | |
+ comcerto_irq_init(comcerto_irq_table, ARRAY_SIZE(comcerto_irq_table)); | |
+} | |
+ | |
diff --git a/arch/arm/mach-comcerto/include/mach/comcerto-1000.h b/arch/arm/mach-comcerto/include/mach/comcerto-1000.h | |
index 10086c4..ac9cd21 100644 | |
--- a/arch/arm/mach-comcerto/include/mach/comcerto-1000.h | |
+++ b/arch/arm/mach-comcerto/include/mach/comcerto-1000.h | |
@@ -90,5 +90,6 @@ | |
#define APB_VADDR(x) ((x) - COMCERTO_AHB_APB_BASE + APB_VADDR_BASE) | |
#include <mach/comcerto-1000/timer.h> | |
+#include <mach/comcerto-1000/intr.h> | |
#endif | |
diff --git a/arch/arm/mach-comcerto/include/mach/comcerto-1000/intr.h b/arch/arm/mach-comcerto/include/mach/comcerto-1000/intr.h | |
new file mode 100644 | |
index 0000000..61c2e3a | |
--- /dev/null | |
+++ b/arch/arm/mach-comcerto/include/mach/comcerto-1000/intr.h | |
@@ -0,0 +1,78 @@ | |
+/* | |
+ * arch/arm/mach-comcerto/include/mach/comcerto-1000/intr.h | |
+ * | |
+ * Copyright (C) 2008 Mindspeed Technologies, Inc. | |
+ * | |
+ * This program is free software; you can redistribute it and/or modify | |
+ * it under the terms of the GNU General Public License as published by | |
+ * the Free Software Foundation; either version 2 of the License, or | |
+ * (at your option) any later version. | |
+ * | |
+ * This program is distributed in the hope that it will be useful, | |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
+ * MERCHANTABILITY or FITNESS FOR A PARTINTCULAR PURPOSE. See the | |
+ * GNU General Public License for more details. | |
+ * | |
+ * You should have received a copy of the GNU General Public License | |
+ * along with this program; if not, write to the Free Software | |
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
+ */ | |
+ | |
+#ifndef __INTR__H__ | |
+#define __INTR__H__ | |
+ | |
+/* Comcerto Interrupt Controller */ | |
+#define COMCERTO_INTC_STATUS_REG_0 APB_VADDR((COMCERTO_APB_INTC_BASE + 0x00)) | |
+#define COMCERTO_INTC_CLEAR_STATUS_REG_0 APB_VADDR((COMCERTO_APB_INTC_BASE + 0x00)) | |
+#define COMCERTO_INTC_SET_STATUS_REG_0 APB_VADDR((COMCERTO_APB_INTC_BASE + 0x04)) | |
+#define COMCERTO_INTC_ARM0_IRQMASK_0 APB_VADDR((COMCERTO_APB_INTC_BASE + 0x08)) | |
+#define COMCERTO_INTC_ARM0_FIQMASK_0 APB_VADDR((COMCERTO_APB_INTC_BASE + 0x0C)) | |
+#define COMCERTO_INTC_ARM1_IRQMASK_0 APB_VADDR((COMCERTO_APB_INTC_BASE + 0x10)) | |
+#define COMCERTO_INTC_ARM1_FIQMASK_0 APB_VADDR((COMCERTO_APB_INTC_BASE + 0x14)) | |
+#define COMCERTO_INTC_ARM1_CONTROL_REG APB_VADDR((COMCERTO_APB_INTC_BASE + 0x18)) | |
+#define COMCERTO_INTC_IRQ_ACK_TEST_REG APB_VADDR((COMCERTO_APB_INTC_BASE + 0x1C)) | |
+#define COMCERTO_INTC_STATUS_REG_1 APB_VADDR((COMCERTO_APB_INTC_BASE + 0x20)) | |
+#define COMCERTO_INTC_CLEAR_STATUS_REG_1 APB_VADDR((COMCERTO_APB_INTC_BASE + 0x20)) | |
+#define COMCERTO_INTC_SET_STATUS_REG_1 APB_VADDR((COMCERTO_APB_INTC_BASE + 0x24)) | |
+#define COMCERTO_INTC_ARM0_IRQMASK_1 APB_VADDR((COMCERTO_APB_INTC_BASE + 0x28)) | |
+#define COMCERTO_INTC_ARM0_FIQMASK_1 APB_VADDR((COMCERTO_APB_INTC_BASE + 0x2C)) | |
+#define COMCERTO_INTC_ARM1_IRQMASK_1 APB_VADDR((COMCERTO_APB_INTC_BASE + 0x30)) | |
+#define COMCERTO_INTC_ARM1_FIQMASK_1 APB_VADDR((COMCERTO_APB_INTC_BASE + 0x34)) | |
+#define COMCERTO_INTC_STATUS_MASK_REG_1 APB_VADDR((COMCERTO_APB_INTC_BASE + 0x38)) | |
+#define COMCERTO_INTC_ARM0_PRTY_0 APB_VADDR((COMCERTO_APB_INTC_BASE + 0x40)) | |
+#define COMCERTO_INTC_ARM0_PRTY_1 APB_VADDR((COMCERTO_APB_INTC_BASE + 0x44)) | |
+#define COMCERTO_INTC_ARM0_PRTY_2 APB_VADDR((COMCERTO_APB_INTC_BASE + 0x48)) | |
+#define COMCERTO_INTC_ARM0_PRTY_3 APB_VADDR((COMCERTO_APB_INTC_BASE + 0x4C)) | |
+#define COMCERTO_INTC_ARM0_PRTY_4 APB_VADDR((COMCERTO_APB_INTC_BASE + 0x50)) | |
+#define COMCERTO_INTC_ARM0_PRTY_5 APB_VADDR((COMCERTO_APB_INTC_BASE + 0x54)) | |
+#define COMCERTO_INTC_ARM0_PRTY_6 APB_VADDR((COMCERTO_APB_INTC_BASE + 0x58)) | |
+#define COMCERTO_INTC_ARM0_PRTY_7 APB_VADDR((COMCERTO_APB_INTC_BASE + 0x5C)) | |
+#define COMCERTO_INTC_ARM0_IRQ_WNR APB_VADDR((COMCERTO_APB_INTC_BASE + 0x60)) | |
+#define COMCERTO_INTC_ARM0_SELFCLEAR APB_VADDR((COMCERTO_APB_INTC_BASE + 0x64)) | |
+#define COMCERTO_INTC_FIQ_PRTY_EN APB_VADDR((COMCERTO_APB_INTC_BASE + 0x68)) | |
+#define COMCERTO_INTC_TDMA_STS APB_VADDR((COMCERTO_APB_INTC_BASE + 0x70)) | |
+#define COMCERTO_INTC_TDMA_CTRL APB_VADDR((COMCERTO_APB_INTC_BASE + 0x74)) | |
+#define COMCERTO_INTC_TDMA_SET APB_VADDR((COMCERTO_APB_INTC_BASE + 0x78)) | |
+#define COMCERTO_INTC_ARM1_PRTY_0 APB_VADDR((COMCERTO_APB_INTC_BASE + 0x80)) | |
+#define COMCERTO_INTC_ARM1_PRTY_1 APB_VADDR((COMCERTO_APB_INTC_BASE + 0x84)) | |
+#define COMCERTO_INTC_ARM1_PRTY_2 APB_VADDR((COMCERTO_APB_INTC_BASE + 0x88)) | |
+#define COMCERTO_INTC_ARM1_PRTY_3 APB_VADDR((COMCERTO_APB_INTC_BASE + 0x8C)) | |
+#define COMCERTO_INTC_ARM1_PRTY_4 APB_VADDR((COMCERTO_APB_INTC_BASE + 0x90)) | |
+#define COMCERTO_INTC_ARM1_PRTY_5 APB_VADDR((COMCERTO_APB_INTC_BASE + 0x94)) | |
+#define COMCERTO_INTC_ARM1_PRTY_6 APB_VADDR((COMCERTO_APB_INTC_BASE + 0x98)) | |
+#define COMCERTO_INTC_ARM1_PRTY_7 APB_VADDR((COMCERTO_APB_INTC_BASE + 0x9C)) | |
+#define COMCERTO_INTC_ARM1_IRQ_WNR APB_VADDR((COMCERTO_APB_INTC_BASE + 0xA0)) | |
+#define COMCERTO_INTC_ARM0_IRQ_WNR_VBA APB_VADDR((COMCERTO_APB_INTC_BASE + 0xB0)) | |
+#define COMCERTO_INTC_ARM1_IRQ_WNR_VBA APB_VADDR((COMCERTO_APB_INTC_BASE + 0xB4)) | |
+#define COMCERTO_INTC_ARM0_STS_VEC_ADDR(nb) APB_VADDR((COMCERTO_APB_INTC_BASE + 0x100 + 4nb)) | |
+#define COMCERTO_INTC_ARM1_STS_VEC_ADDR(nb) APB_VADDR((COMCERTO_APB_INTC_BASE + 0x180 + 4nb)) | |
+ | |
+#define COMCERTO_INTC_CSP_IRQMASK_0 COMCERTO_INTC_ARM0_IRQMASK_0 | |
+#define COMCERTO_INTC_CSP_IRQMASK_1 COMCERTO_INTC_ARM0_IRQMASK_1 | |
+#define COMCERTO_INTC_CSP_FIQMASK_0 COMCERTO_INTC_ARM0_FIQMASK_0 | |
+#define COMCERTO_INTC_CSP_FIQMASK_1 COMCERTO_INTC_ARM0_FIQMASK_1 | |
+ | |
+#define COMCERTO_INTC_CSP_IRQ_WNR COMCERTO_INTC_ARM0_IRQ_WNR | |
+#define COMCERTO_INTC_CSP_PRTY_0 COMCERTO_INTC_ARM0_PRTY_0 | |
+ | |
+#endif | |
diff --git a/arch/arm/mach-comcerto/include/mach/comcerto-1000/irqs.h b/arch/arm/mach-comcerto/include/mach/comcerto-1000/irqs.h | |
new file mode 100644 | |
index 0000000..7f59a77 | |
--- /dev/null | |
+++ b/arch/arm/mach-comcerto/include/mach/comcerto-1000/irqs.h | |
@@ -0,0 +1,121 @@ | |
+/* | |
+ * arch/arm/mach-comcerto/include/mach/comcerto-1000/irqs.h | |
+ * | |
+ * Copyright (C) 2008 Mindspeed Technologies, Inc. | |
+ * | |
+ * This program is free software; you can redistribute it and/or modify | |
+ * it under the terms of the GNU General Public License as published by | |
+ * the Free Software Foundation; either version 2 of the License, or | |
+ * (at your option) any later version. | |
+ * | |
+ * This program is distributed in the hope that it will be useful, | |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
+ * GNU General Public License for more details. | |
+ * | |
+ * You should have received a copy of the GNU General Public License | |
+ * along with this program; if not, write to the Free Software | |
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
+ */ | |
+#ifndef __COMCERTO_IRQS_H__ | |
+#define __COMCERTO_IRQS_H__ | |
+ | |
+/* INTC0 32 First IRQs*/ | |
+#define IRQ_TIMER0 31 | |
+#define IRQ_TIMER1 30 | |
+#define IRQ_TIMER2 29 | |
+#define IRQ_TIMER3 28 | |
+#define IRQ_TIMER4 27 | |
+#define IRQ_TIMER5 26 | |
+/* #define IRQ_Reserved 25*/ | |
+#define IRQ_EMAC1_BATCH 24 | |
+#define IRQ_EMAC0_BATCH 23 | |
+#define IRQ_ARAM 22 | |
+#define IRQ_I2C 21 | |
+#define IRQ_THERMAL 20 | |
+#define IRQ_HWFAULT 19 | |
+#define IRQ_DDRC 18 | |
+#define IRQ_PCIe1_INT 17 | |
+#define IRQ_PCIe1_EXT 16 | |
+#define IRQ_PCIe0_INT 15 | |
+#define IRQ_PCIe0_EXT 14 | |
+#define IRQ_MDMA1 13 | |
+#define IRQ_MDMA0 12 | |
+#define IRQ_SPI 11 | |
+#define IRQ_IPSEC_CORE 10 | |
+#define IRQ_IPSEC_WRAP 9 | |
+#define IRQ_TDMA 8 | |
+#define IRQ_EMAC1 7 | |
+#define IRQ_EMAC0 6 | |
+#define IRQ_USB0 5 | |
+#define IRQ_TDM_TIMER 4 | |
+#define IRQ_PTP2 3 | |
+#define IRQ_PTP1 2 | |
+#define IRQ_PTP0 1 | |
+#define STATUS_REG_1 0 | |
+ | |
+/* INTC1 32 next IRQs*/ | |
+/* #define IRQ_Reserved 31*/ | |
+/* #define IRQ_Reserved 30*/ | |
+/* #define IRQ_Reserved 29*/ | |
+#define IRQ_TDMA_TxAHBErr (28 + 32) | |
+#define IRQ_TDMA_RxAHBErr (27 + 32) | |
+#define IRQ_UART1 (26 + 32) | |
+#define IRQ_CSP_HIDRV (25 + 32) | |
+#define IRQ_CSPVED1TX (24 + 32) | |
+#define IRQ_CSPVED1RX (23 + 32) | |
+#define IRQ_CSPVED0TX (22 + 32) | |
+#define IRQ_CSPVED0RX (21 + 32) | |
+#define IRQ_TOHOST (20 + 32) | |
+#define IRQ_FROMHOST (19 + 32) | |
+#define IRQ_MSP_PMU (18 + 32) | |
+#define IRQ_CSP_PMU (17 + 32) | |
+/* #define IRQ_Reserved 16*/ | |
+/* #define IRQ_Reserved 15*/ | |
+/* #define IRQ_Reserved 14*/ | |
+#define IRQ_SPDRV_ACP_REQ (13 + 32) | |
+#define IRQ_SPDRV_ACP_WORK_DONE (12 + 32) | |
+#define IRQ_VED (11 + 32) | |
+#define IRQ_TDMA_IND (10 + 32) | |
+#define IRQ_UART0 (9 + 32) | |
+#define IRQ_G7 (8 + 32) | |
+#define IRQ_G6 (7 + 32) | |
+#define IRQ_G5 (6 + 32) | |
+#define IRQ_G4 (5 + 32) | |
+#define IRQ_G3 (4 + 32) | |
+#define IRQ_G2 (3 + 32) | |
+#define IRQ_G1 (2 + 32) | |
+#define IRQ_G0 (1 + 32) | |
+#define STATUS_REG_0 (0 + 32) | |
+ | |
+/* Software decoded interrupts used by PCIE */ | |
+#define IRQ_PCIE0_MSI0 64 | |
+#define IRQ_PCIE0_MSI1 65 | |
+#define IRQ_PCIE0_MSI2 66 | |
+#define IRQ_PCIE0_MSI3 67 | |
+ | |
+#define IRQ_PCIE0_INTA 68 | |
+#define IRQ_PCIE0_INTB 69 | |
+#define IRQ_PCIE0_INTC 70 | |
+#define IRQ_PCIE0_INTD 71 | |
+ | |
+#define IRQ_PCIE1_MSI0 72 | |
+#define IRQ_PCIE1_MSI1 73 | |
+#define IRQ_PCIE1_MSI2 74 | |
+#define IRQ_PCIE1_MSI3 75 | |
+ | |
+#define IRQ_PCIE1_INTA 76 | |
+#define IRQ_PCIE1_INTB 77 | |
+#define IRQ_PCIE1_INTC 78 | |
+#define IRQ_PCIE1_INTD 79 | |
+ | |
+ | |
+#define NR_IRQS 80 | |
+ | |
+#define IRQ_TIMERB IRQ_TIMER1 | |
+#define IRQ_FPP IRQ_CSP_HIDRV | |
+ | |
+#define FPP_IRQ_FROMHOST IRQ_FROMHOST | |
+#define FPP_IRQ_TOHOST IRQ_TOHOST | |
+#define FPP_IRQ_EVENT IRQ_FPP | |
+#endif | |
diff --git a/arch/arm/mach-comcerto/include/mach/hardware.h b/arch/arm/mach-comcerto/include/mach/hardware.h | |
index 577289d..da023b2 100644 | |
--- a/arch/arm/mach-comcerto/include/mach/hardware.h | |
+++ b/arch/arm/mach-comcerto/include/mach/hardware.h | |
@@ -32,6 +32,7 @@ | |
struct sys_timer; | |
extern struct sys_timer comcerto_timer; | |
extern void device_map_io(void); | |
+extern void device_irq_init(void); | |
#endif | |
#endif | |
diff --git a/arch/arm/mach-comcerto/include/mach/irq.h b/arch/arm/mach-comcerto/include/mach/irq.h | |
new file mode 100644 | |
index 0000000..b5b8a54 | |
--- /dev/null | |
+++ b/arch/arm/mach-comcerto/include/mach/irq.h | |
@@ -0,0 +1,155 @@ | |
+/* | |
+ * arch/arm/mach-comcerto/include/mach/irq.h | |
+ * | |
+ * Copyright (C) 2004,2008 Mindspeed Technologies, Inc. | |
+ * | |
+ * This program is free software; you can redistribute it and/or modify | |
+ * it under the terms of the GNU General Public License as published by | |
+ * the Free Software Foundation; either version 2 of the License, or | |
+ * (at your option) any later version. | |
+ * | |
+ * This program is distributed in the hope that it will be useful, | |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
+ * GNU General Public License for more details. | |
+ * | |
+ * You should have received a copy of the GNU General Public License | |
+ * along with this program; if not, write to the Free Software | |
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
+ */ | |
+#ifndef __ASM_ARCH_IRQ_H | |
+#define __ASM_ARCH_IRQ_H | |
+ | |
+#include <linux/irq.h> | |
+#include <asm/io.h> | |
+ | |
+extern spinlock_t comcerto_irq_lock; | |
+extern int noirqdebug; | |
+ | |
+struct comcerto_irq_desc { | |
+ char num; | |
+ irq_flow_handler_t handler; | |
+ unsigned int prio; | |
+}; | |
+ | |
+void comcerto_handle_secondary_level_irq(unsigned int irq, struct irq_desc *); | |
+void __init comcerto_irq_init(struct comcerto_irq_desc *irq_table, int size); | |
+ | |
+/* For all devices with priority support we provide a call to change STATUS1 | |
+ * priority from the EVM-specific code. Priority value should be in [0..31] | |
+ * range. | |
+ */ | |
+void __init comcerto_irq_status1_priority_set(unsigned char priority); | |
+ | |
+static inline u32 comcerto_irq_to_mask(unsigned int irq) | |
+{ | |
+ return 1 << ((irq) & 0x1f); | |
+} | |
+ | |
+static inline void comcerto_irq_mask_0(unsigned int irq) | |
+{ | |
+ unsigned long flags; | |
+ unsigned long mask; | |
+ | |
+ spin_lock_irqsave(&comcerto_irq_lock, flags); | |
+ mask = __raw_readl(COMCERTO_INTC_CSP_IRQMASK_0); | |
+ mask &= ~comcerto_irq_to_mask(irq); | |
+ __raw_writel(mask, COMCERTO_INTC_CSP_IRQMASK_0); | |
+ spin_unlock_irqrestore(&comcerto_irq_lock, flags); | |
+} | |
+ | |
+static inline void comcerto_irq_mask_1(unsigned int irq) | |
+{ | |
+ unsigned long flags; | |
+ unsigned long mask; | |
+ | |
+ spin_lock_irqsave(&comcerto_irq_lock, flags); | |
+ mask = __raw_readl(COMCERTO_INTC_CSP_IRQMASK_1); | |
+ mask &= ~comcerto_irq_to_mask(irq); | |
+ __raw_writel(mask, COMCERTO_INTC_CSP_IRQMASK_1); | |
+ spin_unlock_irqrestore(&comcerto_irq_lock, flags); | |
+} | |
+ | |
+static inline void comcerto_irq_mask(unsigned int irq) | |
+{ | |
+ if (irq < 32) | |
+ comcerto_irq_mask_0(irq); | |
+ else | |
+ comcerto_irq_mask_1(irq); | |
+} | |
+ | |
+static inline void comcerto_irq_ack_0(unsigned int irq) | |
+{ | |
+ __raw_writel(comcerto_irq_to_mask(irq), COMCERTO_INTC_STATUS_REG_0); | |
+} | |
+ | |
+static inline void comcerto_irq_ack_1(unsigned int irq) | |
+{ | |
+ __raw_writel(comcerto_irq_to_mask(irq), COMCERTO_INTC_STATUS_REG_1); | |
+} | |
+ | |
+static inline void comcerto_irq_ack(unsigned int irq) | |
+{ | |
+ if (irq < 32) | |
+ comcerto_irq_ack_0(irq); | |
+ else | |
+ comcerto_irq_ack_1(irq); | |
+} | |
+ | |
+static inline void comcerto_irq_unmask_0(unsigned int irq) | |
+{ | |
+ unsigned long flags; | |
+ unsigned long mask; | |
+ | |
+ spin_lock_irqsave(&comcerto_irq_lock, flags); | |
+ mask = __raw_readl(COMCERTO_INTC_CSP_IRQMASK_0); | |
+ mask |= comcerto_irq_to_mask(irq); | |
+ __raw_writel(mask, COMCERTO_INTC_CSP_IRQMASK_0); | |
+ spin_unlock_irqrestore(&comcerto_irq_lock, flags); | |
+} | |
+ | |
+static inline void comcerto_irq_unmask_1(unsigned int irq) | |
+{ | |
+ unsigned long flags; | |
+ unsigned long mask; | |
+ | |
+ spin_lock_irqsave(&comcerto_irq_lock, flags); | |
+ mask = __raw_readl(COMCERTO_INTC_CSP_IRQMASK_1); | |
+ mask |= comcerto_irq_to_mask(irq); | |
+ __raw_writel(mask, COMCERTO_INTC_CSP_IRQMASK_1); | |
+ spin_unlock_irqrestore(&comcerto_irq_lock, flags); | |
+} | |
+ | |
+static inline void comcerto_irq_unmask(unsigned int irq) | |
+{ | |
+ if (irq < 32) | |
+ comcerto_irq_unmask_0(irq); | |
+ else | |
+ comcerto_irq_unmask_1(irq); | |
+} | |
+ | |
+static inline void comcerto_softirq_set(unsigned int irq) | |
+{ | |
+ void *reg; | |
+ | |
+ if (irq < 32) | |
+ reg = (void *)COMCERTO_INTC_SET_STATUS_REG_0; | |
+ else | |
+ reg = (void *)COMCERTO_INTC_SET_STATUS_REG_1; | |
+ | |
+ __raw_writel(comcerto_irq_to_mask(irq), reg); | |
+} | |
+ | |
+static inline int comcerto_softirq_check(unsigned int irq) | |
+{ | |
+ void *reg; | |
+ | |
+ if (irq < 32) | |
+ reg = (void *)COMCERTO_INTC_STATUS_REG_0; | |
+ else | |
+ reg = (void *)COMCERTO_INTC_STATUS_REG_1; | |
+ | |
+ return __raw_readl(reg) & comcerto_irq_to_mask(irq) ? 1 : 0; | |
+} | |
+ | |
+#endif /* __ASM_ARCH_IRQ_H */ | |
diff --git a/arch/arm/mach-comcerto/include/mach/irqs.h b/arch/arm/mach-comcerto/include/mach/irqs.h | |
new file mode 100644 | |
index 0000000..409281b | |
--- /dev/null | |
+++ b/arch/arm/mach-comcerto/include/mach/irqs.h | |
@@ -0,0 +1,21 @@ | |
+/* | |
+ * arch/arm/mach-comcerto/include/mach/irqs.h | |
+ * | |
+ * Copyright (C) 2004,2005 Mindspeed Technologies, Inc. | |
+ * | |
+ * 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. | |
+ * | |
+ */ | |
+ | |
+#ifndef __ASM_ARCH_IRQS_H | |
+#define __ASM_ARCH_IRQS_H | |
+ | |
+#if defined(CONFIG_ARCH_M83XXX) | |
+ #include <mach/comcerto-1000/irqs.h> | |
+#else | |
+ #error "Unsupported CPU" | |
+#endif | |
+ | |
+#endif /* __ASM_ARCH_IRQS_H */ | |
diff --git a/arch/arm/mach-comcerto/irq.c b/arch/arm/mach-comcerto/irq.c | |
new file mode 100644 | |
index 0000000..4288ba1 | |
--- /dev/null | |
+++ b/arch/arm/mach-comcerto/irq.c | |
@@ -0,0 +1,200 @@ | |
+/* | |
+ * linux/arch/arm/mach-comcerto/irq.c | |
+ * | |
+ * Copyright (C) 2004-2008 Mindspeed Technologies, Inc. | |
+ * Copyright (c) 2010 Wind River Systems, Inc. | |
+ * | |
+ * This program is free software; you can redistribute it and/or modify | |
+ * it under the terms of the GNU General Public License as published by | |
+ * the Free Software Foundation; either version 2 of the License, or | |
+ * (at your option) any later version. | |
+ * | |
+ * This program is distributed in the hope that it will be useful, | |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
+ * GNU General Public License for more details. | |
+ * | |
+ * You should have received a copy of the GNU General Public License | |
+ * along with this program; if not, write to the Free Software | |
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
+ */ | |
+ | |
+#include <linux/ptrace.h> | |
+#include <linux/sched.h> | |
+#include <linux/interrupt.h> | |
+#include <linux/init.h> | |
+#include <linux/kernel_stat.h> | |
+ | |
+#include <asm/irq.h> | |
+#include <linux/io.h> | |
+#include <asm/mach/irq.h> | |
+#include <mach/hardware.h> | |
+ | |
+#include <mach/irq.h> | |
+#include <mach/irqs.h> | |
+ | |
+spinlock_t comcerto_irq_lock; | |
+ | |
+static void comcerto_irq_mask_ack_0(unsigned int irq) | |
+{ | |
+ comcerto_irq_mask_0(irq); | |
+ comcerto_irq_ack_0(irq); | |
+} | |
+ | |
+static void comcerto_irq_mask_ack_1(unsigned int irq) | |
+{ | |
+ comcerto_irq_mask_1(irq); | |
+ comcerto_irq_ack_1(irq); | |
+} | |
+ | |
+static int comcerto_set_irq_type_0(unsigned int irq, unsigned int type) | |
+{ | |
+ return 0; | |
+} | |
+ | |
+static int comcerto_set_irq_type_1(unsigned int irq, unsigned int type) | |
+{ | |
+ return 0; | |
+} | |
+ | |
+static struct irq_chip comcerto_irq_chip_0 = { | |
+ .name = "Comcerto INTC0", | |
+ .disable = comcerto_irq_mask_0, | |
+ .ack = comcerto_irq_ack_0, | |
+ .mask = comcerto_irq_mask_0, | |
+ .unmask = comcerto_irq_unmask_0, | |
+ .set_type = comcerto_set_irq_type_0, | |
+ .mask_ack = comcerto_irq_mask_ack_0, | |
+}; | |
+ | |
+static struct irq_chip comcerto_irq_chip_1 = { | |
+ .name = "Comcerto INTC1", | |
+ .disable = comcerto_irq_mask_1, | |
+ .ack = comcerto_irq_ack_1, | |
+ .mask = comcerto_irq_mask_1, | |
+ .unmask = comcerto_irq_unmask_1, | |
+ .set_type = comcerto_set_irq_type_1, | |
+ .mask_ack = comcerto_irq_mask_ack_1, | |
+}; | |
+ | |
+void comcerto_handle_secondary_level_irq(unsigned int irq, | |
+ struct irq_desc *desc) | |
+{ | |
+ struct irqaction *action; | |
+ irqreturn_t action_ret; | |
+ | |
+ raw_spin_lock(&desc->lock); | |
+ desc->chip->mask(irq); | |
+ | |
+ if (unlikely(desc->status & IRQ_INPROGRESS)) | |
+ goto out_unlock; | |
+ desc->status &= ~(IRQ_REPLAY | IRQ_WAITING); | |
+ kstat_incr_irqs_this_cpu(irq, desc); | |
+ /* | |
+ * If its disabled or no action available | |
+ * keep it masked and get out of here | |
+ */ | |
+ action = desc->action; | |
+ if (unlikely(!action || (desc->status & IRQ_DISABLED))) { | |
+ desc->status |= IRQ_PENDING; | |
+ goto out_unlock; | |
+ } | |
+ | |
+ desc->status |= IRQ_INPROGRESS; | |
+ desc->status &= ~IRQ_PENDING; | |
+ raw_spin_unlock(&desc->lock); | |
+ | |
+ action_ret = handle_IRQ_event(irq, action); | |
+ if (!noirqdebug) | |
+ note_interrupt(irq, desc, action_ret); | |
+ | |
+ raw_spin_lock(&desc->lock); | |
+ desc->status &= ~IRQ_INPROGRESS; | |
+ | |
+ desc->chip->ack(irq); | |
+ | |
+ if (unlikely(desc->status & IRQ_ONESHOT)) | |
+ desc->status |= IRQ_MASKED; | |
+ else if (!(desc->status & IRQ_DISABLED) && desc->chip->unmask) | |
+ desc->chip->unmask(irq); | |
+out_unlock: | |
+ raw_spin_unlock(&desc->lock); | |
+} | |
+ | |
+static u8 comcerto_status0_priorities[32] __initdata = {0, }; | |
+ | |
+static __init void comcerto_irq_priority_set(unsigned int irq, unsigned int prio) | |
+{ | |
+ unsigned int prio_reg, prio_shift, prio_mask, tmp; | |
+ | |
+ /* we store +1 priority to reserve zero for non-used slots */ | |
+ comcerto_status0_priorities[irq] = prio + 1; | |
+ prio_reg = COMCERTO_INTC_CSP_PRTY_0 + 4 * (prio / 4); | |
+ prio_shift = ((prio % 4) << 3); | |
+ prio_mask = 0x1f << prio_shift; | |
+ tmp = __raw_readl(prio_reg) & ~prio_mask; | |
+ tmp |= irq << prio_shift; | |
+ __raw_writel(tmp, prio_reg); | |
+} | |
+ | |
+void __init comcerto_irq_status1_priority_set(unsigned char priority) | |
+{ | |
+ int i; | |
+ unsigned long flags; | |
+ | |
+ if ((priority & ~31) != 0) | |
+ BUG(); | |
+ | |
+ priority++; /* */ | |
+ | |
+ spin_lock_irqsave(&comcerto_irq_lock, flags); | |
+ | |
+ /* look at all interrupts except STATUS1 and | |
+ * fix all priorities >= specified */ | |
+ for (i = 1; i < 32; i++) | |
+ if (comcerto_status0_priorities[i] >= priority \ | |
+ && comcerto_status0_priorities[i] > 0) | |
+ comcerto_status0_priorities[i]++; | |
+ | |
+ comcerto_status0_priorities[0] = priority; | |
+ | |
+ /* program all non-zero priorities, | |
+ * don't forget to decrement priority value taken from array */ | |
+ for (i = 0; i < 32; i++) | |
+ if (comcerto_status0_priorities[i] > 0) | |
+ comcerto_irq_priority_set(i, comcerto_status0_priorities[i] - 1); | |
+ | |
+ spin_unlock_irqrestore(&comcerto_irq_lock, flags); | |
+} | |
+ | |
+void __init comcerto_irq_init(struct comcerto_irq_desc *irq_table, int size) | |
+{ | |
+ unsigned int irq; | |
+ int i; | |
+ | |
+ spin_lock_init(&comcerto_irq_lock); | |
+ | |
+ /* mask all interrupts */ | |
+ __raw_writel(0, COMCERTO_INTC_CSP_IRQMASK_0); | |
+ __raw_writel(0, COMCERTO_INTC_CSP_IRQMASK_1); | |
+ | |
+ for (i = 0; i < size; i++) { | |
+ irq = irq_table[i].num; | |
+ | |
+ /* setup interrupt handler and priority */ | |
+ if (irq < 32) { | |
+ /* All STATUS0 interrupts must be setup from | |
+ * the single table declared in comcerto-xxx.c | |
+ * file. Use description index as a priority. | |
+ */ | |
+ comcerto_irq_priority_set(irq, irq_table[i].prio); | |
+ set_irq_chip(irq, &comcerto_irq_chip_0); | |
+ } else | |
+ set_irq_chip(irq, &comcerto_irq_chip_1); | |
+ | |
+ if (irq_table[i].handler != NULL) { | |
+ set_irq_handler(irq, irq_table[i].handler); | |
+ set_irq_flags(irq, IRQF_VALID); | |
+ } | |
+ } | |
+} | |
-- | |
1.5.4.3 | |
Previous message: [PATCH 2/3] Add hardware timer support for Mindspeed Comcerto platflorm | |
Next message: [PATCH 2/3] Add hardware timer support for Mindspeed Comcerto platflorm | |
Messages sorted by: [ date ] [ thread ] [ subject ] [ author ] | |
More information about the linux-arm-kernel mailing list |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment