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