linux/arch/arm/mach-pxa/mainstone.c
<<
>>
Prefs
   1/*
   2 *  linux/arch/arm/mach-pxa/mainstone.c
   3 *
   4 *  Support for the Intel HCDDBBVA0 Development Platform.
   5 *  (go figure how they came up with such name...)
   6 *
   7 *  Author:     Nicolas Pitre
   8 *  Created:    Nov 05, 2002
   9 *  Copyright:  MontaVista Software Inc.
  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#include <linux/gpio.h>
  16#include <linux/init.h>
  17#include <linux/platform_device.h>
  18#include <linux/syscore_ops.h>
  19#include <linux/interrupt.h>
  20#include <linux/sched.h>
  21#include <linux/bitops.h>
  22#include <linux/fb.h>
  23#include <linux/ioport.h>
  24#include <linux/mtd/mtd.h>
  25#include <linux/mtd/partitions.h>
  26#include <linux/input.h>
  27#include <linux/gpio_keys.h>
  28#include <linux/pwm_backlight.h>
  29#include <linux/smc91x.h>
  30#include <linux/i2c/pxa-i2c.h>
  31#include <linux/slab.h>
  32#include <linux/leds.h>
  33
  34#include <asm/types.h>
  35#include <asm/setup.h>
  36#include <asm/memory.h>
  37#include <asm/mach-types.h>
  38#include <mach/hardware.h>
  39#include <asm/irq.h>
  40#include <asm/sizes.h>
  41
  42#include <asm/mach/arch.h>
  43#include <asm/mach/map.h>
  44#include <asm/mach/irq.h>
  45#include <asm/mach/flash.h>
  46
  47#include <mach/pxa27x.h>
  48#include <mach/mainstone.h>
  49#include <mach/audio.h>
  50#include <linux/platform_data/video-pxafb.h>
  51#include <linux/platform_data/mmc-pxamci.h>
  52#include <linux/platform_data/irda-pxaficp.h>
  53#include <linux/platform_data/usb-ohci-pxa27x.h>
  54#include <linux/platform_data/keypad-pxa27x.h>
  55#include <mach/smemc.h>
  56
  57#include "generic.h"
  58#include "devices.h"
  59
  60static unsigned long mainstone_pin_config[] = {
  61        /* Chip Select */
  62        GPIO15_nCS_1,
  63
  64        /* LCD - 16bpp Active TFT */
  65        GPIOxx_LCD_TFT_16BPP,
  66        GPIO16_PWM0_OUT,        /* Backlight */
  67
  68        /* MMC */
  69        GPIO32_MMC_CLK,
  70        GPIO112_MMC_CMD,
  71        GPIO92_MMC_DAT_0,
  72        GPIO109_MMC_DAT_1,
  73        GPIO110_MMC_DAT_2,
  74        GPIO111_MMC_DAT_3,
  75
  76        /* USB Host Port 1 */
  77        GPIO88_USBH1_PWR,
  78        GPIO89_USBH1_PEN,
  79
  80        /* PC Card */
  81        GPIO48_nPOE,
  82        GPIO49_nPWE,
  83        GPIO50_nPIOR,
  84        GPIO51_nPIOW,
  85        GPIO85_nPCE_1,
  86        GPIO54_nPCE_2,
  87        GPIO79_PSKTSEL,
  88        GPIO55_nPREG,
  89        GPIO56_nPWAIT,
  90        GPIO57_nIOIS16,
  91
  92        /* AC97 */
  93        GPIO28_AC97_BITCLK,
  94        GPIO29_AC97_SDATA_IN_0,
  95        GPIO30_AC97_SDATA_OUT,
  96        GPIO31_AC97_SYNC,
  97        GPIO45_AC97_SYSCLK,
  98
  99        /* Keypad */
 100        GPIO93_KP_DKIN_0,
 101        GPIO94_KP_DKIN_1,
 102        GPIO95_KP_DKIN_2,
 103        GPIO100_KP_MKIN_0       | WAKEUP_ON_LEVEL_HIGH,
 104        GPIO101_KP_MKIN_1       | WAKEUP_ON_LEVEL_HIGH,
 105        GPIO102_KP_MKIN_2       | WAKEUP_ON_LEVEL_HIGH,
 106        GPIO97_KP_MKIN_3        | WAKEUP_ON_LEVEL_HIGH,
 107        GPIO98_KP_MKIN_4        | WAKEUP_ON_LEVEL_HIGH,
 108        GPIO99_KP_MKIN_5        | WAKEUP_ON_LEVEL_HIGH,
 109        GPIO103_KP_MKOUT_0,
 110        GPIO104_KP_MKOUT_1,
 111        GPIO105_KP_MKOUT_2,
 112        GPIO106_KP_MKOUT_3,
 113        GPIO107_KP_MKOUT_4,
 114        GPIO108_KP_MKOUT_5,
 115        GPIO96_KP_MKOUT_6,
 116
 117        /* I2C */
 118        GPIO117_I2C_SCL,
 119        GPIO118_I2C_SDA,
 120
 121        /* GPIO */
 122        GPIO1_GPIO | WAKEUP_ON_EDGE_BOTH,
 123};
 124
 125static unsigned long mainstone_irq_enabled;
 126
 127static void mainstone_mask_irq(struct irq_data *d)
 128{
 129        int mainstone_irq = (d->irq - MAINSTONE_IRQ(0));
 130        MST_INTMSKENA = (mainstone_irq_enabled &= ~(1 << mainstone_irq));
 131}
 132
 133static void mainstone_unmask_irq(struct irq_data *d)
 134{
 135        int mainstone_irq = (d->irq - MAINSTONE_IRQ(0));
 136        /* the irq can be acknowledged only if deasserted, so it's done here */
 137        MST_INTSETCLR &= ~(1 << mainstone_irq);
 138        MST_INTMSKENA = (mainstone_irq_enabled |= (1 << mainstone_irq));
 139}
 140
 141static struct irq_chip mainstone_irq_chip = {
 142        .name           = "FPGA",
 143        .irq_ack        = mainstone_mask_irq,
 144        .irq_mask       = mainstone_mask_irq,
 145        .irq_unmask     = mainstone_unmask_irq,
 146};
 147
 148static void mainstone_irq_handler(unsigned int irq, struct irq_desc *desc)
 149{
 150        unsigned long pending = MST_INTSETCLR & mainstone_irq_enabled;
 151        do {
 152                /* clear useless edge notification */
 153                desc->irq_data.chip->irq_ack(&desc->irq_data);
 154                if (likely(pending)) {
 155                        irq = MAINSTONE_IRQ(0) + __ffs(pending);
 156                        generic_handle_irq(irq);
 157                }
 158                pending = MST_INTSETCLR & mainstone_irq_enabled;
 159        } while (pending);
 160}
 161
 162static void __init mainstone_init_irq(void)
 163{
 164        int irq;
 165
 166        pxa27x_init_irq();
 167
 168        /* setup extra Mainstone irqs */
 169        for(irq = MAINSTONE_IRQ(0); irq <= MAINSTONE_IRQ(15); irq++) {
 170                irq_set_chip_and_handler(irq, &mainstone_irq_chip,
 171                                         handle_level_irq);
 172                if (irq == MAINSTONE_IRQ(10) || irq == MAINSTONE_IRQ(14))
 173                        set_irq_flags(irq, IRQF_VALID | IRQF_PROBE | IRQF_NOAUTOEN);
 174                else
 175                        set_irq_flags(irq, IRQF_VALID | IRQF_PROBE);
 176        }
 177        set_irq_flags(MAINSTONE_IRQ(8), 0);
 178        set_irq_flags(MAINSTONE_IRQ(12), 0);
 179
 180        MST_INTMSKENA = 0;
 181        MST_INTSETCLR = 0;
 182
 183        irq_set_chained_handler(PXA_GPIO_TO_IRQ(0), mainstone_irq_handler);
 184        irq_set_irq_type(PXA_GPIO_TO_IRQ(0), IRQ_TYPE_EDGE_FALLING);
 185}
 186
 187#ifdef CONFIG_PM
 188
 189static void mainstone_irq_resume(void)
 190{
 191        MST_INTMSKENA = mainstone_irq_enabled;
 192}
 193
 194static struct syscore_ops mainstone_irq_syscore_ops = {
 195        .resume = mainstone_irq_resume,
 196};
 197
 198static int __init mainstone_irq_device_init(void)
 199{
 200        if (machine_is_mainstone())
 201                register_syscore_ops(&mainstone_irq_syscore_ops);
 202
 203        return 0;
 204}
 205
 206device_initcall(mainstone_irq_device_init);
 207
 208#endif
 209
 210
 211static struct resource smc91x_resources[] = {
 212        [0] = {
 213                .start  = (MST_ETH_PHYS + 0x300),
 214                .end    = (MST_ETH_PHYS + 0xfffff),
 215                .flags  = IORESOURCE_MEM,
 216        },
 217        [1] = {
 218                .start  = MAINSTONE_IRQ(3),
 219                .end    = MAINSTONE_IRQ(3),
 220                .flags  = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
 221        }
 222};
 223
 224static struct smc91x_platdata mainstone_smc91x_info = {
 225        .flags  = SMC91X_USE_8BIT | SMC91X_USE_16BIT | SMC91X_USE_32BIT |
 226                  SMC91X_NOWAIT | SMC91X_USE_DMA,
 227};
 228
 229static struct platform_device smc91x_device = {
 230        .name           = "smc91x",
 231        .id             = 0,
 232        .num_resources  = ARRAY_SIZE(smc91x_resources),
 233        .resource       = smc91x_resources,
 234        .dev            = {
 235                .platform_data = &mainstone_smc91x_info,
 236        },
 237};
 238
 239static int mst_audio_startup(struct snd_pcm_substream *substream, void *priv)
 240{
 241        if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
 242                MST_MSCWR2 &= ~MST_MSCWR2_AC97_SPKROFF;
 243        return 0;
 244}
 245
 246static void mst_audio_shutdown(struct snd_pcm_substream *substream, void *priv)
 247{
 248        if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
 249                MST_MSCWR2 |= MST_MSCWR2_AC97_SPKROFF;
 250}
 251
 252static long mst_audio_suspend_mask;
 253
 254static void mst_audio_suspend(void *priv)
 255{
 256        mst_audio_suspend_mask = MST_MSCWR2;
 257        MST_MSCWR2 |= MST_MSCWR2_AC97_SPKROFF;
 258}
 259
 260static void mst_audio_resume(void *priv)
 261{
 262        MST_MSCWR2 &= mst_audio_suspend_mask | ~MST_MSCWR2_AC97_SPKROFF;
 263}
 264
 265static pxa2xx_audio_ops_t mst_audio_ops = {
 266        .startup        = mst_audio_startup,
 267        .shutdown       = mst_audio_shutdown,
 268        .suspend        = mst_audio_suspend,
 269        .resume         = mst_audio_resume,
 270};
 271
 272static struct resource flash_resources[] = {
 273        [0] = {
 274                .start  = PXA_CS0_PHYS,
 275                .end    = PXA_CS0_PHYS + SZ_64M - 1,
 276                .flags  = IORESOURCE_MEM,
 277        },
 278        [1] = {
 279                .start  = PXA_CS1_PHYS,
 280                .end    = PXA_CS1_PHYS + SZ_64M - 1,
 281                .flags  = IORESOURCE_MEM,
 282        },
 283};
 284
 285static struct mtd_partition mainstoneflash0_partitions[] = {
 286        {
 287                .name =         "Bootloader",
 288                .size =         0x00040000,
 289                .offset =       0,
 290                .mask_flags =   MTD_WRITEABLE  /* force read-only */
 291        },{
 292                .name =         "Kernel",
 293                .size =         0x00400000,
 294                .offset =       0x00040000,
 295        },{
 296                .name =         "Filesystem",
 297                .size =         MTDPART_SIZ_FULL,
 298                .offset =       0x00440000
 299        }
 300};
 301
 302static struct flash_platform_data mst_flash_data[2] = {
 303        {
 304                .map_name       = "cfi_probe",
 305                .parts          = mainstoneflash0_partitions,
 306                .nr_parts       = ARRAY_SIZE(mainstoneflash0_partitions),
 307        }, {
 308                .map_name       = "cfi_probe",
 309                .parts          = NULL,
 310                .nr_parts       = 0,
 311        }
 312};
 313
 314static struct platform_device mst_flash_device[2] = {
 315        {
 316                .name           = "pxa2xx-flash",
 317                .id             = 0,
 318                .dev = {
 319                        .platform_data = &mst_flash_data[0],
 320                },
 321                .resource = &flash_resources[0],
 322                .num_resources = 1,
 323        },
 324        {
 325                .name           = "pxa2xx-flash",
 326                .id             = 1,
 327                .dev = {
 328                        .platform_data = &mst_flash_data[1],
 329                },
 330                .resource = &flash_resources[1],
 331                .num_resources = 1,
 332        },
 333};
 334
 335#if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE)
 336static struct platform_pwm_backlight_data mainstone_backlight_data = {
 337        .pwm_id         = 0,
 338        .max_brightness = 1023,
 339        .dft_brightness = 1023,
 340        .pwm_period_ns  = 78770,
 341};
 342
 343static struct platform_device mainstone_backlight_device = {
 344        .name           = "pwm-backlight",
 345        .dev            = {
 346                .parent = &pxa27x_device_pwm0.dev,
 347                .platform_data = &mainstone_backlight_data,
 348        },
 349};
 350
 351static void __init mainstone_backlight_register(void)
 352{
 353        int ret = platform_device_register(&mainstone_backlight_device);
 354        if (ret)
 355                printk(KERN_ERR "mainstone: failed to register backlight device: %d\n", ret);
 356}
 357#else
 358#define mainstone_backlight_register()  do { } while (0)
 359#endif
 360
 361static struct pxafb_mode_info toshiba_ltm04c380k_mode = {
 362        .pixclock               = 50000,
 363        .xres                   = 640,
 364        .yres                   = 480,
 365        .bpp                    = 16,
 366        .hsync_len              = 1,
 367        .left_margin            = 0x9f,
 368        .right_margin           = 1,
 369        .vsync_len              = 44,
 370        .upper_margin           = 0,
 371        .lower_margin           = 0,
 372        .sync                   = FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT,
 373};
 374
 375static struct pxafb_mode_info toshiba_ltm035a776c_mode = {
 376        .pixclock               = 110000,
 377        .xres                   = 240,
 378        .yres                   = 320,
 379        .bpp                    = 16,
 380        .hsync_len              = 4,
 381        .left_margin            = 8,
 382        .right_margin           = 20,
 383        .vsync_len              = 3,
 384        .upper_margin           = 1,
 385        .lower_margin           = 10,
 386        .sync                   = FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT,
 387};
 388
 389static struct pxafb_mach_info mainstone_pxafb_info = {
 390        .num_modes              = 1,
 391        .lcd_conn               = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL,
 392};
 393
 394static int mainstone_mci_init(struct device *dev, irq_handler_t mstone_detect_int, void *data)
 395{
 396        int err;
 397
 398        /* make sure SD/Memory Stick multiplexer's signals
 399         * are routed to MMC controller
 400         */
 401        MST_MSCWR1 &= ~MST_MSCWR1_MS_SEL;
 402
 403        err = request_irq(MAINSTONE_MMC_IRQ, mstone_detect_int, IRQF_DISABLED,
 404                             "MMC card detect", data);
 405        if (err)
 406                printk(KERN_ERR "mainstone_mci_init: MMC/SD: can't request MMC card detect IRQ\n");
 407
 408        return err;
 409}
 410
 411static int mainstone_mci_setpower(struct device *dev, unsigned int vdd)
 412{
 413        struct pxamci_platform_data* p_d = dev->platform_data;
 414
 415        if (( 1 << vdd) & p_d->ocr_mask) {
 416                printk(KERN_DEBUG "%s: on\n", __func__);
 417                MST_MSCWR1 |= MST_MSCWR1_MMC_ON;
 418                MST_MSCWR1 &= ~MST_MSCWR1_MS_SEL;
 419        } else {
 420                printk(KERN_DEBUG "%s: off\n", __func__);
 421                MST_MSCWR1 &= ~MST_MSCWR1_MMC_ON;
 422        }
 423        return 0;
 424}
 425
 426static void mainstone_mci_exit(struct device *dev, void *data)
 427{
 428        free_irq(MAINSTONE_MMC_IRQ, data);
 429}
 430
 431static struct pxamci_platform_data mainstone_mci_platform_data = {
 432        .ocr_mask               = MMC_VDD_32_33|MMC_VDD_33_34,
 433        .init                   = mainstone_mci_init,
 434        .setpower               = mainstone_mci_setpower,
 435        .exit                   = mainstone_mci_exit,
 436        .gpio_card_detect       = -1,
 437        .gpio_card_ro           = -1,
 438        .gpio_power             = -1,
 439};
 440
 441static void mainstone_irda_transceiver_mode(struct device *dev, int mode)
 442{
 443        unsigned long flags;
 444
 445        local_irq_save(flags);
 446        if (mode & IR_SIRMODE) {
 447                MST_MSCWR1 &= ~MST_MSCWR1_IRDA_FIR;
 448        } else if (mode & IR_FIRMODE) {
 449                MST_MSCWR1 |= MST_MSCWR1_IRDA_FIR;
 450        }
 451        pxa2xx_transceiver_mode(dev, mode);
 452        if (mode & IR_OFF) {
 453                MST_MSCWR1 = (MST_MSCWR1 & ~MST_MSCWR1_IRDA_MASK) | MST_MSCWR1_IRDA_OFF;
 454        } else {
 455                MST_MSCWR1 = (MST_MSCWR1 & ~MST_MSCWR1_IRDA_MASK) | MST_MSCWR1_IRDA_FULL;
 456        }
 457        local_irq_restore(flags);
 458}
 459
 460static struct pxaficp_platform_data mainstone_ficp_platform_data = {
 461        .gpio_pwdown            = -1,
 462        .transceiver_cap        = IR_SIRMODE | IR_FIRMODE | IR_OFF,
 463        .transceiver_mode       = mainstone_irda_transceiver_mode,
 464};
 465
 466static struct gpio_keys_button gpio_keys_button[] = {
 467        [0] = {
 468                .desc   = "wakeup",
 469                .code   = KEY_SUSPEND,
 470                .type   = EV_KEY,
 471                .gpio   = 1,
 472                .wakeup = 1,
 473        },
 474};
 475
 476static struct gpio_keys_platform_data mainstone_gpio_keys = {
 477        .buttons        = gpio_keys_button,
 478        .nbuttons       = 1,
 479};
 480
 481static struct platform_device mst_gpio_keys_device = {
 482        .name           = "gpio-keys",
 483        .id             = -1,
 484        .dev            = {
 485                .platform_data  = &mainstone_gpio_keys,
 486        },
 487};
 488
 489static struct platform_device *platform_devices[] __initdata = {
 490        &smc91x_device,
 491        &mst_flash_device[0],
 492        &mst_flash_device[1],
 493        &mst_gpio_keys_device,
 494};
 495
 496static struct pxaohci_platform_data mainstone_ohci_platform_data = {
 497        .port_mode      = PMM_PERPORT_MODE,
 498        .flags          = ENABLE_PORT_ALL | POWER_CONTROL_LOW | POWER_SENSE_LOW,
 499};
 500
 501#if defined(CONFIG_KEYBOARD_PXA27x) || defined(CONFIG_KEYBOARD_PXA27x_MODULE)
 502static const unsigned int mainstone_matrix_keys[] = {
 503        KEY(0, 0, KEY_A), KEY(1, 0, KEY_B), KEY(2, 0, KEY_C),
 504        KEY(3, 0, KEY_D), KEY(4, 0, KEY_E), KEY(5, 0, KEY_F),
 505        KEY(0, 1, KEY_G), KEY(1, 1, KEY_H), KEY(2, 1, KEY_I),
 506        KEY(3, 1, KEY_J), KEY(4, 1, KEY_K), KEY(5, 1, KEY_L),
 507        KEY(0, 2, KEY_M), KEY(1, 2, KEY_N), KEY(2, 2, KEY_O),
 508        KEY(3, 2, KEY_P), KEY(4, 2, KEY_Q), KEY(5, 2, KEY_R),
 509        KEY(0, 3, KEY_S), KEY(1, 3, KEY_T), KEY(2, 3, KEY_U),
 510        KEY(3, 3, KEY_V), KEY(4, 3, KEY_W), KEY(5, 3, KEY_X),
 511        KEY(2, 4, KEY_Y), KEY(3, 4, KEY_Z),
 512
 513        KEY(0, 4, KEY_DOT),     /* . */
 514        KEY(1, 4, KEY_CLOSE),   /* @ */
 515        KEY(4, 4, KEY_SLASH),
 516        KEY(5, 4, KEY_BACKSLASH),
 517        KEY(0, 5, KEY_HOME),
 518        KEY(1, 5, KEY_LEFTSHIFT),
 519        KEY(2, 5, KEY_SPACE),
 520        KEY(3, 5, KEY_SPACE),
 521        KEY(4, 5, KEY_ENTER),
 522        KEY(5, 5, KEY_BACKSPACE),
 523
 524        KEY(0, 6, KEY_UP),
 525        KEY(1, 6, KEY_DOWN),
 526        KEY(2, 6, KEY_LEFT),
 527        KEY(3, 6, KEY_RIGHT),
 528        KEY(4, 6, KEY_SELECT),
 529};
 530
 531static struct matrix_keymap_data mainstone_matrix_keymap_data = {
 532        .keymap                 = mainstone_matrix_keys,
 533        .keymap_size            = ARRAY_SIZE(mainstone_matrix_keys),
 534};
 535
 536struct pxa27x_keypad_platform_data mainstone_keypad_info = {
 537        .matrix_key_rows        = 6,
 538        .matrix_key_cols        = 7,
 539        .matrix_keymap_data     = &mainstone_matrix_keymap_data,
 540
 541        .enable_rotary0         = 1,
 542        .rotary0_up_key         = KEY_UP,
 543        .rotary0_down_key       = KEY_DOWN,
 544
 545        .debounce_interval      = 30,
 546};
 547
 548static void __init mainstone_init_keypad(void)
 549{
 550        pxa_set_keypad_info(&mainstone_keypad_info);
 551}
 552#else
 553static inline void mainstone_init_keypad(void) {}
 554#endif
 555
 556static void __init mainstone_init(void)
 557{
 558        int SW7 = 0;  /* FIXME: get from SCR (Mst doc section 3.2.1.1) */
 559
 560        pxa2xx_mfp_config(ARRAY_AND_SIZE(mainstone_pin_config));
 561
 562        pxa_set_ffuart_info(NULL);
 563        pxa_set_btuart_info(NULL);
 564        pxa_set_stuart_info(NULL);
 565
 566        mst_flash_data[0].width = (__raw_readl(BOOT_DEF) & 1) ? 2 : 4;
 567        mst_flash_data[1].width = 4;
 568
 569        /* Compensate for SW7 which swaps the flash banks */
 570        mst_flash_data[SW7].name = "processor-flash";
 571        mst_flash_data[SW7 ^ 1].name = "mainboard-flash";
 572
 573        printk(KERN_NOTICE "Mainstone configured to boot from %s\n",
 574               mst_flash_data[0].name);
 575
 576        /* system bus arbiter setting
 577         * - Core_Park
 578         * - LCD_wt:DMA_wt:CORE_Wt = 2:3:4
 579         */
 580        ARB_CNTRL = ARB_CORE_PARK | 0x234;
 581
 582        platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices));
 583
 584        /* reading Mainstone's "Virtual Configuration Register"
 585           might be handy to select LCD type here */
 586        if (0)
 587                mainstone_pxafb_info.modes = &toshiba_ltm04c380k_mode;
 588        else
 589                mainstone_pxafb_info.modes = &toshiba_ltm035a776c_mode;
 590
 591        pxa_set_fb_info(NULL, &mainstone_pxafb_info);
 592        mainstone_backlight_register();
 593
 594        pxa_set_mci_info(&mainstone_mci_platform_data);
 595        pxa_set_ficp_info(&mainstone_ficp_platform_data);
 596        pxa_set_ohci_info(&mainstone_ohci_platform_data);
 597        pxa_set_i2c_info(NULL);
 598        pxa_set_ac97_info(&mst_audio_ops);
 599
 600        mainstone_init_keypad();
 601}
 602
 603
 604static struct map_desc mainstone_io_desc[] __initdata = {
 605        {       /* CPLD */
 606                .virtual        =  MST_FPGA_VIRT,
 607                .pfn            = __phys_to_pfn(MST_FPGA_PHYS),
 608                .length         = 0x00100000,
 609                .type           = MT_DEVICE
 610        }
 611};
 612
 613static void __init mainstone_map_io(void)
 614{
 615        pxa27x_map_io();
 616        iotable_init(mainstone_io_desc, ARRAY_SIZE(mainstone_io_desc));
 617
 618        /*      for use I SRAM as framebuffer.  */
 619        PSLR |= 0xF04;
 620        PCFR = 0x66;
 621}
 622
 623/*
 624 * Driver for the 8 discrete LEDs available for general use:
 625 * Note: bits [15-8] are used to enable/blank the 8 7 segment hex displays
 626 * so be sure to not monkey with them here.
 627 */
 628
 629#if defined(CONFIG_NEW_LEDS) && defined(CONFIG_LEDS_CLASS)
 630struct mainstone_led {
 631        struct led_classdev     cdev;
 632        u8                      mask;
 633};
 634
 635/*
 636 * The triggers lines up below will only be used if the
 637 * LED triggers are compiled in.
 638 */
 639static const struct {
 640        const char *name;
 641        const char *trigger;
 642} mainstone_leds[] = {
 643        { "mainstone:D28", "default-on", },
 644        { "mainstone:D27", "cpu0", },
 645        { "mainstone:D26", "heartbeat" },
 646        { "mainstone:D25", },
 647        { "mainstone:D24", },
 648        { "mainstone:D23", },
 649        { "mainstone:D22", },
 650        { "mainstone:D21", },
 651};
 652
 653static void mainstone_led_set(struct led_classdev *cdev,
 654                              enum led_brightness b)
 655{
 656        struct mainstone_led *led = container_of(cdev,
 657                                         struct mainstone_led, cdev);
 658        u32 reg = MST_LEDCTRL;
 659
 660        if (b != LED_OFF)
 661                reg |= led->mask;
 662        else
 663                reg &= ~led->mask;
 664
 665        MST_LEDCTRL = reg;
 666}
 667
 668static enum led_brightness mainstone_led_get(struct led_classdev *cdev)
 669{
 670        struct mainstone_led *led = container_of(cdev,
 671                                         struct mainstone_led, cdev);
 672        u32 reg = MST_LEDCTRL;
 673
 674        return (reg & led->mask) ? LED_FULL : LED_OFF;
 675}
 676
 677static int __init mainstone_leds_init(void)
 678{
 679        int i;
 680
 681        if (!machine_is_mainstone())
 682                return -ENODEV;
 683
 684        /* All ON */
 685        MST_LEDCTRL |= 0xff;
 686        for (i = 0; i < ARRAY_SIZE(mainstone_leds); i++) {
 687                struct mainstone_led *led;
 688
 689                led = kzalloc(sizeof(*led), GFP_KERNEL);
 690                if (!led)
 691                        break;
 692
 693                led->cdev.name = mainstone_leds[i].name;
 694                led->cdev.brightness_set = mainstone_led_set;
 695                led->cdev.brightness_get = mainstone_led_get;
 696                led->cdev.default_trigger = mainstone_leds[i].trigger;
 697                led->mask = BIT(i);
 698
 699                if (led_classdev_register(NULL, &led->cdev) < 0) {
 700                        kfree(led);
 701                        break;
 702                }
 703        }
 704
 705        return 0;
 706}
 707
 708/*
 709 * Since we may have triggers on any subsystem, defer registration
 710 * until after subsystem_init.
 711 */
 712fs_initcall(mainstone_leds_init);
 713#endif
 714
 715MACHINE_START(MAINSTONE, "Intel HCDDBBVA0 Development Platform (aka Mainstone)")
 716        /* Maintainer: MontaVista Software Inc. */
 717        .atag_offset    = 0x100,        /* BLOB boot parameter setting */
 718        .map_io         = mainstone_map_io,
 719        .nr_irqs        = MAINSTONE_NR_IRQS,
 720        .init_irq       = mainstone_init_irq,
 721        .handle_irq     = pxa27x_handle_irq,
 722        .init_time      = pxa_timer_init,
 723        .init_machine   = mainstone_init,
 724        .restart        = pxa_restart,
 725MACHINE_END
 726