linux/arch/arm/mach-pxa/palmld.c
<<
>>
Prefs
   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 <mach/audio.h>
  33#include <mach/palmld.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 platform_device palmld_ide_device = {
 283        .name   = "pata_palmld",
 284        .id     = -1,
 285};
 286
 287static struct gpiod_lookup_table palmld_ide_gpio_table = {
 288        .dev_id = "pata_palmld",
 289        .table = {
 290                GPIO_LOOKUP("gpio-pxa", GPIO_NR_PALMLD_IDE_PWEN,
 291                            "power", GPIO_ACTIVE_HIGH),
 292                GPIO_LOOKUP("gpio-pxa", GPIO_NR_PALMLD_IDE_RESET,
 293                            "reset", GPIO_ACTIVE_LOW),
 294                { },
 295        },
 296};
 297
 298static void __init palmld_ide_init(void)
 299{
 300        gpiod_add_lookup_table(&palmld_ide_gpio_table);
 301        platform_device_register(&palmld_ide_device);
 302}
 303#else
 304static inline void palmld_ide_init(void) {}
 305#endif
 306
 307/******************************************************************************
 308 * Machine init
 309 ******************************************************************************/
 310static struct map_desc palmld_io_desc[] __initdata = {
 311{
 312        .virtual        = PALMLD_IDE_VIRT,
 313        .pfn            = __phys_to_pfn(PALMLD_IDE_PHYS),
 314        .length         = PALMLD_IDE_SIZE,
 315        .type           = MT_DEVICE
 316},
 317{
 318        .virtual        = PALMLD_USB_VIRT,
 319        .pfn            = __phys_to_pfn(PALMLD_USB_PHYS),
 320        .length         = PALMLD_USB_SIZE,
 321        .type           = MT_DEVICE
 322},
 323};
 324
 325static void __init palmld_map_io(void)
 326{
 327        pxa27x_map_io();
 328        iotable_init(palmld_io_desc, ARRAY_SIZE(palmld_io_desc));
 329}
 330
 331static struct gpiod_lookup_table palmld_mci_gpio_table = {
 332        .dev_id = "pxa2xx-mci.0",
 333        .table = {
 334                GPIO_LOOKUP("gpio-pxa", GPIO_NR_PALMLD_SD_DETECT_N,
 335                            "cd", GPIO_ACTIVE_LOW),
 336                GPIO_LOOKUP("gpio-pxa", GPIO_NR_PALMLD_SD_READONLY,
 337                            "wp", GPIO_ACTIVE_LOW),
 338                GPIO_LOOKUP("gpio-pxa", GPIO_NR_PALMLD_SD_POWER,
 339                            "power", GPIO_ACTIVE_HIGH),
 340                { },
 341        },
 342};
 343
 344static void __init palmld_init(void)
 345{
 346        pxa2xx_mfp_config(ARRAY_AND_SIZE(palmld_pin_config));
 347        pxa_set_ffuart_info(NULL);
 348        pxa_set_btuart_info(NULL);
 349        pxa_set_stuart_info(NULL);
 350
 351        palm27x_mmc_init(&palmld_mci_gpio_table);
 352        palm27x_pm_init(PALMLD_STR_BASE);
 353        palm27x_lcd_init(-1, &palm_320x480_lcd_mode);
 354        palm27x_irda_init(GPIO_NR_PALMLD_IR_DISABLE);
 355        palm27x_ac97_init(PALMLD_BAT_MIN_VOLTAGE, PALMLD_BAT_MAX_VOLTAGE,
 356                        GPIO_NR_PALMLD_EARPHONE_DETECT, 95);
 357        palm27x_pwm_init(GPIO_NR_PALMLD_BL_POWER, GPIO_NR_PALMLD_LCD_POWER);
 358        palm27x_power_init(GPIO_NR_PALMLD_POWER_DETECT,
 359                        GPIO_NR_PALMLD_USB_DETECT_N);
 360        palm27x_pmic_init();
 361        palmld_kpc_init();
 362        palmld_keys_init();
 363        palmld_nor_init();
 364        palmld_leds_init();
 365        palmld_ide_init();
 366}
 367
 368MACHINE_START(PALMLD, "Palm LifeDrive")
 369        .atag_offset    = 0x100,
 370        .map_io         = palmld_map_io,
 371        .nr_irqs        = PXA_NR_IRQS,
 372        .init_irq       = pxa27x_init_irq,
 373        .handle_irq     = pxa27x_handle_irq,
 374        .init_time      = pxa_timer_init,
 375        .init_machine   = palmld_init,
 376        .restart        = pxa_restart,
 377MACHINE_END
 378