From: <sle...@us...> - 2007-07-07 10:14:59
|
Revision: 1114 http://svn.sourceforge.net/hackndev/?rev=1114&view=rev Author: sleep_walker Date: 2007-07-07 03:14:52 -0700 (Sat, 07 Jul 2007) Log Message: ----------- palmtt3: cumulative patch - UDC, HW UART, BT UART, IrDA support added (BT+IrDA still not working), Power Button reworked, suspend LED problem fixed, created palmtt3-gpio.h, starting to rename from palmt3 to correct palmtt3 Modified Paths: -------------- linux4palm/linux/trunk/arch/arm/mach-pxa/palmt3/palmt3.c linux4palm/linux/trunk/arch/arm/mach-pxa/palmt3/palmt3_battery.c linux4palm/linux/trunk/arch/arm/mach-pxa/palmt3/palmt3_buttons.c linux4palm/linux/trunk/drivers/i2c/chips/Kconfig linux4palm/linux/trunk/drivers/i2c/chips/tps65010.c linux4palm/linux/trunk/drivers/input/misc/Kconfig linux4palm/linux/trunk/drivers/input/misc/Makefile linux4palm/linux/trunk/drivers/leds/leds-palmtt3.c Added Paths: ----------- linux4palm/linux/trunk/include/asm-arm/arch-pxa/palmtt3-gpio.h Removed Paths: ------------- linux4palm/linux/trunk/drivers/input/misc/palmtt3-pwr_btn.c Modified: linux4palm/linux/trunk/arch/arm/mach-pxa/palmt3/palmt3.c =================================================================== --- linux4palm/linux/trunk/arch/arm/mach-pxa/palmt3/palmt3.c 2007-07-07 09:02:20 UTC (rev 1113) +++ linux4palm/linux/trunk/arch/arm/mach-pxa/palmt3/palmt3.c 2007-07-07 10:14:52 UTC (rev 1114) @@ -30,25 +30,28 @@ #include <asm/arch/ssp.h> #include <asm/arch/irq.h> //test #include <asm/arch/hardware.h> //test +#include <asm/arch/irda.h> +#include <linux/delay.h> +#include <asm/arch/udc.h> +#include <asm/arch/serial.h> #include <linux/input.h> #include <linux/soc/tsc2101.h> #include <asm/arch/pxa-pm_ll.h> #include <asm/arch/pxapwm-bl.h> +#include <asm/arch/palmtt3-gpio.h> +#include <asm/arch/tps65010.h> #include "../generic.h" // FIXME move this to include/asm/arch/palmtt3.h some time -#define PALMT3_GPIO_TSC2101_SS (24) -#define PALMT3_GPIO_PENDOWN (37) -#define PALMT3_IRQ_GPIO_PENDOWN IRQ_GPIO(PALMT3_GPIO_PENDOWN) #define DEBUG 1 /*** FRAMEBUFFER ***/ -static void palmt3_pxafb_backlight_power(int level) +static void palmtt3_pxafb_backlight_power(int level) { // just turn it on/off, other controls via backlight class if(level) @@ -57,7 +60,7 @@ CKEN = CKEN & (~CKEN1_PWM1); } -static void palmt3_pxafb_lcd_power(int level, struct fb_var_screeninfo *var) +static void palmtt3_pxafb_lcd_power(int level, struct fb_var_screeninfo *var) { if(level) { GPSR1 = GPIO_bit(38); @@ -74,7 +77,7 @@ /*** framebuffer ***/ -static struct pxafb_mode_info palmt3_lcd_modes[] = { +static struct pxafb_mode_info palmtt3_lcd_modes[] = { { .pixclock = 0, .xres = 320, @@ -90,32 +93,30 @@ } }; -static struct pxafb_mach_info palmt3_lcd_screen[] = { - { - .modes = palmt3_lcd_modes, - .num_modes = ARRAY_SIZE(palmt3_lcd_modes), +static struct pxafb_mach_info palmtt3_lcd_screen = { + .modes = palmtt3_lcd_modes, + .num_modes = ARRAY_SIZE(palmtt3_lcd_modes), .lccr0 = 0x003008F9, .lccr3 = 0x03700002, - .pxafb_backlight_power = &palmt3_pxafb_backlight_power, - .pxafb_lcd_power = &palmt3_pxafb_lcd_power, - } + .pxafb_backlight_power = &palmtt3_pxafb_backlight_power, + .pxafb_lcd_power = &palmtt3_pxafb_lcd_power, }; /*** SSP ***/ -static struct ssp_dev palmt3_ssp_dev; +static struct ssp_dev palmtt3_ssp_dev; -void palmt3_ssp_init(void) +void palmtt3_ssp_init(void) { - printk(KERN_WARNING "palmt3_tsc2101: Resetting SSP, move this to garux?\n"); + printk(KERN_WARNING "palmtt3_tsc2101: Resetting SSP, move this to garux?\n"); SSCR0 &= ~SSCR0_SSE; SSCR1 = SSCR1 & 0x3FFC; - if (ssp_init(&palmt3_ssp_dev, 1, 0)) - printk(KERN_ERR "palmt3_tsc2101: Unable to register SSP handler!\n"); + if (ssp_init(&palmtt3_ssp_dev, 1, 0)) + printk(KERN_ERR "palmtt3_tsc2101: Unable to register SSP handler!\n"); else { - ssp_enable(&palmt3_ssp_dev); - printk(KERN_INFO "palmt3_tsc2101: SSP device initialized\n"); + ssp_enable(&palmtt3_ssp_dev); + printk(KERN_INFO "palmtt3_tsc2101: SSP device initialized\n"); } return; @@ -123,77 +124,77 @@ struct ssp_state ssp1; -void palmt3_ssp_suspend(void) +void palmtt3_ssp_suspend(void) { - ssp_disable(&palmt3_ssp_dev); - ssp_save_state(&palmt3_ssp_dev,&ssp1); + ssp_disable(&palmtt3_ssp_dev); + ssp_save_state(&palmtt3_ssp_dev,&ssp1); // FIXME power off TSC2101? } -void palmt3_ssp_resume(void) +void palmtt3_ssp_resume(void) { // FIXME power on TSC2101? - ssp_restore_state(&palmt3_ssp_dev,&ssp1); - ssp_enable(&palmt3_ssp_dev); + ssp_restore_state(&palmtt3_ssp_dev,&ssp1); + ssp_enable(&palmtt3_ssp_dev); } /*** Touchscreen/Sound/Battery Status ***/ -void palmt3_tsc2101_send(int read, int command, int *values, int numval) +void palmtt3_tsc2101_send(int read, int command, int *values, int numval) { u32 ret; int i; - GPCR0 = GPIO_bit(PALMT3_GPIO_TSC2101_SS); + GPCR0 = GPIO_bit(PALMTT3_GPIO_TSC2101_SS); - ssp_write_word(&palmt3_ssp_dev, command | read); - ssp_read_word(&palmt3_ssp_dev, &ret); /* Dummy read */ + ssp_write_word(&palmtt3_ssp_dev, command | read); + ssp_read_word(&palmtt3_ssp_dev, &ret); /* Dummy read */ for (i = 0; i < numval; i++) { if (read) { - ssp_write_word(&palmt3_ssp_dev, 0); - ssp_read_word(&palmt3_ssp_dev, &values[i]); + ssp_write_word(&palmtt3_ssp_dev, 0); + ssp_read_word(&palmtt3_ssp_dev, &values[i]); } else { - ssp_write_word(&palmt3_ssp_dev, values[i]); - ssp_read_word(&palmt3_ssp_dev, &ret); /* Dummy read */ + ssp_write_word(&palmtt3_ssp_dev, values[i]); + ssp_read_word(&palmtt3_ssp_dev, &ret); /* Dummy read */ } } - GPSR0 = GPIO_bit(PALMT3_GPIO_TSC2101_SS); + GPSR0 = GPIO_bit(PALMTT3_GPIO_TSC2101_SS); } -static int palmt3_tsc2101_pendown(void) +static int palmtt3_tsc2101_pendown(void) { // FIXME PALMT3_GPIO_PENDOWN - if ((GPLR(PALMT3_GPIO_PENDOWN) & GPIO_bit(PALMT3_GPIO_PENDOWN)) == 0) + if ((GPLR(PALMTT3_GPIO_PENDOWN) & GPIO_bit(PALMTT3_GPIO_PENDOWN)) == 0) return 1; return 0; } -static struct tsc2101_platform_info palmt3_tsc2101_info = { - .send = palmt3_tsc2101_send, - .suspend = palmt3_ssp_suspend, - .resume = palmt3_ssp_resume, - .irq = PALMT3_IRQ_GPIO_PENDOWN, - .pendown = palmt3_tsc2101_pendown, +static struct tsc2101_platform_info palmtt3_tsc2101_info = { + .send = palmtt3_tsc2101_send, + .suspend = palmtt3_ssp_suspend, + .resume = palmtt3_ssp_resume, + .irq = PALMTT3_IRQ_GPIO_PENDOWN, + .pendown = palmtt3_tsc2101_pendown, }; struct platform_device tsc2101_device = { .name = "tsc2101", .dev = { - .platform_data = &palmt3_tsc2101_info, + .platform_data = &palmtt3_tsc2101_info, }, .id = -1, }; /*** Buttons ***/ -static struct platform_device palmt3_btn_device = { - .name = "palmt3-btn", +static struct platform_device palmtt3_btn_device = { + .name = "palmtt3-btn", .id = -1, }; /* Backlight ***/ -static struct pxapwmbl_platform_data palmt3_backlight_data = { +static struct pxapwmbl_platform_data palmtt3_backlight_data = { .pwm = 1, .max_intensity = 0x100, .default_intensity = 0x50, @@ -210,23 +211,195 @@ /*** Power button ***/ static struct platform_device palmtt3_power_button = { - .name = "palmtt3-pwr_btn", + .name = "tps65010-pwr_btn", .id = -1, }; -static struct platform_device palmt3_backlight_device = { +/*** IRDA ***/ + +static void palmtt3_irda_transceiver_mode(struct device *dev, int mode) +{ + unsigned long flags; + + local_irq_save(flags); + + if (mode & IR_SIRMODE){ + printk (KERN_INFO "IrDA: setting mode to SIR\n"); + } + else if (mode & IR_FIRMODE){ + printk (KERN_INFO "IrDA: setting mode to FIR\n"); + } + if (mode & IR_OFF){ + printk (KERN_INFO "IrDA: turning OFF\n"); + SET_GPIO(GPIO_NR_PALMTT3_IR_DISABLE, 1); + } + else { + printk (KERN_INFO "IrDA: turning ON\n"); + SET_GPIO(GPIO_NR_PALMTT3_IR_DISABLE, 0); + SET_GPIO(GPIO46_STRXD_MD, 1); + mdelay(30); + SET_GPIO(GPIO46_STRXD_MD, 0); + } + + local_irq_restore(flags); +} + + +static struct pxaficp_platform_data palmtt3_ficp_platform_data = { + .transceiver_cap = IR_SIRMODE | IR_FIRMODE | IR_OFF, + .transceiver_mode = palmtt3_irda_transceiver_mode, +}; + + +/*** Backlight ***/ +static struct platform_device palmtt3_backlight_device = { .name = "pxapwm-bl", .dev = { - .platform_data = &palmt3_backlight_data, + .platform_data = &palmtt3_backlight_data, }, }; +/******* + * USB * + *******/ + +static int palmtt3_udc_is_connected (void){ + int ret = GET_GPIO(GPIO_NR_PALMTT3_USB_DETECT); + if (ret) + printk (KERN_INFO "palmtt3_udc: device detected [USB_DETECT: %d]\n",ret); + else + printk (KERN_INFO "palmtt3_udc: no device detected [USB_DETECT: %d]\n",ret); + + return ret; +} + +static void palmtt3_udc_command (int cmd){ + + switch (cmd) { + case PXA2XX_UDC_CMD_DISCONNECT: + SET_GPIO(GPIO_NR_PALMTT3_PUC_USB_POWER, 0); + SET_GPIO(GPIO_NR_PALMTT3_USB_POWER, 1); + printk(KERN_INFO "palmtt3_udc: got command PXA2XX_UDC_CMD_DISCONNECT\n"); + break; + case PXA2XX_UDC_CMD_CONNECT: + SET_GPIO(GPIO_NR_PALMTT3_USB_POWER, 0); + SET_GPIO(GPIO_NR_PALMTT3_PUC_USB_POWER, 1); + printk(KERN_INFO "palmtt3_udc: got command PXA2XX_UDC_CMD_CONNECT\n"); + break; + default: + printk("palmtt3_udc: unknown command '%d'\n", cmd); + } +} + +static struct pxa2xx_udc_mach_info palmtt3_udc_mach_info __initdata = { + .udc_is_connected = palmtt3_udc_is_connected, + .udc_command = palmtt3_udc_command, +}; + + +/*** HW UART - serial in PUC ***/ +int palmtt3_hwuart_state; + +void palmtt3_hwuart_configure(int state) +{ + switch (state) { + case PXA_UART_CFG_PRE_STARTUP: + break; + case PXA_UART_CFG_POST_STARTUP: + SET_GPIO(35,0); + SET_GPIO(35,1); + palmtt3_hwuart_state = 1; + break; + case PXA_UART_CFG_PRE_SHUTDOWN: + SET_GPIO(35,0); + palmtt3_hwuart_state = 0; + break; + case PXA_UART_CFG_POST_SHUTDOWN: + break; + default: + printk("palmtt3_hwuart_configure: bad request %d\n",state); + break; + } +} + +static int palmtt3_hwuart_suspend(struct platform_device *dev, pm_message_t state) +{ + palmtt3_hwuart_configure(PXA_UART_CFG_PRE_SHUTDOWN); + return 0; +} + +static int palmtt3_hwuart_resume(struct platform_device *dev) +{ + palmtt3_hwuart_configure(PXA_UART_CFG_POST_STARTUP); + return 0; +} + +struct platform_pxa_serial_funcs palmtt3_hwuart = { + .configure = palmtt3_hwuart_configure, +/* + .set_txrx = palmtt3_hwuart_set_txrx, + .get_txrx = NULL, +*/ + .suspend = palmtt3_hwuart_suspend, + .resume = palmtt3_hwuart_resume, +}; + +/* Bluetooth */ + +void bcm2035_bt_reset(int on) +{ + printk(KERN_NOTICE "Switch BT reset %d\n", on); + if (on) + SET_GPIO(GPIO_NR_PALMTT3_RESET, 1); + else + SET_GPIO(GPIO_NR_PALMTT3_RESET, 0 ); +} +EXPORT_SYMBOL(bcm2035_bt_reset); + +void bcm2035_bt_power(int on) +{ + printk(KERN_NOTICE "Switch BT power %d\n", on); + if (on) + tps65010_set_gpio_out_value(GPIO_NR_PALMTT3_TPS65010_BT_POWER,1); + else + tps65010_set_gpio_out_value(GPIO_NR_PALMTT3_TPS65010_BT_POWER,0); +} +EXPORT_SYMBOL(bcm2035_bt_power); + + +struct bcm2035_bt_funcs { + void (*configure) ( int state ); +}; + +static struct bcm2035_bt_funcs bt_funcs; + +static void +bcm2035_bt_configure( int state ) +{ + if (bt_funcs.configure != NULL) + bt_funcs.configure( state ); +} + +static struct platform_pxa_serial_funcs bcm2035_pxa_bt_funcs = { + .configure = bcm2035_bt_configure, +}; + +static struct platform_device bcm2035_bt = { + .name = "bcm2035-bt", + .id = -1, + .dev = { + .platform_data = &bt_funcs, + }, +}; + + + /*** Suspend/Resume ***/ #ifdef CONFIG_PM static long int _PM_backup[3]; -void palmt3_suspend(unsigned long ret) +void palmtt3_suspend(unsigned long ret) { unsigned long * addr; @@ -242,12 +415,24 @@ _PM_backup[2] = *addr; *addr = ret; - PWER = 0x5C0F; - PFER = 0x3; - PEDR = 0x3; + /* event settings for waking-up */ + PWER = 0; + PWER |= PWER_RTC; /* enabling RTC alarm for wake-up */ + PWER |= PWER_WEP1; /* enabling RTC alarm for wake-up */ + PWER |= PWER_GPIO0; /* calendar/contacts/voice */ + PWER |= PWER_GPIO1; /* Active low GP_reset */ +/* PWER |= PWER_GPIO2; card insert - disabled - linux dislike ejecting card with mounted filesystem :) */ + PWER |= PWER_GPIO3; /* slider */ + PWER |= PWER_GPIO10; /* 5nav up/down/left/right */ + PWER |= PWER_GPIO11; /* memo/todo/center */ + PWER |= PWER_GPIO12; /* HotSync button on cradle */ + PWER |= PWER_GPIO14; /* power button */ + + PFER = PWER_GPIO0 | PWER_GPIO1 | PWER_GPIO11 | PWER_GPIO14; + PEDR = PWER_GPIO0 | PWER_GPIO1; } -void palmt3_resume(void) +void palmtt3_resume(void) { unsigned long * addr; @@ -261,9 +446,9 @@ *addr = _PM_backup[2]; } -static struct pxa_ll_pm_ops palmt3_pm_ops = { - .suspend = palmt3_suspend, - .resume = palmt3_resume, +static struct pxa_ll_pm_ops palmtt3_pm_ops = { + .suspend = palmtt3_suspend, + .resume = palmtt3_resume, }; #endif @@ -272,19 +457,25 @@ static struct platform_device *devices[] __initdata = { //&palmt3_bl_device, &tsc2101_device, - &palmt3_btn_device, - &palmt3_backlight_device, + &palmtt3_btn_device, + &palmtt3_backlight_device, &palmtt3_led_device, &palmtt3_power_button, + &bcm2035_bt, }; -static void __init palmt3_init(void) + +static void __init palmtt3_init(void) { - set_pxa_fb_info(palmt3_lcd_screen); #ifdef CONFIG_PM - pxa_pm_set_ll_ops(&palmt3_pm_ops); + pxa_pm_set_ll_ops(&palmtt3_pm_ops); #endif - palmt3_ssp_init(); + palmtt3_ssp_init(); + pxa_set_ficp_info(&palmtt3_ficp_platform_data); + set_pxa_fb_info(&palmtt3_lcd_screen); + pxa_set_udc_info(&palmtt3_udc_mach_info); + pxa_set_hwuart_info(&palmtt3_hwuart); + pxa_set_btuart_info(&bcm2035_pxa_bt_funcs); platform_add_devices (devices, ARRAY_SIZE (devices)); } @@ -296,5 +487,5 @@ .map_io = pxa_map_io, .init_irq = pxa_init_irq, .timer = &pxa_timer, - .init_machine = palmt3_init + .init_machine = palmtt3_init MACHINE_END Modified: linux4palm/linux/trunk/arch/arm/mach-pxa/palmt3/palmt3_battery.c =================================================================== --- linux4palm/linux/trunk/arch/arm/mach-pxa/palmt3/palmt3_battery.c 2007-07-07 09:02:20 UTC (rev 1113) +++ linux4palm/linux/trunk/arch/arm/mach-pxa/palmt3/palmt3_battery.c 2007-07-07 10:14:52 UTC (rev 1114) @@ -37,13 +37,13 @@ #define BATTERY_CHECK_INTERVAL (HZ * 60) /* every 60 seconds */ -int palmt3_battery_get_max_voltage(struct battery *bat) +int palmtt3_battery_get_max_voltage(struct battery *bat) { //return 4147; // approx. 4.21 V, 2718 as returned by TSC return 4156; // strange, but this is my current upper limit. so it be. } -int palmt3_battery_get_min_voltage(struct battery *bat) +int palmtt3_battery_get_min_voltage(struct battery *bat) { return 3710; // 3.71 V, Critical Threshold set by PalmOS } @@ -53,7 +53,7 @@ return 1; } -int palmt3_battery_get_voltage(struct battery *bat) +int palmtt3_battery_get_voltage(struct battery *bat) { struct device_driver *tscdrv; struct device *tscdev; @@ -83,51 +83,51 @@ return (batv*6250)/4096; } -int palmt3_charger_get_usb_status(struct charger *cha) +int palmtt3_charger_get_usb_status(struct charger *cha) { u8 tps65010_get_chgstatus(void); return ((tps65010_get_chgstatus() & TPS_CHG_USB)?1:0); } -int palmt3_charger_get_ac_status(struct charger *cha) +int palmtt3_charger_get_ac_status(struct charger *cha) { u8 tps65010_get_chgstatus(void); return ((tps65010_get_chgstatus() & TPS_CHG_AC)?1:0); } #ifdef CONFIG_BATTCHARGE_MONITOR -static struct battery palmt3_battery = { - .name = "palmt3_batt", +static struct battery palmtt3_battery = { + .name = "palmtt3_batt", .id = "Li-Ion battery", .min_voltage = 3710, .max_voltage = 4156, .v_current = -1, .temp = -1, - .get_voltage = palmt3_battery_get_voltage, + .get_voltage = palmtt3_battery_get_voltage, }; -static struct charger palmt3_usb_charger = { - .name = "palmt3_usb", +static struct charger palmtt3_usb_charger = { + .name = "palmtt3_usb", .id = "USB", - .get_status = palmt3_charger_get_usb_status, + .get_status = palmtt3_charger_get_usb_status, }; -static struct charger palmt3_ac_charger = { - .name = "palmt3_ac", +static struct charger palmtt3_ac_charger = { + .name = "palmtt3_ac", .id = "AC", - .get_status = palmt3_charger_get_ac_status, + .get_status = palmtt3_charger_get_ac_status, }; #endif /* -------------------------- APM ------------------------------------- */ -static void palmt3_apm_get_power_status(struct apm_power_info *info) +static void palmtt3_apm_get_power_status(struct apm_power_info *info) { int tps65010_get_charging(void); int min, max, curr, percent; - curr = palmt3_battery_get_voltage(NULL); - min = palmt3_battery_get_min_voltage(NULL); - max = palmt3_battery_get_max_voltage(NULL); + curr = palmtt3_battery_get_voltage(NULL); + min = palmtt3_battery_get_min_voltage(NULL); + max = palmtt3_battery_get_max_voltage(NULL); curr = curr - min; if (curr < 0) curr = 0; @@ -167,58 +167,58 @@ /* -------------------------------------------------------------------- */ -static int palmt3_battery_probe(struct device *dev) +static int palmtt3_battery_probe(struct device *dev) { - printk("Battery interface for palmt3 series\n"); + printk("Battery interface for palmtt3 series\n"); return 0; } -static struct device_driver palmt3_battery_driver = { - .name = "palmt3_battchargemon", +static struct device_driver palmtt3_battery_driver = { + .name = "palmtt3_battchargemon", .bus = &platform_bus_type, - .probe = palmt3_battery_probe, + .probe = palmtt3_battery_probe, }; -static int __init palmt3_battery_init(void) +static int __init palmtt3_battery_init(void) { int retval; - retval = driver_register(&palmt3_battery_driver); + retval = driver_register(&palmtt3_battery_driver); if (retval) return retval; #ifdef CONFIG_BATTCHARGE_MONITOR - retval = battery_class_register(&palmt3_battery); - retval = charger_class_register(&palmt3_usb_charger); - retval = charger_class_register(&palmt3_ac_charger); + retval = battery_class_register(&palmtt3_battery); + retval = charger_class_register(&palmtt3_usb_charger); + retval = charger_class_register(&palmtt3_ac_charger); - battery_attach_charger(&palmt3_battery, &palmt3_usb_charger); - battery_attach_charger(&palmt3_battery, &palmt3_ac_charger); + battery_attach_charger(&palmtt3_battery, &palmtt3_usb_charger); + battery_attach_charger(&palmtt3_battery, &palmtt3_ac_charger); - battery_update_charge_link(&palmt3_battery); + battery_update_charge_link(&palmtt3_battery); #endif if (!retval) { #ifdef CONFIG_PM - set_apm_get_power_status(palmt3_apm_get_power_status); + set_apm_get_power_status(palmtt3_apm_get_power_status); #endif } return retval; } -static void __exit palmt3_battery_exit(void) +static void __exit palmtt3_battery_exit(void) { #ifdef CONFIG_BATTCHARGE_MONITOR - battery_remove_charger(0, &palmt3_ac_charger); - battery_remove_charger(0, &palmt3_usb_charger); + battery_remove_charger(0, &palmtt3_ac_charger); + battery_remove_charger(0, &palmtt3_usb_charger); - charger_class_unregister(&palmt3_usb_charger); - charger_class_unregister(&palmt3_ac_charger); - battery_class_unregister(&palmt3_battery); - driver_unregister(&palmt3_battery_driver); + charger_class_unregister(&palmtt3_usb_charger); + charger_class_unregister(&palmtt3_ac_charger); + battery_class_unregister(&palmtt3_battery); + driver_unregister(&palmtt3_battery_driver); #endif } -module_init(palmt3_battery_init); -module_exit(palmt3_battery_exit); +module_init(palmtt3_battery_init); +module_exit(palmtt3_battery_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Vladimir Pouzanov"); Modified: linux4palm/linux/trunk/arch/arm/mach-pxa/palmt3/palmt3_buttons.c =================================================================== --- linux4palm/linux/trunk/arch/arm/mach-pxa/palmt3/palmt3_buttons.c 2007-07-07 09:02:20 UTC (rev 1113) +++ linux4palm/linux/trunk/arch/arm/mach-pxa/palmt3/palmt3_buttons.c 2007-07-07 10:14:52 UTC (rev 1114) @@ -1,5 +1,5 @@ /* - * Palm T|T3 hardware buttons + * Palm Tungsten|T3 hardware buttons * * Author: Vladimir "Farcaller" Pouzanov <far...@gm...>, Martin Kupec * @@ -77,24 +77,24 @@ struct input_dev *buttons_dev; -static struct workqueue_struct *palmt3_workqueue; -static struct work_struct palmt3_irq_task; +static struct workqueue_struct *palmtt3_workqueue; +static struct work_struct palmtt3_irq_task; static spinlock_t btn_lock = SPIN_LOCK_UNLOCKED; u16 key_status; u8 slider; -static irqreturn_t palmt3_btn_handle(int irq, void *dev_id) +static irqreturn_t palmtt3_btn_handle(int irq, void *dev_id) { if((int) dev_id == 3) slider = 1; - queue_work(palmt3_workqueue, &palmt3_irq_task); + queue_work(palmtt3_workqueue, &palmtt3_irq_task); return IRQ_HANDLED; } -static void palmt3_irq_queuework(struct work_struct *data) +static void palmtt3_irq_queuework(struct work_struct *data) { unsigned long flags; int row, gpio, i; @@ -225,7 +225,7 @@ } } -static int palmt3_btn_probe(struct platform_device *dev) +static int palmtt3_btn_probe(struct platform_device *dev) { unsigned long flags, ret; @@ -251,8 +251,8 @@ key_status = 0; - palmt3_workqueue = create_workqueue("palmt3btnw"); - INIT_WORK(&palmt3_irq_task, palmt3_irq_queuework); + palmtt3_workqueue = create_workqueue("palmtt3btnw"); + INIT_WORK(&palmtt3_irq_task, palmtt3_irq_queuework); /* Configure GPIOs as Output and low */ spin_lock_irqsave(&btn_lock, flags); @@ -274,7 +274,7 @@ spin_unlock_irqrestore(&btn_lock, flags); #define REG_GPIO(x, e) \ - ret = request_irq (IRQ_GPIO(x), palmt3_btn_handle, SA_SAMPLE_RANDOM, "palmt3_btn", (void*)x); \ + ret = request_irq (IRQ_GPIO(x), palmtt3_btn_handle, SA_SAMPLE_RANDOM, "palmtt3_btn", (void*)x); \ set_irq_type (IRQ_GPIO(x), e); \ if(ret!=0) { \ DBG("Request GPIO: %d failed\n", x); \ @@ -291,9 +291,9 @@ return 0; } -static int palmt3_btn_remove (struct platform_device *dev) +static int palmtt3_btn_remove (struct platform_device *dev) { - destroy_workqueue(palmt3_workqueue); + destroy_workqueue(palmtt3_workqueue); input_unregister_device(buttons_dev); free_irq(IRQ_GPIO(0), (void*) 0); @@ -303,31 +303,31 @@ return 0; } -static struct platform_driver palmt3_buttons_driver = { +static struct platform_driver palmtt3_buttons_driver = { .driver = { - .name = "palmt3-btn", + .name = "palmtt3-btn", .owner = THIS_MODULE, }, - .probe = palmt3_btn_probe, - .remove = palmt3_btn_remove, + .probe = palmtt3_btn_probe, + .remove = palmtt3_btn_remove, #ifdef CONFIG_PM .suspend = NULL, .resume = NULL, #endif }; -static int __init palmt3_btn_init(void) +static int __init palmtt3_btn_init(void) { - return platform_driver_register(&palmt3_buttons_driver); + return platform_driver_register(&palmtt3_buttons_driver); } -static void __exit palmt3_btn_cleanup(void) +static void __exit palmtt3_btn_cleanup(void) { - platform_driver_unregister(&palmt3_buttons_driver); + platform_driver_unregister(&palmtt3_buttons_driver); } -module_init(palmt3_btn_init); -module_exit(palmt3_btn_cleanup); +module_init(palmtt3_btn_init); +module_exit(palmtt3_btn_cleanup); MODULE_AUTHOR("Martin Kupec"); MODULE_DESCRIPTION("Palm T|T3 Buttons driver"); Modified: linux4palm/linux/trunk/drivers/i2c/chips/Kconfig =================================================================== --- linux4palm/linux/trunk/drivers/i2c/chips/Kconfig 2007-07-07 09:02:20 UTC (rev 1113) +++ linux4palm/linux/trunk/drivers/i2c/chips/Kconfig 2007-07-07 10:14:52 UTC (rev 1114) @@ -115,7 +115,7 @@ # and having mostly OMAP-specific board support config TPS65010 tristate "TPS6501x Power Management chips" - depends on I2C && (ARCH_OMAP || (MACH_T3XSCALE && INPUT_PALMTT3_PWRBTN)) + depends on I2C && (ARCH_OMAP || MACH_T3XSCALE) default y if MACH_OMAP_H2 || MACH_OMAP_H3 || MACH_OMAP_OSK help If you say yes here you get support for the TPS6501x series of @@ -126,6 +126,14 @@ This driver can also be built as a module. If so, the module will be called tps65010. +config TPS65010_PWRBTN + bool "TPS65010 Power button support" + depends on TPS65010 + default y if MACH_T3XSCALE + help + If you say yes here you get support for PB_ONOFF pins on TPS6501x + series of Power Management chips. This will create input device. + config SENSORS_M41T00 tristate "ST M41T00 RTC chip" depends on I2C && PPC32 Modified: linux4palm/linux/trunk/drivers/i2c/chips/tps65010.c =================================================================== --- linux4palm/linux/trunk/drivers/i2c/chips/tps65010.c 2007-07-07 09:02:20 UTC (rev 1113) +++ linux4palm/linux/trunk/drivers/i2c/chips/tps65010.c 2007-07-07 10:14:52 UTC (rev 1114) @@ -41,8 +41,15 @@ // FIXME xscale GPIOs #include <asm/arch/irqs.h> -#if defined(CONFIG_INPUT_PALMTT3_PWRBTN_MODULE) || defined(CONFIG_INPUT_PALMTT3_PWRBTN) -extern int palmtt3_pwr_btn_press(void); +#ifdef CONFIG_TPS65010_PWRBTN +#include <linux/input.h> +#include <linux/input_pda.h> +#include <linux/platform_device.h> + +#define BTN_HOLD_DELAY msecs_to_jiffies(100) + +int tps65010_pwr_btn_press(void); +int tps65010_pwr_btn_release(void); #endif #define T3_TPS65010_GPIO 14 @@ -103,6 +110,10 @@ unsigned model:8; u16 vbus; unsigned long flags; +#ifdef CONFIG_TPS65010_PWRBTN + u8 button_pressed; +#endif + #define FLAG_VBUS_CHANGED 0 #define FLAG_IRQ_ENABLE 1 @@ -113,7 +124,7 @@ /* not currently tracking GPIO state */ }; -#define POWER_POLL_DELAY msecs_to_jiffies(500) +#define POWER_POLL_DELAY msecs_to_jiffies(5000) /*-------------------------------------------------------------------------*/ @@ -211,6 +222,16 @@ #endif +/* + * This function clears button press information on suspend. + * Without this resuming up with power button sends event to suspend. + */ +static int tps65010_resume(struct i2c_client *client) +{ + i2c_smbus_read_byte_data(client, TPS_REGSTATUS); + return 0; +} + #ifdef CONFIG_DEBUG_FS static int dbg_show(struct seq_file *s, void *_) @@ -363,8 +384,9 @@ if (tmp & TPS_REG_ONOFF) { pr_info("%s: power off button\n", DRIVER_NAME); -#if defined(CONFIG_INPUT_PALMTT3_PWRBTN_MODULE) || defined(CONFIG_INPUT_PALMTT3_PWRBTN) - palmtt3_pwr_btn_press(); +#ifdef CONFIG_TPS65010_PWRBTN + tps65010_pwr_btn_press(); + tps->button_pressed = 1; #endif #if 0 @@ -459,6 +481,16 @@ tps->chgconf = tmp; show_chgconfig(tps->por, "update vbus", tmp); } +#ifdef CONFIG_TPS65010_PWRBTN + if (tps->button_pressed) { + if ((1 << 7) & i2c_smbus_read_byte_data(&tps->client, TPS_REGSTATUS)) + schedule_delayed_work(&tps->work, BTN_HOLD_DELAY); + else { + tps->button_pressed = 0; + tps65010_pwr_btn_release(); + } + } +#endif if (test_and_clear_bit(FLAG_IRQ_ENABLE, &tps->flags)) enable_irq(tps->irq); @@ -540,6 +572,10 @@ tps->client.addr = address; tps->client.adapter = bus; tps->client.driver = &tps65010_driver; + tps->client.driver->resume = &tps65010_resume; +#ifdef CONFIG_TPS65010_PWRBTN + tps->button_pressed = 0; +#endif strlcpy(tps->client.name, DRIVER_NAME, I2C_NAME_SIZE); status = i2c_attach_client(&tps->client); @@ -650,8 +686,8 @@ */ tps->nmask1 = ~0; (void) i2c_smbus_write_byte_data(&tps->client, TPS_MASK1, ~tps->nmask1); + tps->nmask2 = TPS_REG_ONOFF; - tps->nmask2 = TPS_REG_ONOFF; if (tps->model == TPS65013) tps->nmask2 |= TPS_REG_NO_CHG; (void) i2c_smbus_write_byte_data(&tps->client, TPS_MASK2, ~tps->nmask2); @@ -1052,7 +1088,83 @@ EXPORT_SYMBOL(tps65013_set_low_pwr); /*-------------------------------------------------------------------------*/ +/* NOTE: PB_ONOFF pins are supported here as input_device + * + */ +#ifdef CONFIG_TPS65010_PWRBTN +#define PWRBTN_REPEAT_DELAY 1000 +#define PWRBTN_REPEAT_PERIOD 500 +struct input_dev *pwr_btn_input; +char keycode = KEY_F8; + + +int tps65010_pwr_btn_press(void) +{ + printk("tps65010_pwr_btn_press\n"); + input_report_key(pwr_btn_input, keycode, 1); + input_sync(pwr_btn_input); + return 0; +} + +int tps65010_pwr_btn_release(void) +{ + printk("tps65010_pwr_btn_release\n"); + input_report_key(pwr_btn_input, keycode, 0); + input_sync(pwr_btn_input); + return 0; +} + + +static int __init tps65010_pwr_btn_probe(struct platform_device *pdev) +{ + + pwr_btn_input = input_allocate_device(); + if (!pwr_btn_input) { + printk("Input device wasn't allocated!\n"); + goto err1; + } + + pwr_btn_input->name = "tps65010-pwr_btn"; + pwr_btn_input->id.bustype = BUS_HOST; + set_bit(EV_KEY, pwr_btn_input->evbit); + + set_bit(EV_REP, pwr_btn_input->evbit); +/* + pwr_btn_input->rep[REP_DELAY] = PWRBTN_REPEAT_DELAY; + pwr_btn_input->rep[REP_PERIOD] = PWRBTN_REPEAT_PERIOD; +*/ + set_bit(keycode,pwr_btn_input->keybit); + input_register_device(pwr_btn_input); + + return 0; +err1: + return -ENOMEM; +} + + +static int tps65010_pwr_btn_remove(struct platform_device *pdev) +{ + input_unregister_device(pwr_btn_input); + return 0; +} + +static struct platform_driver tps65010_pwr_btn_driver = { + .driver = { + .name = "tps65010-pwr_btn", + .owner = THIS_MODULE, + }, + .probe = tps65010_pwr_btn_probe, + .remove = tps65010_pwr_btn_remove, + .suspend = NULL, + .resume = NULL, + +}; +#endif + + + + static int __init tps_init(void) { u32 tries = 3; @@ -1120,6 +1232,9 @@ } #endif +#ifdef CONFIG_TPS65010_PWRBTN + status &= platform_driver_register(&tps65010_pwr_btn_driver); +#endif return status; } /* NOTE: this MUST be initialized before the other parts of the system @@ -1133,7 +1248,9 @@ static void __exit tps_exit(void) { +#ifdef CONFIG_TPS65010_PWRBTN + platform_driver_unregister(&tps65010_pwr_btn_driver); +#endif i2c_del_driver(&tps65010_driver); } module_exit(tps_exit); - Modified: linux4palm/linux/trunk/drivers/input/misc/Kconfig =================================================================== --- linux4palm/linux/trunk/drivers/input/misc/Kconfig 2007-07-07 09:02:20 UTC (rev 1113) +++ linux4palm/linux/trunk/drivers/input/misc/Kconfig 2007-07-07 10:14:52 UTC (rev 1114) @@ -89,10 +89,4 @@ Say Y here if you want to support the built-in real time clock of the HP SDC controller. -config INPUT_PALMTT3_PWRBTN - tristate "Palm Tungsten|T3 Power Button" - depends on MACH_T3XSCALE - help - Say Y here if you want to support the power button of Palm Tungsten|T3 Power Button. - endif Modified: linux4palm/linux/trunk/drivers/input/misc/Makefile =================================================================== --- linux4palm/linux/trunk/drivers/input/misc/Makefile 2007-07-07 09:02:20 UTC (rev 1113) +++ linux4palm/linux/trunk/drivers/input/misc/Makefile 2007-07-07 10:14:52 UTC (rev 1114) @@ -12,4 +12,3 @@ obj-$(CONFIG_INPUT_ATLAS_BTNS) += atlas_btns.o obj-$(CONFIG_HP_SDC_RTC) += hp_sdc_rtc.o obj-$(CONFIG_INPUT_IXP4XX_BEEPER) += ixp4xx-beeper.o -obj-$(CONFIG_INPUT_PALMTT3_PWRBTN) += palmtt3-pwr_btn.o Deleted: linux4palm/linux/trunk/drivers/input/misc/palmtt3-pwr_btn.c =================================================================== --- linux4palm/linux/trunk/drivers/input/misc/palmtt3-pwr_btn.c 2007-07-07 09:02:20 UTC (rev 1113) +++ linux4palm/linux/trunk/drivers/input/misc/palmtt3-pwr_btn.c 2007-07-07 10:14:52 UTC (rev 1114) @@ -1,96 +0,0 @@ -/* - * Palm Tungsten|T3 Power Button Driver - * - * Author: Tomas Cech <Tom...@ma...> - * - * 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. - * - */ - -#include <linux/init.h> -#include <linux/input.h> -#include <linux/input_pda.h> -#include <linux/interrupt.h> -#include <linux/module.h> -#include <linux/platform_device.h> -#include <asm/irq.h> -#include <asm/mach/arch.h> -#include <asm/mach/map.h> -#include <asm/mach-types.h> -#include <asm/hardware.h> -#include <asm/arch/pxa-regs.h> -#include <asm/arch/irqs.h> - -#define PWRBTN_REPEAT_DELAY 1000 -#define PWRBTN_REPEAT_PERIOD 500 -struct input_dev *pwr_btn_input; -char keycode = KEY_F8; - - -int palmtt3_pwr_btn_press(void) { - printk("palmtt3_pwr_btn_press\n"); - input_report_key(pwr_btn_input, keycode, 1); - input_report_key(pwr_btn_input, keycode, 0); - input_sync(pwr_btn_input); - return 0; -} - -EXPORT_SYMBOL(palmtt3_pwr_btn_press); - -static int __init palmtt3_pwr_btn_probe(struct platform_device *pdev) -{ - - pwr_btn_input = input_allocate_device(); - if (!pwr_btn_input) { - printk("Input device wasn't allocated!\n"); - goto err1; - } - - pwr_btn_input->name = "palmtt3-pwr_btn"; - pwr_btn_input->id.bustype = BUS_HOST; - set_bit(EV_KEY, pwr_btn_input->evbit); - set_bit(keycode,pwr_btn_input->keybit); - input_register_device(pwr_btn_input); - - return 0; -err1: - return -ENOMEM; -} - - -static int palmtt3_pwr_btn_remove(struct platform_device *pdev) -{ - input_unregister_device(pwr_btn_input); - return 0; -} - -static struct platform_driver palmtt3_pwr_btn_driver = { - .driver = { - .name = "palmtt3-pwr_btn", - .owner = THIS_MODULE, - }, - .probe = palmtt3_pwr_btn_probe, - .remove = palmtt3_pwr_btn_remove, - .suspend = NULL, - .resume = NULL, - -}; - -static int __devinit palmtt3_pwr_btn_init(void) -{ - return platform_driver_register(&palmtt3_pwr_btn_driver); -} - -static void __exit palmtt3_pwr_btn_exit(void) -{ - platform_driver_unregister(&palmtt3_pwr_btn_driver); -} - -module_init(palmtt3_pwr_btn_init); -module_exit(palmtt3_pwr_btn_exit); - -MODULE_AUTHOR("Tomas Cech <Tom...@ma...>"); -MODULE_DESCRIPTION("Power Button for Palm Tungsten|T3"); -MODULE_LICENSE("GPL"); Modified: linux4palm/linux/trunk/drivers/leds/leds-palmtt3.c =================================================================== --- linux4palm/linux/trunk/drivers/leds/leds-palmtt3.c 2007-07-07 09:02:20 UTC (rev 1113) +++ linux4palm/linux/trunk/drivers/leds/leds-palmtt3.c 2007-07-07 10:14:52 UTC (rev 1114) @@ -49,7 +49,8 @@ if (value) palmtt3led_work.led1 = ON; else - palmtt3led_work.led1 = OFF; +/* NOTE: This is set to OFF, not to OFF... It shows charging status - plugged/unplugged... */ + palmtt3led_work.led1 = UNDER_CHG_CTRL; schedule_work(&(palmtt3led_work.work)); } @@ -67,8 +68,7 @@ if (value) palmtt3led_work.led1 = BLINK; else -/* NOTE: This is set to OFF, not to OFF... It shows charging status - plugged/unplugged... */ - palmtt3led_work.led1 = UNDER_CHG_CTRL; + palmtt3led_work.led1 = OFF; schedule_work(&(palmtt3led_work.work)); } @@ -120,6 +120,20 @@ return 0; } +static int palmtt3led_suspend_late(struct platform_device *dev, pm_message_t state) +{ + tps65010_set_led(LED1, OFF); + tps65010_set_led(LED2, OFF); + tps65010_set_vib(OFF); + return 0; +} + +static int palmtt3led_resume_early(struct platform_device *dev) +{ + schedule_work(&(palmtt3led_work.work)); + return 0; +} + static int palmtt3led_resume(struct platform_device *dev) { led_classdev_resume(&palmtt3_red_led); @@ -163,6 +177,9 @@ led_classdev_unregister(&palmtt3_green_blink_led); } + palmtt3led_work.led1 = UNDER_CHG_CTRL; + palmtt3led_work.led2 = OFF; + palmtt3led_work.vibra = OFF; INIT_WORK(&(palmtt3led_work.work),tps650101_scheduled_leds); return ret; } @@ -183,6 +200,8 @@ #ifdef CONFIG_PM .suspend = palmtt3led_suspend, .resume = palmtt3led_resume, + .suspend_late = palmtt3led_suspend_late, + .resume_early = palmtt3led_resume_early, #endif .driver = { .name = "palmtt3-led", Added: linux4palm/linux/trunk/include/asm-arm/arch-pxa/palmtt3-gpio.h =================================================================== --- linux4palm/linux/trunk/include/asm-arm/arch-pxa/palmtt3-gpio.h (rev 0) +++ linux4palm/linux/trunk/include/asm-arm/arch-pxa/palmtt3-gpio.h 2007-07-07 10:14:52 UTC (rev 1114) @@ -0,0 +1,54 @@ +/* + * GPIOs and interrupts for Palm Tungsten|T3 Handheld Computer + * + * Copied from on palmt5-gpio.h by Marek Vasut and T|T3 files + * + * Authors: Tomas Cech <Tom...@ma...> + * + * 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. + * + * + * this code is in a very early stage: + * - use it at your own risk + * - any help is encouraged and will be highly appreciated + * + */ + +#ifndef _INCLUDE_PALMTT3_GPIO_H_ + +#define _INCLUDE_PALMTT3_GPIO_H_ + + +#define T3_TPS65010_GPIO 14 +#define PALMTT3_GPIO_TSC2101_SS (24) +#define PALMTT3_GPIO_PENDOWN (37) +#define PALMTT3_IRQ_GPIO_PENDOWN IRQ_GPIO(PALMTT3_GPIO_PENDOWN) + +#define GPIO_NR_PALMTT3_ICP_RXD 46 // Infrared receive pin +#define GPIO_NR_PALMTT3_ICP_TXD 47 // Infrared transmit pin +#define GPIO_NR_PALMTT3_IR_DISABLE 36 + +#define GPIO_NR_PALMTT3_ICP_RXD_MD (GPIO_NR_PALMTT3_ICP_RXD | GPIO_ALT_FN_1_IN) +#define GPIO_NR_PALMTT3_ICP_TXD_MD (GPIO_NR_PALMTT3_ICP_TXD | GPIO_ALT_FN_2_OUT) + +#define GPIO_NR_PALMTT3_USB_POWER 53 +#define GPIO_NR_PALMTT3_PUC_USB_POWER 85 +#define GPIO_NR_PALMTT3_USB_DETECT 9 + +#define GPIO_NR_PALMTT3_TPS65010_BT_POWER 4 +#define GPIO_NR_PALMTT3_RESET 84 + + +#define GET_GPIO(gpio) (GPLR(gpio) & GPIO_bit(gpio)) + +#define SET_GPIO(gpio, setp) \ + do { \ + if (setp) \ + GPSR(gpio) = GPIO_bit(gpio); \ + else \ + GPCR(gpio) = GPIO_bit(gpio); \ + } while (0) + +#endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |