xref: /openbmc/linux/arch/arm/mach-omap1/board-palmte.c (revision ec44dfa866cc9779b83e9eab9efe6f7d48966eb8)
13179a019STony Lindgren /*
23179a019STony Lindgren  * linux/arch/arm/mach-omap1/board-palmte.c
33179a019STony Lindgren  *
43179a019STony Lindgren  * Modified from board-generic.c
53179a019STony Lindgren  *
63179a019STony Lindgren  * Support for the Palm Tungsten E PDA.
73179a019STony Lindgren  *
83179a019STony Lindgren  * Original version : Laurent Gonzalez
93179a019STony Lindgren  *
106cbdc8c5SSimon Arlott  * Maintainers : http://palmtelinux.sf.net
113179a019STony Lindgren  *                palmtelinux-developpers@lists.sf.net
123179a019STony Lindgren  *
13d7730cc0SAndrzej Zaborowski  * Copyright (c) 2006 Andrzej Zaborowski  <balrog@zabor.org>
14d7730cc0SAndrzej Zaborowski  *
153179a019STony Lindgren  * This program is free software; you can redistribute it and/or modify
163179a019STony Lindgren  * it under the terms of the GNU General Public License version 2 as
173179a019STony Lindgren  * published by the Free Software Foundation.
183179a019STony Lindgren  */
193179a019STony Lindgren 
203179a019STony Lindgren #include <linux/kernel.h>
213179a019STony Lindgren #include <linux/init.h>
22c3695015SAndrzej Zaborowski #include <linux/input.h>
233179a019STony Lindgren #include <linux/platform_device.h>
24c3695015SAndrzej Zaborowski #include <linux/mtd/mtd.h>
25c3695015SAndrzej Zaborowski #include <linux/mtd/partitions.h>
26c3695015SAndrzej Zaborowski #include <linux/spi/spi.h>
27c3695015SAndrzej Zaborowski #include <linux/spi/tsc2102.h>
28c3695015SAndrzej Zaborowski #include <linux/interrupt.h>
29d7730cc0SAndrzej Zaborowski #include <linux/apm-emulation.h>
303179a019STony Lindgren 
313179a019STony Lindgren #include <asm/hardware.h>
323179a019STony Lindgren #include <asm/mach-types.h>
333179a019STony Lindgren #include <asm/mach/arch.h>
343179a019STony Lindgren #include <asm/mach/map.h>
35c3695015SAndrzej Zaborowski #include <asm/mach/flash.h>
363179a019STony Lindgren 
373179a019STony Lindgren #include <asm/arch/gpio.h>
383179a019STony Lindgren #include <asm/arch/mux.h>
393179a019STony Lindgren #include <asm/arch/usb.h>
40c3695015SAndrzej Zaborowski #include <asm/arch/tc.h>
41c3695015SAndrzej Zaborowski #include <asm/arch/dma.h>
423179a019STony Lindgren #include <asm/arch/board.h>
43c3695015SAndrzej Zaborowski #include <asm/arch/irda.h>
44c3695015SAndrzej Zaborowski #include <asm/arch/keypad.h>
453179a019STony Lindgren #include <asm/arch/common.h>
46c3695015SAndrzej Zaborowski #include <asm/arch/mcbsp.h>
47c3695015SAndrzej Zaborowski #include <asm/arch/omap-alsa.h>
483179a019STony Lindgren 
49c3695015SAndrzej Zaborowski static void __init omap_palmte_init_irq(void)
503179a019STony Lindgren {
5187bd63f6STony Lindgren 	omap1_init_common_hw();
523179a019STony Lindgren 	omap_init_irq();
53c3695015SAndrzej Zaborowski 	omap_gpio_init();
543179a019STony Lindgren }
553179a019STony Lindgren 
56d7730cc0SAndrzej Zaborowski static const int palmte_keymap[] = {
57d7730cc0SAndrzej Zaborowski 	KEY(0, 0, KEY_F1),		/* Calendar */
58d7730cc0SAndrzej Zaborowski 	KEY(0, 1, KEY_F2),		/* Contacts */
59d7730cc0SAndrzej Zaborowski 	KEY(0, 2, KEY_F3),		/* Tasks List */
60d7730cc0SAndrzej Zaborowski 	KEY(0, 3, KEY_F4),		/* Note Pad */
61c3695015SAndrzej Zaborowski 	KEY(0, 4, KEY_POWER),
62c3695015SAndrzej Zaborowski 	KEY(1, 0, KEY_LEFT),
63c3695015SAndrzej Zaborowski 	KEY(1, 1, KEY_DOWN),
64c3695015SAndrzej Zaborowski 	KEY(1, 2, KEY_UP),
65c3695015SAndrzej Zaborowski 	KEY(1, 3, KEY_RIGHT),
66*ec44dfa8SEduardo Valentin 	KEY(1, 4, KEY_ENTER),
67c3695015SAndrzej Zaborowski 	0,
68c3695015SAndrzej Zaborowski };
69c3695015SAndrzej Zaborowski 
70c3695015SAndrzej Zaborowski static struct omap_kp_platform_data palmte_kp_data = {
71c3695015SAndrzej Zaborowski 	.rows	= 8,
72c3695015SAndrzej Zaborowski 	.cols	= 8,
73d7730cc0SAndrzej Zaborowski 	.keymap = (int *) palmte_keymap,
74c3695015SAndrzej Zaborowski 	.rep	= 1,
75c3695015SAndrzej Zaborowski 	.delay	= 12,
76c3695015SAndrzej Zaborowski };
77c3695015SAndrzej Zaborowski 
78c3695015SAndrzej Zaborowski static struct resource palmte_kp_resources[] = {
79c3695015SAndrzej Zaborowski 	[0]	= {
80c3695015SAndrzej Zaborowski 		.start	= INT_KEYBOARD,
81c3695015SAndrzej Zaborowski 		.end	= INT_KEYBOARD,
82c3695015SAndrzej Zaborowski 		.flags	= IORESOURCE_IRQ,
83c3695015SAndrzej Zaborowski 	},
84c3695015SAndrzej Zaborowski };
85c3695015SAndrzej Zaborowski 
86c3695015SAndrzej Zaborowski static struct platform_device palmte_kp_device = {
87c3695015SAndrzej Zaborowski 	.name		= "omap-keypad",
88c3695015SAndrzej Zaborowski 	.id		= -1,
89c3695015SAndrzej Zaborowski 	.dev		= {
90c3695015SAndrzej Zaborowski 		.platform_data	= &palmte_kp_data,
91c3695015SAndrzej Zaborowski 	},
92c3695015SAndrzej Zaborowski 	.num_resources	= ARRAY_SIZE(palmte_kp_resources),
93c3695015SAndrzej Zaborowski 	.resource	= palmte_kp_resources,
94c3695015SAndrzej Zaborowski };
95c3695015SAndrzej Zaborowski 
96c3695015SAndrzej Zaborowski static struct mtd_partition palmte_rom_partitions[] = {
97c3695015SAndrzej Zaborowski 	/* PalmOS "Small ROM", contains the bootloader and the debugger */
98c3695015SAndrzej Zaborowski 	{
99c3695015SAndrzej Zaborowski 		.name		= "smallrom",
100c3695015SAndrzej Zaborowski 		.offset		= 0,
101c3695015SAndrzej Zaborowski 		.size		= 0xa000,
102c3695015SAndrzej Zaborowski 		.mask_flags	= MTD_WRITEABLE,
103c3695015SAndrzej Zaborowski 	},
104c3695015SAndrzej Zaborowski 	/* PalmOS "Big ROM", a filesystem with all the OS code and data */
105c3695015SAndrzej Zaborowski 	{
106c3695015SAndrzej Zaborowski 		.name		= "bigrom",
107c3695015SAndrzej Zaborowski 		.offset		= SZ_128K,
108c3695015SAndrzej Zaborowski 		/*
109c3695015SAndrzej Zaborowski 		 * 0x5f0000 bytes big in the multi-language ("EFIGS") version,
110c3695015SAndrzej Zaborowski 		 * 0x7b0000 bytes in the English-only ("enUS") version.
111c3695015SAndrzej Zaborowski 		 */
112c3695015SAndrzej Zaborowski 		.size		= 0x7b0000,
113c3695015SAndrzej Zaborowski 		.mask_flags	= MTD_WRITEABLE,
114c3695015SAndrzej Zaborowski 	},
115c3695015SAndrzej Zaborowski };
116c3695015SAndrzej Zaborowski 
117c3695015SAndrzej Zaborowski static struct flash_platform_data palmte_rom_data = {
118c3695015SAndrzej Zaborowski 	.map_name	= "map_rom",
119c3695015SAndrzej Zaborowski 	.width		= 2,
120c3695015SAndrzej Zaborowski 	.parts		= palmte_rom_partitions,
121c3695015SAndrzej Zaborowski 	.nr_parts	= ARRAY_SIZE(palmte_rom_partitions),
122c3695015SAndrzej Zaborowski };
123c3695015SAndrzej Zaborowski 
124c3695015SAndrzej Zaborowski static struct resource palmte_rom_resource = {
125c3695015SAndrzej Zaborowski 	.start		= OMAP_CS0_PHYS,
126c3695015SAndrzej Zaborowski 	.end		= OMAP_CS0_PHYS + SZ_8M - 1,
127c3695015SAndrzej Zaborowski 	.flags		= IORESOURCE_MEM,
128c3695015SAndrzej Zaborowski };
129c3695015SAndrzej Zaborowski 
130c3695015SAndrzej Zaborowski static struct platform_device palmte_rom_device = {
131c3695015SAndrzej Zaborowski 	.name		= "omapflash",
132c3695015SAndrzej Zaborowski 	.id		= -1,
133c3695015SAndrzej Zaborowski 	.dev		= {
134c3695015SAndrzej Zaborowski 		.platform_data	= &palmte_rom_data,
135c3695015SAndrzej Zaborowski 	},
136c3695015SAndrzej Zaborowski 	.num_resources	= 1,
137c3695015SAndrzej Zaborowski 	.resource	= &palmte_rom_resource,
138c3695015SAndrzej Zaborowski };
139c3695015SAndrzej Zaborowski 
1409b6553cdSTony Lindgren static struct platform_device palmte_lcd_device = {
1419b6553cdSTony Lindgren 	.name		= "lcd_palmte",
1429b6553cdSTony Lindgren 	.id		= -1,
1439b6553cdSTony Lindgren };
1449b6553cdSTony Lindgren 
145c3695015SAndrzej Zaborowski static struct omap_backlight_config palmte_backlight_config = {
146c3695015SAndrzej Zaborowski 	.default_intensity	= 0xa0,
147c3695015SAndrzej Zaborowski };
148c3695015SAndrzej Zaborowski 
149c3695015SAndrzej Zaborowski static struct platform_device palmte_backlight_device = {
150c3695015SAndrzej Zaborowski 	.name		= "omap-bl",
151c3695015SAndrzej Zaborowski 	.id		= -1,
152c3695015SAndrzej Zaborowski 	.dev		= {
153c3695015SAndrzej Zaborowski 		.platform_data	= &palmte_backlight_config,
154c3695015SAndrzej Zaborowski 	},
155c3695015SAndrzej Zaborowski };
156c3695015SAndrzej Zaborowski 
157c3695015SAndrzej Zaborowski static struct omap_irda_config palmte_irda_config = {
158c3695015SAndrzej Zaborowski 	.transceiver_cap	= IR_SIRMODE,
159c3695015SAndrzej Zaborowski 	.rx_channel		= OMAP_DMA_UART3_RX,
160c3695015SAndrzej Zaborowski 	.tx_channel		= OMAP_DMA_UART3_TX,
161c3695015SAndrzej Zaborowski 	.dest_start		= UART3_THR,
162c3695015SAndrzej Zaborowski 	.src_start		= UART3_RHR,
163c3695015SAndrzej Zaborowski 	.tx_trigger		= 0,
164c3695015SAndrzej Zaborowski 	.rx_trigger		= 0,
165c3695015SAndrzej Zaborowski };
166c3695015SAndrzej Zaborowski 
167c3695015SAndrzej Zaborowski static struct resource palmte_irda_resources[] = {
168c3695015SAndrzej Zaborowski 	[0]	= {
169c3695015SAndrzej Zaborowski 		.start	= INT_UART3,
170c3695015SAndrzej Zaborowski 		.end	= INT_UART3,
171c3695015SAndrzej Zaborowski 		.flags	= IORESOURCE_IRQ,
172c3695015SAndrzej Zaborowski 	},
173c3695015SAndrzej Zaborowski };
174c3695015SAndrzej Zaborowski 
175c3695015SAndrzej Zaborowski static struct platform_device palmte_irda_device = {
176c3695015SAndrzej Zaborowski 	.name		= "omapirda",
177c3695015SAndrzej Zaborowski 	.id		= -1,
178c3695015SAndrzej Zaborowski 	.dev		= {
179c3695015SAndrzej Zaborowski 		.platform_data	= &palmte_irda_config,
180c3695015SAndrzej Zaborowski 	},
181c3695015SAndrzej Zaborowski 	.num_resources	= ARRAY_SIZE(palmte_irda_resources),
182c3695015SAndrzej Zaborowski 	.resource	= palmte_irda_resources,
183c3695015SAndrzej Zaborowski };
184c3695015SAndrzej Zaborowski 
185d7730cc0SAndrzej Zaborowski static struct platform_device *palmte_devices[] __initdata = {
186c3695015SAndrzej Zaborowski 	&palmte_rom_device,
187c3695015SAndrzej Zaborowski 	&palmte_kp_device,
1889b6553cdSTony Lindgren 	&palmte_lcd_device,
189c3695015SAndrzej Zaborowski 	&palmte_backlight_device,
190c3695015SAndrzej Zaborowski 	&palmte_irda_device,
1919b6553cdSTony Lindgren };
1929b6553cdSTony Lindgren 
1933179a019STony Lindgren static struct omap_usb_config palmte_usb_config __initdata = {
194c3695015SAndrzej Zaborowski 	.register_dev	= 1,	/* Mini-B only receptacle */
1953179a019STony Lindgren 	.hmc_mode	= 0,
196c3695015SAndrzej Zaborowski 	.pins[0]	= 2,
1973179a019STony Lindgren };
1983179a019STony Lindgren 
1993179a019STony Lindgren static struct omap_mmc_config palmte_mmc_config __initdata = {
2003179a019STony Lindgren 	.mmc[0]		= {
2013179a019STony Lindgren 		.enabled 	= 1,
202c3695015SAndrzej Zaborowski 		.wp_pin		= PALMTE_MMC_WP_GPIO,
203c3695015SAndrzej Zaborowski 		.power_pin	= PALMTE_MMC_POWER_GPIO,
204c3695015SAndrzej Zaborowski 		.switch_pin	= PALMTE_MMC_SWITCH_GPIO,
2053179a019STony Lindgren 	},
2063179a019STony Lindgren };
2073179a019STony Lindgren 
2083179a019STony Lindgren static struct omap_lcd_config palmte_lcd_config __initdata = {
2093179a019STony Lindgren 	.ctrl_name	= "internal",
2103179a019STony Lindgren };
2113179a019STony Lindgren 
212c3695015SAndrzej Zaborowski static struct omap_uart_config palmte_uart_config __initdata = {
213c3695015SAndrzej Zaborowski 	.enabled_uarts = (1 << 0) | (1 << 1) | (0 << 2),
214c3695015SAndrzej Zaborowski };
215c3695015SAndrzej Zaborowski 
216c3695015SAndrzej Zaborowski static struct omap_mcbsp_reg_cfg palmte_mcbsp1_regs = {
217c3695015SAndrzej Zaborowski 	.spcr2	= FRST | GRST | XRST | XINTM(3),
218c3695015SAndrzej Zaborowski 	.xcr2	= XDATDLY(1) | XFIG,
219c3695015SAndrzej Zaborowski 	.xcr1	= XWDLEN1(OMAP_MCBSP_WORD_32),
220c3695015SAndrzej Zaborowski 	.pcr0	= SCLKME | FSXP | CLKXP,
221c3695015SAndrzej Zaborowski };
222c3695015SAndrzej Zaborowski 
223c3695015SAndrzej Zaborowski static struct omap_alsa_codec_config palmte_alsa_config = {
224c3695015SAndrzej Zaborowski 	.name			= "TSC2102 audio",
225c3695015SAndrzej Zaborowski 	.mcbsp_regs_alsa	= &palmte_mcbsp1_regs,
226c3695015SAndrzej Zaborowski 	.codec_configure_dev	= NULL,	/* tsc2102_configure, */
227c3695015SAndrzej Zaborowski 	.codec_set_samplerate	= NULL,	/* tsc2102_set_samplerate, */
228c3695015SAndrzej Zaborowski 	.codec_clock_setup	= NULL,	/* tsc2102_clock_setup, */
229c3695015SAndrzej Zaborowski 	.codec_clock_on		= NULL,	/* tsc2102_clock_on, */
230c3695015SAndrzej Zaborowski 	.codec_clock_off	= NULL,	/* tsc2102_clock_off, */
231c3695015SAndrzej Zaborowski 	.get_default_samplerate	= NULL,	/* tsc2102_get_default_samplerate, */
232c3695015SAndrzej Zaborowski };
233c3695015SAndrzej Zaborowski 
234c3695015SAndrzej Zaborowski #ifdef CONFIG_APM
235c3695015SAndrzej Zaborowski /*
236c3695015SAndrzej Zaborowski  * Values measured in 10 minute intervals averaged over 10 samples.
237c3695015SAndrzej Zaborowski  * May differ slightly from device to device but should be accurate
238c3695015SAndrzej Zaborowski  * enough to give basic idea of battery life left and trigger
239c3695015SAndrzej Zaborowski  * potential alerts.
240c3695015SAndrzej Zaborowski  */
241c3695015SAndrzej Zaborowski static const int palmte_battery_sample[] = {
242c3695015SAndrzej Zaborowski 	2194, 2157, 2138, 2120,
243c3695015SAndrzej Zaborowski 	2104, 2089, 2075, 2061,
244c3695015SAndrzej Zaborowski 	2048, 2038, 2026, 2016,
245c3695015SAndrzej Zaborowski 	2008, 1998, 1989, 1980,
246c3695015SAndrzej Zaborowski 	1970, 1958, 1945, 1928,
247c3695015SAndrzej Zaborowski 	1910, 1888, 1860, 1827,
248c3695015SAndrzej Zaborowski 	1791, 1751, 1709, 1656,
249c3695015SAndrzej Zaborowski };
250c3695015SAndrzej Zaborowski 
251c3695015SAndrzej Zaborowski #define INTERVAL		10
252c3695015SAndrzej Zaborowski #define BATTERY_HIGH_TRESHOLD	66
253c3695015SAndrzej Zaborowski #define BATTERY_LOW_TRESHOLD	33
254c3695015SAndrzej Zaborowski 
255c3695015SAndrzej Zaborowski static void palmte_get_power_status(struct apm_power_info *info, int *battery)
256c3695015SAndrzej Zaborowski {
257c3695015SAndrzej Zaborowski 	int charging, batt, hi, lo, mid;
258c3695015SAndrzej Zaborowski 
259c3695015SAndrzej Zaborowski 	charging = !omap_get_gpio_datain(PALMTE_DC_GPIO);
260c3695015SAndrzej Zaborowski 	batt = battery[0];
261c3695015SAndrzej Zaborowski 	if (charging)
262c3695015SAndrzej Zaborowski 		batt -= 60;
263c3695015SAndrzej Zaborowski 
264c3695015SAndrzej Zaborowski 	hi = ARRAY_SIZE(palmte_battery_sample);
265c3695015SAndrzej Zaborowski 	lo = 0;
266c3695015SAndrzej Zaborowski 
267c3695015SAndrzej Zaborowski 	info->battery_flag = 0;
268c3695015SAndrzej Zaborowski 	info->units = APM_UNITS_MINS;
269c3695015SAndrzej Zaborowski 
270c3695015SAndrzej Zaborowski 	if (batt > palmte_battery_sample[lo]) {
271c3695015SAndrzej Zaborowski 		info->battery_life = 100;
272c3695015SAndrzej Zaborowski 		info->time = INTERVAL * ARRAY_SIZE(palmte_battery_sample);
273c3695015SAndrzej Zaborowski 	} else if (batt <= palmte_battery_sample[hi - 1]) {
274c3695015SAndrzej Zaborowski 		info->battery_life = 0;
275c3695015SAndrzej Zaborowski 		info->time = 0;
276c3695015SAndrzej Zaborowski 	} else {
277c3695015SAndrzej Zaborowski 		while (hi > lo + 1) {
278d7730cc0SAndrzej Zaborowski 			mid = (hi + lo) >> 1;
279c3695015SAndrzej Zaborowski 			if (batt <= palmte_battery_sample[mid])
280c3695015SAndrzej Zaborowski 				lo = mid;
281c3695015SAndrzej Zaborowski 			else
282c3695015SAndrzej Zaborowski 				hi = mid;
283c3695015SAndrzej Zaborowski 		}
284c3695015SAndrzej Zaborowski 
285c3695015SAndrzej Zaborowski 		mid = palmte_battery_sample[lo] - palmte_battery_sample[hi];
286c3695015SAndrzej Zaborowski 		hi = palmte_battery_sample[lo] - batt;
287c3695015SAndrzej Zaborowski 		info->battery_life = 100 - (100 * lo + 100 * hi / mid) /
288c3695015SAndrzej Zaborowski 			ARRAY_SIZE(palmte_battery_sample);
289c3695015SAndrzej Zaborowski 		info->time = INTERVAL * (ARRAY_SIZE(palmte_battery_sample) -
290c3695015SAndrzej Zaborowski 				lo) - INTERVAL * hi / mid;
291c3695015SAndrzej Zaborowski 	}
292c3695015SAndrzej Zaborowski 
293c3695015SAndrzej Zaborowski 	if (charging) {
294c3695015SAndrzej Zaborowski 		info->ac_line_status = APM_AC_ONLINE;
295c3695015SAndrzej Zaborowski 		info->battery_status = APM_BATTERY_STATUS_CHARGING;
296c3695015SAndrzej Zaborowski 		info->battery_flag |= APM_BATTERY_FLAG_CHARGING;
297c3695015SAndrzej Zaborowski 	} else {
298c3695015SAndrzej Zaborowski 		info->ac_line_status = APM_AC_OFFLINE;
299c3695015SAndrzej Zaborowski 		if (info->battery_life > BATTERY_HIGH_TRESHOLD)
300c3695015SAndrzej Zaborowski 			info->battery_status = APM_BATTERY_STATUS_HIGH;
301c3695015SAndrzej Zaborowski 		else if (info->battery_life > BATTERY_LOW_TRESHOLD)
302c3695015SAndrzej Zaborowski 			info->battery_status = APM_BATTERY_STATUS_LOW;
303c3695015SAndrzej Zaborowski 		else
304c3695015SAndrzej Zaborowski 			info->battery_status = APM_BATTERY_STATUS_CRITICAL;
305c3695015SAndrzej Zaborowski 	}
306c3695015SAndrzej Zaborowski 
307c3695015SAndrzej Zaborowski 	if (info->battery_life > BATTERY_HIGH_TRESHOLD)
308c3695015SAndrzej Zaborowski 		info->battery_flag |= APM_BATTERY_FLAG_HIGH;
309c3695015SAndrzej Zaborowski 	else if (info->battery_life > BATTERY_LOW_TRESHOLD)
310c3695015SAndrzej Zaborowski 		info->battery_flag |= APM_BATTERY_FLAG_LOW;
311c3695015SAndrzej Zaborowski 	else
312c3695015SAndrzej Zaborowski 		info->battery_flag |= APM_BATTERY_FLAG_CRITICAL;
313c3695015SAndrzej Zaborowski }
314c3695015SAndrzej Zaborowski #else
315c3695015SAndrzej Zaborowski #define palmte_get_power_status	NULL
316c3695015SAndrzej Zaborowski #endif
317c3695015SAndrzej Zaborowski 
318c3695015SAndrzej Zaborowski static struct tsc2102_config palmte_tsc2102_config = {
319c3695015SAndrzej Zaborowski 	.use_internal	= 0,
320c3695015SAndrzej Zaborowski 	.monitor	= TSC_BAT1 | TSC_AUX | TSC_TEMP,
321c3695015SAndrzej Zaborowski 	.temp_at25c	= { 2200, 2615 },
322c3695015SAndrzej Zaborowski 	.apm_report	= palmte_get_power_status,
323c3695015SAndrzej Zaborowski 	.alsa_config	= &palmte_alsa_config,
324c3695015SAndrzej Zaborowski };
325c3695015SAndrzej Zaborowski 
326d7730cc0SAndrzej Zaborowski static struct omap_board_config_kernel palmte_config[] __initdata = {
3273179a019STony Lindgren 	{ OMAP_TAG_USB,		&palmte_usb_config },
3283179a019STony Lindgren 	{ OMAP_TAG_MMC,		&palmte_mmc_config },
3293179a019STony Lindgren 	{ OMAP_TAG_LCD,		&palmte_lcd_config },
330c3695015SAndrzej Zaborowski 	{ OMAP_TAG_UART,	&palmte_uart_config },
3313179a019STony Lindgren };
3323179a019STony Lindgren 
333c3695015SAndrzej Zaborowski static struct spi_board_info palmte_spi_info[] __initdata = {
334c3695015SAndrzej Zaborowski 	{
335c3695015SAndrzej Zaborowski 		.modalias	= "tsc2102",
336c3695015SAndrzej Zaborowski 		.bus_num	= 2,	/* uWire (officially) */
337c3695015SAndrzej Zaborowski 		.chip_select	= 0,	/* As opposed to 3 */
338c3695015SAndrzej Zaborowski 		.irq		= OMAP_GPIO_IRQ(PALMTE_PINTDAV_GPIO),
339c3695015SAndrzej Zaborowski 		.platform_data	= &palmte_tsc2102_config,
340c3695015SAndrzej Zaborowski 		.max_speed_hz	= 8000000,
341c3695015SAndrzej Zaborowski 	},
342c3695015SAndrzej Zaborowski };
343c3695015SAndrzej Zaborowski 
344d7730cc0SAndrzej Zaborowski static void palmte_headphones_detect(void *data, int state)
345d7730cc0SAndrzej Zaborowski {
346d7730cc0SAndrzej Zaborowski 	if (state) {
347c3695015SAndrzej Zaborowski 		/* Headphones connected, disable speaker */
348c3695015SAndrzej Zaborowski 		omap_set_gpio_dataout(PALMTE_SPEAKER_GPIO, 0);
349c3695015SAndrzej Zaborowski 		printk(KERN_INFO "PM: speaker off\n");
350d7730cc0SAndrzej Zaborowski 	} else {
351c3695015SAndrzej Zaborowski 		/* Headphones unplugged, re-enable speaker */
352c3695015SAndrzej Zaborowski 		omap_set_gpio_dataout(PALMTE_SPEAKER_GPIO, 1);
353c3695015SAndrzej Zaborowski 		printk(KERN_INFO "PM: speaker on\n");
354c3695015SAndrzej Zaborowski 	}
355c3695015SAndrzej Zaborowski }
356c3695015SAndrzej Zaborowski 
357d7730cc0SAndrzej Zaborowski static void __init palmte_misc_gpio_setup(void)
358c3695015SAndrzej Zaborowski {
359d7730cc0SAndrzej Zaborowski 	/* Set TSC2102 PINTDAV pin as input (used by TSC2102 driver) */
360c3695015SAndrzej Zaborowski 	if (omap_request_gpio(PALMTE_PINTDAV_GPIO)) {
361c3695015SAndrzej Zaborowski 		printk(KERN_ERR "Could not reserve PINTDAV GPIO!\n");
362c3695015SAndrzej Zaborowski 		return;
363c3695015SAndrzej Zaborowski 	}
364c3695015SAndrzej Zaborowski 	omap_set_gpio_direction(PALMTE_PINTDAV_GPIO, 1);
365c3695015SAndrzej Zaborowski 
366d7730cc0SAndrzej Zaborowski 	/* Set USB-or-DC-IN pin as input (unused) */
367d7730cc0SAndrzej Zaborowski 	if (omap_request_gpio(PALMTE_USB_OR_DC_GPIO)) {
368c3695015SAndrzej Zaborowski 		printk(KERN_ERR "Could not reserve cable signal GPIO!\n");
369c3695015SAndrzej Zaborowski 		return;
370c3695015SAndrzej Zaborowski 	}
371c3695015SAndrzej Zaborowski 	omap_set_gpio_direction(PALMTE_USB_OR_DC_GPIO, 1);
372c3695015SAndrzej Zaborowski }
373c3695015SAndrzej Zaborowski 
374c3695015SAndrzej Zaborowski static void __init omap_palmte_init(void)
3753179a019STony Lindgren {
3763179a019STony Lindgren 	omap_board_config = palmte_config;
3773179a019STony Lindgren 	omap_board_config_size = ARRAY_SIZE(palmte_config);
3789b6553cdSTony Lindgren 
379d7730cc0SAndrzej Zaborowski 	platform_add_devices(palmte_devices, ARRAY_SIZE(palmte_devices));
380c3695015SAndrzej Zaborowski 
381c3695015SAndrzej Zaborowski 	spi_register_board_info(palmte_spi_info, ARRAY_SIZE(palmte_spi_info));
382d7730cc0SAndrzej Zaborowski 	palmte_misc_gpio_setup();
383c3695015SAndrzej Zaborowski 	omap_serial_init();
3841ed16a86SJarkko Nikula 	omap_register_i2c_bus(1, 100, NULL, 0);
3853179a019STony Lindgren }
3863179a019STony Lindgren 
387c3695015SAndrzej Zaborowski static void __init omap_palmte_map_io(void)
3883179a019STony Lindgren {
38987bd63f6STony Lindgren 	omap1_map_common_io();
3903179a019STony Lindgren }
3913179a019STony Lindgren 
3923179a019STony Lindgren MACHINE_START(OMAP_PALMTE, "OMAP310 based Palm Tungsten E")
3933179a019STony Lindgren 	.phys_io	= 0xfff00000,
3943179a019STony Lindgren 	.io_pg_offst	= ((0xfef00000) >> 18) & 0xfffc,
3953179a019STony Lindgren 	.boot_params	= 0x10000100,
396c3695015SAndrzej Zaborowski 	.map_io		= omap_palmte_map_io,
397c3695015SAndrzej Zaborowski 	.init_irq	= omap_palmte_init_irq,
398c3695015SAndrzej Zaborowski 	.init_machine	= omap_palmte_init,
3993179a019STony Lindgren 	.timer		= &omap_timer,
4003179a019STony Lindgren MACHINE_END
401