Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
mach-smdk2416.c
Go to the documentation of this file.
1 /* linux/arch/arm/mach-s3c2416/mach-hanlin_v3c.c
2  *
3  * Copyright (c) 2009 Yauhen Kharuzhy <[email protected]>,
4  * as part of OpenInkpot project
5  * Copyright (c) 2009 Promwad Innovation Company
6  * Yauhen Kharuzhy <[email protected]>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License version 2 as
10  * published by the Free Software Foundation.
11  *
12 */
13 
14 #include <linux/kernel.h>
15 #include <linux/types.h>
16 #include <linux/interrupt.h>
17 #include <linux/list.h>
18 #include <linux/timer.h>
19 #include <linux/init.h>
20 #include <linux/serial_core.h>
21 #include <linux/platform_device.h>
22 #include <linux/io.h>
23 #include <linux/mtd/partitions.h>
24 #include <linux/gpio.h>
25 #include <linux/fb.h>
26 #include <linux/delay.h>
27 
28 #include <asm/mach/arch.h>
29 #include <asm/mach/map.h>
30 #include <asm/mach/irq.h>
31 
32 #include <video/samsung_fimd.h>
33 #include <mach/hardware.h>
34 #include <asm/irq.h>
35 #include <asm/mach-types.h>
36 
37 #include <plat/regs-serial.h>
38 #include <mach/regs-gpio.h>
39 #include <mach/regs-lcd.h>
41 
42 #include <mach/idle.h>
45 
46 #include <plat/s3c2416.h>
47 #include <plat/gpio-cfg.h>
48 #include <plat/clock.h>
49 #include <plat/devs.h>
50 #include <plat/cpu.h>
52 #include <plat/sdhci.h>
55 
56 #include <plat/fb.h>
57 
58 #include <plat/common-smdk.h>
59 
60 static struct map_desc smdk2416_iodesc[] __initdata = {
61  /* ISA IO Space map (memory space selected by A24) */
62 
63  {
64  .virtual = (u32)S3C24XX_VA_ISA_WORD,
66  .length = 0x10000,
67  .type = MT_DEVICE,
68  }, {
69  .virtual = (u32)S3C24XX_VA_ISA_WORD + 0x10000,
70  .pfn = __phys_to_pfn(S3C2410_CS2 + (1<<24)),
71  .length = SZ_4M,
72  .type = MT_DEVICE,
73  }, {
74  .virtual = (u32)S3C24XX_VA_ISA_BYTE,
76  .length = 0x10000,
77  .type = MT_DEVICE,
78  }, {
79  .virtual = (u32)S3C24XX_VA_ISA_BYTE + 0x10000,
80  .pfn = __phys_to_pfn(S3C2410_CS2 + (1<<24)),
81  .length = SZ_4M,
82  .type = MT_DEVICE,
83  }
84 };
85 
86 #define UCON (S3C2410_UCON_DEFAULT | \
87  S3C2440_UCON_PCLK | \
88  S3C2443_UCON_RXERR_IRQEN)
89 
90 #define ULCON (S3C2410_LCON_CS8 | S3C2410_LCON_PNONE)
91 
92 #define UFCON (S3C2410_UFCON_RXTRIG8 | \
93  S3C2410_UFCON_FIFOMODE | \
94  S3C2440_UFCON_TXTRIG16)
95 
96 static struct s3c2410_uartcfg smdk2416_uartcfgs[] __initdata = {
97  [0] = {
98  .hwport = 0,
99  .flags = 0,
100  .ucon = UCON,
101  .ulcon = ULCON,
102  .ufcon = UFCON,
103  },
104  [1] = {
105  .hwport = 1,
106  .flags = 0,
107  .ucon = UCON,
108  .ulcon = ULCON,
109  .ufcon = UFCON,
110  },
111  /* IR port */
112  [2] = {
113  .hwport = 2,
114  .flags = 0,
115  .ucon = UCON,
116  .ulcon = ULCON | 0x50,
117  .ufcon = UFCON,
118  },
119  [3] = {
120  .hwport = 3,
121  .flags = 0,
122  .ucon = UCON,
123  .ulcon = ULCON,
124  .ufcon = UFCON,
125  }
126 };
127 
128 static void smdk2416_hsudc_gpio_init(void)
129 {
134 }
135 
136 static void smdk2416_hsudc_gpio_uninit(void)
137 {
141 }
142 
143 static struct s3c24xx_hsudc_platdata smdk2416_hsudc_platdata = {
144  .epnum = 9,
145  .gpio_init = smdk2416_hsudc_gpio_init,
146  .gpio_uninit = smdk2416_hsudc_gpio_uninit,
147 };
148 
149 static struct s3c_fb_pd_win smdk2416_fb_win[] = {
150  [0] = {
151  .default_bpp = 16,
152  .max_bpp = 32,
153  .xres = 800,
154  .yres = 480,
155  },
156 };
157 
158 static struct fb_videomode smdk2416_lcd_timing = {
159  .pixclock = 41094,
160  .left_margin = 8,
161  .right_margin = 13,
162  .upper_margin = 7,
163  .lower_margin = 5,
164  .hsync_len = 3,
165  .vsync_len = 1,
166  .xres = 800,
167  .yres = 480,
168 };
169 
170 static void s3c2416_fb_gpio_setup_24bpp(void)
171 {
172  unsigned int gpio;
173 
174  for (gpio = S3C2410_GPC(1); gpio <= S3C2410_GPC(4); gpio++) {
175  s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2));
177  }
178 
179  for (gpio = S3C2410_GPC(8); gpio <= S3C2410_GPC(15); gpio++) {
180  s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2));
182  }
183 
184  for (gpio = S3C2410_GPD(0); gpio <= S3C2410_GPD(15); gpio++) {
185  s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2));
187  }
188 }
189 
190 static struct s3c_fb_platdata smdk2416_fb_platdata = {
191  .win[0] = &smdk2416_fb_win[0],
192  .vtiming = &smdk2416_lcd_timing,
193  .setup_gpio = s3c2416_fb_gpio_setup_24bpp,
196 };
197 
198 static struct s3c_sdhci_platdata smdk2416_hsmmc0_pdata __initdata = {
199  .max_width = 4,
200  .cd_type = S3C_SDHCI_CD_GPIO,
201  .ext_cd_gpio = S3C2410_GPF(1),
202  .ext_cd_gpio_invert = 1,
203 };
204 
205 static struct s3c_sdhci_platdata smdk2416_hsmmc1_pdata __initdata = {
206  .max_width = 4,
207  .cd_type = S3C_SDHCI_CD_NONE,
208 };
209 
210 static struct platform_device *smdk2416_devices[] __initdata = {
211  &s3c_device_fb,
218 };
219 
220 static void __init smdk2416_map_io(void)
221 {
222  s3c24xx_init_io(smdk2416_iodesc, ARRAY_SIZE(smdk2416_iodesc));
223  s3c24xx_init_clocks(12000000);
224  s3c24xx_init_uarts(smdk2416_uartcfgs, ARRAY_SIZE(smdk2416_uartcfgs));
225 }
226 
227 static void __init smdk2416_machine_init(void)
228 {
230  s3c_fb_set_platdata(&smdk2416_fb_platdata);
231 
232  s3c_sdhci0_set_platdata(&smdk2416_hsmmc0_pdata);
233  s3c_sdhci1_set_platdata(&smdk2416_hsmmc1_pdata);
234 
235  s3c24xx_hsudc_set_platdata(&smdk2416_hsudc_platdata);
236 
237  gpio_request(S3C2410_GPB(4), "USBHost Power");
239 
240  gpio_request(S3C2410_GPB(3), "Display Power");
242 
243  gpio_request(S3C2410_GPB(1), "Display Reset");
245 
246  platform_add_devices(smdk2416_devices, ARRAY_SIZE(smdk2416_devices));
248 }
249 
250 MACHINE_START(SMDK2416, "SMDK2416")
251  /* Maintainer: Yauhen Kharuzhy <[email protected]> */
252  .atag_offset = 0x100,
253 
254  .init_irq = s3c24xx_init_irq,
255  .map_io = smdk2416_map_io,
256  .init_machine = smdk2416_machine_init,
257  .timer = &s3c24xx_timer,
258  .restart = s3c2416_restart,