# # Patch managed by http://www.mn-logistik.de/unsupported/pxa250/patcher # --- linux-2.6.16/arch/arm/mach-pxa/ezx.c~ezx-backlight-r1.patch 2006-06-08 19:33:36.000000000 +0200 +++ linux-2.6.16/arch/arm/mach-pxa/ezx.c 2006-06-08 19:33:37.000000000 +0200 @@ -274,34 +274,9 @@ .udc_command = ezx_udc_command, }; -/* pxafb */ - -#define BKLIGHT_PRESCALE 2 -#define BKLIGHT_PERIOD 49 -#define DEFAULT_DUTYCYCLE 25 -#define MAX_DUTYCYCLE (BKLIGHT_PERIOD+1) -#define MIN_DUTYCYCLE 0 - -static void pxafb_backlight_power(int on) -{ - if (on) { - CKEN |= CKEN0_PWM0; - PWM_CTRL0 = BKLIGHT_PRESCALE; - PWM_PERVAL0 = BKLIGHT_PERIOD; - PWM_PWDUTY0 = DEFAULT_DUTYCYCLE; - - GPDR0 |= 0x00010000; //PWM0 is GPIO16 - pxa_gpio_mode(GPIO16_PWM0_MD); - } else { - PWM_PWDUTY0 = 0; - GAFR0_U &= 0xfffffffc; - GPDR0 &= 0xfffeffff; /* set gpio16 (pwm0) as input */ - CKEN &= ~CKEN0_PWM0; - PWM_PWDUTY0 = MIN_DUTYCYCLE; - } -} - -//#define mdelay(x) udelay((x)*1000) +/* + * EZX PXA Framebuffer + */ static void pxafb_lcd_power(int on) { @@ -326,35 +301,24 @@ .xres = 240, .yres = 320, .bpp = 16, - .hsync_len = 10, .left_margin = 20, .right_margin = 10, - .vsync_len = 2, .upper_margin = 3, .lower_margin = 2, - .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, - .lccr0 = 0x002008F8, .lccr3 = 0x0430FF09, - - .pxafb_backlight_power = &pxafb_backlight_power, - .pxafb_lcd_power = &pxafb_lcd_power, -}; - - -/* backlight for lcd */ - -static struct resource ezx_backlight_resources[] = { + .pxafb_lcd_power= &pxafb_lcd_power, }; -static struct platform_device ezx_backlight_device = { - .name = "ezx-lcd-backlight", +/* + * EZX LCD Backlight + */ +static struct platform_device ezxbacklight_device = { + .name = "ezx-bl", .id = -1, - .resource = ezx_backlight_resources, - .num_resources = ARRAY_SIZE(ezx_backlight_resources), }; #ifdef CONFIG_PXA_EZX_E680 @@ -786,6 +750,7 @@ static struct platform_device *devices[] __initdata = { &ezx_bp_device, + &ezxbacklight_device, #ifdef CONFIG_PXA_EZX_E680 &e680led_device, #endif --- linux-2.6.16/drivers/video/backlight/Kconfig~ezx-backlight-r1.patch 2006-06-08 19:33:34.000000000 +0200 +++ linux-2.6.16/drivers/video/backlight/Kconfig 2006-06-08 19:33:37.000000000 +0200 @@ -58,3 +58,12 @@ If you have a HP Jornada 680, say y to enable the backlight driver. +config BACKLIGHT_EZX + tristate "Motorola EXZ Backlight Driver (A780/E680/E680i)" + depends on BACKLIGHT_DEVICE && PXA_EZX + default y + help + If you have a Motorola A780 or E680(i), say y to enable the + backlight driver. + + --- linux-2.6.16/drivers/video/backlight/Makefile~ezx-backlight-r1.patch 2006-03-20 06:53:29.000000000 +0100 +++ linux-2.6.16/drivers/video/backlight/Makefile 2006-06-08 19:33:37.000000000 +0200 @@ -5,3 +5,5 @@ obj-$(CONFIG_BACKLIGHT_CORGI) += corgi_bl.o obj-$(CONFIG_BACKLIGHT_HP680) += hp680_bl.o obj-$(CONFIG_SHARP_LOCOMO) += locomolcd.o +obj-$(CONFIG_BACKLIGHT_EZX) += ezx_bl.o + --- /dev/null 2006-06-08 19:04:31.354926880 +0200 +++ linux-2.6.16/drivers/video/backlight/ezx_bl.c 2006-06-08 20:52:33.000000000 +0200 @@ -0,0 +1,156 @@ +/* + * Backlight Driver for Motorola A780 and E680(i) GSM Phones. + * + * Copyright 2006 Vanille Media + * + * Author: Michael Lauer + * + * 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 +#include +#include +#include +#include +#include +#include + +#include +#include + +#define EZX_MIN_INTENSITY 00 +#define EZX_MAX_INTENSITY 50 +#define EZX_DEFAULT_INTENSITY 25 + +static spinlock_t bl_lock = SPIN_LOCK_UNLOCKED; +static struct backlight_device *ezx_backlight_device; +static int last_intensity; + +static int ezxbl_send_intensity(struct backlight_device *bd) +{ + unsigned long flags; + int intensity = bd->props->brightness; + + printk( KERN_DEBUG "ezx_set_intensity to %d\n", intensity ); + + if (bd->props->power != FB_BLANK_UNBLANK) + intensity = 0; + if (bd->props->fb_blank != FB_BLANK_UNBLANK) + intensity = 0; + + spin_lock_irqsave(&bl_lock, flags); + + printk( KERN_DEBUG "backlight last intensity was %d, new intensity is %d\n", last_intensity, intensity ); + + if ( !last_intensity && intensity ) { + printk( KERN_DEBUG "backlight power ON\n" ); + PWM_CTRL0 = 2; /* pre-scaler */ + PWM_PWDUTY0 = intensity; /* duty cycle */ + PWM_PERVAL0 = 49; /* period */ + pxa_gpio_mode(GPIO16_PWM0_MD); /* set GPIO16 as alternate function + output */ + pxa_set_cken(CKEN0_PWM0, 1); /* clock enable */ + } + else if ( last_intensity && !intensity ) { + printk( KERN_DEBUG "backlight power OFF\n" ); + PWM_PWDUTY0 = 0; + GAFR0_U &= 0xFFFFFFFC; /* ??? */ + pxa_set_cken(CKEN0_PWM0, 0); /* clock disable */ + pxa_gpio_mode(GPIO16_PWM0); /* set GPIO16 as input */ + } else if ( last_intensity && intensity ) { + printk( KERN_DEBUG "backlight adjusting duty cycle\n" ); + PWM_PWDUTY0 = intensity; /* duty cycle */ + } + spin_unlock_irqrestore(&bl_lock, flags); + last_intensity = intensity; + return 0; +} + +static int ezxbl_get_intensity(struct backlight_device *bd) +{ + return last_intensity; +} + +static int ezxbl_set_intensity(struct backlight_device *bd) +{ + return ezxbl_send_intensity(ezx_backlight_device); +} + +#ifdef CONFIG_PM +static int ezxbl_suspend(struct platform_device *pdev, pm_message_t state) +{ + //set suspend flag + ezxbl_set_intensity(ezx_backlight_device); + return 0; +} + +static int ezxbl_resume(struct platform_device *pdev) +{ + // set resume flag + ezxbl_set_intensity(ezx_backlight_device); + return 0; +} +#else +#define ezxbl_suspend NULL +#define ezxbl_resume NULL +#endif + +static struct backlight_properties ezxbl_data = { + .owner = THIS_MODULE, + .get_brightness = ezxbl_get_intensity, + .max_brightness = EZX_MAX_INTENSITY, + .update_status = ezxbl_set_intensity, +}; + +static int __init ezxbl_probe(struct platform_device *pdev) +{ + ezx_backlight_device = backlight_device_register ("ezx-bl", + NULL, &ezxbl_data); + if (IS_ERR (ezx_backlight_device)) + return PTR_ERR (ezx_backlight_device); + + ezxbl_data.power = FB_BLANK_UNBLANK; + ezxbl_data.brightness = EZX_DEFAULT_INTENSITY; + ezxbl_set_intensity(ezx_backlight_device); + + printk("EZX Backlight Driver Initialized.\n"); + return 0; +} + +static int ezxbl_remove(struct platform_device *pdev) +{ + backlight_device_unregister(ezx_backlight_device); + + printk("EZX Backlight Driver Unloaded.\n"); + return 0; +} + +static struct platform_driver ezxbl_driver = { + .probe = ezxbl_probe, + .remove = ezxbl_remove, + .suspend = ezxbl_suspend, + .resume = ezxbl_resume, + .driver = { + .name = "ezx-bl", + }, +}; + +static int __init ezxbl_init(void) +{ + return platform_driver_register(&ezxbl_driver); +} + +static void __exit ezxbl_exit(void) +{ + platform_driver_unregister(&ezxbl_driver); +} + +module_init(ezxbl_init); +module_exit(ezxbl_exit); + +MODULE_AUTHOR("Michael Lauer "); +MODULE_DESCRIPTION("Backlight Driver for Motorola A780|E680(i)"); +MODULE_LICENSE("GPL");