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