xref: /OK3568_Linux_fs/kernel/arch/sh/boards/mach-se/7724/setup.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * linux/arch/sh/boards/se/7724/setup.c
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (C) 2009 Renesas Solutions Corp.
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * Kuninori Morimoto <morimoto.kuninori@renesas.com>
8*4882a593Smuzhiyun  */
9*4882a593Smuzhiyun #include <asm/clock.h>
10*4882a593Smuzhiyun #include <asm/heartbeat.h>
11*4882a593Smuzhiyun #include <asm/io.h>
12*4882a593Smuzhiyun #include <asm/suspend.h>
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #include <cpu/sh7724.h>
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun #include <linux/delay.h>
17*4882a593Smuzhiyun #include <linux/device.h>
18*4882a593Smuzhiyun #include <linux/gpio.h>
19*4882a593Smuzhiyun #include <linux/init.h>
20*4882a593Smuzhiyun #include <linux/input.h>
21*4882a593Smuzhiyun #include <linux/input/sh_keysc.h>
22*4882a593Smuzhiyun #include <linux/interrupt.h>
23*4882a593Smuzhiyun #include <linux/memblock.h>
24*4882a593Smuzhiyun #include <linux/mfd/tmio.h>
25*4882a593Smuzhiyun #include <linux/mmc/host.h>
26*4882a593Smuzhiyun #include <linux/mtd/physmap.h>
27*4882a593Smuzhiyun #include <linux/platform_device.h>
28*4882a593Smuzhiyun #include <linux/regulator/fixed.h>
29*4882a593Smuzhiyun #include <linux/regulator/machine.h>
30*4882a593Smuzhiyun #include <linux/sh_eth.h>
31*4882a593Smuzhiyun #include <linux/sh_intc.h>
32*4882a593Smuzhiyun #include <linux/smc91x.h>
33*4882a593Smuzhiyun #include <linux/usb/r8a66597.h>
34*4882a593Smuzhiyun #include <linux/videodev2.h>
35*4882a593Smuzhiyun #include <linux/dma-map-ops.h>
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun #include <mach-se/mach/se7724.h>
38*4882a593Smuzhiyun #include <media/drv-intf/renesas-ceu.h>
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun #include <sound/sh_fsi.h>
41*4882a593Smuzhiyun #include <sound/simple_card.h>
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun #include <video/sh_mobile_lcdc.h>
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun #define CEU_BUFFER_MEMORY_SIZE		(4 << 20)
46*4882a593Smuzhiyun static phys_addr_t ceu0_dma_membase;
47*4882a593Smuzhiyun static phys_addr_t ceu1_dma_membase;
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun /*
50*4882a593Smuzhiyun  * SWx    1234 5678
51*4882a593Smuzhiyun  * ------------------------------------
52*4882a593Smuzhiyun  * SW31 : 1001 1100    : default
53*4882a593Smuzhiyun  * SW32 : 0111 1111    : use on board flash
54*4882a593Smuzhiyun  *
55*4882a593Smuzhiyun  * SW41 : abxx xxxx  -> a = 0 : Analog  monitor
56*4882a593Smuzhiyun  *                          1 : Digital monitor
57*4882a593Smuzhiyun  *                      b = 0 : VGA
58*4882a593Smuzhiyun  *                          1 : 720p
59*4882a593Smuzhiyun  */
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun /*
62*4882a593Smuzhiyun  * about 720p
63*4882a593Smuzhiyun  *
64*4882a593Smuzhiyun  * When you use 1280 x 720 lcdc output,
65*4882a593Smuzhiyun  * you should change OSC6 lcdc clock from 25.175MHz to 74.25MHz,
66*4882a593Smuzhiyun  * and change SW41 to use 720p
67*4882a593Smuzhiyun  */
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun /*
70*4882a593Smuzhiyun  * about sound
71*4882a593Smuzhiyun  *
72*4882a593Smuzhiyun  * This setup.c supports FSI slave mode.
73*4882a593Smuzhiyun  * Please change J20, J21, J22 pin to 1-2 connection.
74*4882a593Smuzhiyun  */
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun /* Heartbeat */
77*4882a593Smuzhiyun static struct resource heartbeat_resource = {
78*4882a593Smuzhiyun 	.start  = PA_LED,
79*4882a593Smuzhiyun 	.end    = PA_LED,
80*4882a593Smuzhiyun 	.flags  = IORESOURCE_MEM | IORESOURCE_MEM_16BIT,
81*4882a593Smuzhiyun };
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun static struct platform_device heartbeat_device = {
84*4882a593Smuzhiyun 	.name           = "heartbeat",
85*4882a593Smuzhiyun 	.id             = -1,
86*4882a593Smuzhiyun 	.num_resources  = 1,
87*4882a593Smuzhiyun 	.resource       = &heartbeat_resource,
88*4882a593Smuzhiyun };
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun /* LAN91C111 */
91*4882a593Smuzhiyun static struct smc91x_platdata smc91x_info = {
92*4882a593Smuzhiyun 	.flags = SMC91X_USE_16BIT | SMC91X_NOWAIT,
93*4882a593Smuzhiyun };
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun static struct resource smc91x_eth_resources[] = {
96*4882a593Smuzhiyun 	[0] = {
97*4882a593Smuzhiyun 		.name   = "SMC91C111" ,
98*4882a593Smuzhiyun 		.start  = 0x1a300300,
99*4882a593Smuzhiyun 		.end    = 0x1a30030f,
100*4882a593Smuzhiyun 		.flags  = IORESOURCE_MEM,
101*4882a593Smuzhiyun 	},
102*4882a593Smuzhiyun 	[1] = {
103*4882a593Smuzhiyun 		.start  = IRQ0_SMC,
104*4882a593Smuzhiyun 		.flags  = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
105*4882a593Smuzhiyun 	},
106*4882a593Smuzhiyun };
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun static struct platform_device smc91x_eth_device = {
109*4882a593Smuzhiyun 	.name	= "smc91x",
110*4882a593Smuzhiyun 	.num_resources  = ARRAY_SIZE(smc91x_eth_resources),
111*4882a593Smuzhiyun 	.resource       = smc91x_eth_resources,
112*4882a593Smuzhiyun 	.dev	= {
113*4882a593Smuzhiyun 		.platform_data	= &smc91x_info,
114*4882a593Smuzhiyun 	},
115*4882a593Smuzhiyun };
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun /* MTD */
118*4882a593Smuzhiyun static struct mtd_partition nor_flash_partitions[] = {
119*4882a593Smuzhiyun 	{
120*4882a593Smuzhiyun 		.name = "uboot",
121*4882a593Smuzhiyun 		.offset = 0,
122*4882a593Smuzhiyun 		.size = (1 * 1024 * 1024),
123*4882a593Smuzhiyun 		.mask_flags = MTD_WRITEABLE,	/* Read-only */
124*4882a593Smuzhiyun 	}, {
125*4882a593Smuzhiyun 		.name = "kernel",
126*4882a593Smuzhiyun 		.offset = MTDPART_OFS_APPEND,
127*4882a593Smuzhiyun 		.size = (2 * 1024 * 1024),
128*4882a593Smuzhiyun 	}, {
129*4882a593Smuzhiyun 		.name = "free-area",
130*4882a593Smuzhiyun 		.offset = MTDPART_OFS_APPEND,
131*4882a593Smuzhiyun 		.size = MTDPART_SIZ_FULL,
132*4882a593Smuzhiyun 	},
133*4882a593Smuzhiyun };
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun static struct physmap_flash_data nor_flash_data = {
136*4882a593Smuzhiyun 	.width		= 2,
137*4882a593Smuzhiyun 	.parts		= nor_flash_partitions,
138*4882a593Smuzhiyun 	.nr_parts	= ARRAY_SIZE(nor_flash_partitions),
139*4882a593Smuzhiyun };
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun static struct resource nor_flash_resources[] = {
142*4882a593Smuzhiyun 	[0] = {
143*4882a593Smuzhiyun 		.name	= "NOR Flash",
144*4882a593Smuzhiyun 		.start	= 0x00000000,
145*4882a593Smuzhiyun 		.end	= 0x01ffffff,
146*4882a593Smuzhiyun 		.flags	= IORESOURCE_MEM,
147*4882a593Smuzhiyun 	}
148*4882a593Smuzhiyun };
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun static struct platform_device nor_flash_device = {
151*4882a593Smuzhiyun 	.name		= "physmap-flash",
152*4882a593Smuzhiyun 	.resource	= nor_flash_resources,
153*4882a593Smuzhiyun 	.num_resources	= ARRAY_SIZE(nor_flash_resources),
154*4882a593Smuzhiyun 	.dev		= {
155*4882a593Smuzhiyun 		.platform_data = &nor_flash_data,
156*4882a593Smuzhiyun 	},
157*4882a593Smuzhiyun };
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun /* LCDC */
160*4882a593Smuzhiyun static const struct fb_videomode lcdc_720p_modes[] = {
161*4882a593Smuzhiyun 	{
162*4882a593Smuzhiyun 		.name		= "LB070WV1",
163*4882a593Smuzhiyun 		.sync		= 0, /* hsync and vsync are active low */
164*4882a593Smuzhiyun 		.xres		= 1280,
165*4882a593Smuzhiyun 		.yres		= 720,
166*4882a593Smuzhiyun 		.left_margin	= 220,
167*4882a593Smuzhiyun 		.right_margin	= 110,
168*4882a593Smuzhiyun 		.hsync_len	= 40,
169*4882a593Smuzhiyun 		.upper_margin	= 20,
170*4882a593Smuzhiyun 		.lower_margin	= 5,
171*4882a593Smuzhiyun 		.vsync_len	= 5,
172*4882a593Smuzhiyun 	},
173*4882a593Smuzhiyun };
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun static const struct fb_videomode lcdc_vga_modes[] = {
176*4882a593Smuzhiyun 	{
177*4882a593Smuzhiyun 		.name		= "LB070WV1",
178*4882a593Smuzhiyun 		.sync		= 0, /* hsync and vsync are active low */
179*4882a593Smuzhiyun 		.xres		= 640,
180*4882a593Smuzhiyun 		.yres		= 480,
181*4882a593Smuzhiyun 		.left_margin	= 105,
182*4882a593Smuzhiyun 		.right_margin	= 50,
183*4882a593Smuzhiyun 		.hsync_len	= 96,
184*4882a593Smuzhiyun 		.upper_margin	= 33,
185*4882a593Smuzhiyun 		.lower_margin	= 10,
186*4882a593Smuzhiyun 		.vsync_len	= 2,
187*4882a593Smuzhiyun 	},
188*4882a593Smuzhiyun };
189*4882a593Smuzhiyun 
190*4882a593Smuzhiyun static struct sh_mobile_lcdc_info lcdc_info = {
191*4882a593Smuzhiyun 	.clock_source = LCDC_CLK_EXTERNAL,
192*4882a593Smuzhiyun 	.ch[0] = {
193*4882a593Smuzhiyun 		.chan = LCDC_CHAN_MAINLCD,
194*4882a593Smuzhiyun 		.fourcc = V4L2_PIX_FMT_RGB565,
195*4882a593Smuzhiyun 		.clock_divider = 1,
196*4882a593Smuzhiyun 		.panel_cfg = { /* 7.0 inch */
197*4882a593Smuzhiyun 			.width = 152,
198*4882a593Smuzhiyun 			.height = 91,
199*4882a593Smuzhiyun 		},
200*4882a593Smuzhiyun 	}
201*4882a593Smuzhiyun };
202*4882a593Smuzhiyun 
203*4882a593Smuzhiyun static struct resource lcdc_resources[] = {
204*4882a593Smuzhiyun 	[0] = {
205*4882a593Smuzhiyun 		.name	= "LCDC",
206*4882a593Smuzhiyun 		.start	= 0xfe940000,
207*4882a593Smuzhiyun 		.end	= 0xfe942fff,
208*4882a593Smuzhiyun 		.flags	= IORESOURCE_MEM,
209*4882a593Smuzhiyun 	},
210*4882a593Smuzhiyun 	[1] = {
211*4882a593Smuzhiyun 		.start	= evt2irq(0xf40),
212*4882a593Smuzhiyun 		.flags	= IORESOURCE_IRQ,
213*4882a593Smuzhiyun 	},
214*4882a593Smuzhiyun };
215*4882a593Smuzhiyun 
216*4882a593Smuzhiyun static struct platform_device lcdc_device = {
217*4882a593Smuzhiyun 	.name		= "sh_mobile_lcdc_fb",
218*4882a593Smuzhiyun 	.num_resources	= ARRAY_SIZE(lcdc_resources),
219*4882a593Smuzhiyun 	.resource	= lcdc_resources,
220*4882a593Smuzhiyun 	.dev		= {
221*4882a593Smuzhiyun 		.platform_data	= &lcdc_info,
222*4882a593Smuzhiyun 	},
223*4882a593Smuzhiyun };
224*4882a593Smuzhiyun 
225*4882a593Smuzhiyun /* CEU0 */
226*4882a593Smuzhiyun static struct ceu_platform_data ceu0_pdata = {
227*4882a593Smuzhiyun 	.num_subdevs = 0,
228*4882a593Smuzhiyun };
229*4882a593Smuzhiyun 
230*4882a593Smuzhiyun static struct resource ceu0_resources[] = {
231*4882a593Smuzhiyun 	[0] = {
232*4882a593Smuzhiyun 		.name	= "CEU0",
233*4882a593Smuzhiyun 		.start	= 0xfe910000,
234*4882a593Smuzhiyun 		.end	= 0xfe91009f,
235*4882a593Smuzhiyun 		.flags	= IORESOURCE_MEM,
236*4882a593Smuzhiyun 	},
237*4882a593Smuzhiyun 	[1] = {
238*4882a593Smuzhiyun 		.start  = evt2irq(0x880),
239*4882a593Smuzhiyun 		.flags  = IORESOURCE_IRQ,
240*4882a593Smuzhiyun 	},
241*4882a593Smuzhiyun };
242*4882a593Smuzhiyun 
243*4882a593Smuzhiyun static struct platform_device ceu0_device = {
244*4882a593Smuzhiyun 	.name		= "renesas-ceu",
245*4882a593Smuzhiyun 	.id             = 0, /* "ceu.0" clock */
246*4882a593Smuzhiyun 	.num_resources	= ARRAY_SIZE(ceu0_resources),
247*4882a593Smuzhiyun 	.resource	= ceu0_resources,
248*4882a593Smuzhiyun 	.dev	= {
249*4882a593Smuzhiyun 		.platform_data	= &ceu0_pdata,
250*4882a593Smuzhiyun 	},
251*4882a593Smuzhiyun };
252*4882a593Smuzhiyun 
253*4882a593Smuzhiyun /* CEU1 */
254*4882a593Smuzhiyun static struct ceu_platform_data ceu1_pdata = {
255*4882a593Smuzhiyun 	.num_subdevs = 0,
256*4882a593Smuzhiyun };
257*4882a593Smuzhiyun 
258*4882a593Smuzhiyun static struct resource ceu1_resources[] = {
259*4882a593Smuzhiyun 	[0] = {
260*4882a593Smuzhiyun 		.name	= "CEU1",
261*4882a593Smuzhiyun 		.start	= 0xfe914000,
262*4882a593Smuzhiyun 		.end	= 0xfe91409f,
263*4882a593Smuzhiyun 		.flags	= IORESOURCE_MEM,
264*4882a593Smuzhiyun 	},
265*4882a593Smuzhiyun 	[1] = {
266*4882a593Smuzhiyun 		.start  = evt2irq(0x9e0),
267*4882a593Smuzhiyun 		.flags  = IORESOURCE_IRQ,
268*4882a593Smuzhiyun 	},
269*4882a593Smuzhiyun };
270*4882a593Smuzhiyun 
271*4882a593Smuzhiyun static struct platform_device ceu1_device = {
272*4882a593Smuzhiyun 	.name		= "renesas-ceu",
273*4882a593Smuzhiyun 	.id             = 1, /* "ceu.1" clock */
274*4882a593Smuzhiyun 	.num_resources	= ARRAY_SIZE(ceu1_resources),
275*4882a593Smuzhiyun 	.resource	= ceu1_resources,
276*4882a593Smuzhiyun 	.dev	= {
277*4882a593Smuzhiyun 		.platform_data	= &ceu1_pdata,
278*4882a593Smuzhiyun 	},
279*4882a593Smuzhiyun };
280*4882a593Smuzhiyun 
281*4882a593Smuzhiyun /* FSI */
282*4882a593Smuzhiyun /* change J20, J21, J22 pin to 1-2 connection to use slave mode */
283*4882a593Smuzhiyun static struct resource fsi_resources[] = {
284*4882a593Smuzhiyun 	[0] = {
285*4882a593Smuzhiyun 		.name	= "FSI",
286*4882a593Smuzhiyun 		.start	= 0xFE3C0000,
287*4882a593Smuzhiyun 		.end	= 0xFE3C021d,
288*4882a593Smuzhiyun 		.flags	= IORESOURCE_MEM,
289*4882a593Smuzhiyun 	},
290*4882a593Smuzhiyun 	[1] = {
291*4882a593Smuzhiyun 		.start  = evt2irq(0xf80),
292*4882a593Smuzhiyun 		.flags  = IORESOURCE_IRQ,
293*4882a593Smuzhiyun 	},
294*4882a593Smuzhiyun };
295*4882a593Smuzhiyun 
296*4882a593Smuzhiyun static struct platform_device fsi_device = {
297*4882a593Smuzhiyun 	.name		= "sh_fsi",
298*4882a593Smuzhiyun 	.id		= 0,
299*4882a593Smuzhiyun 	.num_resources	= ARRAY_SIZE(fsi_resources),
300*4882a593Smuzhiyun 	.resource	= fsi_resources,
301*4882a593Smuzhiyun };
302*4882a593Smuzhiyun 
303*4882a593Smuzhiyun static struct asoc_simple_card_info fsi_ak4642_info = {
304*4882a593Smuzhiyun 	.name		= "AK4642",
305*4882a593Smuzhiyun 	.card		= "FSIA-AK4642",
306*4882a593Smuzhiyun 	.codec		= "ak4642-codec.0-0012",
307*4882a593Smuzhiyun 	.platform	= "sh_fsi.0",
308*4882a593Smuzhiyun 	.daifmt		= SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_CBM_CFM,
309*4882a593Smuzhiyun 	.cpu_dai = {
310*4882a593Smuzhiyun 		.name	= "fsia-dai",
311*4882a593Smuzhiyun 	},
312*4882a593Smuzhiyun 	.codec_dai = {
313*4882a593Smuzhiyun 		.name	= "ak4642-hifi",
314*4882a593Smuzhiyun 		.sysclk	= 11289600,
315*4882a593Smuzhiyun 	},
316*4882a593Smuzhiyun };
317*4882a593Smuzhiyun 
318*4882a593Smuzhiyun static struct platform_device fsi_ak4642_device = {
319*4882a593Smuzhiyun 	.name	= "asoc-simple-card",
320*4882a593Smuzhiyun 	.dev	= {
321*4882a593Smuzhiyun 		.platform_data	= &fsi_ak4642_info,
322*4882a593Smuzhiyun 	},
323*4882a593Smuzhiyun };
324*4882a593Smuzhiyun 
325*4882a593Smuzhiyun /* KEYSC in SoC (Needs SW33-2 set to ON) */
326*4882a593Smuzhiyun static struct sh_keysc_info keysc_info = {
327*4882a593Smuzhiyun 	.mode = SH_KEYSC_MODE_1,
328*4882a593Smuzhiyun 	.scan_timing = 3,
329*4882a593Smuzhiyun 	.delay = 50,
330*4882a593Smuzhiyun 	.keycodes = {
331*4882a593Smuzhiyun 		KEY_1, KEY_2, KEY_3, KEY_4, KEY_5,
332*4882a593Smuzhiyun 		KEY_6, KEY_7, KEY_8, KEY_9, KEY_A,
333*4882a593Smuzhiyun 		KEY_B, KEY_C, KEY_D, KEY_E, KEY_F,
334*4882a593Smuzhiyun 		KEY_G, KEY_H, KEY_I, KEY_K, KEY_L,
335*4882a593Smuzhiyun 		KEY_M, KEY_N, KEY_O, KEY_P, KEY_Q,
336*4882a593Smuzhiyun 		KEY_R, KEY_S, KEY_T, KEY_U, KEY_V,
337*4882a593Smuzhiyun 	},
338*4882a593Smuzhiyun };
339*4882a593Smuzhiyun 
340*4882a593Smuzhiyun static struct resource keysc_resources[] = {
341*4882a593Smuzhiyun 	[0] = {
342*4882a593Smuzhiyun 		.name	= "KEYSC",
343*4882a593Smuzhiyun 		.start  = 0x044b0000,
344*4882a593Smuzhiyun 		.end    = 0x044b000f,
345*4882a593Smuzhiyun 		.flags  = IORESOURCE_MEM,
346*4882a593Smuzhiyun 	},
347*4882a593Smuzhiyun 	[1] = {
348*4882a593Smuzhiyun 		.start  = evt2irq(0xbe0),
349*4882a593Smuzhiyun 		.flags  = IORESOURCE_IRQ,
350*4882a593Smuzhiyun 	},
351*4882a593Smuzhiyun };
352*4882a593Smuzhiyun 
353*4882a593Smuzhiyun static struct platform_device keysc_device = {
354*4882a593Smuzhiyun 	.name           = "sh_keysc",
355*4882a593Smuzhiyun 	.id             = 0, /* "keysc0" clock */
356*4882a593Smuzhiyun 	.num_resources  = ARRAY_SIZE(keysc_resources),
357*4882a593Smuzhiyun 	.resource       = keysc_resources,
358*4882a593Smuzhiyun 	.dev	= {
359*4882a593Smuzhiyun 		.platform_data	= &keysc_info,
360*4882a593Smuzhiyun 	},
361*4882a593Smuzhiyun };
362*4882a593Smuzhiyun 
363*4882a593Smuzhiyun /* SH Eth */
364*4882a593Smuzhiyun static struct resource sh_eth_resources[] = {
365*4882a593Smuzhiyun 	[0] = {
366*4882a593Smuzhiyun 		.start = SH_ETH_ADDR,
367*4882a593Smuzhiyun 		.end   = SH_ETH_ADDR + 0x1FC - 1,
368*4882a593Smuzhiyun 		.flags = IORESOURCE_MEM,
369*4882a593Smuzhiyun 	},
370*4882a593Smuzhiyun 	[1] = {
371*4882a593Smuzhiyun 		.start = evt2irq(0xd60),
372*4882a593Smuzhiyun 		.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
373*4882a593Smuzhiyun 	},
374*4882a593Smuzhiyun };
375*4882a593Smuzhiyun 
376*4882a593Smuzhiyun static struct sh_eth_plat_data sh_eth_plat = {
377*4882a593Smuzhiyun 	.phy = 0x1f, /* SMSC LAN8187 */
378*4882a593Smuzhiyun 	.phy_interface = PHY_INTERFACE_MODE_MII,
379*4882a593Smuzhiyun };
380*4882a593Smuzhiyun 
381*4882a593Smuzhiyun static struct platform_device sh_eth_device = {
382*4882a593Smuzhiyun 	.name = "sh7724-ether",
383*4882a593Smuzhiyun 	.id = 0,
384*4882a593Smuzhiyun 	.dev = {
385*4882a593Smuzhiyun 		.platform_data = &sh_eth_plat,
386*4882a593Smuzhiyun 	},
387*4882a593Smuzhiyun 	.num_resources = ARRAY_SIZE(sh_eth_resources),
388*4882a593Smuzhiyun 	.resource = sh_eth_resources,
389*4882a593Smuzhiyun };
390*4882a593Smuzhiyun 
391*4882a593Smuzhiyun static struct r8a66597_platdata sh7724_usb0_host_data = {
392*4882a593Smuzhiyun 	.on_chip = 1,
393*4882a593Smuzhiyun };
394*4882a593Smuzhiyun 
395*4882a593Smuzhiyun static struct resource sh7724_usb0_host_resources[] = {
396*4882a593Smuzhiyun 	[0] = {
397*4882a593Smuzhiyun 		.start	= 0xa4d80000,
398*4882a593Smuzhiyun 		.end	= 0xa4d80124 - 1,
399*4882a593Smuzhiyun 		.flags	= IORESOURCE_MEM,
400*4882a593Smuzhiyun 	},
401*4882a593Smuzhiyun 	[1] = {
402*4882a593Smuzhiyun 		.start	= evt2irq(0xa20),
403*4882a593Smuzhiyun 		.end	= evt2irq(0xa20),
404*4882a593Smuzhiyun 		.flags	= IORESOURCE_IRQ | IRQF_TRIGGER_LOW,
405*4882a593Smuzhiyun 	},
406*4882a593Smuzhiyun };
407*4882a593Smuzhiyun 
408*4882a593Smuzhiyun static struct platform_device sh7724_usb0_host_device = {
409*4882a593Smuzhiyun 	.name		= "r8a66597_hcd",
410*4882a593Smuzhiyun 	.id		= 0,
411*4882a593Smuzhiyun 	.dev = {
412*4882a593Smuzhiyun 		.dma_mask		= NULL,         /*  not use dma */
413*4882a593Smuzhiyun 		.coherent_dma_mask	= 0xffffffff,
414*4882a593Smuzhiyun 		.platform_data		= &sh7724_usb0_host_data,
415*4882a593Smuzhiyun 	},
416*4882a593Smuzhiyun 	.num_resources	= ARRAY_SIZE(sh7724_usb0_host_resources),
417*4882a593Smuzhiyun 	.resource	= sh7724_usb0_host_resources,
418*4882a593Smuzhiyun };
419*4882a593Smuzhiyun 
420*4882a593Smuzhiyun static struct r8a66597_platdata sh7724_usb1_gadget_data = {
421*4882a593Smuzhiyun 	.on_chip = 1,
422*4882a593Smuzhiyun };
423*4882a593Smuzhiyun 
424*4882a593Smuzhiyun static struct resource sh7724_usb1_gadget_resources[] = {
425*4882a593Smuzhiyun 	[0] = {
426*4882a593Smuzhiyun 		.start	= 0xa4d90000,
427*4882a593Smuzhiyun 		.end	= 0xa4d90123,
428*4882a593Smuzhiyun 		.flags	= IORESOURCE_MEM,
429*4882a593Smuzhiyun 	},
430*4882a593Smuzhiyun 	[1] = {
431*4882a593Smuzhiyun 		.start	= evt2irq(0xa40),
432*4882a593Smuzhiyun 		.end	= evt2irq(0xa40),
433*4882a593Smuzhiyun 		.flags	= IORESOURCE_IRQ | IRQF_TRIGGER_LOW,
434*4882a593Smuzhiyun 	},
435*4882a593Smuzhiyun };
436*4882a593Smuzhiyun 
437*4882a593Smuzhiyun static struct platform_device sh7724_usb1_gadget_device = {
438*4882a593Smuzhiyun 	.name		= "r8a66597_udc",
439*4882a593Smuzhiyun 	.id		= 1, /* USB1 */
440*4882a593Smuzhiyun 	.dev = {
441*4882a593Smuzhiyun 		.dma_mask		= NULL,         /*  not use dma */
442*4882a593Smuzhiyun 		.coherent_dma_mask	= 0xffffffff,
443*4882a593Smuzhiyun 		.platform_data		= &sh7724_usb1_gadget_data,
444*4882a593Smuzhiyun 	},
445*4882a593Smuzhiyun 	.num_resources	= ARRAY_SIZE(sh7724_usb1_gadget_resources),
446*4882a593Smuzhiyun 	.resource	= sh7724_usb1_gadget_resources,
447*4882a593Smuzhiyun };
448*4882a593Smuzhiyun 
449*4882a593Smuzhiyun /* Fixed 3.3V regulator to be used by SDHI0, SDHI1 */
450*4882a593Smuzhiyun static struct regulator_consumer_supply fixed3v3_power_consumers[] =
451*4882a593Smuzhiyun {
452*4882a593Smuzhiyun 	REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.0"),
453*4882a593Smuzhiyun 	REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.0"),
454*4882a593Smuzhiyun 	REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.1"),
455*4882a593Smuzhiyun 	REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.1"),
456*4882a593Smuzhiyun };
457*4882a593Smuzhiyun 
458*4882a593Smuzhiyun static struct resource sdhi0_cn7_resources[] = {
459*4882a593Smuzhiyun 	[0] = {
460*4882a593Smuzhiyun 		.name	= "SDHI0",
461*4882a593Smuzhiyun 		.start  = 0x04ce0000,
462*4882a593Smuzhiyun 		.end    = 0x04ce00ff,
463*4882a593Smuzhiyun 		.flags  = IORESOURCE_MEM,
464*4882a593Smuzhiyun 	},
465*4882a593Smuzhiyun 	[1] = {
466*4882a593Smuzhiyun 		.start  = evt2irq(0xe80),
467*4882a593Smuzhiyun 		.flags  = IORESOURCE_IRQ,
468*4882a593Smuzhiyun 	},
469*4882a593Smuzhiyun };
470*4882a593Smuzhiyun 
471*4882a593Smuzhiyun static struct tmio_mmc_data sh7724_sdhi0_data = {
472*4882a593Smuzhiyun 	.chan_priv_tx	= (void *)SHDMA_SLAVE_SDHI0_TX,
473*4882a593Smuzhiyun 	.chan_priv_rx	= (void *)SHDMA_SLAVE_SDHI0_RX,
474*4882a593Smuzhiyun 	.capabilities	= MMC_CAP_SDIO_IRQ,
475*4882a593Smuzhiyun };
476*4882a593Smuzhiyun 
477*4882a593Smuzhiyun static struct platform_device sdhi0_cn7_device = {
478*4882a593Smuzhiyun 	.name           = "sh_mobile_sdhi",
479*4882a593Smuzhiyun 	.id		= 0,
480*4882a593Smuzhiyun 	.num_resources  = ARRAY_SIZE(sdhi0_cn7_resources),
481*4882a593Smuzhiyun 	.resource       = sdhi0_cn7_resources,
482*4882a593Smuzhiyun 	.dev = {
483*4882a593Smuzhiyun 		.platform_data	= &sh7724_sdhi0_data,
484*4882a593Smuzhiyun 	},
485*4882a593Smuzhiyun };
486*4882a593Smuzhiyun 
487*4882a593Smuzhiyun static struct resource sdhi1_cn8_resources[] = {
488*4882a593Smuzhiyun 	[0] = {
489*4882a593Smuzhiyun 		.name	= "SDHI1",
490*4882a593Smuzhiyun 		.start  = 0x04cf0000,
491*4882a593Smuzhiyun 		.end    = 0x04cf00ff,
492*4882a593Smuzhiyun 		.flags  = IORESOURCE_MEM,
493*4882a593Smuzhiyun 	},
494*4882a593Smuzhiyun 	[1] = {
495*4882a593Smuzhiyun 		.start  = evt2irq(0x4e0),
496*4882a593Smuzhiyun 		.flags  = IORESOURCE_IRQ,
497*4882a593Smuzhiyun 	},
498*4882a593Smuzhiyun };
499*4882a593Smuzhiyun 
500*4882a593Smuzhiyun static struct tmio_mmc_data sh7724_sdhi1_data = {
501*4882a593Smuzhiyun 	.chan_priv_tx	= (void *)SHDMA_SLAVE_SDHI1_TX,
502*4882a593Smuzhiyun 	.chan_priv_rx	= (void *)SHDMA_SLAVE_SDHI1_RX,
503*4882a593Smuzhiyun 	.capabilities	= MMC_CAP_SDIO_IRQ,
504*4882a593Smuzhiyun };
505*4882a593Smuzhiyun 
506*4882a593Smuzhiyun static struct platform_device sdhi1_cn8_device = {
507*4882a593Smuzhiyun 	.name           = "sh_mobile_sdhi",
508*4882a593Smuzhiyun 	.id		= 1,
509*4882a593Smuzhiyun 	.num_resources  = ARRAY_SIZE(sdhi1_cn8_resources),
510*4882a593Smuzhiyun 	.resource       = sdhi1_cn8_resources,
511*4882a593Smuzhiyun 	.dev = {
512*4882a593Smuzhiyun 		.platform_data	= &sh7724_sdhi1_data,
513*4882a593Smuzhiyun 	},
514*4882a593Smuzhiyun };
515*4882a593Smuzhiyun 
516*4882a593Smuzhiyun /* IrDA */
517*4882a593Smuzhiyun static struct resource irda_resources[] = {
518*4882a593Smuzhiyun 	[0] = {
519*4882a593Smuzhiyun 		.name	= "IrDA",
520*4882a593Smuzhiyun 		.start  = 0xA45D0000,
521*4882a593Smuzhiyun 		.end    = 0xA45D0049,
522*4882a593Smuzhiyun 		.flags  = IORESOURCE_MEM,
523*4882a593Smuzhiyun 	},
524*4882a593Smuzhiyun 	[1] = {
525*4882a593Smuzhiyun 		.start  = evt2irq(0x480),
526*4882a593Smuzhiyun 		.flags  = IORESOURCE_IRQ,
527*4882a593Smuzhiyun 	},
528*4882a593Smuzhiyun };
529*4882a593Smuzhiyun 
530*4882a593Smuzhiyun static struct platform_device irda_device = {
531*4882a593Smuzhiyun 	.name           = "sh_sir",
532*4882a593Smuzhiyun 	.num_resources  = ARRAY_SIZE(irda_resources),
533*4882a593Smuzhiyun 	.resource       = irda_resources,
534*4882a593Smuzhiyun };
535*4882a593Smuzhiyun 
536*4882a593Smuzhiyun #include <media/i2c/ak881x.h>
537*4882a593Smuzhiyun #include <media/drv-intf/sh_vou.h>
538*4882a593Smuzhiyun 
539*4882a593Smuzhiyun static struct ak881x_pdata ak881x_pdata = {
540*4882a593Smuzhiyun 	.flags = AK881X_IF_MODE_SLAVE,
541*4882a593Smuzhiyun };
542*4882a593Smuzhiyun 
543*4882a593Smuzhiyun static struct i2c_board_info ak8813 = {
544*4882a593Smuzhiyun 	/* With open J18 jumper address is 0x21 */
545*4882a593Smuzhiyun 	I2C_BOARD_INFO("ak8813", 0x20),
546*4882a593Smuzhiyun 	.platform_data = &ak881x_pdata,
547*4882a593Smuzhiyun };
548*4882a593Smuzhiyun 
549*4882a593Smuzhiyun static struct sh_vou_pdata sh_vou_pdata = {
550*4882a593Smuzhiyun 	.bus_fmt	= SH_VOU_BUS_8BIT,
551*4882a593Smuzhiyun 	.flags		= SH_VOU_HSYNC_LOW | SH_VOU_VSYNC_LOW,
552*4882a593Smuzhiyun 	.board_info	= &ak8813,
553*4882a593Smuzhiyun 	.i2c_adap	= 0,
554*4882a593Smuzhiyun };
555*4882a593Smuzhiyun 
556*4882a593Smuzhiyun static struct resource sh_vou_resources[] = {
557*4882a593Smuzhiyun 	[0] = {
558*4882a593Smuzhiyun 		.start  = 0xfe960000,
559*4882a593Smuzhiyun 		.end    = 0xfe962043,
560*4882a593Smuzhiyun 		.flags  = IORESOURCE_MEM,
561*4882a593Smuzhiyun 	},
562*4882a593Smuzhiyun 	[1] = {
563*4882a593Smuzhiyun 		.start  = evt2irq(0x8e0),
564*4882a593Smuzhiyun 		.flags  = IORESOURCE_IRQ,
565*4882a593Smuzhiyun 	},
566*4882a593Smuzhiyun };
567*4882a593Smuzhiyun 
568*4882a593Smuzhiyun static struct platform_device vou_device = {
569*4882a593Smuzhiyun 	.name           = "sh-vou",
570*4882a593Smuzhiyun 	.id		= -1,
571*4882a593Smuzhiyun 	.num_resources  = ARRAY_SIZE(sh_vou_resources),
572*4882a593Smuzhiyun 	.resource       = sh_vou_resources,
573*4882a593Smuzhiyun 	.dev		= {
574*4882a593Smuzhiyun 		.platform_data	= &sh_vou_pdata,
575*4882a593Smuzhiyun 	},
576*4882a593Smuzhiyun };
577*4882a593Smuzhiyun 
578*4882a593Smuzhiyun static struct platform_device *ms7724se_ceu_devices[] __initdata = {
579*4882a593Smuzhiyun 	&ceu0_device,
580*4882a593Smuzhiyun 	&ceu1_device,
581*4882a593Smuzhiyun };
582*4882a593Smuzhiyun 
583*4882a593Smuzhiyun static struct platform_device *ms7724se_devices[] __initdata = {
584*4882a593Smuzhiyun 	&heartbeat_device,
585*4882a593Smuzhiyun 	&smc91x_eth_device,
586*4882a593Smuzhiyun 	&lcdc_device,
587*4882a593Smuzhiyun 	&nor_flash_device,
588*4882a593Smuzhiyun 	&keysc_device,
589*4882a593Smuzhiyun 	&sh_eth_device,
590*4882a593Smuzhiyun 	&sh7724_usb0_host_device,
591*4882a593Smuzhiyun 	&sh7724_usb1_gadget_device,
592*4882a593Smuzhiyun 	&fsi_device,
593*4882a593Smuzhiyun 	&fsi_ak4642_device,
594*4882a593Smuzhiyun 	&sdhi0_cn7_device,
595*4882a593Smuzhiyun 	&sdhi1_cn8_device,
596*4882a593Smuzhiyun 	&irda_device,
597*4882a593Smuzhiyun 	&vou_device,
598*4882a593Smuzhiyun };
599*4882a593Smuzhiyun 
600*4882a593Smuzhiyun /* I2C device */
601*4882a593Smuzhiyun static struct i2c_board_info i2c0_devices[] = {
602*4882a593Smuzhiyun 	{
603*4882a593Smuzhiyun 		I2C_BOARD_INFO("ak4642", 0x12),
604*4882a593Smuzhiyun 	},
605*4882a593Smuzhiyun };
606*4882a593Smuzhiyun 
607*4882a593Smuzhiyun #define EEPROM_OP   0xBA206000
608*4882a593Smuzhiyun #define EEPROM_ADR  0xBA206004
609*4882a593Smuzhiyun #define EEPROM_DATA 0xBA20600C
610*4882a593Smuzhiyun #define EEPROM_STAT 0xBA206010
611*4882a593Smuzhiyun #define EEPROM_STRT 0xBA206014
612*4882a593Smuzhiyun 
sh_eth_is_eeprom_ready(void)613*4882a593Smuzhiyun static int __init sh_eth_is_eeprom_ready(void)
614*4882a593Smuzhiyun {
615*4882a593Smuzhiyun 	int t = 10000;
616*4882a593Smuzhiyun 
617*4882a593Smuzhiyun 	while (t--) {
618*4882a593Smuzhiyun 		if (!__raw_readw(EEPROM_STAT))
619*4882a593Smuzhiyun 			return 1;
620*4882a593Smuzhiyun 		udelay(1);
621*4882a593Smuzhiyun 	}
622*4882a593Smuzhiyun 
623*4882a593Smuzhiyun 	printk(KERN_ERR "ms7724se can not access to eeprom\n");
624*4882a593Smuzhiyun 	return 0;
625*4882a593Smuzhiyun }
626*4882a593Smuzhiyun 
sh_eth_init(void)627*4882a593Smuzhiyun static void __init sh_eth_init(void)
628*4882a593Smuzhiyun {
629*4882a593Smuzhiyun 	int i;
630*4882a593Smuzhiyun 	u16 mac;
631*4882a593Smuzhiyun 
632*4882a593Smuzhiyun 	/* check EEPROM status */
633*4882a593Smuzhiyun 	if (!sh_eth_is_eeprom_ready())
634*4882a593Smuzhiyun 		return;
635*4882a593Smuzhiyun 
636*4882a593Smuzhiyun 	/* read MAC addr from EEPROM */
637*4882a593Smuzhiyun 	for (i = 0 ; i < 3 ; i++) {
638*4882a593Smuzhiyun 		__raw_writew(0x0, EEPROM_OP); /* read */
639*4882a593Smuzhiyun 		__raw_writew(i*2, EEPROM_ADR);
640*4882a593Smuzhiyun 		__raw_writew(0x1, EEPROM_STRT);
641*4882a593Smuzhiyun 		if (!sh_eth_is_eeprom_ready())
642*4882a593Smuzhiyun 			return;
643*4882a593Smuzhiyun 
644*4882a593Smuzhiyun 		mac = __raw_readw(EEPROM_DATA);
645*4882a593Smuzhiyun 		sh_eth_plat.mac_addr[i << 1] = mac & 0xff;
646*4882a593Smuzhiyun 		sh_eth_plat.mac_addr[(i << 1) + 1] = mac >> 8;
647*4882a593Smuzhiyun 	}
648*4882a593Smuzhiyun }
649*4882a593Smuzhiyun 
650*4882a593Smuzhiyun #define SW4140    0xBA201000
651*4882a593Smuzhiyun #define FPGA_OUT  0xBA200400
652*4882a593Smuzhiyun #define PORT_HIZA 0xA4050158
653*4882a593Smuzhiyun #define PORT_MSELCRB 0xA4050182
654*4882a593Smuzhiyun 
655*4882a593Smuzhiyun #define SW41_A    0x0100
656*4882a593Smuzhiyun #define SW41_B    0x0200
657*4882a593Smuzhiyun #define SW41_C    0x0400
658*4882a593Smuzhiyun #define SW41_D    0x0800
659*4882a593Smuzhiyun #define SW41_E    0x1000
660*4882a593Smuzhiyun #define SW41_F    0x2000
661*4882a593Smuzhiyun #define SW41_G    0x4000
662*4882a593Smuzhiyun #define SW41_H    0x8000
663*4882a593Smuzhiyun 
664*4882a593Smuzhiyun extern char ms7724se_sdram_enter_start;
665*4882a593Smuzhiyun extern char ms7724se_sdram_enter_end;
666*4882a593Smuzhiyun extern char ms7724se_sdram_leave_start;
667*4882a593Smuzhiyun extern char ms7724se_sdram_leave_end;
668*4882a593Smuzhiyun 
arch_setup(void)669*4882a593Smuzhiyun static int __init arch_setup(void)
670*4882a593Smuzhiyun {
671*4882a593Smuzhiyun 	/* enable I2C device */
672*4882a593Smuzhiyun 	i2c_register_board_info(0, i2c0_devices,
673*4882a593Smuzhiyun 				ARRAY_SIZE(i2c0_devices));
674*4882a593Smuzhiyun 	return 0;
675*4882a593Smuzhiyun }
676*4882a593Smuzhiyun arch_initcall(arch_setup);
677*4882a593Smuzhiyun 
devices_setup(void)678*4882a593Smuzhiyun static int __init devices_setup(void)
679*4882a593Smuzhiyun {
680*4882a593Smuzhiyun 	u16 sw = __raw_readw(SW4140); /* select camera, monitor */
681*4882a593Smuzhiyun 	struct clk *clk;
682*4882a593Smuzhiyun 	u16 fpga_out;
683*4882a593Smuzhiyun 
684*4882a593Smuzhiyun 	/* register board specific self-refresh code */
685*4882a593Smuzhiyun 	sh_mobile_register_self_refresh(SUSP_SH_STANDBY | SUSP_SH_SF |
686*4882a593Smuzhiyun 					SUSP_SH_RSTANDBY,
687*4882a593Smuzhiyun 					&ms7724se_sdram_enter_start,
688*4882a593Smuzhiyun 					&ms7724se_sdram_enter_end,
689*4882a593Smuzhiyun 					&ms7724se_sdram_leave_start,
690*4882a593Smuzhiyun 					&ms7724se_sdram_leave_end);
691*4882a593Smuzhiyun 
692*4882a593Smuzhiyun 	regulator_register_always_on(0, "fixed-3.3V", fixed3v3_power_consumers,
693*4882a593Smuzhiyun 				     ARRAY_SIZE(fixed3v3_power_consumers), 3300000);
694*4882a593Smuzhiyun 
695*4882a593Smuzhiyun 	/* Reset Release */
696*4882a593Smuzhiyun 	fpga_out = __raw_readw(FPGA_OUT);
697*4882a593Smuzhiyun 	/* bit4: NTSC_PDN, bit5: NTSC_RESET */
698*4882a593Smuzhiyun 	fpga_out &= ~((1 << 1)  | /* LAN */
699*4882a593Smuzhiyun 		      (1 << 4)  | /* AK8813 PDN */
700*4882a593Smuzhiyun 		      (1 << 5)  | /* AK8813 RESET */
701*4882a593Smuzhiyun 		      (1 << 6)  | /* VIDEO DAC */
702*4882a593Smuzhiyun 		      (1 << 7)  | /* AK4643 */
703*4882a593Smuzhiyun 		      (1 << 8)  | /* IrDA */
704*4882a593Smuzhiyun 		      (1 << 12) | /* USB0 */
705*4882a593Smuzhiyun 		      (1 << 14)); /* RMII */
706*4882a593Smuzhiyun 	__raw_writew(fpga_out | (1 << 4), FPGA_OUT);
707*4882a593Smuzhiyun 
708*4882a593Smuzhiyun 	udelay(10);
709*4882a593Smuzhiyun 
710*4882a593Smuzhiyun 	/* AK8813 RESET */
711*4882a593Smuzhiyun 	__raw_writew(fpga_out | (1 << 5), FPGA_OUT);
712*4882a593Smuzhiyun 
713*4882a593Smuzhiyun 	udelay(10);
714*4882a593Smuzhiyun 
715*4882a593Smuzhiyun 	__raw_writew(fpga_out, FPGA_OUT);
716*4882a593Smuzhiyun 
717*4882a593Smuzhiyun 	/* turn on USB clocks, use external clock */
718*4882a593Smuzhiyun 	__raw_writew((__raw_readw(PORT_MSELCRB) & ~0xc000) | 0x8000, PORT_MSELCRB);
719*4882a593Smuzhiyun 
720*4882a593Smuzhiyun 	/* Let LED9 show STATUS2 */
721*4882a593Smuzhiyun 	gpio_request(GPIO_FN_STATUS2, NULL);
722*4882a593Smuzhiyun 
723*4882a593Smuzhiyun 	/* Lit LED10 show STATUS0 */
724*4882a593Smuzhiyun 	gpio_request(GPIO_FN_STATUS0, NULL);
725*4882a593Smuzhiyun 
726*4882a593Smuzhiyun 	/* Lit LED11 show PDSTATUS */
727*4882a593Smuzhiyun 	gpio_request(GPIO_FN_PDSTATUS, NULL);
728*4882a593Smuzhiyun 
729*4882a593Smuzhiyun 	/* enable USB0 port */
730*4882a593Smuzhiyun 	__raw_writew(0x0600, 0xa40501d4);
731*4882a593Smuzhiyun 
732*4882a593Smuzhiyun 	/* enable USB1 port */
733*4882a593Smuzhiyun 	__raw_writew(0x0600, 0xa4050192);
734*4882a593Smuzhiyun 
735*4882a593Smuzhiyun 	/* enable IRQ 0,1,2 */
736*4882a593Smuzhiyun 	gpio_request(GPIO_FN_INTC_IRQ0, NULL);
737*4882a593Smuzhiyun 	gpio_request(GPIO_FN_INTC_IRQ1, NULL);
738*4882a593Smuzhiyun 	gpio_request(GPIO_FN_INTC_IRQ2, NULL);
739*4882a593Smuzhiyun 
740*4882a593Smuzhiyun 	/* enable SCIFA3 */
741*4882a593Smuzhiyun 	gpio_request(GPIO_FN_SCIF3_I_SCK, NULL);
742*4882a593Smuzhiyun 	gpio_request(GPIO_FN_SCIF3_I_RXD, NULL);
743*4882a593Smuzhiyun 	gpio_request(GPIO_FN_SCIF3_I_TXD, NULL);
744*4882a593Smuzhiyun 	gpio_request(GPIO_FN_SCIF3_I_CTS, NULL);
745*4882a593Smuzhiyun 	gpio_request(GPIO_FN_SCIF3_I_RTS, NULL);
746*4882a593Smuzhiyun 
747*4882a593Smuzhiyun 	/* enable LCDC */
748*4882a593Smuzhiyun 	gpio_request(GPIO_FN_LCDD23,   NULL);
749*4882a593Smuzhiyun 	gpio_request(GPIO_FN_LCDD22,   NULL);
750*4882a593Smuzhiyun 	gpio_request(GPIO_FN_LCDD21,   NULL);
751*4882a593Smuzhiyun 	gpio_request(GPIO_FN_LCDD20,   NULL);
752*4882a593Smuzhiyun 	gpio_request(GPIO_FN_LCDD19,   NULL);
753*4882a593Smuzhiyun 	gpio_request(GPIO_FN_LCDD18,   NULL);
754*4882a593Smuzhiyun 	gpio_request(GPIO_FN_LCDD17,   NULL);
755*4882a593Smuzhiyun 	gpio_request(GPIO_FN_LCDD16,   NULL);
756*4882a593Smuzhiyun 	gpio_request(GPIO_FN_LCDD15,   NULL);
757*4882a593Smuzhiyun 	gpio_request(GPIO_FN_LCDD14,   NULL);
758*4882a593Smuzhiyun 	gpio_request(GPIO_FN_LCDD13,   NULL);
759*4882a593Smuzhiyun 	gpio_request(GPIO_FN_LCDD12,   NULL);
760*4882a593Smuzhiyun 	gpio_request(GPIO_FN_LCDD11,   NULL);
761*4882a593Smuzhiyun 	gpio_request(GPIO_FN_LCDD10,   NULL);
762*4882a593Smuzhiyun 	gpio_request(GPIO_FN_LCDD9,    NULL);
763*4882a593Smuzhiyun 	gpio_request(GPIO_FN_LCDD8,    NULL);
764*4882a593Smuzhiyun 	gpio_request(GPIO_FN_LCDD7,    NULL);
765*4882a593Smuzhiyun 	gpio_request(GPIO_FN_LCDD6,    NULL);
766*4882a593Smuzhiyun 	gpio_request(GPIO_FN_LCDD5,    NULL);
767*4882a593Smuzhiyun 	gpio_request(GPIO_FN_LCDD4,    NULL);
768*4882a593Smuzhiyun 	gpio_request(GPIO_FN_LCDD3,    NULL);
769*4882a593Smuzhiyun 	gpio_request(GPIO_FN_LCDD2,    NULL);
770*4882a593Smuzhiyun 	gpio_request(GPIO_FN_LCDD1,    NULL);
771*4882a593Smuzhiyun 	gpio_request(GPIO_FN_LCDD0,    NULL);
772*4882a593Smuzhiyun 	gpio_request(GPIO_FN_LCDDISP,  NULL);
773*4882a593Smuzhiyun 	gpio_request(GPIO_FN_LCDHSYN,  NULL);
774*4882a593Smuzhiyun 	gpio_request(GPIO_FN_LCDDCK,   NULL);
775*4882a593Smuzhiyun 	gpio_request(GPIO_FN_LCDVSYN,  NULL);
776*4882a593Smuzhiyun 	gpio_request(GPIO_FN_LCDDON,   NULL);
777*4882a593Smuzhiyun 	gpio_request(GPIO_FN_LCDVEPWC, NULL);
778*4882a593Smuzhiyun 	gpio_request(GPIO_FN_LCDVCPWC, NULL);
779*4882a593Smuzhiyun 	gpio_request(GPIO_FN_LCDRD,    NULL);
780*4882a593Smuzhiyun 	gpio_request(GPIO_FN_LCDLCLK,  NULL);
781*4882a593Smuzhiyun 	__raw_writew((__raw_readw(PORT_HIZA) & ~0x0001), PORT_HIZA);
782*4882a593Smuzhiyun 
783*4882a593Smuzhiyun 	/* enable CEU0 */
784*4882a593Smuzhiyun 	gpio_request(GPIO_FN_VIO0_D15, NULL);
785*4882a593Smuzhiyun 	gpio_request(GPIO_FN_VIO0_D14, NULL);
786*4882a593Smuzhiyun 	gpio_request(GPIO_FN_VIO0_D13, NULL);
787*4882a593Smuzhiyun 	gpio_request(GPIO_FN_VIO0_D12, NULL);
788*4882a593Smuzhiyun 	gpio_request(GPIO_FN_VIO0_D11, NULL);
789*4882a593Smuzhiyun 	gpio_request(GPIO_FN_VIO0_D10, NULL);
790*4882a593Smuzhiyun 	gpio_request(GPIO_FN_VIO0_D9,  NULL);
791*4882a593Smuzhiyun 	gpio_request(GPIO_FN_VIO0_D8,  NULL);
792*4882a593Smuzhiyun 	gpio_request(GPIO_FN_VIO0_D7,  NULL);
793*4882a593Smuzhiyun 	gpio_request(GPIO_FN_VIO0_D6,  NULL);
794*4882a593Smuzhiyun 	gpio_request(GPIO_FN_VIO0_D5,  NULL);
795*4882a593Smuzhiyun 	gpio_request(GPIO_FN_VIO0_D4,  NULL);
796*4882a593Smuzhiyun 	gpio_request(GPIO_FN_VIO0_D3,  NULL);
797*4882a593Smuzhiyun 	gpio_request(GPIO_FN_VIO0_D2,  NULL);
798*4882a593Smuzhiyun 	gpio_request(GPIO_FN_VIO0_D1,  NULL);
799*4882a593Smuzhiyun 	gpio_request(GPIO_FN_VIO0_D0,  NULL);
800*4882a593Smuzhiyun 	gpio_request(GPIO_FN_VIO0_VD,  NULL);
801*4882a593Smuzhiyun 	gpio_request(GPIO_FN_VIO0_CLK, NULL);
802*4882a593Smuzhiyun 	gpio_request(GPIO_FN_VIO0_FLD, NULL);
803*4882a593Smuzhiyun 	gpio_request(GPIO_FN_VIO0_HD,  NULL);
804*4882a593Smuzhiyun 
805*4882a593Smuzhiyun 	/* enable CEU1 */
806*4882a593Smuzhiyun 	gpio_request(GPIO_FN_VIO1_D7,  NULL);
807*4882a593Smuzhiyun 	gpio_request(GPIO_FN_VIO1_D6,  NULL);
808*4882a593Smuzhiyun 	gpio_request(GPIO_FN_VIO1_D5,  NULL);
809*4882a593Smuzhiyun 	gpio_request(GPIO_FN_VIO1_D4,  NULL);
810*4882a593Smuzhiyun 	gpio_request(GPIO_FN_VIO1_D3,  NULL);
811*4882a593Smuzhiyun 	gpio_request(GPIO_FN_VIO1_D2,  NULL);
812*4882a593Smuzhiyun 	gpio_request(GPIO_FN_VIO1_D1,  NULL);
813*4882a593Smuzhiyun 	gpio_request(GPIO_FN_VIO1_D0,  NULL);
814*4882a593Smuzhiyun 	gpio_request(GPIO_FN_VIO1_FLD, NULL);
815*4882a593Smuzhiyun 	gpio_request(GPIO_FN_VIO1_HD,  NULL);
816*4882a593Smuzhiyun 	gpio_request(GPIO_FN_VIO1_VD,  NULL);
817*4882a593Smuzhiyun 	gpio_request(GPIO_FN_VIO1_CLK, NULL);
818*4882a593Smuzhiyun 
819*4882a593Smuzhiyun 	/* KEYSC */
820*4882a593Smuzhiyun 	gpio_request(GPIO_FN_KEYOUT5_IN5, NULL);
821*4882a593Smuzhiyun 	gpio_request(GPIO_FN_KEYOUT4_IN6, NULL);
822*4882a593Smuzhiyun 	gpio_request(GPIO_FN_KEYIN4,      NULL);
823*4882a593Smuzhiyun 	gpio_request(GPIO_FN_KEYIN3,      NULL);
824*4882a593Smuzhiyun 	gpio_request(GPIO_FN_KEYIN2,      NULL);
825*4882a593Smuzhiyun 	gpio_request(GPIO_FN_KEYIN1,      NULL);
826*4882a593Smuzhiyun 	gpio_request(GPIO_FN_KEYIN0,      NULL);
827*4882a593Smuzhiyun 	gpio_request(GPIO_FN_KEYOUT3,     NULL);
828*4882a593Smuzhiyun 	gpio_request(GPIO_FN_KEYOUT2,     NULL);
829*4882a593Smuzhiyun 	gpio_request(GPIO_FN_KEYOUT1,     NULL);
830*4882a593Smuzhiyun 	gpio_request(GPIO_FN_KEYOUT0,     NULL);
831*4882a593Smuzhiyun 
832*4882a593Smuzhiyun 	/* enable FSI */
833*4882a593Smuzhiyun 	gpio_request(GPIO_FN_FSIMCKA,    NULL);
834*4882a593Smuzhiyun 	gpio_request(GPIO_FN_FSIIASD,    NULL);
835*4882a593Smuzhiyun 	gpio_request(GPIO_FN_FSIOASD,    NULL);
836*4882a593Smuzhiyun 	gpio_request(GPIO_FN_FSIIABCK,   NULL);
837*4882a593Smuzhiyun 	gpio_request(GPIO_FN_FSIIALRCK,  NULL);
838*4882a593Smuzhiyun 	gpio_request(GPIO_FN_FSIOABCK,   NULL);
839*4882a593Smuzhiyun 	gpio_request(GPIO_FN_FSIOALRCK,  NULL);
840*4882a593Smuzhiyun 	gpio_request(GPIO_FN_CLKAUDIOAO, NULL);
841*4882a593Smuzhiyun 
842*4882a593Smuzhiyun 	/* set SPU2 clock to 83.4 MHz */
843*4882a593Smuzhiyun 	clk = clk_get(NULL, "spu_clk");
844*4882a593Smuzhiyun 	if (!IS_ERR(clk)) {
845*4882a593Smuzhiyun 		clk_set_rate(clk, clk_round_rate(clk, 83333333));
846*4882a593Smuzhiyun 		clk_put(clk);
847*4882a593Smuzhiyun 	}
848*4882a593Smuzhiyun 
849*4882a593Smuzhiyun 	/* change parent of FSI A */
850*4882a593Smuzhiyun 	clk = clk_get(NULL, "fsia_clk");
851*4882a593Smuzhiyun 	if (!IS_ERR(clk)) {
852*4882a593Smuzhiyun 		/* 48kHz dummy clock was used to make sure 1/1 divide */
853*4882a593Smuzhiyun 		clk_set_rate(&sh7724_fsimcka_clk, 48000);
854*4882a593Smuzhiyun 		clk_set_parent(clk, &sh7724_fsimcka_clk);
855*4882a593Smuzhiyun 		clk_set_rate(clk, 48000);
856*4882a593Smuzhiyun 		clk_put(clk);
857*4882a593Smuzhiyun 	}
858*4882a593Smuzhiyun 
859*4882a593Smuzhiyun 	/* SDHI0 connected to cn7 */
860*4882a593Smuzhiyun 	gpio_request(GPIO_FN_SDHI0CD, NULL);
861*4882a593Smuzhiyun 	gpio_request(GPIO_FN_SDHI0WP, NULL);
862*4882a593Smuzhiyun 	gpio_request(GPIO_FN_SDHI0D3, NULL);
863*4882a593Smuzhiyun 	gpio_request(GPIO_FN_SDHI0D2, NULL);
864*4882a593Smuzhiyun 	gpio_request(GPIO_FN_SDHI0D1, NULL);
865*4882a593Smuzhiyun 	gpio_request(GPIO_FN_SDHI0D0, NULL);
866*4882a593Smuzhiyun 	gpio_request(GPIO_FN_SDHI0CMD, NULL);
867*4882a593Smuzhiyun 	gpio_request(GPIO_FN_SDHI0CLK, NULL);
868*4882a593Smuzhiyun 
869*4882a593Smuzhiyun 	/* SDHI1 connected to cn8 */
870*4882a593Smuzhiyun 	gpio_request(GPIO_FN_SDHI1CD, NULL);
871*4882a593Smuzhiyun 	gpio_request(GPIO_FN_SDHI1WP, NULL);
872*4882a593Smuzhiyun 	gpio_request(GPIO_FN_SDHI1D3, NULL);
873*4882a593Smuzhiyun 	gpio_request(GPIO_FN_SDHI1D2, NULL);
874*4882a593Smuzhiyun 	gpio_request(GPIO_FN_SDHI1D1, NULL);
875*4882a593Smuzhiyun 	gpio_request(GPIO_FN_SDHI1D0, NULL);
876*4882a593Smuzhiyun 	gpio_request(GPIO_FN_SDHI1CMD, NULL);
877*4882a593Smuzhiyun 	gpio_request(GPIO_FN_SDHI1CLK, NULL);
878*4882a593Smuzhiyun 
879*4882a593Smuzhiyun 	/* enable IrDA */
880*4882a593Smuzhiyun 	gpio_request(GPIO_FN_IRDA_OUT, NULL);
881*4882a593Smuzhiyun 	gpio_request(GPIO_FN_IRDA_IN,  NULL);
882*4882a593Smuzhiyun 
883*4882a593Smuzhiyun 	/*
884*4882a593Smuzhiyun 	 * enable SH-Eth
885*4882a593Smuzhiyun 	 *
886*4882a593Smuzhiyun 	 * please remove J33 pin from your board !!
887*4882a593Smuzhiyun 	 *
888*4882a593Smuzhiyun 	 * ms7724 board should not use GPIO_FN_LNKSTA pin
889*4882a593Smuzhiyun 	 * So, This time PTX5 is set to input pin
890*4882a593Smuzhiyun 	 */
891*4882a593Smuzhiyun 	gpio_request(GPIO_FN_RMII_RXD0,    NULL);
892*4882a593Smuzhiyun 	gpio_request(GPIO_FN_RMII_RXD1,    NULL);
893*4882a593Smuzhiyun 	gpio_request(GPIO_FN_RMII_TXD0,    NULL);
894*4882a593Smuzhiyun 	gpio_request(GPIO_FN_RMII_TXD1,    NULL);
895*4882a593Smuzhiyun 	gpio_request(GPIO_FN_RMII_REF_CLK, NULL);
896*4882a593Smuzhiyun 	gpio_request(GPIO_FN_RMII_TX_EN,   NULL);
897*4882a593Smuzhiyun 	gpio_request(GPIO_FN_RMII_RX_ER,   NULL);
898*4882a593Smuzhiyun 	gpio_request(GPIO_FN_RMII_CRS_DV,  NULL);
899*4882a593Smuzhiyun 	gpio_request(GPIO_FN_MDIO,         NULL);
900*4882a593Smuzhiyun 	gpio_request(GPIO_FN_MDC,          NULL);
901*4882a593Smuzhiyun 	gpio_request(GPIO_PTX5, NULL);
902*4882a593Smuzhiyun 	gpio_direction_input(GPIO_PTX5);
903*4882a593Smuzhiyun 	sh_eth_init();
904*4882a593Smuzhiyun 
905*4882a593Smuzhiyun 	if (sw & SW41_B) {
906*4882a593Smuzhiyun 		/* 720p */
907*4882a593Smuzhiyun 		lcdc_info.ch[0].lcd_modes = lcdc_720p_modes;
908*4882a593Smuzhiyun 		lcdc_info.ch[0].num_modes = ARRAY_SIZE(lcdc_720p_modes);
909*4882a593Smuzhiyun 	} else {
910*4882a593Smuzhiyun 		/* VGA */
911*4882a593Smuzhiyun 		lcdc_info.ch[0].lcd_modes = lcdc_vga_modes;
912*4882a593Smuzhiyun 		lcdc_info.ch[0].num_modes = ARRAY_SIZE(lcdc_vga_modes);
913*4882a593Smuzhiyun 	}
914*4882a593Smuzhiyun 
915*4882a593Smuzhiyun 	if (sw & SW41_A) {
916*4882a593Smuzhiyun 		/* Digital monitor */
917*4882a593Smuzhiyun 		lcdc_info.ch[0].interface_type = RGB18;
918*4882a593Smuzhiyun 		lcdc_info.ch[0].flags          = 0;
919*4882a593Smuzhiyun 	} else {
920*4882a593Smuzhiyun 		/* Analog monitor */
921*4882a593Smuzhiyun 		lcdc_info.ch[0].interface_type = RGB24;
922*4882a593Smuzhiyun 		lcdc_info.ch[0].flags          = LCDC_FLAGS_DWPOL;
923*4882a593Smuzhiyun 	}
924*4882a593Smuzhiyun 
925*4882a593Smuzhiyun 	/* VOU */
926*4882a593Smuzhiyun 	gpio_request(GPIO_FN_DV_D15, NULL);
927*4882a593Smuzhiyun 	gpio_request(GPIO_FN_DV_D14, NULL);
928*4882a593Smuzhiyun 	gpio_request(GPIO_FN_DV_D13, NULL);
929*4882a593Smuzhiyun 	gpio_request(GPIO_FN_DV_D12, NULL);
930*4882a593Smuzhiyun 	gpio_request(GPIO_FN_DV_D11, NULL);
931*4882a593Smuzhiyun 	gpio_request(GPIO_FN_DV_D10, NULL);
932*4882a593Smuzhiyun 	gpio_request(GPIO_FN_DV_D9, NULL);
933*4882a593Smuzhiyun 	gpio_request(GPIO_FN_DV_D8, NULL);
934*4882a593Smuzhiyun 	gpio_request(GPIO_FN_DV_CLKI, NULL);
935*4882a593Smuzhiyun 	gpio_request(GPIO_FN_DV_CLK, NULL);
936*4882a593Smuzhiyun 	gpio_request(GPIO_FN_DV_VSYNC, NULL);
937*4882a593Smuzhiyun 	gpio_request(GPIO_FN_DV_HSYNC, NULL);
938*4882a593Smuzhiyun 
939*4882a593Smuzhiyun 	/* Initialize CEU platform devices separately to map memory first */
940*4882a593Smuzhiyun 	device_initialize(&ms7724se_ceu_devices[0]->dev);
941*4882a593Smuzhiyun 	dma_declare_coherent_memory(&ms7724se_ceu_devices[0]->dev,
942*4882a593Smuzhiyun 				    ceu0_dma_membase, ceu0_dma_membase,
943*4882a593Smuzhiyun 				    ceu0_dma_membase +
944*4882a593Smuzhiyun 				    CEU_BUFFER_MEMORY_SIZE - 1);
945*4882a593Smuzhiyun 	platform_device_add(ms7724se_ceu_devices[0]);
946*4882a593Smuzhiyun 
947*4882a593Smuzhiyun 	device_initialize(&ms7724se_ceu_devices[1]->dev);
948*4882a593Smuzhiyun 	dma_declare_coherent_memory(&ms7724se_ceu_devices[1]->dev,
949*4882a593Smuzhiyun 				    ceu1_dma_membase, ceu1_dma_membase,
950*4882a593Smuzhiyun 				    ceu1_dma_membase +
951*4882a593Smuzhiyun 				    CEU_BUFFER_MEMORY_SIZE - 1);
952*4882a593Smuzhiyun 	platform_device_add(ms7724se_ceu_devices[1]);
953*4882a593Smuzhiyun 
954*4882a593Smuzhiyun 	return platform_add_devices(ms7724se_devices,
955*4882a593Smuzhiyun 				    ARRAY_SIZE(ms7724se_devices));
956*4882a593Smuzhiyun }
957*4882a593Smuzhiyun device_initcall(devices_setup);
958*4882a593Smuzhiyun 
959*4882a593Smuzhiyun /* Reserve a portion of memory for CEU 0 and CEU 1 buffers */
ms7724se_mv_mem_reserve(void)960*4882a593Smuzhiyun static void __init ms7724se_mv_mem_reserve(void)
961*4882a593Smuzhiyun {
962*4882a593Smuzhiyun 	phys_addr_t phys;
963*4882a593Smuzhiyun 	phys_addr_t size = CEU_BUFFER_MEMORY_SIZE;
964*4882a593Smuzhiyun 
965*4882a593Smuzhiyun 	phys = memblock_phys_alloc(size, PAGE_SIZE);
966*4882a593Smuzhiyun 	if (!phys)
967*4882a593Smuzhiyun 		panic("Failed to allocate CEU0 memory\n");
968*4882a593Smuzhiyun 
969*4882a593Smuzhiyun 	memblock_free(phys, size);
970*4882a593Smuzhiyun 	memblock_remove(phys, size);
971*4882a593Smuzhiyun 	ceu0_dma_membase = phys;
972*4882a593Smuzhiyun 
973*4882a593Smuzhiyun 	phys = memblock_phys_alloc(size, PAGE_SIZE);
974*4882a593Smuzhiyun 	if (!phys)
975*4882a593Smuzhiyun 		panic("Failed to allocate CEU1 memory\n");
976*4882a593Smuzhiyun 
977*4882a593Smuzhiyun 	memblock_free(phys, size);
978*4882a593Smuzhiyun 	memblock_remove(phys, size);
979*4882a593Smuzhiyun 	ceu1_dma_membase = phys;
980*4882a593Smuzhiyun }
981*4882a593Smuzhiyun 
982*4882a593Smuzhiyun static struct sh_machine_vector mv_ms7724se __initmv = {
983*4882a593Smuzhiyun 	.mv_name	= "ms7724se",
984*4882a593Smuzhiyun 	.mv_init_irq	= init_se7724_IRQ,
985*4882a593Smuzhiyun 	.mv_mem_reserve	= ms7724se_mv_mem_reserve,
986*4882a593Smuzhiyun };
987