From: <z7...@us...> - 2007-01-23 18:09:32
|
Revision: 776 http://svn.sourceforge.net/hackndev/?rev=776&view=rev Author: z72ka Date: 2007-01-23 10:08:22 -0800 (Tue, 23 Jan 2007) Log Message: ----------- Palmz72: - Partially fixed problems with old LCD panels - new power management driver (suspend/resume support) - clear code (for lucidity) Modified Paths: -------------- linux4palm/linux/trunk/arch/arm/mach-pxa/palmz72/palmz72.c linux4palm/linux/trunk/arch/arm/mach-pxa/palmz72/palmz72_ac97.c linux4palm/linux/trunk/arch/arm/mach-pxa/palmz72/palmz72_pm.c Modified: linux4palm/linux/trunk/arch/arm/mach-pxa/palmz72/palmz72.c =================================================================== --- linux4palm/linux/trunk/arch/arm/mach-pxa/palmz72/palmz72.c 2007-01-23 09:53:18 UTC (rev 775) +++ linux4palm/linux/trunk/arch/arm/mach-pxa/palmz72/palmz72.c 2007-01-23 18:08:22 UTC (rev 776) @@ -1,12 +1,12 @@ -/* - * Hardware definitions for Palm Zire 72 - * - * Authors: - * Vladimir "Farcaller" Pouzanov <far...@gm...> - * Sergey Lapin <sla...@gm...> - * Alex Osborne <bob...@gm...> - * Jan Herman <2h...@se...> - */ +/**************************************************************** + * Hardware definitions for PalmOne Zire 72 * + * * + * Authors: * + * Vladimir "Farcaller" Pouzanov <far...@gm...> * + * Sergey Lapin <sla...@gm...> * + * Alex Osborne <bob...@gm...> * + * Jan Herman <2h...@se...> * + ****************************************************************/ #include <linux/kernel.h> #include <linux/init.h> @@ -50,34 +50,26 @@ #define DEBUG -#define IR_TRANSCEIVER_ON \ - SET_HX4700_GPIO_N(IR_ON, 1) - -#define IR_TRANSCEIVER_OFF \ - SET_HX4700_GPIO_N(IR_ON, 0) - - -/** - * SD/MMC card controller - */ +/************************** + * SD/MMC card controller * + **************************/ static int palmz72_mci_init(struct device *dev, irqreturn_t (*palmz72_detect_int)(int, void *, struct pt_regs *), void *data) { int err; - /** + /* * Setup an interrupt for detecting card insert/remove events */ set_irq_type(IRQ_GPIO_PALMZ72_SD_DETECT_N, IRQT_BOTHEDGE); err = request_irq(IRQ_GPIO_PALMZ72_SD_DETECT_N, palmz72_detect_int, - SA_INTERRUPT, "SD/MMC card detect", data); + SA_INTERRUPT, "SD/MMC card detected", data); if(err) { printk(KERN_ERR "palmz72_mci_init: cannot request SD/MMC card detect IRQ\n"); return -1; } - printk("palmz72_mci_init: irq registered\n"); return 0; @@ -96,14 +88,18 @@ }; -/* * LED */ +/******* + * LED * + *******/ -static struct platform_device palmz72led_device = { +static struct platform_device palmz72_led_device = { .name = "palmz72-led", .id = -1, }; -/* USB */ +/******* + * USB * + *******/ static int palmz72_udc_is_connected(void) { @@ -138,34 +134,34 @@ .udc_command = palmz72_udc_command, }; -/* - * Keypad - */ +/********** + * Keypad * + **********/ static struct pxa27x_keyboard_platform_data palmz72_kbd_data = { .nr_rows = 4, .nr_cols = 3, .keycodes = { { /* row 0 */ - KEY_POWER, /* Power KEY */ - KEY_F13, /* Photos */ - KEY_ENTER, /* DPAD Center*/ + KEY_POWER, /* Power key */ + KEY_F13, /* Photos */ + KEY_ENTER, /* DPAD Center */ }, { /* row 1 */ - KEY_F9, /* Calendar*/ - KEY_F10, /* Contacts */ - KEY_F12, /* Media */ + KEY_F9, /* Calendar */ + KEY_F10, /* Contacts */ + KEY_F12, /* Media */ }, { /* row 2 */ - KEY_UP, /* D-PAD UP*/ - KEY_V, /* unused */ - KEY_DOWN, /* D-PAD DOWN */ + KEY_UP, /* D-PAD UP */ + 0, /* unused */ + KEY_DOWN, /* D-PAD DOWN */ }, { /* row 3 */ - KEY_RIGHT, /* D-PAD RIGHT */ - KEY_S, /* ?? */ - KEY_LEFT, /* D-PAD LEFT */ + KEY_RIGHT, /* D-PAD RIGHT */ + 0, /* unused */ + KEY_LEFT, /* D-PAD LEFT */ }, }, .gpio_modes = { @@ -189,7 +185,9 @@ }; -/* IRDA */ +/******** + * IRDA * + ********/ static void palmz72_irda_configure (struct uart_pxa_port *up, int enable) @@ -204,15 +202,9 @@ /* configure STUART to for SIR */ STISR = STISR_XMODE | STISR_RCVEIR | STISR_RXPL; GPSR(91) = GPIO_bit(91); - -// STIER = STIER | IER_UUE; - //IR_TRANSCEIVER_ON; } else { STISR = 0; -// GPCR(91) = GPIO_bit(91); -// STIER = STIER & ~IER_UUE; - //IR_TRANSCEIVER_OFF; - } + } } static void @@ -236,9 +228,7 @@ if (new_stisr != old_stisr) { while (!(STLSR & LSR_TEMT)) ; - //IR_TRANSCEIVER_OFF; STISR = new_stisr; - //IR_TRANSCEIVER_ON; } } @@ -256,9 +246,9 @@ .get_txrx = palmz72_irda_get_txrx, }; -/** - * AC97 audio controller - */ +/************************* + * AC97 audio controller * + *************************/ static pxa2xx_audio_ops_t palmz72_audio_ops = { @@ -280,9 +270,9 @@ -/** - * Backlight - */ +/************* + * Backlight * + *************/ #define PALMZ72_MAX_INTENSITY 0x100 #define PALMZ72_DEFAULT_INTENSITY 0x7E @@ -304,33 +294,64 @@ }, }; -static struct platform_device *devices[] __initdata = { - &palmz72_ac97, - &palmz72_backlight, - &palmz72_keypad, - &palmz72led_device, -}; -/* framebuffer */ +/*************** + * framebuffer * + ***************/ + static struct pxafb_mach_info palmz72lcd __initdata = { - .pixclock = 80000, + + /* Dump at 94000000 to 9400000c + LCCR1: 1b070d3f: 1b = 27 = left_margin + 07 = 7 = right_margin + 0d = 13 = hsync_lenght + LCCR2: 0708013f: 07 = 7 = upper_margin + 08 = 8 = lower_margin + 01 = 1 = vsync_lenght + */ + + .pixclock = 0, .xres = 320, .yres = 320, .bpp = 16, - .hsync_len = 4, + .hsync_len = 6, // This value is optimized for older problematic LCD panels .left_margin = 27, .right_margin = 7, .vsync_len = 1, - .upper_margin = 8, - .lower_margin = 7, + .upper_margin = 6, // This value is optimized for older problematic LCD panels + .lower_margin = 9, // This value is optimized for older problematic LCD panels .sync = FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, .lccr0 = 0x07B008F9, - .lccr3 = 0x03700007, + .lccr3 = 0x03700007, .pxafb_backlight_power = NULL, }; +/******************** + * Power Management * + ********************/ + +struct platform_device palmz72_pm = { + .name = "palmz72-pm", + .id = -1, + .dev = { + .platform_data = NULL, + }, +}; + +/**************** + * Init Machine * + ****************/ + +static struct platform_device *devices[] __initdata = { + &palmz72_ac97, + &palmz72_pm, + &palmz72_backlight, + &palmz72_keypad, + &palmz72_led_device, +}; + static void __init palmz72_init(void) { GCR &= ~GCR_PRIRDY_IEN; @@ -346,10 +367,7 @@ pxa_gpio_mode(GPIO29_SDATA_IN_AC97_MD); pxa_gpio_mode(GPIO30_SDATA_OUT_AC97_MD); pxa_gpio_mode(GPIO31_SYNC_AC97_MD); - - // testing -// GPSR(91) = GPIO_bit(91); - + switch(palmz72lcd.bpp) { case 8: @@ -359,29 +377,22 @@ palmz72lcd.lccr3=0x04700007; break; } - -#ifdef CONFIG_PM - extern struct pxa_ll_pm_ops palmz72_ll_pm_ops; - pxa_pm_set_ll_ops(&palmz72_ll_pm_ops); -#endif + set_pxa_fb_info(&palmz72lcd); pxa_set_mci_info( &palmz72_mci_platform_data ); pxa_set_udc_info(&palmz72_udc_mach_info ); stuart_device.dev.platform_data = &palmz72_pxa_irda_funcs; platform_add_devices( devices, ARRAY_SIZE(devices) ); -#if 0 -#ifdef EARLY_SIR_CONSOLE - palmlz72_irda_configure (NULL, 1); - palmlz72_irda_set_txrx (NULL, PXA_SERIAL_TX); -#endif -#endif -// LED_OFF; } MACHINE_START(PALMZ72, "Palm Zire 72") - /* Maintainer: Vladimir Pouzanov <far...@gm...> */ - /* Maintainer: Sergey Lapin <sla...@gm...> */ - /* Maintainer: Jan Herman <2h...@se...> */ + + /********************************************************/ + /* Maintainers: Vladimir Pouzanov <far...@gm...> */ + /* Sergey Lapin <sla...@gm...> */ + /* Jan Herman <2h...@se...> */ + /********************************************************/ + .boot_params = 0xa0000100, .phys_io = 0x40000000, .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, Modified: linux4palm/linux/trunk/arch/arm/mach-pxa/palmz72/palmz72_ac97.c =================================================================== --- linux4palm/linux/trunk/arch/arm/mach-pxa/palmz72/palmz72_ac97.c 2007-01-23 09:53:18 UTC (rev 775) +++ linux4palm/linux/trunk/arch/arm/mach-pxa/palmz72/palmz72_ac97.c 2007-01-23 18:08:22 UTC (rev 776) @@ -1,11 +1,11 @@ -/* - * linux/arch/arm/mach-pxa/palmz72/palmz72_ac97.c - * - * Touchscreen/battery driver for Palm Zire 72 WM9712 AC97 codec - * Author: Jan Herman <2h...@se...> - * Based on palmld_ac97.c code from Alex Osborne - * - */ +/************************************************************************ + * linux/arch/arm/mach-pxa/palmz72/palmz72_ac97.c * + * * + * Touchscreen/battery driver for Palm Zire 72 WM9712 AC97 codec * + * Author: Jan Herman <2h...@se...> * + * Based on palmld_ac97.c code from Alex Osborne * + * * + ************************************************************************/ #include <linux/kernel.h> @@ -54,7 +54,9 @@ #define palmz72_ac97_WORK_QUEUE_NAME "palmz72_ac97_workqueue" -/* module parameters */ +/********************* + * Module parameters * + *********************/ static int ptrsh = DEFAULT_PRESSURE_TRESHOLD; module_param(ptrsh, int, 0); @@ -91,9 +93,9 @@ static int previous_voltage; static u16 d2base; -/* - * ac97 codec - */ +/************** + * ac97 codec * + **************/ void wm97xx_gpio_func(int gpio, int func) { @@ -239,7 +241,7 @@ polarity = ac97->bus->ops->read(ac97, 0x4e); if(polarity & levels & WM97XX_GPIO_13) { - // power up digitiser: + /* power up digitiser: */ down(&digitiser_sem); wm97xx_set_digitiser_power(WM97XX_PRP_DET_DIG); @@ -304,7 +306,7 @@ wm97xx_gpio_mode(WM97XX_GPIO_13, WM97XX_GPIO_OUT, WM97XX_GPIO_POL_HIGH, WM97XX_GPIO_STICKY, WM97XX_GPIO_WAKE); - // setup work queue + /* setup work queue */ palmz72_ac97_workqueue = create_workqueue(palmz72_ac97_WORK_QUEUE_NAME); INIT_WORK(&palmz72_ac97_irq_task, palmz72_ac97_irq_work, dev); @@ -315,7 +317,9 @@ -/* battery */ +/*********** + * Battery * + ***********/ void palmz72_battery_read_adc(int force) @@ -353,7 +357,10 @@ return PALMZ72_BAT_MAX_VOLTAGE; /* mV */ } -// V-batt = ADCSEL_BMON * 1,889 + 767,8 [mV] +/* + This formula is based on battery life of my battery 1100mAh. Original battery in Zire72 is Li-On 920mAh + V_batt = ADCSEL_BMON * 1,889 + 767,8 [mV] +*/ int palmz72_battery_get_voltage(struct battery *b) { @@ -378,7 +385,6 @@ return BATTERY_STATUS_UNKNOWN; if (ac_connected || usb_connected){ - // TODO: ok maybe this is too stupid ... to be reviewed if ( ( current_voltage > previous_voltage ) || (current_voltage <= PALMZ72_BAT_MAX_VOLTAGE) ) return BATTERY_STATUS_CHARGING; return BATTERY_STATUS_NOT_CHARGING; @@ -401,7 +407,7 @@ static int __init palmz72_ac97_probe(struct device *dev) { int err; - u16 d2 = DIG2_INIT; // init d1 too? + u16 d2 = DIG2_INIT; if(!machine_is_palmz72()) return -ENODEV; @@ -478,7 +484,7 @@ } static int palmz72_ac_is_connected (void){ - /* when charger is plugged and USB si not connected, then status is ONLINE */ + /* when charger is plugged in and USB is not connected, then status is ONLINE */ int ret = (!(GET_GPIO(GPIO_NR_PALMZ72_USB_PULLUP)) && !(GET_GPIO(GPIO_NR_PALMZ72_USB_DETECT)));; if (ret) ret = 1; @@ -488,7 +494,10 @@ return ret; } -/* APM */ +/******* + * APM * + *******/ + static void palmz72_apm_get_power_status(struct apm_power_info *info) { int min, max, curr, percent; @@ -536,8 +545,6 @@ static int palmz72_ac97_remove (struct device *dev) { - // TODO: stop running tasks if any? - battery_class_unregister(&palmz72_battery); ac97 = NULL; input_unregister_device(palmz72_ac97_input); @@ -564,6 +571,7 @@ driver_register(&palmz72_ac97_driver); /* register battery to APM layer */ + #ifdef CONFIG_PM apm_get_power_status = palmz72_apm_get_power_status; return 0; Modified: linux4palm/linux/trunk/arch/arm/mach-pxa/palmz72/palmz72_pm.c =================================================================== --- linux4palm/linux/trunk/arch/arm/mach-pxa/palmz72/palmz72_pm.c 2007-01-23 09:53:18 UTC (rev 775) +++ linux4palm/linux/trunk/arch/arm/mach-pxa/palmz72/palmz72_pm.c 2007-01-23 18:08:22 UTC (rev 776) @@ -1,17 +1,22 @@ -/* - * PalmOne Zire72 suspend/resume support - * - * Author: Jan Herman <2h...@se...> - * - * 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. - * - */ +/************************************************************************ + * PalmOne Zire72 suspend/resume support * + * * + * Author: Jan Herman <2h...@se...> * + * * + * * + * 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/kernel.h> #include <linux/device.h> #include <linux/pm.h> +#include <linux/fb.h> +#include <linux/platform_device.h> +#include <asm/mach-types.h> +#include <asm/hardware.h> #include <asm/arch/pxa-pm_ll.h> #include <asm/arch/hardware.h> @@ -19,53 +24,103 @@ #include <asm/arch/palmz72-gpio.h> +typedef struct +{ + int brightness; +} pm_save_data; -static void palmz72_pxa_ll_pm_suspend(unsigned long resume_addr) +#ifdef CONFIG_PM +static int palmz72_suspend(struct device *dev, pm_message_t state) { - - /* Wake up on Voice Memo button*/ - PWER |= PWER_GPIO13; - /* Wake up on RTC alaram is possibile */ - //PWER |= PWER_RTC; + /* Wake-Up on Voice memo button - GPIO 13 */ + PWER |= PWER_GPIO13 | PWER_RTC | PWER_WEP1; + PRER |= PWER_GPIO13; - - /* USB, in theory this can even wake us from deep sleep */ - PWER |= PWER_GPIO15; - PFER |= PWER_GPIO15; - PRER |= PWER_GPIO15; + /* Enabled Deep-Sleep mode ?? */ + PCFR |= PCFR_DS; + /* Here are all of special for suspend PalmOne Zire 72 */ + //printk("Palmz72_suspend: suspending..."); + /* Turn off LCD power */ SET_PALMZ72_GPIO(LCD_POWER,0); /* Turn off USB power */ SET_PALMZ72_GPIO(USB_POWER,0); + + /* disable GPIO reset - DO NOT REMOVE! */ + PCFR &= PCFR_GPR_EN; - - /* disable GPIO reset, palm bootloader will hang us */ - //PCFR |= PCFR_GPR_EN | PCFR_OPDE; - PCFR &= PCFR_GPR_EN; - - return; + return 0; } -static void palmz72_pxa_ll_pm_resume(void) +static int palmz72_resume(struct device *dev, pm_message_t state) { - - /* re-enable GPIO reset */ - PCFR |= PCFR_GPR_EN; + + /* Disabled Deep-Sleep mode ?? */ + PCFR &= PCFR_DS; + + /* Re-enable GPIO reset */ + PCFR |= PCFR_GPR_EN; /* !! DO NOT REMOVE !! THIS IS NECCESARY FOR ENABLE PALM RESET !! */ + + + /* Here are all of special to resume PalmOne Zire 72 */ + /* Turn on LCD power */ SET_PALMZ72_GPIO(LCD_POWER,1); - /* Turn on USB power */ SET_PALMZ72_GPIO(USB_POWER,1); + + return 0; } +#else +#define palmz72_suspend NULL +#define palmz72_resume NULL +#endif +static void palmz72_pxa_ll_pm_suspend(unsigned long resume_addr) +{ + /* For future */ + return; +} + +static void palmz72_pxa_ll_pm_resume(void) +{ + /* For future */ +} + struct pxa_ll_pm_ops palmz72_ll_pm_ops = { - .suspend = palmz72_pxa_ll_pm_suspend, - .resume = palmz72_pxa_ll_pm_resume, + .suspend = palmz72_pxa_ll_pm_suspend, + .resume = palmz72_pxa_ll_pm_resume, }; +static int palmz72_pm_probe(struct device *dev) +{ + printk(KERN_NOTICE "PalmOne Zire72 power management driver registered\n"); + return 0; +} + +struct device_driver palmz72_pm_driver = { + .name = "palmz72-pm", + .bus = &platform_bus_type, + .probe = palmz72_pm_probe, + .suspend = palmz72_suspend, + .resume = palmz72_resume, +}; + +static int __init palmz72_pm_init(void) +{ + return driver_register(&palmz72_pm_driver); +} + +static void __exit palmz72_pm_exit(void) +{ + driver_unregister(&palmz72_pm_driver); +} + +module_init(palmz72_pm_init); +module_exit(palmz72_pm_exit); + MODULE_AUTHOR("Jan Herman <2h...@se...>"); -MODULE_DESCRIPTION("PalmOne Zire72 suspend/resume support driver"); +MODULE_DESCRIPTION("PalmOne Zire 72 power management driver"); MODULE_LICENSE("GPL"); - This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |