linux/arch/arm/mach-pxa/palmtc.c
<<
>>
Prefs
   1/*
   2 * linux/arch/arm/mach-pxa/palmtc.c
   3 *
   4 * Support for the Palm Tungsten|C
   5 *
   6 * Author:      Marek Vasut <marek.vasut@gmail.com>
   7 *
   8 * Based on work of:
   9 *              Petr Blaha <p3t3@centrum.cz>
  10 *              Chetan S. Kumar <shivakumar.chetan@gmail.com>
  11 *
  12 * This program is free software; you can redistribute it and/or modify
  13 * it under the terms of the GNU General Public License version 2 as
  14 * published by the Free Software Foundation.
  15 */
  16
  17#include <linux/platform_device.h>
  18#include <linux/delay.h>
  19#include <linux/irq.h>
  20#include <linux/input.h>
  21#include <linux/pwm_backlight.h>
  22#include <linux/gpio.h>
  23#include <linux/input/matrix_keypad.h>
  24#include <linux/ucb1400.h>
  25#include <linux/power_supply.h>
  26#include <linux/gpio_keys.h>
  27#include <linux/mtd/physmap.h>
  28
  29#include <asm/mach-types.h>
  30#include <asm/mach/arch.h>
  31#include <asm/mach/map.h>
  32
  33#include <mach/audio.h>
  34#include <mach/palmtc.h>
  35#include <mach/mmc.h>
  36#include <mach/pxafb.h>
  37#include <mach/mfp-pxa25x.h>
  38#include <mach/irda.h>
  39#include <mach/udc.h>
  40#include <mach/pxa2xx-regs.h>
  41
  42#include "generic.h"
  43#include "devices.h"
  44
  45/******************************************************************************
  46 * Pin configuration
  47 ******************************************************************************/
  48static unsigned long palmtc_pin_config[] __initdata = {
  49        /* MMC */
  50        GPIO6_MMC_CLK,
  51        GPIO8_MMC_CS0,
  52        GPIO12_GPIO,    /* detect */
  53        GPIO32_GPIO,    /* power */
  54        GPIO54_GPIO,    /* r/o switch */
  55
  56        /* PCMCIA */
  57        GPIO52_nPCE_1,
  58        GPIO53_nPCE_2,
  59        GPIO50_nPIOR,
  60        GPIO51_nPIOW,
  61        GPIO49_nPWE,
  62        GPIO48_nPOE,
  63        GPIO52_nPCE_1,
  64        GPIO53_nPCE_2,
  65        GPIO57_nIOIS16,
  66        GPIO56_nPWAIT,
  67
  68        /* AC97 */
  69        GPIO28_AC97_BITCLK,
  70        GPIO29_AC97_SDATA_IN_0,
  71        GPIO30_AC97_SDATA_OUT,
  72        GPIO31_AC97_SYNC,
  73
  74        /* IrDA */
  75        GPIO45_GPIO,    /* ir disable */
  76        GPIO46_FICP_RXD,
  77        GPIO47_FICP_TXD,
  78
  79        /* PWM */
  80        GPIO17_PWM1_OUT,
  81
  82        /* USB */
  83        GPIO4_GPIO,     /* detect */
  84        GPIO36_GPIO,    /* pullup */
  85
  86        /* LCD */
  87        GPIO58_LCD_LDD_0,
  88        GPIO59_LCD_LDD_1,
  89        GPIO60_LCD_LDD_2,
  90        GPIO61_LCD_LDD_3,
  91        GPIO62_LCD_LDD_4,
  92        GPIO63_LCD_LDD_5,
  93        GPIO64_LCD_LDD_6,
  94        GPIO65_LCD_LDD_7,
  95        GPIO66_LCD_LDD_8,
  96        GPIO67_LCD_LDD_9,
  97        GPIO68_LCD_LDD_10,
  98        GPIO69_LCD_LDD_11,
  99        GPIO70_LCD_LDD_12,
 100        GPIO71_LCD_LDD_13,
 101        GPIO72_LCD_LDD_14,
 102        GPIO73_LCD_LDD_15,
 103        GPIO74_LCD_FCLK,
 104        GPIO75_LCD_LCLK,
 105        GPIO76_LCD_PCLK,
 106        GPIO77_LCD_BIAS,
 107
 108        /* MATRIX KEYPAD */
 109        GPIO0_GPIO | WAKEUP_ON_EDGE_BOTH,       /* in 0 */
 110        GPIO9_GPIO | WAKEUP_ON_EDGE_BOTH,       /* in 1 */
 111        GPIO10_GPIO | WAKEUP_ON_EDGE_BOTH,      /* in 2 */
 112        GPIO11_GPIO | WAKEUP_ON_EDGE_BOTH,      /* in 3 */
 113        GPIO18_GPIO | MFP_LPM_DRIVE_LOW,        /* out 0 */
 114        GPIO19_GPIO | MFP_LPM_DRIVE_LOW,        /* out 1 */
 115        GPIO20_GPIO | MFP_LPM_DRIVE_LOW,        /* out 2 */
 116        GPIO21_GPIO | MFP_LPM_DRIVE_LOW,        /* out 3 */
 117        GPIO22_GPIO | MFP_LPM_DRIVE_LOW,        /* out 4 */
 118        GPIO23_GPIO | MFP_LPM_DRIVE_LOW,        /* out 5 */
 119        GPIO24_GPIO | MFP_LPM_DRIVE_LOW,        /* out 6 */
 120        GPIO25_GPIO | MFP_LPM_DRIVE_LOW,        /* out 7 */
 121        GPIO26_GPIO | MFP_LPM_DRIVE_LOW,        /* out 8 */
 122        GPIO27_GPIO | MFP_LPM_DRIVE_LOW,        /* out 9 */
 123        GPIO79_GPIO | MFP_LPM_DRIVE_LOW,        /* out 10 */
 124        GPIO80_GPIO | MFP_LPM_DRIVE_LOW,        /* out 11 */
 125
 126        /* PXA GPIO KEYS */
 127        GPIO7_GPIO | WAKEUP_ON_EDGE_BOTH,       /* hotsync button on cradle */
 128
 129        /* MISC */
 130        GPIO1_RST,      /* reset */
 131        GPIO2_GPIO,     /* earphone detect */
 132        GPIO16_GPIO,    /* backlight switch */
 133};
 134
 135/******************************************************************************
 136 * SD/MMC card controller
 137 ******************************************************************************/
 138static struct pxamci_platform_data palmtc_mci_platform_data = {
 139        .ocr_mask               = MMC_VDD_32_33 | MMC_VDD_33_34,
 140        .gpio_power             = GPIO_NR_PALMTC_SD_POWER,
 141        .gpio_card_ro           = GPIO_NR_PALMTC_SD_READONLY,
 142        .gpio_card_detect       = GPIO_NR_PALMTC_SD_DETECT_N,
 143        .detect_delay           = 20,
 144};
 145
 146/******************************************************************************
 147 * GPIO keys
 148 ******************************************************************************/
 149static struct gpio_keys_button palmtc_pxa_buttons[] = {
 150        {KEY_F8, GPIO_NR_PALMTC_HOTSYNC_BUTTON, 1, "HotSync Button", EV_KEY, 1},
 151};
 152
 153static struct gpio_keys_platform_data palmtc_pxa_keys_data = {
 154        .buttons        = palmtc_pxa_buttons,
 155        .nbuttons       = ARRAY_SIZE(palmtc_pxa_buttons),
 156};
 157
 158static struct platform_device palmtc_pxa_keys = {
 159        .name   = "gpio-keys",
 160        .id     = -1,
 161        .dev    = {
 162                .platform_data = &palmtc_pxa_keys_data,
 163        },
 164};
 165
 166/******************************************************************************
 167 * Backlight
 168 ******************************************************************************/
 169static int palmtc_backlight_init(struct device *dev)
 170{
 171        int ret;
 172
 173        ret = gpio_request(GPIO_NR_PALMTC_BL_POWER, "BL POWER");
 174        if (ret)
 175                goto err;
 176        ret = gpio_direction_output(GPIO_NR_PALMTC_BL_POWER, 1);
 177        if (ret)
 178                goto err2;
 179
 180        return 0;
 181
 182err2:
 183        gpio_free(GPIO_NR_PALMTC_BL_POWER);
 184err:
 185        return ret;
 186}
 187
 188static int palmtc_backlight_notify(int brightness)
 189{
 190        /* backlight is on when GPIO16 AF0 is high */
 191        gpio_set_value(GPIO_NR_PALMTC_BL_POWER, brightness);
 192        return brightness;
 193}
 194
 195static void palmtc_backlight_exit(struct device *dev)
 196{
 197        gpio_free(GPIO_NR_PALMTC_BL_POWER);
 198}
 199
 200static struct platform_pwm_backlight_data palmtc_backlight_data = {
 201        .pwm_id         = 1,
 202        .max_brightness = PALMTC_MAX_INTENSITY,
 203        .dft_brightness = PALMTC_MAX_INTENSITY,
 204        .pwm_period_ns  = PALMTC_PERIOD_NS,
 205        .init           = palmtc_backlight_init,
 206        .notify         = palmtc_backlight_notify,
 207        .exit           = palmtc_backlight_exit,
 208};
 209
 210static struct platform_device palmtc_backlight = {
 211        .name   = "pwm-backlight",
 212        .dev    = {
 213                .parent         = &pxa25x_device_pwm1.dev,
 214                .platform_data  = &palmtc_backlight_data,
 215        },
 216};
 217
 218/******************************************************************************
 219 * IrDA
 220 ******************************************************************************/
 221static struct pxaficp_platform_data palmtc_ficp_platform_data = {
 222        .gpio_pwdown            = GPIO_NR_PALMTC_IR_DISABLE,
 223        .transceiver_cap        = IR_SIRMODE | IR_OFF,
 224};
 225
 226/******************************************************************************
 227 * Keyboard
 228 ******************************************************************************/
 229static const uint32_t palmtc_matrix_keys[] = {
 230        KEY(0, 0, KEY_F1),
 231        KEY(0, 1, KEY_X),
 232        KEY(0, 2, KEY_POWER),
 233        KEY(0, 3, KEY_TAB),
 234        KEY(0, 4, KEY_A),
 235        KEY(0, 5, KEY_Q),
 236        KEY(0, 6, KEY_LEFTSHIFT),
 237        KEY(0, 7, KEY_Z),
 238        KEY(0, 8, KEY_S),
 239        KEY(0, 9, KEY_W),
 240        KEY(0, 10, KEY_E),
 241        KEY(0, 11, KEY_UP),
 242
 243        KEY(1, 0, KEY_F2),
 244        KEY(1, 1, KEY_DOWN),
 245        KEY(1, 3, KEY_D),
 246        KEY(1, 4, KEY_C),
 247        KEY(1, 5, KEY_F),
 248        KEY(1, 6, KEY_R),
 249        KEY(1, 7, KEY_SPACE),
 250        KEY(1, 8, KEY_V),
 251        KEY(1, 9, KEY_G),
 252        KEY(1, 10, KEY_T),
 253        KEY(1, 11, KEY_LEFT),
 254
 255        KEY(2, 0, KEY_F3),
 256        KEY(2, 1, KEY_LEFTCTRL),
 257        KEY(2, 3, KEY_H),
 258        KEY(2, 4, KEY_Y),
 259        KEY(2, 5, KEY_N),
 260        KEY(2, 6, KEY_J),
 261        KEY(2, 7, KEY_U),
 262        KEY(2, 8, KEY_M),
 263        KEY(2, 9, KEY_K),
 264        KEY(2, 10, KEY_I),
 265        KEY(2, 11, KEY_RIGHT),
 266
 267        KEY(3, 0, KEY_F4),
 268        KEY(3, 1, KEY_ENTER),
 269        KEY(3, 3, KEY_DOT),
 270        KEY(3, 4, KEY_L),
 271        KEY(3, 5, KEY_O),
 272        KEY(3, 6, KEY_LEFTALT),
 273        KEY(3, 7, KEY_ENTER),
 274        KEY(3, 8, KEY_BACKSPACE),
 275        KEY(3, 9, KEY_P),
 276        KEY(3, 10, KEY_B),
 277        KEY(3, 11, KEY_FN),
 278};
 279
 280const struct matrix_keymap_data palmtc_keymap_data = {
 281        .keymap                 = palmtc_matrix_keys,
 282        .keymap_size            = ARRAY_SIZE(palmtc_matrix_keys),
 283};
 284
 285const static unsigned int palmtc_keypad_row_gpios[] = {
 286        0, 9, 10, 11
 287};
 288
 289const static unsigned int palmtc_keypad_col_gpios[] = {
 290        18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 79, 80
 291};
 292
 293static struct matrix_keypad_platform_data palmtc_keypad_platform_data = {
 294        .keymap_data    = &palmtc_keymap_data,
 295        .row_gpios      = palmtc_keypad_row_gpios,
 296        .num_row_gpios  = ARRAY_SIZE(palmtc_keypad_row_gpios),
 297        .col_gpios      = palmtc_keypad_col_gpios,
 298        .num_col_gpios  = ARRAY_SIZE(palmtc_keypad_col_gpios),
 299        .active_low     = 1,
 300
 301        .debounce_ms            = 20,
 302        .col_scan_delay_us      = 5,
 303};
 304
 305static struct platform_device palmtc_keyboard = {
 306        .name   = "matrix-keypad",
 307        .id     = -1,
 308        .dev    = {
 309                .platform_data = &palmtc_keypad_platform_data,
 310        },
 311};
 312
 313/******************************************************************************
 314 * UDC
 315 ******************************************************************************/
 316static struct pxa2xx_udc_mach_info palmtc_udc_info __initdata = {
 317        .gpio_vbus              = GPIO_NR_PALMTC_USB_DETECT_N,
 318        .gpio_vbus_inverted     = 1,
 319        .gpio_pullup            = GPIO_NR_PALMTC_USB_POWER,
 320};
 321
 322/******************************************************************************
 323 * Touchscreen / Battery / GPIO-extender
 324 ******************************************************************************/
 325static struct platform_device palmtc_ucb1400_core = {
 326        .name   = "ucb1400_core",
 327        .id     = -1,
 328};
 329
 330/******************************************************************************
 331 * NOR Flash
 332 ******************************************************************************/
 333static struct resource palmtc_flash_resource = {
 334        .start  = PXA_CS0_PHYS,
 335        .end    = PXA_CS0_PHYS + SZ_16M - 1,
 336        .flags  = IORESOURCE_MEM,
 337};
 338
 339static struct mtd_partition palmtc_flash_parts[] = {
 340        {
 341                .name   = "U-Boot Bootloader",
 342                .offset = 0x0,
 343                .size   = 0x40000,
 344        },
 345        {
 346                .name   = "Linux Kernel",
 347                .offset = 0x40000,
 348                .size   = 0x2c0000,
 349        },
 350        {
 351                .name   = "Filesystem",
 352                .offset = 0x300000,
 353                .size   = 0xcc0000,
 354        },
 355        {
 356                .name   = "U-Boot Environment",
 357                .offset = 0xfc0000,
 358                .size   = MTDPART_SIZ_FULL,
 359        },
 360};
 361
 362static struct physmap_flash_data palmtc_flash_data = {
 363        .width          = 4,
 364        .parts          = palmtc_flash_parts,
 365        .nr_parts       = ARRAY_SIZE(palmtc_flash_parts),
 366};
 367
 368static struct platform_device palmtc_flash = {
 369        .name           = "physmap-flash",
 370        .id             = -1,
 371        .resource       = &palmtc_flash_resource,
 372        .num_resources  = 1,
 373        .dev = {
 374                .platform_data  = &palmtc_flash_data,
 375        },
 376};
 377
 378/******************************************************************************
 379 * Framebuffer
 380 ******************************************************************************/
 381static struct pxafb_mode_info palmtc_lcd_modes[] = {
 382{
 383        .pixclock       = 115384,
 384        .xres           = 320,
 385        .yres           = 320,
 386        .bpp            = 16,
 387
 388        .left_margin    = 27,
 389        .right_margin   = 7,
 390        .upper_margin   = 7,
 391        .lower_margin   = 8,
 392
 393        .hsync_len      = 6,
 394        .vsync_len      = 1,
 395},
 396};
 397
 398static struct pxafb_mach_info palmtc_lcd_screen = {
 399        .modes                  = palmtc_lcd_modes,
 400        .num_modes              = ARRAY_SIZE(palmtc_lcd_modes),
 401        .lcd_conn               = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL,
 402};
 403
 404/******************************************************************************
 405 * Machine init
 406 ******************************************************************************/
 407static struct platform_device *devices[] __initdata = {
 408        &palmtc_backlight,
 409        &palmtc_ucb1400_core,
 410        &palmtc_keyboard,
 411        &palmtc_pxa_keys,
 412        &palmtc_flash,
 413};
 414
 415static void __init palmtc_init(void)
 416{
 417        pxa2xx_mfp_config(ARRAY_AND_SIZE(palmtc_pin_config));
 418
 419        set_pxa_fb_info(&palmtc_lcd_screen);
 420        pxa_set_mci_info(&palmtc_mci_platform_data);
 421        pxa_set_udc_info(&palmtc_udc_info);
 422        pxa_set_ac97_info(NULL);
 423        pxa_set_ficp_info(&palmtc_ficp_platform_data);
 424
 425        platform_add_devices(devices, ARRAY_SIZE(devices));
 426};
 427
 428MACHINE_START(PALMTC, "Palm Tungsten|C")
 429        .phys_io        = 0x40000000,
 430        .boot_params    = 0xa0000100,
 431        .io_pg_offst    = (io_p2v(0x40000000) >> 18) & 0xfffc,
 432        .map_io         = pxa_map_io,
 433        .init_irq       = pxa25x_init_irq,
 434        .timer          = &pxa_timer,
 435        .init_machine   = palmtc_init
 436MACHINE_END
 437