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