#
# 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 <mickey@Vanille.de>
+ *
+ * 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/module.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/platform_device.h>
+#include <linux/spinlock.h>
+#include <linux/fb.h>
+#include <linux/backlight.h>
+
+#include <asm/arch/pxa-regs.h>
+#include <asm/arch/ezx.h>
+
+#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 <mickey@Vanille.de>");
+MODULE_DESCRIPTION("Backlight Driver for Motorola A780|E680(i)");
+MODULE_LICENSE("GPL");