-
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.
yaml --- r: 208763 b: refs/heads/master c: 2b12b5c h: refs/heads/master i: 208761: d92eeeb 208759: e5e1900 v: v3
- Loading branch information
Changhwan Youn
authored and
Kukjin Kim
committed
Aug 5, 2010
1 parent
7ac9a12
commit 1904310
Showing
21 changed files
with
996 additions
and
1 deletion.
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 |
---|---|---|
@@ -1,2 +1,2 @@ | ||
--- | ||
refs/heads/master: 88baf2096c1c625c14831bc3438fd1e69bf1cef5 | ||
refs/heads/master: 2b12b5c4ff9e0f1c5f4e5d5bde57b919fe522df2 |
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,122 @@ | ||
/* linux/arch/arm/mach-s5pv310/cpu.c | ||
* | ||
* Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
* http://www.samsung.com/ | ||
* | ||
* 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. | ||
*/ | ||
|
||
#include <linux/sched.h> | ||
#include <linux/sysdev.h> | ||
|
||
#include <asm/mach/map.h> | ||
#include <asm/mach/irq.h> | ||
|
||
#include <asm/proc-fns.h> | ||
|
||
#include <plat/cpu.h> | ||
#include <plat/clock.h> | ||
#include <plat/s5pv310.h> | ||
|
||
#include <mach/regs-irq.h> | ||
|
||
void __iomem *gic_cpu_base_addr; | ||
|
||
extern int combiner_init(unsigned int combiner_nr, void __iomem *base, | ||
unsigned int irq_start); | ||
extern void combiner_cascade_irq(unsigned int combiner_nr, unsigned int irq); | ||
|
||
/* Initial IO mappings */ | ||
static struct map_desc s5pv310_iodesc[] __initdata = { | ||
{ | ||
.virtual = (unsigned long)S5P_VA_COREPERI_BASE, | ||
.pfn = __phys_to_pfn(S5PV310_PA_COREPERI), | ||
.length = SZ_8K, | ||
.type = MT_DEVICE, | ||
}, { | ||
.virtual = (unsigned long)S5P_VA_COMBINER_BASE, | ||
.pfn = __phys_to_pfn(S5PV310_PA_COMBINER), | ||
.length = SZ_4K, | ||
.type = MT_DEVICE, | ||
}, { | ||
.virtual = (unsigned long)S5P_VA_L2CC, | ||
.pfn = __phys_to_pfn(S5PV310_PA_L2CC), | ||
.length = SZ_4K, | ||
.type = MT_DEVICE, | ||
}, | ||
}; | ||
|
||
static void s5pv310_idle(void) | ||
{ | ||
if (!need_resched()) | ||
cpu_do_idle(); | ||
|
||
local_irq_enable(); | ||
} | ||
|
||
/* s5pv310_map_io | ||
* | ||
* register the standard cpu IO areas | ||
*/ | ||
void __init s5pv310_map_io(void) | ||
{ | ||
iotable_init(s5pv310_iodesc, ARRAY_SIZE(s5pv310_iodesc)); | ||
} | ||
|
||
void __init s5pv310_init_clocks(int xtal) | ||
{ | ||
printk(KERN_DEBUG "%s: initializing clocks\n", __func__); | ||
|
||
s3c24xx_register_baseclocks(xtal); | ||
s5p_register_clocks(xtal); | ||
s5pv310_register_clocks(); | ||
s5pv310_setup_clocks(); | ||
} | ||
|
||
void __init s5pv310_init_irq(void) | ||
{ | ||
int irq; | ||
|
||
gic_cpu_base_addr = S5P_VA_GIC_CPU; | ||
gic_dist_init(0, S5P_VA_GIC_DIST, IRQ_LOCALTIMER); | ||
gic_cpu_init(0, S5P_VA_GIC_CPU); | ||
|
||
for (irq = 0; irq < MAX_COMBINER_NR; irq++) { | ||
combiner_init(irq, (void __iomem *)S5P_VA_COMBINER(irq), | ||
COMBINER_IRQ(irq, 0)); | ||
combiner_cascade_irq(irq, IRQ_SPI(irq)); | ||
} | ||
|
||
/* The parameters of s5p_init_irq() are for VIC init. | ||
* Theses parameters should be NULL and 0 because S5PV310 | ||
* uses GIC instead of VIC. | ||
*/ | ||
s5p_init_irq(NULL, 0); | ||
} | ||
|
||
struct sysdev_class s5pv310_sysclass = { | ||
.name = "s5pv310-core", | ||
}; | ||
|
||
static struct sys_device s5pv310_sysdev = { | ||
.cls = &s5pv310_sysclass, | ||
}; | ||
|
||
static int __init s5pv310_core_init(void) | ||
{ | ||
return sysdev_class_register(&s5pv310_sysclass); | ||
} | ||
|
||
core_initcall(s5pv310_core_init); | ||
|
||
int __init s5pv310_init(void) | ||
{ | ||
printk(KERN_INFO "S5PV310: Initializing architecture\n"); | ||
|
||
/* set idle function */ | ||
pm_idle = s5pv310_idle; | ||
|
||
return sysdev_register(&s5pv310_sysdev); | ||
} |
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,41 @@ | ||
/* | ||
* linux/arch/arm/mach-s5pv310/headsmp.S | ||
* | ||
* Cloned from linux/arch/arm/mach-realview/headsmp.S | ||
* | ||
* Copyright (c) 2003 ARM Limited | ||
* All Rights Reserved | ||
* | ||
* 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. | ||
*/ | ||
#include <linux/linkage.h> | ||
#include <linux/init.h> | ||
|
||
__INIT | ||
|
||
/* | ||
* s5pv310 specific entry point for secondary CPUs. This provides | ||
* a "holding pen" into which all secondary cores are held until we're | ||
* ready for them to initialise. | ||
*/ | ||
ENTRY(s5pv310_secondary_startup) | ||
mrc p15, 0, r0, c0, c0, 5 | ||
and r0, r0, #15 | ||
adr r4, 1f | ||
ldmia r4, {r5, r6} | ||
sub r4, r4, r5 | ||
add r6, r6, r4 | ||
pen: ldr r7, [r6] | ||
cmp r7, r0 | ||
bne pen | ||
|
||
/* | ||
* we've been released from the holding pen: secondary_stack | ||
* should now contain the SVC stack for this core | ||
*/ | ||
b secondary_startup | ||
|
||
1: .long . | ||
.long pen_release |
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,36 @@ | ||
/* linux/arch/arm/mach-s5pv310/include/mach/debug-macro.S | ||
* | ||
* Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
* http://www.samsung.com/ | ||
* | ||
* Based on arch/arm/mach-s3c6400/include/mach/debug-macro.S | ||
* | ||
* 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. | ||
*/ | ||
|
||
/* pull in the relevant register and map files. */ | ||
|
||
#include <mach/map.h> | ||
|
||
/* note, for the boot process to work we have to keep the UART | ||
* virtual address aligned to an 1MiB boundary for the L1 | ||
* mapping the head code makes. We keep the UART virtual address | ||
* aligned and add in the offset when we load the value here. | ||
*/ | ||
|
||
.macro addruart, rx, tmp | ||
mrc p15, 0, \rx, c1, c0 | ||
tst \rx, #1 | ||
ldreq \rx, = S3C_PA_UART | ||
ldrne \rx, = S3C_VA_UART | ||
#if CONFIG_DEBUG_S3C_UART != 0 | ||
add \rx, \rx, #(0x10000 * CONFIG_DEBUG_S3C_UART) | ||
#endif | ||
.endm | ||
|
||
#define fifo_full fifo_full_s5pv210 | ||
#define fifo_level fifo_level_s5pv210 | ||
|
||
#include <plat/debug-macro.S> |
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,84 @@ | ||
/* arch/arm/mach-s5pv310/include/mach/entry-macro.S | ||
* | ||
* Cloned from arch/arm/mach-realview/include/mach/entry-macro.S | ||
* | ||
* Low-level IRQ helper macros for S5PV310 platforms | ||
* | ||
* This file is licensed under the terms of the GNU General Public | ||
* License version 2. This program is licensed "as is" without any | ||
* warranty of any kind, whether express or implied. | ||
*/ | ||
|
||
#include <mach/hardware.h> | ||
#include <asm/hardware/gic.h> | ||
|
||
.macro disable_fiq | ||
.endm | ||
|
||
.macro get_irqnr_preamble, base, tmp | ||
ldr \base, =gic_cpu_base_addr | ||
ldr \base, [\base] | ||
.endm | ||
|
||
.macro arch_ret_to_user, tmp1, tmp2 | ||
.endm | ||
|
||
/* | ||
* The interrupt numbering scheme is defined in the | ||
* interrupt controller spec. To wit: | ||
* | ||
* Interrupts 0-15 are IPI | ||
* 16-28 are reserved | ||
* 29-31 are local. We allow 30 to be used for the watchdog. | ||
* 32-1020 are global | ||
* 1021-1022 are reserved | ||
* 1023 is "spurious" (no interrupt) | ||
* | ||
* For now, we ignore all local interrupts so only return an interrupt if it's | ||
* between 30 and 1020. The test_for_ipi routine below will pick up on IPIs. | ||
* | ||
* A simple read from the controller will tell us the number of the highest | ||
* priority enabled interrupt. We then just need to check whether it is in the | ||
* valid range for an IRQ (30-1020 inclusive). | ||
*/ | ||
|
||
.macro get_irqnr_and_base, irqnr, irqstat, base, tmp | ||
|
||
ldr \irqstat, [\base, #GIC_CPU_INTACK] /* bits 12-10 = src CPU, 9-0 = int # */ | ||
|
||
ldr \tmp, =1021 | ||
|
||
bic \irqnr, \irqstat, #0x1c00 | ||
|
||
cmp \irqnr, #29 | ||
cmpcc \irqnr, \irqnr | ||
cmpne \irqnr, \tmp | ||
cmpcs \irqnr, \irqnr | ||
addne \irqnr, \irqnr, #32 | ||
|
||
.endm | ||
|
||
/* We assume that irqstat (the raw value of the IRQ acknowledge | ||
* register) is preserved from the macro above. | ||
* If there is an IPI, we immediately signal end of interrupt on the | ||
* controller, since this requires the original irqstat value which | ||
* we won't easily be able to recreate later. | ||
*/ | ||
|
||
.macro test_for_ipi, irqnr, irqstat, base, tmp | ||
bic \irqnr, \irqstat, #0x1c00 | ||
cmp \irqnr, #16 | ||
strcc \irqstat, [\base, #GIC_CPU_EOI] | ||
cmpcs \irqnr, \irqnr | ||
.endm | ||
|
||
/* As above, this assumes that irqstat and base are preserved.. */ | ||
|
||
.macro test_for_ltirq, irqnr, irqstat, base, tmp | ||
bic \irqnr, \irqstat, #0x1c00 | ||
mov \tmp, #0 | ||
cmp \irqnr, #29 | ||
moveq \tmp, #1 | ||
streq \irqstat, [\base, #GIC_CPU_EOI] | ||
cmp \tmp, #0 | ||
.endm |
Oops, something went wrong.