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 <mach/pxa27x.h>
  46#include <mach/balloon3.h>
  47#include <mach/audio.h>
  48#include <mach/pxafb.h>
  49#include <mach/mmc.h>
  50#include <mach/udc.h>
  51#include <mach/pxa27x-udc.h>
  52#include <mach/irda.h>
  53#include <mach/ohci.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 strict_strtoul(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        platform_device_register(&balloon3_gpio_vbus);
 335}
 336#else
 337static inline void balloon3_udc_init(void) {}
 338#endif
 339
 340/******************************************************************************
 341 * IrDA
 342 ******************************************************************************/
 343#if defined(CONFIG_IRDA) || defined(CONFIG_IRDA_MODULE)
 344static struct pxaficp_platform_data balloon3_ficp_platform_data = {
 345        .transceiver_cap        = IR_FIRMODE | IR_SIRMODE | IR_OFF,
 346};
 347
 348static void __init balloon3_irda_init(void)
 349{
 350        pxa_set_ficp_info(&balloon3_ficp_platform_data);
 351}
 352#else
 353static inline void balloon3_irda_init(void) {}
 354#endif
 355
 356/******************************************************************************
 357 * USB Host
 358 ******************************************************************************/
 359#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
 360static unsigned long balloon3_uhc_pin_config[] __initdata = {
 361        GPIO88_USBH1_PWR,
 362        GPIO89_USBH1_PEN,
 363};
 364
 365static struct pxaohci_platform_data balloon3_ohci_info = {
 366        .port_mode      = PMM_PERPORT_MODE,
 367        .flags          = ENABLE_PORT_ALL | POWER_CONTROL_LOW | POWER_SENSE_LOW,
 368};
 369
 370static void __init balloon3_uhc_init(void)
 371{
 372        if (!balloon3_has(BALLOON3_FEATURE_OHCI))
 373                return;
 374        pxa2xx_mfp_config(ARRAY_AND_SIZE(balloon3_uhc_pin_config));
 375        pxa_set_ohci_info(&balloon3_ohci_info);
 376}
 377#else
 378static inline void balloon3_uhc_init(void) {}
 379#endif
 380
 381/******************************************************************************
 382 * LEDs
 383 ******************************************************************************/
 384#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
 385static unsigned long balloon3_led_pin_config[] __initdata = {
 386        GPIO9_GPIO,     /* NAND activity LED */
 387        GPIO10_GPIO,    /* Heartbeat LED */
 388};
 389
 390struct gpio_led balloon3_gpio_leds[] = {
 391        {
 392                .name                   = "balloon3:green:idle",
 393                .default_trigger        = "heartbeat",
 394                .gpio                   = BALLOON3_GPIO_LED_IDLE,
 395                .active_low             = 1,
 396        }, {
 397                .name                   = "balloon3:green:nand",
 398                .default_trigger        = "nand-disk",
 399                .gpio                   = BALLOON3_GPIO_LED_NAND,
 400                .active_low             = 1,
 401        },
 402};
 403
 404static struct gpio_led_platform_data balloon3_gpio_led_info = {
 405        .leds           = balloon3_gpio_leds,
 406        .num_leds       = ARRAY_SIZE(balloon3_gpio_leds),
 407};
 408
 409static struct platform_device balloon3_leds = {
 410        .name   = "leds-gpio",
 411        .id     = 0,
 412        .dev    = {
 413                .platform_data  = &balloon3_gpio_led_info,
 414        }
 415};
 416
 417struct gpio_led balloon3_pcf_gpio_leds[] = {
 418        {
 419                .name                   = "balloon3:green:led0",
 420                .gpio                   = BALLOON3_PCF_GPIO_LED0,
 421                .active_low             = 1,
 422        }, {
 423                .name                   = "balloon3:green:led1",
 424                .gpio                   = BALLOON3_PCF_GPIO_LED1,
 425                .active_low             = 1,
 426        }, {
 427                .name                   = "balloon3:orange:led2",
 428                .gpio                   = BALLOON3_PCF_GPIO_LED2,
 429                .active_low             = 1,
 430        }, {
 431                .name                   = "balloon3:orange:led3",
 432                .gpio                   = BALLOON3_PCF_GPIO_LED3,
 433                .active_low             = 1,
 434        }, {
 435                .name                   = "balloon3:orange:led4",
 436                .gpio                   = BALLOON3_PCF_GPIO_LED4,
 437                .active_low             = 1,
 438        }, {
 439                .name                   = "balloon3:orange:led5",
 440                .gpio                   = BALLOON3_PCF_GPIO_LED5,
 441                .active_low             = 1,
 442        }, {
 443                .name                   = "balloon3:red:led6",
 444                .gpio                   = BALLOON3_PCF_GPIO_LED6,
 445                .active_low             = 1,
 446        }, {
 447                .name                   = "balloon3:red:led7",
 448                .gpio                   = BALLOON3_PCF_GPIO_LED7,
 449                .active_low             = 1,
 450        },
 451};
 452
 453static struct gpio_led_platform_data balloon3_pcf_gpio_led_info = {
 454        .leds           = balloon3_pcf_gpio_leds,
 455        .num_leds       = ARRAY_SIZE(balloon3_pcf_gpio_leds),
 456};
 457
 458static struct platform_device balloon3_pcf_leds = {
 459        .name   = "leds-gpio",
 460        .id     = 1,
 461        .dev    = {
 462                .platform_data  = &balloon3_pcf_gpio_led_info,
 463        }
 464};
 465
 466static void __init balloon3_leds_init(void)
 467{
 468        pxa2xx_mfp_config(ARRAY_AND_SIZE(balloon3_led_pin_config));
 469        platform_device_register(&balloon3_leds);
 470        platform_device_register(&balloon3_pcf_leds);
 471}
 472#else
 473static inline void balloon3_leds_init(void) {}
 474#endif
 475
 476/******************************************************************************
 477 * FPGA IRQ
 478 ******************************************************************************/
 479static void balloon3_mask_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 void balloon3_unmask_irq(struct irq_data *d)
 487{
 488        int balloon3_irq = (d->irq - BALLOON3_IRQ(0));
 489        balloon3_irq_enabled |= (1 << balloon3_irq);
 490        __raw_writel(~balloon3_irq_enabled, BALLOON3_INT_CONTROL_REG);
 491}
 492
 493static struct irq_chip balloon3_irq_chip = {
 494        .name           = "FPGA",
 495        .irq_ack        = balloon3_mask_irq,
 496        .irq_mask       = balloon3_mask_irq,
 497        .irq_unmask     = balloon3_unmask_irq,
 498};
 499
 500static void balloon3_irq_handler(unsigned int irq, struct irq_desc *desc)
 501{
 502        unsigned long pending = __raw_readl(BALLOON3_INT_CONTROL_REG) &
 503                                        balloon3_irq_enabled;
 504        do {
 505                /* clear useless edge notification */
 506                if (desc->irq_data.chip->irq_ack) {
 507                        struct irq_data *d;
 508
 509                        d = irq_get_irq_data(BALLOON3_AUX_NIRQ);
 510                        desc->irq_data.chip->irq_ack(d);
 511                }
 512
 513                while (pending) {
 514                        irq = BALLOON3_IRQ(0) + __ffs(pending);
 515                        generic_handle_irq(irq);
 516                        pending &= pending - 1;
 517                }
 518                pending = __raw_readl(BALLOON3_INT_CONTROL_REG) &
 519                                balloon3_irq_enabled;
 520        } while (pending);
 521}
 522
 523static void __init balloon3_init_irq(void)
 524{
 525        int irq;
 526
 527        pxa27x_init_irq();
 528        /* setup extra Balloon3 irqs */
 529        for (irq = BALLOON3_IRQ(0); irq <= BALLOON3_IRQ(7); irq++) {
 530                irq_set_chip_and_handler(irq, &balloon3_irq_chip,
 531                                         handle_level_irq);
 532                set_irq_flags(irq, IRQF_VALID | IRQF_PROBE);
 533        }
 534
 535        irq_set_chained_handler(BALLOON3_AUX_NIRQ, balloon3_irq_handler);
 536        irq_set_irq_type(BALLOON3_AUX_NIRQ, IRQ_TYPE_EDGE_FALLING);
 537
 538        pr_debug("%s: chained handler installed - irq %d automatically "
 539                "enabled\n", __func__, BALLOON3_AUX_NIRQ);
 540}
 541
 542/******************************************************************************
 543 * GPIO expander
 544 ******************************************************************************/
 545#if defined(CONFIG_GPIO_PCF857X) || defined(CONFIG_GPIO_PCF857X_MODULE)
 546static struct pcf857x_platform_data balloon3_pcf857x_pdata = {
 547        .gpio_base      = BALLOON3_PCF_GPIO_BASE,
 548        .n_latch        = 0,
 549        .setup          = NULL,
 550        .teardown       = NULL,
 551        .context        = NULL,
 552};
 553
 554static struct i2c_board_info __initdata balloon3_i2c_devs[] = {
 555        {
 556                I2C_BOARD_INFO("pcf8574a", 0x38),
 557                .platform_data  = &balloon3_pcf857x_pdata,
 558        },
 559};
 560
 561static void __init balloon3_i2c_init(void)
 562{
 563        pxa_set_i2c_info(NULL);
 564        i2c_register_board_info(0, ARRAY_AND_SIZE(balloon3_i2c_devs));
 565}
 566#else
 567static inline void balloon3_i2c_init(void) {}
 568#endif
 569
 570/******************************************************************************
 571 * NAND
 572 ******************************************************************************/
 573#if defined(CONFIG_MTD_NAND_PLATFORM)||defined(CONFIG_MTD_NAND_PLATFORM_MODULE)
 574static void balloon3_nand_cmd_ctl(struct mtd_info *mtd, int cmd, unsigned int ctrl)
 575{
 576        struct nand_chip *this = mtd->priv;
 577        uint8_t balloon3_ctl_set = 0, balloon3_ctl_clr = 0;
 578
 579        if (ctrl & NAND_CTRL_CHANGE) {
 580                if (ctrl & NAND_CLE)
 581                        balloon3_ctl_set |= BALLOON3_NAND_CONTROL_FLCLE;
 582                else
 583                        balloon3_ctl_clr |= BALLOON3_NAND_CONTROL_FLCLE;
 584
 585                if (ctrl & NAND_ALE)
 586                        balloon3_ctl_set |= BALLOON3_NAND_CONTROL_FLALE;
 587                else
 588                        balloon3_ctl_clr |= BALLOON3_NAND_CONTROL_FLALE;
 589
 590                if (balloon3_ctl_clr)
 591                        __raw_writel(balloon3_ctl_clr,
 592                                BALLOON3_NAND_CONTROL_REG);
 593                if (balloon3_ctl_set)
 594                        __raw_writel(balloon3_ctl_set,
 595                                BALLOON3_NAND_CONTROL_REG +
 596                                BALLOON3_FPGA_SETnCLR);
 597        }
 598
 599        if (cmd != NAND_CMD_NONE)
 600                writeb(cmd, this->IO_ADDR_W);
 601}
 602
 603static void balloon3_nand_select_chip(struct mtd_info *mtd, int chip)
 604{
 605        if (chip < 0 || chip > 3)
 606                return;
 607
 608        /* Assert all nCE lines */
 609        __raw_writew(
 610                BALLOON3_NAND_CONTROL_FLCE0 | BALLOON3_NAND_CONTROL_FLCE1 |
 611                BALLOON3_NAND_CONTROL_FLCE2 | BALLOON3_NAND_CONTROL_FLCE3,
 612                BALLOON3_NAND_CONTROL_REG + BALLOON3_FPGA_SETnCLR);
 613
 614        /* Deassert correct nCE line */
 615        __raw_writew(BALLOON3_NAND_CONTROL_FLCE0 << chip,
 616                BALLOON3_NAND_CONTROL_REG);
 617}
 618
 619static int balloon3_nand_dev_ready(struct mtd_info *mtd)
 620{
 621        return __raw_readl(BALLOON3_NAND_STAT_REG) & BALLOON3_NAND_STAT_RNB;
 622}
 623
 624static int balloon3_nand_probe(struct platform_device *pdev)
 625{
 626        uint16_t ver;
 627        int ret;
 628
 629        __raw_writew(BALLOON3_NAND_CONTROL2_16BIT,
 630                BALLOON3_NAND_CONTROL2_REG + BALLOON3_FPGA_SETnCLR);
 631
 632        ver = __raw_readw(BALLOON3_FPGA_VER);
 633        if (ver < 0x4f08)
 634                pr_warn("The FPGA code, version 0x%04x, is too old. "
 635                        "NAND support might be broken in this version!", ver);
 636
 637        /* Power up the NAND chips */
 638        ret = gpio_request(BALLOON3_GPIO_RUN_NAND, "NAND");
 639        if (ret)
 640                goto err1;
 641
 642        ret = gpio_direction_output(BALLOON3_GPIO_RUN_NAND, 1);
 643        if (ret)
 644                goto err2;
 645
 646        gpio_set_value(BALLOON3_GPIO_RUN_NAND, 1);
 647
 648        /* Deassert all nCE lines and write protect line */
 649        __raw_writel(
 650                BALLOON3_NAND_CONTROL_FLCE0 | BALLOON3_NAND_CONTROL_FLCE1 |
 651                BALLOON3_NAND_CONTROL_FLCE2 | BALLOON3_NAND_CONTROL_FLCE3 |
 652                BALLOON3_NAND_CONTROL_FLWP,
 653                BALLOON3_NAND_CONTROL_REG + BALLOON3_FPGA_SETnCLR);
 654        return 0;
 655
 656err2:
 657        gpio_free(BALLOON3_GPIO_RUN_NAND);
 658err1:
 659        return ret;
 660}
 661
 662static void balloon3_nand_remove(struct platform_device *pdev)
 663{
 664        /* Power down the NAND chips */
 665        gpio_set_value(BALLOON3_GPIO_RUN_NAND, 0);
 666        gpio_free(BALLOON3_GPIO_RUN_NAND);
 667}
 668
 669static struct mtd_partition balloon3_partition_info[] = {
 670        [0] = {
 671                .name   = "Boot",
 672                .offset = 0,
 673                .size   = SZ_4M,
 674        },
 675        [1] = {
 676                .name   = "RootFS",
 677                .offset = MTDPART_OFS_APPEND,
 678                .size   = MTDPART_SIZ_FULL
 679        },
 680};
 681
 682static const char *balloon3_part_probes[] = { "cmdlinepart", NULL };
 683
 684struct platform_nand_data balloon3_nand_pdata = {
 685        .chip = {
 686                .nr_chips       = 4,
 687                .chip_offset    = 0,
 688                .nr_partitions  = ARRAY_SIZE(balloon3_partition_info),
 689                .partitions     = balloon3_partition_info,
 690                .chip_delay     = 50,
 691                .part_probe_types = balloon3_part_probes,
 692        },
 693        .ctrl = {
 694                .hwcontrol      = 0,
 695                .dev_ready      = balloon3_nand_dev_ready,
 696                .select_chip    = balloon3_nand_select_chip,
 697                .cmd_ctrl       = balloon3_nand_cmd_ctl,
 698                .probe          = balloon3_nand_probe,
 699                .remove         = balloon3_nand_remove,
 700        },
 701};
 702
 703static struct resource balloon3_nand_resource[] = {
 704        [0] = {
 705                .start = BALLOON3_NAND_BASE,
 706                .end   = BALLOON3_NAND_BASE + 0x4,
 707                .flags = IORESOURCE_MEM,
 708        },
 709};
 710
 711static struct platform_device balloon3_nand = {
 712        .name           = "gen_nand",
 713        .num_resources  = ARRAY_SIZE(balloon3_nand_resource),
 714        .resource       = balloon3_nand_resource,
 715        .id             = -1,
 716        .dev            = {
 717                .platform_data = &balloon3_nand_pdata,
 718        }
 719};
 720
 721static void __init balloon3_nand_init(void)
 722{
 723        platform_device_register(&balloon3_nand);
 724}
 725#else
 726static inline void balloon3_nand_init(void) {}
 727#endif
 728
 729/******************************************************************************
 730 * Core power regulator
 731 ******************************************************************************/
 732#if defined(CONFIG_REGULATOR_MAX1586) || \
 733    defined(CONFIG_REGULATOR_MAX1586_MODULE)
 734static struct regulator_consumer_supply balloon3_max1587a_consumers[] = {
 735        {
 736                .supply = "vcc_core",
 737        }
 738};
 739
 740static struct regulator_init_data balloon3_max1587a_v3_info = {
 741        .constraints = {
 742                .name           = "vcc_core range",
 743                .min_uV         = 900000,
 744                .max_uV         = 1705000,
 745                .always_on      = 1,
 746                .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
 747        },
 748        .consumer_supplies      = balloon3_max1587a_consumers,
 749        .num_consumer_supplies  = ARRAY_SIZE(balloon3_max1587a_consumers),
 750};
 751
 752static struct max1586_subdev_data balloon3_max1587a_subdevs[] = {
 753        {
 754                .name           = "vcc_core",
 755                .id             = MAX1586_V3,
 756                .platform_data  = &balloon3_max1587a_v3_info,
 757        }
 758};
 759
 760static struct max1586_platform_data balloon3_max1587a_info = {
 761        .subdevs     = balloon3_max1587a_subdevs,
 762        .num_subdevs = ARRAY_SIZE(balloon3_max1587a_subdevs),
 763        .v3_gain     = MAX1586_GAIN_R24_3k32, /* 730..1550 mV */
 764};
 765
 766static struct i2c_board_info __initdata balloon3_pi2c_board_info[] = {
 767        {
 768                I2C_BOARD_INFO("max1586", 0x14),
 769                .platform_data  = &balloon3_max1587a_info,
 770        },
 771};
 772
 773static void __init balloon3_pmic_init(void)
 774{
 775        pxa27x_set_i2c_power_info(NULL);
 776        i2c_register_board_info(1, ARRAY_AND_SIZE(balloon3_pi2c_board_info));
 777}
 778#else
 779static inline void balloon3_pmic_init(void) {}
 780#endif
 781
 782/******************************************************************************
 783 * Machine init
 784 ******************************************************************************/
 785static void __init balloon3_init(void)
 786{
 787        ARB_CNTRL = ARB_CORE_PARK | 0x234;
 788
 789        pxa2xx_mfp_config(ARRAY_AND_SIZE(balloon3_pin_config));
 790
 791        pxa_set_ffuart_info(NULL);
 792        pxa_set_btuart_info(NULL);
 793        pxa_set_stuart_info(NULL);
 794
 795        balloon3_i2c_init();
 796        balloon3_irda_init();
 797        balloon3_lcd_init();
 798        balloon3_leds_init();
 799        balloon3_mmc_init();
 800        balloon3_nand_init();
 801        balloon3_nor_init();
 802        balloon3_pmic_init();
 803        balloon3_ts_init();
 804        balloon3_udc_init();
 805        balloon3_uhc_init();
 806        balloon3_cf_init();
 807}
 808
 809static struct map_desc balloon3_io_desc[] __initdata = {
 810        {       /* CPLD/FPGA */
 811                .virtual        = (unsigned long)BALLOON3_FPGA_VIRT,
 812                .pfn            = __phys_to_pfn(BALLOON3_FPGA_PHYS),
 813                .length         = BALLOON3_FPGA_LENGTH,
 814                .type           = MT_DEVICE,
 815        },
 816};
 817
 818static void __init balloon3_map_io(void)
 819{
 820        pxa27x_map_io();
 821        iotable_init(balloon3_io_desc, ARRAY_SIZE(balloon3_io_desc));
 822}
 823
 824MACHINE_START(BALLOON3, "Balloon3")
 825        /* Maintainer: Nick Bane. */
 826        .map_io         = balloon3_map_io,
 827        .nr_irqs        = BALLOON3_NR_IRQS,
 828        .init_irq       = balloon3_init_irq,
 829        .handle_irq     = pxa27x_handle_irq,
 830        .timer          = &pxa_timer,
 831        .init_machine   = balloon3_init,
 832        .atag_offset    = 0x100,
 833        .restart        = pxa_restart,
 834MACHINE_END
 835