palmt5.c 5.38 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
/*
 * Hardware definitions for Palm Tungsten|T5
 *
 * Author:	Marek Vasut <marek.vasut@gmail.com>
 *
 * Based on work of:
 *		Ales Snuparek <snuparek@atlas.cz>
 *		Justin Kendrick <twilightsentry@gmail.com>
 *		RichardT5 <richard_t5@users.sourceforge.net>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 * (find more info at www.hackndev.com)
 *
 */

#include <linux/platform_device.h>
#include <linux/delay.h>
#include <linux/irq.h>
#include <linux/gpio_keys.h>
#include <linux/input.h>
24
#include <linux/memblock.h>
25 26 27
#include <linux/pda_power.h>
#include <linux/pwm_backlight.h>
#include <linux/gpio.h>
28
#include <linux/wm97xx.h>
29
#include <linux/power_supply.h>
30
#include <linux/usb/gpio_vbus.h>
31 32 33 34 35

#include <asm/mach-types.h>
#include <asm/mach/arch.h>
#include <asm/mach/map.h>

36
#include <mach/pxa27x.h>
37 38 39 40 41
#include <mach/audio.h>
#include <mach/palmt5.h>
#include <mach/mmc.h>
#include <mach/pxafb.h>
#include <mach/irda.h>
42
#include <plat/pxa27x_keypad.h>
43 44
#include <mach/udc.h>
#include <mach/palmasoc.h>
45
#include <mach/palm27x.h>
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69

#include "generic.h"
#include "devices.h"

/******************************************************************************
 * Pin configuration
 ******************************************************************************/
static unsigned long palmt5_pin_config[] __initdata = {
	/* MMC */
	GPIO32_MMC_CLK,
	GPIO92_MMC_DAT_0,
	GPIO109_MMC_DAT_1,
	GPIO110_MMC_DAT_2,
	GPIO111_MMC_DAT_3,
	GPIO112_MMC_CMD,
	GPIO14_GPIO,	/* SD detect */
	GPIO114_GPIO,	/* SD power */
	GPIO115_GPIO,	/* SD r/o switch */

	/* AC97 */
	GPIO28_AC97_BITCLK,
	GPIO29_AC97_SDATA_IN_0,
	GPIO30_AC97_SDATA_OUT,
	GPIO31_AC97_SYNC,
70
	GPIO89_AC97_SYSCLK,
71
	GPIO95_AC97_nRESET,
72 73 74 75 76 77 78 79

	/* IrDA */
	GPIO40_GPIO,	/* ir disable */
	GPIO46_FICP_RXD,
	GPIO47_FICP_TXD,

	/* USB */
	GPIO15_GPIO,	/* usb detect */
80
	GPIO93_GPIO,	/* usb power */
81 82

	/* MATRIX KEYPAD */
83 84 85 86
	GPIO100_KP_MKIN_0 | WAKEUP_ON_LEVEL_HIGH,
	GPIO101_KP_MKIN_1 | WAKEUP_ON_LEVEL_HIGH,
	GPIO102_KP_MKIN_2 | WAKEUP_ON_LEVEL_HIGH,
	GPIO97_KP_MKIN_3 | WAKEUP_ON_LEVEL_HIGH,
87 88 89 90 91
	GPIO103_KP_MKOUT_0,
	GPIO104_KP_MKOUT_1,
	GPIO105_KP_MKOUT_2,

	/* LCD */
92
	GPIOxx_LCD_TFT_16BPP,
93 94 95 96

	/* PWM */
	GPIO16_PWM0_OUT,

97 98 99 100
	/* FFUART */
	GPIO34_FFUART_RXD,
	GPIO39_FFUART_TXD,

101 102 103 104 105 106 107 108 109
	/* MISC */
	GPIO10_GPIO,	/* hotsync button */
	GPIO90_GPIO,	/* power detect */
	GPIO107_GPIO,	/* earphone detect */
};

/******************************************************************************
 * GPIO keyboard
 ******************************************************************************/
