palmtc.c (13790B)
1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * linux/arch/arm/mach-pxa/palmtc.c 4 * 5 * Support for the Palm Tungsten|C 6 * 7 * Author: Marek Vasut <marek.vasut@gmail.com> 8 * 9 * Based on work of: 10 * Petr Blaha <p3t3@centrum.cz> 11 * Chetan S. Kumar <shivakumar.chetan@gmail.com> 12 */ 13 14#include <linux/platform_device.h> 15#include <linux/delay.h> 16#include <linux/irq.h> 17#include <linux/input.h> 18#include <linux/pwm.h> 19#include <linux/pwm_backlight.h> 20#include <linux/gpio/machine.h> 21#include <linux/input/matrix_keypad.h> 22#include <linux/ucb1400.h> 23#include <linux/power_supply.h> 24#include <linux/gpio_keys.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 "pxa25x.h" 32#include <linux/platform_data/asoc-pxa.h> 33#include "palmtc.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 "udc.h" 38 39#include "generic.h" 40#include "devices.h" 41 42/****************************************************************************** 43 * Pin configuration 44 ******************************************************************************/ 45static unsigned long palmtc_pin_config[] __initdata = { 46 /* MMC */ 47 GPIO6_MMC_CLK, 48 GPIO8_MMC_CS0, 49 GPIO12_GPIO, /* detect */ 50 GPIO32_GPIO, /* power */ 51 GPIO54_GPIO, /* r/o switch */ 52 53 /* PCMCIA */ 54 GPIO52_nPCE_1, 55 GPIO53_nPCE_2, 56 GPIO50_nPIOR, 57 GPIO51_nPIOW, 58 GPIO49_nPWE, 59 GPIO48_nPOE, 60 GPIO52_nPCE_1, 61 GPIO53_nPCE_2, 62 GPIO57_nIOIS16, 63 GPIO56_nPWAIT, 64 65 /* AC97 */ 66 GPIO28_AC97_BITCLK, 67 GPIO29_AC97_SDATA_IN_0, 68 GPIO30_AC97_SDATA_OUT, 69 GPIO31_AC97_SYNC, 70 71 /* IrDA */ 72 GPIO45_GPIO, /* ir disable */ 73 GPIO46_FICP_RXD, 74 GPIO47_FICP_TXD, 75 76 /* PWM */ 77 GPIO17_PWM1_OUT, 78 79 /* USB */ 80 GPIO4_GPIO, /* detect */ 81 GPIO36_GPIO, /* pullup */ 82 83 /* LCD */ 84 GPIOxx_LCD_TFT_16BPP, 85 86 /* MATRIX KEYPAD */ 87 GPIO0_GPIO | WAKEUP_ON_EDGE_BOTH, /* in 0 */ 88 GPIO9_GPIO | WAKEUP_ON_EDGE_BOTH, /* in 1 */ 89 GPIO10_GPIO | WAKEUP_ON_EDGE_BOTH, /* in 2 */ 90 GPIO11_GPIO | WAKEUP_ON_EDGE_BOTH, /* in 3 */ 91 GPIO18_GPIO | MFP_LPM_DRIVE_LOW, /* out 0 */ 92 GPIO19_GPIO | MFP_LPM_DRIVE_LOW, /* out 1 */ 93 GPIO20_GPIO | MFP_LPM_DRIVE_LOW, /* out 2 */ 94 GPIO21_GPIO | MFP_LPM_DRIVE_LOW, /* out 3 */ 95 GPIO22_GPIO | MFP_LPM_DRIVE_LOW, /* out 4 */ 96 GPIO23_GPIO | MFP_LPM_DRIVE_LOW, /* out 5 */ 97 GPIO24_GPIO | MFP_LPM_DRIVE_LOW, /* out 6 */ 98 GPIO25_GPIO | MFP_LPM_DRIVE_LOW, /* out 7 */ 99 GPIO26_GPIO | MFP_LPM_DRIVE_LOW, /* out 8 */ 100 GPIO27_GPIO | MFP_LPM_DRIVE_LOW, /* out 9 */ 101 GPIO79_GPIO | MFP_LPM_DRIVE_LOW, /* out 10 */ 102 GPIO80_GPIO | MFP_LPM_DRIVE_LOW, /* out 11 */ 103 104 /* PXA GPIO KEYS */ 105 GPIO7_GPIO | WAKEUP_ON_EDGE_BOTH, /* hotsync button on cradle */ 106 107 /* MISC */ 108 GPIO1_RST, /* reset */ 109 GPIO2_GPIO, /* earphone detect */ 110 GPIO16_GPIO, /* backlight switch */ 111}; 112 113/****************************************************************************** 114 * SD/MMC card controller 115 ******************************************************************************/ 116#if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE) 117static struct pxamci_platform_data palmtc_mci_platform_data = { 118 .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, 119 .detect_delay_ms = 200, 120}; 121 122static struct gpiod_lookup_table palmtc_mci_gpio_table = { 123 .dev_id = "pxa2xx-mci.0", 124 .table = { 125 GPIO_LOOKUP("gpio-pxa", GPIO_NR_PALMTC_SD_DETECT_N, 126 "cd", GPIO_ACTIVE_LOW), 127 GPIO_LOOKUP("gpio-pxa", GPIO_NR_PALMTC_SD_READONLY, 128 "wp", GPIO_ACTIVE_LOW), 129 GPIO_LOOKUP("gpio-pxa", GPIO_NR_PALMTC_SD_POWER, 130 "power", GPIO_ACTIVE_HIGH), 131 { }, 132 }, 133}; 134 135static void __init palmtc_mmc_init(void) 136{ 137 gpiod_add_lookup_table(&palmtc_mci_gpio_table); 138 pxa_set_mci_info(&palmtc_mci_platform_data); 139} 140#else 141static inline void palmtc_mmc_init(void) {} 142#endif 143 144/****************************************************************************** 145 * GPIO keys 146 ******************************************************************************/ 147#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) 148static struct gpio_keys_button palmtc_pxa_buttons[] = { 149 {KEY_F8, GPIO_NR_PALMTC_HOTSYNC_BUTTON, 1, "HotSync Button", EV_KEY, 1}, 150}; 151 152static struct gpio_keys_platform_data palmtc_pxa_keys_data = { 153 .buttons = palmtc_pxa_buttons, 154 .nbuttons = ARRAY_SIZE(palmtc_pxa_buttons), 155}; 156 157static struct platform_device palmtc_pxa_keys = { 158 .name = "gpio-keys", 159 .id = -1, 160 .dev = { 161 .platform_data = &palmtc_pxa_keys_data, 162 }, 163}; 164 165static void __init palmtc_keys_init(void) 166{ 167 platform_device_register(&palmtc_pxa_keys); 168} 169#else 170static inline void palmtc_keys_init(void) {} 171#endif 172 173/****************************************************************************** 174 * Backlight 175 ******************************************************************************/ 176#if defined(CONFIG_BACKLIGHT_PWM) || defined(CONFIG_BACKLIGHT_PWM_MODULE) 177 178static struct gpiod_lookup_table palmtc_pwm_bl_gpio_table = { 179 .dev_id = "pwm-backlight.0", 180 .table = { 181 GPIO_LOOKUP("gpio-pxa", GPIO_NR_PALMTC_BL_POWER, 182 "enable", GPIO_ACTIVE_HIGH), 183 }, 184}; 185 186static struct pwm_lookup palmtc_pwm_lookup[] = { 187 PWM_LOOKUP("pxa25x-pwm.1", 0, "pwm-backlight.0", NULL, PALMTC_PERIOD_NS, 188 PWM_POLARITY_NORMAL), 189}; 190 191static struct platform_pwm_backlight_data palmtc_backlight_data = { 192 .max_brightness = PALMTC_MAX_INTENSITY, 193 .dft_brightness = PALMTC_MAX_INTENSITY, 194}; 195 196static struct platform_device palmtc_backlight = { 197 .name = "pwm-backlight", 198 .dev = { 199 .parent = &pxa25x_device_pwm1.dev, 200 .platform_data = &palmtc_backlight_data, 201 }, 202}; 203 204static void __init palmtc_pwm_init(void) 205{ 206 gpiod_add_lookup_table(&palmtc_pwm_bl_gpio_table); 207 pwm_add_table(palmtc_pwm_lookup, ARRAY_SIZE(palmtc_pwm_lookup)); 208 platform_device_register(&palmtc_backlight); 209} 210#else 211static inline void palmtc_pwm_init(void) {} 212#endif 213 214/****************************************************************************** 215 * IrDA 216 ******************************************************************************/ 217#if defined(CONFIG_IRDA) || defined(CONFIG_IRDA_MODULE) 218static struct pxaficp_platform_data palmtc_ficp_platform_data = { 219 .gpio_pwdown = GPIO_NR_PALMTC_IR_DISABLE, 220 .transceiver_cap = IR_SIRMODE | IR_OFF, 221}; 222 223static void __init palmtc_irda_init(void) 224{ 225 pxa_set_ficp_info(&palmtc_ficp_platform_data); 226} 227#else 228static inline void palmtc_irda_init(void) {} 229#endif 230 231/****************************************************************************** 232 * Keyboard 233 ******************************************************************************/ 234#if defined(CONFIG_KEYBOARD_MATRIX) || defined(CONFIG_KEYBOARD_MATRIX_MODULE) 235static const uint32_t palmtc_matrix_keys[] = { 236 KEY(0, 0, KEY_F1), 237 KEY(0, 1, KEY_X), 238 KEY(0, 2, KEY_POWER), 239 KEY(0, 3, KEY_TAB), 240 KEY(0, 4, KEY_A), 241 KEY(0, 5, KEY_Q), 242 KEY(0, 6, KEY_LEFTSHIFT), 243 KEY(0, 7, KEY_Z), 244 KEY(0, 8, KEY_S), 245 KEY(0, 9, KEY_W), 246 KEY(0, 10, KEY_E), 247 KEY(0, 11, KEY_UP), 248 249 KEY(1, 0, KEY_F2), 250 KEY(1, 1, KEY_DOWN), 251 KEY(1, 3, KEY_D), 252 KEY(1, 4, KEY_C), 253 KEY(1, 5, KEY_F), 254 KEY(1, 6, KEY_R), 255 KEY(1, 7, KEY_SPACE), 256 KEY(1, 8, KEY_V), 257 KEY(1, 9, KEY_G), 258 KEY(1, 10, KEY_T), 259 KEY(1, 11, KEY_LEFT), 260 261 KEY(2, 0, KEY_F3), 262 KEY(2, 1, KEY_LEFTCTRL), 263 KEY(2, 3, KEY_H), 264 KEY(2, 4, KEY_Y), 265 KEY(2, 5, KEY_N), 266 KEY(2, 6, KEY_J), 267 KEY(2, 7, KEY_U), 268 KEY(2, 8, KEY_M), 269 KEY(2, 9, KEY_K), 270 KEY(2, 10, KEY_I), 271 KEY(2, 11, KEY_RIGHT), 272 273 KEY(3, 0, KEY_F4), 274 KEY(3, 1, KEY_ENTER), 275 KEY(3, 3, KEY_DOT), 276 KEY(3, 4, KEY_L), 277 KEY(3, 5, KEY_O), 278 KEY(3, 6, KEY_LEFTALT), 279 KEY(3, 7, KEY_ENTER), 280 KEY(3, 8, KEY_BACKSPACE), 281 KEY(3, 9, KEY_P), 282 KEY(3, 10, KEY_B), 283 KEY(3, 11, KEY_FN), 284}; 285 286const struct matrix_keymap_data palmtc_keymap_data = { 287 .keymap = palmtc_matrix_keys, 288 .keymap_size = ARRAY_SIZE(palmtc_matrix_keys), 289}; 290 291static const unsigned int palmtc_keypad_row_gpios[] = { 292 0, 9, 10, 11 293}; 294 295static const unsigned int palmtc_keypad_col_gpios[] = { 296 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 79, 80 297}; 298 299static struct matrix_keypad_platform_data palmtc_keypad_platform_data = { 300 .keymap_data = &palmtc_keymap_data, 301 .row_gpios = palmtc_keypad_row_gpios, 302 .num_row_gpios = ARRAY_SIZE(palmtc_keypad_row_gpios), 303 .col_gpios = palmtc_keypad_col_gpios, 304 .num_col_gpios = ARRAY_SIZE(palmtc_keypad_col_gpios), 305 .active_low = 1, 306 307 .debounce_ms = 20, 308 .col_scan_delay_us = 5, 309}; 310 311static struct platform_device palmtc_keyboard = { 312 .name = "matrix-keypad", 313 .id = -1, 314 .dev = { 315 .platform_data = &palmtc_keypad_platform_data, 316 }, 317}; 318static void __init palmtc_mkp_init(void) 319{ 320 platform_device_register(&palmtc_keyboard); 321} 322#else 323static inline void palmtc_mkp_init(void) {} 324#endif 325 326/****************************************************************************** 327 * UDC 328 ******************************************************************************/ 329#if defined(CONFIG_USB_PXA25X)||defined(CONFIG_USB_PXA25X_MODULE) 330static struct gpiod_lookup_table palmtc_udc_gpiod_table = { 331 .dev_id = "gpio-vbus", 332 .table = { 333 GPIO_LOOKUP("gpio-pxa", GPIO_NR_PALMTC_USB_DETECT_N, 334 "vbus", GPIO_ACTIVE_LOW), 335 GPIO_LOOKUP("gpio-pxa", GPIO_NR_PALMTC_USB_POWER, 336 "pullup", GPIO_ACTIVE_HIGH), 337 { }, 338 }, 339}; 340 341static struct platform_device palmtc_gpio_vbus = { 342 .name = "gpio-vbus", 343 .id = -1, 344}; 345 346static void __init palmtc_udc_init(void) 347{ 348 gpiod_add_lookup_table(&palmtc_udc_gpiod_table); 349 platform_device_register(&palmtc_gpio_vbus); 350}; 351#else 352static inline void palmtc_udc_init(void) {} 353#endif 354 355/****************************************************************************** 356 * Touchscreen / Battery / GPIO-extender 357 ******************************************************************************/ 358#if defined(CONFIG_TOUCHSCREEN_UCB1400) || \ 359 defined(CONFIG_TOUCHSCREEN_UCB1400_MODULE) 360static struct platform_device palmtc_ucb1400_device = { 361 .name = "ucb1400_core", 362 .id = -1, 363}; 364 365static void __init palmtc_ts_init(void) 366{ 367 pxa_set_ac97_info(NULL); 368 platform_device_register(&palmtc_ucb1400_device); 369} 370#else 371static inline void palmtc_ts_init(void) {} 372#endif 373 374/****************************************************************************** 375 * LEDs 376 ******************************************************************************/ 377#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE) 378struct gpio_led palmtc_gpio_leds[] = { 379{ 380 .name = "palmtc:green:user", 381 .default_trigger = "none", 382 .gpio = GPIO_NR_PALMTC_LED_POWER, 383 .active_low = 1, 384}, { 385 .name = "palmtc:vibra:vibra", 386 .default_trigger = "none", 387 .gpio = GPIO_NR_PALMTC_VIBRA_POWER, 388 .active_low = 1, 389} 390 391}; 392 393static struct gpio_led_platform_data palmtc_gpio_led_info = { 394 .leds = palmtc_gpio_leds, 395 .num_leds = ARRAY_SIZE(palmtc_gpio_leds), 396}; 397 398static struct platform_device palmtc_leds = { 399 .name = "leds-gpio", 400 .id = -1, 401 .dev = { 402 .platform_data = &palmtc_gpio_led_info, 403 } 404}; 405 406static void __init palmtc_leds_init(void) 407{ 408 platform_device_register(&palmtc_leds); 409} 410#else 411static inline void palmtc_leds_init(void) {} 412#endif 413 414/****************************************************************************** 415 * NOR Flash 416 ******************************************************************************/ 417#if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE) 418static struct resource palmtc_flash_resource = { 419 .start = PXA_CS0_PHYS, 420 .end = PXA_CS0_PHYS + SZ_16M - 1, 421 .flags = IORESOURCE_MEM, 422}; 423 424static struct mtd_partition palmtc_flash_parts[] = { 425 { 426 .name = "U-Boot Bootloader", 427 .offset = 0x0, 428 .size = 0x40000, 429 }, 430 { 431 .name = "Linux Kernel", 432 .offset = 0x40000, 433 .size = 0x2c0000, 434 }, 435 { 436 .name = "Filesystem", 437 .offset = 0x300000, 438 .size = 0xcc0000, 439 }, 440 { 441 .name = "U-Boot Environment", 442 .offset = 0xfc0000, 443 .size = MTDPART_SIZ_FULL, 444 }, 445}; 446 447static struct physmap_flash_data palmtc_flash_data = { 448 .width = 4, 449 .parts = palmtc_flash_parts, 450 .nr_parts = ARRAY_SIZE(palmtc_flash_parts), 451}; 452 453static struct platform_device palmtc_flash = { 454 .name = "physmap-flash", 455 .id = -1, 456 .resource = &palmtc_flash_resource, 457 .num_resources = 1, 458 .dev = { 459 .platform_data = &palmtc_flash_data, 460 }, 461}; 462 463static void __init palmtc_nor_init(void) 464{ 465 platform_device_register(&palmtc_flash); 466} 467#else 468static inline void palmtc_nor_init(void) {} 469#endif 470 471/****************************************************************************** 472 * Framebuffer 473 ******************************************************************************/ 474#if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE) 475static struct pxafb_mode_info palmtc_lcd_modes[] = { 476 { 477 .pixclock = 115384, 478 .xres = 320, 479 .yres = 320, 480 .bpp = 16, 481 482 .left_margin = 27, 483 .right_margin = 7, 484 .upper_margin = 7, 485 .lower_margin = 8, 486 487 .hsync_len = 6, 488 .vsync_len = 1, 489 }, 490}; 491 492static struct pxafb_mach_info palmtc_lcd_screen = { 493 .modes = palmtc_lcd_modes, 494 .num_modes = ARRAY_SIZE(palmtc_lcd_modes), 495 .lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL, 496}; 497 498static void __init palmtc_lcd_init(void) 499{ 500 pxa_set_fb_info(NULL, &palmtc_lcd_screen); 501} 502#else 503static inline void palmtc_lcd_init(void) {} 504#endif 505 506/****************************************************************************** 507 * Machine init 508 ******************************************************************************/ 509static void __init palmtc_init(void) 510{ 511 pxa2xx_mfp_config(ARRAY_AND_SIZE(palmtc_pin_config)); 512 513 pxa_set_ffuart_info(NULL); 514 pxa_set_btuart_info(NULL); 515 pxa_set_stuart_info(NULL); 516 pxa_set_hwuart_info(NULL); 517 518 palmtc_mmc_init(); 519 palmtc_keys_init(); 520 palmtc_pwm_init(); 521 palmtc_irda_init(); 522 palmtc_mkp_init(); 523 palmtc_udc_init(); 524 palmtc_ts_init(); 525 palmtc_nor_init(); 526 palmtc_lcd_init(); 527 palmtc_leds_init(); 528}; 529 530MACHINE_START(PALMTC, "Palm Tungsten|C") 531 .atag_offset = 0x100, 532 .map_io = pxa25x_map_io, 533 .nr_irqs = PXA_NR_IRQS, 534 .init_irq = pxa25x_init_irq, 535 .handle_irq = pxa25x_handle_irq, 536 .init_time = pxa_timer_init, 537 .init_machine = palmtc_init, 538 .restart = pxa_restart, 539MACHINE_END