Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland...
[sfrench/cifs-2.6.git] / arch / sh / kernel / cpu / sh4 / setup-sh7750.c
1 /*
2  * SH7750/SH7751 Setup
3  *
4  *  Copyright (C) 2006  Paul Mundt
5  *  Copyright (C) 2006  Jamie Lenehan
6  *
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>
14 #include <linux/io.h>
15 #include <linux/sh_timer.h>
16 #include <linux/serial_sci.h>
17
18 static struct resource rtc_resources[] = {
19         [0] = {
20                 .start  = 0xffc80000,
21                 .end    = 0xffc80000 + 0x58 - 1,
22                 .flags  = IORESOURCE_IO,
23         },
24         [1] = {
25                 /* Shared Period/Carry/Alarm IRQ */
26                 .start  = 20,
27                 .flags  = IORESOURCE_IRQ,
28         },
29 };
30
31 static struct platform_device rtc_device = {
32         .name           = "sh-rtc",
33         .id             = -1,
34         .num_resources  = ARRAY_SIZE(rtc_resources),
35         .resource       = rtc_resources,
36 };
37
38 static struct plat_sci_port scif0_platform_data = {
39         .mapbase        = 0xffe00000,
40         .flags          = UPF_BOOT_AUTOCONF,
41         .type           = PORT_SCI,
42         .irqs           = { 23, 23, 23, 0 },
43 };
44
45 static struct platform_device scif0_device = {
46         .name           = "sh-sci",
47         .id             = 0,
48         .dev            = {
49                 .platform_data  = &scif0_platform_data,
50         },
51 };
52
53 static struct plat_sci_port scif1_platform_data = {
54         .mapbase        = 0xffe80000,
55         .flags          = UPF_BOOT_AUTOCONF,
56         .type           = PORT_SCIF,
57         .irqs           = { 40, 40, 40, 40 },
58 };
59
60 static struct platform_device scif1_device = {
61         .name           = "sh-sci",
62         .id             = 1,
63         .dev            = {
64                 .platform_data  = &scif1_platform_data,
65         },
66 };
67
68 static struct sh_timer_config tmu0_platform_data = {
69         .channel_offset = 0x04,
70         .timer_bit = 0,
71         .clockevent_rating = 200,
72 };
73
74 static struct resource tmu0_resources[] = {
75         [0] = {
76                 .start  = 0xffd80008,
77                 .end    = 0xffd80013,
78                 .flags  = IORESOURCE_MEM,
79         },
80         [1] = {
81                 .start  = 16,
82                 .flags  = IORESOURCE_IRQ,
83         },
84 };
85
86 static struct platform_device tmu0_device = {
87         .name           = "sh_tmu",
88         .id             = 0,
89         .dev = {
90                 .platform_data  = &tmu0_platform_data,
91         },
92         .resource       = tmu0_resources,
93         .num_resources  = ARRAY_SIZE(tmu0_resources),
94 };
95
96 static struct sh_timer_config tmu1_platform_data = {
97         .channel_offset = 0x10,
98         .timer_bit = 1,
99         .clocksource_rating = 200,
100 };
101
102 static struct resource tmu1_resources[] = {
103         [0] = {
104                 .start  = 0xffd80014,
105                 .end    = 0xffd8001f,
106                 .flags  = IORESOURCE_MEM,
107         },
108         [1] = {
109                 .start  = 17,
110                 .flags  = IORESOURCE_IRQ,
111         },
112 };
113
114 static struct platform_device tmu1_device = {
115         .name           = "sh_tmu",
116         .id             = 1,
117         .dev = {
118                 .platform_data  = &tmu1_platform_data,
119         },
120         .resource       = tmu1_resources,
121         .num_resources  = ARRAY_SIZE(tmu1_resources),
122 };
123
124 static struct sh_timer_config tmu2_platform_data = {
125         .channel_offset = 0x1c,
126         .timer_bit = 2,
127 };
128
129 static struct resource tmu2_resources[] = {
130         [0] = {
131                 .start  = 0xffd80020,
132                 .end    = 0xffd8002f,
133                 .flags  = IORESOURCE_MEM,
134         },
135         [1] = {
136                 .start  = 18,
137                 .flags  = IORESOURCE_IRQ,
138         },
139 };
140
141 static struct platform_device tmu2_device = {
142         .name           = "sh_tmu",
143         .id             = 2,
144         .dev = {
145                 .platform_data  = &tmu2_platform_data,
146         },
147         .resource       = tmu2_resources,
148         .num_resources  = ARRAY_SIZE(tmu2_resources),
149 };
150
151 /* SH7750R, SH7751 and SH7751R all have two extra timer channels */
152 #if defined(CONFIG_CPU_SUBTYPE_SH7750R) || \
153         defined(CONFIG_CPU_SUBTYPE_SH7751) || \
154         defined(CONFIG_CPU_SUBTYPE_SH7751R)
155
156 static struct sh_timer_config tmu3_platform_data = {
157         .channel_offset = 0x04,
158         .timer_bit = 0,
159 };
160
161 static struct resource tmu3_resources[] = {
162         [0] = {
163                 .start  = 0xfe100008,
164                 .end    = 0xfe100013,
165                 .flags  = IORESOURCE_MEM,
166         },
167         [1] = {
168                 .start  = 72,
169                 .flags  = IORESOURCE_IRQ,
170         },
171 };
172
173 static struct platform_device tmu3_device = {
174         .name           = "sh_tmu",
175         .id             = 3,
176         .dev = {
177                 .platform_data  = &tmu3_platform_data,
178         },
179         .resource       = tmu3_resources,
180         .num_resources  = ARRAY_SIZE(tmu3_resources),
181 };
182
183 static struct sh_timer_config tmu4_platform_data = {
184         .channel_offset = 0x10,
185         .timer_bit = 1,
186 };
187
188 static struct resource tmu4_resources[] = {
189         [0] = {
190                 .start  = 0xfe100014,
191                 .end    = 0xfe10001f,
192                 .flags  = IORESOURCE_MEM,
193         },
194         [1] = {
195                 .start  = 76,
196                 .flags  = IORESOURCE_IRQ,
197         },
198 };
199
200 static struct platform_device tmu4_device = {
201         .name           = "sh_tmu",
202         .id             = 4,
203         .dev = {
204                 .platform_data  = &tmu4_platform_data,
205         },
206         .resource       = tmu4_resources,
207         .num_resources  = ARRAY_SIZE(tmu4_resources),
208 };
209
210 #endif
211
212 static struct platform_device *sh7750_devices[] __initdata = {
213         &scif0_device,
214         &scif1_device,
215         &rtc_device,
216         &tmu0_device,
217         &tmu1_device,
218         &tmu2_device,
219 #if defined(CONFIG_CPU_SUBTYPE_SH7750R) || \
220         defined(CONFIG_CPU_SUBTYPE_SH7751) || \
221         defined(CONFIG_CPU_SUBTYPE_SH7751R)
222         &tmu3_device,
223         &tmu4_device,
224 #endif
225 };
226
227 static int __init sh7750_devices_setup(void)
228 {
229         return platform_add_devices(sh7750_devices,
230                                     ARRAY_SIZE(sh7750_devices));
231 }
232 arch_initcall(sh7750_devices_setup);
233
234 static struct platform_device *sh7750_early_devices[] __initdata = {
235         &scif0_device,
236         &scif1_device,
237         &tmu0_device,
238         &tmu1_device,
239         &tmu2_device,
240 #if defined(CONFIG_CPU_SUBTYPE_SH7750R) || \
241         defined(CONFIG_CPU_SUBTYPE_SH7751) || \
242         defined(CONFIG_CPU_SUBTYPE_SH7751R)
243         &tmu3_device,
244         &tmu4_device,
245 #endif
246 };
247
248 void __init plat_early_device_setup(void)
249 {
250         early_platform_add_devices(sh7750_early_devices,
251                                    ARRAY_SIZE(sh7750_early_devices));
252 }
253
254 enum {
255         UNUSED = 0,
256
257         /* interrupt sources */
258         IRL0, IRL1, IRL2, IRL3, /* only IRLM mode supported */
259         HUDI, GPIOI, DMAC,
260         PCIC0_PCISERR, PCIC1_PCIERR, PCIC1_PCIPWDWN, PCIC1_PCIPWON,
261         PCIC1_PCIDMA0, PCIC1_PCIDMA1, PCIC1_PCIDMA2, PCIC1_PCIDMA3,
262         TMU3, TMU4, TMU0, TMU1, TMU2, RTC, SCI1, SCIF, WDT, REF,
263
264         /* interrupt groups */
265         PCIC1,
266 };
267
268 static struct intc_vect vectors[] __initdata = {
269         INTC_VECT(HUDI, 0x600), INTC_VECT(GPIOI, 0x620),
270         INTC_VECT(TMU0, 0x400), INTC_VECT(TMU1, 0x420),
271         INTC_VECT(TMU2, 0x440), INTC_VECT(TMU2, 0x460),
272         INTC_VECT(RTC, 0x480), INTC_VECT(RTC, 0x4a0),
273         INTC_VECT(RTC, 0x4c0),
274         INTC_VECT(SCI1, 0x4e0), INTC_VECT(SCI1, 0x500),
275         INTC_VECT(SCI1, 0x520), INTC_VECT(SCI1, 0x540),
276         INTC_VECT(SCIF, 0x700), INTC_VECT(SCIF, 0x720),
277         INTC_VECT(SCIF, 0x740), INTC_VECT(SCIF, 0x760),
278         INTC_VECT(WDT, 0x560),
279         INTC_VECT(REF, 0x580), INTC_VECT(REF, 0x5a0),
280 };
281
282 static struct intc_prio_reg prio_registers[] __initdata = {
283         { 0xffd00004, 0, 16, 4, /* IPRA */ { TMU0, TMU1, TMU2, RTC } },
284         { 0xffd00008, 0, 16, 4, /* IPRB */ { WDT, REF, SCI1, 0 } },
285         { 0xffd0000c, 0, 16, 4, /* IPRC */ { GPIOI, DMAC, SCIF, HUDI } },
286         { 0xffd00010, 0, 16, 4, /* IPRD */ { IRL0, IRL1, IRL2, IRL3 } },
287         { 0xfe080000, 0, 32, 4, /* INTPRI00 */ { 0, 0, 0, 0,
288                                                  TMU4, TMU3,
289                                                  PCIC1, PCIC0_PCISERR } },
290 };
291
292 static DECLARE_INTC_DESC(intc_desc, "sh7750", vectors, NULL,
293                          NULL, prio_registers, NULL);
294
295 /* SH7750, SH7750S, SH7751 and SH7091 all have 4-channel DMA controllers */
296 #if defined(CONFIG_CPU_SUBTYPE_SH7750) || \
297         defined(CONFIG_CPU_SUBTYPE_SH7750S) || \
298         defined(CONFIG_CPU_SUBTYPE_SH7751) || \
299         defined(CONFIG_CPU_SUBTYPE_SH7091)
300 static struct intc_vect vectors_dma4[] __initdata = {
301         INTC_VECT(DMAC, 0x640), INTC_VECT(DMAC, 0x660),
302         INTC_VECT(DMAC, 0x680), INTC_VECT(DMAC, 0x6a0),
303         INTC_VECT(DMAC, 0x6c0),
304 };
305
306 static DECLARE_INTC_DESC(intc_desc_dma4, "sh7750_dma4",
307                          vectors_dma4, NULL,
308                          NULL, prio_registers, NULL);
309 #endif
310
311 /* SH7750R and SH7751R both have 8-channel DMA controllers */
312 #if defined(CONFIG_CPU_SUBTYPE_SH7750R) || defined(CONFIG_CPU_SUBTYPE_SH7751R)
313 static struct intc_vect vectors_dma8[] __initdata = {
314         INTC_VECT(DMAC, 0x640), INTC_VECT(DMAC, 0x660),
315         INTC_VECT(DMAC, 0x680), INTC_VECT(DMAC, 0x6a0),
316         INTC_VECT(DMAC, 0x780), INTC_VECT(DMAC, 0x7a0),
317         INTC_VECT(DMAC, 0x7c0), INTC_VECT(DMAC, 0x7e0),
318         INTC_VECT(DMAC, 0x6c0),
319 };
320
321 static DECLARE_INTC_DESC(intc_desc_dma8, "sh7750_dma8",
322                          vectors_dma8, NULL,
323                          NULL, prio_registers, NULL);
324 #endif
325
326 /* SH7750R, SH7751 and SH7751R all have two extra timer channels */
327 #if defined(CONFIG_CPU_SUBTYPE_SH7750R) || \
328         defined(CONFIG_CPU_SUBTYPE_SH7751) || \
329         defined(CONFIG_CPU_SUBTYPE_SH7751R)
330 static struct intc_vect vectors_tmu34[] __initdata = {
331         INTC_VECT(TMU3, 0xb00), INTC_VECT(TMU4, 0xb80),
332 };
333
334 static struct intc_mask_reg mask_registers[] __initdata = {
335         { 0xfe080040, 0xfe080060, 32, /* INTMSK00 / INTMSKCLR00 */
336           { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
337             0, 0, 0, 0, 0, 0, TMU4, TMU3,
338             PCIC1_PCIERR, PCIC1_PCIPWDWN, PCIC1_PCIPWON,
339             PCIC1_PCIDMA0, PCIC1_PCIDMA1, PCIC1_PCIDMA2,
340             PCIC1_PCIDMA3, PCIC0_PCISERR } },
341 };
342
343 static DECLARE_INTC_DESC(intc_desc_tmu34, "sh7750_tmu34",
344                          vectors_tmu34, NULL,
345                          mask_registers, prio_registers, NULL);
346 #endif
347
348 /* SH7750S, SH7750R, SH7751 and SH7751R all have IRLM priority registers */
349 static struct intc_vect vectors_irlm[] __initdata = {
350         INTC_VECT(IRL0, 0x240), INTC_VECT(IRL1, 0x2a0),
351         INTC_VECT(IRL2, 0x300), INTC_VECT(IRL3, 0x360),
352 };
353
354 static DECLARE_INTC_DESC(intc_desc_irlm, "sh7750_irlm", vectors_irlm, NULL,
355                          NULL, prio_registers, NULL);
356
357 /* SH7751 and SH7751R both have PCI */
358 #if defined(CONFIG_CPU_SUBTYPE_SH7751) || defined(CONFIG_CPU_SUBTYPE_SH7751R)
359 static struct intc_vect vectors_pci[] __initdata = {
360         INTC_VECT(PCIC0_PCISERR, 0xa00), INTC_VECT(PCIC1_PCIERR, 0xae0),
361         INTC_VECT(PCIC1_PCIPWDWN, 0xac0), INTC_VECT(PCIC1_PCIPWON, 0xaa0),
362         INTC_VECT(PCIC1_PCIDMA0, 0xa80), INTC_VECT(PCIC1_PCIDMA1, 0xa60),
363         INTC_VECT(PCIC1_PCIDMA2, 0xa40), INTC_VECT(PCIC1_PCIDMA3, 0xa20),
364 };
365
366 static struct intc_group groups_pci[] __initdata = {
367         INTC_GROUP(PCIC1, PCIC1_PCIERR, PCIC1_PCIPWDWN, PCIC1_PCIPWON,
368                    PCIC1_PCIDMA0, PCIC1_PCIDMA1, PCIC1_PCIDMA2, PCIC1_PCIDMA3),
369 };
370
371 static DECLARE_INTC_DESC(intc_desc_pci, "sh7750_pci", vectors_pci, groups_pci,
372                          mask_registers, prio_registers, NULL);
373 #endif
374
375 #if defined(CONFIG_CPU_SUBTYPE_SH7750) || \
376         defined(CONFIG_CPU_SUBTYPE_SH7750S) || \
377         defined(CONFIG_CPU_SUBTYPE_SH7091)
378 void __init plat_irq_setup(void)
379 {
380         /*
381          * same vectors for SH7750, SH7750S and SH7091 except for IRLM,
382          * see below..
383          */
384         register_intc_controller(&intc_desc);
385         register_intc_controller(&intc_desc_dma4);
386 }
387 #endif
388
389 #if defined(CONFIG_CPU_SUBTYPE_SH7750R)
390 void __init plat_irq_setup(void)
391 {
392         register_intc_controller(&intc_desc);
393         register_intc_controller(&intc_desc_dma8);
394         register_intc_controller(&intc_desc_tmu34);
395 }
396 #endif
397
398 #if defined(CONFIG_CPU_SUBTYPE_SH7751)
399 void __init plat_irq_setup(void)
400 {
401         register_intc_controller(&intc_desc);
402         register_intc_controller(&intc_desc_dma4);
403         register_intc_controller(&intc_desc_tmu34);
404         register_intc_controller(&intc_desc_pci);
405 }
406 #endif
407
408 #if defined(CONFIG_CPU_SUBTYPE_SH7751R)
409 void __init plat_irq_setup(void)
410 {
411         register_intc_controller(&intc_desc);
412         register_intc_controller(&intc_desc_dma8);
413         register_intc_controller(&intc_desc_tmu34);
414         register_intc_controller(&intc_desc_pci);
415 }
416 #endif
417
418 #define INTC_ICR        0xffd00000UL
419 #define INTC_ICR_IRLM   (1<<7)
420
421 void __init plat_irq_setup_pins(int mode)
422 {
423 #if defined(CONFIG_CPU_SUBTYPE_SH7750) || defined(CONFIG_CPU_SUBTYPE_SH7091)
424         BUG(); /* impossible to mask interrupts on SH7750 and SH7091 */
425         return;
426 #endif
427
428         switch (mode) {
429         case IRQ_MODE_IRQ: /* individual interrupt mode for IRL3-0 */
430                 __raw_writew(__raw_readw(INTC_ICR) | INTC_ICR_IRLM, INTC_ICR);
431                 register_intc_controller(&intc_desc_irlm);
432                 break;
433         default:
434                 BUG();
435         }
436 }