]> bbs.cooldavid.org Git - net-next-2.6.git/blame - arch/arm/mach-omap1/board-palmte.c
omap: Move omap1 USB platform init code into mach-omap1/usb.c
[net-next-2.6.git] / arch / arm / mach-omap1 / board-palmte.c
CommitLineData
3179a019
TL
1/*
2 * linux/arch/arm/mach-omap1/board-palmte.c
3 *
4 * Modified from board-generic.c
5 *
6 * Support for the Palm Tungsten E PDA.
7 *
8 * Original version : Laurent Gonzalez
9 *
6cbdc8c5 10 * Maintainers : http://palmtelinux.sf.net
3179a019
TL
11 * palmtelinux-developpers@lists.sf.net
12 *
d7730cc0
AZ
13 * Copyright (c) 2006 Andrzej Zaborowski <balrog@zabor.org>
14 *
3179a019
TL
15 * This program is free software; you can redistribute it and/or modify
16 * it under the terms of the GNU General Public License version 2 as
17 * published by the Free Software Foundation.
18 */
19
20#include <linux/kernel.h>
21#include <linux/init.h>
c3695015 22#include <linux/input.h>
3179a019 23#include <linux/platform_device.h>
c3695015
AZ
24#include <linux/mtd/mtd.h>
25#include <linux/mtd/partitions.h>
561b036a 26#include <linux/mtd/physmap.h>
c3695015 27#include <linux/spi/spi.h>
c3695015 28#include <linux/interrupt.h>
d7730cc0 29#include <linux/apm-emulation.h>
3179a019 30
a09e64fb 31#include <mach/hardware.h>
3179a019
TL
32#include <asm/mach-types.h>
33#include <asm/mach/arch.h>
34#include <asm/mach/map.h>
35
a09e64fb 36#include <mach/gpio.h>
561b036a 37#include <plat/flash.h>
ce491cf8
TL
38#include <plat/mux.h>
39#include <plat/usb.h>
40#include <plat/tc.h>
41#include <plat/dma.h>
42#include <plat/board.h>
43#include <plat/irda.h>
44#include <plat/keypad.h>
45#include <plat/common.h>
3179a019 46
b2830810
TL
47#define PALMTE_USBDETECT_GPIO 0
48#define PALMTE_USB_OR_DC_GPIO 1
49#define PALMTE_TSC_GPIO 4
50#define PALMTE_PINTDAV_GPIO 6
51#define PALMTE_MMC_WP_GPIO 8
52#define PALMTE_MMC_POWER_GPIO 9
53#define PALMTE_HDQ_GPIO 11
54#define PALMTE_HEADPHONES_GPIO 14
55#define PALMTE_SPEAKER_GPIO 15
56#define PALMTE_DC_GPIO OMAP_MPUIO(2)
57#define PALMTE_MMC_SWITCH_GPIO OMAP_MPUIO(4)
58#define PALMTE_MMC1_GPIO OMAP_MPUIO(6)
59#define PALMTE_MMC2_GPIO OMAP_MPUIO(7)
60#define PALMTE_MMC3_GPIO OMAP_MPUIO(11)
61
c3695015 62static void __init omap_palmte_init_irq(void)
3179a019 63{
87bd63f6 64 omap1_init_common_hw();
3179a019 65 omap_init_irq();
c3695015 66 omap_gpio_init();
3179a019
TL
67}
68
d7730cc0
AZ
69static const int palmte_keymap[] = {
70 KEY(0, 0, KEY_F1), /* Calendar */
71 KEY(0, 1, KEY_F2), /* Contacts */
72 KEY(0, 2, KEY_F3), /* Tasks List */
73 KEY(0, 3, KEY_F4), /* Note Pad */
c3695015
AZ
74 KEY(0, 4, KEY_POWER),
75 KEY(1, 0, KEY_LEFT),
76 KEY(1, 1, KEY_DOWN),
77 KEY(1, 2, KEY_UP),
78 KEY(1, 3, KEY_RIGHT),
ec44dfa8 79 KEY(1, 4, KEY_ENTER),
c3695015
AZ
80 0,
81};
82
83static struct omap_kp_platform_data palmte_kp_data = {
84 .rows = 8,
85 .cols = 8,
d7730cc0 86 .keymap = (int *) palmte_keymap,
c3695015
AZ
87 .rep = 1,
88 .delay = 12,
89};
90
91static struct resource palmte_kp_resources[] = {
92 [0] = {
93 .start = INT_KEYBOARD,
94 .end = INT_KEYBOARD,
95 .flags = IORESOURCE_IRQ,
96 },
97};
98
99static struct platform_device palmte_kp_device = {
100 .name = "omap-keypad",
101 .id = -1,
102 .dev = {
103 .platform_data = &palmte_kp_data,
104 },
105 .num_resources = ARRAY_SIZE(palmte_kp_resources),
106 .resource = palmte_kp_resources,
107};
108
109static struct mtd_partition palmte_rom_partitions[] = {
110 /* PalmOS "Small ROM", contains the bootloader and the debugger */
111 {
112 .name = "smallrom",
113 .offset = 0,
114 .size = 0xa000,
115 .mask_flags = MTD_WRITEABLE,
116 },
117 /* PalmOS "Big ROM", a filesystem with all the OS code and data */
118 {
119 .name = "bigrom",
120 .offset = SZ_128K,
121 /*
122 * 0x5f0000 bytes big in the multi-language ("EFIGS") version,
123 * 0x7b0000 bytes in the English-only ("enUS") version.
124 */
125 .size = 0x7b0000,
126 .mask_flags = MTD_WRITEABLE,
127 },
128};
129
561b036a 130static struct physmap_flash_data palmte_rom_data = {
c3695015 131 .width = 2,
561b036a 132 .set_vpp = omap1_set_vpp,
c3695015
AZ
133 .parts = palmte_rom_partitions,
134 .nr_parts = ARRAY_SIZE(palmte_rom_partitions),
135};
136
137static struct resource palmte_rom_resource = {
138 .start = OMAP_CS0_PHYS,
139 .end = OMAP_CS0_PHYS + SZ_8M - 1,
140 .flags = IORESOURCE_MEM,
141};
142
143static struct platform_device palmte_rom_device = {
561b036a 144 .name = "physmap-flash",
c3695015
AZ
145 .id = -1,
146 .dev = {
147 .platform_data = &palmte_rom_data,
148 },
149 .num_resources = 1,
150 .resource = &palmte_rom_resource,
151};
152
9b6553cd
TL
153static struct platform_device palmte_lcd_device = {
154 .name = "lcd_palmte",
155 .id = -1,
156};
157
c3695015
AZ
158static struct omap_backlight_config palmte_backlight_config = {
159 .default_intensity = 0xa0,
160};
161
162static struct platform_device palmte_backlight_device = {
163 .name = "omap-bl",
164 .id = -1,
165 .dev = {
166 .platform_data = &palmte_backlight_config,
167 },
168};
169
170static struct omap_irda_config palmte_irda_config = {
171 .transceiver_cap = IR_SIRMODE,
172 .rx_channel = OMAP_DMA_UART3_RX,
173 .tx_channel = OMAP_DMA_UART3_TX,
174 .dest_start = UART3_THR,
175 .src_start = UART3_RHR,
176 .tx_trigger = 0,
177 .rx_trigger = 0,
178};
179
180static struct resource palmte_irda_resources[] = {
181 [0] = {
182 .start = INT_UART3,
183 .end = INT_UART3,
184 .flags = IORESOURCE_IRQ,
185 },
186};
187
188static struct platform_device palmte_irda_device = {
189 .name = "omapirda",
190 .id = -1,
191 .dev = {
192 .platform_data = &palmte_irda_config,
193 },
194 .num_resources = ARRAY_SIZE(palmte_irda_resources),
195 .resource = palmte_irda_resources,
196};
197
d7730cc0 198static struct platform_device *palmte_devices[] __initdata = {
c3695015
AZ
199 &palmte_rom_device,
200 &palmte_kp_device,
9b6553cd 201 &palmte_lcd_device,
c3695015
AZ
202 &palmte_backlight_device,
203 &palmte_irda_device,
9b6553cd
TL
204};
205
3179a019 206static struct omap_usb_config palmte_usb_config __initdata = {
c3695015 207 .register_dev = 1, /* Mini-B only receptacle */
3179a019 208 .hmc_mode = 0,
c3695015 209 .pins[0] = 2,
3179a019
TL
210};
211
3179a019 212static struct omap_lcd_config palmte_lcd_config __initdata = {
3179a019
TL
213 .ctrl_name = "internal",
214};
215
c3695015
AZ
216#ifdef CONFIG_APM
217/*
218 * Values measured in 10 minute intervals averaged over 10 samples.
219 * May differ slightly from device to device but should be accurate
220 * enough to give basic idea of battery life left and trigger
221 * potential alerts.
222 */
223static const int palmte_battery_sample[] = {
224 2194, 2157, 2138, 2120,
225 2104, 2089, 2075, 2061,
226 2048, 2038, 2026, 2016,
227 2008, 1998, 1989, 1980,
228 1970, 1958, 1945, 1928,
229 1910, 1888, 1860, 1827,
230 1791, 1751, 1709, 1656,
231};
232
233#define INTERVAL 10
234#define BATTERY_HIGH_TRESHOLD 66
235#define BATTERY_LOW_TRESHOLD 33
236
237static void palmte_get_power_status(struct apm_power_info *info, int *battery)
238{
239 int charging, batt, hi, lo, mid;
240
0b84b5ca 241 charging = !gpio_get_value(PALMTE_DC_GPIO);
c3695015
AZ
242 batt = battery[0];
243 if (charging)
244 batt -= 60;
245
246 hi = ARRAY_SIZE(palmte_battery_sample);
247 lo = 0;
248
249 info->battery_flag = 0;
250 info->units = APM_UNITS_MINS;
251
252 if (batt > palmte_battery_sample[lo]) {
253 info->battery_life = 100;
254 info->time = INTERVAL * ARRAY_SIZE(palmte_battery_sample);
255 } else if (batt <= palmte_battery_sample[hi - 1]) {
256 info->battery_life = 0;
257 info->time = 0;
258 } else {
259 while (hi > lo + 1) {
d7730cc0 260 mid = (hi + lo) >> 1;
c3695015
AZ
261 if (batt <= palmte_battery_sample[mid])
262 lo = mid;
263 else
264 hi = mid;
265 }
266
267 mid = palmte_battery_sample[lo] - palmte_battery_sample[hi];
268 hi = palmte_battery_sample[lo] - batt;
269 info->battery_life = 100 - (100 * lo + 100 * hi / mid) /
270 ARRAY_SIZE(palmte_battery_sample);
271 info->time = INTERVAL * (ARRAY_SIZE(palmte_battery_sample) -
272 lo) - INTERVAL * hi / mid;
273 }
274
275 if (charging) {
276 info->ac_line_status = APM_AC_ONLINE;
277 info->battery_status = APM_BATTERY_STATUS_CHARGING;
278 info->battery_flag |= APM_BATTERY_FLAG_CHARGING;
279 } else {
280 info->ac_line_status = APM_AC_OFFLINE;
281 if (info->battery_life > BATTERY_HIGH_TRESHOLD)
282 info->battery_status = APM_BATTERY_STATUS_HIGH;
283 else if (info->battery_life > BATTERY_LOW_TRESHOLD)
284 info->battery_status = APM_BATTERY_STATUS_LOW;
285 else
286 info->battery_status = APM_BATTERY_STATUS_CRITICAL;
287 }
288
289 if (info->battery_life > BATTERY_HIGH_TRESHOLD)
290 info->battery_flag |= APM_BATTERY_FLAG_HIGH;
291 else if (info->battery_life > BATTERY_LOW_TRESHOLD)
292 info->battery_flag |= APM_BATTERY_FLAG_LOW;
293 else
294 info->battery_flag |= APM_BATTERY_FLAG_CRITICAL;
295}
296#else
297#define palmte_get_power_status NULL
298#endif
299
d7730cc0 300static struct omap_board_config_kernel palmte_config[] __initdata = {
c3695015 301 { OMAP_TAG_LCD, &palmte_lcd_config },
3179a019
TL
302};
303
c3695015
AZ
304static struct spi_board_info palmte_spi_info[] __initdata = {
305 {
306 .modalias = "tsc2102",
307 .bus_num = 2, /* uWire (officially) */
308 .chip_select = 0, /* As opposed to 3 */
309 .irq = OMAP_GPIO_IRQ(PALMTE_PINTDAV_GPIO),
c3695015
AZ
310 .max_speed_hz = 8000000,
311 },
312};
313
d7730cc0
AZ
314static void palmte_headphones_detect(void *data, int state)
315{
316 if (state) {
c3695015 317 /* Headphones connected, disable speaker */
0b84b5ca 318 gpio_set_value(PALMTE_SPEAKER_GPIO, 0);
c3695015 319 printk(KERN_INFO "PM: speaker off\n");
d7730cc0 320 } else {
c3695015 321 /* Headphones unplugged, re-enable speaker */
0b84b5ca 322 gpio_set_value(PALMTE_SPEAKER_GPIO, 1);
c3695015
AZ
323 printk(KERN_INFO "PM: speaker on\n");
324 }
c3695015
AZ
325}
326
d7730cc0 327static void __init palmte_misc_gpio_setup(void)
c3695015 328{
d7730cc0 329 /* Set TSC2102 PINTDAV pin as input (used by TSC2102 driver) */
f2d18fea 330 if (gpio_request(PALMTE_PINTDAV_GPIO, "TSC2102 PINTDAV") < 0) {
c3695015
AZ
331 printk(KERN_ERR "Could not reserve PINTDAV GPIO!\n");
332 return;
333 }
40e3925b 334 gpio_direction_input(PALMTE_PINTDAV_GPIO);
c3695015 335
d7730cc0 336 /* Set USB-or-DC-IN pin as input (unused) */
f2d18fea 337 if (gpio_request(PALMTE_USB_OR_DC_GPIO, "USB/DC-IN") < 0) {
c3695015
AZ
338 printk(KERN_ERR "Could not reserve cable signal GPIO!\n");
339 return;
340 }
40e3925b 341 gpio_direction_input(PALMTE_USB_OR_DC_GPIO);
c3695015
AZ
342}
343
344static void __init omap_palmte_init(void)
3179a019 345{
c33da3a8
JK
346 /* mux pins for uarts */
347 omap_cfg_reg(UART1_TX);
348 omap_cfg_reg(UART1_RTS);
349 omap_cfg_reg(UART2_TX);
350 omap_cfg_reg(UART2_RTS);
351 omap_cfg_reg(UART3_TX);
352 omap_cfg_reg(UART3_RX);
353
3179a019
TL
354 omap_board_config = palmte_config;
355 omap_board_config_size = ARRAY_SIZE(palmte_config);
9b6553cd 356
d7730cc0 357 platform_add_devices(palmte_devices, ARRAY_SIZE(palmte_devices));
c3695015
AZ
358
359 spi_register_board_info(palmte_spi_info, ARRAY_SIZE(palmte_spi_info));
d7730cc0 360 palmte_misc_gpio_setup();
c3695015 361 omap_serial_init();
dd0cdd88 362 omap1_usb_init(&palmte_usb_config);
1ed16a86 363 omap_register_i2c_bus(1, 100, NULL, 0);
3179a019
TL
364}
365
c3695015 366static void __init omap_palmte_map_io(void)
3179a019 367{
87bd63f6 368 omap1_map_common_io();
3179a019
TL
369}
370
371MACHINE_START(OMAP_PALMTE, "OMAP310 based Palm Tungsten E")
3179a019
TL
372 .phys_io = 0xfff00000,
373 .io_pg_offst = ((0xfef00000) >> 18) & 0xfffc,
374 .boot_params = 0x10000100,
c3695015
AZ
375 .map_io = omap_palmte_map_io,
376 .init_irq = omap_palmte_init_irq,
377 .init_machine = omap_palmte_init,
3179a019
TL
378 .timer = &omap_timer,
379MACHINE_END