Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | /* |
2 | * linux/arch/arm/mach-shark/arch.c | |
3 | * | |
4 | * Architecture specific stuff. | |
5 | */ | |
6 | #include <linux/kernel.h> | |
7 | #include <linux/init.h> | |
8 | #include <linux/interrupt.h> | |
9 | #include <linux/sched.h> | |
10 | #include <linux/serial_8250.h> | |
11 | ||
12 | #include <asm/setup.h> | |
13 | #include <asm/mach-types.h> | |
14 | #include <asm/io.h> | |
15 | #include <asm/leds.h> | |
16 | #include <asm/param.h> | |
17 | ||
18 | #include <asm/mach/map.h> | |
19 | #include <asm/mach/arch.h> | |
20 | #include <asm/mach/time.h> | |
21 | ||
22 | static struct plat_serial8250_port serial_platform_data[] = { | |
23 | { | |
24 | .iobase = 0x3f8, | |
25 | .irq = 4, | |
26 | .uartclk = 1843200, | |
b7523418 | 27 | .regshift = 0, |
1da177e4 LT |
28 | .iotype = UPIO_PORT, |
29 | .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST, | |
30 | }, | |
31 | { | |
32 | .iobase = 0x2f8, | |
33 | .irq = 3, | |
34 | .uartclk = 1843200, | |
b7523418 | 35 | .regshift = 0, |
1da177e4 LT |
36 | .iotype = UPIO_PORT, |
37 | .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST, | |
38 | }, | |
39 | { }, | |
40 | }; | |
41 | ||
42 | static struct platform_device serial_device = { | |
43 | .name = "serial8250", | |
44 | .id = 0, | |
45 | .dev = { | |
46 | .platform_data = serial_platform_data, | |
47 | }, | |
48 | }; | |
49 | ||
50 | static int __init shark_init(void) | |
51 | { | |
52 | int ret; | |
53 | ||
54 | if (machine_is_shark()) | |
55 | ret = platform_device_register(&serial_device); | |
56 | ||
57 | return ret; | |
58 | } | |
59 | ||
60 | arch_initcall(shark_init); | |
61 | ||
62 | extern void shark_init_irq(void); | |
63 | ||
64 | static struct map_desc shark_io_desc[] __initdata = { | |
65 | { IO_BASE , IO_START , IO_SIZE , MT_DEVICE } | |
66 | }; | |
67 | ||
68 | static void __init shark_map_io(void) | |
69 | { | |
70 | iotable_init(shark_io_desc, ARRAY_SIZE(shark_io_desc)); | |
71 | } | |
72 | ||
73 | #define IRQ_TIMER 0 | |
74 | #define HZ_TIME ((1193180 + HZ/2) / HZ) | |
75 | ||
76 | static irqreturn_t | |
77 | shark_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) | |
78 | { | |
79 | write_seqlock(&xtime_lock); | |
80 | timer_tick(regs); | |
81 | write_sequnlock(&xtime_lock); | |
82 | return IRQ_HANDLED; | |
83 | } | |
84 | ||
85 | static struct irqaction shark_timer_irq = { | |
86 | .name = "Shark Timer Tick", | |
09b8b5f8 RK |
87 | .flags = SA_INTERRUPT | SA_TIMER, |
88 | .handler = shark_timer_interrupt, | |
1da177e4 LT |
89 | }; |
90 | ||
91 | /* | |
92 | * Set up timer interrupt, and return the current time in seconds. | |
93 | */ | |
94 | static void __init shark_timer_init(void) | |
95 | { | |
96 | outb(0x34, 0x43); /* binary, mode 0, LSB/MSB, Ch 0 */ | |
97 | outb(HZ_TIME & 0xff, 0x40); /* LSB of count */ | |
98 | outb(HZ_TIME >> 8, 0x40); | |
99 | ||
100 | setup_irq(IRQ_TIMER, &shark_timer_irq); | |
101 | } | |
102 | ||
103 | static struct sys_timer shark_timer = { | |
104 | .init = shark_timer_init, | |
105 | }; | |
106 | ||
107 | MACHINE_START(SHARK, "Shark") | |
e9dea0c6 RK |
108 | /* Maintainer: Alexander Schulz */ |
109 | .phys_ram = 0x08000000, | |
110 | .phys_io = 0x40000000, | |
111 | .io_pg_offst = ((0xe0000000) >> 18) & 0xfffc, | |
112 | .boot_params = 0x08003000, | |
113 | .map_io = shark_map_io, | |
114 | .init_irq = shark_init_irq, | |
1da177e4 LT |
115 | .timer = &shark_timer, |
116 | MACHINE_END |