110
#if defined(CONFIG_KEYBOARD_PXA27x) || defined(CONFIG_KEYBOARD_PXA27x_MODULE)
111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
static unsigned int palmt5_matrix_keys[] = {
	KEY(0, 0, KEY_POWER),
	KEY(0, 1, KEY_F1),
	KEY(0, 2, KEY_ENTER),

	KEY(1, 0, KEY_F2),
	KEY(1, 1, KEY_F3),
	KEY(1, 2, KEY_F4),

	KEY(2, 0, KEY_UP),
	KEY(2, 2, KEY_DOWN),

	KEY(3, 0, KEY_RIGHT),
	KEY(3, 2, KEY_LEFT),
};

static struct pxa27x_keypad_platform_data palmt5_keypad_platform_data = {
	.matrix_key_rows	= 4,
	.matrix_key_cols	= 3,
	.matrix_key_map		= palmt5_matrix_keys,
	.matrix_key_map_size	= ARRAY_SIZE(palmt5_matrix_keys),

	.debounce_interval	= 30,
};

136 137 138 139 140 141 142 143
static void __init palmt5_kpc_init(void)
{
	pxa_set_keypad_info(&palmt5_keypad_platform_data);
}
#else
static inline void palmt5_kpc_init(void) {}
#endif

144 145 146
/******************************************************************************
 * GPIO keys
 ******************************************************************************/
147
#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
static struct gpio_keys_button palmt5_pxa_buttons[] = {
	{KEY_F8, GPIO_NR_PALMT5_HOTSYNC_BUTTON_N, 1, "HotSync Button" },
};

static struct gpio_keys_platform_data palmt5_pxa_keys_data = {
	.buttons	= palmt5_pxa_buttons,
	.nbuttons	= ARRAY_SIZE(palmt5_pxa_buttons),
};

static struct platform_device palmt5_pxa_keys = {
	.name	= "gpio-keys",
	.id	= -1,
	.dev	= {
		.platform_data = &palmt5_pxa_keys_data,
	},
};

165
static void __init palmt5_keys_init(void)
166
{
167
	platform_device_register(&palmt5_pxa_keys);
168
}
169 170 171
#else
static inline void palmt5_keys_init(void) {}
#endif
172

173 174 175
/******************************************************************************
 * Machine init
 ******************************************************************************/
176 177
static void __init palmt5_reserve(void)
{
178
	memblock_reserve(0xa0200000, 0x1000);
179 180
}

181 182 183
static void __init palmt5_init(void)
{
	pxa2xx_mfp_config(ARRAY_AND_SIZE(palmt5_pin_config));
184 185 186 187
	pxa_set_ffuart_info(NULL);
	pxa_set_btuart_info(NULL);
	pxa_set_stuart_info(NULL);

188 189 190 191 192 193 194 195 196 197 198 199 200 201
	palm27x_mmc_init(GPIO_NR_PALMT5_SD_DETECT_N, GPIO_NR_PALMT5_SD_READONLY,
			GPIO_NR_PALMT5_SD_POWER, 0);
	palm27x_pm_init(PALMT5_STR_BASE);
	palm27x_lcd_init(-1, &palm_320x480_lcd_mode);
	palm27x_udc_init(GPIO_NR_PALMT5_USB_DETECT_N,
			GPIO_NR_PALMT5_USB_PULLUP, 1);
	palm27x_irda_init(GPIO_NR_PALMT5_IR_DISABLE);
	palm27x_ac97_init(PALMT5_BAT_MIN_VOLTAGE, PALMT5_BAT_MAX_VOLTAGE,
			GPIO_NR_PALMT5_EARPHONE_DETECT, 95);
	palm27x_pwm_init(GPIO_NR_PALMT5_BL_POWER, GPIO_NR_PALMT5_LCD_POWER);
	palm27x_power_init(GPIO_NR_PALMT5_POWER_DETECT, -1);
	palm27x_pmic_init();
	palmt5_kpc_init();
	palmt5_keys_init();
202 203 204 205
}

MACHINE_START(PALMT5, "Palm Tungsten|T5")
	.boot_params	= 0xa0000100,
206
	.map_io		= pxa27x_map_io,
207
	.reserve	= palmt5_reserve,
208
	.init_irq	= pxa27x_init_irq,
209
	.handle_irq	= pxa27x_handle_irq,
210 211 212
	.timer		= &pxa_timer,
	.init_machine	= palmt5_init
MACHINE_END