board-palmte.c 6.0 KB
Newer Older
1 2 3 4 5 6 7 8 9
/*
 * linux/arch/arm/mach-omap1/board-palmte.c
 *
 * Modified from board-generic.c
 *
 * Support for the Palm Tungsten E PDA.
 *
 * Original version : Laurent Gonzalez
 *
S
Simon Arlott 已提交
10
 * Maintainers : http://palmtelinux.sf.net
11 12
 *                palmtelinux-developpers@lists.sf.net
 *
13 14
 * Copyright (c) 2006 Andrzej Zaborowski  <balrog@zabor.org>
 *
15 16 17 18
 * 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.
 */
19
#include <linux/gpio.h>
20 21
#include <linux/kernel.h>
#include <linux/init.h>
22
#include <linux/input.h>
23
#include <linux/platform_device.h>
24 25
#include <linux/mtd/mtd.h>
#include <linux/mtd/partitions.h>
26
#include <linux/mtd/physmap.h>
27 28
#include <linux/spi/spi.h>
#include <linux/interrupt.h>
29
#include <linux/apm-emulation.h>
30
#include <linux/omapfb.h>
31
#include <linux/platform_data/omap1_bl.h>
32 33 34 35 36

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

37
#include <mach/flash.h>
38
#include <mach/mux.h>
39
#include <mach/tc.h>
40
#include <linux/omap-dma.h>
41
#include <linux/platform_data/keypad-omap.h>
42 43

#include <mach/hardware.h>
44
#include <mach/usb.h>
45

46
#include "common.h"
47

48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
#define PALMTE_USBDETECT_GPIO	0
#define PALMTE_USB_OR_DC_GPIO	1
#define PALMTE_TSC_GPIO		4
#define PALMTE_PINTDAV_GPIO	6
#define PALMTE_MMC_WP_GPIO	8
#define PALMTE_MMC_POWER_GPIO	9
#define PALMTE_HDQ_GPIO		11
#define PALMTE_HEADPHONES_GPIO	14
#define PALMTE_SPEAKER_GPIO	15
#define PALMTE_DC_GPIO		OMAP_MPUIO(2)
#define PALMTE_MMC_SWITCH_GPIO	OMAP_MPUIO(4)
#define PALMTE_MMC1_GPIO	OMAP_MPUIO(6)
#define PALMTE_MMC2_GPIO	OMAP_MPUIO(7)
#define PALMTE_MMC3_GPIO	OMAP_MPUIO(11)

63
static const unsigned int palmte_keymap[] = {
64
	KEY(0, 0, KEY_F1),		/* Calendar */
65 66 67 68 69
	KEY(1, 0, KEY_F2),		/* Contacts */
	KEY(2, 0, KEY_F3),		/* Tasks List */
	KEY(3, 0, KEY_F4),		/* Note Pad */
	KEY(4, 0, KEY_POWER),
	KEY(0, 1, KEY_LEFT),
70
	KEY(1, 1, KEY_DOWN),
71 72 73 74 75 76 77 78
	KEY(2, 1, KEY_UP),
	KEY(3, 1, KEY_RIGHT),
	KEY(4, 1, KEY_ENTER),
};

static const struct matrix_keymap_data palmte_keymap_data = {
	.keymap		= palmte_keymap,
	.keymap_size	= ARRAY_SIZE(palmte_keymap),
79 80 81 82 83
};

static struct omap_kp_platform_data palmte_kp_data = {
	.rows	= 8,
	.cols	= 8,
84 85
	.keymap_data = &palmte_keymap_data,
	.rep	= true,
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
	.delay	= 12,
};

static struct resource palmte_kp_resources[] = {
	[0]	= {
		.start	= INT_KEYBOARD,
		.end	= INT_KEYBOARD,
		.flags	= IORESOURCE_IRQ,
	},
};

static struct platform_device palmte_kp_device = {
	.name		= "omap-keypad",
	.id		= -1,
	.dev		= {
		.platform_data	= &palmte_kp_data,
	},
	.num_resources	= ARRAY_SIZE(palmte_kp_resources),
	.resource	= palmte_kp_resources,
};

static struct mtd_partition palmte_rom_partitions[] = {
	/* PalmOS "Small ROM", contains the bootloader and the debugger */
	{
		.name		= "smallrom",
		.offset		= 0,
		.size		= 0xa000,
		.mask_flags	= MTD_WRITEABLE,
	},
	/* PalmOS "Big ROM", a filesystem with all the OS code and data */
	{
		.name		= "bigrom",
		.offset		= SZ_128K,
		/*
		 * 0x5f0000 bytes big in the multi-language ("EFIGS") version,
		 * 0x7b0000 bytes in the English-only ("enUS") version.
		 */
		.size		= 0x7b0000,
		.mask_flags	= MTD_WRITEABLE,
	},
};

