xref: /OK3568_Linux_fs/kernel/arch/sh/kernel/cpu/sh4a/setup-sh7724.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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