1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * SH7724 Setup
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright (C) 2009 Renesas Solutions Corp.
6*4882a593Smuzhiyun *
7*4882a593Smuzhiyun * Kuninori Morimoto <morimoto.kuninori@renesas.com>
8*4882a593Smuzhiyun *
9*4882a593Smuzhiyun * Based on SH7723 Setup
10*4882a593Smuzhiyun * Copyright (C) 2008 Paul Mundt
11*4882a593Smuzhiyun */
12*4882a593Smuzhiyun #include <linux/platform_device.h>
13*4882a593Smuzhiyun #include <linux/init.h>
14*4882a593Smuzhiyun #include <linux/serial.h>
15*4882a593Smuzhiyun #include <linux/mm.h>
16*4882a593Smuzhiyun #include <linux/serial_sci.h>
17*4882a593Smuzhiyun #include <linux/uio_driver.h>
18*4882a593Smuzhiyun #include <linux/sh_dma.h>
19*4882a593Smuzhiyun #include <linux/sh_timer.h>
20*4882a593Smuzhiyun #include <linux/sh_intc.h>
21*4882a593Smuzhiyun #include <linux/io.h>
22*4882a593Smuzhiyun #include <linux/notifier.h>
23*4882a593Smuzhiyun
24*4882a593Smuzhiyun #include <asm/suspend.h>
25*4882a593Smuzhiyun #include <asm/clock.h>
26*4882a593Smuzhiyun #include <asm/mmzone.h>
27*4882a593Smuzhiyun #include <asm/platform_early.h>
28*4882a593Smuzhiyun
29*4882a593Smuzhiyun #include <cpu/dma-register.h>
30*4882a593Smuzhiyun #include <cpu/sh7724.h>
31*4882a593Smuzhiyun
32*4882a593Smuzhiyun /* DMA */
33*4882a593Smuzhiyun static const struct sh_dmae_slave_config sh7724_dmae_slaves[] = {
34*4882a593Smuzhiyun {
35*4882a593Smuzhiyun .slave_id = SHDMA_SLAVE_SCIF0_TX,
36*4882a593Smuzhiyun .addr = 0xffe0000c,
37*4882a593Smuzhiyun .chcr = DM_FIX | SM_INC | RS_ERS | TS_INDEX2VAL(XMIT_SZ_8BIT),
38*4882a593Smuzhiyun .mid_rid = 0x21,
39*4882a593Smuzhiyun }, {
40*4882a593Smuzhiyun .slave_id = SHDMA_SLAVE_SCIF0_RX,
41*4882a593Smuzhiyun .addr = 0xffe00014,
42*4882a593Smuzhiyun .chcr = DM_INC | SM_FIX | RS_ERS | TS_INDEX2VAL(XMIT_SZ_8BIT),
43*4882a593Smuzhiyun .mid_rid = 0x22,
44*4882a593Smuzhiyun }, {
45*4882a593Smuzhiyun .slave_id = SHDMA_SLAVE_SCIF1_TX,
46*4882a593Smuzhiyun .addr = 0xffe1000c,
47*4882a593Smuzhiyun .chcr = DM_FIX | SM_INC | RS_ERS | TS_INDEX2VAL(XMIT_SZ_8BIT),
48*4882a593Smuzhiyun .mid_rid = 0x25,
49*4882a593Smuzhiyun }, {
50*4882a593Smuzhiyun .slave_id = SHDMA_SLAVE_SCIF1_RX,
51*4882a593Smuzhiyun .addr = 0xffe10014,
52*4882a593Smuzhiyun .chcr = DM_INC | SM_FIX | RS_ERS | TS_INDEX2VAL(XMIT_SZ_8BIT),
53*4882a593Smuzhiyun .mid_rid = 0x26,
54*4882a593Smuzhiyun }, {
55*4882a593Smuzhiyun .slave_id = SHDMA_SLAVE_SCIF2_TX,
56*4882a593Smuzhiyun .addr = 0xffe2000c,
57*4882a593Smuzhiyun .chcr = DM_FIX | SM_INC | RS_ERS | TS_INDEX2VAL(XMIT_SZ_8BIT),
58*4882a593Smuzhiyun .mid_rid = 0x29,
59*4882a593Smuzhiyun }, {
60*4882a593Smuzhiyun .slave_id = SHDMA_SLAVE_SCIF2_RX,
61*4882a593Smuzhiyun .addr = 0xffe20014,
62*4882a593Smuzhiyun .chcr = DM_INC | SM_FIX | RS_ERS | TS_INDEX2VAL(XMIT_SZ_8BIT),
63*4882a593Smuzhiyun .mid_rid = 0x2a,
64*4882a593Smuzhiyun }, {
65*4882a593Smuzhiyun .slave_id = SHDMA_SLAVE_SCIF3_TX,
66*4882a593Smuzhiyun .addr = 0xa4e30020,
67*4882a593Smuzhiyun .chcr = DM_FIX | SM_INC | RS_ERS | TS_INDEX2VAL(XMIT_SZ_8BIT),
68*4882a593Smuzhiyun .mid_rid = 0x2d,
69*4882a593Smuzhiyun }, {
70*4882a593Smuzhiyun .slave_id = SHDMA_SLAVE_SCIF3_RX,
71*4882a593Smuzhiyun .addr = 0xa4e30024,
72*4882a593Smuzhiyun .chcr = DM_INC | SM_FIX | RS_ERS | TS_INDEX2VAL(XMIT_SZ_8BIT),
73*4882a593Smuzhiyun .mid_rid = 0x2e,
74*4882a593Smuzhiyun }, {
75*4882a593Smuzhiyun .slave_id = SHDMA_SLAVE_SCIF4_TX,
76*4882a593Smuzhiyun .addr = 0xa4e40020,
77*4882a593Smuzhiyun .chcr = DM_FIX | SM_INC | RS_ERS | TS_INDEX2VAL(XMIT_SZ_8BIT),
78*4882a593Smuzhiyun .mid_rid = 0x31,
79*4882a593Smuzhiyun }, {
80*4882a593Smuzhiyun .slave_id = SHDMA_SLAVE_SCIF4_RX,
81*4882a593Smuzhiyun .addr = 0xa4e40024,
82*4882a593Smuzhiyun .chcr = DM_INC | SM_FIX | RS_ERS | TS_INDEX2VAL(XMIT_SZ_8BIT),
83*4882a593Smuzhiyun .mid_rid = 0x32,
84*4882a593Smuzhiyun }, {
85*4882a593Smuzhiyun .slave_id = SHDMA_SLAVE_SCIF5_TX,
86*4882a593Smuzhiyun .addr = 0xa4e50020,
87*4882a593Smuzhiyun .chcr = DM_FIX | SM_INC | RS_ERS | TS_INDEX2VAL(XMIT_SZ_8BIT),
88*4882a593Smuzhiyun .mid_rid = 0x35,
89*4882a593Smuzhiyun }, {
90*4882a593Smuzhiyun .slave_id = SHDMA_SLAVE_SCIF5_RX,
91*4882a593Smuzhiyun .addr = 0xa4e50024,
92*4882a593Smuzhiyun .chcr = DM_INC | SM_FIX | RS_ERS | TS_INDEX2VAL(XMIT_SZ_8BIT),
93*4882a593Smuzhiyun .mid_rid = 0x36,
94*4882a593Smuzhiyun }, {
95*4882a593Smuzhiyun .slave_id = SHDMA_SLAVE_USB0D0_TX,
96*4882a593Smuzhiyun .addr = 0xA4D80100,
97*4882a593Smuzhiyun .chcr = DM_FIX | SM_INC | RS_ERS | TS_INDEX2VAL(XMIT_SZ_32BIT),
98*4882a593Smuzhiyun .mid_rid = 0x73,
99*4882a593Smuzhiyun }, {
100*4882a593Smuzhiyun .slave_id = SHDMA_SLAVE_USB0D0_RX,
101*4882a593Smuzhiyun .addr = 0xA4D80100,
102*4882a593Smuzhiyun .chcr = DM_INC | SM_FIX | RS_ERS | TS_INDEX2VAL(XMIT_SZ_32BIT),
103*4882a593Smuzhiyun .mid_rid = 0x73,
104*4882a593Smuzhiyun }, {
105*4882a593Smuzhiyun .slave_id = SHDMA_SLAVE_USB0D1_TX,
106*4882a593Smuzhiyun .addr = 0xA4D80120,
107*4882a593Smuzhiyun .chcr = DM_FIX | SM_INC | RS_ERS | TS_INDEX2VAL(XMIT_SZ_32BIT),
108*4882a593Smuzhiyun .mid_rid = 0x77,
109*4882a593Smuzhiyun }, {
110*4882a593Smuzhiyun .slave_id = SHDMA_SLAVE_USB0D1_RX,
111*4882a593Smuzhiyun .addr = 0xA4D80120,
112*4882a593Smuzhiyun .chcr = DM_INC | SM_FIX | RS_ERS | TS_INDEX2VAL(XMIT_SZ_32BIT),
113*4882a593Smuzhiyun .mid_rid = 0x77,
114*4882a593Smuzhiyun }, {
115*4882a593Smuzhiyun .slave_id = SHDMA_SLAVE_USB1D0_TX,
116*4882a593Smuzhiyun .addr = 0xA4D90100,
117*4882a593Smuzhiyun .chcr = DM_FIX | SM_INC | RS_ERS | TS_INDEX2VAL(XMIT_SZ_32BIT),
118*4882a593Smuzhiyun .mid_rid = 0xab,
119*4882a593Smuzhiyun }, {
120*4882a593Smuzhiyun .slave_id = SHDMA_SLAVE_USB1D0_RX,
121*4882a593Smuzhiyun .addr = 0xA4D90100,
122*4882a593Smuzhiyun .chcr = DM_INC | SM_FIX | RS_ERS | TS_INDEX2VAL(XMIT_SZ_32BIT),
123*4882a593Smuzhiyun .mid_rid = 0xab,
124*4882a593Smuzhiyun }, {
125*4882a593Smuzhiyun .slave_id = SHDMA_SLAVE_USB1D1_TX,
126*4882a593Smuzhiyun .addr = 0xA4D90120,
127*4882a593Smuzhiyun .chcr = DM_FIX | SM_INC | RS_ERS | TS_INDEX2VAL(XMIT_SZ_32BIT),
128*4882a593Smuzhiyun .mid_rid = 0xaf,
129*4882a593Smuzhiyun }, {
130*4882a593Smuzhiyun .slave_id = SHDMA_SLAVE_USB1D1_RX,
131*4882a593Smuzhiyun .addr = 0xA4D90120,
132*4882a593Smuzhiyun .chcr = DM_INC | SM_FIX | RS_ERS | TS_INDEX2VAL(XMIT_SZ_32BIT),
133*4882a593Smuzhiyun .mid_rid = 0xaf,
134*4882a593Smuzhiyun }, {
135*4882a593Smuzhiyun .slave_id = SHDMA_SLAVE_SDHI0_TX,
136*4882a593Smuzhiyun .addr = 0x04ce0030,
137*4882a593Smuzhiyun .chcr = DM_FIX | SM_INC | RS_ERS | TS_INDEX2VAL(XMIT_SZ_16BIT),
138*4882a593Smuzhiyun .mid_rid = 0xc1,
139*4882a593Smuzhiyun }, {
140*4882a593Smuzhiyun .slave_id = SHDMA_SLAVE_SDHI0_RX,
141*4882a593Smuzhiyun .addr = 0x04ce0030,
142*4882a593Smuzhiyun .chcr = DM_INC | SM_FIX | RS_ERS | TS_INDEX2VAL(XMIT_SZ_16BIT),
143*4882a593Smuzhiyun .mid_rid = 0xc2,
144*4882a593Smuzhiyun }, {
145*4882a593Smuzhiyun .slave_id = SHDMA_SLAVE_SDHI1_TX,
146*4882a593Smuzhiyun .addr = 0x04cf0030,
147*4882a593Smuzhiyun .chcr = DM_FIX | SM_INC | RS_ERS | TS_INDEX2VAL(XMIT_SZ_16BIT),
148*4882a593Smuzhiyun .mid_rid = 0xc9,
149*4882a593Smuzhiyun }, {
150*4882a593Smuzhiyun .slave_id = SHDMA_SLAVE_SDHI1_RX,
151*4882a593Smuzhiyun .addr = 0x04cf0030,
152*4882a593Smuzhiyun .chcr = DM_INC | SM_FIX | RS_ERS | TS_INDEX2VAL(XMIT_SZ_16BIT),
153*4882a593Smuzhiyun .mid_rid = 0xca,
154*4882a593Smuzhiyun },
155*4882a593Smuzhiyun };
156*4882a593Smuzhiyun
157*4882a593Smuzhiyun static const struct sh_dmae_channel sh7724_dmae_channels[] = {
158*4882a593Smuzhiyun {
159*4882a593Smuzhiyun .offset = 0,
160*4882a593Smuzhiyun .dmars = 0,
161*4882a593Smuzhiyun .dmars_bit = 0,
162*4882a593Smuzhiyun }, {
163*4882a593Smuzhiyun .offset = 0x10,
164*4882a593Smuzhiyun .dmars = 0,
165*4882a593Smuzhiyun .dmars_bit = 8,
166*4882a593Smuzhiyun }, {
167*4882a593Smuzhiyun .offset = 0x20,
168*4882a593Smuzhiyun .dmars = 4,
169*4882a593Smuzhiyun .dmars_bit = 0,
170*4882a593Smuzhiyun }, {
171*4882a593Smuzhiyun .offset = 0x30,
172*4882a593Smuzhiyun .dmars = 4,
173*4882a593Smuzhiyun .dmars_bit = 8,
174*4882a593Smuzhiyun }, {
175*4882a593Smuzhiyun .offset = 0x50,
176*4882a593Smuzhiyun .dmars = 8,
177*4882a593Smuzhiyun .dmars_bit = 0,
178*4882a593Smuzhiyun }, {
179*4882a593Smuzhiyun .offset = 0x60,
180*4882a593Smuzhiyun .dmars = 8,
181*4882a593Smuzhiyun .dmars_bit = 8,
182*4882a593Smuzhiyun }
183*4882a593Smuzhiyun };
184*4882a593Smuzhiyun
185*4882a593Smuzhiyun static const unsigned int ts_shift[] = TS_SHIFT;
186*4882a593Smuzhiyun
187*4882a593Smuzhiyun static struct sh_dmae_pdata dma_platform_data = {
188*4882a593Smuzhiyun .slave = sh7724_dmae_slaves,
189*4882a593Smuzhiyun .slave_num = ARRAY_SIZE(sh7724_dmae_slaves),
190*4882a593Smuzhiyun .channel = sh7724_dmae_channels,
191*4882a593Smuzhiyun .channel_num = ARRAY_SIZE(sh7724_dmae_channels),
192*4882a593Smuzhiyun .ts_low_shift = CHCR_TS_LOW_SHIFT,
193*4882a593Smuzhiyun .ts_low_mask = CHCR_TS_LOW_MASK,
194*4882a593Smuzhiyun .ts_high_shift = CHCR_TS_HIGH_SHIFT,
195*4882a593Smuzhiyun .ts_high_mask = CHCR_TS_HIGH_MASK,
196*4882a593Smuzhiyun .ts_shift = ts_shift,
197*4882a593Smuzhiyun .ts_shift_num = ARRAY_SIZE(ts_shift),
198*4882a593Smuzhiyun .dmaor_init = DMAOR_INIT,
199*4882a593Smuzhiyun };
200*4882a593Smuzhiyun
201*4882a593Smuzhiyun /* Resource order important! */
202*4882a593Smuzhiyun static struct resource sh7724_dmae0_resources[] = {
203*4882a593Smuzhiyun {
204*4882a593Smuzhiyun /* Channel registers and DMAOR */
205*4882a593Smuzhiyun .start = 0xfe008020,
206*4882a593Smuzhiyun .end = 0xfe00808f,
207*4882a593Smuzhiyun .flags = IORESOURCE_MEM,
208*4882a593Smuzhiyun },
209*4882a593Smuzhiyun {
210*4882a593Smuzhiyun /* DMARSx */
211*4882a593Smuzhiyun .start = 0xfe009000,
212*4882a593Smuzhiyun .end = 0xfe00900b,
213*4882a593Smuzhiyun .flags = IORESOURCE_MEM,
214*4882a593Smuzhiyun },
215*4882a593Smuzhiyun {
216*4882a593Smuzhiyun .name = "error_irq",
217*4882a593Smuzhiyun .start = evt2irq(0xbc0),
218*4882a593Smuzhiyun .end = evt2irq(0xbc0),
219*4882a593Smuzhiyun .flags = IORESOURCE_IRQ,
220*4882a593Smuzhiyun },
221*4882a593Smuzhiyun {
222*4882a593Smuzhiyun /* IRQ for channels 0-3 */
223*4882a593Smuzhiyun .start = evt2irq(0x800),
224*4882a593Smuzhiyun .end = evt2irq(0x860),
225*4882a593Smuzhiyun .flags = IORESOURCE_IRQ,
226*4882a593Smuzhiyun },
227*4882a593Smuzhiyun {
228*4882a593Smuzhiyun /* IRQ for channels 4-5 */
229*4882a593Smuzhiyun .start = evt2irq(0xb80),
230*4882a593Smuzhiyun .end = evt2irq(0xba0),
231*4882a593Smuzhiyun .flags = IORESOURCE_IRQ,
232*4882a593Smuzhiyun },
233*4882a593Smuzhiyun };
234*4882a593Smuzhiyun
235*4882a593Smuzhiyun /* Resource order important! */
236*4882a593Smuzhiyun static struct resource sh7724_dmae1_resources[] = {
237*4882a593Smuzhiyun {
238*4882a593Smuzhiyun /* Channel registers and DMAOR */
239*4882a593Smuzhiyun .start = 0xfdc08020,
240*4882a593Smuzhiyun .end = 0xfdc0808f,
241*4882a593Smuzhiyun .flags = IORESOURCE_MEM,
242*4882a593Smuzhiyun },
243*4882a593Smuzhiyun {
244*4882a593Smuzhiyun /* DMARSx */
245*4882a593Smuzhiyun .start = 0xfdc09000,
246*4882a593Smuzhiyun .end = 0xfdc0900b,
247*4882a593Smuzhiyun .flags = IORESOURCE_MEM,
248*4882a593Smuzhiyun },
249*4882a593Smuzhiyun {
250*4882a593Smuzhiyun .name = "error_irq",
251*4882a593Smuzhiyun .start = evt2irq(0xb40),
252*4882a593Smuzhiyun .end = evt2irq(0xb40),
253*4882a593Smuzhiyun .flags = IORESOURCE_IRQ,
254*4882a593Smuzhiyun },
255*4882a593Smuzhiyun {
256*4882a593Smuzhiyun /* IRQ for channels 0-3 */
257*4882a593Smuzhiyun .start = evt2irq(0x700),
258*4882a593Smuzhiyun .end = evt2irq(0x760),
259*4882a593Smuzhiyun .flags = IORESOURCE_IRQ,
260*4882a593Smuzhiyun },
261*4882a593Smuzhiyun {
262*4882a593Smuzhiyun /* IRQ for channels 4-5 */
263*4882a593Smuzhiyun .start = evt2irq(0xb00),
264*4882a593Smuzhiyun .end = evt2irq(0xb20),
265*4882a593Smuzhiyun .flags = IORESOURCE_IRQ,
266*4882a593Smuzhiyun },
267*4882a593Smuzhiyun };
268*4882a593Smuzhiyun
269*4882a593Smuzhiyun static struct platform_device dma0_device = {
270*4882a593Smuzhiyun .name = "sh-dma-engine",
271*4882a593Smuzhiyun .id = 0,
272*4882a593Smuzhiyun .resource = sh7724_dmae0_resources,
273*4882a593Smuzhiyun .num_resources = ARRAY_SIZE(sh7724_dmae0_resources),
274*4882a593Smuzhiyun .dev = {
275*4882a593Smuzhiyun .platform_data = &dma_platform_data,
276*4882a593Smuzhiyun },
277*4882a593Smuzhiyun };
278*4882a593Smuzhiyun
279*4882a593Smuzhiyun static struct platform_device dma1_device = {
280*4882a593Smuzhiyun .name = "sh-dma-engine",
281*4882a593Smuzhiyun .id = 1,
282*4882a593Smuzhiyun .resource = sh7724_dmae1_resources,
283*4882a593Smuzhiyun .num_resources = ARRAY_SIZE(sh7724_dmae1_resources),
284*4882a593Smuzhiyun .dev = {
285*4882a593Smuzhiyun .platform_data = &dma_platform_data,
286*4882a593Smuzhiyun },
287*4882a593Smuzhiyun };
288*4882a593Smuzhiyun
289*4882a593Smuzhiyun /* Serial */
290*4882a593Smuzhiyun static struct plat_sci_port scif0_platform_data = {
291*4882a593Smuzhiyun .scscr = SCSCR_REIE,
292*4882a593Smuzhiyun .type = PORT_SCIF,
293*4882a593Smuzhiyun .regtype = SCIx_SH4_SCIF_NO_SCSPTR_REGTYPE,
294*4882a593Smuzhiyun };
295*4882a593Smuzhiyun
296*4882a593Smuzhiyun static struct resource scif0_resources[] = {
297*4882a593Smuzhiyun DEFINE_RES_MEM(0xffe00000, 0x100),
298*4882a593Smuzhiyun DEFINE_RES_IRQ(evt2irq(0xc00)),
299*4882a593Smuzhiyun };
300*4882a593Smuzhiyun
301*4882a593Smuzhiyun static struct platform_device scif0_device = {
302*4882a593Smuzhiyun .name = "sh-sci",
303*4882a593Smuzhiyun .id = 0,
304*4882a593Smuzhiyun .resource = scif0_resources,
305*4882a593Smuzhiyun .num_resources = ARRAY_SIZE(scif0_resources),
306*4882a593Smuzhiyun .dev = {
307*4882a593Smuzhiyun .platform_data = &scif0_platform_data,
308*4882a593Smuzhiyun },
309*4882a593Smuzhiyun };
310*4882a593Smuzhiyun
311*4882a593Smuzhiyun static struct plat_sci_port scif1_platform_data = {
312*4882a593Smuzhiyun .scscr = SCSCR_REIE,
313*4882a593Smuzhiyun .type = PORT_SCIF,
314*4882a593Smuzhiyun .regtype = SCIx_SH4_SCIF_NO_SCSPTR_REGTYPE,
315*4882a593Smuzhiyun };
316*4882a593Smuzhiyun
317*4882a593Smuzhiyun static struct resource scif1_resources[] = {
318*4882a593Smuzhiyun DEFINE_RES_MEM(0xffe10000, 0x100),
319*4882a593Smuzhiyun DEFINE_RES_IRQ(evt2irq(0xc20)),
320*4882a593Smuzhiyun };
321*4882a593Smuzhiyun
322*4882a593Smuzhiyun static struct platform_device scif1_device = {
323*4882a593Smuzhiyun .name = "sh-sci",
324*4882a593Smuzhiyun .id = 1,
325*4882a593Smuzhiyun .resource = scif1_resources,
326*4882a593Smuzhiyun .num_resources = ARRAY_SIZE(scif1_resources),
327*4882a593Smuzhiyun .dev = {
328*4882a593Smuzhiyun .platform_data = &scif1_platform_data,
329*4882a593Smuzhiyun },
330*4882a593Smuzhiyun };
331*4882a593Smuzhiyun
332*4882a593Smuzhiyun static struct plat_sci_port scif2_platform_data = {
333*4882a593Smuzhiyun .scscr = SCSCR_REIE,
334*4882a593Smuzhiyun .type = PORT_SCIF,
335*4882a593Smuzhiyun .regtype = SCIx_SH4_SCIF_NO_SCSPTR_REGTYPE,
336*4882a593Smuzhiyun };
337*4882a593Smuzhiyun
338*4882a593Smuzhiyun static struct resource scif2_resources[] = {
339*4882a593Smuzhiyun DEFINE_RES_MEM(0xffe20000, 0x100),
340*4882a593Smuzhiyun DEFINE_RES_IRQ(evt2irq(0xc40)),
341*4882a593Smuzhiyun };
342*4882a593Smuzhiyun
343*4882a593Smuzhiyun static struct platform_device scif2_device = {
344*4882a593Smuzhiyun .name = "sh-sci",
345*4882a593Smuzhiyun .id = 2,
346*4882a593Smuzhiyun .resource = scif2_resources,
347*4882a593Smuzhiyun .num_resources = ARRAY_SIZE(scif2_resources),
348*4882a593Smuzhiyun .dev = {
349*4882a593Smuzhiyun .platform_data = &scif2_platform_data,
350*4882a593Smuzhiyun },
351*4882a593Smuzhiyun };
352*4882a593Smuzhiyun
353*4882a593Smuzhiyun static struct plat_sci_port scif3_platform_data = {
354*4882a593Smuzhiyun .sampling_rate = 8,
355*4882a593Smuzhiyun .type = PORT_SCIFA,
356*4882a593Smuzhiyun };
357*4882a593Smuzhiyun
358*4882a593Smuzhiyun static struct resource scif3_resources[] = {
359*4882a593Smuzhiyun DEFINE_RES_MEM(0xa4e30000, 0x100),
360*4882a593Smuzhiyun DEFINE_RES_IRQ(evt2irq(0x900)),
361*4882a593Smuzhiyun };
362*4882a593Smuzhiyun
363*4882a593Smuzhiyun static struct platform_device scif3_device = {
364*4882a593Smuzhiyun .name = "sh-sci",
365*4882a593Smuzhiyun .id = 3,
366*4882a593Smuzhiyun .resource = scif3_resources,
367*4882a593Smuzhiyun .num_resources = ARRAY_SIZE(scif3_resources),
368*4882a593Smuzhiyun .dev = {
369*4882a593Smuzhiyun .platform_data = &scif3_platform_data,
370*4882a593Smuzhiyun },
371*4882a593Smuzhiyun };
372*4882a593Smuzhiyun
373*4882a593Smuzhiyun static struct plat_sci_port scif4_platform_data = {
374*4882a593Smuzhiyun .sampling_rate = 8,
375*4882a593Smuzhiyun .type = PORT_SCIFA,
376*4882a593Smuzhiyun };
377*4882a593Smuzhiyun
378*4882a593Smuzhiyun static struct resource scif4_resources[] = {
379*4882a593Smuzhiyun DEFINE_RES_MEM(0xa4e40000, 0x100),
380*4882a593Smuzhiyun DEFINE_RES_IRQ(evt2irq(0xd00)),
381*4882a593Smuzhiyun };
382*4882a593Smuzhiyun
383*4882a593Smuzhiyun static struct platform_device scif4_device = {
384*4882a593Smuzhiyun .name = "sh-sci",
385*4882a593Smuzhiyun .id = 4,
386*4882a593Smuzhiyun .resource = scif4_resources,
387*4882a593Smuzhiyun .num_resources = ARRAY_SIZE(scif4_resources),
388*4882a593Smuzhiyun .dev = {
389*4882a593Smuzhiyun .platform_data = &scif4_platform_data,
390*4882a593Smuzhiyun },
391*4882a593Smuzhiyun };
392*4882a593Smuzhiyun
393*4882a593Smuzhiyun static struct plat_sci_port scif5_platform_data = {
394*4882a593Smuzhiyun .sampling_rate = 8,
395*4882a593Smuzhiyun .type = PORT_SCIFA,
396*4882a593Smuzhiyun };
397*4882a593Smuzhiyun
398*4882a593Smuzhiyun static struct resource scif5_resources[] = {
399*4882a593Smuzhiyun DEFINE_RES_MEM(0xa4e50000, 0x100),
400*4882a593Smuzhiyun DEFINE_RES_IRQ(evt2irq(0xfa0)),
401*4882a593Smuzhiyun };
402*4882a593Smuzhiyun
403*4882a593Smuzhiyun static struct platform_device scif5_device = {
404*4882a593Smuzhiyun .name = "sh-sci",
405*4882a593Smuzhiyun .id = 5,
406*4882a593Smuzhiyun .resource = scif5_resources,
407*4882a593Smuzhiyun .num_resources = ARRAY_SIZE(scif5_resources),
408*4882a593Smuzhiyun .dev = {
409*4882a593Smuzhiyun .platform_data = &scif5_platform_data,
410*4882a593Smuzhiyun },
411*4882a593Smuzhiyun };
412*4882a593Smuzhiyun
413*4882a593Smuzhiyun /* RTC */
414*4882a593Smuzhiyun static struct resource rtc_resources[] = {
415*4882a593Smuzhiyun [0] = {
416*4882a593Smuzhiyun .start = 0xa465fec0,
417*4882a593Smuzhiyun .end = 0xa465fec0 + 0x58 - 1,
418*4882a593Smuzhiyun .flags = IORESOURCE_IO,
419*4882a593Smuzhiyun },
420*4882a593Smuzhiyun [1] = {
421*4882a593Smuzhiyun /* Period IRQ */
422*4882a593Smuzhiyun .start = evt2irq(0xaa0),
423*4882a593Smuzhiyun .flags = IORESOURCE_IRQ,
424*4882a593Smuzhiyun },
425*4882a593Smuzhiyun [2] = {
426*4882a593Smuzhiyun /* Carry IRQ */
427*4882a593Smuzhiyun .start = evt2irq(0xac0),
428*4882a593Smuzhiyun .flags = IORESOURCE_IRQ,
429*4882a593Smuzhiyun },
430*4882a593Smuzhiyun [3] = {
431*4882a593Smuzhiyun /* Alarm IRQ */
432*4882a593Smuzhiyun .start = evt2irq(0xa80),
433*4882a593Smuzhiyun .flags = IORESOURCE_IRQ,
434*4882a593Smuzhiyun },
435*4882a593Smuzhiyun };
436*4882a593Smuzhiyun
437*4882a593Smuzhiyun static struct platform_device rtc_device = {
438*4882a593Smuzhiyun .name = "sh-rtc",
439*4882a593Smuzhiyun .id = -1,
440*4882a593Smuzhiyun .num_resources = ARRAY_SIZE(rtc_resources),
441*4882a593Smuzhiyun .resource = rtc_resources,
442*4882a593Smuzhiyun };
443*4882a593Smuzhiyun
444*4882a593Smuzhiyun /* I2C0 */
445*4882a593Smuzhiyun static struct resource iic0_resources[] = {
446*4882a593Smuzhiyun [0] = {
447*4882a593Smuzhiyun .name = "IIC0",
448*4882a593Smuzhiyun .start = 0x04470000,
449*4882a593Smuzhiyun .end = 0x04470018 - 1,
450*4882a593Smuzhiyun .flags = IORESOURCE_MEM,
451*4882a593Smuzhiyun },
452*4882a593Smuzhiyun [1] = {
453*4882a593Smuzhiyun .start = evt2irq(0xe00),
454*4882a593Smuzhiyun .end = evt2irq(0xe60),
455*4882a593Smuzhiyun .flags = IORESOURCE_IRQ,
456*4882a593Smuzhiyun },
457*4882a593Smuzhiyun };
458*4882a593Smuzhiyun
459*4882a593Smuzhiyun static struct platform_device iic0_device = {
460*4882a593Smuzhiyun .name = "i2c-sh_mobile",
461*4882a593Smuzhiyun .id = 0, /* "i2c0" clock */
462*4882a593Smuzhiyun .num_resources = ARRAY_SIZE(iic0_resources),
463*4882a593Smuzhiyun .resource = iic0_resources,
464*4882a593Smuzhiyun };
465*4882a593Smuzhiyun
466*4882a593Smuzhiyun /* I2C1 */
467*4882a593Smuzhiyun static struct resource iic1_resources[] = {
468*4882a593Smuzhiyun [0] = {
469*4882a593Smuzhiyun .name = "IIC1",
470*4882a593Smuzhiyun .start = 0x04750000,
471*4882a593Smuzhiyun .end = 0x04750018 - 1,
472*4882a593Smuzhiyun .flags = IORESOURCE_MEM,
473*4882a593Smuzhiyun },
474*4882a593Smuzhiyun [1] = {
475*4882a593Smuzhiyun .start = evt2irq(0xd80),
476*4882a593Smuzhiyun .end = evt2irq(0xde0),
477*4882a593Smuzhiyun .flags = IORESOURCE_IRQ,
478*4882a593Smuzhiyun },
479*4882a593Smuzhiyun };
480*4882a593Smuzhiyun
481*4882a593Smuzhiyun static struct platform_device iic1_device = {
482*4882a593Smuzhiyun .name = "i2c-sh_mobile",
483*4882a593Smuzhiyun .id = 1, /* "i2c1" clock */
484*4882a593Smuzhiyun .num_resources = ARRAY_SIZE(iic1_resources),
485*4882a593Smuzhiyun .resource = iic1_resources,
486*4882a593Smuzhiyun };
487*4882a593Smuzhiyun
488*4882a593Smuzhiyun /* VPU */
489*4882a593Smuzhiyun static struct uio_info vpu_platform_data = {
490*4882a593Smuzhiyun .name = "VPU5F",
491*4882a593Smuzhiyun .version = "0",
492*4882a593Smuzhiyun .irq = evt2irq(0x980),
493*4882a593Smuzhiyun };
494*4882a593Smuzhiyun
495*4882a593Smuzhiyun static struct resource vpu_resources[] = {
496*4882a593Smuzhiyun [0] = {
497*4882a593Smuzhiyun .name = "VPU",
498*4882a593Smuzhiyun .start = 0xfe900000,
499*4882a593Smuzhiyun .end = 0xfe902807,
500*4882a593Smuzhiyun .flags = IORESOURCE_MEM,
501*4882a593Smuzhiyun },
502*4882a593Smuzhiyun [1] = {
503*4882a593Smuzhiyun /* place holder for contiguous memory */
504*4882a593Smuzhiyun },
505*4882a593Smuzhiyun };
506*4882a593Smuzhiyun
507*4882a593Smuzhiyun static struct platform_device vpu_device = {
508*4882a593Smuzhiyun .name = "uio_pdrv_genirq",
509*4882a593Smuzhiyun .id = 0,
510*4882a593Smuzhiyun .dev = {
511*4882a593Smuzhiyun .platform_data = &vpu_platform_data,
512*4882a593Smuzhiyun },
513*4882a593Smuzhiyun .resource = vpu_resources,
514*4882a593Smuzhiyun .num_resources = ARRAY_SIZE(vpu_resources),
515*4882a593Smuzhiyun };
516*4882a593Smuzhiyun
517*4882a593Smuzhiyun /* VEU0 */
518*4882a593Smuzhiyun static struct uio_info veu0_platform_data = {
519*4882a593Smuzhiyun .name = "VEU3F0",
520*4882a593Smuzhiyun .version = "0",
521*4882a593Smuzhiyun .irq = evt2irq(0xc60),
522*4882a593Smuzhiyun };
523*4882a593Smuzhiyun
524*4882a593Smuzhiyun static struct resource veu0_resources[] = {
525*4882a593Smuzhiyun [0] = {
526*4882a593Smuzhiyun .name = "VEU3F0",
527*4882a593Smuzhiyun .start = 0xfe920000,
528*4882a593Smuzhiyun .end = 0xfe9200cb,
529*4882a593Smuzhiyun .flags = IORESOURCE_MEM,
530*4882a593Smuzhiyun },
531*4882a593Smuzhiyun [1] = {
532*4882a593Smuzhiyun /* place holder for contiguous memory */
533*4882a593Smuzhiyun },
534*4882a593Smuzhiyun };
535*4882a593Smuzhiyun
536*4882a593Smuzhiyun static struct platform_device veu0_device = {
537*4882a593Smuzhiyun .name = "uio_pdrv_genirq",
538*4882a593Smuzhiyun .id = 1,
539*4882a593Smuzhiyun .dev = {
540*4882a593Smuzhiyun .platform_data = &veu0_platform_data,
541*4882a593Smuzhiyun },
542*4882a593Smuzhiyun .resource = veu0_resources,
543*4882a593Smuzhiyun .num_resources = ARRAY_SIZE(veu0_resources),
544*4882a593Smuzhiyun };
545*4882a593Smuzhiyun
546*4882a593Smuzhiyun /* VEU1 */
547*4882a593Smuzhiyun static struct uio_info veu1_platform_data = {
548*4882a593Smuzhiyun .name = "VEU3F1",
549*4882a593Smuzhiyun .version = "0",
550*4882a593Smuzhiyun .irq = evt2irq(0x8c0),
551*4882a593Smuzhiyun };
552*4882a593Smuzhiyun
553*4882a593Smuzhiyun static struct resource veu1_resources[] = {
554*4882a593Smuzhiyun [0] = {
555*4882a593Smuzhiyun .name = "VEU3F1",
556*4882a593Smuzhiyun .start = 0xfe924000,
557*4882a593Smuzhiyun .end = 0xfe9240cb,
558*4882a593Smuzhiyun .flags = IORESOURCE_MEM,
559*4882a593Smuzhiyun },
560*4882a593Smuzhiyun [1] = {
561*4882a593Smuzhiyun /* place holder for contiguous memory */
562*4882a593Smuzhiyun },
563*4882a593Smuzhiyun };
564*4882a593Smuzhiyun
565*4882a593Smuzhiyun static struct platform_device veu1_device = {
566*4882a593Smuzhiyun .name = "uio_pdrv_genirq",
567*4882a593Smuzhiyun .id = 2,
568*4882a593Smuzhiyun .dev = {
569*4882a593Smuzhiyun .platform_data = &veu1_platform_data,
570*4882a593Smuzhiyun },
571*4882a593Smuzhiyun .resource = veu1_resources,
572*4882a593Smuzhiyun .num_resources = ARRAY_SIZE(veu1_resources),
573*4882a593Smuzhiyun };
574*4882a593Smuzhiyun
575*4882a593Smuzhiyun /* BEU0 */
576*4882a593Smuzhiyun static struct uio_info beu0_platform_data = {
577*4882a593Smuzhiyun .name = "BEU0",
578*4882a593Smuzhiyun .version = "0",
579*4882a593Smuzhiyun .irq = evt2irq(0x8A0),
580*4882a593Smuzhiyun };
581*4882a593Smuzhiyun
582*4882a593Smuzhiyun static struct resource beu0_resources[] = {
583*4882a593Smuzhiyun [0] = {
584*4882a593Smuzhiyun .name = "BEU0",
585*4882a593Smuzhiyun .start = 0xfe930000,
586*4882a593Smuzhiyun .end = 0xfe933400,
587*4882a593Smuzhiyun .flags = IORESOURCE_MEM,
588*4882a593Smuzhiyun },
589*4882a593Smuzhiyun [1] = {
590*4882a593Smuzhiyun /* place holder for contiguous memory */
591*4882a593Smuzhiyun },
592*4882a593Smuzhiyun };
593*4882a593Smuzhiyun
594*4882a593Smuzhiyun static struct platform_device beu0_device = {
595*4882a593Smuzhiyun .name = "uio_pdrv_genirq",
596*4882a593Smuzhiyun .id = 6,
597*4882a593Smuzhiyun .dev = {
598*4882a593Smuzhiyun .platform_data = &beu0_platform_data,
599*4882a593Smuzhiyun },
600*4882a593Smuzhiyun .resource = beu0_resources,
601*4882a593Smuzhiyun .num_resources = ARRAY_SIZE(beu0_resources),
602*4882a593Smuzhiyun };
603*4882a593Smuzhiyun
604*4882a593Smuzhiyun /* BEU1 */
605*4882a593Smuzhiyun static struct uio_info beu1_platform_data = {
606*4882a593Smuzhiyun .name = "BEU1",
607*4882a593Smuzhiyun .version = "0",
608*4882a593Smuzhiyun .irq = evt2irq(0xA00),
609*4882a593Smuzhiyun };
610*4882a593Smuzhiyun
611*4882a593Smuzhiyun static struct resource beu1_resources[] = {
612*4882a593Smuzhiyun [0] = {
613*4882a593Smuzhiyun .name = "BEU1",
614*4882a593Smuzhiyun .start = 0xfe940000,
615*4882a593Smuzhiyun .end = 0xfe943400,
616*4882a593Smuzhiyun .flags = IORESOURCE_MEM,
617*4882a593Smuzhiyun },
618*4882a593Smuzhiyun [1] = {
619*4882a593Smuzhiyun /* place holder for contiguous memory */
620*4882a593Smuzhiyun },
621*4882a593Smuzhiyun };
622*4882a593Smuzhiyun
623*4882a593Smuzhiyun static struct platform_device beu1_device = {
624*4882a593Smuzhiyun .name = "uio_pdrv_genirq",
625*4882a593Smuzhiyun .id = 7,
626*4882a593Smuzhiyun .dev = {
627*4882a593Smuzhiyun .platform_data = &beu1_platform_data,
628*4882a593Smuzhiyun },
629*4882a593Smuzhiyun .resource = beu1_resources,
630*4882a593Smuzhiyun .num_resources = ARRAY_SIZE(beu1_resources),
631*4882a593Smuzhiyun };
632*4882a593Smuzhiyun
633*4882a593Smuzhiyun static struct sh_timer_config cmt_platform_data = {
634*4882a593Smuzhiyun .channels_mask = 0x20,
635*4882a593Smuzhiyun };
636*4882a593Smuzhiyun
637*4882a593Smuzhiyun static struct resource cmt_resources[] = {
638*4882a593Smuzhiyun DEFINE_RES_MEM(0x044a0000, 0x70),
639*4882a593Smuzhiyun DEFINE_RES_IRQ(evt2irq(0xf00)),
640*4882a593Smuzhiyun };
641*4882a593Smuzhiyun
642*4882a593Smuzhiyun static struct platform_device cmt_device = {
643*4882a593Smuzhiyun .name = "sh-cmt-32",
644*4882a593Smuzhiyun .id = 0,
645*4882a593Smuzhiyun .dev = {
646*4882a593Smuzhiyun .platform_data = &cmt_platform_data,
647*4882a593Smuzhiyun },
648*4882a593Smuzhiyun .resource = cmt_resources,
649*4882a593Smuzhiyun .num_resources = ARRAY_SIZE(cmt_resources),
650*4882a593Smuzhiyun };
651*4882a593Smuzhiyun
652*4882a593Smuzhiyun static struct sh_timer_config tmu0_platform_data = {
653*4882a593Smuzhiyun .channels_mask = 7,
654*4882a593Smuzhiyun };
655*4882a593Smuzhiyun
656*4882a593Smuzhiyun static struct resource tmu0_resources[] = {
657*4882a593Smuzhiyun DEFINE_RES_MEM(0xffd80000, 0x2c),
658*4882a593Smuzhiyun DEFINE_RES_IRQ(evt2irq(0x400)),
659*4882a593Smuzhiyun DEFINE_RES_IRQ(evt2irq(0x420)),
660*4882a593Smuzhiyun DEFINE_RES_IRQ(evt2irq(0x440)),
661*4882a593Smuzhiyun };
662*4882a593Smuzhiyun
663*4882a593Smuzhiyun static struct platform_device tmu0_device = {
664*4882a593Smuzhiyun .name = "sh-tmu",
665*4882a593Smuzhiyun .id = 0,
666*4882a593Smuzhiyun .dev = {
667*4882a593Smuzhiyun .platform_data = &tmu0_platform_data,
668*4882a593Smuzhiyun },
669*4882a593Smuzhiyun .resource = tmu0_resources,
670*4882a593Smuzhiyun .num_resources = ARRAY_SIZE(tmu0_resources),
671*4882a593Smuzhiyun };
672*4882a593Smuzhiyun
673*4882a593Smuzhiyun static struct sh_timer_config tmu1_platform_data = {
674*4882a593Smuzhiyun .channels_mask = 7,
675*4882a593Smuzhiyun };
676*4882a593Smuzhiyun
677*4882a593Smuzhiyun static struct resource tmu1_resources[] = {
678*4882a593Smuzhiyun DEFINE_RES_MEM(0xffd90000, 0x2c),
679*4882a593Smuzhiyun DEFINE_RES_IRQ(evt2irq(0x920)),
680*4882a593Smuzhiyun DEFINE_RES_IRQ(evt2irq(0x940)),
681*4882a593Smuzhiyun DEFINE_RES_IRQ(evt2irq(0x960)),
682*4882a593Smuzhiyun };
683*4882a593Smuzhiyun
684*4882a593Smuzhiyun static struct platform_device tmu1_device = {
685*4882a593Smuzhiyun .name = "sh-tmu",
686*4882a593Smuzhiyun .id = 1,
687*4882a593Smuzhiyun .dev = {
688*4882a593Smuzhiyun .platform_data = &tmu1_platform_data,
689*4882a593Smuzhiyun },
690*4882a593Smuzhiyun .resource = tmu1_resources,
691*4882a593Smuzhiyun .num_resources = ARRAY_SIZE(tmu1_resources),
692*4882a593Smuzhiyun };
693*4882a593Smuzhiyun
694*4882a593Smuzhiyun /* JPU */
695*4882a593Smuzhiyun static struct uio_info jpu_platform_data = {
696*4882a593Smuzhiyun .name = "JPU",
697*4882a593Smuzhiyun .version = "0",
698*4882a593Smuzhiyun .irq = evt2irq(0x560),
699*4882a593Smuzhiyun };
700*4882a593Smuzhiyun
701*4882a593Smuzhiyun static struct resource jpu_resources[] = {
702*4882a593Smuzhiyun [0] = {
703*4882a593Smuzhiyun .name = "JPU",
704*4882a593Smuzhiyun .start = 0xfe980000,
705*4882a593Smuzhiyun .end = 0xfe9902d3,
706*4882a593Smuzhiyun .flags = IORESOURCE_MEM,
707*4882a593Smuzhiyun },
708*4882a593Smuzhiyun [1] = {
709*4882a593Smuzhiyun /* place holder for contiguous memory */
710*4882a593Smuzhiyun },
711*4882a593Smuzhiyun };
712*4882a593Smuzhiyun
713*4882a593Smuzhiyun static struct platform_device jpu_device = {
714*4882a593Smuzhiyun .name = "uio_pdrv_genirq",
715*4882a593Smuzhiyun .id = 3,
716*4882a593Smuzhiyun .dev = {
717*4882a593Smuzhiyun .platform_data = &jpu_platform_data,
718*4882a593Smuzhiyun },
719*4882a593Smuzhiyun .resource = jpu_resources,
720*4882a593Smuzhiyun .num_resources = ARRAY_SIZE(jpu_resources),
721*4882a593Smuzhiyun };
722*4882a593Smuzhiyun
723*4882a593Smuzhiyun /* SPU2DSP0 */
724*4882a593Smuzhiyun static struct uio_info spu0_platform_data = {
725*4882a593Smuzhiyun .name = "SPU2DSP0",
726*4882a593Smuzhiyun .version = "0",
727*4882a593Smuzhiyun .irq = evt2irq(0xcc0),
728*4882a593Smuzhiyun };
729*4882a593Smuzhiyun
730*4882a593Smuzhiyun static struct resource spu0_resources[] = {
731*4882a593Smuzhiyun [0] = {
732*4882a593Smuzhiyun .name = "SPU2DSP0",
733*4882a593Smuzhiyun .start = 0xFE200000,
734*4882a593Smuzhiyun .end = 0xFE2FFFFF,
735*4882a593Smuzhiyun .flags = IORESOURCE_MEM,
736*4882a593Smuzhiyun },
737*4882a593Smuzhiyun [1] = {
738*4882a593Smuzhiyun /* place holder for contiguous memory */
739*4882a593Smuzhiyun },
740*4882a593Smuzhiyun };
741*4882a593Smuzhiyun
742*4882a593Smuzhiyun static struct platform_device spu0_device = {
743*4882a593Smuzhiyun .name = "uio_pdrv_genirq",
744*4882a593Smuzhiyun .id = 4,
745*4882a593Smuzhiyun .dev = {
746*4882a593Smuzhiyun .platform_data = &spu0_platform_data,
747*4882a593Smuzhiyun },
748*4882a593Smuzhiyun .resource = spu0_resources,
749*4882a593Smuzhiyun .num_resources = ARRAY_SIZE(spu0_resources),
750*4882a593Smuzhiyun };
751*4882a593Smuzhiyun
752*4882a593Smuzhiyun /* SPU2DSP1 */
753*4882a593Smuzhiyun static struct uio_info spu1_platform_data = {
754*4882a593Smuzhiyun .name = "SPU2DSP1",
755*4882a593Smuzhiyun .version = "0",
756*4882a593Smuzhiyun .irq = evt2irq(0xce0),
757*4882a593Smuzhiyun };
758*4882a593Smuzhiyun
759*4882a593Smuzhiyun static struct resource spu1_resources[] = {
760*4882a593Smuzhiyun [0] = {
761*4882a593Smuzhiyun .name = "SPU2DSP1",
762*4882a593Smuzhiyun .start = 0xFE300000,
763*4882a593Smuzhiyun .end = 0xFE3FFFFF,
764*4882a593Smuzhiyun .flags = IORESOURCE_MEM,
765*4882a593Smuzhiyun },
766*4882a593Smuzhiyun [1] = {
767*4882a593Smuzhiyun /* place holder for contiguous memory */
768*4882a593Smuzhiyun },
769*4882a593Smuzhiyun };
770*4882a593Smuzhiyun
771*4882a593Smuzhiyun static struct platform_device spu1_device = {
772*4882a593Smuzhiyun .name = "uio_pdrv_genirq",
773*4882a593Smuzhiyun .id = 5,
774*4882a593Smuzhiyun .dev = {
775*4882a593Smuzhiyun .platform_data = &spu1_platform_data,
776*4882a593Smuzhiyun },
777*4882a593Smuzhiyun .resource = spu1_resources,
778*4882a593Smuzhiyun .num_resources = ARRAY_SIZE(spu1_resources),
779*4882a593Smuzhiyun };
780*4882a593Smuzhiyun
781*4882a593Smuzhiyun static struct platform_device *sh7724_devices[] __initdata = {
782*4882a593Smuzhiyun &scif0_device,
783*4882a593Smuzhiyun &scif1_device,
784*4882a593Smuzhiyun &scif2_device,
785*4882a593Smuzhiyun &scif3_device,
786*4882a593Smuzhiyun &scif4_device,
787*4882a593Smuzhiyun &scif5_device,
788*4882a593Smuzhiyun &cmt_device,
789*4882a593Smuzhiyun &tmu0_device,
790*4882a593Smuzhiyun &tmu1_device,
791*4882a593Smuzhiyun &dma0_device,
792*4882a593Smuzhiyun &dma1_device,
793*4882a593Smuzhiyun &rtc_device,
794*4882a593Smuzhiyun &iic0_device,
795*4882a593Smuzhiyun &iic1_device,
796*4882a593Smuzhiyun &vpu_device,
797*4882a593Smuzhiyun &veu0_device,
798*4882a593Smuzhiyun &veu1_device,
799*4882a593Smuzhiyun &beu0_device,
800*4882a593Smuzhiyun &beu1_device,
801*4882a593Smuzhiyun &jpu_device,
802*4882a593Smuzhiyun &spu0_device,
803*4882a593Smuzhiyun &spu1_device,
804*4882a593Smuzhiyun };
805*4882a593Smuzhiyun
sh7724_devices_setup(void)806*4882a593Smuzhiyun static int __init sh7724_devices_setup(void)
807*4882a593Smuzhiyun {
808*4882a593Smuzhiyun platform_resource_setup_memory(&vpu_device, "vpu", 2 << 20);
809*4882a593Smuzhiyun platform_resource_setup_memory(&veu0_device, "veu0", 2 << 20);
810*4882a593Smuzhiyun platform_resource_setup_memory(&veu1_device, "veu1", 2 << 20);
811*4882a593Smuzhiyun platform_resource_setup_memory(&jpu_device, "jpu", 2 << 20);
812*4882a593Smuzhiyun platform_resource_setup_memory(&spu0_device, "spu0", 2 << 20);
813*4882a593Smuzhiyun platform_resource_setup_memory(&spu1_device, "spu1", 2 << 20);
814*4882a593Smuzhiyun
815*4882a593Smuzhiyun return platform_add_devices(sh7724_devices,
816*4882a593Smuzhiyun ARRAY_SIZE(sh7724_devices));
817*4882a593Smuzhiyun }
818*4882a593Smuzhiyun arch_initcall(sh7724_devices_setup);
819*4882a593Smuzhiyun
820*4882a593Smuzhiyun static struct platform_device *sh7724_early_devices[] __initdata = {
821*4882a593Smuzhiyun &scif0_device,
822*4882a593Smuzhiyun &scif1_device,
823*4882a593Smuzhiyun &scif2_device,
824*4882a593Smuzhiyun &scif3_device,
825*4882a593Smuzhiyun &scif4_device,
826*4882a593Smuzhiyun &scif5_device,
827*4882a593Smuzhiyun &cmt_device,
828*4882a593Smuzhiyun &tmu0_device,
829*4882a593Smuzhiyun &tmu1_device,
830*4882a593Smuzhiyun };
831*4882a593Smuzhiyun
plat_early_device_setup(void)832*4882a593Smuzhiyun void __init plat_early_device_setup(void)
833*4882a593Smuzhiyun {
834*4882a593Smuzhiyun sh_early_platform_add_devices(sh7724_early_devices,
835*4882a593Smuzhiyun ARRAY_SIZE(sh7724_early_devices));
836*4882a593Smuzhiyun }
837*4882a593Smuzhiyun
838*4882a593Smuzhiyun #define RAMCR_CACHE_L2FC 0x0002
839*4882a593Smuzhiyun #define RAMCR_CACHE_L2E 0x0001
840*4882a593Smuzhiyun #define L2_CACHE_ENABLE (RAMCR_CACHE_L2E|RAMCR_CACHE_L2FC)
841*4882a593Smuzhiyun
l2_cache_init(void)842*4882a593Smuzhiyun void l2_cache_init(void)
843*4882a593Smuzhiyun {
844*4882a593Smuzhiyun /* Enable L2 cache */
845*4882a593Smuzhiyun __raw_writel(L2_CACHE_ENABLE, RAMCR);
846*4882a593Smuzhiyun }
847*4882a593Smuzhiyun
848*4882a593Smuzhiyun enum {
849*4882a593Smuzhiyun UNUSED = 0,
850*4882a593Smuzhiyun ENABLED,
851*4882a593Smuzhiyun DISABLED,
852*4882a593Smuzhiyun
853*4882a593Smuzhiyun /* interrupt sources */
854*4882a593Smuzhiyun IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7,
855*4882a593Smuzhiyun HUDI,
856*4882a593Smuzhiyun DMAC1A_DEI0, DMAC1A_DEI1, DMAC1A_DEI2, DMAC1A_DEI3,
857*4882a593Smuzhiyun _2DG_TRI, _2DG_INI, _2DG_CEI,
858*4882a593Smuzhiyun DMAC0A_DEI0, DMAC0A_DEI1, DMAC0A_DEI2, DMAC0A_DEI3,
859*4882a593Smuzhiyun VIO_CEU0, VIO_BEU0, VIO_VEU1, VIO_VOU,
860*4882a593Smuzhiyun SCIFA3,
861*4882a593Smuzhiyun VPU,
862*4882a593Smuzhiyun TPU,
863*4882a593Smuzhiyun CEU1,
864*4882a593Smuzhiyun BEU1,
865*4882a593Smuzhiyun USB0, USB1,
866*4882a593Smuzhiyun ATAPI,
867*4882a593Smuzhiyun RTC_ATI, RTC_PRI, RTC_CUI,
868*4882a593Smuzhiyun DMAC1B_DEI4, DMAC1B_DEI5, DMAC1B_DADERR,
869*4882a593Smuzhiyun DMAC0B_DEI4, DMAC0B_DEI5, DMAC0B_DADERR,
870*4882a593Smuzhiyun KEYSC,
871*4882a593Smuzhiyun SCIF_SCIF0, SCIF_SCIF1, SCIF_SCIF2,
872*4882a593Smuzhiyun VEU0,
873*4882a593Smuzhiyun MSIOF_MSIOFI0, MSIOF_MSIOFI1,
874*4882a593Smuzhiyun SPU_SPUI0, SPU_SPUI1,
875*4882a593Smuzhiyun SCIFA4,
876*4882a593Smuzhiyun ICB,
877*4882a593Smuzhiyun ETHI,
878*4882a593Smuzhiyun I2C1_ALI, I2C1_TACKI, I2C1_WAITI, I2C1_DTEI,
879*4882a593Smuzhiyun I2C0_ALI, I2C0_TACKI, I2C0_WAITI, I2C0_DTEI,
880*4882a593Smuzhiyun CMT,
881*4882a593Smuzhiyun TSIF,
882*4882a593Smuzhiyun FSI,
883*4882a593Smuzhiyun SCIFA5,
884*4882a593Smuzhiyun TMU0_TUNI0, TMU0_TUNI1, TMU0_TUNI2,
885*4882a593Smuzhiyun IRDA,
886*4882a593Smuzhiyun JPU,
887*4882a593Smuzhiyun _2DDMAC,
888*4882a593Smuzhiyun MMC_MMC2I, MMC_MMC3I,
889*4882a593Smuzhiyun LCDC,
890*4882a593Smuzhiyun TMU1_TUNI0, TMU1_TUNI1, TMU1_TUNI2,
891*4882a593Smuzhiyun
892*4882a593Smuzhiyun /* interrupt groups */
893*4882a593Smuzhiyun DMAC1A, _2DG, DMAC0A, VIO, USB, RTC,
894*4882a593Smuzhiyun DMAC1B, DMAC0B, I2C0, I2C1, SDHI0, SDHI1, SPU, MMCIF,
895*4882a593Smuzhiyun };
896*4882a593Smuzhiyun
897*4882a593Smuzhiyun static struct intc_vect vectors[] __initdata = {
898*4882a593Smuzhiyun INTC_VECT(IRQ0, 0x600), INTC_VECT(IRQ1, 0x620),
899*4882a593Smuzhiyun INTC_VECT(IRQ2, 0x640), INTC_VECT(IRQ3, 0x660),
900*4882a593Smuzhiyun INTC_VECT(IRQ4, 0x680), INTC_VECT(IRQ5, 0x6a0),
901*4882a593Smuzhiyun INTC_VECT(IRQ6, 0x6c0), INTC_VECT(IRQ7, 0x6e0),
902*4882a593Smuzhiyun
903*4882a593Smuzhiyun INTC_VECT(DMAC1A_DEI0, 0x700),
904*4882a593Smuzhiyun INTC_VECT(DMAC1A_DEI1, 0x720),
905*4882a593Smuzhiyun INTC_VECT(DMAC1A_DEI2, 0x740),
906*4882a593Smuzhiyun INTC_VECT(DMAC1A_DEI3, 0x760),
907*4882a593Smuzhiyun
908*4882a593Smuzhiyun INTC_VECT(_2DG_TRI, 0x780),
909*4882a593Smuzhiyun INTC_VECT(_2DG_INI, 0x7A0),
910*4882a593Smuzhiyun INTC_VECT(_2DG_CEI, 0x7C0),
911*4882a593Smuzhiyun
912*4882a593Smuzhiyun INTC_VECT(DMAC0A_DEI0, 0x800),
913*4882a593Smuzhiyun INTC_VECT(DMAC0A_DEI1, 0x820),
914*4882a593Smuzhiyun INTC_VECT(DMAC0A_DEI2, 0x840),
915*4882a593Smuzhiyun INTC_VECT(DMAC0A_DEI3, 0x860),
916*4882a593Smuzhiyun
917*4882a593Smuzhiyun INTC_VECT(VIO_CEU0, 0x880),
918*4882a593Smuzhiyun INTC_VECT(VIO_BEU0, 0x8A0),
919*4882a593Smuzhiyun INTC_VECT(VIO_VEU1, 0x8C0),
920*4882a593Smuzhiyun INTC_VECT(VIO_VOU, 0x8E0),
921*4882a593Smuzhiyun
922*4882a593Smuzhiyun INTC_VECT(SCIFA3, 0x900),
923*4882a593Smuzhiyun INTC_VECT(VPU, 0x980),
924*4882a593Smuzhiyun INTC_VECT(TPU, 0x9A0),
925*4882a593Smuzhiyun INTC_VECT(CEU1, 0x9E0),
926*4882a593Smuzhiyun INTC_VECT(BEU1, 0xA00),
927*4882a593Smuzhiyun INTC_VECT(USB0, 0xA20),
928*4882a593Smuzhiyun INTC_VECT(USB1, 0xA40),
929*4882a593Smuzhiyun INTC_VECT(ATAPI, 0xA60),
930*4882a593Smuzhiyun
931*4882a593Smuzhiyun INTC_VECT(RTC_ATI, 0xA80),
932*4882a593Smuzhiyun INTC_VECT(RTC_PRI, 0xAA0),
933*4882a593Smuzhiyun INTC_VECT(RTC_CUI, 0xAC0),
934*4882a593Smuzhiyun
935*4882a593Smuzhiyun INTC_VECT(DMAC1B_DEI4, 0xB00),
936*4882a593Smuzhiyun INTC_VECT(DMAC1B_DEI5, 0xB20),
937*4882a593Smuzhiyun INTC_VECT(DMAC1B_DADERR, 0xB40),
938*4882a593Smuzhiyun
939*4882a593Smuzhiyun INTC_VECT(DMAC0B_DEI4, 0xB80),
940*4882a593Smuzhiyun INTC_VECT(DMAC0B_DEI5, 0xBA0),
941*4882a593Smuzhiyun INTC_VECT(DMAC0B_DADERR, 0xBC0),
942*4882a593Smuzhiyun
943*4882a593Smuzhiyun INTC_VECT(KEYSC, 0xBE0),
944*4882a593Smuzhiyun INTC_VECT(SCIF_SCIF0, 0xC00),
945*4882a593Smuzhiyun INTC_VECT(SCIF_SCIF1, 0xC20),
946*4882a593Smuzhiyun INTC_VECT(SCIF_SCIF2, 0xC40),
947*4882a593Smuzhiyun INTC_VECT(VEU0, 0xC60),
948*4882a593Smuzhiyun INTC_VECT(MSIOF_MSIOFI0, 0xC80),
949*4882a593Smuzhiyun INTC_VECT(MSIOF_MSIOFI1, 0xCA0),
950*4882a593Smuzhiyun INTC_VECT(SPU_SPUI0, 0xCC0),
951*4882a593Smuzhiyun INTC_VECT(SPU_SPUI1, 0xCE0),
952*4882a593Smuzhiyun INTC_VECT(SCIFA4, 0xD00),
953*4882a593Smuzhiyun
954*4882a593Smuzhiyun INTC_VECT(ICB, 0xD20),
955*4882a593Smuzhiyun INTC_VECT(ETHI, 0xD60),
956*4882a593Smuzhiyun
957*4882a593Smuzhiyun INTC_VECT(I2C1_ALI, 0xD80),
958*4882a593Smuzhiyun INTC_VECT(I2C1_TACKI, 0xDA0),
959*4882a593Smuzhiyun INTC_VECT(I2C1_WAITI, 0xDC0),
960*4882a593Smuzhiyun INTC_VECT(I2C1_DTEI, 0xDE0),
961*4882a593Smuzhiyun
962*4882a593Smuzhiyun INTC_VECT(I2C0_ALI, 0xE00),
963*4882a593Smuzhiyun INTC_VECT(I2C0_TACKI, 0xE20),
964*4882a593Smuzhiyun INTC_VECT(I2C0_WAITI, 0xE40),
965*4882a593Smuzhiyun INTC_VECT(I2C0_DTEI, 0xE60),
966*4882a593Smuzhiyun
967*4882a593Smuzhiyun INTC_VECT(SDHI0, 0xE80),
968*4882a593Smuzhiyun INTC_VECT(SDHI0, 0xEA0),
969*4882a593Smuzhiyun INTC_VECT(SDHI0, 0xEC0),
970*4882a593Smuzhiyun INTC_VECT(SDHI0, 0xEE0),
971*4882a593Smuzhiyun
972*4882a593Smuzhiyun INTC_VECT(CMT, 0xF00),
973*4882a593Smuzhiyun INTC_VECT(TSIF, 0xF20),
974*4882a593Smuzhiyun INTC_VECT(FSI, 0xF80),
975*4882a593Smuzhiyun INTC_VECT(SCIFA5, 0xFA0),
976*4882a593Smuzhiyun
977*4882a593Smuzhiyun INTC_VECT(TMU0_TUNI0, 0x400),
978*4882a593Smuzhiyun INTC_VECT(TMU0_TUNI1, 0x420),
979*4882a593Smuzhiyun INTC_VECT(TMU0_TUNI2, 0x440),
980*4882a593Smuzhiyun
981*4882a593Smuzhiyun INTC_VECT(IRDA, 0x480),
982*4882a593Smuzhiyun
983*4882a593Smuzhiyun INTC_VECT(SDHI1, 0x4E0),
984*4882a593Smuzhiyun INTC_VECT(SDHI1, 0x500),
985*4882a593Smuzhiyun INTC_VECT(SDHI1, 0x520),
986*4882a593Smuzhiyun
987*4882a593Smuzhiyun INTC_VECT(JPU, 0x560),
988*4882a593Smuzhiyun INTC_VECT(_2DDMAC, 0x4A0),
989*4882a593Smuzhiyun
990*4882a593Smuzhiyun INTC_VECT(MMC_MMC2I, 0x5A0),
991*4882a593Smuzhiyun INTC_VECT(MMC_MMC3I, 0x5C0),
992*4882a593Smuzhiyun
993*4882a593Smuzhiyun INTC_VECT(LCDC, 0xF40),
994*4882a593Smuzhiyun
995*4882a593Smuzhiyun INTC_VECT(TMU1_TUNI0, 0x920),
996*4882a593Smuzhiyun INTC_VECT(TMU1_TUNI1, 0x940),
997*4882a593Smuzhiyun INTC_VECT(TMU1_TUNI2, 0x960),
998*4882a593Smuzhiyun };
999*4882a593Smuzhiyun
1000*4882a593Smuzhiyun static struct intc_group groups[] __initdata = {
1001*4882a593Smuzhiyun INTC_GROUP(DMAC1A, DMAC1A_DEI0, DMAC1A_DEI1, DMAC1A_DEI2, DMAC1A_DEI3),
1002*4882a593Smuzhiyun INTC_GROUP(_2DG, _2DG_TRI, _2DG_INI, _2DG_CEI),
1003*4882a593Smuzhiyun INTC_GROUP(DMAC0A, DMAC0A_DEI0, DMAC0A_DEI1, DMAC0A_DEI2, DMAC0A_DEI3),
1004*4882a593Smuzhiyun INTC_GROUP(VIO, VIO_CEU0, VIO_BEU0, VIO_VEU1, VIO_VOU),
1005*4882a593Smuzhiyun INTC_GROUP(USB, USB0, USB1),
1006*4882a593Smuzhiyun INTC_GROUP(RTC, RTC_ATI, RTC_PRI, RTC_CUI),
1007*4882a593Smuzhiyun INTC_GROUP(DMAC1B, DMAC1B_DEI4, DMAC1B_DEI5, DMAC1B_DADERR),
1008*4882a593Smuzhiyun INTC_GROUP(DMAC0B, DMAC0B_DEI4, DMAC0B_DEI5, DMAC0B_DADERR),
1009*4882a593Smuzhiyun INTC_GROUP(I2C0, I2C0_ALI, I2C0_TACKI, I2C0_WAITI, I2C0_DTEI),
1010*4882a593Smuzhiyun INTC_GROUP(I2C1, I2C1_ALI, I2C1_TACKI, I2C1_WAITI, I2C1_DTEI),
1011*4882a593Smuzhiyun INTC_GROUP(SPU, SPU_SPUI0, SPU_SPUI1),
1012*4882a593Smuzhiyun INTC_GROUP(MMCIF, MMC_MMC2I, MMC_MMC3I),
1013*4882a593Smuzhiyun };
1014*4882a593Smuzhiyun
1015*4882a593Smuzhiyun static struct intc_mask_reg mask_registers[] __initdata = {
1016*4882a593Smuzhiyun { 0xa4080080, 0xa40800c0, 8, /* IMR0 / IMCR0 */
1017*4882a593Smuzhiyun { 0, TMU1_TUNI2, TMU1_TUNI1, TMU1_TUNI0,
1018*4882a593Smuzhiyun 0, ENABLED, ENABLED, ENABLED } },
1019*4882a593Smuzhiyun { 0xa4080084, 0xa40800c4, 8, /* IMR1 / IMCR1 */
1020*4882a593Smuzhiyun { VIO_VOU, VIO_VEU1, VIO_BEU0, VIO_CEU0,
1021*4882a593Smuzhiyun DMAC0A_DEI3, DMAC0A_DEI2, DMAC0A_DEI1, DMAC0A_DEI0 } },
1022*4882a593Smuzhiyun { 0xa4080088, 0xa40800c8, 8, /* IMR2 / IMCR2 */
1023*4882a593Smuzhiyun { 0, 0, 0, VPU, ATAPI, ETHI, 0, SCIFA3 } },
1024*4882a593Smuzhiyun { 0xa408008c, 0xa40800cc, 8, /* IMR3 / IMCR3 */
1025*4882a593Smuzhiyun { DMAC1A_DEI3, DMAC1A_DEI2, DMAC1A_DEI1, DMAC1A_DEI0,
1026*4882a593Smuzhiyun SPU_SPUI1, SPU_SPUI0, BEU1, IRDA } },
1027*4882a593Smuzhiyun { 0xa4080090, 0xa40800d0, 8, /* IMR4 / IMCR4 */
1028*4882a593Smuzhiyun { 0, TMU0_TUNI2, TMU0_TUNI1, TMU0_TUNI0,
1029*4882a593Smuzhiyun JPU, 0, 0, LCDC } },
1030*4882a593Smuzhiyun { 0xa4080094, 0xa40800d4, 8, /* IMR5 / IMCR5 */
1031*4882a593Smuzhiyun { KEYSC, DMAC0B_DADERR, DMAC0B_DEI5, DMAC0B_DEI4,
1032*4882a593Smuzhiyun VEU0, SCIF_SCIF2, SCIF_SCIF1, SCIF_SCIF0 } },
1033*4882a593Smuzhiyun { 0xa4080098, 0xa40800d8, 8, /* IMR6 / IMCR6 */
1034*4882a593Smuzhiyun { 0, 0, ICB, SCIFA4,
1035*4882a593Smuzhiyun CEU1, 0, MSIOF_MSIOFI1, MSIOF_MSIOFI0 } },
1036*4882a593Smuzhiyun { 0xa408009c, 0xa40800dc, 8, /* IMR7 / IMCR7 */
1037*4882a593Smuzhiyun { I2C0_DTEI, I2C0_WAITI, I2C0_TACKI, I2C0_ALI,
1038*4882a593Smuzhiyun I2C1_DTEI, I2C1_WAITI, I2C1_TACKI, I2C1_ALI } },
1039*4882a593Smuzhiyun { 0xa40800a0, 0xa40800e0, 8, /* IMR8 / IMCR8 */
1040*4882a593Smuzhiyun { DISABLED, ENABLED, ENABLED, ENABLED,
1041*4882a593Smuzhiyun 0, 0, SCIFA5, FSI } },
1042*4882a593Smuzhiyun { 0xa40800a4, 0xa40800e4, 8, /* IMR9 / IMCR9 */
1043*4882a593Smuzhiyun { 0, 0, 0, CMT, 0, USB1, USB0, 0 } },
1044*4882a593Smuzhiyun { 0xa40800a8, 0xa40800e8, 8, /* IMR10 / IMCR10 */
1045*4882a593Smuzhiyun { 0, DMAC1B_DADERR, DMAC1B_DEI5, DMAC1B_DEI4,
1046*4882a593Smuzhiyun 0, RTC_CUI, RTC_PRI, RTC_ATI } },
1047*4882a593Smuzhiyun { 0xa40800ac, 0xa40800ec, 8, /* IMR11 / IMCR11 */
1048*4882a593Smuzhiyun { 0, _2DG_CEI, _2DG_INI, _2DG_TRI,
1049*4882a593Smuzhiyun 0, TPU, 0, TSIF } },
1050*4882a593Smuzhiyun { 0xa40800b0, 0xa40800f0, 8, /* IMR12 / IMCR12 */
1051*4882a593Smuzhiyun { 0, 0, MMC_MMC3I, MMC_MMC2I, 0, 0, 0, _2DDMAC } },
1052*4882a593Smuzhiyun { 0xa4140044, 0xa4140064, 8, /* INTMSK00 / INTMSKCLR00 */
1053*4882a593Smuzhiyun { IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7 } },
1054*4882a593Smuzhiyun };
1055*4882a593Smuzhiyun
1056*4882a593Smuzhiyun static struct intc_prio_reg prio_registers[] __initdata = {
1057*4882a593Smuzhiyun { 0xa4080000, 0, 16, 4, /* IPRA */ { TMU0_TUNI0, TMU0_TUNI1,
1058*4882a593Smuzhiyun TMU0_TUNI2, IRDA } },
1059*4882a593Smuzhiyun { 0xa4080004, 0, 16, 4, /* IPRB */ { JPU, LCDC, DMAC1A, BEU1 } },
1060*4882a593Smuzhiyun { 0xa4080008, 0, 16, 4, /* IPRC */ { TMU1_TUNI0, TMU1_TUNI1,
1061*4882a593Smuzhiyun TMU1_TUNI2, SPU } },
1062*4882a593Smuzhiyun { 0xa408000c, 0, 16, 4, /* IPRD */ { 0, MMCIF, 0, ATAPI } },
1063*4882a593Smuzhiyun { 0xa4080010, 0, 16, 4, /* IPRE */ { DMAC0A, VIO, SCIFA3, VPU } },
1064*4882a593Smuzhiyun { 0xa4080014, 0, 16, 4, /* IPRF */ { KEYSC, DMAC0B, USB, CMT } },
1065*4882a593Smuzhiyun { 0xa4080018, 0, 16, 4, /* IPRG */ { SCIF_SCIF0, SCIF_SCIF1,
1066*4882a593Smuzhiyun SCIF_SCIF2, VEU0 } },
1067*4882a593Smuzhiyun { 0xa408001c, 0, 16, 4, /* IPRH */ { MSIOF_MSIOFI0, MSIOF_MSIOFI1,
1068*4882a593Smuzhiyun I2C1, I2C0 } },
1069*4882a593Smuzhiyun { 0xa4080020, 0, 16, 4, /* IPRI */ { SCIFA4, ICB, TSIF, _2DG } },
1070*4882a593Smuzhiyun { 0xa4080024, 0, 16, 4, /* IPRJ */ { CEU1, ETHI, FSI, SDHI1 } },
1071*4882a593Smuzhiyun { 0xa4080028, 0, 16, 4, /* IPRK */ { RTC, DMAC1B, 0, SDHI0 } },
1072*4882a593Smuzhiyun { 0xa408002c, 0, 16, 4, /* IPRL */ { SCIFA5, 0, TPU, _2DDMAC } },
1073*4882a593Smuzhiyun { 0xa4140010, 0, 32, 4, /* INTPRI00 */
1074*4882a593Smuzhiyun { IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7 } },
1075*4882a593Smuzhiyun };
1076*4882a593Smuzhiyun
1077*4882a593Smuzhiyun static struct intc_sense_reg sense_registers[] __initdata = {
1078*4882a593Smuzhiyun { 0xa414001c, 16, 2, /* ICR1 */
1079*4882a593Smuzhiyun { IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7 } },
1080*4882a593Smuzhiyun };
1081*4882a593Smuzhiyun
1082*4882a593Smuzhiyun static struct intc_mask_reg ack_registers[] __initdata = {
1083*4882a593Smuzhiyun { 0xa4140024, 0, 8, /* INTREQ00 */
1084*4882a593Smuzhiyun { IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7 } },
1085*4882a593Smuzhiyun };
1086*4882a593Smuzhiyun
1087*4882a593Smuzhiyun static struct intc_desc intc_desc __initdata = {
1088*4882a593Smuzhiyun .name = "sh7724",
1089*4882a593Smuzhiyun .force_enable = ENABLED,
1090*4882a593Smuzhiyun .force_disable = DISABLED,
1091*4882a593Smuzhiyun .hw = INTC_HW_DESC(vectors, groups, mask_registers,
1092*4882a593Smuzhiyun prio_registers, sense_registers, ack_registers),
1093*4882a593Smuzhiyun };
1094*4882a593Smuzhiyun
plat_irq_setup(void)1095*4882a593Smuzhiyun void __init plat_irq_setup(void)
1096*4882a593Smuzhiyun {
1097*4882a593Smuzhiyun register_intc_controller(&intc_desc);
1098*4882a593Smuzhiyun }
1099*4882a593Smuzhiyun
1100*4882a593Smuzhiyun static struct {
1101*4882a593Smuzhiyun /* BSC */
1102*4882a593Smuzhiyun unsigned long mmselr;
1103*4882a593Smuzhiyun unsigned long cs0bcr;
1104*4882a593Smuzhiyun unsigned long cs4bcr;
1105*4882a593Smuzhiyun unsigned long cs5abcr;
1106*4882a593Smuzhiyun unsigned long cs5bbcr;
1107*4882a593Smuzhiyun unsigned long cs6abcr;
1108*4882a593Smuzhiyun unsigned long cs6bbcr;
1109*4882a593Smuzhiyun unsigned long cs4wcr;
1110*4882a593Smuzhiyun unsigned long cs5awcr;
1111*4882a593Smuzhiyun unsigned long cs5bwcr;
1112*4882a593Smuzhiyun unsigned long cs6awcr;
1113*4882a593Smuzhiyun unsigned long cs6bwcr;
1114*4882a593Smuzhiyun /* INTC */
1115*4882a593Smuzhiyun unsigned short ipra;
1116*4882a593Smuzhiyun unsigned short iprb;
1117*4882a593Smuzhiyun unsigned short iprc;
1118*4882a593Smuzhiyun unsigned short iprd;
1119*4882a593Smuzhiyun unsigned short ipre;
1120*4882a593Smuzhiyun unsigned short iprf;
1121*4882a593Smuzhiyun unsigned short iprg;
1122*4882a593Smuzhiyun unsigned short iprh;
1123*4882a593Smuzhiyun unsigned short ipri;
1124*4882a593Smuzhiyun unsigned short iprj;
1125*4882a593Smuzhiyun unsigned short iprk;
1126*4882a593Smuzhiyun unsigned short iprl;
1127*4882a593Smuzhiyun unsigned char imr0;
1128*4882a593Smuzhiyun unsigned char imr1;
1129*4882a593Smuzhiyun unsigned char imr2;
1130*4882a593Smuzhiyun unsigned char imr3;
1131*4882a593Smuzhiyun unsigned char imr4;
1132*4882a593Smuzhiyun unsigned char imr5;
1133*4882a593Smuzhiyun unsigned char imr6;
1134*4882a593Smuzhiyun unsigned char imr7;
1135*4882a593Smuzhiyun unsigned char imr8;
1136*4882a593Smuzhiyun unsigned char imr9;
1137*4882a593Smuzhiyun unsigned char imr10;
1138*4882a593Smuzhiyun unsigned char imr11;
1139*4882a593Smuzhiyun unsigned char imr12;
1140*4882a593Smuzhiyun /* RWDT */
1141*4882a593Smuzhiyun unsigned short rwtcnt;
1142*4882a593Smuzhiyun unsigned short rwtcsr;
1143*4882a593Smuzhiyun /* CPG */
1144*4882a593Smuzhiyun unsigned long irdaclk;
1145*4882a593Smuzhiyun unsigned long spuclk;
1146*4882a593Smuzhiyun } sh7724_rstandby_state;
1147*4882a593Smuzhiyun
sh7724_pre_sleep_notifier_call(struct notifier_block * nb,unsigned long flags,void * unused)1148*4882a593Smuzhiyun static int sh7724_pre_sleep_notifier_call(struct notifier_block *nb,
1149*4882a593Smuzhiyun unsigned long flags, void *unused)
1150*4882a593Smuzhiyun {
1151*4882a593Smuzhiyun if (!(flags & SUSP_SH_RSTANDBY))
1152*4882a593Smuzhiyun return NOTIFY_DONE;
1153*4882a593Smuzhiyun
1154*4882a593Smuzhiyun /* BCR */
1155*4882a593Smuzhiyun sh7724_rstandby_state.mmselr = __raw_readl(0xff800020); /* MMSELR */
1156*4882a593Smuzhiyun sh7724_rstandby_state.mmselr |= 0xa5a50000;
1157*4882a593Smuzhiyun sh7724_rstandby_state.cs0bcr = __raw_readl(0xfec10004); /* CS0BCR */
1158*4882a593Smuzhiyun sh7724_rstandby_state.cs4bcr = __raw_readl(0xfec10010); /* CS4BCR */
1159*4882a593Smuzhiyun sh7724_rstandby_state.cs5abcr = __raw_readl(0xfec10014); /* CS5ABCR */
1160*4882a593Smuzhiyun sh7724_rstandby_state.cs5bbcr = __raw_readl(0xfec10018); /* CS5BBCR */
1161*4882a593Smuzhiyun sh7724_rstandby_state.cs6abcr = __raw_readl(0xfec1001c); /* CS6ABCR */
1162*4882a593Smuzhiyun sh7724_rstandby_state.cs6bbcr = __raw_readl(0xfec10020); /* CS6BBCR */
1163*4882a593Smuzhiyun sh7724_rstandby_state.cs4wcr = __raw_readl(0xfec10030); /* CS4WCR */
1164*4882a593Smuzhiyun sh7724_rstandby_state.cs5awcr = __raw_readl(0xfec10034); /* CS5AWCR */
1165*4882a593Smuzhiyun sh7724_rstandby_state.cs5bwcr = __raw_readl(0xfec10038); /* CS5BWCR */
1166*4882a593Smuzhiyun sh7724_rstandby_state.cs6awcr = __raw_readl(0xfec1003c); /* CS6AWCR */
1167*4882a593Smuzhiyun sh7724_rstandby_state.cs6bwcr = __raw_readl(0xfec10040); /* CS6BWCR */
1168*4882a593Smuzhiyun
1169*4882a593Smuzhiyun /* INTC */
1170*4882a593Smuzhiyun sh7724_rstandby_state.ipra = __raw_readw(0xa4080000); /* IPRA */
1171*4882a593Smuzhiyun sh7724_rstandby_state.iprb = __raw_readw(0xa4080004); /* IPRB */
1172*4882a593Smuzhiyun sh7724_rstandby_state.iprc = __raw_readw(0xa4080008); /* IPRC */
1173*4882a593Smuzhiyun sh7724_rstandby_state.iprd = __raw_readw(0xa408000c); /* IPRD */
1174*4882a593Smuzhiyun sh7724_rstandby_state.ipre = __raw_readw(0xa4080010); /* IPRE */
1175*4882a593Smuzhiyun sh7724_rstandby_state.iprf = __raw_readw(0xa4080014); /* IPRF */
1176*4882a593Smuzhiyun sh7724_rstandby_state.iprg = __raw_readw(0xa4080018); /* IPRG */
1177*4882a593Smuzhiyun sh7724_rstandby_state.iprh = __raw_readw(0xa408001c); /* IPRH */
1178*4882a593Smuzhiyun sh7724_rstandby_state.ipri = __raw_readw(0xa4080020); /* IPRI */
1179*4882a593Smuzhiyun sh7724_rstandby_state.iprj = __raw_readw(0xa4080024); /* IPRJ */
1180*4882a593Smuzhiyun sh7724_rstandby_state.iprk = __raw_readw(0xa4080028); /* IPRK */
1181*4882a593Smuzhiyun sh7724_rstandby_state.iprl = __raw_readw(0xa408002c); /* IPRL */
1182*4882a593Smuzhiyun sh7724_rstandby_state.imr0 = __raw_readb(0xa4080080); /* IMR0 */
1183*4882a593Smuzhiyun sh7724_rstandby_state.imr1 = __raw_readb(0xa4080084); /* IMR1 */
1184*4882a593Smuzhiyun sh7724_rstandby_state.imr2 = __raw_readb(0xa4080088); /* IMR2 */
1185*4882a593Smuzhiyun sh7724_rstandby_state.imr3 = __raw_readb(0xa408008c); /* IMR3 */
1186*4882a593Smuzhiyun sh7724_rstandby_state.imr4 = __raw_readb(0xa4080090); /* IMR4 */
1187*4882a593Smuzhiyun sh7724_rstandby_state.imr5 = __raw_readb(0xa4080094); /* IMR5 */
1188*4882a593Smuzhiyun sh7724_rstandby_state.imr6 = __raw_readb(0xa4080098); /* IMR6 */
1189*4882a593Smuzhiyun sh7724_rstandby_state.imr7 = __raw_readb(0xa408009c); /* IMR7 */
1190*4882a593Smuzhiyun sh7724_rstandby_state.imr8 = __raw_readb(0xa40800a0); /* IMR8 */
1191*4882a593Smuzhiyun sh7724_rstandby_state.imr9 = __raw_readb(0xa40800a4); /* IMR9 */
1192*4882a593Smuzhiyun sh7724_rstandby_state.imr10 = __raw_readb(0xa40800a8); /* IMR10 */
1193*4882a593Smuzhiyun sh7724_rstandby_state.imr11 = __raw_readb(0xa40800ac); /* IMR11 */
1194*4882a593Smuzhiyun sh7724_rstandby_state.imr12 = __raw_readb(0xa40800b0); /* IMR12 */
1195*4882a593Smuzhiyun
1196*4882a593Smuzhiyun /* RWDT */
1197*4882a593Smuzhiyun sh7724_rstandby_state.rwtcnt = __raw_readb(0xa4520000); /* RWTCNT */
1198*4882a593Smuzhiyun sh7724_rstandby_state.rwtcnt |= 0x5a00;
1199*4882a593Smuzhiyun sh7724_rstandby_state.rwtcsr = __raw_readb(0xa4520004); /* RWTCSR */
1200*4882a593Smuzhiyun sh7724_rstandby_state.rwtcsr |= 0xa500;
1201*4882a593Smuzhiyun __raw_writew(sh7724_rstandby_state.rwtcsr & 0x07, 0xa4520004);
1202*4882a593Smuzhiyun
1203*4882a593Smuzhiyun /* CPG */
1204*4882a593Smuzhiyun sh7724_rstandby_state.irdaclk = __raw_readl(0xa4150018); /* IRDACLKCR */
1205*4882a593Smuzhiyun sh7724_rstandby_state.spuclk = __raw_readl(0xa415003c); /* SPUCLKCR */
1206*4882a593Smuzhiyun
1207*4882a593Smuzhiyun return NOTIFY_DONE;
1208*4882a593Smuzhiyun }
1209*4882a593Smuzhiyun
sh7724_post_sleep_notifier_call(struct notifier_block * nb,unsigned long flags,void * unused)1210*4882a593Smuzhiyun static int sh7724_post_sleep_notifier_call(struct notifier_block *nb,
1211*4882a593Smuzhiyun unsigned long flags, void *unused)
1212*4882a593Smuzhiyun {
1213*4882a593Smuzhiyun if (!(flags & SUSP_SH_RSTANDBY))
1214*4882a593Smuzhiyun return NOTIFY_DONE;
1215*4882a593Smuzhiyun
1216*4882a593Smuzhiyun /* BCR */
1217*4882a593Smuzhiyun __raw_writel(sh7724_rstandby_state.mmselr, 0xff800020); /* MMSELR */
1218*4882a593Smuzhiyun __raw_writel(sh7724_rstandby_state.cs0bcr, 0xfec10004); /* CS0BCR */
1219*4882a593Smuzhiyun __raw_writel(sh7724_rstandby_state.cs4bcr, 0xfec10010); /* CS4BCR */
1220*4882a593Smuzhiyun __raw_writel(sh7724_rstandby_state.cs5abcr, 0xfec10014); /* CS5ABCR */
1221*4882a593Smuzhiyun __raw_writel(sh7724_rstandby_state.cs5bbcr, 0xfec10018); /* CS5BBCR */
1222*4882a593Smuzhiyun __raw_writel(sh7724_rstandby_state.cs6abcr, 0xfec1001c); /* CS6ABCR */
1223*4882a593Smuzhiyun __raw_writel(sh7724_rstandby_state.cs6bbcr, 0xfec10020); /* CS6BBCR */
1224*4882a593Smuzhiyun __raw_writel(sh7724_rstandby_state.cs4wcr, 0xfec10030); /* CS4WCR */
1225*4882a593Smuzhiyun __raw_writel(sh7724_rstandby_state.cs5awcr, 0xfec10034); /* CS5AWCR */
1226*4882a593Smuzhiyun __raw_writel(sh7724_rstandby_state.cs5bwcr, 0xfec10038); /* CS5BWCR */
1227*4882a593Smuzhiyun __raw_writel(sh7724_rstandby_state.cs6awcr, 0xfec1003c); /* CS6AWCR */
1228*4882a593Smuzhiyun __raw_writel(sh7724_rstandby_state.cs6bwcr, 0xfec10040); /* CS6BWCR */
1229*4882a593Smuzhiyun
1230*4882a593Smuzhiyun /* INTC */
1231*4882a593Smuzhiyun __raw_writew(sh7724_rstandby_state.ipra, 0xa4080000); /* IPRA */
1232*4882a593Smuzhiyun __raw_writew(sh7724_rstandby_state.iprb, 0xa4080004); /* IPRB */
1233*4882a593Smuzhiyun __raw_writew(sh7724_rstandby_state.iprc, 0xa4080008); /* IPRC */
1234*4882a593Smuzhiyun __raw_writew(sh7724_rstandby_state.iprd, 0xa408000c); /* IPRD */
1235*4882a593Smuzhiyun __raw_writew(sh7724_rstandby_state.ipre, 0xa4080010); /* IPRE */
1236*4882a593Smuzhiyun __raw_writew(sh7724_rstandby_state.iprf, 0xa4080014); /* IPRF */
1237*4882a593Smuzhiyun __raw_writew(sh7724_rstandby_state.iprg, 0xa4080018); /* IPRG */
1238*4882a593Smuzhiyun __raw_writew(sh7724_rstandby_state.iprh, 0xa408001c); /* IPRH */
1239*4882a593Smuzhiyun __raw_writew(sh7724_rstandby_state.ipri, 0xa4080020); /* IPRI */
1240*4882a593Smuzhiyun __raw_writew(sh7724_rstandby_state.iprj, 0xa4080024); /* IPRJ */
1241*4882a593Smuzhiyun __raw_writew(sh7724_rstandby_state.iprk, 0xa4080028); /* IPRK */
1242*4882a593Smuzhiyun __raw_writew(sh7724_rstandby_state.iprl, 0xa408002c); /* IPRL */
1243*4882a593Smuzhiyun __raw_writeb(sh7724_rstandby_state.imr0, 0xa4080080); /* IMR0 */
1244*4882a593Smuzhiyun __raw_writeb(sh7724_rstandby_state.imr1, 0xa4080084); /* IMR1 */
1245*4882a593Smuzhiyun __raw_writeb(sh7724_rstandby_state.imr2, 0xa4080088); /* IMR2 */
1246*4882a593Smuzhiyun __raw_writeb(sh7724_rstandby_state.imr3, 0xa408008c); /* IMR3 */
1247*4882a593Smuzhiyun __raw_writeb(sh7724_rstandby_state.imr4, 0xa4080090); /* IMR4 */
1248*4882a593Smuzhiyun __raw_writeb(sh7724_rstandby_state.imr5, 0xa4080094); /* IMR5 */
1249*4882a593Smuzhiyun __raw_writeb(sh7724_rstandby_state.imr6, 0xa4080098); /* IMR6 */
1250*4882a593Smuzhiyun __raw_writeb(sh7724_rstandby_state.imr7, 0xa408009c); /* IMR7 */
1251*4882a593Smuzhiyun __raw_writeb(sh7724_rstandby_state.imr8, 0xa40800a0); /* IMR8 */
1252*4882a593Smuzhiyun __raw_writeb(sh7724_rstandby_state.imr9, 0xa40800a4); /* IMR9 */
1253*4882a593Smuzhiyun __raw_writeb(sh7724_rstandby_state.imr10, 0xa40800a8); /* IMR10 */
1254*4882a593Smuzhiyun __raw_writeb(sh7724_rstandby_state.imr11, 0xa40800ac); /* IMR11 */
1255*4882a593Smuzhiyun __raw_writeb(sh7724_rstandby_state.imr12, 0xa40800b0); /* IMR12 */
1256*4882a593Smuzhiyun
1257*4882a593Smuzhiyun /* RWDT */
1258*4882a593Smuzhiyun __raw_writew(sh7724_rstandby_state.rwtcnt, 0xa4520000); /* RWTCNT */
1259*4882a593Smuzhiyun __raw_writew(sh7724_rstandby_state.rwtcsr, 0xa4520004); /* RWTCSR */
1260*4882a593Smuzhiyun
1261*4882a593Smuzhiyun /* CPG */
1262*4882a593Smuzhiyun __raw_writel(sh7724_rstandby_state.irdaclk, 0xa4150018); /* IRDACLKCR */
1263*4882a593Smuzhiyun __raw_writel(sh7724_rstandby_state.spuclk, 0xa415003c); /* SPUCLKCR */
1264*4882a593Smuzhiyun
1265*4882a593Smuzhiyun return NOTIFY_DONE;
1266*4882a593Smuzhiyun }
1267*4882a593Smuzhiyun
1268*4882a593Smuzhiyun static struct notifier_block sh7724_pre_sleep_notifier = {
1269*4882a593Smuzhiyun .notifier_call = sh7724_pre_sleep_notifier_call,
1270*4882a593Smuzhiyun .priority = SH_MOBILE_PRE(SH_MOBILE_SLEEP_CPU),
1271*4882a593Smuzhiyun };
1272*4882a593Smuzhiyun
1273*4882a593Smuzhiyun static struct notifier_block sh7724_post_sleep_notifier = {
1274*4882a593Smuzhiyun .notifier_call = sh7724_post_sleep_notifier_call,
1275*4882a593Smuzhiyun .priority = SH_MOBILE_POST(SH_MOBILE_SLEEP_CPU),
1276*4882a593Smuzhiyun };
1277*4882a593Smuzhiyun
sh7724_sleep_setup(void)1278*4882a593Smuzhiyun static int __init sh7724_sleep_setup(void)
1279*4882a593Smuzhiyun {
1280*4882a593Smuzhiyun atomic_notifier_chain_register(&sh_mobile_pre_sleep_notifier_list,
1281*4882a593Smuzhiyun &sh7724_pre_sleep_notifier);
1282*4882a593Smuzhiyun
1283*4882a593Smuzhiyun atomic_notifier_chain_register(&sh_mobile_post_sleep_notifier_list,
1284*4882a593Smuzhiyun &sh7724_post_sleep_notifier);
1285*4882a593Smuzhiyun return 0;
1286*4882a593Smuzhiyun }
1287*4882a593Smuzhiyun arch_initcall(sh7724_sleep_setup);
1288*4882a593Smuzhiyun
1289