blob: e700559b6b895b92288dbfcec90428f8fa03a2a0 [file] [log] [blame]
Yoshinori Sato9d4436a2006-11-05 15:40:13 +09001/*
2 * SH7206 Setup
3 *
4 * Copyright (C) 2006 Yoshinori Sato
Paul Mundtf858abb2009-03-06 18:34:15 +09005 * Copyright (C) 2009 Paul Mundt
Yoshinori Sato9d4436a2006-11-05 15:40:13 +09006 *
7 * This file is subject to the terms and conditions of the GNU General Public
8 * License. See the file "COPYING" in the main directory of this archive
9 * for more details.
10 */
11#include <linux/platform_device.h>
12#include <linux/init.h>
13#include <linux/serial.h>
Paul Mundt96de1a82008-02-26 14:52:45 +090014#include <linux/serial_sci.h>
Magnus Damm698aa992009-04-30 04:08:18 +000015#include <linux/sh_cmt.h>
Magnus Dammda107c62009-04-30 07:06:26 +000016#include <linux/sh_mtu2.h>
Magnus Damm698aa992009-04-30 04:08:18 +000017#include <linux/io.h>
Yoshinori Sato9d4436a2006-11-05 15:40:13 +090018
Magnus Damm2eb03032007-08-17 00:53:41 +090019enum {
20 UNUSED = 0,
21
22 /* interrupt sources */
23 IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7,
24 PINT0, PINT1, PINT2, PINT3, PINT4, PINT5, PINT6, PINT7,
25 ADC_ADI0, ADC_ADI1,
Magnus Damm2eb03032007-08-17 00:53:41 +090026
Paul Mundtf858abb2009-03-06 18:34:15 +090027 DMAC0, DMAC1, DMAC2, DMAC3, DMAC4, DMAC5, DMAC6, DMAC7,
28
Magnus Damm2eb03032007-08-17 00:53:41 +090029 MTU0_ABCD, MTU0_VEF, MTU1_AB, MTU1_VU, MTU2_AB, MTU2_VU,
30 MTU3_ABCD, MTU4_ABCD, MTU5, POE2_12, MTU3S_ABCD, MTU4S_ABCD, MTU5S,
Paul Mundtf858abb2009-03-06 18:34:15 +090031 IIC3,
32
33 CMT0, CMT1, BSC, WDT,
34
35 MTU2_TCI3V, MTU2_TCI4V, MTU2S_TCI3V, MTU2S_TCI4V,
36
37 POE2_OEI3,
38
39 SCIF0, SCIF1, SCIF2, SCIF3,
40
41 /* interrupt groups */
42 PINT,
Magnus Damm2eb03032007-08-17 00:53:41 +090043};
44
45static struct intc_vect vectors[] __initdata = {
46 INTC_IRQ(IRQ0, 64), INTC_IRQ(IRQ1, 65),
47 INTC_IRQ(IRQ2, 66), INTC_IRQ(IRQ3, 67),
48 INTC_IRQ(IRQ4, 68), INTC_IRQ(IRQ5, 69),
49 INTC_IRQ(IRQ6, 70), INTC_IRQ(IRQ7, 71),
50 INTC_IRQ(PINT0, 80), INTC_IRQ(PINT1, 81),
51 INTC_IRQ(PINT2, 82), INTC_IRQ(PINT3, 83),
52 INTC_IRQ(PINT4, 84), INTC_IRQ(PINT5, 85),
53 INTC_IRQ(PINT6, 86), INTC_IRQ(PINT7, 87),
54 INTC_IRQ(ADC_ADI0, 92), INTC_IRQ(ADC_ADI1, 96),
Paul Mundtf858abb2009-03-06 18:34:15 +090055 INTC_IRQ(DMAC0, 108), INTC_IRQ(DMAC0, 109),
56 INTC_IRQ(DMAC1, 112), INTC_IRQ(DMAC1, 113),
57 INTC_IRQ(DMAC2, 116), INTC_IRQ(DMAC2, 117),
58 INTC_IRQ(DMAC3, 120), INTC_IRQ(DMAC3, 121),
59 INTC_IRQ(DMAC4, 124), INTC_IRQ(DMAC4, 125),
60 INTC_IRQ(DMAC5, 128), INTC_IRQ(DMAC5, 129),
61 INTC_IRQ(DMAC6, 132), INTC_IRQ(DMAC6, 133),
62 INTC_IRQ(DMAC7, 136), INTC_IRQ(DMAC7, 137),
Magnus Damm2eb03032007-08-17 00:53:41 +090063 INTC_IRQ(CMT0, 140), INTC_IRQ(CMT1, 144),
64 INTC_IRQ(BSC, 148), INTC_IRQ(WDT, 152),
Paul Mundtf858abb2009-03-06 18:34:15 +090065 INTC_IRQ(MTU0_ABCD, 156), INTC_IRQ(MTU0_ABCD, 157),
66 INTC_IRQ(MTU0_ABCD, 158), INTC_IRQ(MTU0_ABCD, 159),
67 INTC_IRQ(MTU0_VEF, 160), INTC_IRQ(MTU0_VEF, 161),
68 INTC_IRQ(MTU0_VEF, 162),
69 INTC_IRQ(MTU1_AB, 164), INTC_IRQ(MTU1_AB, 165),
70 INTC_IRQ(MTU1_VU, 168), INTC_IRQ(MTU1_VU, 169),
71 INTC_IRQ(MTU2_AB, 172), INTC_IRQ(MTU2_AB, 173),
72 INTC_IRQ(MTU2_VU, 176), INTC_IRQ(MTU2_VU, 177),
73 INTC_IRQ(MTU3_ABCD, 180), INTC_IRQ(MTU3_ABCD, 181),
74 INTC_IRQ(MTU3_ABCD, 182), INTC_IRQ(MTU3_ABCD, 183),
Magnus Damm2eb03032007-08-17 00:53:41 +090075 INTC_IRQ(MTU2_TCI3V, 184),
Paul Mundtf858abb2009-03-06 18:34:15 +090076 INTC_IRQ(MTU4_ABCD, 188), INTC_IRQ(MTU4_ABCD, 189),
77 INTC_IRQ(MTU4_ABCD, 190), INTC_IRQ(MTU4_ABCD, 191),
Magnus Damm2eb03032007-08-17 00:53:41 +090078 INTC_IRQ(MTU2_TCI4V, 192),
Paul Mundtf858abb2009-03-06 18:34:15 +090079 INTC_IRQ(MTU5, 196), INTC_IRQ(MTU5, 197),
80 INTC_IRQ(MTU5, 198),
81 INTC_IRQ(POE2_12, 200), INTC_IRQ(POE2_12, 201),
82 INTC_IRQ(MTU3S_ABCD, 204), INTC_IRQ(MTU3S_ABCD, 205),
83 INTC_IRQ(MTU3S_ABCD, 206), INTC_IRQ(MTU3S_ABCD, 207),
Magnus Damm2eb03032007-08-17 00:53:41 +090084 INTC_IRQ(MTU2S_TCI3V, 208),
Paul Mundtf858abb2009-03-06 18:34:15 +090085 INTC_IRQ(MTU4S_ABCD, 212), INTC_IRQ(MTU4S_ABCD, 213),
86 INTC_IRQ(MTU4S_ABCD, 214), INTC_IRQ(MTU4S_ABCD, 215),
Magnus Damm2eb03032007-08-17 00:53:41 +090087 INTC_IRQ(MTU2S_TCI4V, 216),
Paul Mundtf858abb2009-03-06 18:34:15 +090088 INTC_IRQ(MTU5S, 220), INTC_IRQ(MTU5S, 221),
89 INTC_IRQ(MTU5S, 222),
Magnus Damm2eb03032007-08-17 00:53:41 +090090 INTC_IRQ(POE2_OEI3, 224),
Paul Mundtf858abb2009-03-06 18:34:15 +090091 INTC_IRQ(IIC3, 228), INTC_IRQ(IIC3, 229),
92 INTC_IRQ(IIC3, 230), INTC_IRQ(IIC3, 231),
93 INTC_IRQ(IIC3, 232),
94 INTC_IRQ(SCIF0, 240), INTC_IRQ(SCIF0, 241),
95 INTC_IRQ(SCIF0, 242), INTC_IRQ(SCIF0, 243),
96 INTC_IRQ(SCIF1, 244), INTC_IRQ(SCIF1, 245),
97 INTC_IRQ(SCIF1, 246), INTC_IRQ(SCIF1, 247),
98 INTC_IRQ(SCIF2, 248), INTC_IRQ(SCIF2, 249),
99 INTC_IRQ(SCIF2, 250), INTC_IRQ(SCIF2, 251),
100 INTC_IRQ(SCIF3, 252), INTC_IRQ(SCIF3, 253),
101 INTC_IRQ(SCIF3, 254), INTC_IRQ(SCIF3, 255),
Magnus Damm2eb03032007-08-17 00:53:41 +0900102};
103
104static struct intc_group groups[] __initdata = {
105 INTC_GROUP(PINT, PINT0, PINT1, PINT2, PINT3,
106 PINT4, PINT5, PINT6, PINT7),
Magnus Damm2eb03032007-08-17 00:53:41 +0900107};
108
109static struct intc_prio_reg prio_registers[] __initdata = {
110 { 0xfffe0818, 0, 16, 4, /* IPR01 */ { IRQ0, IRQ1, IRQ2, IRQ3 } },
111 { 0xfffe081a, 0, 16, 4, /* IPR02 */ { IRQ4, IRQ5, IRQ6, IRQ7 } },
112 { 0xfffe0820, 0, 16, 4, /* IPR05 */ { PINT, 0, ADC_ADI0, ADC_ADI1 } },
113 { 0xfffe0c00, 0, 16, 4, /* IPR06 */ { DMAC0, DMAC1, DMAC2, DMAC3 } },
114 { 0xfffe0c02, 0, 16, 4, /* IPR07 */ { DMAC4, DMAC5, DMAC6, DMAC7 } },
115 { 0xfffe0c04, 0, 16, 4, /* IPR08 */ { CMT0, CMT1, BSC, WDT } },
116 { 0xfffe0c06, 0, 16, 4, /* IPR09 */ { MTU0_ABCD, MTU0_VEF,
117 MTU1_AB, MTU1_VU } },
118 { 0xfffe0c08, 0, 16, 4, /* IPR10 */ { MTU2_AB, MTU2_VU,
119 MTU3_ABCD, MTU2_TCI3V } },
120 { 0xfffe0c0a, 0, 16, 4, /* IPR11 */ { MTU4_ABCD, MTU2_TCI4V,
121 MTU5, POE2_12 } },
122 { 0xfffe0c0c, 0, 16, 4, /* IPR12 */ { MTU3S_ABCD, MTU2S_TCI3V,
123 MTU4S_ABCD, MTU2S_TCI4V } },
124 { 0xfffe0c0e, 0, 16, 4, /* IPR13 */ { MTU5S, POE2_OEI3, IIC3, 0 } },
125 { 0xfffe0c10, 0, 16, 4, /* IPR14 */ { SCIF0, SCIF1, SCIF2, SCIF3 } },
126};
127
128static struct intc_mask_reg mask_registers[] __initdata = {
129 { 0xfffe0808, 0, 16, /* PINTER */
130 { 0, 0, 0, 0, 0, 0, 0, 0,
131 PINT7, PINT6, PINT5, PINT4, PINT3, PINT2, PINT1, PINT0 } },
132};
133
134static DECLARE_INTC_DESC(intc_desc, "sh7206", vectors, groups,
Magnus Damm7f3edee2008-01-10 14:08:55 +0900135 mask_registers, prio_registers, NULL);
Magnus Damm2eb03032007-08-17 00:53:41 +0900136
Yoshinori Sato9d4436a2006-11-05 15:40:13 +0900137static struct plat_sci_port sci_platform_data[] = {
138 {
139 .mapbase = 0xfffe8000,
140 .flags = UPF_BOOT_AUTOCONF,
141 .type = PORT_SCIF,
Paul Mundtf858abb2009-03-06 18:34:15 +0900142 .irqs = { 240, 240, 240, 240 },
Yoshinori Sato9d4436a2006-11-05 15:40:13 +0900143 }, {
144 .mapbase = 0xfffe8800,
145 .flags = UPF_BOOT_AUTOCONF,
146 .type = PORT_SCIF,
Paul Mundtf858abb2009-03-06 18:34:15 +0900147 .irqs = { 244, 244, 244, 244 },
Yoshinori Sato9d4436a2006-11-05 15:40:13 +0900148 }, {
149 .mapbase = 0xfffe9000,
150 .flags = UPF_BOOT_AUTOCONF,
151 .type = PORT_SCIF,
Paul Mundtf858abb2009-03-06 18:34:15 +0900152 .irqs = { 248, 248, 248, 248 },
Yoshinori Sato9d4436a2006-11-05 15:40:13 +0900153 }, {
154 .mapbase = 0xfffe9800,
155 .flags = UPF_BOOT_AUTOCONF,
156 .type = PORT_SCIF,
Paul Mundtf858abb2009-03-06 18:34:15 +0900157 .irqs = { 252, 252, 252, 252 },
Yoshinori Sato9d4436a2006-11-05 15:40:13 +0900158 }, {
159 .flags = 0,
160 }
161};
162
163static struct platform_device sci_device = {
164 .name = "sh-sci",
165 .id = -1,
166 .dev = {
167 .platform_data = sci_platform_data,
168 },
169};
170
Magnus Damm698aa992009-04-30 04:08:18 +0000171static struct sh_cmt_config cmt0_platform_data = {
172 .name = "CMT0",
173 .channel_offset = 0x02,
174 .timer_bit = 0,
175 .clk = "module_clk",
176 .clockevent_rating = 125,
177 .clocksource_rating = 0, /* disabled due to code generation issues */
178};
179
180static struct resource cmt0_resources[] = {
181 [0] = {
182 .name = "CMT0",
183 .start = 0xfffec002,
184 .end = 0xfffec007,
185 .flags = IORESOURCE_MEM,
186 },
187 [1] = {
188 .start = 140,
189 .flags = IORESOURCE_IRQ,
190 },
191};
192
193static struct platform_device cmt0_device = {
194 .name = "sh_cmt",
195 .id = 0,
196 .dev = {
197 .platform_data = &cmt0_platform_data,
198 },
199 .resource = cmt0_resources,
200 .num_resources = ARRAY_SIZE(cmt0_resources),
201};
202
203static struct sh_cmt_config cmt1_platform_data = {
204 .name = "CMT1",
205 .channel_offset = 0x08,
206 .timer_bit = 1,
207 .clk = "module_clk",
208 .clockevent_rating = 125,
209 .clocksource_rating = 0, /* disabled due to code generation issues */
210};
211
212static struct resource cmt1_resources[] = {
213 [0] = {
214 .name = "CMT1",
215 .start = 0xfffec008,
216 .end = 0xfffec00d,
217 .flags = IORESOURCE_MEM,
218 },
219 [1] = {
220 .start = 144,
221 .flags = IORESOURCE_IRQ,
222 },
223};
224
225static struct platform_device cmt1_device = {
226 .name = "sh_cmt",
227 .id = 1,
228 .dev = {
229 .platform_data = &cmt1_platform_data,
230 },
231 .resource = cmt1_resources,
232 .num_resources = ARRAY_SIZE(cmt1_resources),
233};
234
Magnus Dammda107c62009-04-30 07:06:26 +0000235static struct sh_mtu2_config mtu2_0_platform_data = {
236 .name = "MTU2_0",
237 .channel_offset = -0x80,
238 .timer_bit = 0,
239 .clk = "module_clk",
240 .clockevent_rating = 200,
241};
242
243static struct resource mtu2_0_resources[] = {
244 [0] = {
245 .name = "MTU2_0",
246 .start = 0xfffe4300,
247 .end = 0xfffe4326,
248 .flags = IORESOURCE_MEM,
249 },
250 [1] = {
251 .start = 156,
252 .flags = IORESOURCE_IRQ,
253 },
254};
255
256static struct platform_device mtu2_0_device = {
257 .name = "sh_mtu2",
258 .id = 0,
259 .dev = {
260 .platform_data = &mtu2_0_platform_data,
261 },
262 .resource = mtu2_0_resources,
263 .num_resources = ARRAY_SIZE(mtu2_0_resources),
264};
265
266static struct sh_mtu2_config mtu2_1_platform_data = {
267 .name = "MTU2_1",
268 .channel_offset = -0x100,
269 .timer_bit = 1,
270 .clk = "module_clk",
271 .clockevent_rating = 200,
272};
273
274static struct resource mtu2_1_resources[] = {
275 [0] = {
276 .name = "MTU2_1",
277 .start = 0xfffe4380,
278 .end = 0xfffe4390,
279 .flags = IORESOURCE_MEM,
280 },
281 [1] = {
282 .start = 164,
283 .flags = IORESOURCE_IRQ,
284 },
285};
286
287static struct platform_device mtu2_1_device = {
288 .name = "sh_mtu2",
289 .id = 1,
290 .dev = {
291 .platform_data = &mtu2_1_platform_data,
292 },
293 .resource = mtu2_1_resources,
294 .num_resources = ARRAY_SIZE(mtu2_1_resources),
295};
296
297static struct sh_mtu2_config mtu2_2_platform_data = {
298 .name = "MTU2_2",
299 .channel_offset = 0x80,
300 .timer_bit = 2,
301 .clk = "module_clk",
302 .clockevent_rating = 200,
303};
304
305static struct resource mtu2_2_resources[] = {
306 [0] = {
307 .name = "MTU2_2",
308 .start = 0xfffe4000,
309 .end = 0xfffe400a,
310 .flags = IORESOURCE_MEM,
311 },
312 [1] = {
313 .start = 180,
314 .flags = IORESOURCE_IRQ,
315 },
316};
317
318static struct platform_device mtu2_2_device = {
319 .name = "sh_mtu2",
320 .id = 2,
321 .dev = {
322 .platform_data = &mtu2_2_platform_data,
323 },
324 .resource = mtu2_2_resources,
325 .num_resources = ARRAY_SIZE(mtu2_2_resources),
326};
327
Yoshinori Sato9d4436a2006-11-05 15:40:13 +0900328static struct platform_device *sh7206_devices[] __initdata = {
329 &sci_device,
Magnus Damm698aa992009-04-30 04:08:18 +0000330 &cmt0_device,
331 &cmt1_device,
Magnus Dammda107c62009-04-30 07:06:26 +0000332 &mtu2_0_device,
333 &mtu2_1_device,
334 &mtu2_2_device,
Yoshinori Sato9d4436a2006-11-05 15:40:13 +0900335};
336
337static int __init sh7206_devices_setup(void)
338{
339 return platform_add_devices(sh7206_devices,
340 ARRAY_SIZE(sh7206_devices));
341}
342__initcall(sh7206_devices_setup);
Yoshinori Sato780a1562006-12-07 18:01:23 +0900343
Magnus Damm90015c82007-07-18 17:57:34 +0900344void __init plat_irq_setup(void)
Yoshinori Sato780a1562006-12-07 18:01:23 +0900345{
Magnus Damm2eb03032007-08-17 00:53:41 +0900346 register_intc_controller(&intc_desc);
Yoshinori Sato780a1562006-12-07 18:01:23 +0900347}
Magnus Damm698aa992009-04-30 04:08:18 +0000348
349static struct platform_device *sh7206_early_devices[] __initdata = {
350 &cmt0_device,
351 &cmt1_device,
Magnus Dammda107c62009-04-30 07:06:26 +0000352 &mtu2_0_device,
353 &mtu2_1_device,
354 &mtu2_2_device,
Magnus Damm698aa992009-04-30 04:08:18 +0000355};
356
Magnus Dammda107c62009-04-30 07:06:26 +0000357#define STBCR3 0xfffe0408
Magnus Damm698aa992009-04-30 04:08:18 +0000358#define STBCR4 0xfffe040c
359
360void __init plat_early_device_setup(void)
361{
362 /* enable CMT clock */
363 __raw_writeb(__raw_readb(STBCR4) & ~0x04, STBCR4);
364
Magnus Dammda107c62009-04-30 07:06:26 +0000365 /* enable MTU2 clock */
366 __raw_writeb(__raw_readb(STBCR3) & ~0x20, STBCR3);
367
Magnus Damm698aa992009-04-30 04:08:18 +0000368 early_platform_add_devices(sh7206_early_devices,
369 ARRAY_SIZE(sh7206_early_devices));
370}