mach-goni.c revision 07e87e15b969a05a7943d7ff1abc2d8da287171c
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/mach/arch.h> 31#include <asm/mach/map.h> 32#include <asm/setup.h> 33#include <asm/mach-types.h> 34 35#include <mach/map.h> 36#include <mach/regs-clock.h> 37 38#include <plat/gpio-cfg.h> 39#include <plat/regs-serial.h> 40#include <plat/s5pv210.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/* Following are default values for UCON, ULCON and UFCON UART registers */ 58#define GONI_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \ 59 S3C2410_UCON_RXILEVEL | \ 60 S3C2410_UCON_TXIRQMODE | \ 61 S3C2410_UCON_RXIRQMODE | \ 62 S3C2410_UCON_RXFIFO_TOI | \ 63 S3C2443_UCON_RXERR_IRQEN) 64 65#define GONI_ULCON_DEFAULT S3C2410_LCON_CS8 66 67#define GONI_UFCON_DEFAULT S3C2410_UFCON_FIFOMODE 68 69static struct s3c2410_uartcfg goni_uartcfgs[] __initdata = { 70 [0] = { 71 .hwport = 0, 72 .flags = 0, 73 .ucon = GONI_UCON_DEFAULT, 74 .ulcon = GONI_ULCON_DEFAULT, 75 .ufcon = GONI_UFCON_DEFAULT | 76 S5PV210_UFCON_TXTRIG256 | S5PV210_UFCON_RXTRIG256, 77 }, 78 [1] = { 79 .hwport = 1, 80 .flags = 0, 81 .ucon = GONI_UCON_DEFAULT, 82 .ulcon = GONI_ULCON_DEFAULT, 83 .ufcon = GONI_UFCON_DEFAULT | 84 S5PV210_UFCON_TXTRIG64 | S5PV210_UFCON_RXTRIG64, 85 }, 86 [2] = { 87 .hwport = 2, 88 .flags = 0, 89 .ucon = GONI_UCON_DEFAULT, 90 .ulcon = GONI_ULCON_DEFAULT, 91 .ufcon = GONI_UFCON_DEFAULT | 92 S5PV210_UFCON_TXTRIG16 | S5PV210_UFCON_RXTRIG16, 93 }, 94 [3] = { 95 .hwport = 3, 96 .flags = 0, 97 .ucon = GONI_UCON_DEFAULT, 98 .ulcon = GONI_ULCON_DEFAULT, 99 .ufcon = GONI_UFCON_DEFAULT | 100 S5PV210_UFCON_TXTRIG16 | S5PV210_UFCON_RXTRIG16, 101 }, 102}; 103 104/* Frame Buffer */ 105static struct s3c_fb_pd_win goni_fb_win0 = { 106 .win_mode = { 107 .left_margin = 16, 108 .right_margin = 16, 109 .upper_margin = 2, 110 .lower_margin = 28, 111 .hsync_len = 2, 112 .vsync_len = 1, 113 .xres = 480, 114 .yres = 800, 115 .refresh = 55, 116 }, 117 .max_bpp = 32, 118 .default_bpp = 16, 119 .virtual_x = 480, 120 .virtual_y = 2 * 800, 121}; 122 123static struct s3c_fb_platdata goni_lcd_pdata __initdata = { 124 .win[0] = &goni_fb_win0, 125 .vidcon0 = VIDCON0_VIDOUT_RGB | VIDCON0_PNRMODE_RGB | 126 VIDCON0_CLKSEL_LCD, 127 .vidcon1 = VIDCON1_INV_VCLK | VIDCON1_INV_VDEN 128 | VIDCON1_INV_HSYNC | VIDCON1_INV_VSYNC, 129 .setup_gpio = s5pv210_fb_gpio_setup_24bpp, 130}; 131 132static int lcd_power_on(struct lcd_device *ld, int enable) 133{ 134 return 1; 135} 136 137static int reset_lcd(struct lcd_device *ld) 138{ 139 static unsigned int first = 1; 140 int reset_gpio = -1; 141 142 reset_gpio = S5PV210_MP05(5); 143 144 if (first) { 145 gpio_request(reset_gpio, "MLCD_RST"); 146 first = 0; 147 } 148 149 gpio_direction_output(reset_gpio, 1); 150 return 1; 151} 152 153static struct lcd_platform_data goni_lcd_platform_data = { 154 .reset = reset_lcd, 155 .power_on = lcd_power_on, 156 .lcd_enabled = 0, 157 .reset_delay = 120, /* 120ms */ 158 .power_on_delay = 25, /* 25ms */ 159 .power_off_delay = 200, /* 200ms */ 160}; 161 162#define LCD_BUS_NUM 3 163static struct spi_board_info spi_board_info[] __initdata = { 164 { 165 .modalias = "s6e63m0", 166 .platform_data = &goni_lcd_platform_data, 167 .max_speed_hz = 1200000, 168 .bus_num = LCD_BUS_NUM, 169 .chip_select = 0, 170 .mode = SPI_MODE_3, 171 .controller_data = (void *)S5PV210_MP01(1), /* DISPLAY_CS */ 172 }, 173}; 174 175static struct spi_gpio_platform_data lcd_spi_gpio_data = { 176 .sck = S5PV210_MP04(1), /* DISPLAY_CLK */ 177 .mosi = S5PV210_MP04(3), /* DISPLAY_SI */ 178 .miso = SPI_GPIO_NO_MISO, 179 .num_chipselect = 1, 180}; 181 182static struct platform_device goni_spi_gpio = { 183 .name = "spi_gpio", 184 .id = LCD_BUS_NUM, 185 .dev = { 186 .parent = &s3c_device_fb.dev, 187 .platform_data = &lcd_spi_gpio_data, 188 }, 189}; 190 191/* KEYPAD */ 192static uint32_t keymap[] __initdata = { 193 /* KEY(row, col, keycode) */ 194 KEY(0, 1, KEY_MENU), /* Send */ 195 KEY(0, 2, KEY_BACK), /* End */ 196 KEY(1, 1, KEY_CONFIG), /* Half shot */ 197 KEY(1, 2, KEY_VOLUMEUP), 198 KEY(2, 1, KEY_CAMERA), /* Full shot */ 199 KEY(2, 2, KEY_VOLUMEDOWN), 200}; 201 202static struct matrix_keymap_data keymap_data __initdata = { 203 .keymap = keymap, 204 .keymap_size = ARRAY_SIZE(keymap), 205}; 206 207static struct samsung_keypad_platdata keypad_data __initdata = { 208 .keymap_data = &keymap_data, 209 .rows = 3, 210 .cols = 3, 211}; 212 213/* Radio */ 214static struct i2c_board_info i2c1_devs[] __initdata = { 215 { 216 I2C_BOARD_INFO("si470x", 0x10), 217 }, 218}; 219 220static void __init goni_radio_init(void) 221{ 222 int gpio; 223 224 gpio = S5PV210_GPJ2(4); /* XMSMDATA_4 */ 225 gpio_request(gpio, "FM_INT"); 226 s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(0xf)); 227 i2c1_devs[0].irq = gpio_to_irq(gpio); 228 229 gpio = S5PV210_GPJ2(5); /* XMSMDATA_5 */ 230 gpio_request(gpio, "FM_RST"); 231 gpio_direction_output(gpio, 1); 232} 233 234/* TSP */ 235static struct mxt_platform_data qt602240_platform_data = { 236 .x_line = 17, 237 .y_line = 11, 238 .x_size = 800, 239 .y_size = 480, 240 .blen = 0x21, 241 .threshold = 0x28, 242 .voltage = 2800000, /* 2.8V */ 243 .orient = MXT_DIAGONAL, 244 .irqflags = IRQF_TRIGGER_FALLING, 245}; 246 247static struct s3c2410_platform_i2c i2c2_data __initdata = { 248 .flags = 0, 249 .bus_num = 2, 250 .slave_addr = 0x10, 251 .frequency = 400 * 1000, 252 .sda_delay = 100, 253}; 254 255static struct i2c_board_info i2c2_devs[] __initdata = { 256 { 257 I2C_BOARD_INFO("qt602240_ts", 0x4a), 258 .platform_data = &qt602240_platform_data, 259 }, 260}; 261 262static void __init goni_tsp_init(void) 263{ 264 int gpio; 265 266 gpio = S5PV210_GPJ1(3); /* XMSMADDR_11 */ 267 gpio_request(gpio, "TSP_LDO_ON"); 268 gpio_direction_output(gpio, 1); 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 280static 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 291static struct regulator_consumer_supply goni_ldo3_consumers[] = { 292 REGULATOR_SUPPLY("vusb_a", "s3c-hsotg"), 293}; 294 295static struct regulator_consumer_supply goni_ldo5_consumers[] = { 296 REGULATOR_SUPPLY("vmmc", "s3c-sdhci.0"), 297}; 298 299static struct regulator_consumer_supply goni_ldo8_consumers[] = { 300 REGULATOR_SUPPLY("vusb_d", "s3c-hsotg"), 301 REGULATOR_SUPPLY("vdd33a_dac", "s5p-sdo"), 302}; 303 304static struct regulator_consumer_supply goni_ldo11_consumers[] = { 305 REGULATOR_SUPPLY("vddio", "0-0030"), /* "CAM_IO_2.8V" */ 306}; 307 308static struct regulator_consumer_supply goni_ldo13_consumers[] = { 309 REGULATOR_SUPPLY("vdda", "0-0030"), /* "CAM_A_2.8V" */ 310}; 311 312static struct regulator_consumer_supply goni_ldo14_consumers[] = { 313 REGULATOR_SUPPLY("vdd_core", "0-0030"), /* "CAM_CIF_1.8V" */ 314}; 315 316static 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 329static 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 341static 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 350static 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 362static 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 371static 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 381static 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 393static 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 402static 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 412static 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 424static 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 433static 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 445static 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 457static 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 466static 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 475static 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 */ 486static struct regulator_consumer_supply buck1_consumer = 487 REGULATOR_SUPPLY("vddarm", NULL); 488 489static struct regulator_consumer_supply buck2_consumer = 490 REGULATOR_SUPPLY("vddint", NULL); 491 492static struct regulator_consumer_supply buck3_consumer = 493 REGULATOR_SUPPLY("vdet", "s5p-sdo"); 494 495 496static 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 509static 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 522static 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 536static 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 546static 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 569static 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 584static 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 590static struct regulator_consumer_supply wm8994_fixed_voltage1_supplies[] = { 591 REGULATOR_SUPPLY("SPKVDD1", "5-001a"), 592 REGULATOR_SUPPLY("SPKVDD2", "5-001a"), 593}; 594 595static 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 603static 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 611static 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 618static 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 625static 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 633static 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 641static struct regulator_consumer_supply wm8994_avdd1_supply = 642 REGULATOR_SUPPLY("AVDD1", "5-001a"); 643 644static struct regulator_consumer_supply wm8994_dcvdd_supply = 645 REGULATOR_SUPPLY("DCVDD", "5-001a"); 646 647static 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 656static 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 664static 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 683static 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 688static 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 696static 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 708static 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 713static 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 721static 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 */ 730static 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 742static 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 747static struct platform_device goni_device_gpiokeys = { 748 .name = "gpio-keys", 749 .dev = { 750 .platform_data = &goni_gpio_keys_data, 751 }, 752}; 753 754static 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 */ 766static struct s3c_sdhci_platdata goni_hsmmc0_data __initdata = { 767 .max_width = 4, 768 .cd_type = S3C_SDHCI_CD_PERMANENT, 769}; 770 771/* Wireless LAN */ 772static 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) 781static 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 788static struct regulator_consumer_supply mmc2_supplies[] = { 789 REGULATOR_SUPPLY("vmmc", "s3c-sdhci.2"), 790}; 791 792static 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 801static 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 809static 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 817static 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 824static 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 830static struct i2c_board_info noon010pc30_board_info = { 831 I2C_BOARD_INFO("NOON010PC30", 0x60 >> 1), 832 .platform_data = &noon010pc30_pldata, 833}; 834 835static 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 847struct s5p_platform_fimc goni_fimc_md_platdata __initdata = { 848 .isp_info = goni_camera_sensors, 849 .num_clients = ARRAY_SIZE(goni_camera_sensors), 850}; 851 852static 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 882static 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 891static void __init goni_map_io(void) 892{ 893 s5p_init_io(NULL, 0, S5P_VA_CHIPID); 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 899static void __init goni_reserve(void) 900{ 901 s5p_mfc_reserve_mem(0x43000000, 8 << 20, 0x51000000, 8 << 20); 902} 903 904static 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 955MACHINE_START(GONI, "GONI") 956 /* Maintainers: Kyungmin Park <kyungmin.park@samsung.com> */ 957 .boot_params = S5P_PA_SDRAM + 0x100, 958 .init_irq = s5pv210_init_irq, 959 .map_io = goni_map_io, 960 .init_machine = goni_machine_init, 961 .timer = &s5p_timer, 962 .reserve = &goni_reserve, 963MACHINE_END 964