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