summaryrefslogtreecommitdiff
path: root/firmware/target/arm/s5l8700/system-s5l8700.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/arm/s5l8700/system-s5l8700.c')
-rw-r--r--firmware/target/arm/s5l8700/system-s5l8700.c168
1 files changed, 168 insertions, 0 deletions
diff --git a/firmware/target/arm/s5l8700/system-s5l8700.c b/firmware/target/arm/s5l8700/system-s5l8700.c
new file mode 100644
index 0000000000..2d87cc8c9a
--- /dev/null
+++ b/firmware/target/arm/s5l8700/system-s5l8700.c
@@ -0,0 +1,168 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2007 by Rob Purchase
11 *
12 * All files in this archive are subject to the GNU General Public License.
13 * See the file COPYING in the source tree root for full license agreement.
14 *
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
17 *
18 ****************************************************************************/
19
20#include "kernel.h"
21#include "system.h"
22#include "panic.h"
23
24#define default_interrupt(name) \
25 extern __attribute__((weak,alias("UIRQ"))) void name (void)
26
27void irq_handler(void) __attribute__((interrupt ("IRQ"), naked));
28void fiq_handler(void) __attribute__((interrupt ("FIQ"), naked));
29
30default_interrupt(EXT0);
31default_interrupt(EXT1);
32default_interrupt(EXT2);
33default_interrupt(EINT_VBUS);
34default_interrupt(EINTG);
35default_interrupt(INT_TIMERA);
36default_interrupt(INT_WDT);
37default_interrupt(INT_TIMERB);
38default_interrupt(INT_TIMERC);
39default_interrupt(INT_TIMERD);
40default_interrupt(INT_DMA);
41default_interrupt(INT_ALARM_RTC);
42default_interrupt(INT_PRI_RTC);
43default_interrupt(RESERVED1);
44default_interrupt(INT_UART);
45default_interrupt(INT_USB_HOST);
46default_interrupt(INT_USB_FUNC);
47default_interrupt(INT_LCDC_0);
48default_interrupt(INT_LCDC_1);
49default_interrupt(INT_ECC);
50default_interrupt(INT_CALM);
51default_interrupt(INT_ATA);
52default_interrupt(INT_UART0);
53default_interrupt(INT_SPDIF_OUT);
54default_interrupt(INT_SDCI);
55default_interrupt(INT_LCD);
56default_interrupt(INT_SPI);
57default_interrupt(INT_IIC);
58default_interrupt(RESERVED2);
59default_interrupt(INT_MSTICK);
60default_interrupt(INT_ADC_WAKEUP);
61default_interrupt(INT_ADC);
62
63
64
65static void (* const irqvector[])(void) =
66{
67 EXT0,EXT1,EXT2,EINT_VBUS,EINTG,INT_TIMERA,INT_WDT,INT_TIMERB,
68 INT_TIMERC,INT_TIMERD,INT_DMA,INT_ALARM_RTC,INT_PRI_RTC,RESERVED1,INT_UART,INT_USB_HOST,
69 INT_USB_FUNC,INT_LCDC_0,INT_LCDC_1,INT_ECC,INT_CALM,INT_ATA,INT_UART0,INT_SPDIF_OUT,
70 INT_SDCI,INT_LCD,INT_SPI,INT_IIC,RESERVED2,INT_MSTICK,INT_ADC_WAKEUP,INT_ADC
71};
72
73static const char * const irqname[] =
74{
75 "EXT0","EXT1","EXT2","EINT_VBUS","EINTG","INT_TIMERA","INT_WDT","INT_TIMERB",
76 "INT_TIMERC","INT_TIMERD","INT_DMA","INT_ALARM_RTC","INT_PRI_RTC","Reserved","INT_UART","INT_USB_HOST",
77 "INT_USB_FUNC","INT_LCDC_0","INT_LCDC_1","INT_ECC","INT_CALM","INT_ATA","INT_UART0","INT_SPDIF_OUT",
78 "INT_SDCI","INT_LCD","INT_SPI","INT_IIC","Reserved","INT_MSTICK","INT_ADC_WAKEUP","INT_ADC"
79};
80
81static void UIRQ(void)
82{
83 unsigned int offset = INTOFFSET;
84 panicf("Unhandled IRQ %02X: %s", offset, irqname[offset]);
85}
86
87void irq_handler(void)
88{
89 /*
90 * Based on: linux/arch/arm/kernel/entry-armv.S and system-meg-fx.c
91 */
92
93 asm volatile( "stmfd sp!, {r0-r7, ip, lr} \n" /* Store context */
94 "sub sp, sp, #8 \n"); /* Reserve stack */
95
96 int irq_no = INTOFFSET; /* Read clears the corresponding IRQ status */
97
98 if ((irq_no & (1<<31)) == 0) /* Ensure invalid flag is not set */
99 {
100 irqvector[irq_no]();
101 }
102
103 asm volatile( "add sp, sp, #8 \n" /* Cleanup stack */
104 "ldmfd sp!, {r0-r7, ip, lr} \n" /* Restore context */
105 "subs pc, lr, #4 \n"); /* Return from IRQ */
106}
107
108void fiq_handler(void)
109{
110 asm volatile (
111 "subs pc, lr, #4 \r\n"
112 );
113}
114
115
116static void gpio_init(void)
117{
118}
119
120static void clock_init(void)
121{
122}
123
124
125void system_init(void)
126{
127}
128
129void system_reboot(void)
130{
131}
132
133int system_memory_guard(int newmode)
134{
135 (void)newmode;
136 return 0;
137}
138
139#ifdef HAVE_ADJUSTABLE_CPU_FREQ
140
141void set_cpu_frequency(long frequency)
142{
143 if (cpu_frequency == frequency)
144 return;
145
146 /* CPU/COP frequencies can be scaled between Fbus (min) and Fsys (max).
147 Fbus should not be set below ~32Mhz with LCD enabled or the display
148 will be garbled. */
149 if (frequency == CPUFREQ_MAX)
150 {
151 }
152 else if (frequency == CPUFREQ_NORMAL)
153 {
154 }
155 else
156 {
157 }
158
159 asm volatile (
160 "nop \n\t"
161 "nop \n\t"
162 "nop \n\t"
163 );
164
165 cpu_frequency = frequency;
166}
167
168#endif