linux/arch/arm/mach-pxa/palmt5.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Hardware definitions for Palm Tungsten|T5
   4 *
   5 * Author:      Marek Vasut <marek.vasut@gmail.com>
   6 *
   7 * Based on work of:
   8 *              Ales Snuparek <snuparek@atlas.cz>
   9 *              Justin Kendrick <twilightsentry@gmail.com>
  10 *              RichardT5 <richard_t5@users.sourceforge.net>
  11 *
  12 * (find more info at www.hackndev.com)
  13 */
  14
  15#include <linux/platform_device.h>
  16#include <linux/delay.h>
  17#include <linux/irq.h>
  18#include <linux/gpio_keys.h>
  19#include <linux/input.h>
  20#include <linux/memblock.h>
  21#include <linux/pda_power.h>
  22#include <linux/pwm_backlight.h>
  23#include <linux/gpio.h>
  24#include <linux/wm97xx.h>
  25#include <linux/power_supply.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 "palmt5.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 "udc.h"
  39#include <linux/platform_data/asoc-palm27x.h>
  40#include "palm27x.h"
  41
  42#include "generic.h"
  43#include "devices.h"
  44
  45/******************************************************************************
  46 * Pin configuration
  47 ******************************************************************************/
  48static unsigned long palmt5_pin_config[] __initdata = {
  49        /* MMC */
  50        GPIO32_MMC_CLK,
  51        GPIO92_MMC_DAT_0,
  52        GPIO109_MMC_DAT_1,
  53        GPIO110_MMC_DAT_2,
  54        GPIO111_MMC_DAT_3,
  55        GPIO112_MMC_CMD,
  56        GPIO14_GPIO,    /* SD detect */
  57        GPIO114_GPIO,   /* SD power */
  58        GPIO115_GPIO,   /* SD r/o switch */
  59
  60        /* AC97 */
  61        GPIO28_AC97_BITCLK,
  62        GPIO29_AC97_SDATA_IN_0,
  63        GPIO30_AC97_SDATA_OUT,
  64        GPIO31_AC97_SYNC,
  65        GPIO89_AC97_SYSCLK,
  66        GPIO95_AC97_nRESET,
  67
  68        /* IrDA */
  69        GPIO40_GPIO,    /* ir disable */
  70        GPIO46_FICP_RXD,
  71        GPIO47_FICP_TXD,
  72
  73        /* USB */
  74        GPIO15_GPIO,    /* usb detect */
  75        GPIO93_GPIO,    /* usb power */
  76
  77        /* MATRIX KEYPAD */
  78        GPIO100_KP_MKIN_0 | WAKEUP_ON_LEVEL_HIGH,
  79        GPIO101_KP_MKIN_1 | WAKEUP_ON_LEVEL_HIGH,
  80        GPIO102_KP_MKIN_2 | WAKEUP_ON_LEVEL_HIGH,
  81        GPIO97_KP_MKIN_3 | WAKEUP_ON_LEVEL_HIGH,
  82        GPIO103_KP_MKOUT_0,
  83        GPIO104_KP_MKOUT_1,
  84        GPIO105_KP_MKOUT_2,
  85
  86        /* LCD */
  87        GPIOxx_LCD_TFT_16BPP,
  88
  89        /* PWM */
  90        GPIO16_PWM0_OUT,
  91
  92        /* FFUART */
  93        GPIO34_FFUART_RXD,
  94        GPIO39_FFUART_TXD,
  95
  96        /* MISC */
  97        GPIO10_GPIO,    /* hotsync button */
  98        GPIO90_GPIO,    /* power detect */
  99        GPIO107_GPIO,   /* earphone detect */
 100};
 101
 102/******************************************************************************
 103 * GPIO keyboard
 104 ******************************************************************************/
 105#if defined(CONFIG_KEYBOARD_PXA27x) || defined(CONFIG_KEYBOARD_PXA27x_MODULE)
 106static const unsigned int palmt5_matrix_keys[] = {
 107        KEY(0, 0, KEY_POWER),
 108        KEY(0, 1, KEY_F1),
 109        KEY(0, 2, KEY_ENTER),
 110
 111        KEY(1, 0, KEY_F2),
 112        KEY(1, 1, KEY_F3),
 113        KEY(1, 2, KEY_F4),
 114
 115        KEY(2, 0, KEY_UP),
 116        KEY(2, 2, KEY_DOWN),
 117
 118        KEY(3, 0, KEY_RIGHT),
 119        KEY(3, 2, KEY_LEFT),
 120};
 121
 122static struct matrix_keymap_data palmt5_matrix_keymap_data = {
 123        .keymap                 = palmt5_matrix_keys,
 124        .keymap_size            = ARRAY_SIZE(palmt5_matrix_keys),
 125};
 126
 127static struct pxa27x_keypad_platform_data palmt5_keypad_platform_data = {
 128        .matrix_key_rows        = 4,
 129        .matrix_key_cols        = 3,
 130        .matrix_keymap_data     = &palmt5_matrix_keymap_data,
 131
 132        .debounce_interval      = 30,
 133};
 134
 135static void __init palmt5_kpc_init(void)
 136{
 137        pxa_set_keypad_info(&palmt5_keypad_platform_data);
 138}
 139#else
 140static inline void palmt5_kpc_init(void) {}
 141#endif
 142
 143/******************************************************************************
 144 * GPIO keys
 145 ******************************************************************************/
 146#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
 147static struct gpio_keys_button palmt5_pxa_buttons[] = {
 148        {KEY_F8, GPIO_NR_PALMT5_HOTSYNC_BUTTON_N, 1, "HotSync Button" },
 149};
 150
 151static struct gpio_keys_platform_data palmt5_pxa_keys_data = {
 152        .buttons        = palmt5_pxa_buttons,
 153        .nbuttons       = ARRAY_SIZE(palmt5_pxa_buttons),
 154};
 155
 156static struct platform_device palmt5_pxa_keys = {
 157        .name   = "gpio-keys",
 158        .id     = -1,
 159        .dev    = {
 160                .platform_data = &palmt5_pxa_keys_data,
 161        },
 162};
 163
 164static void __init palmt5_keys_init(void)
 165{
 166        platform_device_register(&palmt5_pxa_keys);
 167}
 168#else
 169static inline void palmt5_keys_init(void) {}
 170#endif
 171
 172/******************************************************************************
 173 * Machine init
 174 ******************************************************************************/
 175static void __init palmt5_reserve(void)
 176{
 177        memblock_reserve(0xa0200000, 0x1000);
 178}
 179
 180static struct gpiod_lookup_table palmt5_mci_gpio_table = {
 181        .dev_id = "pxa2xx-mci.0",
 182        .table = {
 183                GPIO_LOOKUP("gpio-pxa", GPIO_NR_PALMT5_SD_DETECT_N,
 184                            "cd", GPIO_ACTIVE_LOW),
 185                GPIO_LOOKUP("gpio-pxa", GPIO_NR_PALMT5_SD_READONLY,
 186                            "wp", GPIO_ACTIVE_LOW),
 187                GPIO_LOOKUP("gpio-pxa", GPIO_NR_PALMT5_SD_POWER,
 188                            "power", GPIO_ACTIVE_HIGH),
 189                { },
 190        },
 191};
 192
 193static void __init palmt5_init(void)
 194{
 195        pxa2xx_mfp_config(ARRAY_AND_SIZE(palmt5_pin_config));
 196        pxa_set_ffuart_info(NULL);
 197        pxa_set_btuart_info(NULL);
 198        pxa_set_stuart_info(NULL);
 199
 200        palm27x_mmc_init(&palmt5_mci_gpio_table);
 201        palm27x_pm_init(PALMT5_STR_BASE);
 202        palm27x_lcd_init(-1, &palm_320x480_lcd_mode);
 203        palm27x_udc_init(GPIO_NR_PALMT5_USB_DETECT_N,
 204                        GPIO_NR_PALMT5_USB_PULLUP, 1);
 205        palm27x_irda_init(GPIO_NR_PALMT5_IR_DISABLE);
 206        palm27x_ac97_init(PALMT5_BAT_MIN_VOLTAGE, PALMT5_BAT_MAX_VOLTAGE,
 207                        GPIO_NR_PALMT5_EARPHONE_DETECT, 95);
 208        palm27x_pwm_init(GPIO_NR_PALMT5_BL_POWER, GPIO_NR_PALMT5_LCD_POWER);
 209        palm27x_power_init(GPIO_NR_PALMT5_POWER_DETECT, -1);
 210        palm27x_pmic_init();
 211        palmt5_kpc_init();
 212        palmt5_keys_init();
 213}
 214
 215MACHINE_START(PALMT5, "Palm Tungsten|T5")
 216        .atag_offset    = 0x100,
 217        .map_io         = pxa27x_map_io,
 218        .reserve        = palmt5_reserve,
 219        .nr_irqs        = PXA_NR_IRQS,
 220        .init_irq       = pxa27x_init_irq,
 221        .handle_irq     = pxa27x_handle_irq,
 222        .init_time      = pxa_timer_init,
 223        .init_machine   = palmt5_init,
 224        .restart        = pxa_restart,
 225MACHINE_END
 226