linux/arch/arm/mach-pxa/balloon3.c
<<
>>
Prefs
   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 "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 "udc.h"
  51#include "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_to_nand(mtd);
 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