1/* 2 * Copyright (c) 2003-2005 Simtec Electronics 3 * Ben Dooks <ben@simtec.co.uk> 4 * 5 * http://www.handhelds.org/projects/h1940.html 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License version 2 as 9 * published by the Free Software Foundation. 10 * 11*/ 12 13#include <linux/kernel.h> 14#include <linux/types.h> 15#include <linux/interrupt.h> 16#include <linux/list.h> 17#include <linux/memblock.h> 18#include <linux/timer.h> 19#include <linux/init.h> 20#include <linux/device.h> 21#include <linux/serial_core.h> 22#include <linux/serial_s3c.h> 23#include <linux/platform_device.h> 24#include <linux/io.h> 25#include <linux/gpio.h> 26#include <linux/input.h> 27#include <linux/gpio_keys.h> 28#include <linux/pwm_backlight.h> 29#include <linux/i2c.h> 30#include <linux/leds.h> 31#include <linux/pda_power.h> 32#include <linux/s3c_adc_battery.h> 33#include <linux/delay.h> 34 35#include <video/platform_lcd.h> 36 37#include <linux/mmc/host.h> 38#include <linux/export.h> 39 40#include <asm/irq.h> 41#include <asm/mach-types.h> 42#include <asm/mach/arch.h> 43#include <asm/mach/map.h> 44#include <asm/mach/irq.h> 45 46#include <linux/platform_data/i2c-s3c2410.h> 47#include <linux/platform_data/mmc-s3cmci.h> 48#include <linux/platform_data/touchscreen-s3c2410.h> 49#include <linux/platform_data/usb-s3c2410_udc.h> 50 51#include <sound/uda1380.h> 52 53#include <mach/fb.h> 54#include <mach/hardware.h> 55#include <mach/regs-clock.h> 56#include <mach/regs-gpio.h> 57#include <mach/regs-lcd.h> 58#include <mach/gpio-samsung.h> 59 60#include <plat/cpu.h> 61#include <plat/devs.h> 62#include <plat/gpio-cfg.h> 63#include <plat/pm.h> 64#include <plat/samsung-time.h> 65 66#include "common.h" 67#include "h1940.h" 68 69#define H1940_LATCH ((void __force __iomem *)0xF8000000) 70 71#define H1940_PA_LATCH S3C2410_CS2 72 73#define H1940_LATCH_BIT(x) (1 << ((x) + 16 - S3C_GPIO_END)) 74 75#define S3C24XX_PLL_MDIV_SHIFT (12) 76#define S3C24XX_PLL_PDIV_SHIFT (4) 77#define S3C24XX_PLL_SDIV_SHIFT (0) 78 79static struct map_desc h1940_iodesc[] __initdata = { 80 [0] = { 81 .virtual = (unsigned long)H1940_LATCH, 82 .pfn = __phys_to_pfn(H1940_PA_LATCH), 83 .length = SZ_16K, 84 .type = MT_DEVICE 85 }, 86}; 87 88#define UCON S3C2410_UCON_DEFAULT | S3C2410_UCON_UCLK 89#define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB 90#define UFCON S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE 91 92static struct s3c2410_uartcfg h1940_uartcfgs[] __initdata = { 93 [0] = { 94 .hwport = 0, 95 .flags = 0, 96 .ucon = 0x3c5, 97 .ulcon = 0x03, 98 .ufcon = 0x51, 99 }, 100 [1] = { 101 .hwport = 1, 102 .flags = 0, 103 .ucon = 0x245, 104 .ulcon = 0x03, 105 .ufcon = 0x00, 106 }, 107 /* IR port */ 108 [2] = { 109 .hwport = 2, 110 .flags = 0, 111 .uart_flags = UPF_CONS_FLOW, 112 .ucon = 0x3c5, 113 .ulcon = 0x43, 114 .ufcon = 0x51, 115 } 116}; 117 118/* Board control latch control */ 119 120static unsigned int latch_state; 121 122static void h1940_latch_control(unsigned int clear, unsigned int set) 123{ 124 unsigned long flags; 125 126 local_irq_save(flags); 127 128 latch_state &= ~clear; 129 latch_state |= set; 130 131 __raw_writel(latch_state, H1940_LATCH); 132 133 local_irq_restore(flags); 134} 135 136static inline int h1940_gpiolib_to_latch(int offset) 137{ 138 return 1 << (offset + 16); 139} 140 141static void h1940_gpiolib_latch_set(struct gpio_chip *chip, 142 unsigned offset, int value) 143{ 144 int latch_bit = h1940_gpiolib_to_latch(offset); 145 146 h1940_latch_control(value ? 0 : latch_bit, 147 value ? latch_bit : 0); 148} 149 150static int h1940_gpiolib_latch_output(struct gpio_chip *chip, 151 unsigned offset, int value) 152{ 153 h1940_gpiolib_latch_set(chip, offset, value); 154 return 0; 155} 156 157static int h1940_gpiolib_latch_get(struct gpio_chip *chip, 158 unsigned offset) 159{ 160 return (latch_state >> (offset + 16)) & 1; 161} 162 163static struct gpio_chip h1940_latch_gpiochip = { 164 .base = H1940_LATCH_GPIO(0), 165 .owner = THIS_MODULE, 166 .label = "H1940_LATCH", 167 .ngpio = 16, 168 .direction_output = h1940_gpiolib_latch_output, 169 .set = h1940_gpiolib_latch_set, 170 .get = h1940_gpiolib_latch_get, 171}; 172 173static struct s3c2410_udc_mach_info h1940_udc_cfg __initdata = { 174 .vbus_pin = S3C2410_GPG(5), 175 .vbus_pin_inverted = 1, 176 .pullup_pin = H1940_LATCH_USB_DP, 177}; 178 179static struct s3c2410_ts_mach_info h1940_ts_cfg __initdata = { 180 .delay = 10000, 181 .presc = 49, 182 .oversampling_shift = 2, 183 .cfg_gpio = s3c24xx_ts_cfg_gpio, 184}; 185 186/** 187 * Set lcd on or off 188 **/ 189static struct s3c2410fb_display h1940_lcd __initdata = { 190 .lcdcon5= S3C2410_LCDCON5_FRM565 | \ 191 S3C2410_LCDCON5_INVVLINE | \ 192 S3C2410_LCDCON5_HWSWP, 193 194 .type = S3C2410_LCDCON1_TFT, 195 .width = 240, 196 .height = 320, 197 .pixclock = 260000, 198 .xres = 240, 199 .yres = 320, 200 .bpp = 16, 201 .left_margin = 8, 202 .right_margin = 20, 203 .hsync_len = 4, 204 .upper_margin = 8, 205 .lower_margin = 7, 206 .vsync_len = 1, 207}; 208 209static struct s3c2410fb_mach_info h1940_fb_info __initdata = { 210 .displays = &h1940_lcd, 211 .num_displays = 1, 212 .default_display = 0, 213 214 .lpcsel = 0x02, 215 .gpccon = 0xaa940659, 216 .gpccon_mask = 0xffffc0f0, 217 .gpcup = 0x0000ffff, 218 .gpcup_mask = 0xffffffff, 219 .gpdcon = 0xaa84aaa0, 220 .gpdcon_mask = 0xffffffff, 221 .gpdup = 0x0000faff, 222 .gpdup_mask = 0xffffffff, 223}; 224 225static int power_supply_init(struct device *dev) 226{ 227 return gpio_request(S3C2410_GPF(2), "cable plugged"); 228} 229 230static int h1940_is_ac_online(void) 231{ 232 return !gpio_get_value(S3C2410_GPF(2)); 233} 234 235static void power_supply_exit(struct device *dev) 236{ 237 gpio_free(S3C2410_GPF(2)); 238} 239 240static char *h1940_supplicants[] = { 241 "main-battery", 242 "backup-battery", 243}; 244 245static struct pda_power_pdata power_supply_info = { 246 .init = power_supply_init, 247 .is_ac_online = h1940_is_ac_online, 248 .exit = power_supply_exit, 249 .supplied_to = h1940_supplicants, 250 .num_supplicants = ARRAY_SIZE(h1940_supplicants), 251}; 252 253static struct resource power_supply_resources[] = { 254 [0] = DEFINE_RES_NAMED(IRQ_EINT2, 1, "ac", IORESOURCE_IRQ \ 255 | IORESOURCE_IRQ_LOWEDGE | IORESOURCE_IRQ_HIGHEDGE), 256}; 257 258static struct platform_device power_supply = { 259 .name = "pda-power", 260 .id = -1, 261 .dev = { 262 .platform_data = 263 &power_supply_info, 264 }, 265 .resource = power_supply_resources, 266 .num_resources = ARRAY_SIZE(power_supply_resources), 267}; 268 269static const struct s3c_adc_bat_thresh bat_lut_noac[] = { 270 { .volt = 4070, .cur = 162, .level = 100}, 271 { .volt = 4040, .cur = 165, .level = 95}, 272 { .volt = 4016, .cur = 164, .level = 90}, 273 { .volt = 3996, .cur = 166, .level = 85}, 274 { .volt = 3971, .cur = 168, .level = 80}, 275 { .volt = 3951, .cur = 168, .level = 75}, 276 { .volt = 3931, .cur = 170, .level = 70}, 277 { .volt = 3903, .cur = 172, .level = 65}, 278 { .volt = 3886, .cur = 172, .level = 60}, 279 { .volt = 3858, .cur = 176, .level = 55}, 280 { .volt = 3842, .cur = 176, .level = 50}, 281 { .volt = 3818, .cur = 176, .level = 45}, 282 { .volt = 3789, .cur = 180, .level = 40}, 283 { .volt = 3769, .cur = 180, .level = 35}, 284 { .volt = 3749, .cur = 184, .level = 30}, 285 { .volt = 3732, .cur = 184, .level = 25}, 286 { .volt = 3716, .cur = 184, .level = 20}, 287 { .volt = 3708, .cur = 184, .level = 15}, 288 { .volt = 3716, .cur = 96, .level = 10}, 289 { .volt = 3700, .cur = 96, .level = 5}, 290 { .volt = 3684, .cur = 96, .level = 0}, 291}; 292 293static const struct s3c_adc_bat_thresh bat_lut_acin[] = { 294 { .volt = 4130, .cur = 0, .level = 100}, 295 { .volt = 3982, .cur = 0, .level = 50}, 296 { .volt = 3854, .cur = 0, .level = 10}, 297 { .volt = 3841, .cur = 0, .level = 0}, 298}; 299 300static int h1940_bat_init(void) 301{ 302 int ret; 303 304 ret = gpio_request(H1940_LATCH_SM803_ENABLE, "h1940-charger-enable"); 305 if (ret) 306 return ret; 307 gpio_direction_output(H1940_LATCH_SM803_ENABLE, 0); 308 309 return 0; 310 311} 312 313static void h1940_bat_exit(void) 314{ 315 gpio_free(H1940_LATCH_SM803_ENABLE); 316} 317 318static void h1940_enable_charger(void) 319{ 320 gpio_set_value(H1940_LATCH_SM803_ENABLE, 1); 321} 322 323static void h1940_disable_charger(void) 324{ 325 gpio_set_value(H1940_LATCH_SM803_ENABLE, 0); 326} 327 328static struct s3c_adc_bat_pdata h1940_bat_cfg = { 329 .init = h1940_bat_init, 330 .exit = h1940_bat_exit, 331 .enable_charger = h1940_enable_charger, 332 .disable_charger = h1940_disable_charger, 333 .gpio_charge_finished = S3C2410_GPF(3), 334 .gpio_inverted = 1, 335 .lut_noac = bat_lut_noac, 336 .lut_noac_cnt = ARRAY_SIZE(bat_lut_noac), 337 .lut_acin = bat_lut_acin, 338 .lut_acin_cnt = ARRAY_SIZE(bat_lut_acin), 339 .volt_channel = 0, 340 .current_channel = 1, 341 .volt_mult = 4056, 342 .current_mult = 1893, 343 .internal_impedance = 200, 344 .backup_volt_channel = 3, 345 /* TODO Check backup volt multiplier */ 346 .backup_volt_mult = 4056, 347 .backup_volt_min = 0, 348 .backup_volt_max = 4149288 349}; 350 351static struct platform_device h1940_battery = { 352 .name = "s3c-adc-battery", 353 .id = -1, 354 .dev = { 355 .parent = &s3c_device_adc.dev, 356 .platform_data = &h1940_bat_cfg, 357 }, 358}; 359 360static DEFINE_SPINLOCK(h1940_blink_spin); 361 362int h1940_led_blink_set(struct gpio_desc *desc, int state, 363 unsigned long *delay_on, unsigned long *delay_off) 364{ 365 int blink_gpio, check_gpio1, check_gpio2; 366 int gpio = desc ? desc_to_gpio(desc) : -EINVAL; 367 368 switch (gpio) { 369 case H1940_LATCH_LED_GREEN: 370 blink_gpio = S3C2410_GPA(7); 371 check_gpio1 = S3C2410_GPA(1); 372 check_gpio2 = S3C2410_GPA(3); 373 break; 374 case H1940_LATCH_LED_RED: 375 blink_gpio = S3C2410_GPA(1); 376 check_gpio1 = S3C2410_GPA(7); 377 check_gpio2 = S3C2410_GPA(3); 378 break; 379 default: 380 blink_gpio = S3C2410_GPA(3); 381 check_gpio1 = S3C2410_GPA(1); 382 check_gpio2 = S3C2410_GPA(7); 383 break; 384 } 385 386 if (delay_on && delay_off && !*delay_on && !*delay_off) 387 *delay_on = *delay_off = 500; 388 389 spin_lock(&h1940_blink_spin); 390 391 switch (state) { 392 case GPIO_LED_NO_BLINK_LOW: 393 case GPIO_LED_NO_BLINK_HIGH: 394 if (!gpio_get_value(check_gpio1) && 395 !gpio_get_value(check_gpio2)) 396 gpio_set_value(H1940_LATCH_LED_FLASH, 0); 397 gpio_set_value(blink_gpio, 0); 398 if (gpio_is_valid(gpio)) 399 gpio_set_value(gpio, state); 400 break; 401 case GPIO_LED_BLINK: 402 if (gpio_is_valid(gpio)) 403 gpio_set_value(gpio, 0); 404 gpio_set_value(H1940_LATCH_LED_FLASH, 1); 405 gpio_set_value(blink_gpio, 1); 406 break; 407 } 408 409 spin_unlock(&h1940_blink_spin); 410 411 return 0; 412} 413EXPORT_SYMBOL(h1940_led_blink_set); 414 415static struct gpio_led h1940_leds_desc[] = { 416 { 417 .name = "Green", 418 .default_trigger = "main-battery-full", 419 .gpio = H1940_LATCH_LED_GREEN, 420 .retain_state_suspended = 1, 421 }, 422 { 423 .name = "Red", 424 .default_trigger 425 = "main-battery-charging-blink-full-solid", 426 .gpio = H1940_LATCH_LED_RED, 427 .retain_state_suspended = 1, 428 }, 429}; 430 431static struct gpio_led_platform_data h1940_leds_pdata = { 432 .num_leds = ARRAY_SIZE(h1940_leds_desc), 433 .leds = h1940_leds_desc, 434 .gpio_blink_set = h1940_led_blink_set, 435}; 436 437static struct platform_device h1940_device_leds = { 438 .name = "leds-gpio", 439 .id = -1, 440 .dev = { 441 .platform_data = &h1940_leds_pdata, 442 }, 443}; 444 445static struct platform_device h1940_device_bluetooth = { 446 .name = "h1940-bt", 447 .id = -1, 448}; 449 450static void h1940_set_mmc_power(unsigned char power_mode, unsigned short vdd) 451{ 452 switch (power_mode) { 453 case MMC_POWER_OFF: 454 gpio_set_value(H1940_LATCH_SD_POWER, 0); 455 break; 456 case MMC_POWER_UP: 457 case MMC_POWER_ON: 458 gpio_set_value(H1940_LATCH_SD_POWER, 1); 459 break; 460 default: 461 break; 462 } 463} 464 465static struct s3c24xx_mci_pdata h1940_mmc_cfg __initdata = { 466 .gpio_detect = S3C2410_GPF(5), 467 .gpio_wprotect = S3C2410_GPH(8), 468 .set_power = h1940_set_mmc_power, 469 .ocr_avail = MMC_VDD_32_33, 470}; 471 472static int h1940_backlight_init(struct device *dev) 473{ 474 gpio_request(S3C2410_GPB(0), "Backlight"); 475 476 gpio_direction_output(S3C2410_GPB(0), 0); 477 s3c_gpio_setpull(S3C2410_GPB(0), S3C_GPIO_PULL_NONE); 478 s3c_gpio_cfgpin(S3C2410_GPB(0), S3C2410_GPB0_TOUT0); 479 gpio_set_value(H1940_LATCH_MAX1698_nSHUTDOWN, 1); 480 481 return 0; 482} 483 484static int h1940_backlight_notify(struct device *dev, int brightness) 485{ 486 if (!brightness) { 487 gpio_direction_output(S3C2410_GPB(0), 1); 488 gpio_set_value(H1940_LATCH_MAX1698_nSHUTDOWN, 0); 489 } else { 490 gpio_direction_output(S3C2410_GPB(0), 0); 491 s3c_gpio_setpull(S3C2410_GPB(0), S3C_GPIO_PULL_NONE); 492 s3c_gpio_cfgpin(S3C2410_GPB(0), S3C2410_GPB0_TOUT0); 493 gpio_set_value(H1940_LATCH_MAX1698_nSHUTDOWN, 1); 494 } 495 return brightness; 496} 497 498static void h1940_backlight_exit(struct device *dev) 499{ 500 gpio_direction_output(S3C2410_GPB(0), 1); 501 gpio_set_value(H1940_LATCH_MAX1698_nSHUTDOWN, 0); 502} 503 504 505static struct platform_pwm_backlight_data backlight_data = { 506 .pwm_id = 0, 507 .max_brightness = 100, 508 .dft_brightness = 50, 509 /* tcnt = 0x31 */ 510 .pwm_period_ns = 36296, 511 .enable_gpio = -1, 512 .init = h1940_backlight_init, 513 .notify = h1940_backlight_notify, 514 .exit = h1940_backlight_exit, 515}; 516 517static struct platform_device h1940_backlight = { 518 .name = "pwm-backlight", 519 .dev = { 520 .parent = &samsung_device_pwm.dev, 521 .platform_data = &backlight_data, 522 }, 523 .id = -1, 524}; 525 526static void h1940_lcd_power_set(struct plat_lcd_data *pd, 527 unsigned int power) 528{ 529 int value, retries = 100; 530 531 if (!power) { 532 gpio_set_value(S3C2410_GPC(0), 0); 533 /* wait for 3ac */ 534 do { 535 value = gpio_get_value(S3C2410_GPC(6)); 536 } while (value && retries--); 537 538 gpio_set_value(H1940_LATCH_LCD_P2, 0); 539 gpio_set_value(H1940_LATCH_LCD_P3, 0); 540 gpio_set_value(H1940_LATCH_LCD_P4, 0); 541 542 gpio_direction_output(S3C2410_GPC(1), 0); 543 gpio_direction_output(S3C2410_GPC(4), 0); 544 545 gpio_set_value(H1940_LATCH_LCD_P1, 0); 546 gpio_set_value(H1940_LATCH_LCD_P0, 0); 547 548 gpio_set_value(S3C2410_GPC(5), 0); 549 550 } else { 551 gpio_set_value(H1940_LATCH_LCD_P0, 1); 552 gpio_set_value(H1940_LATCH_LCD_P1, 1); 553 554 gpio_direction_input(S3C2410_GPC(1)); 555 gpio_direction_input(S3C2410_GPC(4)); 556 mdelay(10); 557 s3c_gpio_cfgpin(S3C2410_GPC(1), S3C_GPIO_SFN(2)); 558 s3c_gpio_cfgpin(S3C2410_GPC(4), S3C_GPIO_SFN(2)); 559 560 gpio_set_value(S3C2410_GPC(5), 1); 561 gpio_set_value(S3C2410_GPC(0), 1); 562 563 gpio_set_value(H1940_LATCH_LCD_P3, 1); 564 gpio_set_value(H1940_LATCH_LCD_P2, 1); 565 gpio_set_value(H1940_LATCH_LCD_P4, 1); 566 } 567} 568 569static struct plat_lcd_data h1940_lcd_power_data = { 570 .set_power = h1940_lcd_power_set, 571}; 572 573static struct platform_device h1940_lcd_powerdev = { 574 .name = "platform-lcd", 575 .dev.parent = &s3c_device_lcd.dev, 576 .dev.platform_data = &h1940_lcd_power_data, 577}; 578 579static struct uda1380_platform_data uda1380_info = { 580 .gpio_power = H1940_LATCH_UDA_POWER, 581 .gpio_reset = S3C2410_GPA(12), 582 .dac_clk = UDA1380_DAC_CLK_SYSCLK, 583}; 584 585static struct i2c_board_info h1940_i2c_devices[] = { 586 { 587 I2C_BOARD_INFO("uda1380", 0x1a), 588 .platform_data = &uda1380_info, 589 }, 590}; 591 592#define DECLARE_BUTTON(p, k, n, w) \ 593 { \ 594 .gpio = p, \ 595 .code = k, \ 596 .desc = n, \ 597 .wakeup = w, \ 598 .active_low = 1, \ 599 } 600 601static struct gpio_keys_button h1940_buttons[] = { 602 DECLARE_BUTTON(S3C2410_GPF(0), KEY_POWER, "Power", 1), 603 DECLARE_BUTTON(S3C2410_GPF(6), KEY_ENTER, "Select", 1), 604 DECLARE_BUTTON(S3C2410_GPF(7), KEY_RECORD, "Record", 0), 605 DECLARE_BUTTON(S3C2410_GPG(0), KEY_F11, "Calendar", 0), 606 DECLARE_BUTTON(S3C2410_GPG(2), KEY_F12, "Contacts", 0), 607 DECLARE_BUTTON(S3C2410_GPG(3), KEY_MAIL, "Mail", 0), 608 DECLARE_BUTTON(S3C2410_GPG(6), KEY_LEFT, "Left_arrow", 0), 609 DECLARE_BUTTON(S3C2410_GPG(7), KEY_HOMEPAGE, "Home", 0), 610 DECLARE_BUTTON(S3C2410_GPG(8), KEY_RIGHT, "Right_arrow", 0), 611 DECLARE_BUTTON(S3C2410_GPG(9), KEY_UP, "Up_arrow", 0), 612 DECLARE_BUTTON(S3C2410_GPG(10), KEY_DOWN, "Down_arrow", 0), 613}; 614 615static struct gpio_keys_platform_data h1940_buttons_data = { 616 .buttons = h1940_buttons, 617 .nbuttons = ARRAY_SIZE(h1940_buttons), 618}; 619 620static struct platform_device h1940_dev_buttons = { 621 .name = "gpio-keys", 622 .id = -1, 623 .dev = { 624 .platform_data = &h1940_buttons_data, 625 } 626}; 627 628static struct platform_device *h1940_devices[] __initdata = { 629 &h1940_dev_buttons, 630 &s3c_device_ohci, 631 &s3c_device_lcd, 632 &s3c_device_wdt, 633 &s3c_device_i2c0, 634 &s3c_device_iis, 635 &s3c_device_usbgadget, 636 &h1940_device_leds, 637 &h1940_device_bluetooth, 638 &s3c_device_sdi, 639 &s3c_device_rtc, 640 &samsung_device_pwm, 641 &h1940_backlight, 642 &h1940_lcd_powerdev, 643 &s3c_device_adc, 644 &s3c_device_ts, 645 &power_supply, 646 &h1940_battery, 647}; 648 649static void __init h1940_map_io(void) 650{ 651 s3c24xx_init_io(h1940_iodesc, ARRAY_SIZE(h1940_iodesc)); 652 s3c24xx_init_uarts(h1940_uartcfgs, ARRAY_SIZE(h1940_uartcfgs)); 653 samsung_set_timer_source(SAMSUNG_PWM3, SAMSUNG_PWM4); 654 655 /* setup PM */ 656 657#ifdef CONFIG_PM_H1940 658 memcpy(phys_to_virt(H1940_SUSPEND_RESUMEAT), h1940_pm_return, 1024); 659#endif 660 s3c_pm_init(); 661 662 /* Add latch gpio chip, set latch initial value */ 663 h1940_latch_control(0, 0); 664 WARN_ON(gpiochip_add(&h1940_latch_gpiochip)); 665} 666 667static void __init h1940_init_time(void) 668{ 669 s3c2410_init_clocks(12000000); 670 samsung_timer_init(); 671} 672 673/* H1940 and RX3715 need to reserve this for suspend */ 674static void __init h1940_reserve(void) 675{ 676 memblock_reserve(0x30003000, 0x1000); 677 memblock_reserve(0x30081000, 0x1000); 678} 679 680static void __init h1940_init(void) 681{ 682 u32 tmp; 683 684 s3c24xx_fb_set_platdata(&h1940_fb_info); 685 s3c24xx_mci_set_platdata(&h1940_mmc_cfg); 686 s3c24xx_udc_set_platdata(&h1940_udc_cfg); 687 s3c24xx_ts_set_platdata(&h1940_ts_cfg); 688 s3c_i2c0_set_platdata(NULL); 689 690 /* Turn off suspend on both USB ports, and switch the 691 * selectable USB port to USB device mode. */ 692 693 s3c2410_modify_misccr(S3C2410_MISCCR_USBHOST | 694 S3C2410_MISCCR_USBSUSPND0 | 695 S3C2410_MISCCR_USBSUSPND1, 0x0); 696 697 tmp = (0x78 << S3C24XX_PLL_MDIV_SHIFT) 698 | (0x02 << S3C24XX_PLL_PDIV_SHIFT) 699 | (0x03 << S3C24XX_PLL_SDIV_SHIFT); 700 writel(tmp, S3C2410_UPLLCON); 701 702 gpio_request(S3C2410_GPC(0), "LCD power"); 703 gpio_request(S3C2410_GPC(1), "LCD power"); 704 gpio_request(S3C2410_GPC(4), "LCD power"); 705 gpio_request(S3C2410_GPC(5), "LCD power"); 706 gpio_request(S3C2410_GPC(6), "LCD power"); 707 gpio_request(H1940_LATCH_LCD_P0, "LCD power"); 708 gpio_request(H1940_LATCH_LCD_P1, "LCD power"); 709 gpio_request(H1940_LATCH_LCD_P2, "LCD power"); 710 gpio_request(H1940_LATCH_LCD_P3, "LCD power"); 711 gpio_request(H1940_LATCH_LCD_P4, "LCD power"); 712 gpio_request(H1940_LATCH_MAX1698_nSHUTDOWN, "LCD power"); 713 gpio_direction_output(S3C2410_GPC(0), 0); 714 gpio_direction_output(S3C2410_GPC(1), 0); 715 gpio_direction_output(S3C2410_GPC(4), 0); 716 gpio_direction_output(S3C2410_GPC(5), 0); 717 gpio_direction_input(S3C2410_GPC(6)); 718 gpio_direction_output(H1940_LATCH_LCD_P0, 0); 719 gpio_direction_output(H1940_LATCH_LCD_P1, 0); 720 gpio_direction_output(H1940_LATCH_LCD_P2, 0); 721 gpio_direction_output(H1940_LATCH_LCD_P3, 0); 722 gpio_direction_output(H1940_LATCH_LCD_P4, 0); 723 gpio_direction_output(H1940_LATCH_MAX1698_nSHUTDOWN, 0); 724 725 gpio_request(H1940_LATCH_SD_POWER, "SD power"); 726 gpio_direction_output(H1940_LATCH_SD_POWER, 0); 727 728 platform_add_devices(h1940_devices, ARRAY_SIZE(h1940_devices)); 729 730 gpio_request(S3C2410_GPA(1), "Red LED blink"); 731 gpio_request(S3C2410_GPA(3), "Blue LED blink"); 732 gpio_request(S3C2410_GPA(7), "Green LED blink"); 733 gpio_request(H1940_LATCH_LED_FLASH, "LED blink"); 734 gpio_direction_output(S3C2410_GPA(1), 0); 735 gpio_direction_output(S3C2410_GPA(3), 0); 736 gpio_direction_output(S3C2410_GPA(7), 0); 737 gpio_direction_output(H1940_LATCH_LED_FLASH, 0); 738 739 i2c_register_board_info(0, h1940_i2c_devices, 740 ARRAY_SIZE(h1940_i2c_devices)); 741} 742 743MACHINE_START(H1940, "IPAQ-H1940") 744 /* Maintainer: Ben Dooks <ben-linux@fluff.org> */ 745 .atag_offset = 0x100, 746 .map_io = h1940_map_io, 747 .reserve = h1940_reserve, 748 .init_irq = s3c2410_init_irq, 749 .init_machine = h1940_init, 750 .init_time = h1940_init_time, 751MACHINE_END 752