mach-n30.c (17573B)
1// SPDX-License-Identifier: GPL-2.0 2// 3// Machine specific code for the Acer n30, Acer N35, Navman PiN 570, 4// Yakumo AlphaX and Airis NC05 PDAs. 5// 6// Copyright (c) 2003-2005 Simtec Electronics 7// Ben Dooks <ben@simtec.co.uk> 8// 9// Copyright (c) 2005-2008 Christer Weinigel <christer@weinigel.se> 10// 11// There is a wiki with more information about the n30 port at 12// https://handhelds.org/moin/moin.cgi/AcerN30Documentation . 13 14#include <linux/kernel.h> 15#include <linux/types.h> 16 17#include <linux/gpio_keys.h> 18#include <linux/init.h> 19#include <linux/gpio.h> 20#include <linux/gpio/machine.h> 21#include <linux/input.h> 22#include <linux/interrupt.h> 23#include <linux/platform_device.h> 24#include <linux/serial_core.h> 25#include <linux/serial_s3c.h> 26#include <linux/timer.h> 27#include <linux/io.h> 28#include <linux/mmc/host.h> 29 30#include "hardware-s3c24xx.h" 31#include <asm/irq.h> 32#include <asm/mach-types.h> 33 34#include <linux/platform_data/fb-s3c2410.h> 35#include <linux/platform_data/leds-s3c24xx.h> 36#include "regs-gpio.h" 37#include "gpio-samsung.h" 38#include "gpio-cfg.h" 39 40#include <asm/mach/arch.h> 41#include <asm/mach/irq.h> 42#include <asm/mach/map.h> 43 44#include <linux/platform_data/i2c-s3c2410.h> 45 46#include "cpu.h" 47#include "devs.h" 48#include <linux/platform_data/mmc-s3cmci.h> 49#include <linux/platform_data/usb-s3c2410_udc.h> 50 51#include "s3c24xx.h" 52 53static struct map_desc n30_iodesc[] __initdata = { 54 /* nothing here yet */ 55}; 56 57static struct s3c2410_uartcfg n30_uartcfgs[] = { 58 /* Normal serial port */ 59 [0] = { 60 .hwport = 0, 61 .flags = 0, 62 .ucon = 0x2c5, 63 .ulcon = 0x03, 64 .ufcon = 0x51, 65 }, 66 /* IR port */ 67 [1] = { 68 .hwport = 1, 69 .flags = 0, 70 .uart_flags = UPF_CONS_FLOW, 71 .ucon = 0x2c5, 72 .ulcon = 0x43, 73 .ufcon = 0x51, 74 }, 75 /* On the N30 the bluetooth controller is connected here. 76 * On the N35 and variants the GPS receiver is connected here. */ 77 [2] = { 78 .hwport = 2, 79 .flags = 0, 80 .ucon = 0x2c5, 81 .ulcon = 0x03, 82 .ufcon = 0x51, 83 }, 84}; 85 86static struct s3c2410_udc_mach_info n30_udc_cfg __initdata = { 87 .vbus_pin = S3C2410_GPG(1), 88 .vbus_pin_inverted = 0, 89 .pullup_pin = S3C2410_GPB(3), 90}; 91 92static struct gpio_keys_button n30_buttons[] = { 93 { 94 .gpio = S3C2410_GPF(0), 95 .code = KEY_POWER, 96 .desc = "Power", 97 .active_low = 0, 98 }, 99 { 100 .gpio = S3C2410_GPG(9), 101 .code = KEY_UP, 102 .desc = "Thumbwheel Up", 103 .active_low = 0, 104 }, 105 { 106 .gpio = S3C2410_GPG(8), 107 .code = KEY_DOWN, 108 .desc = "Thumbwheel Down", 109 .active_low = 0, 110 }, 111 { 112 .gpio = S3C2410_GPG(7), 113 .code = KEY_ENTER, 114 .desc = "Thumbwheel Press", 115 .active_low = 0, 116 }, 117 { 118 .gpio = S3C2410_GPF(7), 119 .code = KEY_HOMEPAGE, 120 .desc = "Home", 121 .active_low = 0, 122 }, 123 { 124 .gpio = S3C2410_GPF(6), 125 .code = KEY_CALENDAR, 126 .desc = "Calendar", 127 .active_low = 0, 128 }, 129 { 130 .gpio = S3C2410_GPF(5), 131 .code = KEY_ADDRESSBOOK, 132 .desc = "Contacts", 133 .active_low = 0, 134 }, 135 { 136 .gpio = S3C2410_GPF(4), 137 .code = KEY_MAIL, 138 .desc = "Mail", 139 .active_low = 0, 140 }, 141}; 142 143static struct gpio_keys_platform_data n30_button_data = { 144 .buttons = n30_buttons, 145 .nbuttons = ARRAY_SIZE(n30_buttons), 146}; 147 148static struct platform_device n30_button_device = { 149 .name = "gpio-keys", 150 .id = -1, 151 .dev = { 152 .platform_data = &n30_button_data, 153 } 154}; 155 156static struct gpio_keys_button n35_buttons[] = { 157 { 158 .gpio = S3C2410_GPF(0), 159 .code = KEY_POWER, 160 .type = EV_PWR, 161 .desc = "Power", 162 .active_low = 0, 163 .wakeup = 1, 164 }, 165 { 166 .gpio = S3C2410_GPG(9), 167 .code = KEY_UP, 168 .desc = "Joystick Up", 169 .active_low = 0, 170 }, 171 { 172 .gpio = S3C2410_GPG(8), 173 .code = KEY_DOWN, 174 .desc = "Joystick Down", 175 .active_low = 0, 176 }, 177 { 178 .gpio = S3C2410_GPG(6), 179 .code = KEY_DOWN, 180 .desc = "Joystick Left", 181 .active_low = 0, 182 }, 183 { 184 .gpio = S3C2410_GPG(5), 185 .code = KEY_DOWN, 186 .desc = "Joystick Right", 187 .active_low = 0, 188 }, 189 { 190 .gpio = S3C2410_GPG(7), 191 .code = KEY_ENTER, 192 .desc = "Joystick Press", 193 .active_low = 0, 194 }, 195 { 196 .gpio = S3C2410_GPF(7), 197 .code = KEY_HOMEPAGE, 198 .desc = "Home", 199 .active_low = 0, 200 }, 201 { 202 .gpio = S3C2410_GPF(6), 203 .code = KEY_CALENDAR, 204 .desc = "Calendar", 205 .active_low = 0, 206 }, 207 { 208 .gpio = S3C2410_GPF(5), 209 .code = KEY_ADDRESSBOOK, 210 .desc = "Contacts", 211 .active_low = 0, 212 }, 213 { 214 .gpio = S3C2410_GPF(4), 215 .code = KEY_MAIL, 216 .desc = "Mail", 217 .active_low = 0, 218 }, 219 { 220 .gpio = S3C2410_GPF(3), 221 .code = SW_RADIO, 222 .desc = "GPS Antenna", 223 .active_low = 0, 224 }, 225 { 226 .gpio = S3C2410_GPG(2), 227 .code = SW_HEADPHONE_INSERT, 228 .desc = "Headphone", 229 .active_low = 0, 230 }, 231}; 232 233static struct gpio_keys_platform_data n35_button_data = { 234 .buttons = n35_buttons, 235 .nbuttons = ARRAY_SIZE(n35_buttons), 236}; 237 238static struct platform_device n35_button_device = { 239 .name = "gpio-keys", 240 .id = -1, 241 .num_resources = 0, 242 .dev = { 243 .platform_data = &n35_button_data, 244 } 245}; 246 247/* This is the bluetooth LED on the device. */ 248 249static struct gpiod_lookup_table n30_blue_led_gpio_table = { 250 .dev_id = "s3c24xx_led.1", 251 .table = { 252 GPIO_LOOKUP("GPG", 6, NULL, GPIO_ACTIVE_HIGH), 253 { }, 254 }, 255}; 256 257static struct s3c24xx_led_platdata n30_blue_led_pdata = { 258 .name = "blue_led", 259 .def_trigger = "", 260}; 261 262/* This is the blue LED on the device. Originally used to indicate GPS activity 263 * by flashing. */ 264 265static struct gpiod_lookup_table n35_blue_led_gpio_table = { 266 .dev_id = "s3c24xx_led.1", 267 .table = { 268 GPIO_LOOKUP("GPD", 8, NULL, GPIO_ACTIVE_HIGH), 269 { }, 270 }, 271}; 272 273static struct s3c24xx_led_platdata n35_blue_led_pdata = { 274 .name = "blue_led", 275 .def_trigger = "", 276}; 277 278/* This LED is driven by the battery microcontroller, and is blinking 279 * red, blinking green or solid green when the battery is low, 280 * charging or full respectively. By driving GPD9 low, it's possible 281 * to force the LED to blink red, so call that warning LED. */ 282 283static struct gpiod_lookup_table n30_warning_led_gpio_table = { 284 .dev_id = "s3c24xx_led.2", 285 .table = { 286 GPIO_LOOKUP("GPD", 9, NULL, GPIO_ACTIVE_LOW), 287 { }, 288 }, 289}; 290 291static struct s3c24xx_led_platdata n30_warning_led_pdata = { 292 .name = "warning_led", 293 .def_trigger = "", 294}; 295 296static struct gpiod_lookup_table n35_warning_led_gpio_table = { 297 .dev_id = "s3c24xx_led.2", 298 .table = { 299 GPIO_LOOKUP("GPD", 9, NULL, GPIO_ACTIVE_LOW | GPIO_OPEN_DRAIN), 300 { }, 301 }, 302}; 303 304static struct s3c24xx_led_platdata n35_warning_led_pdata = { 305 .name = "warning_led", 306 .def_trigger = "", 307}; 308 309static struct platform_device n30_blue_led = { 310 .name = "s3c24xx_led", 311 .id = 1, 312 .dev = { 313 .platform_data = &n30_blue_led_pdata, 314 }, 315}; 316 317static struct platform_device n35_blue_led = { 318 .name = "s3c24xx_led", 319 .id = 1, 320 .dev = { 321 .platform_data = &n35_blue_led_pdata, 322 }, 323}; 324 325static struct platform_device n30_warning_led = { 326 .name = "s3c24xx_led", 327 .id = 2, 328 .dev = { 329 .platform_data = &n30_warning_led_pdata, 330 }, 331}; 332 333static struct platform_device n35_warning_led = { 334 .name = "s3c24xx_led", 335 .id = 2, 336 .dev = { 337 .platform_data = &n35_warning_led_pdata, 338 }, 339}; 340 341static struct s3c2410fb_display n30_display __initdata = { 342 .type = S3C2410_LCDCON1_TFT, 343 .width = 240, 344 .height = 320, 345 .pixclock = 170000, 346 347 .xres = 240, 348 .yres = 320, 349 .bpp = 16, 350 .left_margin = 3, 351 .right_margin = 40, 352 .hsync_len = 40, 353 .upper_margin = 2, 354 .lower_margin = 3, 355 .vsync_len = 2, 356 357 .lcdcon5 = S3C2410_LCDCON5_INVVLINE | S3C2410_LCDCON5_INVVFRAME, 358}; 359 360static struct s3c2410fb_mach_info n30_fb_info __initdata = { 361 .displays = &n30_display, 362 .num_displays = 1, 363 .default_display = 0, 364 .lpcsel = 0x06, 365}; 366 367static void n30_sdi_set_power(unsigned char power_mode, unsigned short vdd) 368{ 369 s3c24xx_mci_def_set_power(power_mode, vdd); 370 371 switch (power_mode) { 372 case MMC_POWER_ON: 373 case MMC_POWER_UP: 374 gpio_set_value(S3C2410_GPG(4), 1); 375 break; 376 case MMC_POWER_OFF: 377 default: 378 gpio_set_value(S3C2410_GPG(4), 0); 379 break; 380 } 381} 382 383static struct s3c24xx_mci_pdata n30_mci_cfg __initdata = { 384 .ocr_avail = MMC_VDD_32_33, 385 .set_power = n30_sdi_set_power, 386}; 387 388static struct gpiod_lookup_table n30_mci_gpio_table = { 389 .dev_id = "s3c2410-sdi", 390 .table = { 391 /* Card detect S3C2410_GPF(1) */ 392 GPIO_LOOKUP("GPIOF", 1, "cd", GPIO_ACTIVE_LOW), 393 /* Write protect S3C2410_GPG(10) */ 394 GPIO_LOOKUP("GPIOG", 10, "wp", GPIO_ACTIVE_LOW), 395 { }, 396 /* bus pins */ 397 GPIO_LOOKUP_IDX("GPIOE", 5, "bus", 0, GPIO_ACTIVE_HIGH), 398 GPIO_LOOKUP_IDX("GPIOE", 6, "bus", 1, GPIO_ACTIVE_HIGH), 399 GPIO_LOOKUP_IDX("GPIOE", 7, "bus", 2, GPIO_ACTIVE_HIGH), 400 GPIO_LOOKUP_IDX("GPIOE", 8, "bus", 3, GPIO_ACTIVE_HIGH), 401 GPIO_LOOKUP_IDX("GPIOE", 9, "bus", 4, GPIO_ACTIVE_HIGH), 402 GPIO_LOOKUP_IDX("GPIOE", 10, "bus", 5, GPIO_ACTIVE_HIGH), 403 }, 404}; 405 406static struct platform_device *n30_devices[] __initdata = { 407 &s3c_device_lcd, 408 &s3c_device_wdt, 409 &s3c_device_i2c0, 410 &s3c_device_iis, 411 &s3c_device_ohci, 412 &s3c_device_rtc, 413 &s3c_device_usbgadget, 414 &s3c_device_sdi, 415 &n30_button_device, 416 &n30_blue_led, 417 &n30_warning_led, 418}; 419 420static struct platform_device *n35_devices[] __initdata = { 421 &s3c_device_lcd, 422 &s3c_device_wdt, 423 &s3c_device_i2c0, 424 &s3c_device_iis, 425 &s3c_device_rtc, 426 &s3c_device_usbgadget, 427 &s3c_device_sdi, 428 &n35_button_device, 429 &n35_blue_led, 430 &n35_warning_led, 431}; 432 433static struct s3c2410_platform_i2c __initdata n30_i2ccfg = { 434 .flags = 0, 435 .slave_addr = 0x10, 436 .frequency = 10*1000, 437}; 438 439/* Lots of hardcoded stuff, but it sets up the hardware in a useful 440 * state so that we can boot Linux directly from flash. */ 441static void __init n30_hwinit(void) 442{ 443 /* GPA0-11 special functions -- unknown what they do 444 * GPA12 N30 special function -- unknown what it does 445 * N35/PiN output -- unknown what it does 446 * 447 * A12 is nGCS1 on the N30 and an output on the N35/PiN. I 448 * don't think it does anything useful on the N30, so I ought 449 * to make it an output there too since it always driven to 0 450 * as far as I can tell. */ 451 if (machine_is_n30()) 452 __raw_writel(0x007fffff, S3C2410_GPACON); 453 if (machine_is_n35()) 454 __raw_writel(0x007fefff, S3C2410_GPACON); 455 __raw_writel(0x00000000, S3C2410_GPADAT); 456 457 /* GPB0 TOUT0 backlight level 458 * GPB1 output 1=backlight on 459 * GPB2 output IrDA enable 0=transceiver enabled, 1=disabled 460 * GPB3 output USB D+ pull up 0=disabled, 1=enabled 461 * GPB4 N30 output -- unknown function 462 * N30/PiN GPS control 0=GPS enabled, 1=GPS disabled 463 * GPB5 output -- unknown function 464 * GPB6 input -- unknown function 465 * GPB7 output -- unknown function 466 * GPB8 output -- probably LCD driver enable 467 * GPB9 output -- probably LCD VSYNC driver enable 468 * GPB10 output -- probably LCD HSYNC driver enable 469 */ 470 __raw_writel(0x00154556, S3C2410_GPBCON); 471 __raw_writel(0x00000750, S3C2410_GPBDAT); 472 __raw_writel(0x00000073, S3C2410_GPBUP); 473 474 /* GPC0 input RS232 DCD/DSR/RI 475 * GPC1 LCD 476 * GPC2 output RS232 DTR? 477 * GPC3 input RS232 DCD/DSR/RI 478 * GPC4 LCD 479 * GPC5 output 0=NAND write enabled, 1=NAND write protect 480 * GPC6 input -- unknown function 481 * GPC7 input charger status 0=charger connected 482 * this input can be triggered by power on the USB device 483 * port too, but will go back to disconnected soon after. 484 * GPC8 N30/N35 output -- unknown function, always driven to 1 485 * PiN input -- unknown function, always read as 1 486 * Make it an input with a pull up for all models. 487 * GPC9-15 LCD 488 */ 489 __raw_writel(0xaaa80618, S3C2410_GPCCON); 490 __raw_writel(0x0000014c, S3C2410_GPCDAT); 491 __raw_writel(0x0000fef2, S3C2410_GPCUP); 492 493 /* GPD0 input -- unknown function 494 * GPD1-D7 LCD 495 * GPD8 N30 output -- unknown function 496 * N35/PiN output 1=GPS LED on 497 * GPD9 output 0=power led blinks red, 1=normal power led function 498 * GPD10 output -- unknown function 499 * GPD11-15 LCD drivers 500 */ 501 __raw_writel(0xaa95aaa4, S3C2410_GPDCON); 502 __raw_writel(0x00000601, S3C2410_GPDDAT); 503 __raw_writel(0x0000fbfe, S3C2410_GPDUP); 504 505 /* GPE0-4 I2S audio bus 506 * GPE5-10 SD/MMC bus 507 * E11-13 outputs -- unknown function, probably power management 508 * E14-15 I2C bus connected to the battery controller 509 */ 510 __raw_writel(0xa56aaaaa, S3C2410_GPECON); 511 __raw_writel(0x0000efc5, S3C2410_GPEDAT); 512 __raw_writel(0x0000f81f, S3C2410_GPEUP); 513 514 /* GPF0 input 0=power button pressed 515 * GPF1 input SD/MMC switch 0=card present 516 * GPF2 N30 1=reset button pressed (inverted compared to the rest) 517 * N35/PiN 0=reset button pressed 518 * GPF3 N30/PiN input -- unknown function 519 * N35 input GPS antenna position, 0=antenna closed, 1=open 520 * GPF4 input 0=button 4 pressed 521 * GPF5 input 0=button 3 pressed 522 * GPF6 input 0=button 2 pressed 523 * GPF7 input 0=button 1 pressed 524 */ 525 __raw_writel(0x0000aaaa, S3C2410_GPFCON); 526 __raw_writel(0x00000000, S3C2410_GPFDAT); 527 __raw_writel(0x000000ff, S3C2410_GPFUP); 528 529 /* GPG0 input RS232 DCD/DSR/RI 530 * GPG1 input 1=USB gadget port has power from a host 531 * GPG2 N30 input -- unknown function 532 * N35/PiN input 0=headphones plugged in, 1=not plugged in 533 * GPG3 N30 output -- unknown function 534 * N35/PiN input with unknown function 535 * GPG4 N30 output 0=MMC enabled, 1=MMC disabled 536 * GPG5 N30 output 0=BlueTooth chip disabled, 1=enabled 537 * N35/PiN input joystick right 538 * GPG6 N30 output 0=blue led on, 1=off 539 * N35/PiN input joystick left 540 * GPG7 input 0=thumbwheel pressed 541 * GPG8 input 0=thumbwheel down 542 * GPG9 input 0=thumbwheel up 543 * GPG10 input SD/MMC write protect switch 544 * GPG11 N30 input -- unknown function 545 * N35 output 0=GPS antenna powered, 1=not powered 546 * PiN output -- unknown function 547 * GPG12-15 touch screen functions 548 * 549 * The pullups differ between the models, so enable all 550 * pullups that are enabled on any of the models. 551 */ 552 if (machine_is_n30()) 553 __raw_writel(0xff0a956a, S3C2410_GPGCON); 554 if (machine_is_n35()) 555 __raw_writel(0xff4aa92a, S3C2410_GPGCON); 556 __raw_writel(0x0000e800, S3C2410_GPGDAT); 557 __raw_writel(0x0000f86f, S3C2410_GPGUP); 558 559 /* GPH0/1/2/3 RS232 serial port 560 * GPH4/5 IrDA serial port 561 * GPH6/7 N30 BlueTooth serial port 562 * N35/PiN GPS receiver 563 * GPH8 input -- unknown function 564 * GPH9 CLKOUT0 HCLK -- unknown use 565 * GPH10 CLKOUT1 FCLK -- unknown use 566 * 567 * The pull ups for H6/H7 are enabled on N30 but not on the 568 * N35/PiN. I suppose is useful for a budget model of the N30 569 * with no bluetooth. It doesn't hurt to have the pull ups 570 * enabled on the N35, so leave them enabled for all models. 571 */ 572 __raw_writel(0x0028aaaa, S3C2410_GPHCON); 573 __raw_writel(0x000005ef, S3C2410_GPHDAT); 574 __raw_writel(0x0000063f, S3C2410_GPHUP); 575} 576 577static void __init n30_map_io(void) 578{ 579 s3c24xx_init_io(n30_iodesc, ARRAY_SIZE(n30_iodesc)); 580 n30_hwinit(); 581 s3c24xx_init_uarts(n30_uartcfgs, ARRAY_SIZE(n30_uartcfgs)); 582 s3c24xx_set_timer_source(S3C24XX_PWM3, S3C24XX_PWM4); 583} 584 585static void __init n30_init_time(void) 586{ 587 s3c2410_init_clocks(12000000); 588 s3c24xx_timer_init(); 589} 590 591/* GPB3 is the line that controls the pull-up for the USB D+ line */ 592 593static void __init n30_init(void) 594{ 595 WARN_ON(gpio_request(S3C2410_GPG(4), "mmc power")); 596 597 s3c24xx_fb_set_platdata(&n30_fb_info); 598 s3c24xx_udc_set_platdata(&n30_udc_cfg); 599 gpiod_add_lookup_table(&n30_mci_gpio_table); 600 s3c24xx_mci_set_platdata(&n30_mci_cfg); 601 s3c_i2c0_set_platdata(&n30_i2ccfg); 602 603 /* Turn off suspend on both USB ports, and switch the 604 * selectable USB port to USB device mode. */ 605 606 s3c2410_modify_misccr(S3C2410_MISCCR_USBHOST | 607 S3C2410_MISCCR_USBSUSPND0 | 608 S3C2410_MISCCR_USBSUSPND1, 0x0); 609 610 /* Configure the I2S pins (GPE0...GPE4) in correct mode */ 611 s3c_gpio_cfgall_range(S3C2410_GPE(0), 5, S3C_GPIO_SFN(2), 612 S3C_GPIO_PULL_NONE); 613 614 if (machine_is_n30()) { 615 /* Turn off suspend on both USB ports, and switch the 616 * selectable USB port to USB device mode. */ 617 s3c2410_modify_misccr(S3C2410_MISCCR_USBHOST | 618 S3C2410_MISCCR_USBSUSPND0 | 619 S3C2410_MISCCR_USBSUSPND1, 0x0); 620 621 /* Disable pull-up and add GPIO tables */ 622 s3c_gpio_setpull(S3C2410_GPG(6), S3C_GPIO_PULL_NONE); 623 s3c_gpio_setpull(S3C2410_GPD(9), S3C_GPIO_PULL_NONE); 624 gpiod_add_lookup_table(&n30_blue_led_gpio_table); 625 gpiod_add_lookup_table(&n30_warning_led_gpio_table); 626 627 platform_add_devices(n30_devices, ARRAY_SIZE(n30_devices)); 628 } 629 630 if (machine_is_n35()) { 631 /* Turn off suspend and switch the selectable USB port 632 * to USB device mode. Turn on suspend for the host 633 * port since it is not connected on the N35. 634 * 635 * Actually, the host port is available at some pads 636 * on the back of the device, so it would actually be 637 * possible to add a USB device inside the N35 if you 638 * are willing to do some hardware modifications. */ 639 s3c2410_modify_misccr(S3C2410_MISCCR_USBHOST | 640 S3C2410_MISCCR_USBSUSPND0 | 641 S3C2410_MISCCR_USBSUSPND1, 642 S3C2410_MISCCR_USBSUSPND0); 643 644 /* Disable pull-up and add GPIO tables */ 645 s3c_gpio_setpull(S3C2410_GPD(8), S3C_GPIO_PULL_NONE); 646 s3c_gpio_setpull(S3C2410_GPD(9), S3C_GPIO_PULL_NONE); 647 gpiod_add_lookup_table(&n35_blue_led_gpio_table); 648 gpiod_add_lookup_table(&n35_warning_led_gpio_table); 649 650 platform_add_devices(n35_devices, ARRAY_SIZE(n35_devices)); 651 } 652} 653 654MACHINE_START(N30, "Acer-N30") 655 /* Maintainer: Christer Weinigel <christer@weinigel.se>, 656 Ben Dooks <ben-linux@fluff.org> 657 */ 658 .atag_offset = 0x100, 659 .nr_irqs = NR_IRQS_S3C2410, 660 .init_time = n30_init_time, 661 .init_machine = n30_init, 662 .init_irq = s3c2410_init_irq, 663 .map_io = n30_map_io, 664MACHINE_END 665 666MACHINE_START(N35, "Acer-N35") 667 /* Maintainer: Christer Weinigel <christer@weinigel.se> 668 */ 669 .atag_offset = 0x100, 670 .nr_irqs = NR_IRQS_S3C2410, 671 .init_time = n30_init_time, 672 .init_machine = n30_init, 673 .init_irq = s3c2410_init_irq, 674 .map_io = n30_map_io, 675MACHINE_END