diff options
Diffstat (limited to 'arch/arm/mach-s5pv210/mach-smdkv210.c')
-rw-r--r-- | arch/arm/mach-s5pv210/mach-smdkv210.c | 139 |
1 files changed, 135 insertions, 4 deletions
diff --git a/arch/arm/mach-s5pv210/mach-smdkv210.c b/arch/arm/mach-s5pv210/mach-smdkv210.c index 1fbc45b2a432..88e45223c8af 100644 --- a/arch/arm/mach-s5pv210/mach-smdkv210.c +++ b/arch/arm/mach-s5pv210/mach-smdkv210.c | |||
@@ -14,16 +14,25 @@ | |||
14 | #include <linux/init.h> | 14 | #include <linux/init.h> |
15 | #include <linux/serial_core.h> | 15 | #include <linux/serial_core.h> |
16 | #include <linux/sysdev.h> | 16 | #include <linux/sysdev.h> |
17 | #include <linux/dm9000.h> | ||
18 | #include <linux/fb.h> | ||
19 | #include <linux/gpio.h> | ||
20 | #include <linux/delay.h> | ||
17 | 21 | ||
18 | #include <asm/mach/arch.h> | 22 | #include <asm/mach/arch.h> |
19 | #include <asm/mach/map.h> | 23 | #include <asm/mach/map.h> |
20 | #include <asm/setup.h> | 24 | #include <asm/setup.h> |
21 | #include <asm/mach-types.h> | 25 | #include <asm/mach-types.h> |
22 | 26 | ||
27 | #include <video/platform_lcd.h> | ||
28 | |||
23 | #include <mach/map.h> | 29 | #include <mach/map.h> |
24 | #include <mach/regs-clock.h> | 30 | #include <mach/regs-clock.h> |
31 | #include <mach/regs-fb.h> | ||
25 | 32 | ||
26 | #include <plat/regs-serial.h> | 33 | #include <plat/regs-serial.h> |
34 | #include <plat/regs-srom.h> | ||
35 | #include <plat/gpio-cfg.h> | ||
27 | #include <plat/s5pv210.h> | 36 | #include <plat/s5pv210.h> |
28 | #include <plat/devs.h> | 37 | #include <plat/devs.h> |
29 | #include <plat/cpu.h> | 38 | #include <plat/cpu.h> |
@@ -33,6 +42,7 @@ | |||
33 | #include <plat/iic.h> | 42 | #include <plat/iic.h> |
34 | #include <plat/keypad.h> | 43 | #include <plat/keypad.h> |
35 | #include <plat/pm.h> | 44 | #include <plat/pm.h> |
45 | #include <plat/fb.h> | ||
36 | 46 | ||
37 | /* Following are default values for UCON, ULCON and UFCON UART registers */ | 47 | /* Following are default values for UCON, ULCON and UFCON UART registers */ |
38 | #define SMDKV210_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \ | 48 | #define SMDKV210_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \ |
@@ -102,12 +112,106 @@ static struct samsung_keypad_platdata smdkv210_keypad_data __initdata = { | |||
102 | .cols = 8, | 112 | .cols = 8, |
103 | }; | 113 | }; |
104 | 114 | ||
115 | static struct resource smdkv210_dm9000_resources[] = { | ||
116 | [0] = { | ||
117 | .start = S5PV210_PA_SROM_BANK5, | ||
118 | .end = S5PV210_PA_SROM_BANK5, | ||
119 | .flags = IORESOURCE_MEM, | ||
120 | }, | ||
121 | [1] = { | ||
122 | .start = S5PV210_PA_SROM_BANK5 + 2, | ||
123 | .end = S5PV210_PA_SROM_BANK5 + 2, | ||
124 | .flags = IORESOURCE_MEM, | ||
125 | }, | ||
126 | [2] = { | ||
127 | .start = IRQ_EINT(9), | ||
128 | .end = IRQ_EINT(9), | ||
129 | .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL, | ||
130 | }, | ||
131 | }; | ||
132 | |||
133 | static struct dm9000_plat_data smdkv210_dm9000_platdata = { | ||
134 | .flags = DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM, | ||
135 | .dev_addr = { 0x00, 0x09, 0xc0, 0xff, 0xec, 0x48 }, | ||
136 | }; | ||
137 | |||
138 | struct platform_device smdkv210_dm9000 = { | ||
139 | .name = "dm9000", | ||
140 | .id = -1, | ||
141 | .num_resources = ARRAY_SIZE(smdkv210_dm9000_resources), | ||
142 | .resource = smdkv210_dm9000_resources, | ||
143 | .dev = { | ||
144 | .platform_data = &smdkv210_dm9000_platdata, | ||
145 | }, | ||
146 | }; | ||
147 | |||
148 | static void smdkv210_lte480wv_set_power(struct plat_lcd_data *pd, | ||
149 | unsigned int power) | ||
150 | { | ||
151 | if (power) { | ||
152 | #if !defined(CONFIG_BACKLIGHT_PWM) | ||
153 | gpio_request(S5PV210_GPD0(3), "GPD0"); | ||
154 | gpio_direction_output(S5PV210_GPD0(3), 1); | ||
155 | gpio_free(S5PV210_GPD0(3)); | ||
156 | #endif | ||
157 | |||
158 | /* fire nRESET on power up */ | ||
159 | gpio_request(S5PV210_GPH0(6), "GPH0"); | ||
160 | |||
161 | gpio_direction_output(S5PV210_GPH0(6), 1); | ||
162 | |||
163 | gpio_set_value(S5PV210_GPH0(6), 0); | ||
164 | mdelay(10); | ||
165 | |||
166 | gpio_set_value(S5PV210_GPH0(6), 1); | ||
167 | mdelay(10); | ||
168 | |||
169 | gpio_free(S5PV210_GPH0(6)); | ||
170 | } else { | ||
171 | #if !defined(CONFIG_BACKLIGHT_PWM) | ||
172 | gpio_request(S5PV210_GPD0(3), "GPD0"); | ||
173 | gpio_direction_output(S5PV210_GPD0(3), 0); | ||
174 | gpio_free(S5PV210_GPD0(3)); | ||
175 | #endif | ||
176 | } | ||
177 | } | ||
178 | |||
179 | static struct plat_lcd_data smdkv210_lcd_lte480wv_data = { | ||
180 | .set_power = smdkv210_lte480wv_set_power, | ||
181 | }; | ||
182 | |||
183 | static struct platform_device smdkv210_lcd_lte480wv = { | ||
184 | .name = "platform-lcd", | ||
185 | .dev.parent = &s3c_device_fb.dev, | ||
186 | .dev.platform_data = &smdkv210_lcd_lte480wv_data, | ||
187 | }; | ||
188 | |||
189 | static struct s3c_fb_pd_win smdkv210_fb_win0 = { | ||
190 | .win_mode = { | ||
191 | .left_margin = 13, | ||
192 | .right_margin = 8, | ||
193 | .upper_margin = 7, | ||
194 | .lower_margin = 5, | ||
195 | .hsync_len = 3, | ||
196 | .vsync_len = 1, | ||
197 | .xres = 800, | ||
198 | .yres = 480, | ||
199 | }, | ||
200 | .max_bpp = 32, | ||
201 | .default_bpp = 24, | ||
202 | }; | ||
203 | |||
204 | static struct s3c_fb_platdata smdkv210_lcd0_pdata __initdata = { | ||
205 | .win[0] = &smdkv210_fb_win0, | ||
206 | .vidcon0 = VIDCON0_VIDOUT_RGB | VIDCON0_PNRMODE_RGB, | ||
207 | .vidcon1 = VIDCON1_INV_HSYNC | VIDCON1_INV_VSYNC, | ||
208 | .setup_gpio = s5pv210_fb_gpio_setup_24bpp, | ||
209 | }; | ||
210 | |||
105 | static struct platform_device *smdkv210_devices[] __initdata = { | 211 | static struct platform_device *smdkv210_devices[] __initdata = { |
106 | &s5pv210_device_iis0, | ||
107 | &s5pv210_device_ac97, | ||
108 | &s5pv210_device_spdif, | ||
109 | &s3c_device_adc, | 212 | &s3c_device_adc, |
110 | &s3c_device_cfcon, | 213 | &s3c_device_cfcon, |
214 | &s3c_device_fb, | ||
111 | &s3c_device_hsmmc0, | 215 | &s3c_device_hsmmc0, |
112 | &s3c_device_hsmmc1, | 216 | &s3c_device_hsmmc1, |
113 | &s3c_device_hsmmc2, | 217 | &s3c_device_hsmmc2, |
@@ -115,14 +219,37 @@ static struct platform_device *smdkv210_devices[] __initdata = { | |||
115 | &s3c_device_i2c0, | 219 | &s3c_device_i2c0, |
116 | &s3c_device_i2c1, | 220 | &s3c_device_i2c1, |
117 | &s3c_device_i2c2, | 221 | &s3c_device_i2c2, |
118 | &samsung_device_keypad, | ||
119 | &s3c_device_rtc, | 222 | &s3c_device_rtc, |
120 | &s3c_device_ts, | 223 | &s3c_device_ts, |
121 | &s3c_device_wdt, | 224 | &s3c_device_wdt, |
225 | &s5pv210_device_ac97, | ||
226 | &s5pv210_device_iis0, | ||
227 | &s5pv210_device_spdif, | ||
228 | &samsung_device_keypad, | ||
229 | &smdkv210_dm9000, | ||
230 | &smdkv210_lcd_lte480wv, | ||
122 | }; | 231 | }; |
123 | 232 | ||
233 | static void __init smdkv210_dm9000_init(void) | ||
234 | { | ||
235 | unsigned int tmp; | ||
236 | |||
237 | gpio_request(S5PV210_MP01(5), "nCS5"); | ||
238 | s3c_gpio_cfgpin(S5PV210_MP01(5), S3C_GPIO_SFN(2)); | ||
239 | gpio_free(S5PV210_MP01(5)); | ||
240 | |||
241 | tmp = (5 << S5P_SROM_BCX__TACC__SHIFT); | ||
242 | __raw_writel(tmp, S5P_SROM_BC5); | ||
243 | |||
244 | tmp = __raw_readl(S5P_SROM_BW); | ||
245 | tmp &= (S5P_SROM_BW__CS_MASK << S5P_SROM_BW__NCS5__SHIFT); | ||
246 | tmp |= (1 << S5P_SROM_BW__NCS5__SHIFT); | ||
247 | __raw_writel(tmp, S5P_SROM_BW); | ||
248 | } | ||
249 | |||
124 | static struct i2c_board_info smdkv210_i2c_devs0[] __initdata = { | 250 | static struct i2c_board_info smdkv210_i2c_devs0[] __initdata = { |
125 | { I2C_BOARD_INFO("24c08", 0x50), }, /* Samsung S524AD0XD1 */ | 251 | { I2C_BOARD_INFO("24c08", 0x50), }, /* Samsung S524AD0XD1 */ |
252 | { I2C_BOARD_INFO("wm8580", 0x1b), }, | ||
126 | }; | 253 | }; |
127 | 254 | ||
128 | static struct i2c_board_info smdkv210_i2c_devs1[] __initdata = { | 255 | static struct i2c_board_info smdkv210_i2c_devs1[] __initdata = { |
@@ -150,6 +277,8 @@ static void __init smdkv210_machine_init(void) | |||
150 | { | 277 | { |
151 | s3c_pm_init(); | 278 | s3c_pm_init(); |
152 | 279 | ||
280 | smdkv210_dm9000_init(); | ||
281 | |||
153 | samsung_keypad_set_platdata(&smdkv210_keypad_data); | 282 | samsung_keypad_set_platdata(&smdkv210_keypad_data); |
154 | s3c24xx_ts_set_platdata(&s3c_ts_platform); | 283 | s3c24xx_ts_set_platdata(&s3c_ts_platform); |
155 | 284 | ||
@@ -165,6 +294,8 @@ static void __init smdkv210_machine_init(void) | |||
165 | 294 | ||
166 | s3c_ide_set_platdata(&smdkv210_ide_pdata); | 295 | s3c_ide_set_platdata(&smdkv210_ide_pdata); |
167 | 296 | ||
297 | s3c_fb_set_platdata(&smdkv210_lcd0_pdata); | ||
298 | |||
168 | platform_add_devices(smdkv210_devices, ARRAY_SIZE(smdkv210_devices)); | 299 | platform_add_devices(smdkv210_devices, ARRAY_SIZE(smdkv210_devices)); |
169 | } | 300 | } |
170 | 301 | ||