diff options
Diffstat (limited to 'arch/arm/mach-sa1100/collie.c')
-rw-r--r-- | arch/arm/mach-sa1100/collie.c | 192 |
1 files changed, 192 insertions, 0 deletions
diff --git a/arch/arm/mach-sa1100/collie.c b/arch/arm/mach-sa1100/collie.c new file mode 100644 index 000000000000..99287890d396 --- /dev/null +++ b/arch/arm/mach-sa1100/collie.c | |||
@@ -0,0 +1,192 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/mach-sa1100/collie.c | ||
3 | * | ||
4 | * May be copied or modified under the terms of the GNU General Public | ||
5 | * License. See linux/COPYING for more information. | ||
6 | * | ||
7 | * This file contains all Collie-specific tweaks. | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of the GNU General Public License version 2 as | ||
11 | * published by the Free Software Foundation. | ||
12 | * | ||
13 | * ChangeLog: | ||
14 | * 03-06-2004 John Lenz <jelenz@wisc.edu> | ||
15 | * 06-04-2002 Chris Larson <kergoth@digitalnemesis.net> | ||
16 | * 04-16-2001 Lineo Japan,Inc. ... | ||
17 | */ | ||
18 | |||
19 | #include <linux/config.h> | ||
20 | #include <linux/init.h> | ||
21 | #include <linux/kernel.h> | ||
22 | #include <linux/tty.h> | ||
23 | #include <linux/delay.h> | ||
24 | #include <linux/device.h> | ||
25 | #include <linux/mtd/mtd.h> | ||
26 | #include <linux/mtd/partitions.h> | ||
27 | #include <linux/timer.h> | ||
28 | |||
29 | #include <asm/hardware.h> | ||
30 | #include <asm/mach-types.h> | ||
31 | #include <asm/irq.h> | ||
32 | #include <asm/setup.h> | ||
33 | #include <asm/arch/collie.h> | ||
34 | |||
35 | #include <asm/mach/arch.h> | ||
36 | #include <asm/mach/flash.h> | ||
37 | #include <asm/mach/map.h> | ||
38 | #include <asm/mach/serial_sa1100.h> | ||
39 | |||
40 | #include <asm/hardware/scoop.h> | ||
41 | #include <asm/mach/sharpsl_param.h> | ||
42 | #include <asm/hardware/locomo.h> | ||
43 | |||
44 | #include "generic.h" | ||
45 | |||
46 | static struct resource collie_scoop_resources[] = { | ||
47 | [0] = { | ||
48 | .start = 0x40800000, | ||
49 | .end = 0x40800fff, | ||
50 | .flags = IORESOURCE_MEM, | ||
51 | }, | ||
52 | }; | ||
53 | |||
54 | static struct scoop_config collie_scoop_setup = { | ||
55 | .io_dir = COLLIE_SCOOP_IO_DIR, | ||
56 | .io_out = COLLIE_SCOOP_IO_OUT, | ||
57 | }; | ||
58 | |||
59 | struct platform_device colliescoop_device = { | ||
60 | .name = "sharp-scoop", | ||
61 | .id = -1, | ||
62 | .dev = { | ||
63 | .platform_data = &collie_scoop_setup, | ||
64 | }, | ||
65 | .num_resources = ARRAY_SIZE(collie_scoop_resources), | ||
66 | .resource = collie_scoop_resources, | ||
67 | }; | ||
68 | |||
69 | |||
70 | static struct resource locomo_resources[] = { | ||
71 | [0] = { | ||
72 | .start = 0x40000000, | ||
73 | .end = 0x40001fff, | ||
74 | .flags = IORESOURCE_MEM, | ||
75 | }, | ||
76 | [1] = { | ||
77 | .start = IRQ_GPIO25, | ||
78 | .end = IRQ_GPIO25, | ||
79 | .flags = IORESOURCE_IRQ, | ||
80 | }, | ||
81 | }; | ||
82 | |||
83 | static struct platform_device locomo_device = { | ||
84 | .name = "locomo", | ||
85 | .id = 0, | ||
86 | .num_resources = ARRAY_SIZE(locomo_resources), | ||
87 | .resource = locomo_resources, | ||
88 | }; | ||
89 | |||
90 | static struct platform_device *devices[] __initdata = { | ||
91 | &locomo_device, | ||
92 | &colliescoop_device, | ||
93 | }; | ||
94 | |||
95 | static struct mtd_partition collie_partitions[] = { | ||
96 | { | ||
97 | .name = "bootloader", | ||
98 | .offset = 0, | ||
99 | .size = 0x000C0000, | ||
100 | .mask_flags = MTD_WRITEABLE | ||
101 | }, { | ||
102 | .name = "kernel", | ||
103 | .offset = MTDPART_OFS_APPEND, | ||
104 | .size = 0x00100000, | ||
105 | }, { | ||
106 | .name = "rootfs", | ||
107 | .offset = MTDPART_OFS_APPEND, | ||
108 | .size = 0x00e20000, | ||
109 | } | ||
110 | }; | ||
111 | |||
112 | static void collie_set_vpp(int vpp) | ||
113 | { | ||
114 | write_scoop_reg(SCOOP_GPCR, read_scoop_reg(SCOOP_GPCR) | COLLIE_SCP_VPEN); | ||
115 | if (vpp) { | ||
116 | write_scoop_reg(SCOOP_GPWR, read_scoop_reg(SCOOP_GPWR) | COLLIE_SCP_VPEN); | ||
117 | } else { | ||
118 | write_scoop_reg(SCOOP_GPWR, read_scoop_reg(SCOOP_GPWR) & ~COLLIE_SCP_VPEN); | ||
119 | } | ||
120 | } | ||
121 | |||
122 | static struct flash_platform_data collie_flash_data = { | ||
123 | .map_name = "cfi_probe", | ||
124 | .set_vpp = collie_set_vpp, | ||
125 | .parts = collie_partitions, | ||
126 | .nr_parts = ARRAY_SIZE(collie_partitions), | ||
127 | }; | ||
128 | |||
129 | static struct resource collie_flash_resources[] = { | ||
130 | { | ||
131 | .start = SA1100_CS0_PHYS, | ||
132 | .end = SA1100_CS0_PHYS + SZ_32M - 1, | ||
133 | .flags = IORESOURCE_MEM, | ||
134 | } | ||
135 | }; | ||
136 | |||
137 | static void __init collie_init(void) | ||
138 | { | ||
139 | int ret = 0; | ||
140 | |||
141 | /* cpu initialize */ | ||
142 | GAFR = ( GPIO_SSP_TXD | \ | ||
143 | GPIO_SSP_SCLK | GPIO_SSP_SFRM | GPIO_SSP_CLK | GPIO_TIC_ACK | \ | ||
144 | GPIO_32_768kHz ); | ||
145 | |||
146 | GPDR = ( GPIO_LDD8 | GPIO_LDD9 | GPIO_LDD10 | GPIO_LDD11 | GPIO_LDD12 | \ | ||
147 | GPIO_LDD13 | GPIO_LDD14 | GPIO_LDD15 | GPIO_SSP_TXD | \ | ||
148 | GPIO_SSP_SCLK | GPIO_SSP_SFRM | GPIO_SDLC_SCLK | \ | ||
149 | GPIO_SDLC_AAF | GPIO_UART_SCLK1 | GPIO_32_768kHz ); | ||
150 | GPLR = GPIO_GPIO18; | ||
151 | |||
152 | // PPC pin setting | ||
153 | PPDR = ( PPC_LDD0 | PPC_LDD1 | PPC_LDD2 | PPC_LDD3 | PPC_LDD4 | PPC_LDD5 | \ | ||
154 | PPC_LDD6 | PPC_LDD7 | PPC_L_PCLK | PPC_L_LCLK | PPC_L_FCLK | PPC_L_BIAS | \ | ||
155 | PPC_TXD1 | PPC_TXD2 | PPC_RXD2 | PPC_TXD3 | PPC_TXD4 | PPC_SCLK | PPC_SFRM ); | ||
156 | |||
157 | PSDR = ( PPC_RXD1 | PPC_RXD2 | PPC_RXD3 | PPC_RXD4 ); | ||
158 | |||
159 | GAFR |= GPIO_32_768kHz; | ||
160 | GPDR |= GPIO_32_768kHz; | ||
161 | TUCR = TUCR_32_768kHz; | ||
162 | |||
163 | ret = platform_add_devices(devices, ARRAY_SIZE(devices)); | ||
164 | if (ret) { | ||
165 | printk(KERN_WARNING "collie: Unable to register LoCoMo device\n"); | ||
166 | } | ||
167 | |||
168 | sa11x0_set_flash_data(&collie_flash_data, collie_flash_resources, | ||
169 | ARRAY_SIZE(collie_flash_resources)); | ||
170 | |||
171 | sharpsl_save_param(); | ||
172 | } | ||
173 | |||
174 | static struct map_desc collie_io_desc[] __initdata = { | ||
175 | /* virtual physical length type */ | ||
176 | {0xe8000000, 0x00000000, 0x02000000, MT_DEVICE}, /* 32M main flash (cs0) */ | ||
177 | {0xea000000, 0x08000000, 0x02000000, MT_DEVICE}, /* 32M boot flash (cs1) */ | ||
178 | }; | ||
179 | |||
180 | static void __init collie_map_io(void) | ||
181 | { | ||
182 | sa1100_map_io(); | ||
183 | iotable_init(collie_io_desc, ARRAY_SIZE(collie_io_desc)); | ||
184 | } | ||
185 | |||
186 | MACHINE_START(COLLIE, "Sharp-Collie") | ||
187 | BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000) | ||
188 | MAPIO(collie_map_io) | ||
189 | INITIRQ(sa1100_init_irq) | ||
190 | .timer = &sa1100_timer, | ||
191 | .init_machine = collie_init, | ||
192 | MACHINE_END | ||