xref: /openbmc/linux/arch/arm/mach-omap1/board-palmte.c (revision 1ed16a86b47fd7dd9125fc8f6df482cc6edc9b20)
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  *
133179a019STony Lindgren  * This program is free software; you can redistribute it and/or modify
143179a019STony Lindgren  * it under the terms of the GNU General Public License version 2 as
153179a019STony Lindgren  * published by the Free Software Foundation.
163179a019STony Lindgren  */
173179a019STony Lindgren 
183179a019STony Lindgren #include <linux/kernel.h>
193179a019STony Lindgren #include <linux/init.h>
20c3695015SAndrzej Zaborowski #include <linux/input.h>
213179a019STony Lindgren #include <linux/platform_device.h>
22c3695015SAndrzej Zaborowski #include <linux/mtd/mtd.h>
23c3695015SAndrzej Zaborowski #include <linux/mtd/partitions.h>
24c3695015SAndrzej Zaborowski #include <linux/spi/spi.h>
25c3695015SAndrzej Zaborowski #include <linux/spi/tsc2102.h>
26c3695015SAndrzej Zaborowski #include <linux/interrupt.h>
273179a019STony Lindgren 
28c3695015SAndrzej Zaborowski #include <asm/apm.h>
293179a019STony Lindgren #include <asm/hardware.h>
303179a019STony Lindgren #include <asm/mach-types.h>
313179a019STony Lindgren #include <asm/mach/arch.h>
323179a019STony Lindgren #include <asm/mach/map.h>
33c3695015SAndrzej Zaborowski #include <asm/mach/flash.h>
343179a019STony Lindgren 
353179a019STony Lindgren #include <asm/arch/gpio.h>
363179a019STony Lindgren #include <asm/arch/mux.h>
373179a019STony Lindgren #include <asm/arch/usb.h>
38c3695015SAndrzej Zaborowski #include <asm/arch/tc.h>
39c3695015SAndrzej Zaborowski #include <asm/arch/dma.h>
403179a019STony Lindgren #include <asm/arch/board.h>
41c3695015SAndrzej Zaborowski #include <asm/arch/irda.h>
42c3695015SAndrzej Zaborowski #include <asm/arch/keypad.h>
433179a019STony Lindgren #include <asm/arch/common.h>
44c3695015SAndrzej Zaborowski #include <asm/arch/mcbsp.h>
45c3695015SAndrzej Zaborowski #include <asm/arch/omap-alsa.h>
463179a019STony Lindgren 
47c3695015SAndrzej Zaborowski static void __init omap_palmte_init_irq(void)
483179a019STony Lindgren {
4987bd63f6STony Lindgren 	omap1_init_common_hw();
503179a019STony Lindgren 	omap_init_irq();
51c3695015SAndrzej Zaborowski 	omap_gpio_init();
523179a019STony Lindgren }
533179a019STony Lindgren 
54c3695015SAndrzej Zaborowski static int palmte_keymap[] = {
55c3695015SAndrzej Zaborowski 	KEY(0, 0, KEY_F1),
56c3695015SAndrzej Zaborowski 	KEY(0, 1, KEY_F2),
57c3695015SAndrzej Zaborowski 	KEY(0, 2, KEY_F3),
58c3695015SAndrzej Zaborowski 	KEY(0, 3, KEY_F4),
59c3695015SAndrzej Zaborowski 	KEY(0, 4, KEY_POWER),
60c3695015SAndrzej Zaborowski 	KEY(1, 0, KEY_LEFT),
61c3695015SAndrzej Zaborowski 	KEY(1, 1, KEY_DOWN),
62c3695015SAndrzej Zaborowski 	KEY(1, 2, KEY_UP),
63c3695015SAndrzej Zaborowski 	KEY(1, 3, KEY_RIGHT),
64c3695015SAndrzej Zaborowski 	KEY(1, 4, KEY_CENTER),
65c3695015SAndrzej Zaborowski 	0,
66c3695015SAndrzej Zaborowski };
67c3695015SAndrzej Zaborowski 
68c3695015SAndrzej Zaborowski static struct omap_kp_platform_data palmte_kp_data = {
69c3695015SAndrzej Zaborowski 	.rows	= 8,
70c3695015SAndrzej Zaborowski 	.cols	= 8,
71c3695015SAndrzej Zaborowski 	.keymap = palmte_keymap,
72c3695015SAndrzej Zaborowski 	.rep	= 1,
73c3695015SAndrzej Zaborowski 	.delay	= 12,
74c3695015SAndrzej Zaborowski };
75c3695015SAndrzej Zaborowski 
76c3695015SAndrzej Zaborowski static struct resource palmte_kp_resources[] = {
77c3695015SAndrzej Zaborowski 	[0]	= {
78c3695015SAndrzej Zaborowski 		.start	= INT_KEYBOARD,
79c3695015SAndrzej Zaborowski 		.end	= INT_KEYBOARD,
80c3695015SAndrzej Zaborowski 		.flags	= IORESOURCE_IRQ,
81c3695015SAndrzej Zaborowski 	},
82c3695015SAndrzej Zaborowski };
83c3695015SAndrzej Zaborowski 
84c3695015SAndrzej Zaborowski static struct platform_device palmte_kp_device = {
85c3695015SAndrzej Zaborowski 	.name		= "omap-keypad",
86c3695015SAndrzej Zaborowski 	.id		= -1,
87c3695015SAndrzej Zaborowski 	.dev		= {
88c3695015SAndrzej Zaborowski 		.platform_data	= &palmte_kp_data,
89c3695015SAndrzej Zaborowski 	},
90c3695015SAndrzej Zaborowski 	.num_resources	= ARRAY_SIZE(palmte_kp_resources),
91c3695015SAndrzej Zaborowski 	.resource	= palmte_kp_resources,
92c3695015SAndrzej Zaborowski };
93c3695015SAndrzej Zaborowski 
94c3695015SAndrzej Zaborowski static struct mtd_partition palmte_rom_partitions[] = {
95c3695015SAndrzej Zaborowski 	/* PalmOS "Small ROM", contains the bootloader and the debugger */
96c3695015SAndrzej Zaborowski 	{
97c3695015SAndrzej Zaborowski 		.name		= "smallrom",
98c3695015SAndrzej Zaborowski 		.offset		= 0,
99c3695015SAndrzej Zaborowski 		.size		= 0xa000,
100c3695015SAndrzej Zaborowski 		.mask_flags	= MTD_WRITEABLE,
101c3695015SAndrzej Zaborowski 	},
102c3695015SAndrzej Zaborowski 	/* PalmOS "Big ROM", a filesystem with all the OS code and data */
103c3695015SAndrzej Zaborowski 	{
104c3695015SAndrzej Zaborowski 		.name		= "bigrom",
105c3695015SAndrzej Zaborowski 		.offset		= SZ_128K,
106c3695015SAndrzej Zaborowski 		/*
107c3695015SAndrzej Zaborowski 		 * 0x5f0000 bytes big in the multi-language ("EFIGS") version,
108c3695015SAndrzej Zaborowski 		 * 0x7b0000 bytes in the English-only ("enUS") version.
109c3695015SAndrzej Zaborowski 		 */
110c3695015SAndrzej Zaborowski 		.size		= 0x7b0000,
111c3695015SAndrzej Zaborowski 		.mask_flags	= MTD_WRITEABLE,
112c3695015SAndrzej Zaborowski 	},
113c3695015SAndrzej Zaborowski };
114c3695015SAndrzej Zaborowski 
115c3695015SAndrzej Zaborowski static struct flash_platform_data palmte_rom_data = {
116c3695015SAndrzej Zaborowski 	.map_name	= "map_rom",
117c3695015SAndrzej Zaborowski 	.width		= 2,
118c3695015SAndrzej Zaborowski 	.parts		= palmte_rom_partitions,
119c3695015SAndrzej Zaborowski 	.nr_parts	= ARRAY_SIZE(palmte_rom_partitions),
120c3695015SAndrzej Zaborowski };
121c3695015SAndrzej Zaborowski 
122c3695015SAndrzej Zaborowski static struct resource palmte_rom_resource = {
123c3695015SAndrzej Zaborowski 	.start		= OMAP_CS0_PHYS,
124c3695015SAndrzej Zaborowski 	.end		= OMAP_CS0_PHYS + SZ_8M - 1,
125c3695015SAndrzej Zaborowski 	.flags		= IORESOURCE_MEM,
126c3695015SAndrzej Zaborowski };
127c3695015SAndrzej Zaborowski 
128c3695015SAndrzej Zaborowski static struct platform_device palmte_rom_device = {
129c3695015SAndrzej Zaborowski 	.name		= "omapflash",
130c3695015SAndrzej Zaborowski 	.id		= -1,
131c3695015SAndrzej Zaborowski 	.dev		= {
132c3695015SAndrzej Zaborowski 		.platform_data	= &palmte_rom_data,
133c3695015SAndrzej Zaborowski 	},
134c3695015SAndrzej Zaborowski 	.num_resources	= 1,
135c3695015SAndrzej Zaborowski 	.resource	= &palmte_rom_resource,
136c3695015SAndrzej Zaborowski };
137c3695015SAndrzej Zaborowski 
1389b6553cdSTony Lindgren static struct platform_device palmte_lcd_device = {
1399b6553cdSTony Lindgren 	.name		= "lcd_palmte",
1409b6553cdSTony Lindgren 	.id		= -1,
1419b6553cdSTony Lindgren };
1429b6553cdSTony Lindgren 
143c3695015SAndrzej Zaborowski static struct omap_backlight_config palmte_backlight_config = {
144c3695015SAndrzej Zaborowski 	.default_intensity	= 0xa0,
145c3695015SAndrzej Zaborowski };
146c3695015SAndrzej Zaborowski 
147c3695015SAndrzej Zaborowski static struct platform_device palmte_backlight_device = {
148c3695015SAndrzej Zaborowski 	.name		= "omap-bl",
149c3695015SAndrzej Zaborowski 	.id		= -1,
150c3695015SAndrzej Zaborowski 	.dev		= {
151c3695015SAndrzej Zaborowski 		.platform_data	= &palmte_backlight_config,
152c3695015SAndrzej Zaborowski 	},
153c3695015SAndrzej Zaborowski };
154c3695015SAndrzej Zaborowski 
155c3695015SAndrzej Zaborowski static struct omap_irda_config palmte_irda_config = {
156c3695015SAndrzej Zaborowski 	.transceiver_cap	= IR_SIRMODE,
157c3695015SAndrzej Zaborowski 	.rx_channel		= OMAP_DMA_UART3_RX,
158c3695015SAndrzej Zaborowski 	.tx_channel		= OMAP_DMA_UART3_TX,
159c3695015SAndrzej Zaborowski 	.dest_start		= UART3_THR,
160c3695015SAndrzej Zaborowski 	.src_start		= UART3_RHR,
161c3695015SAndrzej Zaborowski 	.tx_trigger		= 0,
162c3695015SAndrzej Zaborowski 	.rx_trigger		= 0,
163c3695015SAndrzej Zaborowski };
164c3695015SAndrzej Zaborowski 
165c3695015SAndrzej Zaborowski static struct resource palmte_irda_resources[] = {
166c3695015SAndrzej Zaborowski 	[0]	= {
167c3695015SAndrzej Zaborowski 		.start	= INT_UART3,
168c3695015SAndrzej Zaborowski 		.end	= INT_UART3,
169c3695015SAndrzej Zaborowski 		.flags	= IORESOURCE_IRQ,
170c3695015SAndrzej Zaborowski 	},
171c3695015SAndrzej Zaborowski };
172c3695015SAndrzej Zaborowski 
173c3695015SAndrzej Zaborowski static struct platform_device palmte_irda_device = {
174c3695015SAndrzej Zaborowski 	.name		= "omapirda",
175c3695015SAndrzej Zaborowski 	.id		= -1,
176c3695015SAndrzej Zaborowski 	.dev		= {
177c3695015SAndrzej Zaborowski 		.platform_data	= &palmte_irda_config,
178c3695015SAndrzej Zaborowski 	},
179c3695015SAndrzej Zaborowski 	.num_resources	= ARRAY_SIZE(palmte_irda_resources),
180c3695015SAndrzej Zaborowski 	.resource	= palmte_irda_resources,
181c3695015SAndrzej Zaborowski };
182c3695015SAndrzej Zaborowski 
1839b6553cdSTony Lindgren static struct platform_device *devices[] __initdata = {
184c3695015SAndrzej Zaborowski 	&palmte_rom_device,
185c3695015SAndrzej Zaborowski 	&palmte_kp_device,
1869b6553cdSTony Lindgren 	&palmte_lcd_device,
187c3695015SAndrzej Zaborowski 	&palmte_backlight_device,
188c3695015SAndrzej Zaborowski 	&palmte_irda_device,
1899b6553cdSTony Lindgren };
1909b6553cdSTony Lindgren 
1913179a019STony Lindgren static struct omap_usb_config palmte_usb_config __initdata = {
192c3695015SAndrzej Zaborowski 	.register_dev	= 1,	/* Mini-B only receptacle */
1933179a019STony Lindgren 	.hmc_mode	= 0,
194c3695015SAndrzej Zaborowski 	.pins[0]	= 2,
1953179a019STony Lindgren };
1963179a019STony Lindgren 
1973179a019STony Lindgren static struct omap_mmc_config palmte_mmc_config __initdata = {
1983179a019STony Lindgren 	.mmc[0]		= {
1993179a019STony Lindgren 		.enabled 	= 1,
200c3695015SAndrzej Zaborowski 		.wp_pin		= PALMTE_MMC_WP_GPIO,
201c3695015SAndrzej Zaborowski 		.power_pin	= PALMTE_MMC_POWER_GPIO,
202c3695015SAndrzej Zaborowski 		.switch_pin	= PALMTE_MMC_SWITCH_GPIO,
2033179a019STony Lindgren 	},
2043179a019STony Lindgren };
2053179a019STony Lindgren 
2063179a019STony Lindgren static struct omap_lcd_config palmte_lcd_config __initdata = {
2073179a019STony Lindgren 	.ctrl_name	= "internal",
2083179a019STony Lindgren };
2093179a019STony Lindgren 
210c3695015SAndrzej Zaborowski static struct omap_uart_config palmte_uart_config __initdata = {
211c3695015SAndrzej Zaborowski 	.enabled_uarts = (1 << 0) | (1 << 1) | (0 << 2),
212c3695015SAndrzej Zaborowski };
213c3695015SAndrzej Zaborowski 
214c3695015SAndrzej Zaborowski static struct omap_mcbsp_reg_cfg palmte_mcbsp1_regs = {
215c3695015SAndrzej Zaborowski 	.spcr2	= FRST | GRST | XRST | XINTM(3),
216c3695015SAndrzej Zaborowski 	.xcr2	= XDATDLY(1) | XFIG,
217c3695015SAndrzej Zaborowski 	.xcr1	= XWDLEN1(OMAP_MCBSP_WORD_32),
218c3695015SAndrzej Zaborowski 	.pcr0	= SCLKME | FSXP | CLKXP,
219c3695015SAndrzej Zaborowski };
220c3695015SAndrzej Zaborowski 
221c3695015SAndrzej Zaborowski static struct omap_alsa_codec_config palmte_alsa_config = {
222c3695015SAndrzej Zaborowski 	.name			= "TSC2102 audio",
223c3695015SAndrzej Zaborowski 	.mcbsp_regs_alsa	= &palmte_mcbsp1_regs,
224c3695015SAndrzej Zaborowski 	.codec_configure_dev	= NULL,	/* tsc2102_configure, */
225c3695015SAndrzej Zaborowski 	.codec_set_samplerate	= NULL,	/* tsc2102_set_samplerate, */
226c3695015SAndrzej Zaborowski 	.codec_clock_setup	= NULL,	/* tsc2102_clock_setup, */
227c3695015SAndrzej Zaborowski 	.codec_clock_on		= NULL,	/* tsc2102_clock_on, */
228c3695015SAndrzej Zaborowski 	.codec_clock_off	= NULL,	/* tsc2102_clock_off, */
229c3695015SAndrzej Zaborowski 	.get_default_samplerate	= NULL,	/* tsc2102_get_default_samplerate, */
230c3695015SAndrzej Zaborowski };
231c3695015SAndrzej Zaborowski 
232c3695015SAndrzej Zaborowski #ifdef CONFIG_APM
233c3695015SAndrzej Zaborowski /*
234c3695015SAndrzej Zaborowski  * Values measured in 10 minute intervals averaged over 10 samples.
235c3695015SAndrzej Zaborowski  * May differ slightly from device to device but should be accurate
236c3695015SAndrzej Zaborowski  * enough to give basic idea of battery life left and trigger
237c3695015SAndrzej Zaborowski  * potential alerts.
238c3695015SAndrzej Zaborowski  */
239c3695015SAndrzej Zaborowski static const int palmte_battery_sample[] = {
240c3695015SAndrzej Zaborowski 	2194, 2157, 2138, 2120,
241c3695015SAndrzej Zaborowski 	2104, 2089, 2075, 2061,
242c3695015SAndrzej Zaborowski 	2048, 2038, 2026, 2016,
243c3695015SAndrzej Zaborowski 	2008, 1998, 1989, 1980,
244c3695015SAndrzej Zaborowski 	1970, 1958, 1945, 1928,
245c3695015SAndrzej Zaborowski 	1910, 1888, 1860, 1827,
246c3695015SAndrzej Zaborowski 	1791, 1751, 1709, 1656,
247c3695015SAndrzej Zaborowski };
248c3695015SAndrzej Zaborowski 
249c3695015SAndrzej Zaborowski #define INTERVAL		10
250c3695015SAndrzej Zaborowski #define BATTERY_HIGH_TRESHOLD	66
251c3695015SAndrzej Zaborowski #define BATTERY_LOW_TRESHOLD	33
252c3695015SAndrzej Zaborowski 
253c3695015SAndrzej Zaborowski static void palmte_get_power_status(struct apm_power_info *info, int *battery)
254c3695015SAndrzej Zaborowski {
255c3695015SAndrzej Zaborowski 	int charging, batt, hi, lo, mid;
256c3695015SAndrzej Zaborowski 
257c3695015SAndrzej Zaborowski 	charging = !omap_get_gpio_datain(PALMTE_DC_GPIO);
258c3695015SAndrzej Zaborowski 	batt = battery[0];
259c3695015SAndrzej Zaborowski 	if (charging)
260c3695015SAndrzej Zaborowski 		batt -= 60;
261c3695015SAndrzej Zaborowski 
262c3695015SAndrzej Zaborowski 	hi = ARRAY_SIZE(palmte_battery_sample);
263c3695015SAndrzej Zaborowski 	lo = 0;
264c3695015SAndrzej Zaborowski 
265c3695015SAndrzej Zaborowski 	info->battery_flag = 0;
266c3695015SAndrzej Zaborowski 	info->units = APM_UNITS_MINS;
267c3695015SAndrzej Zaborowski 
268c3695015SAndrzej Zaborowski 	if (batt > palmte_battery_sample[lo]) {
269c3695015SAndrzej Zaborowski 		info->battery_life = 100;
270c3695015SAndrzej Zaborowski 		info->time = INTERVAL * ARRAY_SIZE(palmte_battery_sample);
271c3695015SAndrzej Zaborowski 	} else if (batt <= palmte_battery_sample[hi - 1]) {
272c3695015SAndrzej Zaborowski 		info->battery_life = 0;
273c3695015SAndrzej Zaborowski 		info->time = 0;
274c3695015SAndrzej Zaborowski 	} else {
275c3695015SAndrzej Zaborowski 		while (hi > lo + 1) {
276c3695015SAndrzej Zaborowski 			mid = (hi + lo) >> 2;
277c3695015SAndrzej Zaborowski 			if (batt <= palmte_battery_sample[mid])
278c3695015SAndrzej Zaborowski 				lo = mid;
279c3695015SAndrzej Zaborowski 			else
280c3695015SAndrzej Zaborowski 				hi = mid;
281c3695015SAndrzej Zaborowski 		}
282c3695015SAndrzej Zaborowski 
283c3695015SAndrzej Zaborowski 		mid = palmte_battery_sample[lo] - palmte_battery_sample[hi];
284c3695015SAndrzej Zaborowski 		hi = palmte_battery_sample[lo] - batt;
285c3695015SAndrzej Zaborowski 		info->battery_life = 100 - (100 * lo + 100 * hi / mid) /
286c3695015SAndrzej Zaborowski 			ARRAY_SIZE(palmte_battery_sample);
287c3695015SAndrzej Zaborowski 		info->time = INTERVAL * (ARRAY_SIZE(palmte_battery_sample) -
288c3695015SAndrzej Zaborowski 				lo) - INTERVAL * hi / mid;
289c3695015SAndrzej Zaborowski 	}
290c3695015SAndrzej Zaborowski 
291c3695015SAndrzej Zaborowski 	if (charging) {
292c3695015SAndrzej Zaborowski 		info->ac_line_status = APM_AC_ONLINE;
293c3695015SAndrzej Zaborowski 		info->battery_status = APM_BATTERY_STATUS_CHARGING;
294c3695015SAndrzej Zaborowski 		info->battery_flag |= APM_BATTERY_FLAG_CHARGING;
295c3695015SAndrzej Zaborowski 	} else {
296c3695015SAndrzej Zaborowski 		info->ac_line_status = APM_AC_OFFLINE;
297c3695015SAndrzej Zaborowski 		if (info->battery_life > BATTERY_HIGH_TRESHOLD)
298c3695015SAndrzej Zaborowski 			info->battery_status = APM_BATTERY_STATUS_HIGH;
299c3695015SAndrzej Zaborowski 		else if (info->battery_life > BATTERY_LOW_TRESHOLD)
300c3695015SAndrzej Zaborowski 			info->battery_status = APM_BATTERY_STATUS_LOW;
301c3695015SAndrzej Zaborowski 		else
302c3695015SAndrzej Zaborowski 			info->battery_status = APM_BATTERY_STATUS_CRITICAL;
303c3695015SAndrzej Zaborowski 	}
304c3695015SAndrzej Zaborowski 
305c3695015SAndrzej Zaborowski 	if (info->battery_life > BATTERY_HIGH_TRESHOLD)
306c3695015SAndrzej Zaborowski 		info->battery_flag |= APM_BATTERY_FLAG_HIGH;
307c3695015SAndrzej Zaborowski 	else if (info->battery_life > BATTERY_LOW_TRESHOLD)
308c3695015SAndrzej Zaborowski 		info->battery_flag |= APM_BATTERY_FLAG_LOW;
309c3695015SAndrzej Zaborowski 	else
310c3695015SAndrzej Zaborowski 		info->battery_flag |= APM_BATTERY_FLAG_CRITICAL;
311c3695015SAndrzej Zaborowski }
312c3695015SAndrzej Zaborowski #else
313c3695015SAndrzej Zaborowski #define palmte_get_power_status	NULL
314c3695015SAndrzej Zaborowski #endif
315c3695015SAndrzej Zaborowski 
316c3695015SAndrzej Zaborowski static struct tsc2102_config palmte_tsc2102_config = {
317c3695015SAndrzej Zaborowski 	.use_internal	= 0,
318c3695015SAndrzej Zaborowski 	.monitor	= TSC_BAT1 | TSC_AUX | TSC_TEMP,
319c3695015SAndrzej Zaborowski 	.temp_at25c	= { 2200, 2615 },
320c3695015SAndrzej Zaborowski 	.apm_report	= palmte_get_power_status,
321c3695015SAndrzej Zaborowski 	.alsa_config	= &palmte_alsa_config,
322c3695015SAndrzej Zaborowski };
323c3695015SAndrzej Zaborowski 
3243179a019STony Lindgren static struct omap_board_config_kernel palmte_config[] = {
3253179a019STony Lindgren 	{ OMAP_TAG_USB,		&palmte_usb_config },
3263179a019STony Lindgren 	{ OMAP_TAG_MMC,		&palmte_mmc_config },
3273179a019STony Lindgren 	{ OMAP_TAG_LCD,		&palmte_lcd_config },
328c3695015SAndrzej Zaborowski 	{ OMAP_TAG_UART,	&palmte_uart_config },
3293179a019STony Lindgren };
3303179a019STony Lindgren 
331c3695015SAndrzej Zaborowski static struct spi_board_info palmte_spi_info[] __initdata = {
332c3695015SAndrzej Zaborowski 	{
333c3695015SAndrzej Zaborowski 		.modalias	= "tsc2102",
334c3695015SAndrzej Zaborowski 		.bus_num	= 2,	/* uWire (officially) */
335c3695015SAndrzej Zaborowski 		.chip_select	= 0,	/* As opposed to 3 */
336c3695015SAndrzej Zaborowski 		.irq		= OMAP_GPIO_IRQ(PALMTE_PINTDAV_GPIO),
337c3695015SAndrzej Zaborowski 		.platform_data	= &palmte_tsc2102_config,
338c3695015SAndrzej Zaborowski 		.max_speed_hz	= 8000000,
339c3695015SAndrzej Zaborowski 	},
340c3695015SAndrzej Zaborowski };
341c3695015SAndrzej Zaborowski 
342c3695015SAndrzej Zaborowski /* Periodically check for changes on important input pins */
343c3695015SAndrzej Zaborowski struct timer_list palmte_pin_timer;
344c3695015SAndrzej Zaborowski int prev_power, prev_headphones;
345c3695015SAndrzej Zaborowski 
346c3695015SAndrzej Zaborowski static void palmte_pin_handler(unsigned long data) {
347c3695015SAndrzej Zaborowski 	int power, headphones;
348c3695015SAndrzej Zaborowski 
349c3695015SAndrzej Zaborowski 	power = !omap_get_gpio_datain(PALMTE_DC_GPIO);
350c3695015SAndrzej Zaborowski 	headphones = omap_get_gpio_datain(PALMTE_HEADPHONES_GPIO);
351c3695015SAndrzej Zaborowski 
352c3695015SAndrzej Zaborowski 	if (power && !prev_power)
353c3695015SAndrzej Zaborowski 		printk(KERN_INFO "PM: cable connected\n");
354c3695015SAndrzej Zaborowski 	else if (!power && prev_power)
355c3695015SAndrzej Zaborowski 		printk(KERN_INFO "PM: cable disconnected\n");
356c3695015SAndrzej Zaborowski 
357c3695015SAndrzej Zaborowski 	if (headphones && !prev_headphones) {
358c3695015SAndrzej Zaborowski 		/* Headphones connected, disable speaker */
359c3695015SAndrzej Zaborowski 		omap_set_gpio_dataout(PALMTE_SPEAKER_GPIO, 0);
360c3695015SAndrzej Zaborowski 		printk(KERN_INFO "PM: speaker off\n");
361c3695015SAndrzej Zaborowski 	} else if (!headphones && prev_headphones) {
362c3695015SAndrzej Zaborowski 		/* Headphones unplugged, re-enable speaker */
363c3695015SAndrzej Zaborowski 		omap_set_gpio_dataout(PALMTE_SPEAKER_GPIO, 1);
364c3695015SAndrzej Zaborowski 		printk(KERN_INFO "PM: speaker on\n");
365c3695015SAndrzej Zaborowski 	}
366c3695015SAndrzej Zaborowski 
367c3695015SAndrzej Zaborowski 	prev_power = power;
368c3695015SAndrzej Zaborowski 	prev_headphones = headphones;
369c3695015SAndrzej Zaborowski 	mod_timer(&palmte_pin_timer, jiffies + msecs_to_jiffies(500));
370c3695015SAndrzej Zaborowski }
371c3695015SAndrzej Zaborowski 
372c3695015SAndrzej Zaborowski static void __init palmte_gpio_setup(void)
373c3695015SAndrzej Zaborowski {
374c3695015SAndrzej Zaborowski 	/* Set TSC2102 PINTDAV pin as input */
375c3695015SAndrzej Zaborowski 	if (omap_request_gpio(PALMTE_PINTDAV_GPIO)) {
376c3695015SAndrzej Zaborowski 		printk(KERN_ERR "Could not reserve PINTDAV GPIO!\n");
377c3695015SAndrzej Zaborowski 		return;
378c3695015SAndrzej Zaborowski 	}
379c3695015SAndrzej Zaborowski 	omap_set_gpio_direction(PALMTE_PINTDAV_GPIO, 1);
380c3695015SAndrzej Zaborowski 
381c3695015SAndrzej Zaborowski 	/* Monitor cable-connected signals */
382c3695015SAndrzej Zaborowski 	if (omap_request_gpio(PALMTE_DC_GPIO) ||
383c3695015SAndrzej Zaborowski 			omap_request_gpio(PALMTE_USB_OR_DC_GPIO) ||
384c3695015SAndrzej Zaborowski 			omap_request_gpio(PALMTE_USBDETECT_GPIO)) {
385c3695015SAndrzej Zaborowski 		printk(KERN_ERR "Could not reserve cable signal GPIO!\n");
386c3695015SAndrzej Zaborowski 		return;
387c3695015SAndrzej Zaborowski 	}
388c3695015SAndrzej Zaborowski 	omap_set_gpio_direction(PALMTE_DC_GPIO, 1);
389c3695015SAndrzej Zaborowski 	omap_set_gpio_direction(PALMTE_USB_OR_DC_GPIO, 1);
390c3695015SAndrzej Zaborowski 	omap_set_gpio_direction(PALMTE_USBDETECT_GPIO, 1);
391c3695015SAndrzej Zaborowski 
392c3695015SAndrzej Zaborowski 	/* Set speaker-enable pin as output */
393c3695015SAndrzej Zaborowski 	if (omap_request_gpio(PALMTE_SPEAKER_GPIO)) {
394c3695015SAndrzej Zaborowski 		printk(KERN_ERR "Could not reserve speaker GPIO!\n");
395c3695015SAndrzej Zaborowski 		return;
396c3695015SAndrzej Zaborowski 	}
397c3695015SAndrzej Zaborowski 	omap_set_gpio_direction(PALMTE_SPEAKER_GPIO, 0);
398c3695015SAndrzej Zaborowski 
399c3695015SAndrzej Zaborowski 	/* Monitor the headphones-connected signal */
400c3695015SAndrzej Zaborowski 	if (omap_request_gpio(PALMTE_HEADPHONES_GPIO)) {
401c3695015SAndrzej Zaborowski 		printk(KERN_ERR "Could not reserve headphones signal GPIO!\n");
402c3695015SAndrzej Zaborowski 		return;
403c3695015SAndrzej Zaborowski 	}
404c3695015SAndrzej Zaborowski 	omap_set_gpio_direction(PALMTE_HEADPHONES_GPIO, 1);
405c3695015SAndrzej Zaborowski 
406c3695015SAndrzej Zaborowski 	prev_power = omap_get_gpio_datain(PALMTE_DC_GPIO);
407c3695015SAndrzej Zaborowski 	prev_headphones = !omap_get_gpio_datain(PALMTE_HEADPHONES_GPIO);
408c3695015SAndrzej Zaborowski 	setup_timer(&palmte_pin_timer, palmte_pin_handler, 0);
409c3695015SAndrzej Zaborowski 	palmte_pin_handler(0);
410c3695015SAndrzej Zaborowski }
411c3695015SAndrzej Zaborowski 
412c3695015SAndrzej Zaborowski static void __init omap_palmte_init(void)
4133179a019STony Lindgren {
4143179a019STony Lindgren 	omap_board_config = palmte_config;
4153179a019STony Lindgren 	omap_board_config_size = ARRAY_SIZE(palmte_config);
4169b6553cdSTony Lindgren 
4179b6553cdSTony Lindgren 	platform_add_devices(devices, ARRAY_SIZE(devices));
418c3695015SAndrzej Zaborowski 
419c3695015SAndrzej Zaborowski 	spi_register_board_info(palmte_spi_info, ARRAY_SIZE(palmte_spi_info));
420c3695015SAndrzej Zaborowski 
421c3695015SAndrzej Zaborowski 	omap_serial_init();
422*1ed16a86SJarkko Nikula 	omap_register_i2c_bus(1, 100, NULL, 0);
423c3695015SAndrzej Zaborowski 	palmte_gpio_setup();
4243179a019STony Lindgren }
4253179a019STony Lindgren 
426c3695015SAndrzej Zaborowski static void __init omap_palmte_map_io(void)
4273179a019STony Lindgren {
42887bd63f6STony Lindgren 	omap1_map_common_io();
4293179a019STony Lindgren }
4303179a019STony Lindgren 
4313179a019STony Lindgren MACHINE_START(OMAP_PALMTE, "OMAP310 based Palm Tungsten E")
4323179a019STony Lindgren 	.phys_io	= 0xfff00000,
4333179a019STony Lindgren 	.io_pg_offst	= ((0xfef00000) >> 18) & 0xfffc,
4343179a019STony Lindgren 	.boot_params	= 0x10000100,
435c3695015SAndrzej Zaborowski 	.map_io		= omap_palmte_map_io,
436c3695015SAndrzej Zaborowski 	.init_irq	= omap_palmte_init_irq,
437c3695015SAndrzej Zaborowski 	.init_machine	= omap_palmte_init,
4383179a019STony Lindgren 	.timer		= &omap_timer,
4393179a019STony Lindgren MACHINE_END
440