linux/arch/arm/mach-pxa/mioa701.c
<<
>>
Prefs
   1/*
   2 * Handles the Mitac Mio A701 Board
   3 *
   4 * Copyright (C) 2008 Robert Jarzmik
   5 *
   6 * This program is free software; you can redistribute it and/or modify
   7 * it under the terms of the GNU General Public License as published by
   8 * the Free Software Foundation; either version 2 of the License, or
   9 * (at your option) any later version.
  10 *
  11 * This program is distributed in the hope that it will be useful,
  12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14 * GNU General Public License for more details.
  15 *
  16 * You should have received a copy of the GNU General Public License
  17 * along with this program; if not, write to the Free Software
  18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  19 *
  20 */
  21
  22#include <linux/kernel.h>
  23#include <linux/init.h>
  24#include <linux/platform_device.h>
  25#include <linux/syscore_ops.h>
  26#include <linux/input.h>
  27#include <linux/delay.h>
  28#include <linux/gpio_keys.h>
  29#include <linux/pwm_backlight.h>
  30#include <linux/rtc.h>
  31#include <linux/leds.h>
  32#include <linux/gpio.h>
  33#include <linux/interrupt.h>
  34#include <linux/irq.h>
  35#include <linux/pda_power.h>
  36#include <linux/power_supply.h>
  37#include <linux/wm97xx.h>
  38#include <linux/mtd/physmap.h>
  39#include <linux/usb/gpio_vbus.h>
  40#include <linux/regulator/max1586.h>
  41#include <linux/slab.h>
  42#include <linux/i2c/pxa-i2c.h>
  43
  44#include <asm/mach-types.h>
  45#include <asm/mach/arch.h>
  46
  47#include <mach/pxa27x.h>
  48#include <mach/regs-rtc.h>
  49#include <plat/pxa27x_keypad.h>
  50#include <mach/pxafb.h>
  51#include <mach/mmc.h>
  52#include <mach/udc.h>
  53#include <mach/pxa27x-udc.h>
  54#include <mach/camera.h>
  55#include <mach/audio.h>
  56#include <media/soc_camera.h>
  57
  58#include <mach/mioa701.h>
  59
  60#include "generic.h"
  61#include "devices.h"
  62
  63static unsigned long mioa701_pin_config[] = {
  64        /* Mio global */
  65        MIO_CFG_OUT(GPIO9_CHARGE_EN, AF0, DRIVE_LOW),
  66        MIO_CFG_OUT(GPIO18_POWEROFF, AF0, DRIVE_LOW),
  67        MFP_CFG_OUT(GPIO3, AF0, DRIVE_HIGH),
  68        MFP_CFG_OUT(GPIO4, AF0, DRIVE_HIGH),
  69        MIO_CFG_IN(GPIO80_MAYBE_CHARGE_VDROP, AF0),
  70
  71        /* Backlight PWM 0 */
  72        GPIO16_PWM0_OUT,
  73
  74        /* MMC */
  75        GPIO32_MMC_CLK,
  76        GPIO92_MMC_DAT_0,
  77        GPIO109_MMC_DAT_1,
  78        GPIO110_MMC_DAT_2,
  79        GPIO111_MMC_DAT_3,
  80        GPIO112_MMC_CMD,
  81        MIO_CFG_IN(GPIO78_SDIO_RO, AF0),
  82        MIO_CFG_IN(GPIO15_SDIO_INSERT, AF0),
  83        MIO_CFG_OUT(GPIO91_SDIO_EN, AF0, DRIVE_LOW),
  84
  85        /* USB */
  86        MIO_CFG_IN(GPIO13_nUSB_DETECT, AF0),
  87        MIO_CFG_OUT(GPIO22_USB_ENABLE, AF0, DRIVE_LOW),
  88
  89        /* LCD */
  90        GPIOxx_LCD_TFT_16BPP,
  91
  92        /* QCI */
  93        GPIO12_CIF_DD_7,
  94        GPIO17_CIF_DD_6,
  95        GPIO50_CIF_DD_3,
  96        GPIO51_CIF_DD_2,
  97        GPIO52_CIF_DD_4,
  98        GPIO53_CIF_MCLK,
  99        GPIO54_CIF_PCLK,
 100        GPIO55_CIF_DD_1,
 101        GPIO81_CIF_DD_0,
 102        GPIO82_CIF_DD_5,
 103        GPIO84_CIF_FV,
 104        GPIO85_CIF_LV,
 105
 106        /* Bluetooth */
 107        MIO_CFG_IN(GPIO14_BT_nACTIVITY, AF0),
 108        GPIO44_BTUART_CTS,
 109        GPIO42_BTUART_RXD,
 110        GPIO45_BTUART_RTS,
 111        GPIO43_BTUART_TXD,
 112        MIO_CFG_OUT(GPIO83_BT_ON, AF0, DRIVE_LOW),
 113        MIO_CFG_OUT(GPIO77_BT_UNKNOWN1, AF0, DRIVE_HIGH),
 114        MIO_CFG_OUT(GPIO86_BT_MAYBE_nRESET, AF0, DRIVE_HIGH),
 115
 116        /* GPS */
 117        MIO_CFG_OUT(GPIO23_GPS_UNKNOWN1, AF0, DRIVE_LOW),
 118        MIO_CFG_OUT(GPIO26_GPS_ON, AF0, DRIVE_LOW),
 119        MIO_CFG_OUT(GPIO27_GPS_RESET, AF0, DRIVE_LOW),
 120        MIO_CFG_OUT(GPIO106_GPS_UNKNOWN2, AF0, DRIVE_LOW),
 121        MIO_CFG_OUT(GPIO107_GPS_UNKNOWN3, AF0, DRIVE_LOW),
 122        GPIO46_STUART_RXD,
 123        GPIO47_STUART_TXD,
 124
 125        /* GSM */
 126        MIO_CFG_OUT(GPIO24_GSM_MOD_RESET_CMD, AF0, DRIVE_LOW),
 127        MIO_CFG_OUT(GPIO88_GSM_nMOD_ON_CMD, AF0, DRIVE_HIGH),
 128        MIO_CFG_OUT(GPIO90_GSM_nMOD_OFF_CMD, AF0, DRIVE_HIGH),
 129        MIO_CFG_OUT(GPIO114_GSM_nMOD_DTE_UART_STATE, AF0, DRIVE_HIGH),
 130        MIO_CFG_IN(GPIO25_GSM_MOD_ON_STATE, AF0),
 131        MIO_CFG_IN(GPIO113_GSM_EVENT, AF0) | WAKEUP_ON_EDGE_BOTH,
 132        GPIO34_FFUART_RXD,
 133        GPIO35_FFUART_CTS,
 134        GPIO36_FFUART_DCD,
 135        GPIO37_FFUART_DSR,
 136        GPIO39_FFUART_TXD,
 137        GPIO40_FFUART_DTR,
 138        GPIO41_FFUART_RTS,
 139
 140        /* Sound */
 141        GPIO28_AC97_BITCLK,
 142        GPIO29_AC97_SDATA_IN_0,
 143        GPIO30_AC97_SDATA_OUT,
 144        GPIO31_AC97_SYNC,
 145        GPIO89_AC97_SYSCLK,
 146        MIO_CFG_IN(GPIO12_HPJACK_INSERT, AF0),
 147
 148        /* Leds */
 149        MIO_CFG_OUT(GPIO10_LED_nCharging, AF0, DRIVE_HIGH),
 150        MIO_CFG_OUT(GPIO97_LED_nBlue, AF0, DRIVE_HIGH),
 151        MIO_CFG_OUT(GPIO98_LED_nOrange, AF0, DRIVE_HIGH),
 152        MIO_CFG_OUT(GPIO82_LED_nVibra, AF0, DRIVE_HIGH),
 153        MIO_CFG_OUT(GPIO115_LED_nKeyboard, AF0, DRIVE_HIGH),
 154
 155        /* Keyboard */
 156        MIO_CFG_IN(GPIO0_KEY_POWER, AF0) | WAKEUP_ON_EDGE_BOTH,
 157        MIO_CFG_IN(GPIO93_KEY_VOLUME_UP, AF0),
 158        MIO_CFG_IN(GPIO94_KEY_VOLUME_DOWN, AF0),
 159        GPIO100_KP_MKIN_0,
 160        GPIO101_KP_MKIN_1,
 161        GPIO102_KP_MKIN_2,
 162        GPIO103_KP_MKOUT_0,
 163        GPIO104_KP_MKOUT_1,
 164        GPIO105_KP_MKOUT_2,
 165
 166        /* I2C */
 167        GPIO117_I2C_SCL,
 168        GPIO118_I2C_SDA,
 169
 170        /* Unknown */
 171        MFP_CFG_IN(GPIO20, AF0),
 172        MFP_CFG_IN(GPIO21, AF0),
 173        MFP_CFG_IN(GPIO33, AF0),
 174        MFP_CFG_OUT(GPIO49, AF0, DRIVE_HIGH),
 175        MFP_CFG_OUT(GPIO57, AF0, DRIVE_HIGH),
 176        MFP_CFG_IN(GPIO96, AF0),
 177        MFP_CFG_OUT(GPIO116, AF0, DRIVE_HIGH),
 178};
 179
 180/* LCD Screen and Backlight */
 181static struct platform_pwm_backlight_data mioa701_backlight_data = {
 182        .pwm_id         = 0,
 183        .max_brightness = 100,
 184        .dft_brightness = 50,
 185        .pwm_period_ns  = 4000 * 1024,  /* Fl = 250kHz */
 186};
 187
 188/*
 189 * LTM0305A776C LCD panel timings
 190 *
 191 * see:
 192 *  - the LTM0305A776C datasheet,
 193 *  - and the PXA27x Programmers' manual
 194 */
 195static struct pxafb_mode_info mioa701_ltm0305a776c = {
 196        .pixclock               = 220000,       /* CLK=4.545 MHz */
 197        .xres                   = 240,
 198        .yres                   = 320,
 199        .bpp                    = 16,
 200        .hsync_len              = 4,
 201        .vsync_len              = 2,
 202        .left_margin            = 6,
 203        .right_margin           = 4,
 204        .upper_margin           = 5,
 205        .lower_margin           = 3,
 206};
 207
 208static void mioa701_lcd_power(int on, struct fb_var_screeninfo *si)
 209{
 210        gpio_set_value(GPIO87_LCD_POWER, on);
 211}
 212
 213static struct pxafb_mach_info mioa701_pxafb_info = {
 214        .modes                  = &mioa701_ltm0305a776c,
 215        .num_modes              = 1,
 216        .lcd_conn               = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL,
 217        .pxafb_lcd_power        = mioa701_lcd_power,
 218};
 219
 220/*
 221 * Keyboard configuration
 222 */
 223static unsigned int mioa701_matrix_keys[] = {
 224        KEY(0, 0, KEY_UP),
 225        KEY(0, 1, KEY_RIGHT),
 226        KEY(0, 2, KEY_MEDIA),
 227        KEY(1, 0, KEY_DOWN),
 228        KEY(1, 1, KEY_ENTER),
 229        KEY(1, 2, KEY_CONNECT), /* GPS key */
 230        KEY(2, 0, KEY_LEFT),
 231        KEY(2, 1, KEY_PHONE),   /* Phone Green key */
 232        KEY(2, 2, KEY_CAMERA)   /* Camera key */
 233};
 234static struct pxa27x_keypad_platform_data mioa701_keypad_info = {
 235        .matrix_key_rows = 3,
 236        .matrix_key_cols = 3,
 237        .matrix_key_map = mioa701_matrix_keys,
 238        .matrix_key_map_size = ARRAY_SIZE(mioa701_matrix_keys),
 239};
 240
 241/*
 242 * GPIO Key Configuration
 243 */
 244#define MIO_KEY(key, _gpio, _desc, _wakeup) \
 245        { .code = (key), .gpio = (_gpio), .active_low = 0, \
 246        .desc = (_desc), .type = EV_KEY, .wakeup = (_wakeup) }
 247static struct gpio_keys_button mioa701_button_table[] = {
 248        MIO_KEY(KEY_EXIT, GPIO0_KEY_POWER, "Power button", 1),
 249        MIO_KEY(KEY_VOLUMEUP, GPIO93_KEY_VOLUME_UP, "Volume up", 0),
 250        MIO_KEY(KEY_VOLUMEDOWN, GPIO94_KEY_VOLUME_DOWN, "Volume down", 0),
 251        MIO_KEY(KEY_HP, GPIO12_HPJACK_INSERT, "HP jack detect", 0)
 252};
 253
 254static struct gpio_keys_platform_data mioa701_gpio_keys_data = {
 255        .buttons  = mioa701_button_table,
 256        .nbuttons = ARRAY_SIZE(mioa701_button_table),
 257};
 258
 259/*
 260 * Leds and vibrator
 261 */
 262#define ONE_LED(_gpio, _name) \
 263{ .gpio = (_gpio), .name = (_name), .active_low = true }
 264static struct gpio_led gpio_leds[] = {
 265        ONE_LED(GPIO10_LED_nCharging, "mioa701:charging"),
 266        ONE_LED(GPIO97_LED_nBlue, "mioa701:blue"),
 267        ONE_LED(GPIO98_LED_nOrange, "mioa701:orange"),
 268        ONE_LED(GPIO82_LED_nVibra, "mioa701:vibra"),
 269        ONE_LED(GPIO115_LED_nKeyboard, "mioa701:keyboard")
 270};
 271
 272static struct gpio_led_platform_data gpio_led_info = {
 273        .leds = gpio_leds,
 274        .num_leds = ARRAY_SIZE(gpio_leds),
 275};
 276
 277/*
 278 * GSM Sagem XS200 chip
 279 *
 280 * GSM handling was purged from kernel. For history, this is the way to go :
 281 *   - init : GPIO24_GSM_MOD_RESET_CMD = 0, GPIO114_GSM_nMOD_DTE_UART_STATE = 1
 282 *            GPIO88_GSM_nMOD_ON_CMD = 1, GPIO90_GSM_nMOD_OFF_CMD = 1
 283 *   - reset : GPIO24_GSM_MOD_RESET_CMD = 1, msleep(100),
 284 *             GPIO24_GSM_MOD_RESET_CMD = 0
 285 *   - turn on  : GPIO88_GSM_nMOD_ON_CMD = 0, msleep(1000),
 286 *                GPIO88_GSM_nMOD_ON_CMD = 1
 287 *   - turn off : GPIO90_GSM_nMOD_OFF_CMD = 0, msleep(1000),
 288 *                GPIO90_GSM_nMOD_OFF_CMD = 1
 289 */
 290static int is_gsm_on(void)
 291{
 292        int is_on;
 293
 294        is_on = !!gpio_get_value(GPIO25_GSM_MOD_ON_STATE);
 295        return is_on;
 296}
 297
 298irqreturn_t gsm_on_irq(int irq, void *p)
 299{
 300        printk(KERN_DEBUG "Mioa701: GSM status changed to %s\n",
 301               is_gsm_on() ? "on" : "off");
 302        return IRQ_HANDLED;
 303}
 304
 305static struct gpio gsm_gpios[] = {
 306        { GPIO25_GSM_MOD_ON_STATE, GPIOF_IN, "GSM state" },
 307        { GPIO113_GSM_EVENT, GPIOF_IN, "GSM event" },
 308};
 309
 310static int __init gsm_init(void)
 311{
 312        int rc;
 313
 314        rc = gpio_request_array(ARRAY_AND_SIZE(gsm_gpios));
 315        if (rc)
 316                goto err_gpio;
 317        rc = request_irq(gpio_to_irq(GPIO25_GSM_MOD_ON_STATE), gsm_on_irq,
 318                         IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
 319                         "GSM XS200 Power Irq", NULL);
 320        if (rc)
 321                goto err_irq;
 322
 323        gpio_set_wake(GPIO113_GSM_EVENT, 1);
 324        return 0;
 325
 326err_irq:
 327        printk(KERN_ERR "Mioa701: Can't request GSM_ON irq\n");
 328        gpio_free_array(ARRAY_AND_SIZE(gsm_gpios));
 329err_gpio:
 330        printk(KERN_ERR "Mioa701: gsm not available\n");
 331        return rc;
 332}
 333
 334static void gsm_exit(void)
 335{
 336        free_irq(gpio_to_irq(GPIO25_GSM_MOD_ON_STATE), NULL);
 337        gpio_free_array(ARRAY_AND_SIZE(gsm_gpios));
 338}
 339
 340/*
 341 * Bluetooth BRF6150 chip
 342 *
 343 * BT handling was purged from kernel. For history, this is the way to go :
 344 * - turn on  : GPIO83_BT_ON = 1
 345 * - turn off : GPIO83_BT_ON = 0
 346 */
 347
 348/*
 349 * GPS Sirf Star III chip
 350 *
 351 * GPS handling was purged from kernel. For history, this is the way to go :
 352 * - init : GPIO23_GPS_UNKNOWN1 = 1, GPIO26_GPS_ON = 0, GPIO27_GPS_RESET = 0
 353 *          GPIO106_GPS_UNKNOWN2 = 0, GPIO107_GPS_UNKNOWN3 = 0
 354 * - turn on  : GPIO27_GPS_RESET = 1, GPIO26_GPS_ON = 1
 355 * - turn off : GPIO26_GPS_ON = 0, GPIO27_GPS_RESET = 0
 356 */
 357
 358/*
 359 * USB UDC
 360 */
 361static int is_usb_connected(void)
 362{
 363        return !gpio_get_value(GPIO13_nUSB_DETECT);
 364}
 365
 366static struct pxa2xx_udc_mach_info mioa701_udc_info = {
 367        .udc_is_connected = is_usb_connected,
 368        .gpio_pullup      = GPIO22_USB_ENABLE,
 369};
 370
 371struct gpio_vbus_mach_info gpio_vbus_data = {
 372        .gpio_vbus = GPIO13_nUSB_DETECT,
 373        .gpio_vbus_inverted = 1,
 374        .gpio_pullup = -1,
 375};
 376
 377/*
 378 * SDIO/MMC Card controller
 379 */
 380/**
 381 * The card detect interrupt isn't debounced so we delay it by 250ms
 382 * to give the card a chance to fully insert/eject.
 383 */
 384static struct pxamci_platform_data mioa701_mci_info = {
 385        .detect_delay_ms        = 250,
 386        .ocr_mask               = MMC_VDD_32_33 | MMC_VDD_33_34,
 387        .gpio_card_detect       = GPIO15_SDIO_INSERT,
 388        .gpio_card_ro           = GPIO78_SDIO_RO,
 389        .gpio_power             = GPIO91_SDIO_EN,
 390};
 391
 392/* FlashRAM */
 393static struct resource strataflash_resource = {
 394        .start = PXA_CS0_PHYS,
 395        .end   = PXA_CS0_PHYS + SZ_64M - 1,
 396        .flags = IORESOURCE_MEM,
 397};
 398
 399static struct physmap_flash_data strataflash_data = {
 400        .width = 2,
 401        /* .set_vpp = mioa701_set_vpp, */
 402};
 403
 404static struct platform_device strataflash = {
 405        .name          = "physmap-flash",
 406        .id            = -1,
 407        .resource      = &strataflash_resource,
 408        .num_resources = 1,
 409        .dev = {
 410                .platform_data = &strataflash_data,
 411        },
 412};
 413
 414/*
 415 * Suspend/Resume bootstrap management
 416 *
 417 * MIO A701 reboot sequence is highly ROM dependent. From the one dissassembled,
 418 * this sequence is as follows :
 419 *   - disables interrupts
 420 *   - initialize SDRAM (self refresh RAM into active RAM)
 421 *   - initialize GPIOs (depends on value at 0xa020b020)
 422 *   - initialize coprossessors
 423 *   - if edge detect on PWR_SCL(GPIO3), then proceed to cold start
 424 *   - or if value at 0xa020b000 not equal to 0x0f0f0f0f, proceed to cold start
 425 *   - else do a resume, ie. jump to addr 0xa0100000
 426 */
 427#define RESUME_ENABLE_ADDR      0xa020b000
 428#define RESUME_ENABLE_VAL       0x0f0f0f0f
 429#define RESUME_BT_ADDR          0xa020b020
 430#define RESUME_UNKNOWN_ADDR     0xa020b024
 431#define RESUME_VECTOR_ADDR      0xa0100000
 432#define BOOTSTRAP_WORDS         mioa701_bootstrap_lg/4
 433
 434static u32 *save_buffer;
 435
 436static void install_bootstrap(void)
 437{
 438        int i;
 439        u32 *rom_bootstrap  = phys_to_virt(RESUME_VECTOR_ADDR);
 440        u32 *src = &mioa701_bootstrap;
 441
 442        for (i = 0; i < BOOTSTRAP_WORDS; i++)
 443                rom_bootstrap[i] = src[i];
 444}
 445
 446
 447static int mioa701_sys_suspend(void)
 448{
 449        int i = 0, is_bt_on;
 450        u32 *mem_resume_vector  = phys_to_virt(RESUME_VECTOR_ADDR);
 451        u32 *mem_resume_enabler = phys_to_virt(RESUME_ENABLE_ADDR);
 452        u32 *mem_resume_bt      = phys_to_virt(RESUME_BT_ADDR);
 453        u32 *mem_resume_unknown = phys_to_virt(RESUME_UNKNOWN_ADDR);
 454
 455        /* Devices prepare suspend */
 456        is_bt_on = !!gpio_get_value(GPIO83_BT_ON);
 457        pxa2xx_mfp_set_lpm(GPIO83_BT_ON,
 458                           is_bt_on ? MFP_LPM_DRIVE_HIGH : MFP_LPM_DRIVE_LOW);
 459
 460        for (i = 0; i < BOOTSTRAP_WORDS; i++)
 461                save_buffer[i] = mem_resume_vector[i];
 462        save_buffer[i++] = *mem_resume_enabler;
 463        save_buffer[i++] = *mem_resume_bt;
 464        save_buffer[i++] = *mem_resume_unknown;
 465
 466        *mem_resume_enabler = RESUME_ENABLE_VAL;
 467        *mem_resume_bt      = is_bt_on;
 468
 469        install_bootstrap();
 470        return 0;
 471}
 472
 473static void mioa701_sys_resume(void)
 474{
 475        int i = 0;
 476        u32 *mem_resume_vector  = phys_to_virt(RESUME_VECTOR_ADDR);
 477        u32 *mem_resume_enabler = phys_to_virt(RESUME_ENABLE_ADDR);
 478        u32 *mem_resume_bt      = phys_to_virt(RESUME_BT_ADDR);
 479        u32 *mem_resume_unknown = phys_to_virt(RESUME_UNKNOWN_ADDR);
 480
 481        for (i = 0; i < BOOTSTRAP_WORDS; i++)
 482                mem_resume_vector[i] = save_buffer[i];
 483        *mem_resume_enabler = save_buffer[i++];
 484        *mem_resume_bt      = save_buffer[i++];
 485        *mem_resume_unknown = save_buffer[i++];
 486}
 487
 488static struct syscore_ops mioa701_syscore_ops = {
 489        .suspend        = mioa701_sys_suspend,
 490        .resume         = mioa701_sys_resume,
 491};
 492
 493static int __init bootstrap_init(void)
 494{
 495        int save_size = mioa701_bootstrap_lg + (sizeof(u32) * 3);
 496
 497        register_syscore_ops(&mioa701_syscore_ops);
 498
 499        save_buffer = kmalloc(save_size, GFP_KERNEL);
 500        if (!save_buffer)
 501                return -ENOMEM;
 502        printk(KERN_INFO "MioA701: allocated %d bytes for bootstrap\n",
 503               save_size);
 504        return 0;
 505}
 506
 507static void bootstrap_exit(void)
 508{
 509        kfree(save_buffer);
 510        unregister_syscore_ops(&mioa701_syscore_ops);
 511
 512        printk(KERN_CRIT "Unregistering mioa701 suspend will hang next"
 513               "resume !!!\n");
 514}
 515
 516/*
 517 * Power Supply
 518 */
 519static char *supplicants[] = {
 520        "mioa701_battery"
 521};
 522
 523static int is_ac_connected(void)
 524{
 525        return gpio_get_value(GPIO96_AC_DETECT);
 526}
 527
 528static void mioa701_set_charge(int flags)
 529{
 530        gpio_set_value(GPIO9_CHARGE_EN, (flags == PDA_POWER_CHARGE_USB));
 531}
 532
 533static struct pda_power_pdata power_pdata = {
 534        .is_ac_online   = is_ac_connected,
 535        .is_usb_online  = is_usb_connected,
 536        .set_charge = mioa701_set_charge,
 537        .supplied_to = supplicants,
 538        .num_supplicants = ARRAY_SIZE(supplicants),
 539};
 540
 541static struct resource power_resources[] = {
 542        [0] = {
 543                .name   = "ac",
 544                .start  = gpio_to_irq(GPIO96_AC_DETECT),
 545                .end    = gpio_to_irq(GPIO96_AC_DETECT),
 546                .flags  = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE |
 547                IORESOURCE_IRQ_LOWEDGE,
 548        },
 549        [1] = {
 550                .name   = "usb",
 551                .start  = gpio_to_irq(GPIO13_nUSB_DETECT),
 552                .end    = gpio_to_irq(GPIO13_nUSB_DETECT),
 553                .flags  = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE |
 554                IORESOURCE_IRQ_LOWEDGE,
 555        },
 556};
 557
 558static struct platform_device power_dev = {
 559        .name           = "pda-power",
 560        .id             = -1,
 561        .resource       = power_resources,
 562        .num_resources  = ARRAY_SIZE(power_resources),
 563        .dev = {
 564                .platform_data  = &power_pdata,
 565        },
 566};
 567
 568static struct wm97xx_batt_pdata mioa701_battery_data = {
 569        .batt_aux       = WM97XX_AUX_ID1,
 570        .temp_aux       = -1,
 571        .charge_gpio    = -1,
 572        .min_voltage    = 0xc00,
 573        .max_voltage    = 0xfc0,
 574        .batt_tech      = POWER_SUPPLY_TECHNOLOGY_LION,
 575        .batt_div       = 1,
 576        .batt_mult      = 1,
 577        .batt_name      = "mioa701_battery",
 578};
 579
 580static struct wm97xx_pdata mioa701_wm97xx_pdata = {
 581        .batt_pdata     = &mioa701_battery_data,
 582};
 583
 584/*
 585 * Voltage regulation
 586 */
 587static struct regulator_consumer_supply max1586_consumers[] = {
 588        {
 589                .supply = "vcc_core",
 590        }
 591};
 592
 593static struct regulator_init_data max1586_v3_info = {
 594        .constraints = {
 595                .name = "vcc_core range",
 596                .min_uV = 1000000,
 597                .max_uV = 1705000,
 598                .always_on = 1,
 599                .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
 600        },
 601        .num_consumer_supplies = ARRAY_SIZE(max1586_consumers),
 602        .consumer_supplies = max1586_consumers,
 603};
 604
 605static struct max1586_subdev_data max1586_subdevs[] = {
 606        { .name = "vcc_core", .id = MAX1586_V3,
 607          .platform_data = &max1586_v3_info },
 608};
 609
 610static struct max1586_platform_data max1586_info = {
 611        .subdevs = max1586_subdevs,
 612        .num_subdevs = ARRAY_SIZE(max1586_subdevs),
 613        .v3_gain = MAX1586_GAIN_NO_R24, /* 700..1475 mV */
 614};
 615
 616/*
 617 * Camera interface
 618 */
 619struct pxacamera_platform_data mioa701_pxacamera_platform_data = {
 620        .flags  = PXA_CAMERA_MASTER | PXA_CAMERA_DATAWIDTH_8 |
 621                PXA_CAMERA_PCLK_EN | PXA_CAMERA_MCLK_EN,
 622        .mclk_10khz = 5000,
 623};
 624
 625static struct i2c_board_info __initdata mioa701_pi2c_devices[] = {
 626        {
 627                I2C_BOARD_INFO("max1586", 0x14),
 628                .platform_data = &max1586_info,
 629        },
 630};
 631
 632/* Board I2C devices. */
 633static struct i2c_board_info mioa701_i2c_devices[] = {
 634        {
 635                I2C_BOARD_INFO("mt9m111", 0x5d),
 636        },
 637};
 638
 639static struct soc_camera_link iclink = {
 640        .bus_id         = 0, /* Match id in pxa27x_device_camera in device.c */
 641        .board_info     = &mioa701_i2c_devices[0],
 642        .i2c_adapter_id = 0,
 643};
 644
 645struct i2c_pxa_platform_data i2c_pdata = {
 646        .fast_mode = 1,
 647};
 648
 649static pxa2xx_audio_ops_t mioa701_ac97_info = {
 650        .reset_gpio = 95,
 651        .codec_pdata = { &mioa701_wm97xx_pdata, },
 652};
 653
 654/*
 655 * Mio global
 656 */
 657
 658/* Devices */
 659#define MIO_PARENT_DEV(var, strname, tparent, pdata)    \
 660static struct platform_device var = {                   \
 661        .name           = strname,                      \
 662        .id             = -1,                           \
 663        .dev            = {                             \
 664                .platform_data = pdata,                 \
 665                .parent = tparent,                      \
 666        },                                              \
 667};
 668#define MIO_SIMPLE_DEV(var, strname, pdata)     \
 669        MIO_PARENT_DEV(var, strname, NULL, pdata)
 670
 671MIO_SIMPLE_DEV(mioa701_gpio_keys, "gpio-keys",      &mioa701_gpio_keys_data)
 672MIO_PARENT_DEV(mioa701_backlight, "pwm-backlight",  &pxa27x_device_pwm0.dev,
 673                &mioa701_backlight_data);
 674MIO_SIMPLE_DEV(mioa701_led,       "leds-gpio",      &gpio_led_info)
 675MIO_SIMPLE_DEV(pxa2xx_pcm,        "pxa2xx-pcm",     NULL)
 676MIO_SIMPLE_DEV(mioa701_sound,     "mioa701-wm9713", NULL)
 677MIO_SIMPLE_DEV(mioa701_board,     "mioa701-board",  NULL)
 678MIO_SIMPLE_DEV(gpio_vbus,         "gpio-vbus",      &gpio_vbus_data);
 679MIO_SIMPLE_DEV(mioa701_camera,    "soc-camera-pdrv",&iclink);
 680
 681static struct platform_device *devices[] __initdata = {
 682        &mioa701_gpio_keys,
 683        &mioa701_backlight,
 684        &mioa701_led,
 685        &pxa2xx_pcm,
 686        &mioa701_sound,
 687        &power_dev,
 688        &strataflash,
 689        &gpio_vbus,
 690        &mioa701_camera,
 691        &mioa701_board,
 692};
 693
 694static void mioa701_machine_exit(void);
 695
 696static void mioa701_poweroff(void)
 697{
 698        mioa701_machine_exit();
 699        arm_machine_restart('s', NULL);
 700}
 701
 702static void mioa701_restart(char c, const char *cmd)
 703{
 704        mioa701_machine_exit();
 705        arm_machine_restart('s', cmd);
 706}
 707
 708static struct gpio global_gpios[] = {
 709        { GPIO9_CHARGE_EN, GPIOF_OUT_INIT_HIGH, "Charger enable" },
 710        { GPIO18_POWEROFF, GPIOF_OUT_INIT_LOW, "Power Off" },
 711        { GPIO87_LCD_POWER, GPIOF_OUT_INIT_LOW, "LCD Power" },
 712};
 713
 714static void __init mioa701_machine_init(void)
 715{
 716        int rc;
 717
 718        PSLR  = 0xff100000; /* SYSDEL=125ms, PWRDEL=125ms, PSLR_SL_ROD=1 */
 719        PCFR = PCFR_DC_EN | PCFR_GPR_EN | PCFR_OPDE;
 720        RTTR = 32768 - 1; /* Reset crazy WinCE value */
 721        UP2OCR = UP2OCR_HXOE;
 722
 723        pxa2xx_mfp_config(ARRAY_AND_SIZE(mioa701_pin_config));
 724        pxa_set_ffuart_info(NULL);
 725        pxa_set_btuart_info(NULL);
 726        pxa_set_stuart_info(NULL);
 727        rc = gpio_request_array(ARRAY_AND_SIZE(global_gpios));
 728        if (rc)
 729                pr_err("MioA701: Failed to request GPIOs: %d", rc);
 730        bootstrap_init();
 731        pxa_set_fb_info(NULL, &mioa701_pxafb_info);
 732        pxa_set_mci_info(&mioa701_mci_info);
 733        pxa_set_keypad_info(&mioa701_keypad_info);
 734        pxa_set_udc_info(&mioa701_udc_info);
 735        pxa_set_ac97_info(&mioa701_ac97_info);
 736        pm_power_off = mioa701_poweroff;
 737        arm_pm_restart = mioa701_restart;
 738        platform_add_devices(devices, ARRAY_SIZE(devices));
 739        gsm_init();
 740
 741        i2c_register_board_info(1, ARRAY_AND_SIZE(mioa701_pi2c_devices));
 742        pxa_set_i2c_info(&i2c_pdata);
 743        pxa27x_set_i2c_power_info(NULL);
 744        pxa_set_camera_info(&mioa701_pxacamera_platform_data);
 745}
 746
 747static void mioa701_machine_exit(void)
 748{
 749        bootstrap_exit();
 750        gsm_exit();
 751}
 752
 753MACHINE_START(MIOA701, "MIO A701")
 754        .atag_offset    = 0x100,
 755        .map_io         = &pxa27x_map_io,
 756        .init_irq       = &pxa27x_init_irq,
 757        .handle_irq     = &pxa27x_handle_irq,
 758        .init_machine   = mioa701_machine_init,
 759        .timer          = &pxa_timer,
 760MACHINE_END
 761
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.