1/* 2 * Hardware definitions for Palm LifeDrive 3 * 4 * Author: Marek Vasut <marek.vasut@gmail.com> 5 * 6 * Based on work of: 7 * Alex Osborne <ato@meshy.org> 8 * 9 * This program is free software; you can redistribute it and/or modify 10 * it under the terms of the GNU General Public License version 2 as 11 * published by the Free Software Foundation. 12 * 13 * (find more info at www.hackndev.com) 14 * 15 */ 16 17#include <linux/platform_device.h> 18#include <linux/delay.h> 19#include <linux/irq.h> 20#include <linux/gpio_keys.h> 21#include <linux/input.h> 22#include <linux/pda_power.h> 23#include <linux/pwm_backlight.h> 24#include <linux/gpio.h> 25#include <linux/wm97xx.h> 26#include <linux/power_supply.h> 27#include <linux/mtd/mtd.h> 28#include <linux/mtd/partitions.h> 29#include <linux/mtd/physmap.h> 30 31#include <asm/mach-types.h> 32#include <asm/mach/arch.h> 33#include <asm/mach/map.h> 34 35#include <mach/pxa27x.h> 36#include <mach/audio.h> 37#include <mach/palmld.h> 38#include <linux/platform_data/mmc-pxamci.h> 39#include <linux/platform_data/video-pxafb.h> 40#include <linux/platform_data/irda-pxaficp.h> 41#include <linux/platform_data/keypad-pxa27x.h> 42#include <linux/platform_data/asoc-palm27x.h> 43#include <mach/palm27x.h> 44 45#include "generic.h" 46#include "devices.h" 47 48/****************************************************************************** 49 * Pin configuration 50 ******************************************************************************/ 51static unsigned long palmld_pin_config[] __initdata = { 52 /* MMC */ 53 GPIO32_MMC_CLK, 54 GPIO92_MMC_DAT_0, 55 GPIO109_MMC_DAT_1, 56 GPIO110_MMC_DAT_2, 57 GPIO111_MMC_DAT_3, 58 GPIO112_MMC_CMD, 59 GPIO14_GPIO, /* SD detect */ 60 GPIO114_GPIO, /* SD power */ 61 GPIO116_GPIO, /* SD r/o switch */ 62 63 /* AC97 */ 64 GPIO28_AC97_BITCLK, 65 GPIO29_AC97_SDATA_IN_0, 66 GPIO30_AC97_SDATA_OUT, 67 GPIO31_AC97_SYNC, 68 GPIO89_AC97_SYSCLK, 69 GPIO95_AC97_nRESET, 70 71 /* IrDA */ 72 GPIO108_GPIO, /* ir disable */ 73 GPIO46_FICP_RXD, 74 GPIO47_FICP_TXD, 75 76 /* MATRIX KEYPAD */ 77 GPIO100_KP_MKIN_0 | WAKEUP_ON_LEVEL_HIGH, 78 GPIO101_KP_MKIN_1 | WAKEUP_ON_LEVEL_HIGH, 79 GPIO102_KP_MKIN_2 | WAKEUP_ON_LEVEL_HIGH, 80 GPIO97_KP_MKIN_3 | WAKEUP_ON_LEVEL_HIGH, 81 GPIO103_KP_MKOUT_0, 82 GPIO104_KP_MKOUT_1, 83 GPIO105_KP_MKOUT_2, 84 85 /* LCD */ 86 GPIOxx_LCD_TFT_16BPP, 87 88 /* PWM */ 89 GPIO16_PWM0_OUT, 90 91 /* GPIO KEYS */ 92 GPIO10_GPIO, /* hotsync button */ 93 GPIO12_GPIO, /* power switch */ 94 GPIO15_GPIO, /* lock switch */ 95 96 /* LEDs */ 97 GPIO52_GPIO, /* green led */ 98 GPIO94_GPIO, /* orange led */ 99 100 /* PCMCIA */ 101 GPIO48_nPOE, 102 GPIO49_nPWE, 103 GPIO50_nPIOR, 104 GPIO51_nPIOW, 105 GPIO85_nPCE_1, 106 GPIO54_nPCE_2, 107 GPIO79_PSKTSEL, 108 GPIO55_nPREG, 109 GPIO56_nPWAIT, 110 GPIO57_nIOIS16, 111 GPIO36_GPIO, /* wifi power */ 112 GPIO38_GPIO, /* wifi ready */ 113 GPIO81_GPIO, /* wifi reset */ 114 115 /* FFUART */ 116 GPIO34_FFUART_RXD, 117 GPIO39_FFUART_TXD, 118 119 /* HDD */ 120 GPIO98_GPIO, /* HDD reset */ 121 GPIO115_GPIO, /* HDD power */ 122 123 /* MISC */ 124 GPIO13_GPIO, /* earphone detect */ 125}; 126 127/****************************************************************************** 128 * NOR Flash 129 ******************************************************************************/ 130#if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE) 131static struct mtd_partition palmld_partitions[] = { 132 { 133 .name = "Flash", 134 .offset = 0x00000000, 135 .size = MTDPART_SIZ_FULL, 136 .mask_flags = 0 137 } 138}; 139 140static struct physmap_flash_data palmld_flash_data[] = { 141 { 142 .width = 2, /* bankwidth in bytes */ 143 .parts = palmld_partitions, 144 .nr_parts = ARRAY_SIZE(palmld_partitions) 145 } 146}; 147 148static struct resource palmld_flash_resource = { 149 .start = PXA_CS0_PHYS, 150 .end = PXA_CS0_PHYS + SZ_4M - 1, 151 .flags = IORESOURCE_MEM, 152}; 153 154static struct platform_device palmld_flash = { 155 .name = "physmap-flash", 156 .id = 0, 157 .resource = &palmld_flash_resource, 158 .num_resources = 1, 159 .dev = { 160 .platform_data = palmld_flash_data, 161 }, 162}; 163 164static void __init palmld_nor_init(void) 165{ 166 platform_device_register(&palmld_flash); 167} 168#else 169static inline void palmld_nor_init(void) {} 170#endif 171 172/****************************************************************************** 173 * GPIO keyboard 174 ******************************************************************************/ 175#if defined(CONFIG_KEYBOARD_PXA27x) || defined(CONFIG_KEYBOARD_PXA27x_MODULE) 176static const unsigned int palmld_matrix_keys[] = { 177 KEY(0, 1, KEY_F2), 178 KEY(0, 2, KEY_UP), 179 180 KEY(1, 0, KEY_F3), 181 KEY(1, 1, KEY_F4), 182 KEY(1, 2, KEY_RIGHT), 183 184 KEY(2, 0, KEY_F1), 185 KEY(2, 1, KEY_F5), 186 KEY(2, 2, KEY_DOWN), 187 188 KEY(3, 0, KEY_F6), 189 KEY(3, 1, KEY_ENTER), 190 KEY(3, 2, KEY_LEFT), 191}; 192 193static struct matrix_keymap_data palmld_matrix_keymap_data = { 194 .keymap = palmld_matrix_keys, 195 .keymap_size = ARRAY_SIZE(palmld_matrix_keys), 196}; 197 198static struct pxa27x_keypad_platform_data palmld_keypad_platform_data = { 199 .matrix_key_rows = 4, 200 .matrix_key_cols = 3, 201 .matrix_keymap_data = &palmld_matrix_keymap_data, 202 203 .debounce_interval = 30, 204}; 205 206static void __init palmld_kpc_init(void) 207{ 208 pxa_set_keypad_info(&palmld_keypad_platform_data); 209} 210#else 211static inline void palmld_kpc_init(void) {} 212#endif 213 214/****************************************************************************** 215 * GPIO keys 216 ******************************************************************************/ 217#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) 218static struct gpio_keys_button palmld_pxa_buttons[] = { 219 {KEY_F8, GPIO_NR_PALMLD_HOTSYNC_BUTTON_N, 1, "HotSync Button" }, 220 {KEY_F9, GPIO_NR_PALMLD_LOCK_SWITCH, 0, "Lock Switch" }, 221 {KEY_POWER, GPIO_NR_PALMLD_POWER_SWITCH, 0, "Power Switch" }, 222}; 223 224static struct gpio_keys_platform_data palmld_pxa_keys_data = { 225 .buttons = palmld_pxa_buttons, 226 .nbuttons = ARRAY_SIZE(palmld_pxa_buttons), 227}; 228 229static struct platform_device palmld_pxa_keys = { 230 .name = "gpio-keys", 231 .id = -1, 232 .dev = { 233 .platform_data = &palmld_pxa_keys_data, 234 }, 235}; 236 237static void __init palmld_keys_init(void) 238{ 239 platform_device_register(&palmld_pxa_keys); 240} 241#else 242static inline void palmld_keys_init(void) {} 243#endif 244 245/****************************************************************************** 246 * LEDs 247 ******************************************************************************/ 248#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE) 249struct gpio_led gpio_leds[] = { 250{ 251 .name = "palmld:green:led", 252 .default_trigger = "none", 253 .gpio = GPIO_NR_PALMLD_LED_GREEN, 254}, { 255 .name = "palmld:amber:led", 256 .default_trigger = "none", 257 .gpio = GPIO_NR_PALMLD_LED_AMBER, 258}, 259}; 260 261static struct gpio_led_platform_data gpio_led_info = { 262 .leds = gpio_leds, 263 .num_leds = ARRAY_SIZE(gpio_leds), 264}; 265 266static struct platform_device palmld_leds = { 267 .name = "leds-gpio", 268 .id = -1, 269 .dev = { 270 .platform_data = &gpio_led_info, 271 } 272}; 273 274static void __init palmld_leds_init(void) 275{ 276 platform_device_register(&palmld_leds); 277} 278#else 279static inline void palmld_leds_init(void) {} 280#endif 281 282/****************************************************************************** 283 * HDD 284 ******************************************************************************/ 285#if defined(CONFIG_PATA_PALMLD) || defined(CONFIG_PATA_PALMLD_MODULE) 286static struct platform_device palmld_ide_device = { 287 .name = "pata_palmld", 288 .id = -1, 289}; 290 291static void __init palmld_ide_init(void) 292{ 293 platform_device_register(&palmld_ide_device); 294} 295#else 296static inline void palmld_ide_init(void) {} 297#endif 298 299/****************************************************************************** 300 * Machine init 301 ******************************************************************************/ 302static struct map_desc palmld_io_desc[] __initdata = { 303{ 304 .virtual = PALMLD_IDE_VIRT, 305 .pfn = __phys_to_pfn(PALMLD_IDE_PHYS), 306 .length = PALMLD_IDE_SIZE, 307 .type = MT_DEVICE 308}, 309{ 310 .virtual = PALMLD_USB_VIRT, 311 .pfn = __phys_to_pfn(PALMLD_USB_PHYS), 312 .length = PALMLD_USB_SIZE, 313 .type = MT_DEVICE 314}, 315}; 316 317static void __init palmld_map_io(void) 318{ 319 pxa27x_map_io(); 320 iotable_init(palmld_io_desc, ARRAY_SIZE(palmld_io_desc)); 321} 322 323static void __init palmld_init(void) 324{ 325 pxa2xx_mfp_config(ARRAY_AND_SIZE(palmld_pin_config)); 326 pxa_set_ffuart_info(NULL); 327 pxa_set_btuart_info(NULL); 328 pxa_set_stuart_info(NULL); 329 330 palm27x_mmc_init(GPIO_NR_PALMLD_SD_DETECT_N, GPIO_NR_PALMLD_SD_READONLY, 331 GPIO_NR_PALMLD_SD_POWER, 0); 332 palm27x_pm_init(PALMLD_STR_BASE); 333 palm27x_lcd_init(-1, &palm_320x480_lcd_mode); 334 palm27x_irda_init(GPIO_NR_PALMLD_IR_DISABLE); 335 palm27x_ac97_init(PALMLD_BAT_MIN_VOLTAGE, PALMLD_BAT_MAX_VOLTAGE, 336 GPIO_NR_PALMLD_EARPHONE_DETECT, 95); 337 palm27x_pwm_init(GPIO_NR_PALMLD_BL_POWER, GPIO_NR_PALMLD_LCD_POWER); 338 palm27x_power_init(GPIO_NR_PALMLD_POWER_DETECT, 339 GPIO_NR_PALMLD_USB_DETECT_N); 340 palm27x_pmic_init(); 341 palmld_kpc_init(); 342 palmld_keys_init(); 343 palmld_nor_init(); 344 palmld_leds_init(); 345 palmld_ide_init(); 346} 347 348MACHINE_START(PALMLD, "Palm LifeDrive") 349 .atag_offset = 0x100, 350 .map_io = palmld_map_io, 351 .nr_irqs = PXA_NR_IRQS, 352 .init_irq = pxa27x_init_irq, 353 .handle_irq = pxa27x_handle_irq, 354 .init_time = pxa_timer_init, 355 .init_machine = palmld_init, 356 .restart = pxa_restart, 357MACHINE_END 358