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