Linux Audio

Check our new training course

Loading...
v3.5.6
  1/*
  2 * SH7785 Setup
  3 *
  4 *  Copyright (C) 2007  Paul Mundt
  5 *
  6 * This file is subject to the terms and conditions of the GNU General Public
  7 * License.  See the file "COPYING" in the main directory of this archive
  8 * for more details.
  9 */
 10#include <linux/platform_device.h>
 11#include <linux/init.h>
 12#include <linux/serial.h>
 13#include <linux/serial_sci.h>
 14#include <linux/io.h>
 15#include <linux/mm.h>
 16#include <linux/sh_dma.h>
 17#include <linux/sh_timer.h>
 18#include <linux/sh_intc.h>
 19#include <asm/mmzone.h>
 20#include <cpu/dma-register.h>
 21
 22static struct plat_sci_port scif0_platform_data = {
 23	.mapbase	= 0xffea0000,
 24	.flags		= UPF_BOOT_AUTOCONF,
 25	.scscr		= SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
 26	.scbrr_algo_id	= SCBRR_ALGO_1,
 27	.type		= PORT_SCIF,
 28	.irqs		= SCIx_IRQ_MUXED(evt2irq(0x700)),
 29	.regtype	= SCIx_SH4_SCIF_FIFODATA_REGTYPE,
 30};
 31
 32static struct platform_device scif0_device = {
 33	.name		= "sh-sci",
 34	.id		= 0,
 35	.dev		= {
 36		.platform_data	= &scif0_platform_data,
 37	},
 38};
 39
 40static struct plat_sci_port scif1_platform_data = {
 41	.mapbase	= 0xffeb0000,
 42	.flags		= UPF_BOOT_AUTOCONF,
 43	.scscr		= SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
 44	.scbrr_algo_id	= SCBRR_ALGO_1,
 45	.type		= PORT_SCIF,
 46	.irqs		= SCIx_IRQ_MUXED(evt2irq(0x780)),
 47	.regtype	= SCIx_SH4_SCIF_FIFODATA_REGTYPE,
 48};
 49
 50static struct platform_device scif1_device = {
 51	.name		= "sh-sci",
 52	.id		= 1,
 53	.dev		= {
 54		.platform_data	= &scif1_platform_data,
 55	},
 56};
 57
 58static struct plat_sci_port scif2_platform_data = {
 59	.mapbase	= 0xffec0000,
 60	.flags		= UPF_BOOT_AUTOCONF,
 61	.scscr		= SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
 62	.scbrr_algo_id	= SCBRR_ALGO_1,
 63	.type		= PORT_SCIF,
 64	.irqs		= SCIx_IRQ_MUXED(evt2irq(0x980)),
 65	.regtype	= SCIx_SH4_SCIF_FIFODATA_REGTYPE,
 66};
 67
 68static struct platform_device scif2_device = {
 69	.name		= "sh-sci",
 70	.id		= 2,
 71	.dev		= {
 72		.platform_data	= &scif2_platform_data,
 73	},
 74};
 75
 76static struct plat_sci_port scif3_platform_data = {
 77	.mapbase	= 0xffed0000,
 78	.flags		= UPF_BOOT_AUTOCONF,
 79	.scscr		= SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
 80	.scbrr_algo_id	= SCBRR_ALGO_1,
 81	.type		= PORT_SCIF,
 82	.irqs		= SCIx_IRQ_MUXED(evt2irq(0x9a0)),
 83	.regtype	= SCIx_SH4_SCIF_FIFODATA_REGTYPE,
 84};
 85
 86static struct platform_device scif3_device = {
 87	.name		= "sh-sci",
 88	.id		= 3,
 89	.dev		= {
 90		.platform_data	= &scif3_platform_data,
 91	},
 92};
 93
 94static struct plat_sci_port scif4_platform_data = {
 95	.mapbase	= 0xffee0000,
 96	.flags		= UPF_BOOT_AUTOCONF,
 97	.scscr		= SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
 98	.scbrr_algo_id	= SCBRR_ALGO_1,
 99	.type		= PORT_SCIF,
100	.irqs		= SCIx_IRQ_MUXED(evt2irq(0x9c0)),
101	.regtype	= SCIx_SH4_SCIF_FIFODATA_REGTYPE,
102};
103
104static struct platform_device scif4_device = {
105	.name		= "sh-sci",
106	.id		= 4,
107	.dev		= {
108		.platform_data	= &scif4_platform_data,
109	},
110};
111
112static struct plat_sci_port scif5_platform_data = {
113	.mapbase	= 0xffef0000,
114	.flags		= UPF_BOOT_AUTOCONF,
115	.scscr		= SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
116	.scbrr_algo_id	= SCBRR_ALGO_1,
117	.type		= PORT_SCIF,
118	.irqs		= SCIx_IRQ_MUXED(evt2irq(0x9e0)),
119	.regtype	= SCIx_SH4_SCIF_FIFODATA_REGTYPE,
120};
121
122static struct platform_device scif5_device = {
123	.name		= "sh-sci",
124	.id		= 5,
125	.dev		= {
126		.platform_data	= &scif5_platform_data,
127	},
128};
129
130static struct sh_timer_config tmu0_platform_data = {
131	.channel_offset = 0x04,
132	.timer_bit = 0,
133	.clockevent_rating = 200,
134};
135
136static struct resource tmu0_resources[] = {
137	[0] = {
138		.start	= 0xffd80008,
139		.end	= 0xffd80013,
140		.flags	= IORESOURCE_MEM,
141	},
142	[1] = {
143		.start	= evt2irq(0x580),
144		.flags	= IORESOURCE_IRQ,
145	},
146};
147
148static struct platform_device tmu0_device = {
149	.name		= "sh_tmu",
150	.id		= 0,
151	.dev = {
152		.platform_data	= &tmu0_platform_data,
153	},
154	.resource	= tmu0_resources,
155	.num_resources	= ARRAY_SIZE(tmu0_resources),
156};
157
158static struct sh_timer_config tmu1_platform_data = {
159	.channel_offset = 0x10,
160	.timer_bit = 1,
161	.clocksource_rating = 200,
162};
163
164static struct resource tmu1_resources[] = {
165	[0] = {
166		.start	= 0xffd80014,
167		.end	= 0xffd8001f,
168		.flags	= IORESOURCE_MEM,
169	},
170	[1] = {
171		.start	= evt2irq(0x5a0),
172		.flags	= IORESOURCE_IRQ,
173	},
174};
175
176static struct platform_device tmu1_device = {
177	.name		= "sh_tmu",
178	.id		= 1,
179	.dev = {
180		.platform_data	= &tmu1_platform_data,
181	},
182	.resource	= tmu1_resources,
183	.num_resources	= ARRAY_SIZE(tmu1_resources),
184};
185
186static struct sh_timer_config tmu2_platform_data = {
187	.channel_offset = 0x1c,
188	.timer_bit = 2,
189};
190
191static struct resource tmu2_resources[] = {
192	[0] = {
193		.start	= 0xffd80020,
194		.end	= 0xffd8002f,
195		.flags	= IORESOURCE_MEM,
196	},
197	[1] = {
198		.start	= evt2irq(0x5c0),
199		.flags	= IORESOURCE_IRQ,
200	},
201};
202
203static struct platform_device tmu2_device = {
204	.name		= "sh_tmu",
205	.id		= 2,
206	.dev = {
207		.platform_data	= &tmu2_platform_data,
208	},
209	.resource	= tmu2_resources,
210	.num_resources	= ARRAY_SIZE(tmu2_resources),
211};
212
213static struct sh_timer_config tmu3_platform_data = {
214	.channel_offset = 0x04,
215	.timer_bit = 0,
216};
217
218static struct resource tmu3_resources[] = {
219	[0] = {
220		.start	= 0xffdc0008,
221		.end	= 0xffdc0013,
222		.flags	= IORESOURCE_MEM,
223	},
224	[1] = {
225		.start	= evt2irq(0xe00),
226		.flags	= IORESOURCE_IRQ,
227	},
228};
229
230static struct platform_device tmu3_device = {
231	.name		= "sh_tmu",
232	.id		= 3,
233	.dev = {
234		.platform_data	= &tmu3_platform_data,
235	},
236	.resource	= tmu3_resources,
237	.num_resources	= ARRAY_SIZE(tmu3_resources),
238};
239
240static struct sh_timer_config tmu4_platform_data = {
241	.channel_offset = 0x10,
242	.timer_bit = 1,
243};
244
245static struct resource tmu4_resources[] = {
246	[0] = {
247		.start	= 0xffdc0014,
248		.end	= 0xffdc001f,
249		.flags	= IORESOURCE_MEM,
250	},
251	[1] = {
252		.start	= evt2irq(0xe20),
253		.flags	= IORESOURCE_IRQ,
254	},
255};
256
257static struct platform_device tmu4_device = {
258	.name		= "sh_tmu",
259	.id		= 4,
260	.dev = {
261		.platform_data	= &tmu4_platform_data,
262	},
263	.resource	= tmu4_resources,
264	.num_resources	= ARRAY_SIZE(tmu4_resources),
265};
266
267static struct sh_timer_config tmu5_platform_data = {
268	.channel_offset = 0x1c,
269	.timer_bit = 2,
270};
271
272static struct resource tmu5_resources[] = {
273	[0] = {
274		.start	= 0xffdc0020,
275		.end	= 0xffdc002b,
276		.flags	= IORESOURCE_MEM,
277	},
278	[1] = {
279		.start	= evt2irq(0xe40),
280		.flags	= IORESOURCE_IRQ,
281	},
282};
283
284static struct platform_device tmu5_device = {
285	.name		= "sh_tmu",
286	.id		= 5,
287	.dev = {
288		.platform_data	= &tmu5_platform_data,
289	},
290	.resource	= tmu5_resources,
291	.num_resources	= ARRAY_SIZE(tmu5_resources),
292};
293
294/* DMA */
295static const struct sh_dmae_channel sh7785_dmae0_channels[] = {
296	{
297		.offset = 0,
298		.dmars = 0,
299		.dmars_bit = 0,
300	}, {
301		.offset = 0x10,
302		.dmars = 0,
303		.dmars_bit = 8,
304	}, {
305		.offset = 0x20,
306		.dmars = 4,
307		.dmars_bit = 0,
308	}, {
309		.offset = 0x30,
310		.dmars = 4,
311		.dmars_bit = 8,
312	}, {
313		.offset = 0x50,
314		.dmars = 8,
315		.dmars_bit = 0,
316	}, {
317		.offset = 0x60,
318		.dmars = 8,
319		.dmars_bit = 8,
320	}
321};
322
323static const struct sh_dmae_channel sh7785_dmae1_channels[] = {
324	{
325		.offset = 0,
326	}, {
327		.offset = 0x10,
328	}, {
329		.offset = 0x20,
330	}, {
331		.offset = 0x30,
332	}, {
333		.offset = 0x50,
334	}, {
335		.offset = 0x60,
336	}
337};
338
339static const unsigned int ts_shift[] = TS_SHIFT;
340
341static struct sh_dmae_pdata dma0_platform_data = {
342	.channel	= sh7785_dmae0_channels,
343	.channel_num	= ARRAY_SIZE(sh7785_dmae0_channels),
344	.ts_low_shift	= CHCR_TS_LOW_SHIFT,
345	.ts_low_mask	= CHCR_TS_LOW_MASK,
346	.ts_high_shift	= CHCR_TS_HIGH_SHIFT,
347	.ts_high_mask	= CHCR_TS_HIGH_MASK,
348	.ts_shift	= ts_shift,
349	.ts_shift_num	= ARRAY_SIZE(ts_shift),
350	.dmaor_init	= DMAOR_INIT,
351};
352
353static struct sh_dmae_pdata dma1_platform_data = {
354	.channel	= sh7785_dmae1_channels,
355	.channel_num	= ARRAY_SIZE(sh7785_dmae1_channels),
356	.ts_low_shift	= CHCR_TS_LOW_SHIFT,
357	.ts_low_mask	= CHCR_TS_LOW_MASK,
358	.ts_high_shift	= CHCR_TS_HIGH_SHIFT,
359	.ts_high_mask	= CHCR_TS_HIGH_MASK,
360	.ts_shift	= ts_shift,
361	.ts_shift_num	= ARRAY_SIZE(ts_shift),
362	.dmaor_init	= DMAOR_INIT,
363};
364
365static struct resource sh7785_dmae0_resources[] = {
366	[0] = {
367		/* Channel registers and DMAOR */
368		.start	= 0xfc808020,
369		.end	= 0xfc80808f,
370		.flags	= IORESOURCE_MEM,
371	},
372	[1] = {
373		/* DMARSx */
374		.start	= 0xfc809000,
375		.end	= 0xfc80900b,
376		.flags	= IORESOURCE_MEM,
377	},
378	{
379		/*
380		 * Real DMA error vector is 0x6e0, and channel
381		 * vectors are 0x620-0x6c0
382		 */
383		.name	= "error_irq",
384		.start	= evt2irq(0x620),
385		.end	= evt2irq(0x620),
386		.flags	= IORESOURCE_IRQ | IORESOURCE_IRQ_SHAREABLE,
387	},
388};
389
390static struct resource sh7785_dmae1_resources[] = {
391	[0] = {
392		/* Channel registers and DMAOR */
393		.start	= 0xfcc08020,
394		.end	= 0xfcc0808f,
395		.flags	= IORESOURCE_MEM,
396	},
397	/* DMAC1 has no DMARS */
398	{
399		/*
400		 * Real DMA error vector is 0x940, and channel
401		 * vectors are 0x880-0x920
402		 */
403		.name	= "error_irq",
404		.start	= evt2irq(0x880),
405		.end	= evt2irq(0x880),
406		.flags	= IORESOURCE_IRQ | IORESOURCE_IRQ_SHAREABLE,
407	},
408};
409
410static struct platform_device dma0_device = {
411	.name           = "sh-dma-engine",
412	.id             = 0,
413	.resource	= sh7785_dmae0_resources,
414	.num_resources	= ARRAY_SIZE(sh7785_dmae0_resources),
415	.dev            = {
416		.platform_data	= &dma0_platform_data,
417	},
418};
419
420static struct platform_device dma1_device = {
421	.name		= "sh-dma-engine",
422	.id		= 1,
423	.resource	= sh7785_dmae1_resources,
424	.num_resources	= ARRAY_SIZE(sh7785_dmae1_resources),
425	.dev		= {
426		.platform_data	= &dma1_platform_data,
427	},
428};
429
430static struct platform_device *sh7785_devices[] __initdata = {
431	&scif0_device,
432	&scif1_device,
433	&scif2_device,
434	&scif3_device,
435	&scif4_device,
436	&scif5_device,
437	&tmu0_device,
438	&tmu1_device,
439	&tmu2_device,
440	&tmu3_device,
441	&tmu4_device,
442	&tmu5_device,
443	&dma0_device,
444	&dma1_device,
445};
446
447static int __init sh7785_devices_setup(void)
448{
449	return platform_add_devices(sh7785_devices,
450				    ARRAY_SIZE(sh7785_devices));
451}
452arch_initcall(sh7785_devices_setup);
453
454static struct platform_device *sh7785_early_devices[] __initdata = {
455	&scif0_device,
456	&scif1_device,
457	&scif2_device,
458	&scif3_device,
459	&scif4_device,
460	&scif5_device,
461	&tmu0_device,
462	&tmu1_device,
463	&tmu2_device,
464	&tmu3_device,
465	&tmu4_device,
466	&tmu5_device,
467};
468
469void __init plat_early_device_setup(void)
470{
471	early_platform_add_devices(sh7785_early_devices,
472				   ARRAY_SIZE(sh7785_early_devices));
473}
474
475enum {
476	UNUSED = 0,
477
478	/* interrupt sources */
479
480	IRL0_LLLL, IRL0_LLLH, IRL0_LLHL, IRL0_LLHH,
481	IRL0_LHLL, IRL0_LHLH, IRL0_LHHL, IRL0_LHHH,
482	IRL0_HLLL, IRL0_HLLH, IRL0_HLHL, IRL0_HLHH,
483	IRL0_HHLL, IRL0_HHLH, IRL0_HHHL,
484
485	IRL4_LLLL, IRL4_LLLH, IRL4_LLHL, IRL4_LLHH,
486	IRL4_LHLL, IRL4_LHLH, IRL4_LHHL, IRL4_LHHH,
487	IRL4_HLLL, IRL4_HLLH, IRL4_HLHL, IRL4_HLHH,
488	IRL4_HHLL, IRL4_HHLH, IRL4_HHHL,
489
490	IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7,
491	WDT, TMU0, TMU1, TMU2, TMU2_TICPI,
492	HUDI, DMAC0, SCIF0, SCIF1, DMAC1, HSPI,
493	SCIF2, SCIF3, SCIF4, SCIF5,
494	PCISERR, PCIINTA, PCIINTB, PCIINTC, PCIINTD, PCIC5,
495	SIOF, MMCIF, DU, GDTA,
496	TMU3, TMU4, TMU5,
497	SSI0, SSI1,
498	HAC0, HAC1,
499	FLCTL, GPIO,
500
501	/* interrupt groups */
502
503	TMU012,	TMU345
504};
505
506static struct intc_vect vectors[] __initdata = {
507	INTC_VECT(WDT, 0x560),
508	INTC_VECT(TMU0, 0x580), INTC_VECT(TMU1, 0x5a0),
509	INTC_VECT(TMU2, 0x5c0), INTC_VECT(TMU2_TICPI, 0x5e0),
510	INTC_VECT(HUDI, 0x600),
511	INTC_VECT(DMAC0, 0x620), INTC_VECT(DMAC0, 0x640),
512	INTC_VECT(DMAC0, 0x660), INTC_VECT(DMAC0, 0x680),
513	INTC_VECT(DMAC0, 0x6a0), INTC_VECT(DMAC0, 0x6c0),
514	INTC_VECT(DMAC0, 0x6e0),
515	INTC_VECT(SCIF0, 0x700), INTC_VECT(SCIF0, 0x720),
516	INTC_VECT(SCIF0, 0x740), INTC_VECT(SCIF0, 0x760),
517	INTC_VECT(SCIF1, 0x780), INTC_VECT(SCIF1, 0x7a0),
518	INTC_VECT(SCIF1, 0x7c0), INTC_VECT(SCIF1, 0x7e0),
519	INTC_VECT(DMAC1, 0x880), INTC_VECT(DMAC1, 0x8a0),
520	INTC_VECT(DMAC1, 0x8c0), INTC_VECT(DMAC1, 0x8e0),
521	INTC_VECT(DMAC1, 0x900), INTC_VECT(DMAC1, 0x920),
522	INTC_VECT(DMAC1, 0x940),
523	INTC_VECT(HSPI, 0x960),
524	INTC_VECT(SCIF2, 0x980), INTC_VECT(SCIF3, 0x9a0),
525	INTC_VECT(SCIF4, 0x9c0), INTC_VECT(SCIF5, 0x9e0),
526	INTC_VECT(PCISERR, 0xa00), INTC_VECT(PCIINTA, 0xa20),
527	INTC_VECT(PCIINTB, 0xa40), INTC_VECT(PCIINTC, 0xa60),
528	INTC_VECT(PCIINTD, 0xa80), INTC_VECT(PCIC5, 0xaa0),
529	INTC_VECT(PCIC5, 0xac0), INTC_VECT(PCIC5, 0xae0),
530	INTC_VECT(PCIC5, 0xb00), INTC_VECT(PCIC5, 0xb20),
531	INTC_VECT(SIOF, 0xc00),
532	INTC_VECT(MMCIF, 0xd00), INTC_VECT(MMCIF, 0xd20),
533	INTC_VECT(MMCIF, 0xd40), INTC_VECT(MMCIF, 0xd60),
534	INTC_VECT(DU, 0xd80),
535	INTC_VECT(GDTA, 0xda0), INTC_VECT(GDTA, 0xdc0),
536	INTC_VECT(GDTA, 0xde0),
537	INTC_VECT(TMU3, 0xe00), INTC_VECT(TMU4, 0xe20),
538	INTC_VECT(TMU5, 0xe40),
539	INTC_VECT(SSI0, 0xe80), INTC_VECT(SSI1, 0xea0),
540	INTC_VECT(HAC0, 0xec0), INTC_VECT(HAC1, 0xee0),
541	INTC_VECT(FLCTL, 0xf00), INTC_VECT(FLCTL, 0xf20),
542	INTC_VECT(FLCTL, 0xf40), INTC_VECT(FLCTL, 0xf60),
543	INTC_VECT(GPIO, 0xf80), INTC_VECT(GPIO, 0xfa0),
544	INTC_VECT(GPIO, 0xfc0), INTC_VECT(GPIO, 0xfe0),
545};
546
547static struct intc_group groups[] __initdata = {
548	INTC_GROUP(TMU012, TMU0, TMU1, TMU2, TMU2_TICPI),
549	INTC_GROUP(TMU345, TMU3, TMU4, TMU5),
550};
551
552static struct intc_mask_reg mask_registers[] __initdata = {
553	{ 0xffd00044, 0xffd00064, 32, /* INTMSK0 / INTMSKCLR0 */
554	  { IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7 } },
555
556	{ 0xffd40080, 0xffd40084, 32, /* INTMSK2 / INTMSKCLR2 */
557	  { IRL0_LLLL, IRL0_LLLH, IRL0_LLHL, IRL0_LLHH,
558	    IRL0_LHLL, IRL0_LHLH, IRL0_LHHL, IRL0_LHHH,
559	    IRL0_HLLL, IRL0_HLLH, IRL0_HLHL, IRL0_HLHH,
560	    IRL0_HHLL, IRL0_HHLH, IRL0_HHHL, 0,
561	    IRL4_LLLL, IRL4_LLLH, IRL4_LLHL, IRL4_LLHH,
562	    IRL4_LHLL, IRL4_LHLH, IRL4_LHHL, IRL4_LHHH,
563	    IRL4_HLLL, IRL4_HLLH, IRL4_HLHL, IRL4_HLHH,
564	    IRL4_HHLL, IRL4_HHLH, IRL4_HHHL, 0, } },
565
566	{ 0xffd40038, 0xffd4003c, 32, /* INT2MSKR / INT2MSKCR */
567	  { 0, 0, 0, GDTA, DU, SSI0, SSI1, GPIO,
568	    FLCTL, MMCIF, HSPI, SIOF, PCIC5, PCIINTD, PCIINTC, PCIINTB,
569	    PCIINTA, PCISERR, HAC1, HAC0, DMAC1, DMAC0, HUDI, WDT,
570	    SCIF5, SCIF4, SCIF3, SCIF2, SCIF1, SCIF0, TMU345, TMU012 } },
571};
572
573static struct intc_prio_reg prio_registers[] __initdata = {
574	{ 0xffd00010, 0, 32, 4, /* INTPRI */   { IRQ0, IRQ1, IRQ2, IRQ3,
575						 IRQ4, IRQ5, IRQ6, IRQ7 } },
576	{ 0xffd40000, 0, 32, 8, /* INT2PRI0 */ { TMU0, TMU1,
577						 TMU2, TMU2_TICPI } },
578	{ 0xffd40004, 0, 32, 8, /* INT2PRI1 */ { TMU3, TMU4, TMU5, } },
579	{ 0xffd40008, 0, 32, 8, /* INT2PRI2 */ { SCIF0, SCIF1,
580						 SCIF2, SCIF3 } },
581	{ 0xffd4000c, 0, 32, 8, /* INT2PRI3 */ { SCIF4, SCIF5, WDT, } },
582	{ 0xffd40010, 0, 32, 8, /* INT2PRI4 */ { HUDI, DMAC0, DMAC1, } },
583	{ 0xffd40014, 0, 32, 8, /* INT2PRI5 */ { HAC0, HAC1,
584						 PCISERR, PCIINTA } },
585	{ 0xffd40018, 0, 32, 8, /* INT2PRI6 */ { PCIINTB, PCIINTC,
586						 PCIINTD, PCIC5 } },
587	{ 0xffd4001c, 0, 32, 8, /* INT2PRI7 */ { SIOF, HSPI, MMCIF, } },
588	{ 0xffd40020, 0, 32, 8, /* INT2PRI8 */ { FLCTL, GPIO, SSI0, SSI1, } },
589	{ 0xffd40024, 0, 32, 8, /* INT2PRI9 */ { DU, GDTA, } },
590};
591
592static DECLARE_INTC_DESC(intc_desc, "sh7785", vectors, groups,
593			 mask_registers, prio_registers, NULL);
594
595/* Support for external interrupt pins in IRQ mode */
596
597static struct intc_vect vectors_irq0123[] __initdata = {
598	INTC_VECT(IRQ0, 0x240), INTC_VECT(IRQ1, 0x280),
599	INTC_VECT(IRQ2, 0x2c0), INTC_VECT(IRQ3, 0x300),
600};
601
602static struct intc_vect vectors_irq4567[] __initdata = {
603	INTC_VECT(IRQ4, 0x340), INTC_VECT(IRQ5, 0x380),
604	INTC_VECT(IRQ6, 0x3c0), INTC_VECT(IRQ7, 0x200),
605};
606
607static struct intc_sense_reg sense_registers[] __initdata = {
608	{ 0xffd0001c, 32, 2, /* ICR1 */   { IRQ0, IRQ1, IRQ2, IRQ3,
609					    IRQ4, IRQ5, IRQ6, IRQ7 } },
610};
611
612static struct intc_mask_reg ack_registers[] __initdata = {
613	{ 0xffd00024, 0, 32, /* INTREQ */
614	  { IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7 } },
615};
616
617static DECLARE_INTC_DESC_ACK(intc_desc_irq0123, "sh7785-irq0123",
618			     vectors_irq0123, NULL, mask_registers,
619			     prio_registers, sense_registers, ack_registers);
620
621static DECLARE_INTC_DESC_ACK(intc_desc_irq4567, "sh7785-irq4567",
622			     vectors_irq4567, NULL, mask_registers,
623			     prio_registers, sense_registers, ack_registers);
624
625/* External interrupt pins in IRL mode */
626
627static struct intc_vect vectors_irl0123[] __initdata = {
628	INTC_VECT(IRL0_LLLL, 0x200), INTC_VECT(IRL0_LLLH, 0x220),
629	INTC_VECT(IRL0_LLHL, 0x240), INTC_VECT(IRL0_LLHH, 0x260),
630	INTC_VECT(IRL0_LHLL, 0x280), INTC_VECT(IRL0_LHLH, 0x2a0),
631	INTC_VECT(IRL0_LHHL, 0x2c0), INTC_VECT(IRL0_LHHH, 0x2e0),
632	INTC_VECT(IRL0_HLLL, 0x300), INTC_VECT(IRL0_HLLH, 0x320),
633	INTC_VECT(IRL0_HLHL, 0x340), INTC_VECT(IRL0_HLHH, 0x360),
634	INTC_VECT(IRL0_HHLL, 0x380), INTC_VECT(IRL0_HHLH, 0x3a0),
635	INTC_VECT(IRL0_HHHL, 0x3c0),
636};
637
638static struct intc_vect vectors_irl4567[] __initdata = {
639	INTC_VECT(IRL4_LLLL, 0xb00), INTC_VECT(IRL4_LLLH, 0xb20),
640	INTC_VECT(IRL4_LLHL, 0xb40), INTC_VECT(IRL4_LLHH, 0xb60),
641	INTC_VECT(IRL4_LHLL, 0xb80), INTC_VECT(IRL4_LHLH, 0xba0),
642	INTC_VECT(IRL4_LHHL, 0xbc0), INTC_VECT(IRL4_LHHH, 0xbe0),
643	INTC_VECT(IRL4_HLLL, 0xc00), INTC_VECT(IRL4_HLLH, 0xc20),
644	INTC_VECT(IRL4_HLHL, 0xc40), INTC_VECT(IRL4_HLHH, 0xc60),
645	INTC_VECT(IRL4_HHLL, 0xc80), INTC_VECT(IRL4_HHLH, 0xca0),
646	INTC_VECT(IRL4_HHHL, 0xcc0),
647};
648
649static DECLARE_INTC_DESC(intc_desc_irl0123, "sh7785-irl0123", vectors_irl0123,
650			 NULL, mask_registers, NULL, NULL);
651
652static DECLARE_INTC_DESC(intc_desc_irl4567, "sh7785-irl4567", vectors_irl4567,
653			 NULL, mask_registers, NULL, NULL);
654
655#define INTC_ICR0	0xffd00000
656#define INTC_INTMSK0	0xffd00044
657#define INTC_INTMSK1	0xffd00048
658#define INTC_INTMSK2	0xffd40080
659#define INTC_INTMSKCLR1	0xffd00068
660#define INTC_INTMSKCLR2	0xffd40084
661
662void __init plat_irq_setup(void)
663{
664	/* disable IRQ3-0 + IRQ7-4 */
665	__raw_writel(0xff000000, INTC_INTMSK0);
666
667	/* disable IRL3-0 + IRL7-4 */
668	__raw_writel(0xc0000000, INTC_INTMSK1);
669	__raw_writel(0xfffefffe, INTC_INTMSK2);
670
671	/* select IRL mode for IRL3-0 + IRL7-4 */
672	__raw_writel(__raw_readl(INTC_ICR0) & ~0x00c00000, INTC_ICR0);
673
674	/* disable holding function, ie enable "SH-4 Mode" */
675	__raw_writel(__raw_readl(INTC_ICR0) | 0x00200000, INTC_ICR0);
676
677	register_intc_controller(&intc_desc);
678}
679
680void __init plat_irq_setup_pins(int mode)
681{
682	switch (mode) {
683	case IRQ_MODE_IRQ7654:
684		/* select IRQ mode for IRL7-4 */
685		__raw_writel(__raw_readl(INTC_ICR0) | 0x00400000, INTC_ICR0);
686		register_intc_controller(&intc_desc_irq4567);
687		break;
688	case IRQ_MODE_IRQ3210:
689		/* select IRQ mode for IRL3-0 */
690		__raw_writel(__raw_readl(INTC_ICR0) | 0x00800000, INTC_ICR0);
691		register_intc_controller(&intc_desc_irq0123);
692		break;
693	case IRQ_MODE_IRL7654:
694		/* enable IRL7-4 but don't provide any masking */
695		__raw_writel(0x40000000, INTC_INTMSKCLR1);
696		__raw_writel(0x0000fffe, INTC_INTMSKCLR2);
697		break;
698	case IRQ_MODE_IRL3210:
699		/* enable IRL0-3 but don't provide any masking */
700		__raw_writel(0x80000000, INTC_INTMSKCLR1);
701		__raw_writel(0xfffe0000, INTC_INTMSKCLR2);
702		break;
703	case IRQ_MODE_IRL7654_MASK:
704		/* enable IRL7-4 and mask using cpu intc controller */
705		__raw_writel(0x40000000, INTC_INTMSKCLR1);
706		register_intc_controller(&intc_desc_irl4567);
707		break;
708	case IRQ_MODE_IRL3210_MASK:
709		/* enable IRL0-3 and mask using cpu intc controller */
710		__raw_writel(0x80000000, INTC_INTMSKCLR1);
711		register_intc_controller(&intc_desc_irl0123);
712		break;
713	default:
714		BUG();
715	}
716}
717
718void __init plat_mem_setup(void)
719{
720	/* Register the URAM space as Node 1 */
721	setup_bootmem_node(1, 0xe55f0000, 0xe5610000);
722}
v3.1
  1/*
  2 * SH7785 Setup
  3 *
  4 *  Copyright (C) 2007  Paul Mundt
  5 *
  6 * This file is subject to the terms and conditions of the GNU General Public
  7 * License.  See the file "COPYING" in the main directory of this archive
  8 * for more details.
  9 */
 10#include <linux/platform_device.h>
 11#include <linux/init.h>
 12#include <linux/serial.h>
 13#include <linux/serial_sci.h>
 14#include <linux/io.h>
 15#include <linux/mm.h>
 16#include <linux/sh_dma.h>
 17#include <linux/sh_timer.h>
 
 18#include <asm/mmzone.h>
 19#include <cpu/dma-register.h>
 20
 21static struct plat_sci_port scif0_platform_data = {
 22	.mapbase	= 0xffea0000,
 23	.flags		= UPF_BOOT_AUTOCONF,
 24	.scscr		= SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
 25	.scbrr_algo_id	= SCBRR_ALGO_1,
 26	.type		= PORT_SCIF,
 27	.irqs		= { 40, 40, 40, 40 },
 28	.regtype	= SCIx_SH4_SCIF_FIFODATA_REGTYPE,
 29};
 30
 31static struct platform_device scif0_device = {
 32	.name		= "sh-sci",
 33	.id		= 0,
 34	.dev		= {
 35		.platform_data	= &scif0_platform_data,
 36	},
 37};
 38
 39static struct plat_sci_port scif1_platform_data = {
 40	.mapbase	= 0xffeb0000,
 41	.flags		= UPF_BOOT_AUTOCONF,
 42	.scscr		= SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
 43	.scbrr_algo_id	= SCBRR_ALGO_1,
 44	.type		= PORT_SCIF,
 45	.irqs		= { 44, 44, 44, 44 },
 46	.regtype	= SCIx_SH4_SCIF_FIFODATA_REGTYPE,
 47};
 48
 49static struct platform_device scif1_device = {
 50	.name		= "sh-sci",
 51	.id		= 1,
 52	.dev		= {
 53		.platform_data	= &scif1_platform_data,
 54	},
 55};
 56
 57static struct plat_sci_port scif2_platform_data = {
 58	.mapbase	= 0xffec0000,
 59	.flags		= UPF_BOOT_AUTOCONF,
 60	.scscr		= SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
 61	.scbrr_algo_id	= SCBRR_ALGO_1,
 62	.type		= PORT_SCIF,
 63	.irqs		= { 60, 60, 60, 60 },
 64	.regtype	= SCIx_SH4_SCIF_FIFODATA_REGTYPE,
 65};
 66
 67static struct platform_device scif2_device = {
 68	.name		= "sh-sci",
 69	.id		= 2,
 70	.dev		= {
 71		.platform_data	= &scif2_platform_data,
 72	},
 73};
 74
 75static struct plat_sci_port scif3_platform_data = {
 76	.mapbase	= 0xffed0000,
 77	.flags		= UPF_BOOT_AUTOCONF,
 78	.scscr		= SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
 79	.scbrr_algo_id	= SCBRR_ALGO_1,
 80	.type		= PORT_SCIF,
 81	.irqs		= { 61, 61, 61, 61 },
 82	.regtype	= SCIx_SH4_SCIF_FIFODATA_REGTYPE,
 83};
 84
 85static struct platform_device scif3_device = {
 86	.name		= "sh-sci",
 87	.id		= 3,
 88	.dev		= {
 89		.platform_data	= &scif3_platform_data,
 90	},
 91};
 92
 93static struct plat_sci_port scif4_platform_data = {
 94	.mapbase	= 0xffee0000,
 95	.flags		= UPF_BOOT_AUTOCONF,
 96	.scscr		= SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
 97	.scbrr_algo_id	= SCBRR_ALGO_1,
 98	.type		= PORT_SCIF,
 99	.irqs		= { 62, 62, 62, 62 },
100	.regtype	= SCIx_SH4_SCIF_FIFODATA_REGTYPE,
101};
102
103static struct platform_device scif4_device = {
104	.name		= "sh-sci",
105	.id		= 4,
106	.dev		= {
107		.platform_data	= &scif4_platform_data,
108	},
109};
110
111static struct plat_sci_port scif5_platform_data = {
112	.mapbase	= 0xffef0000,
113	.flags		= UPF_BOOT_AUTOCONF,
114	.scscr		= SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
115	.scbrr_algo_id	= SCBRR_ALGO_1,
116	.type		= PORT_SCIF,
117	.irqs		= { 63, 63, 63, 63 },
118	.regtype	= SCIx_SH4_SCIF_FIFODATA_REGTYPE,
119};
120
121static struct platform_device scif5_device = {
122	.name		= "sh-sci",
123	.id		= 5,
124	.dev		= {
125		.platform_data	= &scif5_platform_data,
126	},
127};
128
129static struct sh_timer_config tmu0_platform_data = {
130	.channel_offset = 0x04,
131	.timer_bit = 0,
132	.clockevent_rating = 200,
133};
134
135static struct resource tmu0_resources[] = {
136	[0] = {
137		.start	= 0xffd80008,
138		.end	= 0xffd80013,
139		.flags	= IORESOURCE_MEM,
140	},
141	[1] = {
142		.start	= 28,
143		.flags	= IORESOURCE_IRQ,
144	},
145};
146
147static struct platform_device tmu0_device = {
148	.name		= "sh_tmu",
149	.id		= 0,
150	.dev = {
151		.platform_data	= &tmu0_platform_data,
152	},
153	.resource	= tmu0_resources,
154	.num_resources	= ARRAY_SIZE(tmu0_resources),
155};
156
157static struct sh_timer_config tmu1_platform_data = {
158	.channel_offset = 0x10,
159	.timer_bit = 1,
160	.clocksource_rating = 200,
161};
162
163static struct resource tmu1_resources[] = {
164	[0] = {
165		.start	= 0xffd80014,
166		.end	= 0xffd8001f,
167		.flags	= IORESOURCE_MEM,
168	},
169	[1] = {
170		.start	= 29,
171		.flags	= IORESOURCE_IRQ,
172	},
173};
174
175static struct platform_device tmu1_device = {
176	.name		= "sh_tmu",
177	.id		= 1,
178	.dev = {
179		.platform_data	= &tmu1_platform_data,
180	},
181	.resource	= tmu1_resources,
182	.num_resources	= ARRAY_SIZE(tmu1_resources),
183};
184
185static struct sh_timer_config tmu2_platform_data = {
186	.channel_offset = 0x1c,
187	.timer_bit = 2,
188};
189
190static struct resource tmu2_resources[] = {
191	[0] = {
192		.start	= 0xffd80020,
193		.end	= 0xffd8002f,
194		.flags	= IORESOURCE_MEM,
195	},
196	[1] = {
197		.start	= 30,
198		.flags	= IORESOURCE_IRQ,
199	},
200};
201
202static struct platform_device tmu2_device = {
203	.name		= "sh_tmu",
204	.id		= 2,
205	.dev = {
206		.platform_data	= &tmu2_platform_data,
207	},
208	.resource	= tmu2_resources,
209	.num_resources	= ARRAY_SIZE(tmu2_resources),
210};
211
212static struct sh_timer_config tmu3_platform_data = {
213	.channel_offset = 0x04,
214	.timer_bit = 0,
215};
216
217static struct resource tmu3_resources[] = {
218	[0] = {
219		.start	= 0xffdc0008,
220		.end	= 0xffdc0013,
221		.flags	= IORESOURCE_MEM,
222	},
223	[1] = {
224		.start	= 96,
225		.flags	= IORESOURCE_IRQ,
226	},
227};
228
229static struct platform_device tmu3_device = {
230	.name		= "sh_tmu",
231	.id		= 3,
232	.dev = {
233		.platform_data	= &tmu3_platform_data,
234	},
235	.resource	= tmu3_resources,
236	.num_resources	= ARRAY_SIZE(tmu3_resources),
237};
238
239static struct sh_timer_config tmu4_platform_data = {
240	.channel_offset = 0x10,
241	.timer_bit = 1,
242};
243
244static struct resource tmu4_resources[] = {
245	[0] = {
246		.start	= 0xffdc0014,
247		.end	= 0xffdc001f,
248		.flags	= IORESOURCE_MEM,
249	},
250	[1] = {
251		.start	= 97,
252		.flags	= IORESOURCE_IRQ,
253	},
254};
255
256static struct platform_device tmu4_device = {
257	.name		= "sh_tmu",
258	.id		= 4,
259	.dev = {
260		.platform_data	= &tmu4_platform_data,
261	},
262	.resource	= tmu4_resources,
263	.num_resources	= ARRAY_SIZE(tmu4_resources),
264};
265
266static struct sh_timer_config tmu5_platform_data = {
267	.channel_offset = 0x1c,
268	.timer_bit = 2,
269};
270
271static struct resource tmu5_resources[] = {
272	[0] = {
273		.start	= 0xffdc0020,
274		.end	= 0xffdc002b,
275		.flags	= IORESOURCE_MEM,
276	},
277	[1] = {
278		.start	= 98,
279		.flags	= IORESOURCE_IRQ,
280	},
281};
282
283static struct platform_device tmu5_device = {
284	.name		= "sh_tmu",
285	.id		= 5,
286	.dev = {
287		.platform_data	= &tmu5_platform_data,
288	},
289	.resource	= tmu5_resources,
290	.num_resources	= ARRAY_SIZE(tmu5_resources),
291};
292
293/* DMA */
294static const struct sh_dmae_channel sh7785_dmae0_channels[] = {
295	{
296		.offset = 0,
297		.dmars = 0,
298		.dmars_bit = 0,
299	}, {
300		.offset = 0x10,
301		.dmars = 0,
302		.dmars_bit = 8,
303	}, {
304		.offset = 0x20,
305		.dmars = 4,
306		.dmars_bit = 0,
307	}, {
308		.offset = 0x30,
309		.dmars = 4,
310		.dmars_bit = 8,
311	}, {
312		.offset = 0x50,
313		.dmars = 8,
314		.dmars_bit = 0,
315	}, {
316		.offset = 0x60,
317		.dmars = 8,
318		.dmars_bit = 8,
319	}
320};
321
322static const struct sh_dmae_channel sh7785_dmae1_channels[] = {
323	{
324		.offset = 0,
325	}, {
326		.offset = 0x10,
327	}, {
328		.offset = 0x20,
329	}, {
330		.offset = 0x30,
331	}, {
332		.offset = 0x50,
333	}, {
334		.offset = 0x60,
335	}
336};
337
338static const unsigned int ts_shift[] = TS_SHIFT;
339
340static struct sh_dmae_pdata dma0_platform_data = {
341	.channel	= sh7785_dmae0_channels,
342	.channel_num	= ARRAY_SIZE(sh7785_dmae0_channels),
343	.ts_low_shift	= CHCR_TS_LOW_SHIFT,
344	.ts_low_mask	= CHCR_TS_LOW_MASK,
345	.ts_high_shift	= CHCR_TS_HIGH_SHIFT,
346	.ts_high_mask	= CHCR_TS_HIGH_MASK,
347	.ts_shift	= ts_shift,
348	.ts_shift_num	= ARRAY_SIZE(ts_shift),
349	.dmaor_init	= DMAOR_INIT,
350};
351
352static struct sh_dmae_pdata dma1_platform_data = {
353	.channel	= sh7785_dmae1_channels,
354	.channel_num	= ARRAY_SIZE(sh7785_dmae1_channels),
355	.ts_low_shift	= CHCR_TS_LOW_SHIFT,
356	.ts_low_mask	= CHCR_TS_LOW_MASK,
357	.ts_high_shift	= CHCR_TS_HIGH_SHIFT,
358	.ts_high_mask	= CHCR_TS_HIGH_MASK,
359	.ts_shift	= ts_shift,
360	.ts_shift_num	= ARRAY_SIZE(ts_shift),
361	.dmaor_init	= DMAOR_INIT,
362};
363
364static struct resource sh7785_dmae0_resources[] = {
365	[0] = {
366		/* Channel registers and DMAOR */
367		.start	= 0xfc808020,
368		.end	= 0xfc80808f,
369		.flags	= IORESOURCE_MEM,
370	},
371	[1] = {
372		/* DMARSx */
373		.start	= 0xfc809000,
374		.end	= 0xfc80900b,
375		.flags	= IORESOURCE_MEM,
376	},
377	{
378		/* Real DMA error IRQ is 39, and channel IRQs are 33-38 */
379		.start	= 33,
380		.end	= 33,
 
 
 
 
381		.flags	= IORESOURCE_IRQ | IORESOURCE_IRQ_SHAREABLE,
382	},
383};
384
385static struct resource sh7785_dmae1_resources[] = {
386	[0] = {
387		/* Channel registers and DMAOR */
388		.start	= 0xfcc08020,
389		.end	= 0xfcc0808f,
390		.flags	= IORESOURCE_MEM,
391	},
392	/* DMAC1 has no DMARS */
393	{
394		/* Real DMA error IRQ is 58, and channel IRQs are 52-57 */
395		.start	= 52,
396		.end	= 52,
 
 
 
 
397		.flags	= IORESOURCE_IRQ | IORESOURCE_IRQ_SHAREABLE,
398	},
399};
400
401static struct platform_device dma0_device = {
402	.name           = "sh-dma-engine",
403	.id             = 0,
404	.resource	= sh7785_dmae0_resources,
405	.num_resources	= ARRAY_SIZE(sh7785_dmae0_resources),
406	.dev            = {
407		.platform_data	= &dma0_platform_data,
408	},
409};
410
411static struct platform_device dma1_device = {
412	.name		= "sh-dma-engine",
413	.id		= 1,
414	.resource	= sh7785_dmae1_resources,
415	.num_resources	= ARRAY_SIZE(sh7785_dmae1_resources),
416	.dev		= {
417		.platform_data	= &dma1_platform_data,
418	},
419};
420
421static struct platform_device *sh7785_devices[] __initdata = {
422	&scif0_device,
423	&scif1_device,
424	&scif2_device,
425	&scif3_device,
426	&scif4_device,
427	&scif5_device,
428	&tmu0_device,
429	&tmu1_device,
430	&tmu2_device,
431	&tmu3_device,
432	&tmu4_device,
433	&tmu5_device,
434	&dma0_device,
435	&dma1_device,
436};
437
438static int __init sh7785_devices_setup(void)
439{
440	return platform_add_devices(sh7785_devices,
441				    ARRAY_SIZE(sh7785_devices));
442}
443arch_initcall(sh7785_devices_setup);
444
445static struct platform_device *sh7785_early_devices[] __initdata = {
446	&scif0_device,
447	&scif1_device,
448	&scif2_device,
449	&scif3_device,
450	&scif4_device,
451	&scif5_device,
452	&tmu0_device,
453	&tmu1_device,
454	&tmu2_device,
455	&tmu3_device,
456	&tmu4_device,
457	&tmu5_device,
458};
459
460void __init plat_early_device_setup(void)
461{
462	early_platform_add_devices(sh7785_early_devices,
463				   ARRAY_SIZE(sh7785_early_devices));
464}
465
466enum {
467	UNUSED = 0,
468
469	/* interrupt sources */
470
471	IRL0_LLLL, IRL0_LLLH, IRL0_LLHL, IRL0_LLHH,
472	IRL0_LHLL, IRL0_LHLH, IRL0_LHHL, IRL0_LHHH,
473	IRL0_HLLL, IRL0_HLLH, IRL0_HLHL, IRL0_HLHH,
474	IRL0_HHLL, IRL0_HHLH, IRL0_HHHL,
475
476	IRL4_LLLL, IRL4_LLLH, IRL4_LLHL, IRL4_LLHH,
477	IRL4_LHLL, IRL4_LHLH, IRL4_LHHL, IRL4_LHHH,
478	IRL4_HLLL, IRL4_HLLH, IRL4_HLHL, IRL4_HLHH,
479	IRL4_HHLL, IRL4_HHLH, IRL4_HHHL,
480
481	IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7,
482	WDT, TMU0, TMU1, TMU2, TMU2_TICPI,
483	HUDI, DMAC0, SCIF0, SCIF1, DMAC1, HSPI,
484	SCIF2, SCIF3, SCIF4, SCIF5,
485	PCISERR, PCIINTA, PCIINTB, PCIINTC, PCIINTD, PCIC5,
486	SIOF, MMCIF, DU, GDTA,
487	TMU3, TMU4, TMU5,
488	SSI0, SSI1,
489	HAC0, HAC1,
490	FLCTL, GPIO,
491
492	/* interrupt groups */
493
494	TMU012,	TMU345
495};
496
497static struct intc_vect vectors[] __initdata = {
498	INTC_VECT(WDT, 0x560),
499	INTC_VECT(TMU0, 0x580), INTC_VECT(TMU1, 0x5a0),
500	INTC_VECT(TMU2, 0x5c0), INTC_VECT(TMU2_TICPI, 0x5e0),
501	INTC_VECT(HUDI, 0x600),
502	INTC_VECT(DMAC0, 0x620), INTC_VECT(DMAC0, 0x640),
503	INTC_VECT(DMAC0, 0x660), INTC_VECT(DMAC0, 0x680),
504	INTC_VECT(DMAC0, 0x6a0), INTC_VECT(DMAC0, 0x6c0),
505	INTC_VECT(DMAC0, 0x6e0),
506	INTC_VECT(SCIF0, 0x700), INTC_VECT(SCIF0, 0x720),
507	INTC_VECT(SCIF0, 0x740), INTC_VECT(SCIF0, 0x760),
508	INTC_VECT(SCIF1, 0x780), INTC_VECT(SCIF1, 0x7a0),
509	INTC_VECT(SCIF1, 0x7c0), INTC_VECT(SCIF1, 0x7e0),
510	INTC_VECT(DMAC1, 0x880), INTC_VECT(DMAC1, 0x8a0),
511	INTC_VECT(DMAC1, 0x8c0), INTC_VECT(DMAC1, 0x8e0),
512	INTC_VECT(DMAC1, 0x900), INTC_VECT(DMAC1, 0x920),
513	INTC_VECT(DMAC1, 0x940),
514	INTC_VECT(HSPI, 0x960),
515	INTC_VECT(SCIF2, 0x980), INTC_VECT(SCIF3, 0x9a0),
516	INTC_VECT(SCIF4, 0x9c0), INTC_VECT(SCIF5, 0x9e0),
517	INTC_VECT(PCISERR, 0xa00), INTC_VECT(PCIINTA, 0xa20),
518	INTC_VECT(PCIINTB, 0xa40), INTC_VECT(PCIINTC, 0xa60),
519	INTC_VECT(PCIINTD, 0xa80), INTC_VECT(PCIC5, 0xaa0),
520	INTC_VECT(PCIC5, 0xac0), INTC_VECT(PCIC5, 0xae0),
521	INTC_VECT(PCIC5, 0xb00), INTC_VECT(PCIC5, 0xb20),
522	INTC_VECT(SIOF, 0xc00),
523	INTC_VECT(MMCIF, 0xd00), INTC_VECT(MMCIF, 0xd20),
524	INTC_VECT(MMCIF, 0xd40), INTC_VECT(MMCIF, 0xd60),
525	INTC_VECT(DU, 0xd80),
526	INTC_VECT(GDTA, 0xda0), INTC_VECT(GDTA, 0xdc0),
527	INTC_VECT(GDTA, 0xde0),
528	INTC_VECT(TMU3, 0xe00), INTC_VECT(TMU4, 0xe20),
529	INTC_VECT(TMU5, 0xe40),
530	INTC_VECT(SSI0, 0xe80), INTC_VECT(SSI1, 0xea0),
531	INTC_VECT(HAC0, 0xec0), INTC_VECT(HAC1, 0xee0),
532	INTC_VECT(FLCTL, 0xf00), INTC_VECT(FLCTL, 0xf20),
533	INTC_VECT(FLCTL, 0xf40), INTC_VECT(FLCTL, 0xf60),
534	INTC_VECT(GPIO, 0xf80), INTC_VECT(GPIO, 0xfa0),
535	INTC_VECT(GPIO, 0xfc0), INTC_VECT(GPIO, 0xfe0),
536};
537
538static struct intc_group groups[] __initdata = {
539	INTC_GROUP(TMU012, TMU0, TMU1, TMU2, TMU2_TICPI),
540	INTC_GROUP(TMU345, TMU3, TMU4, TMU5),
541};
542
543static struct intc_mask_reg mask_registers[] __initdata = {
544	{ 0xffd00044, 0xffd00064, 32, /* INTMSK0 / INTMSKCLR0 */
545	  { IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7 } },
546
547	{ 0xffd40080, 0xffd40084, 32, /* INTMSK2 / INTMSKCLR2 */
548	  { IRL0_LLLL, IRL0_LLLH, IRL0_LLHL, IRL0_LLHH,
549	    IRL0_LHLL, IRL0_LHLH, IRL0_LHHL, IRL0_LHHH,
550	    IRL0_HLLL, IRL0_HLLH, IRL0_HLHL, IRL0_HLHH,
551	    IRL0_HHLL, IRL0_HHLH, IRL0_HHHL, 0,
552	    IRL4_LLLL, IRL4_LLLH, IRL4_LLHL, IRL4_LLHH,
553	    IRL4_LHLL, IRL4_LHLH, IRL4_LHHL, IRL4_LHHH,
554	    IRL4_HLLL, IRL4_HLLH, IRL4_HLHL, IRL4_HLHH,
555	    IRL4_HHLL, IRL4_HHLH, IRL4_HHHL, 0, } },
556
557	{ 0xffd40038, 0xffd4003c, 32, /* INT2MSKR / INT2MSKCR */
558	  { 0, 0, 0, GDTA, DU, SSI0, SSI1, GPIO,
559	    FLCTL, MMCIF, HSPI, SIOF, PCIC5, PCIINTD, PCIINTC, PCIINTB,
560	    PCIINTA, PCISERR, HAC1, HAC0, DMAC1, DMAC0, HUDI, WDT,
561	    SCIF5, SCIF4, SCIF3, SCIF2, SCIF1, SCIF0, TMU345, TMU012 } },
562};
563
564static struct intc_prio_reg prio_registers[] __initdata = {
565	{ 0xffd00010, 0, 32, 4, /* INTPRI */   { IRQ0, IRQ1, IRQ2, IRQ3,
566						 IRQ4, IRQ5, IRQ6, IRQ7 } },
567	{ 0xffd40000, 0, 32, 8, /* INT2PRI0 */ { TMU0, TMU1,
568						 TMU2, TMU2_TICPI } },
569	{ 0xffd40004, 0, 32, 8, /* INT2PRI1 */ { TMU3, TMU4, TMU5, } },
570	{ 0xffd40008, 0, 32, 8, /* INT2PRI2 */ { SCIF0, SCIF1,
571						 SCIF2, SCIF3 } },
572	{ 0xffd4000c, 0, 32, 8, /* INT2PRI3 */ { SCIF4, SCIF5, WDT, } },
573	{ 0xffd40010, 0, 32, 8, /* INT2PRI4 */ { HUDI, DMAC0, DMAC1, } },
574	{ 0xffd40014, 0, 32, 8, /* INT2PRI5 */ { HAC0, HAC1,
575						 PCISERR, PCIINTA } },
576	{ 0xffd40018, 0, 32, 8, /* INT2PRI6 */ { PCIINTB, PCIINTC,
577						 PCIINTD, PCIC5 } },
578	{ 0xffd4001c, 0, 32, 8, /* INT2PRI7 */ { SIOF, HSPI, MMCIF, } },
579	{ 0xffd40020, 0, 32, 8, /* INT2PRI8 */ { FLCTL, GPIO, SSI0, SSI1, } },
580	{ 0xffd40024, 0, 32, 8, /* INT2PRI9 */ { DU, GDTA, } },
581};
582
583static DECLARE_INTC_DESC(intc_desc, "sh7785", vectors, groups,
584			 mask_registers, prio_registers, NULL);
585
586/* Support for external interrupt pins in IRQ mode */
587
588static struct intc_vect vectors_irq0123[] __initdata = {
589	INTC_VECT(IRQ0, 0x240), INTC_VECT(IRQ1, 0x280),
590	INTC_VECT(IRQ2, 0x2c0), INTC_VECT(IRQ3, 0x300),
591};
592
593static struct intc_vect vectors_irq4567[] __initdata = {
594	INTC_VECT(IRQ4, 0x340), INTC_VECT(IRQ5, 0x380),
595	INTC_VECT(IRQ6, 0x3c0), INTC_VECT(IRQ7, 0x200),
596};
597
598static struct intc_sense_reg sense_registers[] __initdata = {
599	{ 0xffd0001c, 32, 2, /* ICR1 */   { IRQ0, IRQ1, IRQ2, IRQ3,
600					    IRQ4, IRQ5, IRQ6, IRQ7 } },
601};
602
603static struct intc_mask_reg ack_registers[] __initdata = {
604	{ 0xffd00024, 0, 32, /* INTREQ */
605	  { IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7 } },
606};
607
608static DECLARE_INTC_DESC_ACK(intc_desc_irq0123, "sh7785-irq0123",
609			     vectors_irq0123, NULL, mask_registers,
610			     prio_registers, sense_registers, ack_registers);
611
612static DECLARE_INTC_DESC_ACK(intc_desc_irq4567, "sh7785-irq4567",
613			     vectors_irq4567, NULL, mask_registers,
614			     prio_registers, sense_registers, ack_registers);
615
616/* External interrupt pins in IRL mode */
617
618static struct intc_vect vectors_irl0123[] __initdata = {
619	INTC_VECT(IRL0_LLLL, 0x200), INTC_VECT(IRL0_LLLH, 0x220),
620	INTC_VECT(IRL0_LLHL, 0x240), INTC_VECT(IRL0_LLHH, 0x260),
621	INTC_VECT(IRL0_LHLL, 0x280), INTC_VECT(IRL0_LHLH, 0x2a0),
622	INTC_VECT(IRL0_LHHL, 0x2c0), INTC_VECT(IRL0_LHHH, 0x2e0),
623	INTC_VECT(IRL0_HLLL, 0x300), INTC_VECT(IRL0_HLLH, 0x320),
624	INTC_VECT(IRL0_HLHL, 0x340), INTC_VECT(IRL0_HLHH, 0x360),
625	INTC_VECT(IRL0_HHLL, 0x380), INTC_VECT(IRL0_HHLH, 0x3a0),
626	INTC_VECT(IRL0_HHHL, 0x3c0),
627};
628
629static struct intc_vect vectors_irl4567[] __initdata = {
630	INTC_VECT(IRL4_LLLL, 0xb00), INTC_VECT(IRL4_LLLH, 0xb20),
631	INTC_VECT(IRL4_LLHL, 0xb40), INTC_VECT(IRL4_LLHH, 0xb60),
632	INTC_VECT(IRL4_LHLL, 0xb80), INTC_VECT(IRL4_LHLH, 0xba0),
633	INTC_VECT(IRL4_LHHL, 0xbc0), INTC_VECT(IRL4_LHHH, 0xbe0),
634	INTC_VECT(IRL4_HLLL, 0xc00), INTC_VECT(IRL4_HLLH, 0xc20),
635	INTC_VECT(IRL4_HLHL, 0xc40), INTC_VECT(IRL4_HLHH, 0xc60),
636	INTC_VECT(IRL4_HHLL, 0xc80), INTC_VECT(IRL4_HHLH, 0xca0),
637	INTC_VECT(IRL4_HHHL, 0xcc0),
638};
639
640static DECLARE_INTC_DESC(intc_desc_irl0123, "sh7785-irl0123", vectors_irl0123,
641			 NULL, mask_registers, NULL, NULL);
642
643static DECLARE_INTC_DESC(intc_desc_irl4567, "sh7785-irl4567", vectors_irl4567,
644			 NULL, mask_registers, NULL, NULL);
645
646#define INTC_ICR0	0xffd00000
647#define INTC_INTMSK0	0xffd00044
648#define INTC_INTMSK1	0xffd00048
649#define INTC_INTMSK2	0xffd40080
650#define INTC_INTMSKCLR1	0xffd00068
651#define INTC_INTMSKCLR2	0xffd40084
652
653void __init plat_irq_setup(void)
654{
655	/* disable IRQ3-0 + IRQ7-4 */
656	__raw_writel(0xff000000, INTC_INTMSK0);
657
658	/* disable IRL3-0 + IRL7-4 */
659	__raw_writel(0xc0000000, INTC_INTMSK1);
660	__raw_writel(0xfffefffe, INTC_INTMSK2);
661
662	/* select IRL mode for IRL3-0 + IRL7-4 */
663	__raw_writel(__raw_readl(INTC_ICR0) & ~0x00c00000, INTC_ICR0);
664
665	/* disable holding function, ie enable "SH-4 Mode" */
666	__raw_writel(__raw_readl(INTC_ICR0) | 0x00200000, INTC_ICR0);
667
668	register_intc_controller(&intc_desc);
669}
670
671void __init plat_irq_setup_pins(int mode)
672{
673	switch (mode) {
674	case IRQ_MODE_IRQ7654:
675		/* select IRQ mode for IRL7-4 */
676		__raw_writel(__raw_readl(INTC_ICR0) | 0x00400000, INTC_ICR0);
677		register_intc_controller(&intc_desc_irq4567);
678		break;
679	case IRQ_MODE_IRQ3210:
680		/* select IRQ mode for IRL3-0 */
681		__raw_writel(__raw_readl(INTC_ICR0) | 0x00800000, INTC_ICR0);
682		register_intc_controller(&intc_desc_irq0123);
683		break;
684	case IRQ_MODE_IRL7654:
685		/* enable IRL7-4 but don't provide any masking */
686		__raw_writel(0x40000000, INTC_INTMSKCLR1);
687		__raw_writel(0x0000fffe, INTC_INTMSKCLR2);
688		break;
689	case IRQ_MODE_IRL3210:
690		/* enable IRL0-3 but don't provide any masking */
691		__raw_writel(0x80000000, INTC_INTMSKCLR1);
692		__raw_writel(0xfffe0000, INTC_INTMSKCLR2);
693		break;
694	case IRQ_MODE_IRL7654_MASK:
695		/* enable IRL7-4 and mask using cpu intc controller */
696		__raw_writel(0x40000000, INTC_INTMSKCLR1);
697		register_intc_controller(&intc_desc_irl4567);
698		break;
699	case IRQ_MODE_IRL3210_MASK:
700		/* enable IRL0-3 and mask using cpu intc controller */
701		__raw_writel(0x80000000, INTC_INTMSKCLR1);
702		register_intc_controller(&intc_desc_irl0123);
703		break;
704	default:
705		BUG();
706	}
707}
708
709void __init plat_mem_setup(void)
710{
711	/* Register the URAM space as Node 1 */
712	setup_bootmem_node(1, 0xe55f0000, 0xe5610000);
713}