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 <mach/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 <mach/udc.h> 48#include <linux/platform_data/asoc-palm27x.h> 49#include <mach/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->priv; 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