1 /* linux/arch/arm/mach-s5pv210/mach-goni.c
2  *
3  * Copyright (c) 2010 Samsung Electronics Co., Ltd.
4  *		http://www.samsung.com/
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9 */
10 
11 #include <linux/kernel.h>
12 #include <linux/types.h>
13 #include <linux/init.h>
14 #include <linux/serial_core.h>
15 #include <linux/fb.h>
16 #include <linux/i2c.h>
17 #include <linux/i2c-gpio.h>
18 #include <linux/i2c/atmel_mxt_ts.h>
19 #include <linux/mfd/max8998.h>
20 #include <linux/mfd/wm8994/pdata.h>
21 #include <linux/regulator/fixed.h>
22 #include <linux/spi/spi.h>
23 #include <linux/spi/spi_gpio.h>
24 #include <linux/lcd.h>
25 #include <linux/gpio_keys.h>
26 #include <linux/input.h>
27 #include <linux/gpio.h>
28 #include <linux/interrupt.h>
29 
30 #include <asm/hardware/vic.h>
31 #include <asm/mach/arch.h>
32 #include <asm/mach/map.h>
33 #include <asm/setup.h>
34 #include <asm/mach-types.h>
35 
36 #include <mach/map.h>
37 #include <mach/regs-clock.h>
38 
39 #include <plat/gpio-cfg.h>
40 #include <plat/regs-serial.h>
41 #include <plat/devs.h>
42 #include <plat/cpu.h>
43 #include <plat/fb.h>
44 #include <plat/iic.h>
45 #include <plat/keypad.h>
46 #include <plat/sdhci.h>
47 #include <plat/clock.h>
48 #include <plat/s5p-time.h>
49 #include <plat/mfc.h>
50 #include <plat/regs-fb-v4.h>
51 #include <plat/camport.h>
52 
53 #include <media/v4l2-mediabus.h>
54 #include <media/s5p_fimc.h>
55 #include <media/noon010pc30.h>
56 
57 #include "common.h"
58 
59 /* Following are default values for UCON, ULCON and UFCON UART registers */
60 #define GONI_UCON_DEFAULT	(S3C2410_UCON_TXILEVEL |	\
61 				 S3C2410_UCON_RXILEVEL |	\
62 				 S3C2410_UCON_TXIRQMODE |	\
63 				 S3C2410_UCON_RXIRQMODE |	\
64 				 S3C2410_UCON_RXFIFO_TOI |	\
65 				 S3C2443_UCON_RXERR_IRQEN)
66 
67 #define GONI_ULCON_DEFAULT	S3C2410_LCON_CS8
68 
69 #define GONI_UFCON_DEFAULT	S3C2410_UFCON_FIFOMODE
70 
71 static struct s3c2410_uartcfg goni_uartcfgs[] __initdata = {
72 	[0] = {
73 		.hwport		= 0,
74 		.flags		= 0,
75 		.ucon		= GONI_UCON_DEFAULT,
76 		.ulcon		= GONI_ULCON_DEFAULT,
77 		.ufcon		= GONI_UFCON_DEFAULT |
78 			S5PV210_UFCON_TXTRIG256 | S5PV210_UFCON_RXTRIG256,
79 	},
80 	[1] = {
81 		.hwport		= 1,
82 		.flags		= 0,
83 		.ucon		= GONI_UCON_DEFAULT,
84 		.ulcon		= GONI_ULCON_DEFAULT,
85 		.ufcon		= GONI_UFCON_DEFAULT |
86 			S5PV210_UFCON_TXTRIG64 | S5PV210_UFCON_RXTRIG64,
87 	},
88 	[2] = {
89 		.hwport		= 2,
90 		.flags		= 0,
91 		.ucon		= GONI_UCON_DEFAULT,
92 		.ulcon		= GONI_ULCON_DEFAULT,
93 		.ufcon		= GONI_UFCON_DEFAULT |
94 			S5PV210_UFCON_TXTRIG16 | S5PV210_UFCON_RXTRIG16,
95 	},
96 	[3] = {
97 		.hwport		= 3,
98 		.flags		= 0,
99 		.ucon		= GONI_UCON_DEFAULT,
100 		.ulcon		= GONI_ULCON_DEFAULT,
101 		.ufcon		= GONI_UFCON_DEFAULT |
102 			S5PV210_UFCON_TXTRIG16 | S5PV210_UFCON_RXTRIG16,
103 	},
104 };
105 
106 /* Frame Buffer */
107 static struct s3c_fb_pd_win goni_fb_win0 = {
108 	.win_mode = {
109 		.left_margin	= 16,
110 		.right_margin	= 16,
111 		.upper_margin	= 2,
112 		.lower_margin	= 28,
113 		.hsync_len	= 2,
114 		.vsync_len	= 1,
115 		.xres		= 480,
116 		.yres		= 800,
117 		.refresh	= 55,
118 	},
119 	.max_bpp	= 32,
120 	.default_bpp	= 16,
121 	.virtual_x	= 480,
122 	.virtual_y	= 2 * 800,
123 };
124 
125 static struct s3c_fb_platdata goni_lcd_pdata __initdata = {
126 	.win[0]		= &goni_fb_win0,
127 	.vidcon0	= VIDCON0_VIDOUT_RGB | VIDCON0_PNRMODE_RGB |
128 			  VIDCON0_CLKSEL_LCD,
129 	.vidcon1	= VIDCON1_INV_VCLK | VIDCON1_INV_VDEN
130 			  | VIDCON1_INV_HSYNC | VIDCON1_INV_VSYNC,
131 	.setup_gpio	= s5pv210_fb_gpio_setup_24bpp,
132 };
133 
lcd_power_on(struct lcd_device * ld,int enable)134 static int lcd_power_on(struct lcd_device *ld, int enable)
135 {
136 	return 1;
137 }
138 
reset_lcd(struct lcd_device * ld)139 static int reset_lcd(struct lcd_device *ld)
140 {
141 	static unsigned int first = 1;
142 	int reset_gpio = -1;
143 
144 	reset_gpio = S5PV210_MP05(5);
145 
146 	if (first) {
147 		gpio_request(reset_gpio, "MLCD_RST");
148 		first = 0;
149 	}
150 
151 	gpio_direction_output(reset_gpio, 1);
152 	return 1;
153 }
154 
155 static struct lcd_platform_data goni_lcd_platform_data = {
156 	.reset			= reset_lcd,
157 	.power_on		= lcd_power_on,
158 	.lcd_enabled		= 0,
159 	.reset_delay		= 120,	/* 120ms */
160 	.power_on_delay		= 25,	/* 25ms */
161 	.power_off_delay	= 200,	/* 200ms */
162 };
163 
164 #define LCD_BUS_NUM	3
165 static struct spi_board_info spi_board_info[] __initdata = {
166 	{
167 		.modalias	= "s6e63m0",
168 		.platform_data	= &goni_lcd_platform_data,
169 		.max_speed_hz	= 1200000,
170 		.bus_num	= LCD_BUS_NUM,
171 		.chip_select	= 0,
172 		.mode		= SPI_MODE_3,
173 		.controller_data = (void *)S5PV210_MP01(1), /* DISPLAY_CS */
174 	},
175 };
176 
177 static struct spi_gpio_platform_data lcd_spi_gpio_data = {
178 	.sck	= S5PV210_MP04(1), /* DISPLAY_CLK */
179 	.mosi	= S5PV210_MP04(3), /* DISPLAY_SI */
180 	.miso	= SPI_GPIO_NO_MISO,
181 	.num_chipselect	= 1,
182 };
183 
184 static struct platform_device goni_spi_gpio = {
185 	.name	= "spi_gpio",
186 	.id	= LCD_BUS_NUM,
187 	.dev	= {
188 		.parent		= &s3c_device_fb.dev,
189 		.platform_data	= &lcd_spi_gpio_data,
190 	},
191 };
192 
193 /* KEYPAD */
194 static uint32_t keymap[] __initdata = {
195 	/* KEY(row, col, keycode) */
196 	KEY(0, 1, KEY_MENU),		/* Send */
197 	KEY(0, 2, KEY_BACK),		/* End */
198 	KEY(1, 1, KEY_CONFIG),		/* Half shot */
199 	KEY(1, 2, KEY_VOLUMEUP),
200 	KEY(2, 1, KEY_CAMERA),		/* Full shot */
201 	KEY(2, 2, KEY_VOLUMEDOWN),
202 };
203 
204 static struct matrix_keymap_data keymap_data __initdata = {
205 	.keymap		= keymap,
206 	.keymap_size	= ARRAY_SIZE(keymap),
207 };
208 
209 static struct samsung_keypad_platdata keypad_data __initdata = {
210 	.keymap_data	= &keymap_data,
211 	.rows		= 3,
212 	.cols		= 3,
213 };
214 
215 /* Radio */
216 static struct i2c_board_info i2c1_devs[] __initdata = {
217 	{
218 		I2C_BOARD_INFO("si470x", 0x10),
219 	},
220 };
221 
goni_radio_init(void)222 static void __init goni_radio_init(void)
223 {
224 	int gpio;
225 
226 	gpio = S5PV210_GPJ2(4);			/* XMSMDATA_4 */
227 	gpio_request(gpio, "FM_INT");
228 	s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(0xf));
229 	i2c1_devs[0].irq = gpio_to_irq(gpio);
230 
231 	gpio = S5PV210_GPJ2(5);			/* XMSMDATA_5 */
232 	gpio_request_one(gpio, GPIOF_OUT_INIT_HIGH, "FM_RST");
233 }
234 
235 /* TSP */
236 static struct mxt_platform_data qt602240_platform_data = {
237 	.x_line		= 17,
238 	.y_line		= 11,
239 	.x_size		= 800,
240 	.y_size		= 480,
241 	.blen		= 0x21,
242 	.threshold	= 0x28,
243 	.voltage	= 2800000,              /* 2.8V */
244 	.orient		= MXT_DIAGONAL,
245 	.irqflags	= IRQF_TRIGGER_FALLING,
246 };
247 
248 static struct s3c2410_platform_i2c i2c2_data __initdata = {
249 	.flags		= 0,
250 	.bus_num	= 2,
251 	.slave_addr	= 0x10,
252 	.frequency	= 400 * 1000,
253 	.sda_delay	= 100,
254 };
255 
256 static struct i2c_board_info i2c2_devs[] __initdata = {
257 	{
258 		I2C_BOARD_INFO("qt602240_ts", 0x4a),
259 		.platform_data = &qt602240_platform_data,
260 	},
261 };
262 
goni_tsp_init(void)263 static void __init goni_tsp_init(void)
264 {
265 	int gpio;
266 
267 	gpio = S5PV210_GPJ1(3);		/* XMSMADDR_11 */
268 	gpio_request_one(gpio, GPIOF_OUT_INIT_HIGH, "TSP_LDO_ON");
269 	gpio_export(gpio, 0);
270 
271 	gpio = S5PV210_GPJ0(5);		/* XMSMADDR_5 */
272 	gpio_request(gpio, "TSP_INT");
273 
274 	s5p_register_gpio_interrupt(gpio);
275 	s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(0xf));
276 	s3c_gpio_setpull(gpio, S3C_GPIO_PULL_UP);
277 	i2c2_devs[0].irq = gpio_to_irq(gpio);
278 }
279 
goni_camera_init(void)280 static void goni_camera_init(void)
281 {
282 	s5pv210_fimc_setup_gpio(S5P_CAMPORT_A);
283 
284 	/* Set max driver strength on CAM_A_CLKOUT pin. */
285 	s5p_gpio_set_drvstr(S5PV210_GPE1(3), S5P_GPIO_DRVSTR_LV4);
286 }
287 
288 /* MAX8998 regulators */
289 #if defined(CONFIG_REGULATOR_MAX8998) || defined(CONFIG_REGULATOR_MAX8998_MODULE)
290 
291 static struct regulator_consumer_supply goni_ldo3_consumers[] = {
292 	REGULATOR_SUPPLY("vusb_a", "s3c-hsotg"),
293 };
294 
295 static struct regulator_consumer_supply goni_ldo5_consumers[] = {
296 	REGULATOR_SUPPLY("vmmc", "s3c-sdhci.0"),
297 };
298 
299 static struct regulator_consumer_supply goni_ldo8_consumers[] = {
300 	REGULATOR_SUPPLY("vusb_d", "s3c-hsotg"),
301 	REGULATOR_SUPPLY("vdd33a_dac", "s5p-sdo"),
302 };
303 
304 static struct regulator_consumer_supply goni_ldo11_consumers[] = {
305 	REGULATOR_SUPPLY("vddio", "0-0030"), /* "CAM_IO_2.8V" */
306 };
307 
308 static struct regulator_consumer_supply goni_ldo13_consumers[] = {
309 	REGULATOR_SUPPLY("vdda", "0-0030"), /* "CAM_A_2.8V" */
310 };
311 
312 static struct regulator_consumer_supply goni_ldo14_consumers[] = {
313 	REGULATOR_SUPPLY("vdd_core", "0-0030"), /* "CAM_CIF_1.8V" */
314 };
315 
316 static struct regulator_init_data goni_ldo2_data = {
317 	.constraints	= {
318 		.name		= "VALIVE_1.1V",
319 		.min_uV		= 1100000,
320 		.max_uV		= 1100000,
321 		.apply_uV	= 1,
322 		.always_on	= 1,
323 		.state_mem	= {
324 			.enabled = 1,
325 		},
326 	},
327 };
328 
329 static struct regulator_init_data goni_ldo3_data = {
330 	.constraints	= {
331 		.name		= "VUSB+MIPI_1.1V",
332 		.min_uV		= 1100000,
333 		.max_uV		= 1100000,
334 		.apply_uV	= 1,
335 		.valid_ops_mask	= REGULATOR_CHANGE_STATUS,
336 	},
337 	.num_consumer_supplies = ARRAY_SIZE(goni_ldo3_consumers),
338 	.consumer_supplies = goni_ldo3_consumers,
339 };
340 
341 static struct regulator_init_data goni_ldo4_data = {
342 	.constraints	= {
343 		.name		= "VDAC_3.3V",
344 		.min_uV		= 3300000,
345 		.max_uV		= 3300000,
346 		.apply_uV	= 1,
347 	},
348 };
349 
350 static struct regulator_init_data goni_ldo5_data = {
351 	.constraints	= {
352 		.name		= "VTF_2.8V",
353 		.min_uV		= 2800000,
354 		.max_uV		= 2800000,
355 		.apply_uV	= 1,
356 		.valid_ops_mask	= REGULATOR_CHANGE_STATUS,
357 	},
358 	.num_consumer_supplies = ARRAY_SIZE(goni_ldo5_consumers),
359 	.consumer_supplies = goni_ldo5_consumers,
360 };
361 
362 static struct regulator_init_data goni_ldo6_data = {
363 	.constraints	= {
364 		.name		= "VCC_3.3V",
365 		.min_uV		= 3300000,
366 		.max_uV		= 3300000,
367 		.apply_uV	= 1,
368 	},
369 };
370 
371 static struct regulator_init_data goni_ldo7_data = {
372 	.constraints	= {
373 		.name		= "VLCD_1.8V",
374 		.min_uV		= 1800000,
375 		.max_uV		= 1800000,
376 		.apply_uV	= 1,
377 		.always_on	= 1,
378 	},
379 };
380 
381 static struct regulator_init_data goni_ldo8_data = {
382 	.constraints	= {
383 		.name		= "VUSB+VADC_3.3V",
384 		.min_uV		= 3300000,
385 		.max_uV		= 3300000,
386 		.apply_uV	= 1,
387 		.valid_ops_mask	= REGULATOR_CHANGE_STATUS,
388 	},
389 	.num_consumer_supplies = ARRAY_SIZE(goni_ldo8_consumers),
390 	.consumer_supplies = goni_ldo8_consumers,
391 };
392 
393 static struct regulator_init_data goni_ldo9_data = {
394 	.constraints	= {
395 		.name		= "VCC+VCAM_2.8V",
396 		.min_uV		= 2800000,
397 		.max_uV		= 2800000,
398 		.apply_uV	= 1,
399 	},
400 };
401 
402 static struct regulator_init_data goni_ldo10_data = {
403 	.constraints	= {
404 		.name		= "VPLL_1.1V",
405 		.min_uV		= 1100000,
406 		.max_uV		= 1100000,
407 		.apply_uV	= 1,
408 		.boot_on	= 1,
409 	},
410 };
411 
412 static struct regulator_init_data goni_ldo11_data = {
413 	.constraints	= {
414 		.name		= "CAM_IO_2.8V",
415 		.min_uV		= 2800000,
416 		.max_uV		= 2800000,
417 		.apply_uV	= 1,
418 		.valid_ops_mask	= REGULATOR_CHANGE_STATUS,
419 	},
420 	.num_consumer_supplies	= ARRAY_SIZE(goni_ldo11_consumers),
421 	.consumer_supplies	= goni_ldo11_consumers,
422 };
423 
424 static struct regulator_init_data goni_ldo12_data = {
425 	.constraints	= {
426 		.name		= "CAM_ISP_1.2V",
427 		.min_uV		= 1200000,
428 		.max_uV		= 1200000,
429 		.apply_uV	= 1,
430 	},
431 };
432 
433 static struct regulator_init_data goni_ldo13_data = {
434 	.constraints	= {
435 		.name		= "CAM_A_2.8V",
436 		.min_uV		= 2800000,
437 		.max_uV		= 2800000,
438 		.apply_uV	= 1,
439 		.valid_ops_mask	= REGULATOR_CHANGE_STATUS,
440 	},
441 	.num_consumer_supplies	= ARRAY_SIZE(goni_ldo13_consumers),
442 	.consumer_supplies	= goni_ldo13_consumers,
443 };
444 
445 static struct regulator_init_data goni_ldo14_data = {
446 	.constraints	= {
447 		.name		= "CAM_CIF_1.8V",
448 		.min_uV		= 1800000,
449 		.max_uV		= 1800000,
450 		.apply_uV	= 1,
451 		.valid_ops_mask	= REGULATOR_CHANGE_STATUS,
452 	},
453 	.num_consumer_supplies	= ARRAY_SIZE(goni_ldo14_consumers),
454 	.consumer_supplies	= goni_ldo14_consumers,
455 };
456 
457 static struct regulator_init_data goni_ldo15_data = {
458 	.constraints	= {
459 		.name		= "CAM_AF_3.3V",
460 		.min_uV		= 3300000,
461 		.max_uV		= 3300000,
462 		.apply_uV	= 1,
463 	},
464 };
465 
466 static struct regulator_init_data goni_ldo16_data = {
467 	.constraints	= {
468 		.name		= "VMIPI_1.8V",
469 		.min_uV		= 1800000,
470 		.max_uV		= 1800000,
471 		.apply_uV	= 1,
472 	},
473 };
474 
475 static struct regulator_init_data goni_ldo17_data = {
476 	.constraints	= {
477 		.name		= "VCC_3.0V_LCD",
478 		.min_uV		= 3000000,
479 		.max_uV		= 3000000,
480 		.apply_uV	= 1,
481 		.always_on	= 1,
482 	},
483 };
484 
485 /* BUCK */
486 static struct regulator_consumer_supply buck1_consumer =
487 	REGULATOR_SUPPLY("vddarm", NULL);
488 
489 static struct regulator_consumer_supply buck2_consumer =
490 	REGULATOR_SUPPLY("vddint", NULL);
491 
492 static struct regulator_consumer_supply buck3_consumer =
493 	REGULATOR_SUPPLY("vdet", "s5p-sdo");
494 
495 
496 static struct regulator_init_data goni_buck1_data = {
497 	.constraints	= {
498 		.name		= "VARM_1.2V",
499 		.min_uV		= 1200000,
500 		.max_uV		= 1200000,
501 		.apply_uV	= 1,
502 		.valid_ops_mask	= REGULATOR_CHANGE_VOLTAGE |
503 				  REGULATOR_CHANGE_STATUS,
504 	},
505 	.num_consumer_supplies	= 1,
506 	.consumer_supplies	= &buck1_consumer,
507 };
508 
509 static struct regulator_init_data goni_buck2_data = {
510 	.constraints	= {
511 		.name		= "VINT_1.2V",
512 		.min_uV		= 1200000,
513 		.max_uV		= 1200000,
514 		.apply_uV	= 1,
515 		.valid_ops_mask	= REGULATOR_CHANGE_VOLTAGE |
516 				  REGULATOR_CHANGE_STATUS,
517 	},
518 	.num_consumer_supplies	= 1,
519 	.consumer_supplies	= &buck2_consumer,
520 };
521 
522 static struct regulator_init_data goni_buck3_data = {
523 	.constraints	= {
524 		.name		= "VCC_1.8V",
525 		.min_uV		= 1800000,
526 		.max_uV		= 1800000,
527 		.apply_uV	= 1,
528 		.state_mem	= {
529 			.enabled = 1,
530 		},
531 	},
532 	.num_consumer_supplies	= 1,
533 	.consumer_supplies	= &buck3_consumer,
534 };
535 
536 static struct regulator_init_data goni_buck4_data = {
537 	.constraints	= {
538 		.name		= "CAM_CORE_1.2V",
539 		.min_uV		= 1200000,
540 		.max_uV		= 1200000,
541 		.apply_uV	= 1,
542 		.always_on	= 1,
543 	},
544 };
545 
546 static struct max8998_regulator_data goni_regulators[] = {
547 	{ MAX8998_LDO2,  &goni_ldo2_data },
548 	{ MAX8998_LDO3,  &goni_ldo3_data },
549 	{ MAX8998_LDO4,  &goni_ldo4_data },
550 	{ MAX8998_LDO5,  &goni_ldo5_data },
551 	{ MAX8998_LDO6,  &goni_ldo6_data },
552 	{ MAX8998_LDO7,  &goni_ldo7_data },
553 	{ MAX8998_LDO8,  &goni_ldo8_data },
554 	{ MAX8998_LDO9,  &goni_ldo9_data },
555 	{ MAX8998_LDO10, &goni_ldo10_data },
556 	{ MAX8998_LDO11, &goni_ldo11_data },
557 	{ MAX8998_LDO12, &goni_ldo12_data },
558 	{ MAX8998_LDO13, &goni_ldo13_data },
559 	{ MAX8998_LDO14, &goni_ldo14_data },
560 	{ MAX8998_LDO15, &goni_ldo15_data },
561 	{ MAX8998_LDO16, &goni_ldo16_data },
562 	{ MAX8998_LDO17, &goni_ldo17_data },
563 	{ MAX8998_BUCK1, &goni_buck1_data },
564 	{ MAX8998_BUCK2, &goni_buck2_data },
565 	{ MAX8998_BUCK3, &goni_buck3_data },
566 	{ MAX8998_BUCK4, &goni_buck4_data },
567 };
568 
569 static struct max8998_platform_data goni_max8998_pdata = {
570 	.num_regulators	= ARRAY_SIZE(goni_regulators),
571 	.regulators	= goni_regulators,
572 	.buck1_set1	= S5PV210_GPH0(3),
573 	.buck1_set2	= S5PV210_GPH0(4),
574 	.buck2_set3	= S5PV210_GPH0(5),
575 	.buck1_voltage1	= 1200000,
576 	.buck1_voltage2	= 1200000,
577 	.buck1_voltage3	= 1200000,
578 	.buck1_voltage4	= 1200000,
579 	.buck2_voltage1	= 1200000,
580 	.buck2_voltage2	= 1200000,
581 };
582 #endif
583 
584 static struct regulator_consumer_supply wm8994_fixed_voltage0_supplies[] = {
585 	REGULATOR_SUPPLY("DBVDD", "5-001a"),
586 	REGULATOR_SUPPLY("AVDD2", "5-001a"),
587 	REGULATOR_SUPPLY("CPVDD", "5-001a"),
588 };
589 
590 static struct regulator_consumer_supply wm8994_fixed_voltage1_supplies[] = {
591 	REGULATOR_SUPPLY("SPKVDD1", "5-001a"),
592 	REGULATOR_SUPPLY("SPKVDD2", "5-001a"),
593 };
594 
595 static struct regulator_init_data wm8994_fixed_voltage0_init_data = {
596 	.constraints = {
597 		.always_on = 1,
598 	},
599 	.num_consumer_supplies	= ARRAY_SIZE(wm8994_fixed_voltage0_supplies),
600 	.consumer_supplies	= wm8994_fixed_voltage0_supplies,
601 };
602 
603 static struct regulator_init_data wm8994_fixed_voltage1_init_data = {
604 	.constraints = {
605 		.always_on = 1,
606 	},
607 	.num_consumer_supplies	= ARRAY_SIZE(wm8994_fixed_voltage1_supplies),
608 	.consumer_supplies	= wm8994_fixed_voltage1_supplies,
609 };
610 
611 static struct fixed_voltage_config wm8994_fixed_voltage0_config = {
612 	.supply_name	= "VCC_1.8V_PDA",
613 	.microvolts	= 1800000,
614 	.gpio		= -EINVAL,
615 	.init_data	= &wm8994_fixed_voltage0_init_data,
616 };
617 
618 static struct fixed_voltage_config wm8994_fixed_voltage1_config = {
619 	.supply_name	= "V_BAT",
620 	.microvolts	= 3700000,
621 	.gpio		= -EINVAL,
622 	.init_data	= &wm8994_fixed_voltage1_init_data,
623 };
624 
625 static struct platform_device wm8994_fixed_voltage0 = {
626 	.name		= "reg-fixed-voltage",
627 	.id		= 0,
628 	.dev		= {
629 		.platform_data	= &wm8994_fixed_voltage0_config,
630 	},
631 };
632 
633 static struct platform_device wm8994_fixed_voltage1 = {
634 	.name		= "reg-fixed-voltage",
635 	.id		= 1,
636 	.dev		= {
637 		.platform_data	= &wm8994_fixed_voltage1_config,
638 	},
639 };
640 
641 static struct regulator_consumer_supply wm8994_avdd1_supply =
642 	REGULATOR_SUPPLY("AVDD1", "5-001a");
643 
644 static struct regulator_consumer_supply wm8994_dcvdd_supply =
645 	REGULATOR_SUPPLY("DCVDD", "5-001a");
646 
647 static struct regulator_init_data wm8994_ldo1_data = {
648 	.constraints	= {
649 		.name		= "AVDD1_3.0V",
650 		.valid_ops_mask	= REGULATOR_CHANGE_STATUS,
651 	},
652 	.num_consumer_supplies	= 1,
653 	.consumer_supplies	= &wm8994_avdd1_supply,
654 };
655 
656 static struct regulator_init_data wm8994_ldo2_data = {
657 	.constraints	= {
658 		.name		= "DCVDD_1.0V",
659 	},
660 	.num_consumer_supplies	= 1,
661 	.consumer_supplies	= &wm8994_dcvdd_supply,
662 };
663 
664 static struct wm8994_pdata wm8994_platform_data = {
665 	/* configure gpio1 function: 0x0001(Logic level input/output) */
666 	.gpio_defaults[0] = 0x0001,
667 	/* configure gpio3/4/5/7 function for AIF2 voice */
668 	.gpio_defaults[2] = 0x8100,
669 	.gpio_defaults[3] = 0x8100,
670 	.gpio_defaults[4] = 0x8100,
671 	.gpio_defaults[6] = 0x0100,
672 	/* configure gpio8/9/10/11 function for AIF3 BT */
673 	.gpio_defaults[7] = 0x8100,
674 	.gpio_defaults[8] = 0x0100,
675 	.gpio_defaults[9] = 0x0100,
676 	.gpio_defaults[10] = 0x0100,
677 	.ldo[0]	= { S5PV210_MP03(6), NULL, &wm8994_ldo1_data },	/* XM0FRNB_2 */
678 	.ldo[1]	= { 0, NULL, &wm8994_ldo2_data },
679 };
680 
681 /* GPIO I2C PMIC */
682 #define AP_I2C_GPIO_PMIC_BUS_4	4
683 static struct i2c_gpio_platform_data goni_i2c_gpio_pmic_data = {
684 	.sda_pin	= S5PV210_GPJ4(0),	/* XMSMCSN */
685 	.scl_pin	= S5PV210_GPJ4(3),	/* XMSMIRQN */
686 };
687 
688 static struct platform_device goni_i2c_gpio_pmic = {
689 	.name		= "i2c-gpio",
690 	.id		= AP_I2C_GPIO_PMIC_BUS_4,
691 	.dev		= {
692 		.platform_data	= &goni_i2c_gpio_pmic_data,
693 	},
694 };
695 
696 static struct i2c_board_info i2c_gpio_pmic_devs[] __initdata = {
697 #if defined(CONFIG_REGULATOR_MAX8998) || defined(CONFIG_REGULATOR_MAX8998_MODULE)
698 	{
699 		/* 0xCC when SRAD = 0 */
700 		I2C_BOARD_INFO("max8998", 0xCC >> 1),
701 		.platform_data = &goni_max8998_pdata,
702 	},
703 #endif
704 };
705 
706 /* GPIO I2C AP 1.8V */
707 #define AP_I2C_GPIO_BUS_5	5
708 static struct i2c_gpio_platform_data goni_i2c_gpio5_data = {
709 	.sda_pin	= S5PV210_MP05(3),	/* XM0ADDR_11 */
710 	.scl_pin	= S5PV210_MP05(2),	/* XM0ADDR_10 */
711 };
712 
713 static struct platform_device goni_i2c_gpio5 = {
714 	.name		= "i2c-gpio",
715 	.id		= AP_I2C_GPIO_BUS_5,
716 	.dev		= {
717 		.platform_data	= &goni_i2c_gpio5_data,
718 	},
719 };
720 
721 static struct i2c_board_info i2c_gpio5_devs[] __initdata = {
722 	{
723 		/* CS/ADDR = low 0x34 (FYI: high = 0x36) */
724 		I2C_BOARD_INFO("wm8994", 0x1a),
725 		.platform_data	= &wm8994_platform_data,
726 	},
727 };
728 
729 /* PMIC Power button */
730 static struct gpio_keys_button goni_gpio_keys_table[] = {
731 	{
732 		.code 		= KEY_POWER,
733 		.gpio		= S5PV210_GPH2(6),
734 		.desc		= "gpio-keys: KEY_POWER",
735 		.type		= EV_KEY,
736 		.active_low	= 1,
737 		.wakeup		= 1,
738 		.debounce_interval = 1,
739 	},
740 };
741 
742 static struct gpio_keys_platform_data goni_gpio_keys_data = {
743 	.buttons	= goni_gpio_keys_table,
744 	.nbuttons	= ARRAY_SIZE(goni_gpio_keys_table),
745 };
746 
747 static struct platform_device goni_device_gpiokeys = {
748 	.name = "gpio-keys",
749 	.dev = {
750 		.platform_data = &goni_gpio_keys_data,
751 	},
752 };
753 
goni_pmic_init(void)754 static void __init goni_pmic_init(void)
755 {
756 	/* AP_PMIC_IRQ: EINT7 */
757 	s3c_gpio_cfgpin(S5PV210_GPH0(7), S3C_GPIO_SFN(0xf));
758 	s3c_gpio_setpull(S5PV210_GPH0(7), S3C_GPIO_PULL_UP);
759 
760 	/* nPower: EINT22 */
761 	s3c_gpio_cfgpin(S5PV210_GPH2(6), S3C_GPIO_SFN(0xf));
762 	s3c_gpio_setpull(S5PV210_GPH2(6), S3C_GPIO_PULL_UP);
763 }
764 
765 /* MoviNAND */
766 static struct s3c_sdhci_platdata goni_hsmmc0_data __initdata = {
767 	.max_width		= 4,
768 	.cd_type		= S3C_SDHCI_CD_PERMANENT,
769 };
770 
771 /* Wireless LAN */
772 static struct s3c_sdhci_platdata goni_hsmmc1_data __initdata = {
773 	.max_width		= 4,
774 	.cd_type		= S3C_SDHCI_CD_EXTERNAL,
775 	/* ext_cd_{init,cleanup} callbacks will be added later */
776 };
777 
778 /* External Flash */
779 #define GONI_EXT_FLASH_EN	S5PV210_MP05(4)
780 #define GONI_EXT_FLASH_CD	S5PV210_GPH3(4)
781 static struct s3c_sdhci_platdata goni_hsmmc2_data __initdata = {
782 	.max_width		= 4,
783 	.cd_type		= S3C_SDHCI_CD_GPIO,
784 	.ext_cd_gpio		= GONI_EXT_FLASH_CD,
785 	.ext_cd_gpio_invert	= 1,
786 };
787 
788 static struct regulator_consumer_supply mmc2_supplies[] = {
789 	REGULATOR_SUPPLY("vmmc", "s3c-sdhci.2"),
790 };
791 
792 static struct regulator_init_data mmc2_fixed_voltage_init_data = {
793 	.constraints		= {
794 		.name		= "V_TF_2.8V",
795 		.valid_ops_mask	= REGULATOR_CHANGE_STATUS,
796 	},
797 	.num_consumer_supplies	= ARRAY_SIZE(mmc2_supplies),
798 	.consumer_supplies	= mmc2_supplies,
799 };
800 
801 static struct fixed_voltage_config mmc2_fixed_voltage_config = {
802 	.supply_name		= "EXT_FLASH_EN",
803 	.microvolts		= 2800000,
804 	.gpio			= GONI_EXT_FLASH_EN,
805 	.enable_high		= true,
806 	.init_data		= &mmc2_fixed_voltage_init_data,
807 };
808 
809 static struct platform_device mmc2_fixed_voltage = {
810 	.name		= "reg-fixed-voltage",
811 	.id		= 2,
812 	.dev		= {
813 		.platform_data	= &mmc2_fixed_voltage_config,
814 	},
815 };
816 
goni_setup_sdhci(void)817 static void goni_setup_sdhci(void)
818 {
819 	s3c_sdhci0_set_platdata(&goni_hsmmc0_data);
820 	s3c_sdhci1_set_platdata(&goni_hsmmc1_data);
821 	s3c_sdhci2_set_platdata(&goni_hsmmc2_data);
822 };
823 
824 static struct noon010pc30_platform_data noon010pc30_pldata = {
825 	.clk_rate	= 16000000UL,
826 	.gpio_nreset	= S5PV210_GPB(2), /* CAM_CIF_NRST */
827 	.gpio_nstby	= S5PV210_GPB(0), /* CAM_CIF_NSTBY */
828 };
829 
830 static struct i2c_board_info noon010pc30_board_info = {
831 	I2C_BOARD_INFO("NOON010PC30", 0x60 >> 1),
832 	.platform_data = &noon010pc30_pldata,
833 };
834 
835 static struct s5p_fimc_isp_info goni_camera_sensors[] = {
836 	{
837 		.mux_id		= 0,
838 		.flags		= V4L2_MBUS_PCLK_SAMPLE_FALLING |
839 				  V4L2_MBUS_VSYNC_ACTIVE_LOW,
840 		.bus_type	= FIMC_ITU_601,
841 		.board_info	= &noon010pc30_board_info,
842 		.i2c_bus_num	= 0,
843 		.clk_frequency	= 16000000UL,
844 	},
845 };
846 
847 struct s5p_platform_fimc goni_fimc_md_platdata __initdata = {
848 	.isp_info	= goni_camera_sensors,
849 	.num_clients	= ARRAY_SIZE(goni_camera_sensors),
850 };
851 
852 static struct platform_device *goni_devices[] __initdata = {
853 	&s3c_device_fb,
854 	&s5p_device_onenand,
855 	&goni_spi_gpio,
856 	&goni_i2c_gpio_pmic,
857 	&goni_i2c_gpio5,
858 	&mmc2_fixed_voltage,
859 	&goni_device_gpiokeys,
860 	&s5p_device_mfc,
861 	&s5p_device_mfc_l,
862 	&s5p_device_mfc_r,
863 	&s5p_device_mixer,
864 	&s5p_device_sdo,
865 	&s3c_device_i2c0,
866 	&s5p_device_fimc0,
867 	&s5p_device_fimc1,
868 	&s5p_device_fimc2,
869 	&s5p_device_fimc_md,
870 	&s3c_device_hsmmc0,
871 	&s3c_device_hsmmc1,
872 	&s3c_device_hsmmc2,
873 	&s5pv210_device_iis0,
874 	&s3c_device_usb_hsotg,
875 	&samsung_device_keypad,
876 	&s3c_device_i2c1,
877 	&s3c_device_i2c2,
878 	&wm8994_fixed_voltage0,
879 	&wm8994_fixed_voltage1,
880 };
881 
goni_sound_init(void)882 static void __init goni_sound_init(void)
883 {
884 	/* Ths main clock of WM8994 codec uses the output of CLKOUT pin.
885 	 * The CLKOUT[9:8] set to 0x3(XUSBXTI) of 0xE010E000(OTHERS)
886 	 * because it needs 24MHz clock to operate WM8994 codec.
887 	 */
888 	__raw_writel(__raw_readl(S5P_OTHERS) | (0x3 << 8), S5P_OTHERS);
889 }
890 
goni_map_io(void)891 static void __init goni_map_io(void)
892 {
893 	s5pv210_init_io(NULL, 0);
894 	s3c24xx_init_clocks(24000000);
895 	s3c24xx_init_uarts(goni_uartcfgs, ARRAY_SIZE(goni_uartcfgs));
896 	s5p_set_timer_source(S5P_PWM3, S5P_PWM4);
897 }
898 
goni_reserve(void)899 static void __init goni_reserve(void)
900 {
901 	s5p_mfc_reserve_mem(0x43000000, 8 << 20, 0x51000000, 8 << 20);
902 }
903 
goni_machine_init(void)904 static void __init goni_machine_init(void)
905 {
906 	/* Radio: call before I2C 1 registeration */
907 	goni_radio_init();
908 
909 	/* I2C0 */
910 	s3c_i2c0_set_platdata(NULL);
911 
912 	/* I2C1 */
913 	s3c_i2c1_set_platdata(NULL);
914 	i2c_register_board_info(1, i2c1_devs, ARRAY_SIZE(i2c1_devs));
915 
916 	/* TSP: call before I2C 2 registeration */
917 	goni_tsp_init();
918 
919 	/* I2C2 */
920 	s3c_i2c2_set_platdata(&i2c2_data);
921 	i2c_register_board_info(2, i2c2_devs, ARRAY_SIZE(i2c2_devs));
922 
923 	/* PMIC */
924 	goni_pmic_init();
925 	i2c_register_board_info(AP_I2C_GPIO_PMIC_BUS_4, i2c_gpio_pmic_devs,
926 			ARRAY_SIZE(i2c_gpio_pmic_devs));
927 	/* SDHCI */
928 	goni_setup_sdhci();
929 
930 	/* SOUND */
931 	goni_sound_init();
932 	i2c_register_board_info(AP_I2C_GPIO_BUS_5, i2c_gpio5_devs,
933 			ARRAY_SIZE(i2c_gpio5_devs));
934 
935 	/* FB */
936 	s3c_fb_set_platdata(&goni_lcd_pdata);
937 
938 	/* FIMC */
939 	s3c_set_platdata(&goni_fimc_md_platdata, sizeof(goni_fimc_md_platdata),
940 			 &s5p_device_fimc_md);
941 
942 	goni_camera_init();
943 
944 	/* SPI */
945 	spi_register_board_info(spi_board_info, ARRAY_SIZE(spi_board_info));
946 
947 	/* KEYPAD */
948 	samsung_keypad_set_platdata(&keypad_data);
949 
950 	clk_xusbxti.rate = 24000000;
951 
952 	platform_add_devices(goni_devices, ARRAY_SIZE(goni_devices));
953 }
954 
955 MACHINE_START(GONI, "GONI")
956 	/* Maintainers: Kyungmin Park <kyungmin.park@samsung.com> */
957 	.atag_offset	= 0x100,
958 	.init_irq	= s5pv210_init_irq,
959 	.handle_irq	= vic_handle_irq,
960 	.map_io		= goni_map_io,
961 	.init_machine	= goni_machine_init,
962 	.timer		= &s5p_timer,
963 	.reserve	= &goni_reserve,
964 	.restart	= s5pv210_restart,
965 MACHINE_END
966