xref: /linux/arch/sh/kernel/cpu/sh4a/setup-sh7785.c (revision 8b1935e6a36b0967efc593d67ed3aebbfbc1f5b1)
132351a28SPaul Mundt /*
232351a28SPaul Mundt  * SH7785 Setup
332351a28SPaul Mundt  *
432351a28SPaul Mundt  *  Copyright (C) 2007  Paul Mundt
532351a28SPaul Mundt  *
632351a28SPaul Mundt  * This file is subject to the terms and conditions of the GNU General Public
732351a28SPaul Mundt  * License.  See the file "COPYING" in the main directory of this archive
832351a28SPaul Mundt  * for more details.
932351a28SPaul Mundt  */
1032351a28SPaul Mundt #include <linux/platform_device.h>
1132351a28SPaul Mundt #include <linux/init.h>
1232351a28SPaul Mundt #include <linux/serial.h>
1396de1a8fSPaul Mundt #include <linux/serial_sci.h>
14953c8ef2SMagnus Damm #include <linux/io.h>
15db250496SPaul Mundt #include <linux/mm.h>
16e367592cSMagnus Damm #include <linux/sh_timer.h>
17*8b1935e6SGuennadi Liakhovetski 
18*8b1935e6SGuennadi Liakhovetski #include <asm/dmaengine.h>
19db250496SPaul Mundt #include <asm/mmzone.h>
2032351a28SPaul Mundt 
21*8b1935e6SGuennadi Liakhovetski #include <cpu/dma-register.h>
22*8b1935e6SGuennadi Liakhovetski 
23a9571d7bSMagnus Damm static struct plat_sci_port scif0_platform_data = {
24a9571d7bSMagnus Damm 	.mapbase	= 0xffea0000,
25a9571d7bSMagnus Damm 	.flags		= UPF_BOOT_AUTOCONF,
26a9571d7bSMagnus Damm 	.type		= PORT_SCIF,
27a9571d7bSMagnus Damm 	.irqs		= { 40, 40, 40, 40 },
28a9571d7bSMagnus Damm 	.clk		= "scif_fck",
29a9571d7bSMagnus Damm };
30a9571d7bSMagnus Damm 
31a9571d7bSMagnus Damm static struct platform_device scif0_device = {
32a9571d7bSMagnus Damm 	.name		= "sh-sci",
33a9571d7bSMagnus Damm 	.id		= 0,
34a9571d7bSMagnus Damm 	.dev		= {
35a9571d7bSMagnus Damm 		.platform_data	= &scif0_platform_data,
36a9571d7bSMagnus Damm 	},
37a9571d7bSMagnus Damm };
38a9571d7bSMagnus Damm 
39a9571d7bSMagnus Damm static struct plat_sci_port scif1_platform_data = {
40a9571d7bSMagnus Damm 	.mapbase	= 0xffeb0000,
41a9571d7bSMagnus Damm 	.flags		= UPF_BOOT_AUTOCONF,
42a9571d7bSMagnus Damm 	.type		= PORT_SCIF,
43a9571d7bSMagnus Damm 	.irqs		= { 44, 44, 44, 44 },
44a9571d7bSMagnus Damm 	.clk		= "scif_fck",
45a9571d7bSMagnus Damm };
46a9571d7bSMagnus Damm 
47a9571d7bSMagnus Damm static struct platform_device scif1_device = {
48a9571d7bSMagnus Damm 	.name		= "sh-sci",
49a9571d7bSMagnus Damm 	.id		= 1,
50a9571d7bSMagnus Damm 	.dev		= {
51a9571d7bSMagnus Damm 		.platform_data	= &scif1_platform_data,
52a9571d7bSMagnus Damm 	},
53a9571d7bSMagnus Damm };
54a9571d7bSMagnus Damm 
55a9571d7bSMagnus Damm static struct plat_sci_port scif2_platform_data = {
56a9571d7bSMagnus Damm 	.mapbase	= 0xffec0000,
57a9571d7bSMagnus Damm 	.flags		= UPF_BOOT_AUTOCONF,
58a9571d7bSMagnus Damm 	.type		= PORT_SCIF,
59a9571d7bSMagnus Damm 	.irqs		= { 60, 60, 60, 60 },
60a9571d7bSMagnus Damm 	.clk		= "scif_fck",
61a9571d7bSMagnus Damm };
62a9571d7bSMagnus Damm 
63a9571d7bSMagnus Damm static struct platform_device scif2_device = {
64a9571d7bSMagnus Damm 	.name		= "sh-sci",
65a9571d7bSMagnus Damm 	.id		= 2,
66a9571d7bSMagnus Damm 	.dev		= {
67a9571d7bSMagnus Damm 		.platform_data	= &scif2_platform_data,
68a9571d7bSMagnus Damm 	},
69a9571d7bSMagnus Damm };
70a9571d7bSMagnus Damm 
71a9571d7bSMagnus Damm static struct plat_sci_port scif3_platform_data = {
72a9571d7bSMagnus Damm 	.mapbase	= 0xffed0000,
73a9571d7bSMagnus Damm 	.flags		= UPF_BOOT_AUTOCONF,
74a9571d7bSMagnus Damm 	.type		= PORT_SCIF,
75a9571d7bSMagnus Damm 	.irqs		= { 61, 61, 61, 61 },
76a9571d7bSMagnus Damm 	.clk		= "scif_fck",
77a9571d7bSMagnus Damm };
78a9571d7bSMagnus Damm 
79a9571d7bSMagnus Damm static struct platform_device scif3_device = {
80a9571d7bSMagnus Damm 	.name		= "sh-sci",
81a9571d7bSMagnus Damm 	.id		= 3,
82a9571d7bSMagnus Damm 	.dev		= {
83a9571d7bSMagnus Damm 		.platform_data	= &scif3_platform_data,
84a9571d7bSMagnus Damm 	},
85a9571d7bSMagnus Damm };
86a9571d7bSMagnus Damm 
87a9571d7bSMagnus Damm static struct plat_sci_port scif4_platform_data = {
88a9571d7bSMagnus Damm 	.mapbase	= 0xffee0000,
89a9571d7bSMagnus Damm 	.flags		= UPF_BOOT_AUTOCONF,
90a9571d7bSMagnus Damm 	.type		= PORT_SCIF,
91a9571d7bSMagnus Damm 	.irqs		= { 62, 62, 62, 62 },
92a9571d7bSMagnus Damm 	.clk		= "scif_fck",
93a9571d7bSMagnus Damm };
94a9571d7bSMagnus Damm 
95a9571d7bSMagnus Damm static struct platform_device scif4_device = {
96a9571d7bSMagnus Damm 	.name		= "sh-sci",
97a9571d7bSMagnus Damm 	.id		= 4,
98a9571d7bSMagnus Damm 	.dev		= {
99a9571d7bSMagnus Damm 		.platform_data	= &scif4_platform_data,
100a9571d7bSMagnus Damm 	},
101a9571d7bSMagnus Damm };
102a9571d7bSMagnus Damm 
103a9571d7bSMagnus Damm static struct plat_sci_port scif5_platform_data = {
104a9571d7bSMagnus Damm 	.mapbase	= 0xffef0000,
105a9571d7bSMagnus Damm 	.flags		= UPF_BOOT_AUTOCONF,
106a9571d7bSMagnus Damm 	.type		= PORT_SCIF,
107a9571d7bSMagnus Damm 	.irqs		= { 63, 63, 63, 63 },
108a9571d7bSMagnus Damm 	.clk		= "scif_fck",
109a9571d7bSMagnus Damm };
110a9571d7bSMagnus Damm 
111a9571d7bSMagnus Damm static struct platform_device scif5_device = {
112a9571d7bSMagnus Damm 	.name		= "sh-sci",
113a9571d7bSMagnus Damm 	.id		= 5,
114a9571d7bSMagnus Damm 	.dev		= {
115a9571d7bSMagnus Damm 		.platform_data	= &scif5_platform_data,
116a9571d7bSMagnus Damm 	},
117a9571d7bSMagnus Damm };
118a9571d7bSMagnus Damm 
119e367592cSMagnus Damm static struct sh_timer_config tmu0_platform_data = {
120e367592cSMagnus Damm 	.name = "TMU0",
121e367592cSMagnus Damm 	.channel_offset = 0x04,
122e367592cSMagnus Damm 	.timer_bit = 0,
123549b5e35SPaul Mundt 	.clk = "tmu012_fck",
124e367592cSMagnus Damm 	.clockevent_rating = 200,
125e367592cSMagnus Damm };
126e367592cSMagnus Damm 
127e367592cSMagnus Damm static struct resource tmu0_resources[] = {
128e367592cSMagnus Damm 	[0] = {
129e367592cSMagnus Damm 		.name	= "TMU0",
130e367592cSMagnus Damm 		.start	= 0xffd80008,
131e367592cSMagnus Damm 		.end	= 0xffd80013,
132e367592cSMagnus Damm 		.flags	= IORESOURCE_MEM,
133e367592cSMagnus Damm 	},
134e367592cSMagnus Damm 	[1] = {
135e367592cSMagnus Damm 		.start	= 28,
136e367592cSMagnus Damm 		.flags	= IORESOURCE_IRQ,
137e367592cSMagnus Damm 	},
138e367592cSMagnus Damm };
139e367592cSMagnus Damm 
140e367592cSMagnus Damm static struct platform_device tmu0_device = {
141e367592cSMagnus Damm 	.name		= "sh_tmu",
142e367592cSMagnus Damm 	.id		= 0,
143e367592cSMagnus Damm 	.dev = {
144e367592cSMagnus Damm 		.platform_data	= &tmu0_platform_data,
145e367592cSMagnus Damm 	},
146e367592cSMagnus Damm 	.resource	= tmu0_resources,
147e367592cSMagnus Damm 	.num_resources	= ARRAY_SIZE(tmu0_resources),
148e367592cSMagnus Damm };
149e367592cSMagnus Damm 
150e367592cSMagnus Damm static struct sh_timer_config tmu1_platform_data = {
151e367592cSMagnus Damm 	.name = "TMU1",
152e367592cSMagnus Damm 	.channel_offset = 0x10,
153e367592cSMagnus Damm 	.timer_bit = 1,
154549b5e35SPaul Mundt 	.clk = "tmu012_fck",
155e367592cSMagnus Damm 	.clocksource_rating = 200,
156e367592cSMagnus Damm };
157e367592cSMagnus Damm 
158e367592cSMagnus Damm static struct resource tmu1_resources[] = {
159e367592cSMagnus Damm 	[0] = {
160e367592cSMagnus Damm 		.name	= "TMU1",
161e367592cSMagnus Damm 		.start	= 0xffd80014,
162e367592cSMagnus Damm 		.end	= 0xffd8001f,
163e367592cSMagnus Damm 		.flags	= IORESOURCE_MEM,
164e367592cSMagnus Damm 	},
165e367592cSMagnus Damm 	[1] = {
166e367592cSMagnus Damm 		.start	= 29,
167e367592cSMagnus Damm 		.flags	= IORESOURCE_IRQ,
168e367592cSMagnus Damm 	},
169e367592cSMagnus Damm };
170e367592cSMagnus Damm 
171e367592cSMagnus Damm static struct platform_device tmu1_device = {
172e367592cSMagnus Damm 	.name		= "sh_tmu",
173e367592cSMagnus Damm 	.id		= 1,
174e367592cSMagnus Damm 	.dev = {
175e367592cSMagnus Damm 		.platform_data	= &tmu1_platform_data,
176e367592cSMagnus Damm 	},
177e367592cSMagnus Damm 	.resource	= tmu1_resources,
178e367592cSMagnus Damm 	.num_resources	= ARRAY_SIZE(tmu1_resources),
179e367592cSMagnus Damm };
180e367592cSMagnus Damm 
181e367592cSMagnus Damm static struct sh_timer_config tmu2_platform_data = {
182e367592cSMagnus Damm 	.name = "TMU2",
183e367592cSMagnus Damm 	.channel_offset = 0x1c,
184e367592cSMagnus Damm 	.timer_bit = 2,
185549b5e35SPaul Mundt 	.clk = "tmu012_fck",
186e367592cSMagnus Damm };
187e367592cSMagnus Damm 
188e367592cSMagnus Damm static struct resource tmu2_resources[] = {
189e367592cSMagnus Damm 	[0] = {
190e367592cSMagnus Damm 		.name	= "TMU2",
191e367592cSMagnus Damm 		.start	= 0xffd80020,
192e367592cSMagnus Damm 		.end	= 0xffd8002f,
193e367592cSMagnus Damm 		.flags	= IORESOURCE_MEM,
194e367592cSMagnus Damm 	},
195e367592cSMagnus Damm 	[1] = {
196e367592cSMagnus Damm 		.start	= 30,
197e367592cSMagnus Damm 		.flags	= IORESOURCE_IRQ,
198e367592cSMagnus Damm 	},
199e367592cSMagnus Damm };
200e367592cSMagnus Damm 
201e367592cSMagnus Damm static struct platform_device tmu2_device = {
202e367592cSMagnus Damm 	.name		= "sh_tmu",
203e367592cSMagnus Damm 	.id		= 2,
204e367592cSMagnus Damm 	.dev = {
205e367592cSMagnus Damm 		.platform_data	= &tmu2_platform_data,
206e367592cSMagnus Damm 	},
207e367592cSMagnus Damm 	.resource	= tmu2_resources,
208e367592cSMagnus Damm 	.num_resources	= ARRAY_SIZE(tmu2_resources),
209e367592cSMagnus Damm };
210e367592cSMagnus Damm 
211e367592cSMagnus Damm static struct sh_timer_config tmu3_platform_data = {
212e367592cSMagnus Damm 	.name = "TMU3",
213e367592cSMagnus Damm 	.channel_offset = 0x04,
214e367592cSMagnus Damm 	.timer_bit = 0,
215549b5e35SPaul Mundt 	.clk = "tmu345_fck",
216e367592cSMagnus Damm };
217e367592cSMagnus Damm 
218e367592cSMagnus Damm static struct resource tmu3_resources[] = {
219e367592cSMagnus Damm 	[0] = {
220e367592cSMagnus Damm 		.name	= "TMU3",
221e367592cSMagnus Damm 		.start	= 0xffdc0008,
222e367592cSMagnus Damm 		.end	= 0xffdc0013,
223e367592cSMagnus Damm 		.flags	= IORESOURCE_MEM,
224e367592cSMagnus Damm 	},
225e367592cSMagnus Damm 	[1] = {
226e367592cSMagnus Damm 		.start	= 96,
227e367592cSMagnus Damm 		.flags	= IORESOURCE_IRQ,
228e367592cSMagnus Damm 	},
229e367592cSMagnus Damm };
230e367592cSMagnus Damm 
231e367592cSMagnus Damm static struct platform_device tmu3_device = {
232e367592cSMagnus Damm 	.name		= "sh_tmu",
233e367592cSMagnus Damm 	.id		= 3,
234e367592cSMagnus Damm 	.dev = {
235e367592cSMagnus Damm 		.platform_data	= &tmu3_platform_data,
236e367592cSMagnus Damm 	},
237e367592cSMagnus Damm 	.resource	= tmu3_resources,
238e367592cSMagnus Damm 	.num_resources	= ARRAY_SIZE(tmu3_resources),
239e367592cSMagnus Damm };
240e367592cSMagnus Damm 
241e367592cSMagnus Damm static struct sh_timer_config tmu4_platform_data = {
242e367592cSMagnus Damm 	.name = "TMU4",
243e367592cSMagnus Damm 	.channel_offset = 0x10,
244e367592cSMagnus Damm 	.timer_bit = 1,
245549b5e35SPaul Mundt 	.clk = "tmu345_fck",
246e367592cSMagnus Damm };
247e367592cSMagnus Damm 
248e367592cSMagnus Damm static struct resource tmu4_resources[] = {
249e367592cSMagnus Damm 	[0] = {
250e367592cSMagnus Damm 		.name	= "TMU4",
251e367592cSMagnus Damm 		.start	= 0xffdc0014,
252e367592cSMagnus Damm 		.end	= 0xffdc001f,
253e367592cSMagnus Damm 		.flags	= IORESOURCE_MEM,
254e367592cSMagnus Damm 	},
255e367592cSMagnus Damm 	[1] = {
256e367592cSMagnus Damm 		.start	= 97,
257e367592cSMagnus Damm 		.flags	= IORESOURCE_IRQ,
258e367592cSMagnus Damm 	},
259e367592cSMagnus Damm };
260e367592cSMagnus Damm 
261e367592cSMagnus Damm static struct platform_device tmu4_device = {
262e367592cSMagnus Damm 	.name		= "sh_tmu",
263e367592cSMagnus Damm 	.id		= 4,
264e367592cSMagnus Damm 	.dev = {
265e367592cSMagnus Damm 		.platform_data	= &tmu4_platform_data,
266e367592cSMagnus Damm 	},
267e367592cSMagnus Damm 	.resource	= tmu4_resources,
268e367592cSMagnus Damm 	.num_resources	= ARRAY_SIZE(tmu4_resources),
269e367592cSMagnus Damm };
270e367592cSMagnus Damm 
271e367592cSMagnus Damm static struct sh_timer_config tmu5_platform_data = {
272e367592cSMagnus Damm 	.name = "TMU5",
273e367592cSMagnus Damm 	.channel_offset = 0x1c,
274e367592cSMagnus Damm 	.timer_bit = 2,
275549b5e35SPaul Mundt 	.clk = "tmu345_fck",
276e367592cSMagnus Damm };
277e367592cSMagnus Damm 
278e367592cSMagnus Damm static struct resource tmu5_resources[] = {
279e367592cSMagnus Damm 	[0] = {
280e367592cSMagnus Damm 		.name	= "TMU5",
281e367592cSMagnus Damm 		.start	= 0xffdc0020,
282e367592cSMagnus Damm 		.end	= 0xffdc002b,
283e367592cSMagnus Damm 		.flags	= IORESOURCE_MEM,
284e367592cSMagnus Damm 	},
285e367592cSMagnus Damm 	[1] = {
286e367592cSMagnus Damm 		.start	= 98,
287e367592cSMagnus Damm 		.flags	= IORESOURCE_IRQ,
288e367592cSMagnus Damm 	},
289e367592cSMagnus Damm };
290e367592cSMagnus Damm 
291e367592cSMagnus Damm static struct platform_device tmu5_device = {
292e367592cSMagnus Damm 	.name		= "sh_tmu",
293e367592cSMagnus Damm 	.id		= 5,
294e367592cSMagnus Damm 	.dev = {
295e367592cSMagnus Damm 		.platform_data	= &tmu5_platform_data,
296e367592cSMagnus Damm 	},
297e367592cSMagnus Damm 	.resource	= tmu5_resources,
298e367592cSMagnus Damm 	.num_resources	= ARRAY_SIZE(tmu5_resources),
299e367592cSMagnus Damm };
300e367592cSMagnus Damm 
301027811b9SGuennadi Liakhovetski /* DMA */
302027811b9SGuennadi Liakhovetski static struct sh_dmae_channel sh7785_dmae0_channels[] = {
303027811b9SGuennadi Liakhovetski 	{
304027811b9SGuennadi Liakhovetski 		.offset = 0,
305027811b9SGuennadi Liakhovetski 		.dmars = 0,
306027811b9SGuennadi Liakhovetski 		.dmars_bit = 0,
307027811b9SGuennadi Liakhovetski 	}, {
308027811b9SGuennadi Liakhovetski 		.offset = 0x10,
309027811b9SGuennadi Liakhovetski 		.dmars = 0,
310027811b9SGuennadi Liakhovetski 		.dmars_bit = 8,
311027811b9SGuennadi Liakhovetski 	}, {
312027811b9SGuennadi Liakhovetski 		.offset = 0x20,
313027811b9SGuennadi Liakhovetski 		.dmars = 4,
314027811b9SGuennadi Liakhovetski 		.dmars_bit = 0,
315027811b9SGuennadi Liakhovetski 	}, {
316027811b9SGuennadi Liakhovetski 		.offset = 0x30,
317027811b9SGuennadi Liakhovetski 		.dmars = 4,
318027811b9SGuennadi Liakhovetski 		.dmars_bit = 8,
319027811b9SGuennadi Liakhovetski 	}, {
320027811b9SGuennadi Liakhovetski 		.offset = 0x50,
321027811b9SGuennadi Liakhovetski 		.dmars = 8,
322027811b9SGuennadi Liakhovetski 		.dmars_bit = 0,
323027811b9SGuennadi Liakhovetski 	}, {
324027811b9SGuennadi Liakhovetski 		.offset = 0x60,
325027811b9SGuennadi Liakhovetski 		.dmars = 8,
326027811b9SGuennadi Liakhovetski 		.dmars_bit = 8,
327027811b9SGuennadi Liakhovetski 	}
3284385af80SNobuhiro Iwamatsu };
3294385af80SNobuhiro Iwamatsu 
330027811b9SGuennadi Liakhovetski static struct sh_dmae_channel sh7785_dmae1_channels[] = {
331027811b9SGuennadi Liakhovetski 	{
332027811b9SGuennadi Liakhovetski 		.offset = 0,
333027811b9SGuennadi Liakhovetski 	}, {
334027811b9SGuennadi Liakhovetski 		.offset = 0x10,
335027811b9SGuennadi Liakhovetski 	}, {
336027811b9SGuennadi Liakhovetski 		.offset = 0x20,
337027811b9SGuennadi Liakhovetski 	}, {
338027811b9SGuennadi Liakhovetski 		.offset = 0x30,
339027811b9SGuennadi Liakhovetski 	}, {
340027811b9SGuennadi Liakhovetski 		.offset = 0x50,
341027811b9SGuennadi Liakhovetski 	}, {
342027811b9SGuennadi Liakhovetski 		.offset = 0x60,
343027811b9SGuennadi Liakhovetski 	}
344027811b9SGuennadi Liakhovetski };
345027811b9SGuennadi Liakhovetski 
346*8b1935e6SGuennadi Liakhovetski static unsigned int ts_shift[] = TS_SHIFT;
347*8b1935e6SGuennadi Liakhovetski 
348027811b9SGuennadi Liakhovetski static struct sh_dmae_pdata dma0_platform_data = {
349027811b9SGuennadi Liakhovetski 	.channel	= sh7785_dmae0_channels,
350027811b9SGuennadi Liakhovetski 	.channel_num	= ARRAY_SIZE(sh7785_dmae0_channels),
351*8b1935e6SGuennadi Liakhovetski 	.ts_low_shift	= CHCR_TS_LOW_SHIFT,
352*8b1935e6SGuennadi Liakhovetski 	.ts_low_mask	= CHCR_TS_LOW_MASK,
353*8b1935e6SGuennadi Liakhovetski 	.ts_high_shift	= CHCR_TS_HIGH_SHIFT,
354*8b1935e6SGuennadi Liakhovetski 	.ts_high_mask	= CHCR_TS_HIGH_MASK,
355*8b1935e6SGuennadi Liakhovetski 	.ts_shift	= ts_shift,
356*8b1935e6SGuennadi Liakhovetski 	.ts_shift_num	= ARRAY_SIZE(ts_shift),
357*8b1935e6SGuennadi Liakhovetski 	.dmaor_init	= DMAOR_INIT,
358027811b9SGuennadi Liakhovetski };
359027811b9SGuennadi Liakhovetski 
360027811b9SGuennadi Liakhovetski static struct sh_dmae_pdata dma1_platform_data = {
361027811b9SGuennadi Liakhovetski 	.channel	= sh7785_dmae1_channels,
362027811b9SGuennadi Liakhovetski 	.channel_num	= ARRAY_SIZE(sh7785_dmae1_channels),
363*8b1935e6SGuennadi Liakhovetski 	.ts_low_shift	= CHCR_TS_LOW_SHIFT,
364*8b1935e6SGuennadi Liakhovetski 	.ts_low_mask	= CHCR_TS_LOW_MASK,
365*8b1935e6SGuennadi Liakhovetski 	.ts_high_shift	= CHCR_TS_HIGH_SHIFT,
366*8b1935e6SGuennadi Liakhovetski 	.ts_high_mask	= CHCR_TS_HIGH_MASK,
367*8b1935e6SGuennadi Liakhovetski 	.ts_shift	= ts_shift,
368*8b1935e6SGuennadi Liakhovetski 	.ts_shift_num	= ARRAY_SIZE(ts_shift),
369*8b1935e6SGuennadi Liakhovetski 	.dmaor_init	= DMAOR_INIT,
370027811b9SGuennadi Liakhovetski };
371027811b9SGuennadi Liakhovetski 
372027811b9SGuennadi Liakhovetski static struct resource sh7785_dmae0_resources[] = {
373027811b9SGuennadi Liakhovetski 	[0] = {
374027811b9SGuennadi Liakhovetski 		/* Channel registers and DMAOR */
375027811b9SGuennadi Liakhovetski 		.start	= 0xfc808020,
376027811b9SGuennadi Liakhovetski 		.end	= 0xfc80808f,
377027811b9SGuennadi Liakhovetski 		.flags	= IORESOURCE_MEM,
378027811b9SGuennadi Liakhovetski 	},
379027811b9SGuennadi Liakhovetski 	[1] = {
380027811b9SGuennadi Liakhovetski 		/* DMARSx */
381027811b9SGuennadi Liakhovetski 		.start	= 0xfc809000,
382027811b9SGuennadi Liakhovetski 		.end	= 0xfc80900b,
383027811b9SGuennadi Liakhovetski 		.flags	= IORESOURCE_MEM,
384027811b9SGuennadi Liakhovetski 	},
385027811b9SGuennadi Liakhovetski 	{
386027811b9SGuennadi Liakhovetski 		/* Real DMA error IRQ is 39, and channel IRQs are 33-38 */
387027811b9SGuennadi Liakhovetski 		.start	= 33,
388027811b9SGuennadi Liakhovetski 		.end	= 33,
389027811b9SGuennadi Liakhovetski 		.flags	= IORESOURCE_IRQ | IORESOURCE_IRQ_SHAREABLE,
390027811b9SGuennadi Liakhovetski 	},
391027811b9SGuennadi Liakhovetski };
392027811b9SGuennadi Liakhovetski 
393027811b9SGuennadi Liakhovetski static struct resource sh7785_dmae1_resources[] = {
394027811b9SGuennadi Liakhovetski 	[0] = {
395027811b9SGuennadi Liakhovetski 		/* Channel registers and DMAOR */
396027811b9SGuennadi Liakhovetski 		.start	= 0xfcc08020,
397027811b9SGuennadi Liakhovetski 		.end	= 0xfcc0808f,
398027811b9SGuennadi Liakhovetski 		.flags	= IORESOURCE_MEM,
399027811b9SGuennadi Liakhovetski 	},
400027811b9SGuennadi Liakhovetski 	/* DMAC1 has no DMARS */
401027811b9SGuennadi Liakhovetski 	{
402027811b9SGuennadi Liakhovetski 		/* Real DMA error IRQ is 58, and channel IRQs are 52-57 */
403027811b9SGuennadi Liakhovetski 		.start	= 52,
404027811b9SGuennadi Liakhovetski 		.end	= 52,
405027811b9SGuennadi Liakhovetski 		.flags	= IORESOURCE_IRQ | IORESOURCE_IRQ_SHAREABLE,
406027811b9SGuennadi Liakhovetski 	},
407027811b9SGuennadi Liakhovetski };
408027811b9SGuennadi Liakhovetski 
409027811b9SGuennadi Liakhovetski static struct platform_device dma0_device = {
4104385af80SNobuhiro Iwamatsu 	.name           = "sh-dma-engine",
411027811b9SGuennadi Liakhovetski 	.id             = 0,
412027811b9SGuennadi Liakhovetski 	.resource	= sh7785_dmae0_resources,
413027811b9SGuennadi Liakhovetski 	.num_resources	= ARRAY_SIZE(sh7785_dmae0_resources),
4144385af80SNobuhiro Iwamatsu 	.dev            = {
415027811b9SGuennadi Liakhovetski 		.platform_data	= &dma0_platform_data,
416027811b9SGuennadi Liakhovetski 	},
417027811b9SGuennadi Liakhovetski };
418027811b9SGuennadi Liakhovetski 
419027811b9SGuennadi Liakhovetski static struct platform_device dma1_device = {
420027811b9SGuennadi Liakhovetski 	.name		= "sh-dma-engine",
421027811b9SGuennadi Liakhovetski 	.id		= 1,
422027811b9SGuennadi Liakhovetski 	.resource	= sh7785_dmae1_resources,
423027811b9SGuennadi Liakhovetski 	.num_resources	= ARRAY_SIZE(sh7785_dmae1_resources),
424027811b9SGuennadi Liakhovetski 	.dev		= {
425027811b9SGuennadi Liakhovetski 		.platform_data	= &dma1_platform_data,
4264385af80SNobuhiro Iwamatsu 	},
4274385af80SNobuhiro Iwamatsu };
4284385af80SNobuhiro Iwamatsu 
42932351a28SPaul Mundt static struct platform_device *sh7785_devices[] __initdata = {
430a9571d7bSMagnus Damm 	&scif0_device,
431a9571d7bSMagnus Damm 	&scif1_device,
432a9571d7bSMagnus Damm 	&scif2_device,
433a9571d7bSMagnus Damm 	&scif3_device,
434a9571d7bSMagnus Damm 	&scif4_device,
435a9571d7bSMagnus Damm 	&scif5_device,
436e367592cSMagnus Damm 	&tmu0_device,
437e367592cSMagnus Damm 	&tmu1_device,
438e367592cSMagnus Damm 	&tmu2_device,
439e367592cSMagnus Damm 	&tmu3_device,
440e367592cSMagnus Damm 	&tmu4_device,
441e367592cSMagnus Damm 	&tmu5_device,
442027811b9SGuennadi Liakhovetski 	&dma0_device,
443027811b9SGuennadi Liakhovetski 	&dma1_device,
44432351a28SPaul Mundt };
44532351a28SPaul Mundt 
44632351a28SPaul Mundt static int __init sh7785_devices_setup(void)
44732351a28SPaul Mundt {
44832351a28SPaul Mundt 	return platform_add_devices(sh7785_devices,
44932351a28SPaul Mundt 				    ARRAY_SIZE(sh7785_devices));
45032351a28SPaul Mundt }
451ba9a6337SMagnus Damm arch_initcall(sh7785_devices_setup);
45232351a28SPaul Mundt 
453e367592cSMagnus Damm static struct platform_device *sh7785_early_devices[] __initdata = {
454a9571d7bSMagnus Damm 	&scif0_device,
455a9571d7bSMagnus Damm 	&scif1_device,
456a9571d7bSMagnus Damm 	&scif2_device,
457a9571d7bSMagnus Damm 	&scif3_device,
458a9571d7bSMagnus Damm 	&scif4_device,
459a9571d7bSMagnus Damm 	&scif5_device,
460e367592cSMagnus Damm 	&tmu0_device,
461e367592cSMagnus Damm 	&tmu1_device,
462e367592cSMagnus Damm 	&tmu2_device,
463e367592cSMagnus Damm 	&tmu3_device,
464e367592cSMagnus Damm 	&tmu4_device,
465e367592cSMagnus Damm 	&tmu5_device,
466e367592cSMagnus Damm };
467e367592cSMagnus Damm 
468e367592cSMagnus Damm void __init plat_early_device_setup(void)
469e367592cSMagnus Damm {
470e367592cSMagnus Damm 	early_platform_add_devices(sh7785_early_devices,
471e367592cSMagnus Damm 				   ARRAY_SIZE(sh7785_early_devices));
472e367592cSMagnus Damm }
473e367592cSMagnus Damm 
474a0e23267SMagnus Damm enum {
475a0e23267SMagnus Damm 	UNUSED = 0,
47632351a28SPaul Mundt 
477a0e23267SMagnus Damm 	/* interrupt sources */
47832351a28SPaul Mundt 
479a0e23267SMagnus Damm 	IRL0_LLLL, IRL0_LLLH, IRL0_LLHL, IRL0_LLHH,
480a0e23267SMagnus Damm 	IRL0_LHLL, IRL0_LHLH, IRL0_LHHL, IRL0_LHHH,
481a0e23267SMagnus Damm 	IRL0_HLLL, IRL0_HLLH, IRL0_HLHL, IRL0_HLHH,
482a0e23267SMagnus Damm 	IRL0_HHLL, IRL0_HHLH, IRL0_HHHL,
48332351a28SPaul Mundt 
484a0e23267SMagnus Damm 	IRL4_LLLL, IRL4_LLLH, IRL4_LLHL, IRL4_LLHH,
485a0e23267SMagnus Damm 	IRL4_LHLL, IRL4_LHLH, IRL4_LHHL, IRL4_LHHH,
486a0e23267SMagnus Damm 	IRL4_HLLL, IRL4_HLLH, IRL4_HLHL, IRL4_HLHH,
487a0e23267SMagnus Damm 	IRL4_HHLL, IRL4_HHLH, IRL4_HHHL,
48839374aadSRyusuke Sakato 
489a0e23267SMagnus Damm 	IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7,
49057e41c86SMagnus Damm 	WDT, TMU0, TMU1, TMU2, TMU2_TICPI,
49157e41c86SMagnus Damm 	HUDI, DMAC0, SCIF0, SCIF1, DMAC1, HSPI,
492a0e23267SMagnus Damm 	SCIF2, SCIF3, SCIF4, SCIF5,
49357e41c86SMagnus Damm 	PCISERR, PCIINTA, PCIINTB, PCIINTC, PCIINTD, PCIC5,
49457e41c86SMagnus Damm 	SIOF, MMCIF, DU, GDTA,
495a0e23267SMagnus Damm 	TMU3, TMU4, TMU5,
496a0e23267SMagnus Damm 	SSI0, SSI1,
497a0e23267SMagnus Damm 	HAC0, HAC1,
49857e41c86SMagnus Damm 	FLCTL, GPIO,
499a0e23267SMagnus Damm 
500a0e23267SMagnus Damm 	/* interrupt groups */
501a0e23267SMagnus Damm 
50257e41c86SMagnus Damm 	TMU012,	TMU345
50332351a28SPaul Mundt };
50432351a28SPaul Mundt 
5055c37e025SMagnus Damm static struct intc_vect vectors[] __initdata = {
506a0e23267SMagnus Damm 	INTC_VECT(WDT, 0x560),
507a0e23267SMagnus Damm 	INTC_VECT(TMU0, 0x580), INTC_VECT(TMU1, 0x5a0),
508a0e23267SMagnus Damm 	INTC_VECT(TMU2, 0x5c0), INTC_VECT(TMU2_TICPI, 0x5e0),
509a0e23267SMagnus Damm 	INTC_VECT(HUDI, 0x600),
51057e41c86SMagnus Damm 	INTC_VECT(DMAC0, 0x620), INTC_VECT(DMAC0, 0x640),
51157e41c86SMagnus Damm 	INTC_VECT(DMAC0, 0x660), INTC_VECT(DMAC0, 0x680),
51257e41c86SMagnus Damm 	INTC_VECT(DMAC0, 0x6a0), INTC_VECT(DMAC0, 0x6c0),
51357e41c86SMagnus Damm 	INTC_VECT(DMAC0, 0x6e0),
51457e41c86SMagnus Damm 	INTC_VECT(SCIF0, 0x700), INTC_VECT(SCIF0, 0x720),
51557e41c86SMagnus Damm 	INTC_VECT(SCIF0, 0x740), INTC_VECT(SCIF0, 0x760),
51657e41c86SMagnus Damm 	INTC_VECT(SCIF1, 0x780), INTC_VECT(SCIF1, 0x7a0),
51757e41c86SMagnus Damm 	INTC_VECT(SCIF1, 0x7c0), INTC_VECT(SCIF1, 0x7e0),
51857e41c86SMagnus Damm 	INTC_VECT(DMAC1, 0x880), INTC_VECT(DMAC1, 0x8a0),
51957e41c86SMagnus Damm 	INTC_VECT(DMAC1, 0x8c0), INTC_VECT(DMAC1, 0x8e0),
52057e41c86SMagnus Damm 	INTC_VECT(DMAC1, 0x900), INTC_VECT(DMAC1, 0x920),
52157e41c86SMagnus Damm 	INTC_VECT(DMAC1, 0x940),
522a0e23267SMagnus Damm 	INTC_VECT(HSPI, 0x960),
523a0e23267SMagnus Damm 	INTC_VECT(SCIF2, 0x980), INTC_VECT(SCIF3, 0x9a0),
524a0e23267SMagnus Damm 	INTC_VECT(SCIF4, 0x9c0), INTC_VECT(SCIF5, 0x9e0),
525a0e23267SMagnus Damm 	INTC_VECT(PCISERR, 0xa00), INTC_VECT(PCIINTA, 0xa20),
526a0e23267SMagnus Damm 	INTC_VECT(PCIINTB, 0xa40), INTC_VECT(PCIINTC, 0xa60),
52757e41c86SMagnus Damm 	INTC_VECT(PCIINTD, 0xa80), INTC_VECT(PCIC5, 0xaa0),
52857e41c86SMagnus Damm 	INTC_VECT(PCIC5, 0xac0), INTC_VECT(PCIC5, 0xae0),
52957e41c86SMagnus Damm 	INTC_VECT(PCIC5, 0xb00), INTC_VECT(PCIC5, 0xb20),
530a0e23267SMagnus Damm 	INTC_VECT(SIOF, 0xc00),
53157e41c86SMagnus Damm 	INTC_VECT(MMCIF, 0xd00), INTC_VECT(MMCIF, 0xd20),
53257e41c86SMagnus Damm 	INTC_VECT(MMCIF, 0xd40), INTC_VECT(MMCIF, 0xd60),
533a0e23267SMagnus Damm 	INTC_VECT(DU, 0xd80),
53457e41c86SMagnus Damm 	INTC_VECT(GDTA, 0xda0), INTC_VECT(GDTA, 0xdc0),
53557e41c86SMagnus Damm 	INTC_VECT(GDTA, 0xde0),
536a0e23267SMagnus Damm 	INTC_VECT(TMU3, 0xe00), INTC_VECT(TMU4, 0xe20),
537a0e23267SMagnus Damm 	INTC_VECT(TMU5, 0xe40),
538a0e23267SMagnus Damm 	INTC_VECT(SSI0, 0xe80), INTC_VECT(SSI1, 0xea0),
539a0e23267SMagnus Damm 	INTC_VECT(HAC0, 0xec0), INTC_VECT(HAC1, 0xee0),
54057e41c86SMagnus Damm 	INTC_VECT(FLCTL, 0xf00), INTC_VECT(FLCTL, 0xf20),
54157e41c86SMagnus Damm 	INTC_VECT(FLCTL, 0xf40), INTC_VECT(FLCTL, 0xf60),
54257e41c86SMagnus Damm 	INTC_VECT(GPIO, 0xf80), INTC_VECT(GPIO, 0xfa0),
54357e41c86SMagnus Damm 	INTC_VECT(GPIO, 0xfc0), INTC_VECT(GPIO, 0xfe0),
544d619500aSMagnus Damm };
545d619500aSMagnus Damm 
5465c37e025SMagnus Damm static struct intc_group groups[] __initdata = {
547a0e23267SMagnus Damm 	INTC_GROUP(TMU012, TMU0, TMU1, TMU2, TMU2_TICPI),
548a0e23267SMagnus Damm 	INTC_GROUP(TMU345, TMU3, TMU4, TMU5),
549a0e23267SMagnus Damm };
550a0e23267SMagnus Damm 
5515c37e025SMagnus Damm static struct intc_mask_reg mask_registers[] __initdata = {
552a0e23267SMagnus Damm 	{ 0xffd00044, 0xffd00064, 32, /* INTMSK0 / INTMSKCLR0 */
553a0e23267SMagnus Damm 	  { IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7 } },
554a0e23267SMagnus Damm 
555a0e23267SMagnus Damm 	{ 0xffd40080, 0xffd40084, 32, /* INTMSK2 / INTMSKCLR2 */
556a0e23267SMagnus Damm 	  { IRL0_LLLL, IRL0_LLLH, IRL0_LLHL, IRL0_LLHH,
557a0e23267SMagnus Damm 	    IRL0_LHLL, IRL0_LHLH, IRL0_LHHL, IRL0_LHHH,
558a0e23267SMagnus Damm 	    IRL0_HLLL, IRL0_HLLH, IRL0_HLHL, IRL0_HLHH,
559a0e23267SMagnus Damm 	    IRL0_HHLL, IRL0_HHLH, IRL0_HHHL, 0,
560a0e23267SMagnus Damm 	    IRL4_LLLL, IRL4_LLLH, IRL4_LLHL, IRL4_LLHH,
561a0e23267SMagnus Damm 	    IRL4_LHLL, IRL4_LHLH, IRL4_LHHL, IRL4_LHHH,
562a0e23267SMagnus Damm 	    IRL4_HLLL, IRL4_HLLH, IRL4_HLHL, IRL4_HLHH,
563a0e23267SMagnus Damm 	    IRL4_HHLL, IRL4_HHLH, IRL4_HHHL, 0, } },
564a0e23267SMagnus Damm 
565a0e23267SMagnus Damm 	{ 0xffd40038, 0xffd4003c, 32, /* INT2MSKR / INT2MSKCR */
566a0e23267SMagnus Damm 	  { 0, 0, 0, GDTA, DU, SSI0, SSI1, GPIO,
567a0e23267SMagnus Damm 	    FLCTL, MMCIF, HSPI, SIOF, PCIC5, PCIINTD, PCIINTC, PCIINTB,
568a0e23267SMagnus Damm 	    PCIINTA, PCISERR, HAC1, HAC0, DMAC1, DMAC0, HUDI, WDT,
569a0e23267SMagnus Damm 	    SCIF5, SCIF4, SCIF3, SCIF2, SCIF1, SCIF0, TMU345, TMU012 } },
570a0e23267SMagnus Damm };
571a0e23267SMagnus Damm 
5725c37e025SMagnus Damm static struct intc_prio_reg prio_registers[] __initdata = {
5736ef5fb2cSMagnus Damm 	{ 0xffd00010, 0, 32, 4, /* INTPRI */   { IRQ0, IRQ1, IRQ2, IRQ3,
574a0e23267SMagnus Damm 						 IRQ4, IRQ5, IRQ6, IRQ7 } },
5756ef5fb2cSMagnus Damm 	{ 0xffd40000, 0, 32, 8, /* INT2PRI0 */ { TMU0, TMU1,
5766ef5fb2cSMagnus Damm 						 TMU2, TMU2_TICPI } },
5776ef5fb2cSMagnus Damm 	{ 0xffd40004, 0, 32, 8, /* INT2PRI1 */ { TMU3, TMU4, TMU5, } },
5786ef5fb2cSMagnus Damm 	{ 0xffd40008, 0, 32, 8, /* INT2PRI2 */ { SCIF0, SCIF1,
5796ef5fb2cSMagnus Damm 						 SCIF2, SCIF3 } },
5806ef5fb2cSMagnus Damm 	{ 0xffd4000c, 0, 32, 8, /* INT2PRI3 */ { SCIF4, SCIF5, WDT, } },
5816ef5fb2cSMagnus Damm 	{ 0xffd40010, 0, 32, 8, /* INT2PRI4 */ { HUDI, DMAC0, DMAC1, } },
5826ef5fb2cSMagnus Damm 	{ 0xffd40014, 0, 32, 8, /* INT2PRI5 */ { HAC0, HAC1,
5836ef5fb2cSMagnus Damm 						 PCISERR, PCIINTA } },
5846ef5fb2cSMagnus Damm 	{ 0xffd40018, 0, 32, 8, /* INT2PRI6 */ { PCIINTB, PCIINTC,
585a0e23267SMagnus Damm 						 PCIINTD, PCIC5 } },
5866ef5fb2cSMagnus Damm 	{ 0xffd4001c, 0, 32, 8, /* INT2PRI7 */ { SIOF, HSPI, MMCIF, } },
5876ef5fb2cSMagnus Damm 	{ 0xffd40020, 0, 32, 8, /* INT2PRI8 */ { FLCTL, GPIO, SSI0, SSI1, } },
5886ef5fb2cSMagnus Damm 	{ 0xffd40024, 0, 32, 8, /* INT2PRI9 */ { DU, GDTA, } },
589a0e23267SMagnus Damm };
590a0e23267SMagnus Damm 
5917f3edee8SMagnus Damm static DECLARE_INTC_DESC(intc_desc, "sh7785", vectors, groups,
592a0e23267SMagnus Damm 			 mask_registers, prio_registers, NULL);
593a0e23267SMagnus Damm 
594a0e23267SMagnus Damm /* Support for external interrupt pins in IRQ mode */
595a0e23267SMagnus Damm 
5965c37e025SMagnus Damm static struct intc_vect vectors_irq0123[] __initdata = {
597a0e23267SMagnus Damm 	INTC_VECT(IRQ0, 0x240), INTC_VECT(IRQ1, 0x280),
598a0e23267SMagnus Damm 	INTC_VECT(IRQ2, 0x2c0), INTC_VECT(IRQ3, 0x300),
599a0e23267SMagnus Damm };
600a0e23267SMagnus Damm 
6015c37e025SMagnus Damm static struct intc_vect vectors_irq4567[] __initdata = {
602a0e23267SMagnus Damm 	INTC_VECT(IRQ4, 0x340), INTC_VECT(IRQ5, 0x380),
603a0e23267SMagnus Damm 	INTC_VECT(IRQ6, 0x3c0), INTC_VECT(IRQ7, 0x200),
604a0e23267SMagnus Damm };
605a0e23267SMagnus Damm 
6065c37e025SMagnus Damm static struct intc_sense_reg sense_registers[] __initdata = {
607a0e23267SMagnus Damm 	{ 0xffd0001c, 32, 2, /* ICR1 */   { IRQ0, IRQ1, IRQ2, IRQ3,
608a0e23267SMagnus Damm 					    IRQ4, IRQ5, IRQ6, IRQ7 } },
609a0e23267SMagnus Damm };
610a0e23267SMagnus Damm 
6116bdfb22aSYoshihiro Shimoda static struct intc_mask_reg ack_registers[] __initdata = {
6126bdfb22aSYoshihiro Shimoda 	{ 0xffd00024, 0, 32, /* INTREQ */
6136bdfb22aSYoshihiro Shimoda 	  { IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7 } },
6146bdfb22aSYoshihiro Shimoda };
615a0e23267SMagnus Damm 
6166bdfb22aSYoshihiro Shimoda static DECLARE_INTC_DESC_ACK(intc_desc_irq0123, "sh7785-irq0123",
6176bdfb22aSYoshihiro Shimoda 			     vectors_irq0123, NULL, mask_registers,
6186bdfb22aSYoshihiro Shimoda 			     prio_registers, sense_registers, ack_registers);
6196bdfb22aSYoshihiro Shimoda 
6206bdfb22aSYoshihiro Shimoda static DECLARE_INTC_DESC_ACK(intc_desc_irq4567, "sh7785-irq4567",
6216bdfb22aSYoshihiro Shimoda 			     vectors_irq4567, NULL, mask_registers,
6226bdfb22aSYoshihiro Shimoda 			     prio_registers, sense_registers, ack_registers);
623a0e23267SMagnus Damm 
624a0e23267SMagnus Damm /* External interrupt pins in IRL mode */
625a0e23267SMagnus Damm 
6265c37e025SMagnus Damm static struct intc_vect vectors_irl0123[] __initdata = {
627a0e23267SMagnus Damm 	INTC_VECT(IRL0_LLLL, 0x200), INTC_VECT(IRL0_LLLH, 0x220),
628a0e23267SMagnus Damm 	INTC_VECT(IRL0_LLHL, 0x240), INTC_VECT(IRL0_LLHH, 0x260),
629a0e23267SMagnus Damm 	INTC_VECT(IRL0_LHLL, 0x280), INTC_VECT(IRL0_LHLH, 0x2a0),
630a0e23267SMagnus Damm 	INTC_VECT(IRL0_LHHL, 0x2c0), INTC_VECT(IRL0_LHHH, 0x2e0),
631a0e23267SMagnus Damm 	INTC_VECT(IRL0_HLLL, 0x300), INTC_VECT(IRL0_HLLH, 0x320),
632a0e23267SMagnus Damm 	INTC_VECT(IRL0_HLHL, 0x340), INTC_VECT(IRL0_HLHH, 0x360),
633a0e23267SMagnus Damm 	INTC_VECT(IRL0_HHLL, 0x380), INTC_VECT(IRL0_HHLH, 0x3a0),
634a0e23267SMagnus Damm 	INTC_VECT(IRL0_HHHL, 0x3c0),
635a0e23267SMagnus Damm };
636a0e23267SMagnus Damm 
6375c37e025SMagnus Damm static struct intc_vect vectors_irl4567[] __initdata = {
638a0e23267SMagnus Damm 	INTC_VECT(IRL4_LLLL, 0xb00), INTC_VECT(IRL4_LLLH, 0xb20),
639a0e23267SMagnus Damm 	INTC_VECT(IRL4_LLHL, 0xb40), INTC_VECT(IRL4_LLHH, 0xb60),
640a0e23267SMagnus Damm 	INTC_VECT(IRL4_LHLL, 0xb80), INTC_VECT(IRL4_LHLH, 0xba0),
641a0e23267SMagnus Damm 	INTC_VECT(IRL4_LHHL, 0xbc0), INTC_VECT(IRL4_LHHH, 0xbe0),
642a0e23267SMagnus Damm 	INTC_VECT(IRL4_HLLL, 0xc00), INTC_VECT(IRL4_HLLH, 0xc20),
643a0e23267SMagnus Damm 	INTC_VECT(IRL4_HLHL, 0xc40), INTC_VECT(IRL4_HLHH, 0xc60),
644a0e23267SMagnus Damm 	INTC_VECT(IRL4_HHLL, 0xc80), INTC_VECT(IRL4_HHLH, 0xca0),
645a0e23267SMagnus Damm 	INTC_VECT(IRL4_HHHL, 0xcc0),
646a0e23267SMagnus Damm };
647a0e23267SMagnus Damm 
648a0e23267SMagnus Damm static DECLARE_INTC_DESC(intc_desc_irl0123, "sh7785-irl0123", vectors_irl0123,
6497f3edee8SMagnus Damm 			 NULL, mask_registers, NULL, NULL);
650a0e23267SMagnus Damm 
651a0e23267SMagnus Damm static DECLARE_INTC_DESC(intc_desc_irl4567, "sh7785-irl4567", vectors_irl4567,
6527f3edee8SMagnus Damm 			 NULL, mask_registers, NULL, NULL);
653a0e23267SMagnus Damm 
654953c8ef2SMagnus Damm #define INTC_ICR0	0xffd00000
655953c8ef2SMagnus Damm #define INTC_INTMSK0	0xffd00044
656953c8ef2SMagnus Damm #define INTC_INTMSK1	0xffd00048
657953c8ef2SMagnus Damm #define INTC_INTMSK2	0xffd40080
658953c8ef2SMagnus Damm #define INTC_INTMSKCLR1	0xffd00068
659953c8ef2SMagnus Damm #define INTC_INTMSKCLR2	0xffd40084
660953c8ef2SMagnus Damm 
66190015c89SMagnus Damm void __init plat_irq_setup(void)
66232351a28SPaul Mundt {
663953c8ef2SMagnus Damm 	/* disable IRQ3-0 + IRQ7-4 */
6649d56dd3bSPaul Mundt 	__raw_writel(0xff000000, INTC_INTMSK0);
665953c8ef2SMagnus Damm 
666953c8ef2SMagnus Damm 	/* disable IRL3-0 + IRL7-4 */
6679d56dd3bSPaul Mundt 	__raw_writel(0xc0000000, INTC_INTMSK1);
6689d56dd3bSPaul Mundt 	__raw_writel(0xfffefffe, INTC_INTMSK2);
669953c8ef2SMagnus Damm 
670953c8ef2SMagnus Damm 	/* select IRL mode for IRL3-0 + IRL7-4 */
6719d56dd3bSPaul Mundt 	__raw_writel(__raw_readl(INTC_ICR0) & ~0x00c00000, INTC_ICR0);
672953c8ef2SMagnus Damm 
673953c8ef2SMagnus Damm 	/* disable holding function, ie enable "SH-4 Mode" */
6749d56dd3bSPaul Mundt 	__raw_writel(__raw_readl(INTC_ICR0) | 0x00200000, INTC_ICR0);
675953c8ef2SMagnus Damm 
676a0e23267SMagnus Damm 	register_intc_controller(&intc_desc);
67732351a28SPaul Mundt }
678d619500aSMagnus Damm 
679a0e23267SMagnus Damm void __init plat_irq_setup_pins(int mode)
680a0e23267SMagnus Damm {
681a0e23267SMagnus Damm 	switch (mode) {
682a0e23267SMagnus Damm 	case IRQ_MODE_IRQ7654:
683953c8ef2SMagnus Damm 		/* select IRQ mode for IRL7-4 */
6849d56dd3bSPaul Mundt 		__raw_writel(__raw_readl(INTC_ICR0) | 0x00400000, INTC_ICR0);
685a0e23267SMagnus Damm 		register_intc_controller(&intc_desc_irq4567);
686a0e23267SMagnus Damm 		break;
687a0e23267SMagnus Damm 	case IRQ_MODE_IRQ3210:
688953c8ef2SMagnus Damm 		/* select IRQ mode for IRL3-0 */
6899d56dd3bSPaul Mundt 		__raw_writel(__raw_readl(INTC_ICR0) | 0x00800000, INTC_ICR0);
690a0e23267SMagnus Damm 		register_intc_controller(&intc_desc_irq0123);
691a0e23267SMagnus Damm 		break;
692a0e23267SMagnus Damm 	case IRQ_MODE_IRL7654:
693953c8ef2SMagnus Damm 		/* enable IRL7-4 but don't provide any masking */
6949d56dd3bSPaul Mundt 		__raw_writel(0x40000000, INTC_INTMSKCLR1);
6959d56dd3bSPaul Mundt 		__raw_writel(0x0000fffe, INTC_INTMSKCLR2);
696a0e23267SMagnus Damm 		break;
697a0e23267SMagnus Damm 	case IRQ_MODE_IRL3210:
698953c8ef2SMagnus Damm 		/* enable IRL0-3 but don't provide any masking */
6999d56dd3bSPaul Mundt 		__raw_writel(0x80000000, INTC_INTMSKCLR1);
7009d56dd3bSPaul Mundt 		__raw_writel(0xfffe0000, INTC_INTMSKCLR2);
701953c8ef2SMagnus Damm 		break;
702953c8ef2SMagnus Damm 	case IRQ_MODE_IRL7654_MASK:
703953c8ef2SMagnus Damm 		/* enable IRL7-4 and mask using cpu intc controller */
7049d56dd3bSPaul Mundt 		__raw_writel(0x40000000, INTC_INTMSKCLR1);
705953c8ef2SMagnus Damm 		register_intc_controller(&intc_desc_irl4567);
706953c8ef2SMagnus Damm 		break;
707953c8ef2SMagnus Damm 	case IRQ_MODE_IRL3210_MASK:
708953c8ef2SMagnus Damm 		/* enable IRL0-3 and mask using cpu intc controller */
7099d56dd3bSPaul Mundt 		__raw_writel(0x80000000, INTC_INTMSKCLR1);
710a0e23267SMagnus Damm 		register_intc_controller(&intc_desc_irl0123);
711a0e23267SMagnus Damm 		break;
712a0e23267SMagnus Damm 	default:
713a0e23267SMagnus Damm 		BUG();
714a0e23267SMagnus Damm 	}
715a0e23267SMagnus Damm }
716db250496SPaul Mundt 
717db250496SPaul Mundt void __init plat_mem_setup(void)
718db250496SPaul Mundt {
719db250496SPaul Mundt 	/* Register the URAM space as Node 1 */
720675bd780SPaul Mundt 	setup_bootmem_node(1, 0xe55f0000, 0xe5610000);
721db250496SPaul Mundt }
722