1/* 2 * linux/arch/arm/mach-pxa/balloon3.c 3 * 4 * Support for Balloonboard.org Balloon3 board. 5 * 6 * Author: Nick Bane, Wookey, Jonathan McDowell 7 * Created: June, 2006 8 * Copyright: Toby Churchill Ltd 9 * Derived from mainstone.c, by Nico Pitre 10 * 11 * This program is free software; you can redistribute it and/or modify 12 * it under the terms of the GNU General Public License version 2 as 13 * published by the Free Software Foundation. 14 */ 15 16#include <linux/export.h> 17#include <linux/init.h> 18#include <linux/platform_device.h> 19#include <linux/interrupt.h> 20#include <linux/sched.h> 21#include <linux/bitops.h> 22#include <linux/fb.h> 23#include <linux/gpio.h> 24#include <linux/ioport.h> 25#include <linux/ucb1400.h> 26#include <linux/mtd/mtd.h> 27#include <linux/mtd/partitions.h> 28#include <linux/types.h> 29#include <linux/i2c/pcf857x.h> 30#include <linux/i2c/pxa-i2c.h> 31#include <linux/mtd/nand.h> 32#include <linux/mtd/physmap.h> 33#include <linux/regulator/max1586.h> 34 35#include <asm/setup.h> 36#include <asm/mach-types.h> 37#include <asm/irq.h> 38#include <asm/sizes.h> 39 40#include <asm/mach/arch.h> 41#include <asm/mach/map.h> 42#include <asm/mach/irq.h> 43#include <asm/mach/flash.h> 44 45#include <mach/pxa27x.h> 46#include <mach/balloon3.h> 47#include <mach/audio.h> 48#include <linux/platform_data/video-pxafb.h> 49#include <linux/platform_data/mmc-pxamci.h> 50#include <mach/udc.h> 51#include <mach/pxa27x-udc.h> 52#include <linux/platform_data/irda-pxaficp.h> 53#include <linux/platform_data/usb-ohci-pxa27x.h> 54 55#include "generic.h" 56#include "devices.h" 57 58/****************************************************************************** 59 * Pin configuration 60 ******************************************************************************/ 61static unsigned long balloon3_pin_config[] __initdata = { 62 /* Select BTUART 'COM1/ttyS0' as IO option for pins 42/43/44/45 */ 63 GPIO42_BTUART_RXD, 64 GPIO43_BTUART_TXD, 65 GPIO44_BTUART_CTS, 66 GPIO45_BTUART_RTS, 67 68 /* Reset, configured as GPIO wakeup source */ 69 GPIO1_GPIO | WAKEUP_ON_EDGE_BOTH, 70}; 71 72/****************************************************************************** 73 * Compatibility: Parameter parsing 74 ******************************************************************************/ 75static unsigned long balloon3_irq_enabled; 76 77static unsigned long balloon3_features_present = 78 (1 << BALLOON3_FEATURE_OHCI) | (1 << BALLOON3_FEATURE_CF) | 79 (1 << BALLOON3_FEATURE_AUDIO) | 80 (1 << BALLOON3_FEATURE_TOPPOLY); 81 82int balloon3_has(enum balloon3_features feature) 83{ 84 return (balloon3_features_present & (1 << feature)) ? 1 : 0; 85} 86EXPORT_SYMBOL_GPL(balloon3_has); 87 88int __init parse_balloon3_features(char *arg) 89{ 90 if (!arg) 91 return 0; 92 93 return kstrtoul(arg, 0, &balloon3_features_present); 94} 95early_param("balloon3_features", parse_balloon3_features); 96 97/****************************************************************************** 98 * Compact Flash slot 99 ******************************************************************************/ 100#if defined(CONFIG_PCMCIA_PXA2XX) || defined(CONFIG_PCMCIA_PXA2XX_MODULE) 101static unsigned long balloon3_cf_pin_config[] __initdata = { 102 GPIO48_nPOE, 103 GPIO49_nPWE, 104 GPIO50_nPIOR, 105 GPIO51_nPIOW, 106 GPIO85_nPCE_1, 107 GPIO54_nPCE_2, 108 GPIO79_PSKTSEL, 109 GPIO55_nPREG, 110 GPIO56_nPWAIT, 111 GPIO57_nIOIS16, 112}; 113 114static void __init balloon3_cf_init(void) 115{ 116 if (!balloon3_has(BALLOON3_FEATURE_CF)) 117 return; 118 119 pxa2xx_mfp_config(ARRAY_AND_SIZE(balloon3_cf_pin_config)); 120} 121#else 122static inline void balloon3_cf_init(void) {} 123#endif 124 125/****************************************************************************** 126 * NOR Flash 127 ******************************************************************************/ 128#if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE) 129static struct mtd_partition balloon3_nor_partitions[] = { 130 { 131 .name = "Flash", 132 .offset = 0x00000000, 133 .size = MTDPART_SIZ_FULL, 134 } 135}; 136 137static struct physmap_flash_data balloon3_flash_data[] = { 138 { 139 .width = 2, /* bankwidth in bytes */ 140 .parts = balloon3_nor_partitions, 141 .nr_parts = ARRAY_SIZE(balloon3_nor_partitions) 142 } 143}; 144 145static struct resource balloon3_flash_resource = { 146 .start = PXA_CS0_PHYS, 147 .end = PXA_CS0_PHYS + SZ_64M - 1, 148 .flags = IORESOURCE_MEM, 149}; 150 151static struct platform_device balloon3_flash = { 152 .name = "physmap-flash", 153 .id = 0, 154 .resource = &balloon3_flash_resource, 155 .num_resources = 1, 156 .dev = { 157 .platform_data = balloon3_flash_data, 158 }, 159}; 160static void __init balloon3_nor_init(void) 161{ 162 platform_device_register(&balloon3_flash); 163} 164#else 165static inline void balloon3_nor_init(void) {} 166#endif 167 168/****************************************************************************** 169 * Audio and Touchscreen 170 ******************************************************************************/ 171#if defined(CONFIG_TOUCHSCREEN_UCB1400) || \ 172 defined(CONFIG_TOUCHSCREEN_UCB1400_MODULE) 173static unsigned long balloon3_ac97_pin_config[] __initdata = { 174 GPIO28_AC97_BITCLK, 175 GPIO29_AC97_SDATA_IN_0, 176 GPIO30_AC97_SDATA_OUT, 177 GPIO31_AC97_SYNC, 178 GPIO113_AC97_nRESET, 179 GPIO95_GPIO, 180}; 181 182static struct ucb1400_pdata vpac270_ucb1400_pdata = { 183 .irq = PXA_GPIO_TO_IRQ(BALLOON3_GPIO_CODEC_IRQ), 184}; 185 186 187static struct platform_device balloon3_ucb1400_device = { 188 .name = "ucb1400_core", 189 .id = -1, 190 .dev = { 191 .platform_data = &vpac270_ucb1400_pdata, 192 }, 193}; 194 195static void __init balloon3_ts_init(void) 196{ 197 if (!balloon3_has(BALLOON3_FEATURE_AUDIO)) 198 return; 199 200 pxa2xx_mfp_config(ARRAY_AND_SIZE(balloon3_ac97_pin_config)); 201 pxa_set_ac97_info(NULL); 202 platform_device_register(&balloon3_ucb1400_device); 203} 204#else 205static inline void balloon3_ts_init(void) {} 206#endif 207 208/****************************************************************************** 209 * Framebuffer 210 ******************************************************************************/ 211#if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE) 212static unsigned long balloon3_lcd_pin_config[] __initdata = { 213 GPIOxx_LCD_TFT_16BPP, 214 GPIO99_GPIO, 215}; 216 217static struct pxafb_mode_info balloon3_lcd_modes[] = { 218 { 219 .pixclock = 38000, 220 .xres = 480, 221 .yres = 640, 222 .bpp = 16, 223 .hsync_len = 8, 224 .left_margin = 8, 225 .right_margin = 8, 226 .vsync_len = 2, 227 .upper_margin = 4, 228 .lower_margin = 5, 229 .sync = 0, 230 }, 231}; 232 233static struct pxafb_mach_info balloon3_lcd_screen = { 234 .modes = balloon3_lcd_modes, 235 .num_modes = ARRAY_SIZE(balloon3_lcd_modes), 236 .lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL, 237}; 238 239static void balloon3_backlight_power(int on) 240{ 241 gpio_set_value(BALLOON3_GPIO_RUN_BACKLIGHT, on); 242} 243 244static void __init balloon3_lcd_init(void) 245{ 246 int ret; 247 248 if (!balloon3_has(BALLOON3_FEATURE_TOPPOLY)) 249 return; 250 251 pxa2xx_mfp_config(ARRAY_AND_SIZE(balloon3_lcd_pin_config)); 252 253 ret = gpio_request(BALLOON3_GPIO_RUN_BACKLIGHT, "BKL-ON"); 254 if (ret) { 255 pr_err("Requesting BKL-ON GPIO failed!\n"); 256 goto err; 257 } 258 259 ret = gpio_direction_output(BALLOON3_GPIO_RUN_BACKLIGHT, 1); 260 if (ret) { 261 pr_err("Setting BKL-ON GPIO direction failed!\n"); 262 goto err2; 263 } 264 265 balloon3_lcd_screen.pxafb_backlight_power = balloon3_backlight_power; 266 pxa_set_fb_info(NULL, &balloon3_lcd_screen); 267 return; 268 269err2: 270 gpio_free(BALLOON3_GPIO_RUN_BACKLIGHT); 271err: 272 return; 273} 274#else 275static inline void balloon3_lcd_init(void) {} 276#endif 277 278/****************************************************************************** 279 * SD/MMC card controller 280 ******************************************************************************/ 281#if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE) 282static unsigned long balloon3_mmc_pin_config[] __initdata = { 283 GPIO32_MMC_CLK, 284 GPIO92_MMC_DAT_0, 285 GPIO109_MMC_DAT_1, 286 GPIO110_MMC_DAT_2, 287 GPIO111_MMC_DAT_3, 288 GPIO112_MMC_CMD, 289}; 290 291static struct pxamci_platform_data balloon3_mci_platform_data = { 292 .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, 293 .gpio_card_detect = -1, 294 .gpio_card_ro = -1, 295 .gpio_power = -1, 296 .detect_delay_ms = 200, 297}; 298 299static void __init balloon3_mmc_init(void) 300{ 301 pxa2xx_mfp_config(ARRAY_AND_SIZE(balloon3_mmc_pin_config)); 302 pxa_set_mci_info(&balloon3_mci_platform_data); 303} 304#else 305static inline void balloon3_mmc_init(void) {} 306#endif 307 308/****************************************************************************** 309 * USB Gadget 310 ******************************************************************************/ 311#if defined(CONFIG_USB_PXA27X)||defined(CONFIG_USB_PXA27X_MODULE) 312static void balloon3_udc_command(int cmd) 313{ 314 if (cmd == PXA2XX_UDC_CMD_CONNECT) 315 UP2OCR |= UP2OCR_DPPUE | UP2OCR_DPPUBE; 316 else if (cmd == PXA2XX_UDC_CMD_DISCONNECT) 317 UP2OCR &= ~UP2OCR_DPPUE; 318} 319 320static int balloon3_udc_is_connected(void) 321{ 322 return 1; 323} 324 325static struct pxa2xx_udc_mach_info balloon3_udc_info __initdata = { 326 .udc_command = balloon3_udc_command, 327 .udc_is_connected = balloon3_udc_is_connected, 328 .gpio_pullup = -1, 329}; 330 331static void __init balloon3_udc_init(void) 332{ 333 pxa_set_udc_info(&balloon3_udc_info); 334} 335#else 336static inline void balloon3_udc_init(void) {} 337#endif 338 339/****************************************************************************** 340 * IrDA 341 ******************************************************************************/ 342#if defined(CONFIG_IRDA) || defined(CONFIG_IRDA_MODULE) 343static struct pxaficp_platform_data balloon3_ficp_platform_data = { 344 .transceiver_cap = IR_FIRMODE | IR_SIRMODE | IR_OFF, 345}; 346 347static void __init balloon3_irda_init(void) 348{ 349 pxa_set_ficp_info(&balloon3_ficp_platform_data); 350} 351#else 352static inline void balloon3_irda_init(void) {} 353#endif 354 355/****************************************************************************** 356 * USB Host 357 ******************************************************************************/ 358#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE) 359static unsigned long balloon3_uhc_pin_config[] __initdata = { 360 GPIO88_USBH1_PWR, 361 GPIO89_USBH1_PEN, 362}; 363 364static struct pxaohci_platform_data balloon3_ohci_info = { 365 .port_mode = PMM_PERPORT_MODE, 366 .flags = ENABLE_PORT_ALL | POWER_CONTROL_LOW | POWER_SENSE_LOW, 367}; 368 369static void __init balloon3_uhc_init(void) 370{ 371 if (!balloon3_has(BALLOON3_FEATURE_OHCI)) 372 return; 373 pxa2xx_mfp_config(ARRAY_AND_SIZE(balloon3_uhc_pin_config)); 374 pxa_set_ohci_info(&balloon3_ohci_info); 375} 376#else 377static inline void balloon3_uhc_init(void) {} 378#endif 379 380/****************************************************************************** 381 * LEDs 382 ******************************************************************************/ 383#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE) 384static unsigned long balloon3_led_pin_config[] __initdata = { 385 GPIO9_GPIO, /* NAND activity LED */ 386 GPIO10_GPIO, /* Heartbeat LED */ 387}; 388 389struct gpio_led balloon3_gpio_leds[] = { 390 { 391 .name = "balloon3:green:idle", 392 .default_trigger = "heartbeat", 393 .gpio = BALLOON3_GPIO_LED_IDLE, 394 .active_low = 1, 395 }, { 396 .name = "balloon3:green:nand", 397 .default_trigger = "nand-disk", 398 .gpio = BALLOON3_GPIO_LED_NAND, 399 .active_low = 1, 400 }, 401}; 402 403static struct gpio_led_platform_data balloon3_gpio_led_info = { 404 .leds = balloon3_gpio_leds, 405 .num_leds = ARRAY_SIZE(balloon3_gpio_leds), 406}; 407 408static struct platform_device balloon3_leds = { 409 .name = "leds-gpio", 410 .id = 0, 411 .dev = { 412 .platform_data = &balloon3_gpio_led_info, 413 } 414}; 415 416struct gpio_led balloon3_pcf_gpio_leds[] = { 417 { 418 .name = "balloon3:green:led0", 419 .gpio = BALLOON3_PCF_GPIO_LED0, 420 .active_low = 1, 421 }, { 422 .name = "balloon3:green:led1", 423 .gpio = BALLOON3_PCF_GPIO_LED1, 424 .active_low = 1, 425 }, { 426 .name = "balloon3:orange:led2", 427 .gpio = BALLOON3_PCF_GPIO_LED2, 428 .active_low = 1, 429 }, { 430 .name = "balloon3:orange:led3", 431 .gpio = BALLOON3_PCF_GPIO_LED3, 432 .active_low = 1, 433 }, { 434 .name = "balloon3:orange:led4", 435 .gpio = BALLOON3_PCF_GPIO_LED4, 436 .active_low = 1, 437 }, { 438 .name = "balloon3:orange:led5", 439 .gpio = BALLOON3_PCF_GPIO_LED5, 440 .active_low = 1, 441 }, { 442 .name = "balloon3:red:led6", 443 .gpio = BALLOON3_PCF_GPIO_LED6, 444 .active_low = 1, 445 }, { 446 .name = "balloon3:red:led7", 447 .gpio = BALLOON3_PCF_GPIO_LED7, 448 .active_low = 1, 449 }, 450}; 451 452static struct gpio_led_platform_data balloon3_pcf_gpio_led_info = { 453 .leds = balloon3_pcf_gpio_leds, 454 .num_leds = ARRAY_SIZE(balloon3_pcf_gpio_leds), 455}; 456 457static struct platform_device balloon3_pcf_leds = { 458 .name = "leds-gpio", 459 .id = 1, 460 .dev = { 461 .platform_data = &balloon3_pcf_gpio_led_info, 462 } 463}; 464 465static void __init balloon3_leds_init(void) 466{ 467 pxa2xx_mfp_config(ARRAY_AND_SIZE(balloon3_led_pin_config)); 468 platform_device_register(&balloon3_leds); 469 platform_device_register(&balloon3_pcf_leds); 470} 471#else 472static inline void balloon3_leds_init(void) {} 473#endif 474 475/****************************************************************************** 476 * FPGA IRQ 477 ******************************************************************************/ 478static void balloon3_mask_irq(struct irq_data *d) 479{ 480 int balloon3_irq = (d->irq - BALLOON3_IRQ(0)); 481 balloon3_irq_enabled &= ~(1 << balloon3_irq); 482 __raw_writel(~balloon3_irq_enabled, BALLOON3_INT_CONTROL_REG); 483} 484 485static void balloon3_unmask_irq(struct irq_data *d) 486{ 487 int balloon3_irq = (d->irq - BALLOON3_IRQ(0)); 488 balloon3_irq_enabled |= (1 << balloon3_irq); 489 __raw_writel(~balloon3_irq_enabled, BALLOON3_INT_CONTROL_REG); 490} 491 492static struct irq_chip balloon3_irq_chip = { 493 .name = "FPGA", 494 .irq_ack = balloon3_mask_irq, 495 .irq_mask = balloon3_mask_irq, 496 .irq_unmask = balloon3_unmask_irq, 497}; 498 499static void balloon3_irq_handler(struct irq_desc *desc) 500{ 501 unsigned long pending = __raw_readl(BALLOON3_INT_CONTROL_REG) & 502 balloon3_irq_enabled; 503 do { 504 struct irq_data *d = irq_desc_get_irq_data(desc); 505 struct irq_chip *chip = irq_desc_get_chip(desc); 506 unsigned int irq; 507 508 /* clear useless edge notification */ 509 if (chip->irq_ack) 510 chip->irq_ack(d); 511 512 while (pending) { 513 irq = BALLOON3_IRQ(0) + __ffs(pending); 514 generic_handle_irq(irq); 515 pending &= pending - 1; 516 } 517 pending = __raw_readl(BALLOON3_INT_CONTROL_REG) & 518 balloon3_irq_enabled; 519 } while (pending); 520} 521 522static void __init balloon3_init_irq(void) 523{ 524 int irq; 525 526 pxa27x_init_irq(); 527 /* setup extra Balloon3 irqs */ 528 for (irq = BALLOON3_IRQ(0); irq <= BALLOON3_IRQ(7); irq++) { 529 irq_set_chip_and_handler(irq, &balloon3_irq_chip, 530 handle_level_irq); 531 irq_clear_status_flags(irq, IRQ_NOREQUEST | IRQ_NOPROBE); 532 } 533 534 irq_set_chained_handler(BALLOON3_AUX_NIRQ, balloon3_irq_handler); 535 irq_set_irq_type(BALLOON3_AUX_NIRQ, IRQ_TYPE_EDGE_FALLING); 536 537 pr_debug("%s: chained handler installed - irq %d automatically " 538 "enabled\n", __func__, BALLOON3_AUX_NIRQ); 539} 540 541/****************************************************************************** 542 * GPIO expander 543 ******************************************************************************/ 544#if defined(CONFIG_GPIO_PCF857X) || defined(CONFIG_GPIO_PCF857X_MODULE) 545static struct pcf857x_platform_data balloon3_pcf857x_pdata = { 546 .gpio_base = BALLOON3_PCF_GPIO_BASE, 547 .n_latch = 0, 548 .setup = NULL, 549 .teardown = NULL, 550 .context = NULL, 551}; 552 553static struct i2c_board_info __initdata balloon3_i2c_devs[] = { 554 { 555 I2C_BOARD_INFO("pcf8574a", 0x38), 556 .platform_data = &balloon3_pcf857x_pdata, 557 }, 558}; 559 560static void __init balloon3_i2c_init(void) 561{ 562 pxa_set_i2c_info(NULL); 563 i2c_register_board_info(0, ARRAY_AND_SIZE(balloon3_i2c_devs)); 564} 565#else 566static inline void balloon3_i2c_init(void) {} 567#endif 568 569/****************************************************************************** 570 * NAND 571 ******************************************************************************/ 572#if defined(CONFIG_MTD_NAND_PLATFORM)||defined(CONFIG_MTD_NAND_PLATFORM_MODULE) 573static void balloon3_nand_cmd_ctl(struct mtd_info *mtd, int cmd, unsigned int ctrl) 574{ 575 struct nand_chip *this = mtd->priv; 576 uint8_t balloon3_ctl_set = 0, balloon3_ctl_clr = 0; 577 578 if (ctrl & NAND_CTRL_CHANGE) { 579 if (ctrl & NAND_CLE) 580 balloon3_ctl_set |= BALLOON3_NAND_CONTROL_FLCLE; 581 else 582 balloon3_ctl_clr |= BALLOON3_NAND_CONTROL_FLCLE; 583 584 if (ctrl & NAND_ALE) 585 balloon3_ctl_set |= BALLOON3_NAND_CONTROL_FLALE; 586 else 587 balloon3_ctl_clr |= BALLOON3_NAND_CONTROL_FLALE; 588 589 if (balloon3_ctl_clr) 590 __raw_writel(balloon3_ctl_clr, 591 BALLOON3_NAND_CONTROL_REG); 592 if (balloon3_ctl_set) 593 __raw_writel(balloon3_ctl_set, 594 BALLOON3_NAND_CONTROL_REG + 595 BALLOON3_FPGA_SETnCLR); 596 } 597 598 if (cmd != NAND_CMD_NONE) 599 writeb(cmd, this->IO_ADDR_W); 600} 601 602static void balloon3_nand_select_chip(struct mtd_info *mtd, int chip) 603{ 604 if (chip < 0 || chip > 3) 605 return; 606 607 /* Assert all nCE lines */ 608 __raw_writew( 609 BALLOON3_NAND_CONTROL_FLCE0 | BALLOON3_NAND_CONTROL_FLCE1 | 610 BALLOON3_NAND_CONTROL_FLCE2 | BALLOON3_NAND_CONTROL_FLCE3, 611 BALLOON3_NAND_CONTROL_REG + BALLOON3_FPGA_SETnCLR); 612 613 /* Deassert correct nCE line */ 614 __raw_writew(BALLOON3_NAND_CONTROL_FLCE0 << chip, 615 BALLOON3_NAND_CONTROL_REG); 616} 617 618static int balloon3_nand_dev_ready(struct mtd_info *mtd) 619{ 620 return __raw_readl(BALLOON3_NAND_STAT_REG) & BALLOON3_NAND_STAT_RNB; 621} 622 623static int balloon3_nand_probe(struct platform_device *pdev) 624{ 625 uint16_t ver; 626 int ret; 627 628 __raw_writew(BALLOON3_NAND_CONTROL2_16BIT, 629 BALLOON3_NAND_CONTROL2_REG + BALLOON3_FPGA_SETnCLR); 630 631 ver = __raw_readw(BALLOON3_FPGA_VER); 632 if (ver < 0x4f08) 633 pr_warn("The FPGA code, version 0x%04x, is too old. " 634 "NAND support might be broken in this version!", ver); 635 636 /* Power up the NAND chips */ 637 ret = gpio_request(BALLOON3_GPIO_RUN_NAND, "NAND"); 638 if (ret) 639 goto err1; 640 641 ret = gpio_direction_output(BALLOON3_GPIO_RUN_NAND, 1); 642 if (ret) 643 goto err2; 644 645 gpio_set_value(BALLOON3_GPIO_RUN_NAND, 1); 646 647 /* Deassert all nCE lines and write protect line */ 648 __raw_writel( 649 BALLOON3_NAND_CONTROL_FLCE0 | BALLOON3_NAND_CONTROL_FLCE1 | 650 BALLOON3_NAND_CONTROL_FLCE2 | BALLOON3_NAND_CONTROL_FLCE3 | 651 BALLOON3_NAND_CONTROL_FLWP, 652 BALLOON3_NAND_CONTROL_REG + BALLOON3_FPGA_SETnCLR); 653 return 0; 654 655err2: 656 gpio_free(BALLOON3_GPIO_RUN_NAND); 657err1: 658 return ret; 659} 660 661static void balloon3_nand_remove(struct platform_device *pdev) 662{ 663 /* Power down the NAND chips */ 664 gpio_set_value(BALLOON3_GPIO_RUN_NAND, 0); 665 gpio_free(BALLOON3_GPIO_RUN_NAND); 666} 667 668static struct mtd_partition balloon3_partition_info[] = { 669 [0] = { 670 .name = "Boot", 671 .offset = 0, 672 .size = SZ_4M, 673 }, 674 [1] = { 675 .name = "RootFS", 676 .offset = MTDPART_OFS_APPEND, 677 .size = MTDPART_SIZ_FULL 678 }, 679}; 680 681struct platform_nand_data balloon3_nand_pdata = { 682 .chip = { 683 .nr_chips = 4, 684 .chip_offset = 0, 685 .nr_partitions = ARRAY_SIZE(balloon3_partition_info), 686 .partitions = balloon3_partition_info, 687 .chip_delay = 50, 688 }, 689 .ctrl = { 690 .hwcontrol = 0, 691 .dev_ready = balloon3_nand_dev_ready, 692 .select_chip = balloon3_nand_select_chip, 693 .cmd_ctrl = balloon3_nand_cmd_ctl, 694 .probe = balloon3_nand_probe, 695 .remove = balloon3_nand_remove, 696 }, 697}; 698 699static struct resource balloon3_nand_resource[] = { 700 [0] = { 701 .start = BALLOON3_NAND_BASE, 702 .end = BALLOON3_NAND_BASE + 0x4, 703 .flags = IORESOURCE_MEM, 704 }, 705}; 706 707static struct platform_device balloon3_nand = { 708 .name = "gen_nand", 709 .num_resources = ARRAY_SIZE(balloon3_nand_resource), 710 .resource = balloon3_nand_resource, 711 .id = -1, 712 .dev = { 713 .platform_data = &balloon3_nand_pdata, 714 } 715}; 716 717static void __init balloon3_nand_init(void) 718{ 719 platform_device_register(&balloon3_nand); 720} 721#else 722static inline void balloon3_nand_init(void) {} 723#endif 724 725/****************************************************************************** 726 * Core power regulator 727 ******************************************************************************/ 728#if defined(CONFIG_REGULATOR_MAX1586) || \ 729 defined(CONFIG_REGULATOR_MAX1586_MODULE) 730static struct regulator_consumer_supply balloon3_max1587a_consumers[] = { 731 REGULATOR_SUPPLY("vcc_core", NULL), 732}; 733 734static struct regulator_init_data balloon3_max1587a_v3_info = { 735 .constraints = { 736 .name = "vcc_core range", 737 .min_uV = 900000, 738 .max_uV = 1705000, 739 .always_on = 1, 740 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE, 741 }, 742 .consumer_supplies = balloon3_max1587a_consumers, 743 .num_consumer_supplies = ARRAY_SIZE(balloon3_max1587a_consumers), 744}; 745 746static struct max1586_subdev_data balloon3_max1587a_subdevs[] = { 747 { 748 .name = "vcc_core", 749 .id = MAX1586_V3, 750 .platform_data = &balloon3_max1587a_v3_info, 751 } 752}; 753 754static struct max1586_platform_data balloon3_max1587a_info = { 755 .subdevs = balloon3_max1587a_subdevs, 756 .num_subdevs = ARRAY_SIZE(balloon3_max1587a_subdevs), 757 .v3_gain = MAX1586_GAIN_R24_3k32, /* 730..1550 mV */ 758}; 759 760static struct i2c_board_info __initdata balloon3_pi2c_board_info[] = { 761 { 762 I2C_BOARD_INFO("max1586", 0x14), 763 .platform_data = &balloon3_max1587a_info, 764 }, 765}; 766 767static void __init balloon3_pmic_init(void) 768{ 769 pxa27x_set_i2c_power_info(NULL); 770 i2c_register_board_info(1, ARRAY_AND_SIZE(balloon3_pi2c_board_info)); 771} 772#else 773static inline void balloon3_pmic_init(void) {} 774#endif 775 776/****************************************************************************** 777 * Machine init 778 ******************************************************************************/ 779static void __init balloon3_init(void) 780{ 781 ARB_CNTRL = ARB_CORE_PARK | 0x234; 782 783 pxa2xx_mfp_config(ARRAY_AND_SIZE(balloon3_pin_config)); 784 785 pxa_set_ffuart_info(NULL); 786 pxa_set_btuart_info(NULL); 787 pxa_set_stuart_info(NULL); 788 789 balloon3_i2c_init(); 790 balloon3_irda_init(); 791 balloon3_lcd_init(); 792 balloon3_leds_init(); 793 balloon3_mmc_init(); 794 balloon3_nand_init(); 795 balloon3_nor_init(); 796 balloon3_pmic_init(); 797 balloon3_ts_init(); 798 balloon3_udc_init(); 799 balloon3_uhc_init(); 800 balloon3_cf_init(); 801} 802 803static struct map_desc balloon3_io_desc[] __initdata = { 804 { /* CPLD/FPGA */ 805 .virtual = (unsigned long)BALLOON3_FPGA_VIRT, 806 .pfn = __phys_to_pfn(BALLOON3_FPGA_PHYS), 807 .length = BALLOON3_FPGA_LENGTH, 808 .type = MT_DEVICE, 809 }, 810}; 811 812static void __init balloon3_map_io(void) 813{ 814 pxa27x_map_io(); 815 iotable_init(balloon3_io_desc, ARRAY_SIZE(balloon3_io_desc)); 816} 817 818MACHINE_START(BALLOON3, "Balloon3") 819 /* Maintainer: Nick Bane. */ 820 .map_io = balloon3_map_io, 821 .nr_irqs = BALLOON3_NR_IRQS, 822 .init_irq = balloon3_init_irq, 823 .handle_irq = pxa27x_handle_irq, 824 .init_time = pxa_timer_init, 825 .init_machine = balloon3_init, 826 .atag_offset = 0x100, 827 .restart = pxa_restart, 828MACHINE_END 829