diff options
Diffstat (limited to 'arch/arm/mach-exynos4/mach-origen.c')
-rw-r--r-- | arch/arm/mach-exynos4/mach-origen.c | 577 |
1 files changed, 574 insertions, 3 deletions
diff --git a/arch/arm/mach-exynos4/mach-origen.c b/arch/arm/mach-exynos4/mach-origen.c index ed59f86001ac..18909cf6c07d 100644 --- a/arch/arm/mach-exynos4/mach-origen.c +++ b/arch/arm/mach-exynos4/mach-origen.c | |||
@@ -14,16 +14,31 @@ | |||
14 | #include <linux/platform_device.h> | 14 | #include <linux/platform_device.h> |
15 | #include <linux/io.h> | 15 | #include <linux/io.h> |
16 | #include <linux/input.h> | 16 | #include <linux/input.h> |
17 | #include <linux/pwm_backlight.h> | ||
18 | #include <linux/gpio_keys.h> | ||
19 | #include <linux/i2c.h> | ||
20 | #include <linux/regulator/machine.h> | ||
21 | #include <linux/mfd/max8997.h> | ||
22 | #include <linux/lcd.h> | ||
17 | 23 | ||
18 | #include <asm/mach/arch.h> | 24 | #include <asm/mach/arch.h> |
19 | #include <asm/mach-types.h> | 25 | #include <asm/mach-types.h> |
20 | 26 | ||
27 | #include <video/platform_lcd.h> | ||
28 | |||
21 | #include <plat/regs-serial.h> | 29 | #include <plat/regs-serial.h> |
30 | #include <plat/regs-fb-v4.h> | ||
22 | #include <plat/exynos4.h> | 31 | #include <plat/exynos4.h> |
23 | #include <plat/cpu.h> | 32 | #include <plat/cpu.h> |
24 | #include <plat/devs.h> | 33 | #include <plat/devs.h> |
25 | #include <plat/sdhci.h> | 34 | #include <plat/sdhci.h> |
26 | #include <plat/iic.h> | 35 | #include <plat/iic.h> |
36 | #include <plat/ehci.h> | ||
37 | #include <plat/clock.h> | ||
38 | #include <plat/gpio-cfg.h> | ||
39 | #include <plat/backlight.h> | ||
40 | #include <plat/pd.h> | ||
41 | #include <plat/fb.h> | ||
27 | 42 | ||
28 | #include <mach/map.h> | 43 | #include <mach/map.h> |
29 | 44 | ||
@@ -72,19 +87,543 @@ static struct s3c2410_uartcfg origen_uartcfgs[] __initdata = { | |||
72 | }, | 87 | }, |
73 | }; | 88 | }; |
74 | 89 | ||
90 | static struct regulator_consumer_supply __initdata ldo3_consumer[] = { | ||
91 | REGULATOR_SUPPLY("vdd11", "s5p-mipi-csis.0"), /* MIPI */ | ||
92 | }; | ||
93 | static struct regulator_consumer_supply __initdata ldo6_consumer[] = { | ||
94 | REGULATOR_SUPPLY("vdd18", "s5p-mipi-csis.0"), /* MIPI */ | ||
95 | }; | ||
96 | static struct regulator_consumer_supply __initdata ldo7_consumer[] = { | ||
97 | REGULATOR_SUPPLY("avdd", "alc5625"), /* Realtek ALC5625 */ | ||
98 | }; | ||
99 | static struct regulator_consumer_supply __initdata ldo8_consumer[] = { | ||
100 | REGULATOR_SUPPLY("vdd", "s5p-adc"), /* ADC */ | ||
101 | }; | ||
102 | static struct regulator_consumer_supply __initdata ldo9_consumer[] = { | ||
103 | REGULATOR_SUPPLY("dvdd", "swb-a31"), /* AR6003 WLAN & CSR 8810 BT */ | ||
104 | }; | ||
105 | static struct regulator_consumer_supply __initdata ldo11_consumer[] = { | ||
106 | REGULATOR_SUPPLY("dvdd", "alc5625"), /* Realtek ALC5625 */ | ||
107 | }; | ||
108 | static struct regulator_consumer_supply __initdata ldo14_consumer[] = { | ||
109 | REGULATOR_SUPPLY("avdd18", "swb-a31"), /* AR6003 WLAN & CSR 8810 BT */ | ||
110 | }; | ||
111 | static struct regulator_consumer_supply __initdata ldo17_consumer[] = { | ||
112 | REGULATOR_SUPPLY("vdd33", "swb-a31"), /* AR6003 WLAN & CSR 8810 BT */ | ||
113 | }; | ||
114 | static struct regulator_consumer_supply __initdata buck1_consumer[] = { | ||
115 | REGULATOR_SUPPLY("vdd_arm", NULL), /* CPUFREQ */ | ||
116 | }; | ||
117 | static struct regulator_consumer_supply __initdata buck2_consumer[] = { | ||
118 | REGULATOR_SUPPLY("vdd_int", NULL), /* CPUFREQ */ | ||
119 | }; | ||
120 | static struct regulator_consumer_supply __initdata buck3_consumer[] = { | ||
121 | REGULATOR_SUPPLY("vdd_g3d", "mali_drm"), /* G3D */ | ||
122 | }; | ||
123 | static struct regulator_consumer_supply __initdata buck7_consumer[] = { | ||
124 | REGULATOR_SUPPLY("vcc", "platform-lcd"), /* LCD */ | ||
125 | }; | ||
126 | |||
127 | static struct regulator_init_data __initdata max8997_ldo1_data = { | ||
128 | .constraints = { | ||
129 | .name = "VDD_ABB_3.3V", | ||
130 | .min_uV = 3300000, | ||
131 | .max_uV = 3300000, | ||
132 | .apply_uV = 1, | ||
133 | .state_mem = { | ||
134 | .disabled = 1, | ||
135 | }, | ||
136 | }, | ||
137 | }; | ||
138 | |||
139 | static struct regulator_init_data __initdata max8997_ldo2_data = { | ||
140 | .constraints = { | ||
141 | .name = "VDD_ALIVE_1.1V", | ||
142 | .min_uV = 1100000, | ||
143 | .max_uV = 1100000, | ||
144 | .apply_uV = 1, | ||
145 | .always_on = 1, | ||
146 | .state_mem = { | ||
147 | .enabled = 1, | ||
148 | }, | ||
149 | }, | ||
150 | }; | ||
151 | |||
152 | static struct regulator_init_data __initdata max8997_ldo3_data = { | ||
153 | .constraints = { | ||
154 | .name = "VMIPI_1.1V", | ||
155 | .min_uV = 1100000, | ||
156 | .max_uV = 1100000, | ||
157 | .apply_uV = 1, | ||
158 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, | ||
159 | .state_mem = { | ||
160 | .disabled = 1, | ||
161 | }, | ||
162 | }, | ||
163 | .num_consumer_supplies = ARRAY_SIZE(ldo3_consumer), | ||
164 | .consumer_supplies = ldo3_consumer, | ||
165 | }; | ||
166 | |||
167 | static struct regulator_init_data __initdata max8997_ldo4_data = { | ||
168 | .constraints = { | ||
169 | .name = "VDD_RTC_1.8V", | ||
170 | .min_uV = 1800000, | ||
171 | .max_uV = 1800000, | ||
172 | .apply_uV = 1, | ||
173 | .always_on = 1, | ||
174 | .state_mem = { | ||
175 | .disabled = 1, | ||
176 | }, | ||
177 | }, | ||
178 | }; | ||
179 | |||
180 | static struct regulator_init_data __initdata max8997_ldo6_data = { | ||
181 | .constraints = { | ||
182 | .name = "VMIPI_1.8V", | ||
183 | .min_uV = 1800000, | ||
184 | .max_uV = 1800000, | ||
185 | .apply_uV = 1, | ||
186 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, | ||
187 | .state_mem = { | ||
188 | .disabled = 1, | ||
189 | }, | ||
190 | }, | ||
191 | .num_consumer_supplies = ARRAY_SIZE(ldo6_consumer), | ||
192 | .consumer_supplies = ldo6_consumer, | ||
193 | }; | ||
194 | |||
195 | static struct regulator_init_data __initdata max8997_ldo7_data = { | ||
196 | .constraints = { | ||
197 | .name = "VDD_AUD_1.8V", | ||
198 | .min_uV = 1800000, | ||
199 | .max_uV = 1800000, | ||
200 | .apply_uV = 1, | ||
201 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, | ||
202 | .state_mem = { | ||
203 | .disabled = 1, | ||
204 | }, | ||
205 | }, | ||
206 | .num_consumer_supplies = ARRAY_SIZE(ldo7_consumer), | ||
207 | .consumer_supplies = ldo7_consumer, | ||
208 | }; | ||
209 | |||
210 | static struct regulator_init_data __initdata max8997_ldo8_data = { | ||
211 | .constraints = { | ||
212 | .name = "VADC_3.3V", | ||
213 | .min_uV = 3300000, | ||
214 | .max_uV = 3300000, | ||
215 | .apply_uV = 1, | ||
216 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, | ||
217 | .state_mem = { | ||
218 | .disabled = 1, | ||
219 | }, | ||
220 | }, | ||
221 | .num_consumer_supplies = ARRAY_SIZE(ldo8_consumer), | ||
222 | .consumer_supplies = ldo8_consumer, | ||
223 | }; | ||
224 | |||
225 | static struct regulator_init_data __initdata max8997_ldo9_data = { | ||
226 | .constraints = { | ||
227 | .name = "DVDD_SWB_2.8V", | ||
228 | .min_uV = 2800000, | ||
229 | .max_uV = 2800000, | ||
230 | .apply_uV = 1, | ||
231 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, | ||
232 | .state_mem = { | ||
233 | .disabled = 1, | ||
234 | }, | ||
235 | }, | ||
236 | .num_consumer_supplies = ARRAY_SIZE(ldo9_consumer), | ||
237 | .consumer_supplies = ldo9_consumer, | ||
238 | }; | ||
239 | |||
240 | static struct regulator_init_data __initdata max8997_ldo10_data = { | ||
241 | .constraints = { | ||
242 | .name = "VDD_PLL_1.1V", | ||
243 | .min_uV = 1100000, | ||
244 | .max_uV = 1100000, | ||
245 | .apply_uV = 1, | ||
246 | .always_on = 1, | ||
247 | .state_mem = { | ||
248 | .disabled = 1, | ||
249 | }, | ||
250 | }, | ||
251 | }; | ||
252 | |||
253 | static struct regulator_init_data __initdata max8997_ldo11_data = { | ||
254 | .constraints = { | ||
255 | .name = "VDD_AUD_3V", | ||
256 | .min_uV = 3000000, | ||
257 | .max_uV = 3000000, | ||
258 | .apply_uV = 1, | ||
259 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, | ||
260 | .state_mem = { | ||
261 | .disabled = 1, | ||
262 | }, | ||
263 | }, | ||
264 | .num_consumer_supplies = ARRAY_SIZE(ldo11_consumer), | ||
265 | .consumer_supplies = ldo11_consumer, | ||
266 | }; | ||
267 | |||
268 | static struct regulator_init_data __initdata max8997_ldo14_data = { | ||
269 | .constraints = { | ||
270 | .name = "AVDD18_SWB_1.8V", | ||
271 | .min_uV = 1800000, | ||
272 | .max_uV = 1800000, | ||
273 | .apply_uV = 1, | ||
274 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, | ||
275 | .state_mem = { | ||
276 | .disabled = 1, | ||
277 | }, | ||
278 | }, | ||
279 | .num_consumer_supplies = ARRAY_SIZE(ldo14_consumer), | ||
280 | .consumer_supplies = ldo14_consumer, | ||
281 | }; | ||
282 | |||
283 | static struct regulator_init_data __initdata max8997_ldo17_data = { | ||
284 | .constraints = { | ||
285 | .name = "VDD_SWB_3.3V", | ||
286 | .min_uV = 3300000, | ||
287 | .max_uV = 3300000, | ||
288 | .apply_uV = 1, | ||
289 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, | ||
290 | .state_mem = { | ||
291 | .disabled = 1, | ||
292 | }, | ||
293 | }, | ||
294 | .num_consumer_supplies = ARRAY_SIZE(ldo17_consumer), | ||
295 | .consumer_supplies = ldo17_consumer, | ||
296 | }; | ||
297 | |||
298 | static struct regulator_init_data __initdata max8997_ldo21_data = { | ||
299 | .constraints = { | ||
300 | .name = "VDD_MIF_1.2V", | ||
301 | .min_uV = 1200000, | ||
302 | .max_uV = 1200000, | ||
303 | .apply_uV = 1, | ||
304 | .always_on = 1, | ||
305 | .state_mem = { | ||
306 | .disabled = 1, | ||
307 | }, | ||
308 | }, | ||
309 | }; | ||
310 | |||
311 | static struct regulator_init_data __initdata max8997_buck1_data = { | ||
312 | .constraints = { | ||
313 | .name = "VDD_ARM_1.2V", | ||
314 | .min_uV = 950000, | ||
315 | .max_uV = 1350000, | ||
316 | .always_on = 1, | ||
317 | .boot_on = 1, | ||
318 | .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE, | ||
319 | .state_mem = { | ||
320 | .disabled = 1, | ||
321 | }, | ||
322 | }, | ||
323 | .num_consumer_supplies = ARRAY_SIZE(buck1_consumer), | ||
324 | .consumer_supplies = buck1_consumer, | ||
325 | }; | ||
326 | |||
327 | static struct regulator_init_data __initdata max8997_buck2_data = { | ||
328 | .constraints = { | ||
329 | .name = "VDD_INT_1.1V", | ||
330 | .min_uV = 900000, | ||
331 | .max_uV = 1100000, | ||
332 | .always_on = 1, | ||
333 | .boot_on = 1, | ||
334 | .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE, | ||
335 | .state_mem = { | ||
336 | .disabled = 1, | ||
337 | }, | ||
338 | }, | ||
339 | .num_consumer_supplies = ARRAY_SIZE(buck2_consumer), | ||
340 | .consumer_supplies = buck2_consumer, | ||
341 | }; | ||
342 | |||
343 | static struct regulator_init_data __initdata max8997_buck3_data = { | ||
344 | .constraints = { | ||
345 | .name = "VDD_G3D_1.1V", | ||
346 | .min_uV = 900000, | ||
347 | .max_uV = 1100000, | ||
348 | .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | | ||
349 | REGULATOR_CHANGE_STATUS, | ||
350 | .state_mem = { | ||
351 | .disabled = 1, | ||
352 | }, | ||
353 | }, | ||
354 | .num_consumer_supplies = ARRAY_SIZE(buck3_consumer), | ||
355 | .consumer_supplies = buck3_consumer, | ||
356 | }; | ||
357 | |||
358 | static struct regulator_init_data __initdata max8997_buck5_data = { | ||
359 | .constraints = { | ||
360 | .name = "VDDQ_M1M2_1.2V", | ||
361 | .min_uV = 1200000, | ||
362 | .max_uV = 1200000, | ||
363 | .apply_uV = 1, | ||
364 | .always_on = 1, | ||
365 | .state_mem = { | ||
366 | .disabled = 1, | ||
367 | }, | ||
368 | }, | ||
369 | }; | ||
370 | |||
371 | static struct regulator_init_data __initdata max8997_buck7_data = { | ||
372 | .constraints = { | ||
373 | .name = "VDD_LCD_3.3V", | ||
374 | .min_uV = 3300000, | ||
375 | .max_uV = 3300000, | ||
376 | .boot_on = 1, | ||
377 | .apply_uV = 1, | ||
378 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, | ||
379 | .state_mem = { | ||
380 | .disabled = 1 | ||
381 | }, | ||
382 | }, | ||
383 | .num_consumer_supplies = ARRAY_SIZE(buck7_consumer), | ||
384 | .consumer_supplies = buck7_consumer, | ||
385 | }; | ||
386 | |||
387 | static struct max8997_regulator_data __initdata origen_max8997_regulators[] = { | ||
388 | { MAX8997_LDO1, &max8997_ldo1_data }, | ||
389 | { MAX8997_LDO2, &max8997_ldo2_data }, | ||
390 | { MAX8997_LDO3, &max8997_ldo3_data }, | ||
391 | { MAX8997_LDO4, &max8997_ldo4_data }, | ||
392 | { MAX8997_LDO6, &max8997_ldo6_data }, | ||
393 | { MAX8997_LDO7, &max8997_ldo7_data }, | ||
394 | { MAX8997_LDO8, &max8997_ldo8_data }, | ||
395 | { MAX8997_LDO9, &max8997_ldo9_data }, | ||
396 | { MAX8997_LDO10, &max8997_ldo10_data }, | ||
397 | { MAX8997_LDO11, &max8997_ldo11_data }, | ||
398 | { MAX8997_LDO14, &max8997_ldo14_data }, | ||
399 | { MAX8997_LDO17, &max8997_ldo17_data }, | ||
400 | { MAX8997_LDO21, &max8997_ldo21_data }, | ||
401 | { MAX8997_BUCK1, &max8997_buck1_data }, | ||
402 | { MAX8997_BUCK2, &max8997_buck2_data }, | ||
403 | { MAX8997_BUCK3, &max8997_buck3_data }, | ||
404 | { MAX8997_BUCK5, &max8997_buck5_data }, | ||
405 | { MAX8997_BUCK7, &max8997_buck7_data }, | ||
406 | }; | ||
407 | |||
408 | struct max8997_platform_data __initdata origen_max8997_pdata = { | ||
409 | .num_regulators = ARRAY_SIZE(origen_max8997_regulators), | ||
410 | .regulators = origen_max8997_regulators, | ||
411 | |||
412 | .wakeup = true, | ||
413 | .buck1_gpiodvs = false, | ||
414 | .buck2_gpiodvs = false, | ||
415 | .buck5_gpiodvs = false, | ||
416 | .irq_base = IRQ_GPIO_END + 1, | ||
417 | |||
418 | .ignore_gpiodvs_side_effect = true, | ||
419 | .buck125_default_idx = 0x0, | ||
420 | |||
421 | .buck125_gpios[0] = EXYNOS4_GPX0(0), | ||
422 | .buck125_gpios[1] = EXYNOS4_GPX0(1), | ||
423 | .buck125_gpios[2] = EXYNOS4_GPX0(2), | ||
424 | |||
425 | .buck1_voltage[0] = 1350000, | ||
426 | .buck1_voltage[1] = 1300000, | ||
427 | .buck1_voltage[2] = 1250000, | ||
428 | .buck1_voltage[3] = 1200000, | ||
429 | .buck1_voltage[4] = 1150000, | ||
430 | .buck1_voltage[5] = 1100000, | ||
431 | .buck1_voltage[6] = 1000000, | ||
432 | .buck1_voltage[7] = 950000, | ||
433 | |||
434 | .buck2_voltage[0] = 1100000, | ||
435 | .buck2_voltage[1] = 1100000, | ||
436 | .buck2_voltage[2] = 1100000, | ||
437 | .buck2_voltage[3] = 1100000, | ||
438 | .buck2_voltage[4] = 1000000, | ||
439 | .buck2_voltage[5] = 1000000, | ||
440 | .buck2_voltage[6] = 1000000, | ||
441 | .buck2_voltage[7] = 1000000, | ||
442 | |||
443 | .buck5_voltage[0] = 1200000, | ||
444 | .buck5_voltage[1] = 1200000, | ||
445 | .buck5_voltage[2] = 1200000, | ||
446 | .buck5_voltage[3] = 1200000, | ||
447 | .buck5_voltage[4] = 1200000, | ||
448 | .buck5_voltage[5] = 1200000, | ||
449 | .buck5_voltage[6] = 1200000, | ||
450 | .buck5_voltage[7] = 1200000, | ||
451 | }; | ||
452 | |||
453 | /* I2C0 */ | ||
454 | static struct i2c_board_info i2c0_devs[] __initdata = { | ||
455 | { | ||
456 | I2C_BOARD_INFO("max8997", (0xCC >> 1)), | ||
457 | .platform_data = &origen_max8997_pdata, | ||
458 | .irq = IRQ_EINT(4), | ||
459 | }, | ||
460 | }; | ||
461 | |||
462 | static struct s3c_sdhci_platdata origen_hsmmc0_pdata __initdata = { | ||
463 | .cd_type = S3C_SDHCI_CD_INTERNAL, | ||
464 | .clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL, | ||
465 | }; | ||
466 | |||
75 | static struct s3c_sdhci_platdata origen_hsmmc2_pdata __initdata = { | 467 | static struct s3c_sdhci_platdata origen_hsmmc2_pdata __initdata = { |
76 | .cd_type = S3C_SDHCI_CD_GPIO, | 468 | .cd_type = S3C_SDHCI_CD_INTERNAL, |
77 | .ext_cd_gpio = EXYNOS4_GPK2(2), | ||
78 | .ext_cd_gpio_invert = 1, | ||
79 | .clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL, | 469 | .clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL, |
80 | }; | 470 | }; |
81 | 471 | ||
472 | /* USB EHCI */ | ||
473 | static struct s5p_ehci_platdata origen_ehci_pdata; | ||
474 | |||
475 | static void __init origen_ehci_init(void) | ||
476 | { | ||
477 | struct s5p_ehci_platdata *pdata = &origen_ehci_pdata; | ||
478 | |||
479 | s5p_ehci_set_platdata(pdata); | ||
480 | } | ||
481 | |||
482 | static struct gpio_keys_button origen_gpio_keys_table[] = { | ||
483 | { | ||
484 | .code = KEY_MENU, | ||
485 | .gpio = EXYNOS4_GPX1(5), | ||
486 | .desc = "gpio-keys: KEY_MENU", | ||
487 | .type = EV_KEY, | ||
488 | .active_low = 1, | ||
489 | .wakeup = 1, | ||
490 | .debounce_interval = 1, | ||
491 | }, { | ||
492 | .code = KEY_HOME, | ||
493 | .gpio = EXYNOS4_GPX1(6), | ||
494 | .desc = "gpio-keys: KEY_HOME", | ||
495 | .type = EV_KEY, | ||
496 | .active_low = 1, | ||
497 | .wakeup = 1, | ||
498 | .debounce_interval = 1, | ||
499 | }, { | ||
500 | .code = KEY_BACK, | ||
501 | .gpio = EXYNOS4_GPX1(7), | ||
502 | .desc = "gpio-keys: KEY_BACK", | ||
503 | .type = EV_KEY, | ||
504 | .active_low = 1, | ||
505 | .wakeup = 1, | ||
506 | .debounce_interval = 1, | ||
507 | }, { | ||
508 | .code = KEY_UP, | ||
509 | .gpio = EXYNOS4_GPX2(0), | ||
510 | .desc = "gpio-keys: KEY_UP", | ||
511 | .type = EV_KEY, | ||
512 | .active_low = 1, | ||
513 | .wakeup = 1, | ||
514 | .debounce_interval = 1, | ||
515 | }, { | ||
516 | .code = KEY_DOWN, | ||
517 | .gpio = EXYNOS4_GPX2(1), | ||
518 | .desc = "gpio-keys: KEY_DOWN", | ||
519 | .type = EV_KEY, | ||
520 | .active_low = 1, | ||
521 | .wakeup = 1, | ||
522 | .debounce_interval = 1, | ||
523 | }, | ||
524 | }; | ||
525 | |||
526 | static struct gpio_keys_platform_data origen_gpio_keys_data = { | ||
527 | .buttons = origen_gpio_keys_table, | ||
528 | .nbuttons = ARRAY_SIZE(origen_gpio_keys_table), | ||
529 | }; | ||
530 | |||
531 | static struct platform_device origen_device_gpiokeys = { | ||
532 | .name = "gpio-keys", | ||
533 | .dev = { | ||
534 | .platform_data = &origen_gpio_keys_data, | ||
535 | }, | ||
536 | }; | ||
537 | |||
538 | static void lcd_hv070wsa_set_power(struct plat_lcd_data *pd, unsigned int power) | ||
539 | { | ||
540 | int ret; | ||
541 | |||
542 | if (power) | ||
543 | ret = gpio_request_one(EXYNOS4_GPE3(4), | ||
544 | GPIOF_OUT_INIT_HIGH, "GPE3_4"); | ||
545 | else | ||
546 | ret = gpio_request_one(EXYNOS4_GPE3(4), | ||
547 | GPIOF_OUT_INIT_LOW, "GPE3_4"); | ||
548 | |||
549 | gpio_free(EXYNOS4_GPE3(4)); | ||
550 | |||
551 | if (ret) | ||
552 | pr_err("failed to request gpio for LCD power: %d\n", ret); | ||
553 | } | ||
554 | |||
555 | static struct plat_lcd_data origen_lcd_hv070wsa_data = { | ||
556 | .set_power = lcd_hv070wsa_set_power, | ||
557 | }; | ||
558 | |||
559 | static struct platform_device origen_lcd_hv070wsa = { | ||
560 | .name = "platform-lcd", | ||
561 | .dev.parent = &s5p_device_fimd0.dev, | ||
562 | .dev.platform_data = &origen_lcd_hv070wsa_data, | ||
563 | }; | ||
564 | |||
565 | static struct s3c_fb_pd_win origen_fb_win0 = { | ||
566 | .win_mode = { | ||
567 | .left_margin = 64, | ||
568 | .right_margin = 16, | ||
569 | .upper_margin = 64, | ||
570 | .lower_margin = 16, | ||
571 | .hsync_len = 48, | ||
572 | .vsync_len = 3, | ||
573 | .xres = 1024, | ||
574 | .yres = 600, | ||
575 | }, | ||
576 | .max_bpp = 32, | ||
577 | .default_bpp = 24, | ||
578 | }; | ||
579 | |||
580 | static struct s3c_fb_platdata origen_lcd_pdata __initdata = { | ||
581 | .win[0] = &origen_fb_win0, | ||
582 | .vidcon0 = VIDCON0_VIDOUT_RGB | VIDCON0_PNRMODE_RGB, | ||
583 | .vidcon1 = VIDCON1_INV_HSYNC | VIDCON1_INV_VSYNC, | ||
584 | .setup_gpio = exynos4_fimd0_gpio_setup_24bpp, | ||
585 | }; | ||
586 | |||
82 | static struct platform_device *origen_devices[] __initdata = { | 587 | static struct platform_device *origen_devices[] __initdata = { |
83 | &s3c_device_hsmmc2, | 588 | &s3c_device_hsmmc2, |
589 | &s3c_device_hsmmc0, | ||
590 | &s3c_device_i2c0, | ||
84 | &s3c_device_rtc, | 591 | &s3c_device_rtc, |
85 | &s3c_device_wdt, | 592 | &s3c_device_wdt, |
593 | &s5p_device_ehci, | ||
594 | &s5p_device_fimc0, | ||
595 | &s5p_device_fimc1, | ||
596 | &s5p_device_fimc2, | ||
597 | &s5p_device_fimc3, | ||
598 | &s5p_device_fimd0, | ||
599 | &s5p_device_hdmi, | ||
600 | &s5p_device_i2c_hdmiphy, | ||
601 | &s5p_device_mixer, | ||
602 | &exynos4_device_pd[PD_LCD0], | ||
603 | &exynos4_device_pd[PD_TV], | ||
604 | &origen_device_gpiokeys, | ||
605 | &origen_lcd_hv070wsa, | ||
606 | }; | ||
607 | |||
608 | /* LCD Backlight data */ | ||
609 | static struct samsung_bl_gpio_info origen_bl_gpio_info = { | ||
610 | .no = EXYNOS4_GPD0(0), | ||
611 | .func = S3C_GPIO_SFN(2), | ||
86 | }; | 612 | }; |
87 | 613 | ||
614 | static struct platform_pwm_backlight_data origen_bl_data = { | ||
615 | .pwm_id = 0, | ||
616 | .pwm_period_ns = 1000, | ||
617 | }; | ||
618 | |||
619 | static void s5p_tv_setup(void) | ||
620 | { | ||
621 | /* Direct HPD to HDMI chip */ | ||
622 | gpio_request_one(EXYNOS4_GPX3(7), GPIOF_IN, "hpd-plug"); | ||
623 | s3c_gpio_cfgpin(EXYNOS4_GPX3(7), S3C_GPIO_SFN(0x3)); | ||
624 | s3c_gpio_setpull(EXYNOS4_GPX3(7), S3C_GPIO_PULL_NONE); | ||
625 | } | ||
626 | |||
88 | static void __init origen_map_io(void) | 627 | static void __init origen_map_io(void) |
89 | { | 628 | { |
90 | s5p_init_io(NULL, 0, S5P_VA_CHIPID); | 629 | s5p_init_io(NULL, 0, S5P_VA_CHIPID); |
@@ -92,10 +631,42 @@ static void __init origen_map_io(void) | |||
92 | s3c24xx_init_uarts(origen_uartcfgs, ARRAY_SIZE(origen_uartcfgs)); | 631 | s3c24xx_init_uarts(origen_uartcfgs, ARRAY_SIZE(origen_uartcfgs)); |
93 | } | 632 | } |
94 | 633 | ||
634 | static void __init origen_power_init(void) | ||
635 | { | ||
636 | gpio_request(EXYNOS4_GPX0(4), "PMIC_IRQ"); | ||
637 | s3c_gpio_cfgpin(EXYNOS4_GPX0(4), S3C_GPIO_SFN(0xf)); | ||
638 | s3c_gpio_setpull(EXYNOS4_GPX0(4), S3C_GPIO_PULL_NONE); | ||
639 | } | ||
640 | |||
95 | static void __init origen_machine_init(void) | 641 | static void __init origen_machine_init(void) |
96 | { | 642 | { |
643 | origen_power_init(); | ||
644 | |||
645 | s3c_i2c0_set_platdata(NULL); | ||
646 | i2c_register_board_info(0, i2c0_devs, ARRAY_SIZE(i2c0_devs)); | ||
647 | |||
648 | /* | ||
649 | * Since sdhci instance 2 can contain a bootable media, | ||
650 | * sdhci instance 0 is registered after instance 2. | ||
651 | */ | ||
97 | s3c_sdhci2_set_platdata(&origen_hsmmc2_pdata); | 652 | s3c_sdhci2_set_platdata(&origen_hsmmc2_pdata); |
653 | s3c_sdhci0_set_platdata(&origen_hsmmc0_pdata); | ||
654 | |||
655 | origen_ehci_init(); | ||
656 | clk_xusbxti.rate = 24000000; | ||
657 | |||
658 | s5p_tv_setup(); | ||
659 | s5p_i2c_hdmiphy_set_platdata(NULL); | ||
660 | |||
661 | s5p_fimd0_set_platdata(&origen_lcd_pdata); | ||
662 | |||
98 | platform_add_devices(origen_devices, ARRAY_SIZE(origen_devices)); | 663 | platform_add_devices(origen_devices, ARRAY_SIZE(origen_devices)); |
664 | s5p_device_fimd0.dev.parent = &exynos4_device_pd[PD_LCD0].dev; | ||
665 | |||
666 | s5p_device_hdmi.dev.parent = &exynos4_device_pd[PD_TV].dev; | ||
667 | s5p_device_mixer.dev.parent = &exynos4_device_pd[PD_TV].dev; | ||
668 | |||
669 | samsung_bl_set(&origen_bl_gpio_info, &origen_bl_data); | ||
99 | } | 670 | } |
100 | 671 | ||
101 | MACHINE_START(ORIGEN, "ORIGEN") | 672 | MACHINE_START(ORIGEN, "ORIGEN") |