128
static struct physmap_flash_data palmte_rom_data = {
129
	.width		= 2,
130
	.set_vpp	= omap1_set_vpp,
131 132 133 134 135 136 137 138 139 140 141
	.parts		= palmte_rom_partitions,
	.nr_parts	= ARRAY_SIZE(palmte_rom_partitions),
};

static struct resource palmte_rom_resource = {
	.start		= OMAP_CS0_PHYS,
	.end		= OMAP_CS0_PHYS + SZ_8M - 1,
	.flags		= IORESOURCE_MEM,
};

static struct platform_device palmte_rom_device = {
142
	.name		= "physmap-flash",
143 144 145 146 147 148 149 150
	.id		= -1,
	.dev		= {
		.platform_data	= &palmte_rom_data,
	},
	.num_resources	= 1,
	.resource	= &palmte_rom_resource,
};

151 152 153 154 155
static struct platform_device palmte_lcd_device = {
	.name		= "lcd_palmte",
	.id		= -1,
};

156 157 158 159 160 161 162 163 164 165 166 167
static struct omap_backlight_config palmte_backlight_config = {
	.default_intensity	= 0xa0,
};

static struct platform_device palmte_backlight_device = {
	.name		= "omap-bl",
	.id		= -1,
	.dev		= {
		.platform_data	= &palmte_backlight_config,
	},
};

168
static struct platform_device *palmte_devices[] __initdata = {
169 170
	&palmte_rom_device,
	&palmte_kp_device,
171
	&palmte_lcd_device,
172
	&palmte_backlight_device,
173 174
};

175
static struct omap_usb_config palmte_usb_config __initdata = {
176
	.register_dev	= 1,	/* Mini-B only receptacle */
177
	.hmc_mode	= 0,
178
	.pins[0]	= 2,
179 180 181 182 183 184
};

static struct omap_lcd_config palmte_lcd_config __initdata = {
	.ctrl_name	= "internal",
};

185 186 187 188 189 190 191 192 193
static struct spi_board_info palmte_spi_info[] __initdata = {
	{
		.modalias	= "tsc2102",
		.bus_num	= 2,	/* uWire (officially) */
		.chip_select	= 0,	/* As opposed to 3 */
		.max_speed_hz	= 8000000,
	},
};

194
static void __init palmte_misc_gpio_setup(void)
195
{
196
	/* Set TSC2102 PINTDAV pin as input (used by TSC2102 driver) */
197
	if (gpio_request(PALMTE_PINTDAV_GPIO, "TSC2102 PINTDAV") < 0) {
198 199 200
		printk(KERN_ERR "Could not reserve PINTDAV GPIO!\n");
		return;
	}
201
	gpio_direction_input(PALMTE_PINTDAV_GPIO);
202

203
	/* Set USB-or-DC-IN pin as input (unused) */
204
	if (gpio_request(PALMTE_USB_OR_DC_GPIO, "USB/DC-IN") < 0) {
205 206 207
		printk(KERN_ERR "Could not reserve cable signal GPIO!\n");
		return;
	}
208
	gpio_direction_input(PALMTE_USB_OR_DC_GPIO);
209 210 211
}

static void __init omap_palmte_init(void)
212
{
213 214 215 216 217 218 219 220
	/* mux pins for uarts */
	omap_cfg_reg(UART1_TX);
	omap_cfg_reg(UART1_RTS);
	omap_cfg_reg(UART2_TX);
	omap_cfg_reg(UART2_RTS);
	omap_cfg_reg(UART3_TX);
	omap_cfg_reg(UART3_RX);

221
	platform_add_devices(palmte_devices, ARRAY_SIZE(palmte_devices));
222

223
	palmte_spi_info[0].irq = gpio_to_irq(PALMTE_PINTDAV_GPIO);
224
	spi_register_board_info(palmte_spi_info, ARRAY_SIZE(palmte_spi_info));
225
	palmte_misc_gpio_setup();
226
	omap_serial_init();
227
	omap1_usb_init(&palmte_usb_config);
228
	omap_register_i2c_bus(1, 100, NULL, 0);
229 230

	omapfb_set_lcd_config(&palmte_lcd_config);
231 232 233
}

MACHINE_START(OMAP_PALMTE, "OMAP310 based Palm Tungsten E")
234
	.atag_offset	= 0x100,
235 236 237
	.map_io		= omap15xx_map_io,
	.init_early     = omap1_init_early,
	.init_irq	= omap1_init_irq,
238
	.handle_irq	= omap1_handle_irq,
239
	.init_machine	= omap_palmte_init,
240
	.init_late	= omap1_init_late,
S
Stephen Warren 已提交
241
	.init_time	= omap1_timer_init,
242
	.restart	= omap1_restart,
243
MACHINE_END