• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* linux/arch/arm/mach-s3c64xx/mach-crag6410.c
2  *
3  * Copyright 2011 Wolfson Microelectronics plc
4  *	Mark Brown <broonie@opensource.wolfsonmicro.com>
5  *
6  * Copyright 2011 Simtec Electronics
7  *	Ben Dooks <ben@simtec.co.uk>
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License version 2 as
11  * published by the Free Software Foundation.
12  */
13 
14 #include <linux/kernel.h>
15 #include <linux/list.h>
16 #include <linux/serial_core.h>
17 #include <linux/serial_s3c.h>
18 #include <linux/platform_device.h>
19 #include <linux/fb.h>
20 #include <linux/io.h>
21 #include <linux/init.h>
22 #include <linux/gpio.h>
23 #include <linux/leds.h>
24 #include <linux/delay.h>
25 #include <linux/mmc/host.h>
26 #include <linux/regulator/machine.h>
27 #include <linux/regulator/fixed.h>
28 #include <linux/pwm.h>
29 #include <linux/pwm_backlight.h>
30 #include <linux/dm9000.h>
31 #include <linux/gpio_keys.h>
32 #include <linux/basic_mmio_gpio.h>
33 #include <linux/spi/spi.h>
34 
35 #include <linux/platform_data/pca953x.h>
36 #include <linux/platform_data/s3c-hsotg.h>
37 
38 #include <video/platform_lcd.h>
39 
40 #include <linux/mfd/wm831x/core.h>
41 #include <linux/mfd/wm831x/pdata.h>
42 #include <linux/mfd/wm831x/irq.h>
43 #include <linux/mfd/wm831x/gpio.h>
44 
45 #include <sound/wm1250-ev1.h>
46 
47 #include <asm/mach/arch.h>
48 #include <asm/mach-types.h>
49 
50 #include <video/samsung_fimd.h>
51 #include <mach/hardware.h>
52 #include <mach/map.h>
53 #include <mach/regs-gpio.h>
54 #include <mach/gpio-samsung.h>
55 
56 #include <plat/fb.h>
57 #include <plat/sdhci.h>
58 #include <plat/gpio-cfg.h>
59 #include <linux/platform_data/spi-s3c64xx.h>
60 
61 #include <plat/keypad.h>
62 #include <plat/devs.h>
63 #include <plat/cpu.h>
64 #include <plat/adc.h>
65 #include <linux/platform_data/i2c-s3c2410.h>
66 #include <plat/pm.h>
67 #include <plat/samsung-time.h>
68 
69 #include "common.h"
70 #include "crag6410.h"
71 #include "regs-gpio-memport.h"
72 #include "regs-modem.h"
73 #include "regs-sys.h"
74 
75 /* serial port setup */
76 
77 #define UCON (S3C2410_UCON_DEFAULT | S3C2410_UCON_UCLK)
78 #define ULCON (S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB)
79 #define UFCON (S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE)
80 
81 static struct s3c2410_uartcfg crag6410_uartcfgs[] __initdata = {
82 	[0] = {
83 		.hwport		= 0,
84 		.flags		= 0,
85 		.ucon		= UCON,
86 		.ulcon		= ULCON,
87 		.ufcon		= UFCON,
88 	},
89 	[1] = {
90 		.hwport		= 1,
91 		.flags		= 0,
92 		.ucon		= UCON,
93 		.ulcon		= ULCON,
94 		.ufcon		= UFCON,
95 	},
96 	[2] = {
97 		.hwport		= 2,
98 		.flags		= 0,
99 		.ucon		= UCON,
100 		.ulcon		= ULCON,
101 		.ufcon		= UFCON,
102 	},
103 	[3] = {
104 		.hwport		= 3,
105 		.flags		= 0,
106 		.ucon		= UCON,
107 		.ulcon		= ULCON,
108 		.ufcon		= UFCON,
109 	},
110 };
111 
112 static struct pwm_lookup crag6410_pwm_lookup[] = {
113 	PWM_LOOKUP("samsung-pwm", 0, "pwm-backlight", NULL, 100000,
114 		   PWM_POLARITY_NORMAL),
115 };
116 
117 static struct platform_pwm_backlight_data crag6410_backlight_data = {
118 	.max_brightness	= 1000,
119 	.dft_brightness	= 600,
120 	.enable_gpio	= -1,
121 };
122 
123 static struct platform_device crag6410_backlight_device = {
124 	.name		= "pwm-backlight",
125 	.id		= -1,
126 	.dev		= {
127 		.parent	= &samsung_device_pwm.dev,
128 		.platform_data = &crag6410_backlight_data,
129 	},
130 };
131 
crag6410_lcd_power_set(struct plat_lcd_data * pd,unsigned int power)132 static void crag6410_lcd_power_set(struct plat_lcd_data *pd, unsigned int power)
133 {
134 	pr_debug("%s: setting power %d\n", __func__, power);
135 
136 	if (power) {
137 		gpio_set_value(S3C64XX_GPB(0), 1);
138 		msleep(1);
139 		s3c_gpio_cfgpin(S3C64XX_GPF(14), S3C_GPIO_SFN(2));
140 	} else {
141 		gpio_direction_output(S3C64XX_GPF(14), 0);
142 		gpio_set_value(S3C64XX_GPB(0), 0);
143 	}
144 }
145 
146 static struct platform_device crag6410_lcd_powerdev = {
147 	.name			= "platform-lcd",
148 	.id			= -1,
149 	.dev.parent		= &s3c_device_fb.dev,
150 	.dev.platform_data	= &(struct plat_lcd_data) {
151 		.set_power	= crag6410_lcd_power_set,
152 	},
153 };
154 
155 /* 640x480 URT */
156 static struct s3c_fb_pd_win crag6410_fb_win0 = {
157 	.max_bpp	= 32,
158 	.default_bpp	= 16,
159 	.xres		= 640,
160 	.yres		= 480,
161 	.virtual_y	= 480 * 2,
162 	.virtual_x	= 640,
163 };
164 
165 static struct fb_videomode crag6410_lcd_timing = {
166 	.left_margin	= 150,
167 	.right_margin	= 80,
168 	.upper_margin	= 40,
169 	.lower_margin	= 5,
170 	.hsync_len	= 40,
171 	.vsync_len	= 5,
172 	.xres		= 640,
173 	.yres		= 480,
174 };
175 
176 /* 405566 clocks per frame => 60Hz refresh requires 24333960Hz clock */
177 static struct s3c_fb_platdata crag6410_lcd_pdata = {
178 	.setup_gpio	= s3c64xx_fb_gpio_setup_24bpp,
179 	.vtiming	= &crag6410_lcd_timing,
180 	.win[0]		= &crag6410_fb_win0,
181 	.vidcon0	= VIDCON0_VIDOUT_RGB | VIDCON0_PNRMODE_RGB,
182 	.vidcon1	= VIDCON1_INV_HSYNC | VIDCON1_INV_VSYNC,
183 };
184 
185 /* 2x6 keypad */
186 
187 static uint32_t crag6410_keymap[] = {
188 	/* KEY(row, col, keycode) */
189 	KEY(0, 0, KEY_VOLUMEUP),
190 	KEY(0, 1, KEY_HOME),
191 	KEY(0, 2, KEY_VOLUMEDOWN),
192 	KEY(0, 3, KEY_HELP),
193 	KEY(0, 4, KEY_MENU),
194 	KEY(0, 5, KEY_MEDIA),
195 	KEY(1, 0, 232),
196 	KEY(1, 1, KEY_DOWN),
197 	KEY(1, 2, KEY_LEFT),
198 	KEY(1, 3, KEY_UP),
199 	KEY(1, 4, KEY_RIGHT),
200 	KEY(1, 5, KEY_CAMERA),
201 };
202 
203 static struct matrix_keymap_data crag6410_keymap_data = {
204 	.keymap		= crag6410_keymap,
205 	.keymap_size	= ARRAY_SIZE(crag6410_keymap),
206 };
207 
208 static struct samsung_keypad_platdata crag6410_keypad_data = {
209 	.keymap_data	= &crag6410_keymap_data,
210 	.rows		= 2,
211 	.cols		= 6,
212 };
213 
214 static struct gpio_keys_button crag6410_gpio_keys[] = {
215 	[0] = {
216 		.code	= KEY_SUSPEND,
217 		.gpio	= S3C64XX_GPL(10),	/* EINT 18 */
218 		.type	= EV_KEY,
219 		.wakeup	= 1,
220 		.active_low = 1,
221 	},
222 	[1] = {
223 		.code	= SW_FRONT_PROXIMITY,
224 		.gpio	= S3C64XX_GPN(11),	/* EINT 11 */
225 		.type	= EV_SW,
226 	},
227 };
228 
229 static struct gpio_keys_platform_data crag6410_gpio_keydata = {
230 	.buttons	= crag6410_gpio_keys,
231 	.nbuttons	= ARRAY_SIZE(crag6410_gpio_keys),
232 };
233 
234 static struct platform_device crag6410_gpio_keydev = {
235 	.name		= "gpio-keys",
236 	.id		= 0,
237 	.dev.platform_data = &crag6410_gpio_keydata,
238 };
239 
240 static struct resource crag6410_dm9k_resource[] = {
241 	[0] = DEFINE_RES_MEM(S3C64XX_PA_XM0CSN5, 2),
242 	[1] = DEFINE_RES_MEM(S3C64XX_PA_XM0CSN5 + (1 << 8), 2),
243 	[2] = DEFINE_RES_NAMED(S3C_EINT(17), 1, NULL, IORESOURCE_IRQ \
244 				| IORESOURCE_IRQ_HIGHLEVEL),
245 };
246 
247 static struct dm9000_plat_data mini6410_dm9k_pdata = {
248 	.flags	= DM9000_PLATF_16BITONLY,
249 };
250 
251 static struct platform_device crag6410_dm9k_device = {
252 	.name		= "dm9000",
253 	.id		= -1,
254 	.num_resources	= ARRAY_SIZE(crag6410_dm9k_resource),
255 	.resource	= crag6410_dm9k_resource,
256 	.dev.platform_data = &mini6410_dm9k_pdata,
257 };
258 
259 static struct resource crag6410_mmgpio_resource[] = {
260 	[0] = DEFINE_RES_MEM_NAMED(S3C64XX_PA_XM0CSN4, 1, "dat"),
261 };
262 
263 static struct platform_device crag6410_mmgpio = {
264 	.name		= "basic-mmio-gpio",
265 	.id		= -1,
266 	.resource	= crag6410_mmgpio_resource,
267 	.num_resources	= ARRAY_SIZE(crag6410_mmgpio_resource),
268 	.dev.platform_data = &(struct bgpio_pdata) {
269 		.base	= MMGPIO_GPIO_BASE,
270 	},
271 };
272 
273 static struct platform_device speyside_device = {
274 	.name		= "speyside",
275 	.id		= -1,
276 };
277 
278 static struct platform_device lowland_device = {
279 	.name		= "lowland",
280 	.id		= -1,
281 };
282 
283 static struct platform_device tobermory_device = {
284 	.name		= "tobermory",
285 	.id		= -1,
286 };
287 
288 static struct platform_device littlemill_device = {
289 	.name		= "littlemill",
290 	.id		= -1,
291 };
292 
293 static struct platform_device bells_wm2200_device = {
294 	.name		= "bells",
295 	.id		= 0,
296 };
297 
298 static struct platform_device bells_wm5102_device = {
299 	.name		= "bells",
300 	.id		= 1,
301 };
302 
303 static struct platform_device bells_wm5110_device = {
304 	.name		= "bells",
305 	.id		= 2,
306 };
307 
308 static struct regulator_consumer_supply wallvdd_consumers[] = {
309 	REGULATOR_SUPPLY("SPKVDD", "1-001a"),
310 	REGULATOR_SUPPLY("SPKVDD1", "1-001a"),
311 	REGULATOR_SUPPLY("SPKVDD2", "1-001a"),
312 	REGULATOR_SUPPLY("SPKVDDL", "1-001a"),
313 	REGULATOR_SUPPLY("SPKVDDR", "1-001a"),
314 
315 	REGULATOR_SUPPLY("SPKVDDL", "spi0.1"),
316 	REGULATOR_SUPPLY("SPKVDDR", "spi0.1"),
317 
318 	REGULATOR_SUPPLY("DC1VDD", "0-0034"),
319 	REGULATOR_SUPPLY("DC2VDD", "0-0034"),
320 	REGULATOR_SUPPLY("DC3VDD", "0-0034"),
321 	REGULATOR_SUPPLY("LDO1VDD", "0-0034"),
322 	REGULATOR_SUPPLY("LDO2VDD", "0-0034"),
323 	REGULATOR_SUPPLY("LDO4VDD", "0-0034"),
324 	REGULATOR_SUPPLY("LDO5VDD", "0-0034"),
325 	REGULATOR_SUPPLY("LDO6VDD", "0-0034"),
326 	REGULATOR_SUPPLY("LDO7VDD", "0-0034"),
327 	REGULATOR_SUPPLY("LDO8VDD", "0-0034"),
328 	REGULATOR_SUPPLY("LDO9VDD", "0-0034"),
329 	REGULATOR_SUPPLY("LDO10VDD", "0-0034"),
330 	REGULATOR_SUPPLY("LDO11VDD", "0-0034"),
331 
332 	REGULATOR_SUPPLY("DC1VDD", "1-0034"),
333 	REGULATOR_SUPPLY("DC2VDD", "1-0034"),
334 	REGULATOR_SUPPLY("DC3VDD", "1-0034"),
335 	REGULATOR_SUPPLY("LDO1VDD", "1-0034"),
336 	REGULATOR_SUPPLY("LDO2VDD", "1-0034"),
337 	REGULATOR_SUPPLY("LDO4VDD", "1-0034"),
338 	REGULATOR_SUPPLY("LDO5VDD", "1-0034"),
339 	REGULATOR_SUPPLY("LDO6VDD", "1-0034"),
340 	REGULATOR_SUPPLY("LDO7VDD", "1-0034"),
341 	REGULATOR_SUPPLY("LDO8VDD", "1-0034"),
342 	REGULATOR_SUPPLY("LDO9VDD", "1-0034"),
343 	REGULATOR_SUPPLY("LDO10VDD", "1-0034"),
344 	REGULATOR_SUPPLY("LDO11VDD", "1-0034"),
345 };
346 
347 static struct regulator_init_data wallvdd_data = {
348 	.constraints = {
349 		.always_on = 1,
350 	},
351 	.num_consumer_supplies = ARRAY_SIZE(wallvdd_consumers),
352 	.consumer_supplies = wallvdd_consumers,
353 };
354 
355 static struct fixed_voltage_config wallvdd_pdata = {
356 	.supply_name = "WALLVDD",
357 	.microvolts = 5000000,
358 	.init_data = &wallvdd_data,
359 	.gpio = -EINVAL,
360 };
361 
362 static struct platform_device wallvdd_device = {
363 	.name		= "reg-fixed-voltage",
364 	.id		= -1,
365 	.dev = {
366 		.platform_data = &wallvdd_pdata,
367 	},
368 };
369 
370 static struct platform_device *crag6410_devices[] __initdata = {
371 	&s3c_device_hsmmc0,
372 	&s3c_device_hsmmc2,
373 	&s3c_device_i2c0,
374 	&s3c_device_i2c1,
375 	&s3c_device_fb,
376 	&s3c_device_ohci,
377 	&s3c_device_usb_hsotg,
378 	&samsung_device_pwm,
379 	&s3c64xx_device_iis0,
380 	&s3c64xx_device_iis1,
381 	&samsung_device_keypad,
382 	&crag6410_gpio_keydev,
383 	&crag6410_dm9k_device,
384 	&s3c64xx_device_spi0,
385 	&crag6410_mmgpio,
386 	&crag6410_lcd_powerdev,
387 	&crag6410_backlight_device,
388 	&speyside_device,
389 	&tobermory_device,
390 	&littlemill_device,
391 	&lowland_device,
392 	&bells_wm2200_device,
393 	&bells_wm5102_device,
394 	&bells_wm5110_device,
395 	&wallvdd_device,
396 };
397 
398 static struct pca953x_platform_data crag6410_pca_data = {
399 	.gpio_base	= PCA935X_GPIO_BASE,
400 	.irq_base	= -1,
401 };
402 
403 /* VDDARM is controlled by DVS1 connected to GPK(0) */
404 static struct wm831x_buckv_pdata vddarm_pdata = {
405 	.dvs_control_src = 1,
406 	.dvs_gpio = S3C64XX_GPK(0),
407 };
408 
409 static struct regulator_consumer_supply vddarm_consumers[] = {
410 	REGULATOR_SUPPLY("vddarm", NULL),
411 };
412 
413 static struct regulator_init_data vddarm = {
414 	.constraints = {
415 		.name = "VDDARM",
416 		.min_uV = 1000000,
417 		.max_uV = 1300000,
418 		.always_on = 1,
419 		.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
420 	},
421 	.num_consumer_supplies = ARRAY_SIZE(vddarm_consumers),
422 	.consumer_supplies = vddarm_consumers,
423 	.supply_regulator = "WALLVDD",
424 	.driver_data = &vddarm_pdata,
425 };
426 
427 static struct regulator_consumer_supply vddint_consumers[] = {
428 	REGULATOR_SUPPLY("vddint", NULL),
429 };
430 
431 static struct regulator_init_data vddint = {
432 	.constraints = {
433 		.name = "VDDINT",
434 		.min_uV = 1000000,
435 		.max_uV = 1200000,
436 		.always_on = 1,
437 		.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
438 	},
439 	.num_consumer_supplies = ARRAY_SIZE(vddint_consumers),
440 	.consumer_supplies = vddint_consumers,
441 	.supply_regulator = "WALLVDD",
442 };
443 
444 static struct regulator_init_data vddmem = {
445 	.constraints = {
446 		.name = "VDDMEM",
447 		.always_on = 1,
448 	},
449 };
450 
451 static struct regulator_init_data vddsys = {
452 	.constraints = {
453 		.name = "VDDSYS,VDDEXT,VDDPCM,VDDSS",
454 		.always_on = 1,
455 	},
456 };
457 
458 static struct regulator_consumer_supply vddmmc_consumers[] = {
459 	REGULATOR_SUPPLY("vmmc", "s3c-sdhci.0"),
460 	REGULATOR_SUPPLY("vmmc", "s3c-sdhci.1"),
461 	REGULATOR_SUPPLY("vmmc", "s3c-sdhci.2"),
462 };
463 
464 static struct regulator_init_data vddmmc = {
465 	.constraints = {
466 		.name = "VDDMMC,UH",
467 		.always_on = 1,
468 	},
469 	.num_consumer_supplies = ARRAY_SIZE(vddmmc_consumers),
470 	.consumer_supplies = vddmmc_consumers,
471 	.supply_regulator = "WALLVDD",
472 };
473 
474 static struct regulator_init_data vddotgi = {
475 	.constraints = {
476 		.name = "VDDOTGi",
477 		.always_on = 1,
478 	},
479 	.supply_regulator = "WALLVDD",
480 };
481 
482 static struct regulator_init_data vddotg = {
483 	.constraints = {
484 		.name = "VDDOTG",
485 		.always_on = 1,
486 	},
487 	.supply_regulator = "WALLVDD",
488 };
489 
490 static struct regulator_init_data vddhi = {
491 	.constraints = {
492 		.name = "VDDHI",
493 		.always_on = 1,
494 	},
495 	.supply_regulator = "WALLVDD",
496 };
497 
498 static struct regulator_init_data vddadc = {
499 	.constraints = {
500 		.name = "VDDADC,VDDDAC",
501 		.always_on = 1,
502 	},
503 	.supply_regulator = "WALLVDD",
504 };
505 
506 static struct regulator_init_data vddmem0 = {
507 	.constraints = {
508 		.name = "VDDMEM0",
509 		.always_on = 1,
510 	},
511 	.supply_regulator = "WALLVDD",
512 };
513 
514 static struct regulator_init_data vddpll = {
515 	.constraints = {
516 		.name = "VDDPLL",
517 		.always_on = 1,
518 	},
519 	.supply_regulator = "WALLVDD",
520 };
521 
522 static struct regulator_init_data vddlcd = {
523 	.constraints = {
524 		.name = "VDDLCD",
525 		.always_on = 1,
526 	},
527 	.supply_regulator = "WALLVDD",
528 };
529 
530 static struct regulator_init_data vddalive = {
531 	.constraints = {
532 		.name = "VDDALIVE",
533 		.always_on = 1,
534 	},
535 	.supply_regulator = "WALLVDD",
536 };
537 
538 static struct wm831x_backup_pdata banff_backup_pdata = {
539 	.charger_enable = 1,
540 	.vlim = 2500,  /* mV */
541 	.ilim = 200,   /* uA */
542 };
543 
544 static struct wm831x_status_pdata banff_red_led = {
545 	.name = "banff:red:",
546 	.default_src = WM831X_STATUS_MANUAL,
547 };
548 
549 static struct wm831x_status_pdata banff_green_led = {
550 	.name = "banff:green:",
551 	.default_src = WM831X_STATUS_MANUAL,
552 };
553 
554 static struct wm831x_touch_pdata touch_pdata = {
555 	.data_irq = S3C_EINT(26),
556 	.pd_irq = S3C_EINT(27),
557 };
558 
559 static struct wm831x_pdata crag_pmic_pdata = {
560 	.wm831x_num = 1,
561 	.irq_base = BANFF_PMIC_IRQ_BASE,
562 	.gpio_base = BANFF_PMIC_GPIO_BASE,
563 	.soft_shutdown = true,
564 
565 	.backup = &banff_backup_pdata,
566 
567 	.gpio_defaults = {
568 		/* GPIO5: DVS1_REQ - CMOS, DBVDD, active high */
569 		[4] = WM831X_GPN_DIR | WM831X_GPN_POL | WM831X_GPN_ENA | 0x8,
570 		/* GPIO11: Touchscreen data - CMOS, DBVDD, active high*/
571 		[10] = WM831X_GPN_POL | WM831X_GPN_ENA | 0x6,
572 		/* GPIO12: Touchscreen pen down - CMOS, DBVDD, active high*/
573 		[11] = WM831X_GPN_POL | WM831X_GPN_ENA | 0x7,
574 	},
575 
576 	.dcdc = {
577 		&vddarm,  /* DCDC1 */
578 		&vddint,  /* DCDC2 */
579 		&vddmem,  /* DCDC3 */
580 	},
581 
582 	.ldo = {
583 		&vddsys,   /* LDO1 */
584 		&vddmmc,   /* LDO2 */
585 		NULL,      /* LDO3 */
586 		&vddotgi,  /* LDO4 */
587 		&vddotg,   /* LDO5 */
588 		&vddhi,    /* LDO6 */
589 		&vddadc,   /* LDO7 */
590 		&vddmem0,  /* LDO8 */
591 		&vddpll,   /* LDO9 */
592 		&vddlcd,   /* LDO10 */
593 		&vddalive, /* LDO11 */
594 	},
595 
596 	.status = {
597 		&banff_green_led,
598 		&banff_red_led,
599 	},
600 
601 	.touch = &touch_pdata,
602 };
603 
604 static struct i2c_board_info i2c_devs0[] = {
605 	{ I2C_BOARD_INFO("24c08", 0x50), },
606 	{ I2C_BOARD_INFO("tca6408", 0x20),
607 	  .platform_data = &crag6410_pca_data,
608 	},
609 	{ I2C_BOARD_INFO("wm8312", 0x34),
610 	  .platform_data = &crag_pmic_pdata,
611 	  .irq = S3C_EINT(23),
612 	},
613 };
614 
615 static struct s3c2410_platform_i2c i2c0_pdata = {
616 	.frequency = 400000,
617 };
618 
619 static struct regulator_consumer_supply pvdd_1v2_consumers[] = {
620 	REGULATOR_SUPPLY("DCVDD", "spi0.0"),
621 	REGULATOR_SUPPLY("AVDD", "spi0.0"),
622 	REGULATOR_SUPPLY("AVDD", "spi0.1"),
623 };
624 
625 static struct regulator_init_data pvdd_1v2 = {
626 	.constraints = {
627 		.name = "PVDD_1V2",
628 		.valid_ops_mask = REGULATOR_CHANGE_STATUS,
629 	},
630 
631 	.consumer_supplies = pvdd_1v2_consumers,
632 	.num_consumer_supplies = ARRAY_SIZE(pvdd_1v2_consumers),
633 };
634 
635 static struct regulator_consumer_supply pvdd_1v8_consumers[] = {
636 	REGULATOR_SUPPLY("LDOVDD", "1-001a"),
637 	REGULATOR_SUPPLY("PLLVDD", "1-001a"),
638 	REGULATOR_SUPPLY("DBVDD", "1-001a"),
639 	REGULATOR_SUPPLY("DBVDD1", "1-001a"),
640 	REGULATOR_SUPPLY("DBVDD2", "1-001a"),
641 	REGULATOR_SUPPLY("DBVDD3", "1-001a"),
642 	REGULATOR_SUPPLY("CPVDD", "1-001a"),
643 	REGULATOR_SUPPLY("AVDD2", "1-001a"),
644 	REGULATOR_SUPPLY("DCVDD", "1-001a"),
645 	REGULATOR_SUPPLY("AVDD", "1-001a"),
646 	REGULATOR_SUPPLY("DBVDD", "spi0.0"),
647 
648 	REGULATOR_SUPPLY("DBVDD", "1-003a"),
649 	REGULATOR_SUPPLY("LDOVDD", "1-003a"),
650 	REGULATOR_SUPPLY("CPVDD", "1-003a"),
651 	REGULATOR_SUPPLY("AVDD", "1-003a"),
652 	REGULATOR_SUPPLY("DBVDD1", "spi0.1"),
653 	REGULATOR_SUPPLY("DBVDD2", "spi0.1"),
654 	REGULATOR_SUPPLY("DBVDD3", "spi0.1"),
655 	REGULATOR_SUPPLY("LDOVDD", "spi0.1"),
656 	REGULATOR_SUPPLY("CPVDD", "spi0.1"),
657 };
658 
659 static struct regulator_init_data pvdd_1v8 = {
660 	.constraints = {
661 		.name = "PVDD_1V8",
662 		.always_on = 1,
663 	},
664 
665 	.consumer_supplies = pvdd_1v8_consumers,
666 	.num_consumer_supplies = ARRAY_SIZE(pvdd_1v8_consumers),
667 };
668 
669 static struct regulator_consumer_supply pvdd_3v3_consumers[] = {
670 	REGULATOR_SUPPLY("MICVDD", "1-001a"),
671 	REGULATOR_SUPPLY("AVDD1", "1-001a"),
672 };
673 
674 static struct regulator_init_data pvdd_3v3 = {
675 	.constraints = {
676 		.name = "PVDD_3V3",
677 		.always_on = 1,
678 	},
679 
680 	.consumer_supplies = pvdd_3v3_consumers,
681 	.num_consumer_supplies = ARRAY_SIZE(pvdd_3v3_consumers),
682 };
683 
684 static struct wm831x_pdata glenfarclas_pmic_pdata = {
685 	.wm831x_num = 2,
686 	.irq_base = GLENFARCLAS_PMIC_IRQ_BASE,
687 	.gpio_base = GLENFARCLAS_PMIC_GPIO_BASE,
688 	.soft_shutdown = true,
689 
690 	.gpio_defaults = {
691 		/* GPIO1-3: IRQ inputs, rising edge triggered, CMOS */
692 		[0] = WM831X_GPN_DIR | WM831X_GPN_POL | WM831X_GPN_ENA,
693 		[1] = WM831X_GPN_DIR | WM831X_GPN_POL | WM831X_GPN_ENA,
694 		[2] = WM831X_GPN_DIR | WM831X_GPN_POL | WM831X_GPN_ENA,
695 	},
696 
697 	.dcdc = {
698 		&pvdd_1v2,  /* DCDC1 */
699 		&pvdd_1v8,  /* DCDC2 */
700 		&pvdd_3v3,  /* DCDC3 */
701 	},
702 
703 	.disable_touch = true,
704 };
705 
706 static struct wm1250_ev1_pdata wm1250_ev1_pdata = {
707 	.gpios = {
708 		[WM1250_EV1_GPIO_CLK_ENA] = S3C64XX_GPN(12),
709 		[WM1250_EV1_GPIO_CLK_SEL0] = S3C64XX_GPL(12),
710 		[WM1250_EV1_GPIO_CLK_SEL1] = S3C64XX_GPL(13),
711 		[WM1250_EV1_GPIO_OSR] = S3C64XX_GPL(14),
712 		[WM1250_EV1_GPIO_MASTER] = S3C64XX_GPL(8),
713 	},
714 };
715 
716 static struct i2c_board_info i2c_devs1[] = {
717 	{ I2C_BOARD_INFO("wm8311", 0x34),
718 	  .irq = S3C_EINT(0),
719 	  .platform_data = &glenfarclas_pmic_pdata },
720 
721 	{ I2C_BOARD_INFO("wlf-gf-module", 0x20) },
722 	{ I2C_BOARD_INFO("wlf-gf-module", 0x22) },
723 	{ I2C_BOARD_INFO("wlf-gf-module", 0x24) },
724 	{ I2C_BOARD_INFO("wlf-gf-module", 0x25) },
725 	{ I2C_BOARD_INFO("wlf-gf-module", 0x26) },
726 
727 	{ I2C_BOARD_INFO("wm1250-ev1", 0x27),
728 	  .platform_data = &wm1250_ev1_pdata },
729 };
730 
731 static struct s3c2410_platform_i2c i2c1_pdata = {
732 	.frequency = 400000,
733 	.bus_num = 1,
734 };
735 
crag6410_map_io(void)736 static void __init crag6410_map_io(void)
737 {
738 	s3c64xx_init_io(NULL, 0);
739 	s3c64xx_set_xtal_freq(12000000);
740 	s3c24xx_init_uarts(crag6410_uartcfgs, ARRAY_SIZE(crag6410_uartcfgs));
741 	samsung_set_timer_source(SAMSUNG_PWM3, SAMSUNG_PWM4);
742 
743 	/* LCD type and Bypass set by bootloader */
744 }
745 
746 static struct s3c_sdhci_platdata crag6410_hsmmc2_pdata = {
747 	.max_width		= 4,
748 	.cd_type		= S3C_SDHCI_CD_PERMANENT,
749 	.host_caps		= MMC_CAP_POWER_OFF_CARD,
750 };
751 
crag6410_cfg_sdhci0(struct platform_device * dev,int width)752 static void crag6410_cfg_sdhci0(struct platform_device *dev, int width)
753 {
754 	/* Set all the necessary GPG pins to special-function 2 */
755 	s3c_gpio_cfgrange_nopull(S3C64XX_GPG(0), 2 + width, S3C_GPIO_SFN(2));
756 
757 	/* force card-detected for prototype 0 */
758 	s3c_gpio_setpull(S3C64XX_GPG(6), S3C_GPIO_PULL_DOWN);
759 }
760 
761 static struct s3c_sdhci_platdata crag6410_hsmmc0_pdata = {
762 	.max_width		= 4,
763 	.cd_type		= S3C_SDHCI_CD_INTERNAL,
764 	.cfg_gpio		= crag6410_cfg_sdhci0,
765 	.host_caps		= MMC_CAP_POWER_OFF_CARD,
766 };
767 
768 static const struct gpio_led gpio_leds[] = {
769 	{
770 		.name = "d13:green:",
771 		.gpio = MMGPIO_GPIO_BASE + 0,
772 		.default_state = LEDS_GPIO_DEFSTATE_ON,
773 	},
774 	{
775 		.name = "d14:green:",
776 		.gpio = MMGPIO_GPIO_BASE + 1,
777 		.default_state = LEDS_GPIO_DEFSTATE_ON,
778 	},
779 	{
780 		.name = "d15:green:",
781 		.gpio = MMGPIO_GPIO_BASE + 2,
782 		.default_state = LEDS_GPIO_DEFSTATE_ON,
783 	},
784 	{
785 		.name = "d16:green:",
786 		.gpio = MMGPIO_GPIO_BASE + 3,
787 		.default_state = LEDS_GPIO_DEFSTATE_ON,
788 	},
789 	{
790 		.name = "d17:green:",
791 		.gpio = MMGPIO_GPIO_BASE + 4,
792 		.default_state = LEDS_GPIO_DEFSTATE_ON,
793 	},
794 	{
795 		.name = "d18:green:",
796 		.gpio = MMGPIO_GPIO_BASE + 5,
797 		.default_state = LEDS_GPIO_DEFSTATE_ON,
798 	},
799 	{
800 		.name = "d19:green:",
801 		.gpio = MMGPIO_GPIO_BASE + 6,
802 		.default_state = LEDS_GPIO_DEFSTATE_ON,
803 	},
804 	{
805 		.name = "d20:green:",
806 		.gpio = MMGPIO_GPIO_BASE + 7,
807 		.default_state = LEDS_GPIO_DEFSTATE_ON,
808 	},
809 };
810 
811 static const struct gpio_led_platform_data gpio_leds_pdata = {
812 	.leds = gpio_leds,
813 	.num_leds = ARRAY_SIZE(gpio_leds),
814 };
815 
816 static struct dwc2_hsotg_plat crag6410_hsotg_pdata;
817 
crag6410_machine_init(void)818 static void __init crag6410_machine_init(void)
819 {
820 	/* Open drain IRQs need pullups */
821 	s3c_gpio_setpull(S3C64XX_GPM(0), S3C_GPIO_PULL_UP);
822 	s3c_gpio_setpull(S3C64XX_GPN(0), S3C_GPIO_PULL_UP);
823 
824 	gpio_request(S3C64XX_GPB(0), "LCD power");
825 	gpio_direction_output(S3C64XX_GPB(0), 0);
826 
827 	gpio_request(S3C64XX_GPF(14), "LCD PWM");
828 	gpio_direction_output(S3C64XX_GPF(14), 0);  /* turn off */
829 
830 	gpio_request(S3C64XX_GPB(1), "SD power");
831 	gpio_direction_output(S3C64XX_GPB(1), 0);
832 
833 	gpio_request(S3C64XX_GPF(10), "nRESETSEL");
834 	gpio_direction_output(S3C64XX_GPF(10), 1);
835 
836 	s3c_sdhci0_set_platdata(&crag6410_hsmmc0_pdata);
837 	s3c_sdhci2_set_platdata(&crag6410_hsmmc2_pdata);
838 
839 	s3c_i2c0_set_platdata(&i2c0_pdata);
840 	s3c_i2c1_set_platdata(&i2c1_pdata);
841 	s3c_fb_set_platdata(&crag6410_lcd_pdata);
842 	dwc2_hsotg_set_platdata(&crag6410_hsotg_pdata);
843 
844 	i2c_register_board_info(0, i2c_devs0, ARRAY_SIZE(i2c_devs0));
845 	i2c_register_board_info(1, i2c_devs1, ARRAY_SIZE(i2c_devs1));
846 
847 	samsung_keypad_set_platdata(&crag6410_keypad_data);
848 	s3c64xx_spi0_set_platdata(NULL, 0, 2);
849 
850 	pwm_add_table(crag6410_pwm_lookup, ARRAY_SIZE(crag6410_pwm_lookup));
851 	platform_add_devices(crag6410_devices, ARRAY_SIZE(crag6410_devices));
852 
853 	gpio_led_register_device(-1, &gpio_leds_pdata);
854 
855 	regulator_has_full_constraints();
856 
857 	s3c64xx_pm_init();
858 }
859 
860 MACHINE_START(WLF_CRAGG_6410, "Wolfson Cragganmore 6410")
861 	/* Maintainer: Mark Brown <broonie@opensource.wolfsonmicro.com> */
862 	.atag_offset	= 0x100,
863 	.init_irq	= s3c6410_init_irq,
864 	.map_io		= crag6410_map_io,
865 	.init_machine	= crag6410_machine_init,
866 	.init_time	= samsung_timer_init,
867 	.restart	= s3c64xx_restart,
868 MACHINE_END
869