linux/arch/arm/mach-pxa/palmtx.c
<<
>>
Prefs
   1/*
   2 * Hardware definitions for PalmTX
   3 *
   4 * Author:     Marek Vasut <marek.vasut@gmail.com>
   5 *
   6 * Based on work of:
   7 *              Alex Osborne <ato@meshy.org>
   8 *              Cristiano P. <cristianop@users.sourceforge.net>
   9 *              Jan Herman <2hp@seznam.cz>
  10 *              Michal Hrusecky
  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 * (find more info at www.hackndev.com)
  17 *
  18 */
  19
  20#include <linux/platform_device.h>
  21#include <linux/delay.h>
  22#include <linux/irq.h>
  23#include <linux/gpio_keys.h>
  24#include <linux/input.h>
  25#include <linux/pda_power.h>
  26#include <linux/pwm_backlight.h>
  27#include <linux/gpio.h>
  28#include <linux/wm97xx.h>
  29#include <linux/power_supply.h>
  30#include <linux/usb/gpio_vbus.h>
  31#include <linux/mtd/nand.h>
  32#include <linux/mtd/partitions.h>
  33#include <linux/mtd/mtd.h>
  34#include <linux/mtd/physmap.h>
  35
  36#include <asm/mach-types.h>
  37#include <asm/mach/arch.h>
  38#include <asm/mach/map.h>
  39
  40#include "pxa27x.h"
  41#include <mach/audio.h>
  42#include <mach/palmtx.h>
  43#include <linux/platform_data/mmc-pxamci.h>
  44#include <linux/platform_data/video-pxafb.h>
  45#include <linux/platform_data/irda-pxaficp.h>
  46#include <linux/platform_data/keypad-pxa27x.h>
  47#include "udc.h"
  48#include <linux/platform_data/asoc-palm27x.h>
  49#include "palm27x.h"
  50
  51#include "generic.h"
  52#include "devices.h"
  53
  54/******************************************************************************
  55 * Pin configuration
  56 ******************************************************************************/
  57static unsigned long palmtx_pin_config[] __initdata = {
  58        /* MMC */
  59        GPIO32_MMC_CLK,
  60        GPIO92_MMC_DAT_0,
  61        GPIO109_MMC_DAT_1,
  62        GPIO110_MMC_DAT_2,
  63        GPIO111_MMC_DAT_3,
  64        GPIO112_MMC_CMD,
  65        GPIO14_GPIO,    /* SD detect */
  66        GPIO114_GPIO,   /* SD power */
  67        GPIO115_GPIO,   /* SD r/o switch */
  68
  69        /* AC97 */
  70        GPIO28_AC97_BITCLK,
  71        GPIO29_AC97_SDATA_IN_0,
  72        GPIO30_AC97_SDATA_OUT,
  73        GPIO31_AC97_SYNC,
  74        GPIO89_AC97_SYSCLK,
  75        GPIO95_AC97_nRESET,
  76
  77        /* IrDA */
  78        GPIO40_GPIO,    /* ir disable */
  79        GPIO46_FICP_RXD,
  80        GPIO47_FICP_TXD,
  81
  82        /* PWM */
  83        GPIO16_PWM0_OUT,
  84
  85        /* USB */
  86        GPIO13_GPIO,    /* usb detect */
  87        GPIO93_GPIO,    /* usb power */
  88
  89        /* PCMCIA */
  90        GPIO48_nPOE,
  91        GPIO49_nPWE,
  92        GPIO50_nPIOR,
  93        GPIO51_nPIOW,
  94        GPIO85_nPCE_1,
  95        GPIO54_nPCE_2,
  96        GPIO79_PSKTSEL,
  97        GPIO55_nPREG,
  98        GPIO56_nPWAIT,
  99        GPIO57_nIOIS16,
 100        GPIO94_GPIO,    /* wifi power 1 */
 101        GPIO108_GPIO,   /* wifi power 2 */
 102        GPIO116_GPIO,   /* wifi ready */
 103
 104        /* MATRIX KEYPAD */
 105        GPIO100_KP_MKIN_0 | WAKEUP_ON_LEVEL_HIGH,
 106        GPIO101_KP_MKIN_1 | WAKEUP_ON_LEVEL_HIGH,
 107        GPIO102_KP_MKIN_2 | WAKEUP_ON_LEVEL_HIGH,
 108        GPIO97_KP_MKIN_3 | WAKEUP_ON_LEVEL_HIGH,
 109        GPIO103_KP_MKOUT_0,
 110        GPIO104_KP_MKOUT_1,
 111        GPIO105_KP_MKOUT_2,
 112
 113        /* LCD */
 114        GPIOxx_LCD_TFT_16BPP,
 115
 116        /* FFUART */
 117        GPIO34_FFUART_RXD,
 118        GPIO39_FFUART_TXD,
 119
 120        /* NAND */
 121        GPIO15_nCS_1,
 122        GPIO18_RDY,
 123
 124        /* MISC. */
 125        GPIO10_GPIO,    /* hotsync button */
 126        GPIO12_GPIO,    /* power detect */
 127        GPIO107_GPIO,   /* earphone detect */
 128};
 129
 130/******************************************************************************
 131 * NOR Flash
 132 ******************************************************************************/
 133#if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
 134static struct mtd_partition palmtx_partitions[] = {
 135        {
 136                .name           = "Flash",
 137                .offset         = 0x00000000,
 138                .size           = MTDPART_SIZ_FULL,
 139                .mask_flags     = 0
 140        }
 141};
 142
 143static struct physmap_flash_data palmtx_flash_data[] = {
 144        {
 145                .width          = 2,                    /* bankwidth in bytes */
 146                .parts          = palmtx_partitions,
 147                .nr_parts       = ARRAY_SIZE(palmtx_partitions)
 148        }
 149};
 150
 151static struct resource palmtx_flash_resource = {
 152        .start  = PXA_CS0_PHYS,
 153        .end    = PXA_CS0_PHYS + SZ_8M - 1,
 154        .flags  = IORESOURCE_MEM,
 155};
 156
 157static struct platform_device palmtx_flash = {
 158        .name           = "physmap-flash",
 159        .id             = 0,
 160        .resource       = &palmtx_flash_resource,
 161        .num_resources  = 1,
 162        .dev            = {
 163                .platform_data = palmtx_flash_data,
 164        },
 165};
 166
 167static void __init palmtx_nor_init(void)
 168{
 169        platform_device_register(&palmtx_flash);
 170}
 171#else
 172static inline void palmtx_nor_init(void) {}
 173#endif
 174
 175/******************************************************************************
 176 * GPIO keyboard
 177 ******************************************************************************/
 178#if defined(CONFIG_KEYBOARD_PXA27x) || defined(CONFIG_KEYBOARD_PXA27x_MODULE)
 179static const unsigned int palmtx_matrix_keys[] = {
 180        KEY(0, 0, KEY_POWER),
 181        KEY(0, 1, KEY_F1),
 182        KEY(0, 2, KEY_ENTER),
 183
 184        KEY(1, 0, KEY_F2),
 185        KEY(1, 1, KEY_F3),
 186        KEY(1, 2, KEY_F4),
 187
 188        KEY(2, 0, KEY_UP),
 189        KEY(2, 2, KEY_DOWN),
 190
 191        KEY(3, 0, KEY_RIGHT),
 192        KEY(3, 2, KEY_LEFT),
 193};
 194
 195static struct matrix_keymap_data palmtx_matrix_keymap_data = {
 196        .keymap                 = palmtx_matrix_keys,
 197        .keymap_size            = ARRAY_SIZE(palmtx_matrix_keys),
 198};
 199
 200static struct pxa27x_keypad_platform_data palmtx_keypad_platform_data = {
 201        .matrix_key_rows        = 4,
 202        .matrix_key_cols        = 3,
 203        .matrix_keymap_data     = &palmtx_matrix_keymap_data,
 204
 205        .debounce_interval      = 30,
 206};
 207
 208static void __init palmtx_kpc_init(void)
 209{
 210        pxa_set_keypad_info(&palmtx_keypad_platform_data);
 211}
 212#else
 213static inline void palmtx_kpc_init(void) {}
 214#endif
 215
 216/******************************************************************************
 217 * GPIO keys
 218 ******************************************************************************/
 219#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
 220static struct gpio_keys_button palmtx_pxa_buttons[] = {
 221        {KEY_F8, GPIO_NR_PALMTX_HOTSYNC_BUTTON_N, 1, "HotSync Button" },
 222};
 223
 224static struct gpio_keys_platform_data palmtx_pxa_keys_data = {
 225        .buttons        = palmtx_pxa_buttons,
 226        .nbuttons       = ARRAY_SIZE(palmtx_pxa_buttons),
 227};
 228
 229static struct platform_device palmtx_pxa_keys = {
 230        .name   = "gpio-keys",
 231        .id     = -1,
 232        .dev    = {
 233                .platform_data = &palmtx_pxa_keys_data,
 234        },
 235};
 236
 237static void __init palmtx_keys_init(void)
 238{
 239        platform_device_register(&palmtx_pxa_keys);
 240}
 241#else
 242static inline void palmtx_keys_init(void) {}
 243#endif
 244
 245/******************************************************************************
 246 * NAND Flash
 247 ******************************************************************************/
 248#if defined(CONFIG_MTD_NAND_PLATFORM) || \
 249        defined(CONFIG_MTD_NAND_PLATFORM_MODULE)
 250static void palmtx_nand_cmd_ctl(struct mtd_info *mtd, int cmd,
 251                                 unsigned int ctrl)
 252{
 253        struct nand_chip *this = mtd_to_nand(mtd);
 254        char __iomem *nandaddr = this->IO_ADDR_W;
 255
 256        if (cmd == NAND_CMD_NONE)
 257                return;
 258
 259        if (ctrl & NAND_CLE)
 260                writeb(cmd, PALMTX_NAND_CLE_VIRT);
 261        else if (ctrl & NAND_ALE)
 262                writeb(cmd, PALMTX_NAND_ALE_VIRT);
 263        else
 264                writeb(cmd, nandaddr);
 265}
 266
 267static struct mtd_partition palmtx_partition_info[] = {
 268        [0] = {
 269                .name   = "palmtx-0",
 270                .offset = 0,
 271                .size   = MTDPART_SIZ_FULL
 272        },
 273};
 274
 275struct platform_nand_data palmtx_nand_platdata = {
 276        .chip   = {
 277                .nr_chips               = 1,
 278                .chip_offset            = 0,
 279                .nr_partitions          = ARRAY_SIZE(palmtx_partition_info),
 280                .partitions             = palmtx_partition_info,
 281                .chip_delay             = 20,
 282        },
 283        .ctrl   = {
 284                .cmd_ctrl       = palmtx_nand_cmd_ctl,
 285        },
 286};
 287
 288static struct resource palmtx_nand_resource[] = {
 289        [0]     = {
 290                .start  = PXA_CS1_PHYS,
 291                .end    = PXA_CS1_PHYS + SZ_1M - 1,
 292                .flags  = IORESOURCE_MEM,
 293        },
 294};
 295
 296static struct platform_device palmtx_nand = {
 297        .name           = "gen_nand",
 298        .num_resources  = ARRAY_SIZE(palmtx_nand_resource),
 299        .resource       = palmtx_nand_resource,
 300        .id             = -1,
 301        .dev            = {
 302                .platform_data  = &palmtx_nand_platdata,
 303        }
 304};
 305
 306static void __init palmtx_nand_init(void)
 307{
 308        platform_device_register(&palmtx_nand);
 309}
 310#else
 311static inline void palmtx_nand_init(void) {}
 312#endif
 313
 314/******************************************************************************
 315 * Machine init
 316 ******************************************************************************/
 317static struct map_desc palmtx_io_desc[] __initdata = {
 318{
 319        .virtual        = (unsigned long)PALMTX_PCMCIA_VIRT,
 320        .pfn            = __phys_to_pfn(PALMTX_PCMCIA_PHYS),
 321        .length         = PALMTX_PCMCIA_SIZE,
 322        .type           = MT_DEVICE,
 323}, {
 324        .virtual        = (unsigned long)PALMTX_NAND_ALE_VIRT,
 325        .pfn            = __phys_to_pfn(PALMTX_NAND_ALE_PHYS),
 326        .length         = SZ_1M,
 327        .type           = MT_DEVICE,
 328}, {
 329        .virtual        = (unsigned long)PALMTX_NAND_CLE_VIRT,
 330        .pfn            = __phys_to_pfn(PALMTX_NAND_CLE_PHYS),
 331        .length         = SZ_1M,
 332        .type           = MT_DEVICE,
 333}
 334};
 335
 336static void __init palmtx_map_io(void)
 337{
 338        pxa27x_map_io();
 339        iotable_init(palmtx_io_desc, ARRAY_SIZE(palmtx_io_desc));
 340}
 341
 342static void __init palmtx_init(void)
 343{
 344        pxa2xx_mfp_config(ARRAY_AND_SIZE(palmtx_pin_config));
 345        pxa_set_ffuart_info(NULL);
 346        pxa_set_btuart_info(NULL);
 347        pxa_set_stuart_info(NULL);
 348
 349        palm27x_mmc_init(GPIO_NR_PALMTX_SD_DETECT_N, GPIO_NR_PALMTX_SD_READONLY,
 350                        GPIO_NR_PALMTX_SD_POWER, 0);
 351        palm27x_pm_init(PALMTX_STR_BASE);
 352        palm27x_lcd_init(-1, &palm_320x480_lcd_mode);
 353        palm27x_udc_init(GPIO_NR_PALMTX_USB_DETECT_N,
 354                        GPIO_NR_PALMTX_USB_PULLUP, 1);
 355        palm27x_irda_init(GPIO_NR_PALMTX_IR_DISABLE);
 356        palm27x_ac97_init(PALMTX_BAT_MIN_VOLTAGE, PALMTX_BAT_MAX_VOLTAGE,
 357                        GPIO_NR_PALMTX_EARPHONE_DETECT, 95);
 358        palm27x_pwm_init(GPIO_NR_PALMTX_BL_POWER, GPIO_NR_PALMTX_LCD_POWER);
 359        palm27x_power_init(GPIO_NR_PALMTX_POWER_DETECT, -1);
 360        palm27x_pmic_init();
 361        palmtx_kpc_init();
 362        palmtx_keys_init();
 363        palmtx_nor_init();
 364        palmtx_nand_init();
 365}
 366
 367MACHINE_START(PALMTX, "Palm T|X")
 368        .atag_offset    = 0x100,
 369        .map_io         = palmtx_map_io,
 370        .nr_irqs        = PXA_NR_IRQS,
 371        .init_irq       = pxa27x_init_irq,
 372        .handle_irq     = pxa27x_handle_irq,
 373        .init_time      = pxa_timer_init,
 374        .init_machine   = palmtx_init,
 375        .restart        = pxa_restart,
 376MACHINE_END
 377