• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/linux/linux-2.6.36/arch/sh/kernel/cpu/sh4a/
1/*
2 * SH7757 Setup
3 *
4 * Copyright (C) 2009  Renesas Solutions Corp.
5 *
6 *  based on setup-sh7785.c : Copyright (C) 2007  Paul Mundt
7 *
8 * This file is subject to the terms and conditions of the GNU General Public
9 * License.  See the file "COPYING" in the main directory of this archive
10 * for more details.
11 */
12#include <linux/platform_device.h>
13#include <linux/init.h>
14#include <linux/serial.h>
15#include <linux/serial_sci.h>
16#include <linux/io.h>
17#include <linux/mm.h>
18#include <linux/sh_timer.h>
19
20static struct plat_sci_port scif2_platform_data = {
21	.mapbase	= 0xfe4b0000,		/* SCIF2 */
22	.flags		= UPF_BOOT_AUTOCONF,
23	.type		= PORT_SCIF,
24	.irqs		= { 40, 40, 40, 40 },
25};
26
27static struct platform_device scif2_device = {
28	.name		= "sh-sci",
29	.id		= 2,
30	.dev		= {
31		.platform_data	= &scif2_platform_data,
32	},
33};
34
35static struct plat_sci_port scif3_platform_data = {
36	.mapbase	= 0xfe4c0000,		/* SCIF3 */
37	.flags		= UPF_BOOT_AUTOCONF,
38	.type		= PORT_SCIF,
39	.irqs		= { 76, 76, 76, 76 },
40};
41
42static struct platform_device scif3_device = {
43	.name		= "sh-sci",
44	.id		= 3,
45	.dev		= {
46		.platform_data	= &scif3_platform_data,
47	},
48};
49
50static struct plat_sci_port scif4_platform_data = {
51	.mapbase	= 0xfe4d0000,		/* SCIF4 */
52	.flags		= UPF_BOOT_AUTOCONF,
53	.type		= PORT_SCIF,
54	.irqs		= { 104, 104, 104, 104 },
55};
56
57static struct platform_device scif4_device = {
58	.name		= "sh-sci",
59	.id		= 4,
60	.dev		= {
61		.platform_data	= &scif4_platform_data,
62	},
63};
64
65static struct sh_timer_config tmu0_platform_data = {
66	.channel_offset = 0x04,
67	.timer_bit = 0,
68	.clockevent_rating = 200,
69};
70
71static struct resource tmu0_resources[] = {
72	[0] = {
73		.start	= 0xfe430008,
74		.end	= 0xfe430013,
75		.flags	= IORESOURCE_MEM,
76	},
77	[1] = {
78		.start	= 28,
79		.flags	= IORESOURCE_IRQ,
80	},
81};
82
83static struct platform_device tmu0_device = {
84	.name		= "sh_tmu",
85	.id		= 0,
86	.dev = {
87		.platform_data	= &tmu0_platform_data,
88	},
89	.resource	= tmu0_resources,
90	.num_resources	= ARRAY_SIZE(tmu0_resources),
91};
92
93static struct sh_timer_config tmu1_platform_data = {
94	.channel_offset = 0x10,
95	.timer_bit = 1,
96	.clocksource_rating = 200,
97};
98
99static struct resource tmu1_resources[] = {
100	[0] = {
101		.start	= 0xfe430014,
102		.end	= 0xfe43001f,
103		.flags	= IORESOURCE_MEM,
104	},
105	[1] = {
106		.start	= 29,
107		.flags	= IORESOURCE_IRQ,
108	},
109};
110
111static struct platform_device tmu1_device = {
112	.name		= "sh_tmu",
113	.id		= 1,
114	.dev = {
115		.platform_data	= &tmu1_platform_data,
116	},
117	.resource	= tmu1_resources,
118	.num_resources	= ARRAY_SIZE(tmu1_resources),
119};
120
121static struct platform_device *sh7757_devices[] __initdata = {
122	&scif2_device,
123	&scif3_device,
124	&scif4_device,
125	&tmu0_device,
126	&tmu1_device,
127};
128
129static int __init sh7757_devices_setup(void)
130{
131	return platform_add_devices(sh7757_devices,
132				    ARRAY_SIZE(sh7757_devices));
133}
134arch_initcall(sh7757_devices_setup);
135
136static struct platform_device *sh7757_early_devices[] __initdata = {
137	&scif2_device,
138	&scif3_device,
139	&scif4_device,
140	&tmu0_device,
141	&tmu1_device,
142};
143
144void __init plat_early_device_setup(void)
145{
146	early_platform_add_devices(sh7757_early_devices,
147				   ARRAY_SIZE(sh7757_early_devices));
148}
149
150enum {
151	UNUSED = 0,
152
153	/* interrupt sources */
154
155	IRL0_LLLL, IRL0_LLLH, IRL0_LLHL, IRL0_LLHH,
156	IRL0_LHLL, IRL0_LHLH, IRL0_LHHL, IRL0_LHHH,
157	IRL0_HLLL, IRL0_HLLH, IRL0_HLHL, IRL0_HLHH,
158	IRL0_HHLL, IRL0_HHLH, IRL0_HHHL,
159
160	IRL4_LLLL, IRL4_LLLH, IRL4_LLHL, IRL4_LLHH,
161	IRL4_LHLL, IRL4_LHLH, IRL4_LHHL, IRL4_LHHH,
162	IRL4_HLLL, IRL4_HLLH, IRL4_HLHL, IRL4_HLHH,
163	IRL4_HHLL, IRL4_HHLH, IRL4_HHHL,
164	IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7,
165
166	SDHI,
167	DVC,
168	IRQ8, IRQ9, IRQ10,
169	WDT0,
170	TMU0, TMU1, TMU2, TMU2_TICPI,
171	HUDI,
172
173	ARC4,
174	DMAC0,
175	IRQ11,
176	SCIF2,
177	DMAC1_6,
178	USB0,
179	IRQ12,
180	JMC,
181	SPI1,
182	IRQ13, IRQ14,
183	USB1,
184	TMR01, TMR23, TMR45,
185	WDT1,
186	FRT,
187	LPC,
188	SCIF0, SCIF1, SCIF3,
189	PECI0I, PECI1I, PECI2I,
190	IRQ15,
191	ETHERC,
192	SPI0,
193	ADC1,
194	DMAC1_8,
195	SIM,
196	TMU3, TMU4, TMU5,
197	ADC0,
198	SCIF4,
199	IIC0_0, IIC0_1, IIC0_2, IIC0_3,
200	IIC1_0, IIC1_1, IIC1_2, IIC1_3,
201	IIC2_0, IIC2_1, IIC2_2, IIC2_3,
202	IIC3_0, IIC3_1, IIC3_2, IIC3_3,
203	IIC4_0, IIC4_1, IIC4_2, IIC4_3,
204	IIC5_0, IIC5_1, IIC5_2, IIC5_3,
205	IIC6_0, IIC6_1, IIC6_2, IIC6_3,
206	IIC7_0, IIC7_1, IIC7_2, IIC7_3,
207	IIC8_0, IIC8_1, IIC8_2, IIC8_3,
208	IIC9_0, IIC9_1, IIC9_2, IIC9_3,
209	PCIINTA,
210	PCIE,
211	SGPIO,
212
213	/* interrupt groups */
214
215	TMU012, TMU345,
216};
217
218static struct intc_vect vectors[] __initdata = {
219	INTC_VECT(SDHI, 0x480), INTC_VECT(SDHI, 0x04a0),
220	INTC_VECT(SDHI, 0x4c0),
221	INTC_VECT(DVC, 0x4e0),
222	INTC_VECT(IRQ8, 0x500), INTC_VECT(IRQ9, 0x520),
223	INTC_VECT(IRQ10, 0x540),
224	INTC_VECT(WDT0, 0x560),
225	INTC_VECT(TMU0, 0x580), INTC_VECT(TMU1, 0x5a0),
226	INTC_VECT(TMU2, 0x5c0), INTC_VECT(TMU2_TICPI, 0x5e0),
227	INTC_VECT(HUDI, 0x600),
228	INTC_VECT(ARC4, 0x620),
229	INTC_VECT(DMAC0, 0x640), INTC_VECT(DMAC0, 0x660),
230	INTC_VECT(DMAC0, 0x680), INTC_VECT(DMAC0, 0x6a0),
231	INTC_VECT(DMAC0, 0x6c0),
232	INTC_VECT(IRQ11, 0x6e0),
233	INTC_VECT(SCIF2, 0x700), INTC_VECT(SCIF2, 0x720),
234	INTC_VECT(SCIF2, 0x740), INTC_VECT(SCIF2, 0x760),
235	INTC_VECT(DMAC0, 0x780), INTC_VECT(DMAC0, 0x7a0),
236	INTC_VECT(DMAC1_6, 0x7c0), INTC_VECT(DMAC1_6, 0x7e0),
237	INTC_VECT(USB0, 0x840),
238	INTC_VECT(IRQ12, 0x880),
239	INTC_VECT(JMC, 0x8a0),
240	INTC_VECT(SPI1, 0x8c0),
241	INTC_VECT(IRQ13, 0x8e0), INTC_VECT(IRQ14, 0x900),
242	INTC_VECT(USB1, 0x920),
243	INTC_VECT(TMR01, 0xa00), INTC_VECT(TMR23, 0xa20),
244	INTC_VECT(TMR45, 0xa40),
245	INTC_VECT(WDT1, 0xa60),
246	INTC_VECT(FRT, 0xa80),
247	INTC_VECT(LPC, 0xaa0), INTC_VECT(LPC, 0xac0),
248	INTC_VECT(LPC, 0xae0), INTC_VECT(LPC, 0xb00),
249	INTC_VECT(LPC, 0xb20),
250	INTC_VECT(SCIF0, 0xb40), INTC_VECT(SCIF1, 0xb60),
251	INTC_VECT(SCIF3, 0xb80), INTC_VECT(SCIF3, 0xba0),
252	INTC_VECT(SCIF3, 0xbc0), INTC_VECT(SCIF3, 0xbe0),
253	INTC_VECT(PECI0I, 0xc00), INTC_VECT(PECI1I, 0xc20),
254	INTC_VECT(PECI2I, 0xc40),
255	INTC_VECT(IRQ15, 0xc60),
256	INTC_VECT(ETHERC, 0xc80), INTC_VECT(ETHERC, 0xca0),
257	INTC_VECT(SPI0, 0xcc0),
258	INTC_VECT(ADC1, 0xce0),
259	INTC_VECT(DMAC1_8, 0xd00), INTC_VECT(DMAC1_8, 0xd20),
260	INTC_VECT(DMAC1_8, 0xd40), INTC_VECT(DMAC1_8, 0xd60),
261	INTC_VECT(SIM, 0xd80), INTC_VECT(SIM, 0xda0),
262	INTC_VECT(SIM, 0xdc0), INTC_VECT(SIM, 0xde0),
263	INTC_VECT(TMU3, 0xe00), INTC_VECT(TMU4, 0xe20),
264	INTC_VECT(TMU5, 0xe40),
265	INTC_VECT(ADC0, 0xe60),
266	INTC_VECT(SCIF4, 0xf00), INTC_VECT(SCIF4, 0xf20),
267	INTC_VECT(SCIF4, 0xf40), INTC_VECT(SCIF4, 0xf60),
268	INTC_VECT(IIC0_0, 0x1400), INTC_VECT(IIC0_1, 0x1420),
269	INTC_VECT(IIC0_2, 0x1440), INTC_VECT(IIC0_3, 0x1460),
270	INTC_VECT(IIC1_0, 0x1480), INTC_VECT(IIC1_1, 0x14e0),
271	INTC_VECT(IIC1_2, 0x1500), INTC_VECT(IIC1_3, 0x1520),
272	INTC_VECT(IIC2_0, 0x1540), INTC_VECT(IIC2_1, 0x1560),
273	INTC_VECT(IIC2_2, 0x1580), INTC_VECT(IIC2_3, 0x1600),
274	INTC_VECT(IIC3_0, 0x1620), INTC_VECT(IIC3_1, 0x1640),
275	INTC_VECT(IIC3_2, 0x16e0), INTC_VECT(IIC3_3, 0x1700),
276	INTC_VECT(IIC4_0, 0x17c0), INTC_VECT(IIC4_1, 0x1800),
277	INTC_VECT(IIC4_2, 0x1820), INTC_VECT(IIC4_3, 0x1840),
278	INTC_VECT(IIC5_0, 0x1860), INTC_VECT(IIC5_1, 0x1880),
279	INTC_VECT(IIC5_2, 0x18a0), INTC_VECT(IIC5_3, 0x18c0),
280	INTC_VECT(IIC6_0, 0x18e0), INTC_VECT(IIC6_1, 0x1900),
281	INTC_VECT(IIC6_2, 0x1920), INTC_VECT(IIC6_3, 0x1980),
282	INTC_VECT(IIC7_0, 0x19a0), INTC_VECT(IIC7_1, 0x1a00),
283	INTC_VECT(IIC7_2, 0x1a20), INTC_VECT(IIC7_3, 0x1a40),
284	INTC_VECT(IIC8_0, 0x1a60), INTC_VECT(IIC8_1, 0x1a80),
285	INTC_VECT(IIC8_2, 0x1aa0), INTC_VECT(IIC8_3, 0x1b40),
286	INTC_VECT(IIC9_0, 0x1b60), INTC_VECT(IIC9_1, 0x1b80),
287	INTC_VECT(IIC9_2, 0x1c00), INTC_VECT(IIC9_3, 0x1c20),
288	INTC_VECT(PCIINTA, 0x1ce0),
289	INTC_VECT(PCIE, 0x1e00),
290	INTC_VECT(SGPIO, 0x1f80),
291	INTC_VECT(SGPIO, 0x1fa0),
292};
293
294static struct intc_group groups[] __initdata = {
295	INTC_GROUP(TMU012, TMU0, TMU1, TMU2, TMU2_TICPI),
296	INTC_GROUP(TMU345, TMU3, TMU4, TMU5),
297};
298
299static struct intc_mask_reg mask_registers[] __initdata = {
300	{ 0xffd00044, 0xffd00064, 32, /* INTMSK0 / INTMSKCLR0 */
301	  { IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7 } },
302
303	{ 0xffd40080, 0xffd40084, 32, /* INTMSK2 / INTMSKCLR2 */
304	  { IRL0_LLLL, IRL0_LLLH, IRL0_LLHL, IRL0_LLHH,
305	    IRL0_LHLL, IRL0_LHLH, IRL0_LHHL, IRL0_LHHH,
306	    IRL0_HLLL, IRL0_HLLH, IRL0_HLHL, IRL0_HLHH,
307	    IRL0_HHLL, IRL0_HHLH, IRL0_HHHL, 0,
308	    IRL4_LLLL, IRL4_LLLH, IRL4_LLHL, IRL4_LLHH,
309	    IRL4_LHLL, IRL4_LHLH, IRL4_LHHL, IRL4_LHHH,
310	    IRL4_HLLL, IRL4_HLLH, IRL4_HLHL, IRL4_HLHH,
311	    IRL4_HHLL, IRL4_HHLH, IRL4_HHHL, 0, } },
312
313	{ 0xffd40038, 0xffd4003c, 32, /* INT2MSKR / INT2MSKCR */
314	  { 0, 0, 0, 0, 0, 0, 0, 0,
315	    0, DMAC1_8, 0, PECI0I, LPC, FRT, WDT1, TMR45,
316	    TMR23, TMR01, 0, 0, 0, 0, 0, DMAC0,
317	    HUDI, 0, WDT0, SCIF3, SCIF2, SDHI, TMU345, TMU012
318	     } },
319
320	{ 0xffd400d0, 0xffd400d4, 32, /* INT2MSKR1 / INT2MSKCR1 */
321	  { IRQ15, IRQ14, IRQ13, IRQ12, IRQ11, IRQ10, SCIF4, ETHERC,
322	    IRQ9, IRQ8, SCIF1, SCIF0, USB0, 0, 0, USB1,
323	    ADC1, 0, DMAC1_6, ADC0, SPI0, SIM, PECI2I, PECI1I,
324	    ARC4, 0, SPI1, JMC, 0, 0, 0, DVC
325	     } },
326
327	{ 0xffd10038, 0xffd1003c, 32, /* INT2MSKR2 / INT2MSKCR2 */
328	  { IIC4_1, IIC4_2, IIC5_0, 0, 0, 0, SGPIO, 0,
329	    0, 0, 0, IIC9_2, IIC8_2, IIC8_1, IIC8_0, IIC7_3,
330	    IIC7_2, IIC7_1, IIC6_3, IIC0_0, IIC0_1, IIC0_2, IIC0_3, IIC3_1,
331	    IIC2_3, 0, IIC2_1, IIC9_1, IIC3_3, IIC1_0, PCIE, IIC2_2
332	     } },
333
334	{ 0xffd100d0, 0xff1400d4, 32, /* INT2MSKR3 / INT2MSKCR4 */
335	  { 0, IIC6_1, IIC6_0, IIC5_1, IIC3_2, IIC2_0, 0, 0,
336	    IIC1_3, IIC1_2, IIC9_0, IIC8_3, IIC4_3, IIC7_0, 0, IIC6_2,
337	    PCIINTA, 0, IIC4_0, 0, 0, 0, 0, IIC9_3,
338	    IIC3_0, 0, IIC5_3, IIC5_2, 0, 0, 0, IIC1_1
339	     } },
340};
341
342#define INTPRI		0xffd00010
343#define INT2PRI0	0xffd40000
344#define INT2PRI1	0xffd40004
345#define INT2PRI2	0xffd40008
346#define INT2PRI3	0xffd4000c
347#define INT2PRI4	0xffd40010
348#define INT2PRI5	0xffd40014
349#define INT2PRI6	0xffd40018
350#define INT2PRI7	0xffd4001c
351#define INT2PRI8	0xffd400a0
352#define INT2PRI9	0xffd400a4
353#define INT2PRI10	0xffd400a8
354#define INT2PRI11	0xffd400ac
355#define INT2PRI12	0xffd400b0
356#define INT2PRI13	0xffd400b4
357#define INT2PRI14	0xffd400b8
358#define INT2PRI15	0xffd400bc
359#define INT2PRI16	0xffd10000
360#define INT2PRI17	0xffd10004
361#define INT2PRI18	0xffd10008
362#define INT2PRI19	0xffd1000c
363#define INT2PRI20	0xffd10010
364#define INT2PRI21	0xffd10014
365#define INT2PRI22	0xffd10018
366#define INT2PRI23	0xffd1001c
367#define INT2PRI24	0xffd100a0
368#define INT2PRI25	0xffd100a4
369#define INT2PRI26	0xffd100a8
370#define INT2PRI27	0xffd100ac
371#define INT2PRI28	0xffd100b0
372#define INT2PRI29	0xffd100b4
373#define INT2PRI30	0xffd100b8
374#define INT2PRI31	0xffd100bc
375
376static struct intc_prio_reg prio_registers[] __initdata = {
377	{ INTPRI, 0, 32, 4, { IRQ0, IRQ1, IRQ2, IRQ3,
378			      IRQ4, IRQ5, IRQ6, IRQ7 } },
379
380	{ INT2PRI0, 0, 32, 8, { TMU0, TMU1, TMU2, TMU2_TICPI } },
381	{ INT2PRI1, 0, 32, 8, { TMU3, TMU4, TMU5, SDHI } },
382	{ INT2PRI2, 0, 32, 8, { SCIF2, SCIF3, WDT0, IRQ8 } },
383	{ INT2PRI3, 0, 32, 8, { HUDI, DMAC0, ADC0, IRQ9 } },
384	{ INT2PRI4, 0, 32, 8, { IRQ10, 0, TMR01, TMR23 } },
385	{ INT2PRI5, 0, 32, 8, { TMR45, WDT1, FRT, LPC } },
386	{ INT2PRI6, 0, 32, 8, { PECI0I, ETHERC, DMAC1_8, 0 } },
387	{ INT2PRI7, 0, 32, 8, { SCIF4, 0, IRQ11, IRQ12 } },
388	{ INT2PRI8, 0, 32, 8, { 0, 0, 0, DVC } },
389	{ INT2PRI9, 0, 32, 8, { ARC4, 0, SPI1, JMC } },
390	{ INT2PRI10, 0, 32, 8, { SPI0, SIM, PECI2I, PECI1I } },
391	{ INT2PRI11, 0, 32, 8, { ADC1, IRQ13, DMAC1_6, IRQ14 } },
392	{ INT2PRI12, 0, 32, 8, { USB0, 0, IRQ15, USB1 } },
393	{ INT2PRI13, 0, 32, 8, { 0, 0, SCIF1, SCIF0 } },
394
395	{ INT2PRI16, 0, 32, 8, { IIC2_2, 0, 0, 0 } },
396	{ INT2PRI17, 0, 32, 8, { PCIE, 0, 0, IIC1_0 } },
397	{ INT2PRI18, 0, 32, 8, { IIC3_3, IIC9_1, IIC2_1, IIC1_2 } },
398	{ INT2PRI19, 0, 32, 8, { IIC2_3, IIC3_1, 0, IIC1_3 } },
399	{ INT2PRI20, 0, 32, 8, { IIC2_0, IIC6_3, IIC7_1, IIC7_2 } },
400	{ INT2PRI21, 0, 32, 8, { IIC7_3, IIC8_0, IIC8_1, IIC8_2 } },
401	{ INT2PRI22, 0, 32, 8, { IIC9_2, 0, 0, 0 } },
402	{ INT2PRI23, 0, 32, 8, { 0, SGPIO, IIC3_2, IIC5_1 } },
403	{ INT2PRI24, 0, 32, 8, { 0, 0, 0, IIC1_1 } },
404	{ INT2PRI25, 0, 32, 8, { IIC3_0, 0, IIC5_3, IIC5_2 } },
405	{ INT2PRI26, 0, 32, 8, { 0, 0, 0, IIC9_3 } },
406	{ INT2PRI27, 0, 32, 8, { PCIINTA, IIC6_0, IIC4_0, IIC6_1 } },
407	{ INT2PRI28, 0, 32, 8, { IIC4_3, IIC7_0, 0, IIC6_2 } },
408	{ INT2PRI29, 0, 32, 8, { 0, 0, IIC9_0, IIC8_3 } },
409	{ INT2PRI30, 0, 32, 8, { IIC4_1, IIC4_2, IIC5_0, 0 } },
410	{ INT2PRI31, 0, 32, 8, { IIC0_0, IIC0_1, IIC0_2, IIC0_3 } },
411};
412
413static DECLARE_INTC_DESC(intc_desc, "sh7757", vectors, groups,
414			 mask_registers, prio_registers, NULL);
415
416/* Support for external interrupt pins in IRQ mode */
417static struct intc_vect vectors_irq0123[] __initdata = {
418	INTC_VECT(IRQ0, 0x240), INTC_VECT(IRQ1, 0x280),
419	INTC_VECT(IRQ2, 0x2c0), INTC_VECT(IRQ3, 0x300),
420};
421
422static struct intc_vect vectors_irq4567[] __initdata = {
423	INTC_VECT(IRQ4, 0x340), INTC_VECT(IRQ5, 0x380),
424	INTC_VECT(IRQ6, 0x3c0), INTC_VECT(IRQ7, 0x200),
425};
426
427static struct intc_sense_reg sense_registers[] __initdata = {
428	{ 0xffd0001c, 32, 2, /* ICR1 */   { IRQ0, IRQ1, IRQ2, IRQ3,
429					    IRQ4, IRQ5, IRQ6, IRQ7 } },
430};
431
432static struct intc_mask_reg ack_registers[] __initdata = {
433	{ 0xffd00024, 0, 32, /* INTREQ */
434	  { IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7 } },
435};
436
437static DECLARE_INTC_DESC_ACK(intc_desc_irq0123, "sh7757-irq0123",
438			     vectors_irq0123, NULL, mask_registers,
439			     prio_registers, sense_registers, ack_registers);
440
441static DECLARE_INTC_DESC_ACK(intc_desc_irq4567, "sh7757-irq4567",
442			     vectors_irq4567, NULL, mask_registers,
443			     prio_registers, sense_registers, ack_registers);
444
445/* External interrupt pins in IRL mode */
446static struct intc_vect vectors_irl0123[] __initdata = {
447	INTC_VECT(IRL0_LLLL, 0x200), INTC_VECT(IRL0_LLLH, 0x220),
448	INTC_VECT(IRL0_LLHL, 0x240), INTC_VECT(IRL0_LLHH, 0x260),
449	INTC_VECT(IRL0_LHLL, 0x280), INTC_VECT(IRL0_LHLH, 0x2a0),
450	INTC_VECT(IRL0_LHHL, 0x2c0), INTC_VECT(IRL0_LHHH, 0x2e0),
451	INTC_VECT(IRL0_HLLL, 0x300), INTC_VECT(IRL0_HLLH, 0x320),
452	INTC_VECT(IRL0_HLHL, 0x340), INTC_VECT(IRL0_HLHH, 0x360),
453	INTC_VECT(IRL0_HHLL, 0x380), INTC_VECT(IRL0_HHLH, 0x3a0),
454	INTC_VECT(IRL0_HHHL, 0x3c0),
455};
456
457static struct intc_vect vectors_irl4567[] __initdata = {
458	INTC_VECT(IRL4_LLLL, 0xb00), INTC_VECT(IRL4_LLLH, 0xb20),
459	INTC_VECT(IRL4_LLHL, 0xb40), INTC_VECT(IRL4_LLHH, 0xb60),
460	INTC_VECT(IRL4_LHLL, 0xb80), INTC_VECT(IRL4_LHLH, 0xba0),
461	INTC_VECT(IRL4_LHHL, 0xbc0), INTC_VECT(IRL4_LHHH, 0xbe0),
462	INTC_VECT(IRL4_HLLL, 0xc00), INTC_VECT(IRL4_HLLH, 0xc20),
463	INTC_VECT(IRL4_HLHL, 0xc40), INTC_VECT(IRL4_HLHH, 0xc60),
464	INTC_VECT(IRL4_HHLL, 0xc80), INTC_VECT(IRL4_HHLH, 0xca0),
465	INTC_VECT(IRL4_HHHL, 0xcc0),
466};
467
468static DECLARE_INTC_DESC(intc_desc_irl0123, "sh7757-irl0123", vectors_irl0123,
469			 NULL, mask_registers, NULL, NULL);
470
471static DECLARE_INTC_DESC(intc_desc_irl4567, "sh7757-irl4567", vectors_irl4567,
472			 NULL, mask_registers, NULL, NULL);
473
474#define INTC_ICR0	0xffd00000
475#define INTC_INTMSK0	0xffd00044
476#define INTC_INTMSK1	0xffd00048
477#define INTC_INTMSK2	0xffd40080
478#define INTC_INTMSKCLR1	0xffd00068
479#define INTC_INTMSKCLR2	0xffd40084
480
481void __init plat_irq_setup(void)
482{
483	/* disable IRQ3-0 + IRQ7-4 */
484	__raw_writel(0xff000000, INTC_INTMSK0);
485
486	/* disable IRL3-0 + IRL7-4 */
487	__raw_writel(0xc0000000, INTC_INTMSK1);
488	__raw_writel(0xfffefffe, INTC_INTMSK2);
489
490	/* select IRL mode for IRL3-0 + IRL7-4 */
491	__raw_writel(__raw_readl(INTC_ICR0) & ~0x00c00000, INTC_ICR0);
492
493	/* disable holding function, ie enable "SH-4 Mode" */
494	__raw_writel(__raw_readl(INTC_ICR0) | 0x00200000, INTC_ICR0);
495
496	register_intc_controller(&intc_desc);
497}
498
499void __init plat_irq_setup_pins(int mode)
500{
501	switch (mode) {
502	case IRQ_MODE_IRQ7654:
503		/* select IRQ mode for IRL7-4 */
504		__raw_writel(__raw_readl(INTC_ICR0) | 0x00400000, INTC_ICR0);
505		register_intc_controller(&intc_desc_irq4567);
506		break;
507	case IRQ_MODE_IRQ3210:
508		/* select IRQ mode for IRL3-0 */
509		__raw_writel(__raw_readl(INTC_ICR0) | 0x00800000, INTC_ICR0);
510		register_intc_controller(&intc_desc_irq0123);
511		break;
512	case IRQ_MODE_IRL7654:
513		/* enable IRL7-4 but don't provide any masking */
514		__raw_writel(0x40000000, INTC_INTMSKCLR1);
515		__raw_writel(0x0000fffe, INTC_INTMSKCLR2);
516		break;
517	case IRQ_MODE_IRL3210:
518		/* enable IRL0-3 but don't provide any masking */
519		__raw_writel(0x80000000, INTC_INTMSKCLR1);
520		__raw_writel(0xfffe0000, INTC_INTMSKCLR2);
521		break;
522	case IRQ_MODE_IRL7654_MASK:
523		/* enable IRL7-4 and mask using cpu intc controller */
524		__raw_writel(0x40000000, INTC_INTMSKCLR1);
525		register_intc_controller(&intc_desc_irl4567);
526		break;
527	case IRQ_MODE_IRL3210_MASK:
528		/* enable IRL0-3 and mask using cpu intc controller */
529		__raw_writel(0x80000000, INTC_INTMSKCLR1);
530		register_intc_controller(&intc_desc_irl0123);
531		break;
532	default:
533		BUG();
534	}
535}
536
537void __init plat_mem_setup(void)
538{
539}
540