diff -Naurp -X dontdiff linux-2.6.11-bk1-h1940/arch/arm/mach-s3c2410/devs.c linux-2.6.11-bk1-h1940-bl/arch/arm/mach-s3c2410/devs.c
--- linux-2.6.11-bk1-h1940/arch/arm/mach-s3c2410/devs.c	2005-03-26 13:29:55.000000000 +0100
+++ linux-2.6.11-bk1-h1940-bl/arch/arm/mach-s3c2410/devs.c	2005-03-26 13:49:18.000000000 +0100
@@ -36,6 +36,7 @@
 #include <asm/arch/regs-serial.h>
 #include <asm/arch/s3c2410_udc.h>
 #include <asm/arch/s3c2410_ts.h>
+#include <asm/arch/s3c2410_bl.h>
 
 #include "devs.h"
 
@@ -114,6 +115,24 @@ struct platform_device s3c_device_lcd = 
 
 EXPORT_SYMBOL(s3c_device_lcd);
 
+static struct s3c2410_bl_mach_info s3c2410bl_info;
+
+void __init set_s3c2410bl_info(struct s3c2410_bl_mach_info *hard_s3c2410bl_info)
+{
+	memcpy(&s3c2410bl_info,hard_s3c2410bl_info,sizeof(struct s3c2410_bl_mach_info));
+}
+EXPORT_SYMBOL(set_s3c2410bl_info);
+
+struct platform_device s3c_device_bl = {
+	.name		  = "s3c2410-bl",
+	.id		  = -1,
+	.dev              = {
+ 		.platform_data	= &s3c2410bl_info,
+	}
+};
+
+EXPORT_SYMBOL(s3c_device_bl);
+
 /* NAND Controller */
 
 static struct resource s3c_nand_resource[] = {
diff -Naurp -X dontdiff linux-2.6.11-bk1-h1940/arch/arm/mach-s3c2410/devs.h linux-2.6.11-bk1-h1940-bl/arch/arm/mach-s3c2410/devs.h
--- linux-2.6.11-bk1-h1940/arch/arm/mach-s3c2410/devs.h	2005-03-26 13:29:55.000000000 +0100
+++ linux-2.6.11-bk1-h1940-bl/arch/arm/mach-s3c2410/devs.h	2005-03-26 13:41:05.000000000 +0100
@@ -20,6 +20,7 @@ extern struct platform_device *s3c24xx_u
 
 extern struct platform_device s3c_device_usb;
 extern struct platform_device s3c_device_lcd;
+extern struct platform_device s3c_device_bl;
 extern struct platform_device s3c_device_wdt;
 extern struct platform_device s3c_device_i2c;
 extern struct platform_device s3c_device_iis;
diff -Naurp -X dontdiff linux-2.6.11-bk1-h1940/arch/arm/mach-s3c2410/mach-h1940.c linux-2.6.11-bk1-h1940-bl/arch/arm/mach-s3c2410/mach-h1940.c
--- linux-2.6.11-bk1-h1940/arch/arm/mach-s3c2410/mach-h1940.c	2005-03-26 13:29:55.000000000 +0100
+++ linux-2.6.11-bk1-h1940-bl/arch/arm/mach-s3c2410/mach-h1940.c	2005-03-26 13:42:14.000000000 +0100
@@ -47,10 +47,12 @@
 #include <asm/arch/regs-serial.h>
 #include <asm/arch/regs-gpio.h>
 #include <asm/arch/regs-lcd.h>
+#include <asm/arch/regs-timer.h>
 
 #include <asm/arch/s3c2410fb.h>
 #include <asm/arch/s3c2410_udc.h>
 #include <asm/arch/s3c2410_ts.h>
+#include <asm/arch/s3c2410_bl.h>
 
 #include <linux/serial_core.h>
 
@@ -166,9 +168,67 @@ static struct s3c2410fb_mach_info h1940_
 	.lcd_power		= h1940_lcd_power,
 };
 
+
+
+static void h1940_backlight_power(int on)
+{
+	s3c2410_gpio_setpin(S3C2410_GPB0, 0);
+	s3c2410_gpio_pullup(S3C2410_GPB0, 0);
+
+	s3c2410_gpio_cfgpin(S3C2410_GPB0,
+			    (on) ? S3C2410_GPB0_TOUT0 : S3C2410_GPB0_OUTP);
+}
+
+static void h1940_set_brightness(int tcmpb0)
+{
+	unsigned long tcfg0;
+	unsigned long tcfg1;
+	unsigned long tcon;
+
+	/* configure power on/off */
+	h1940_backlight_power(tcmpb0 ? 1 : 0);
+
+	
+	tcfg0=readl(S3C2410_TCFG0);
+	tcfg1=readl(S3C2410_TCFG1);
+	
+	tcfg0 &= ~S3C2410_TCFG_PRESCALER0_MASK;
+	tcfg0 |= 0x18;
+
+	tcfg1 &= ~S3C2410_TCFG1_MUX0_MASK;
+	tcfg1 |= S3C2410_TCFG1_MUX0_DIV2;
+
+	writel(tcfg0, S3C2410_TCFG0);
+	writel(tcfg1, S3C2410_TCFG1);
+	writel(0x31, S3C2410_TCNTB(0));
+
+	tcon = readl(S3C2410_TCON);
+	tcon &= ~0x0F;
+	tcon |= S3C2410_TCON_T0RELOAD;
+	tcon |= S3C2410_TCON_T0MANUALUPD;
+
+	writel(tcon, S3C2410_TCON);
+	writel(0x31, S3C2410_TCNTB(0));
+	writel(tcmpb0, S3C2410_TCMPB(0));
+
+	/* start the timer running */
+	tcon |= S3C2410_TCON_T0START;
+	tcon &= ~S3C2410_TCON_T0MANUALUPD;
+	writel(tcon, S3C2410_TCON);
+}
+
+static struct s3c2410_bl_mach_info h1940_blcfg __initdata = {
+	
+	.backlight_max          = 0x2c,
+	.backlight_default      = 0x16,
+	.backlight_power	= h1940_backlight_power,
+	.set_brightness		= h1940_set_brightness
+};
+
 static struct platform_device *h1940_devices[] __initdata = {
 	&s3c_device_usb,
 	&s3c_device_lcd,
+	&s3c_device_bl,
 	&s3c_device_wdt,
 	&s3c_device_i2c,
 	&s3c_device_iis,
@@ -202,6 +262,7 @@ void __init h1940_init(void)
 	/* Set pad to usb device and usbsuspend to 'normal' */
 	__raw_writel(__raw_readl(S3C2410_MISCCR)&~0x3008,S3C2410_MISCCR);
 	set_s3c2410fb_info(&h1940_lcdcfg);
+	set_s3c2410bl_info(&h1940_blcfg);
 }
 		
 MACHINE_START(H1940, "IPAQ-H1940")
diff -Naurp -X dontdiff linux-2.6.11-bk1-h1940/drivers/video/backlight/Kconfig linux-2.6.11-bk1-h1940-bl/drivers/video/backlight/Kconfig
--- linux-2.6.11-bk1-h1940/drivers/video/backlight/Kconfig	2005-03-26 13:29:48.000000000 +0100
+++ linux-2.6.11-bk1-h1940-bl/drivers/video/backlight/Kconfig	2005-03-26 13:41:05.000000000 +0100
@@ -50,3 +50,11 @@ config BACKLIGHT_CORGI
 	  If you have a Sharp Zaurus SL-C7xx, say y to enable the
 	  backlight driver.
 
+config BACKLIGHT_S3C2410
+	tristate "Samsung S3C2410 Backlight Driver"
+	depends on BACKLIGHT_DEVICE && ARCH_S3C2410
+	default y
+	help
+	  If you have a backlight controler connected on a Samsung S3C2410,
+	  say y here to enable the driver.
+
diff -Naurp -X dontdiff linux-2.6.11-bk1-h1940/drivers/video/backlight/Makefile linux-2.6.11-bk1-h1940-bl/drivers/video/backlight/Makefile
--- linux-2.6.11-bk1-h1940/drivers/video/backlight/Makefile	2005-03-26 13:29:48.000000000 +0100
+++ linux-2.6.11-bk1-h1940-bl/drivers/video/backlight/Makefile	2005-03-26 13:41:05.000000000 +0100
@@ -3,3 +3,4 @@
 obj-$(CONFIG_LCD_CLASS_DEVICE)     += lcd.o
 obj-$(CONFIG_BACKLIGHT_CLASS_DEVICE) += backlight.o
 obj-$(CONFIG_BACKLIGHT_CORGI)	+= corgi_bl.o
+obj-$(CONFIG_BACKLIGHT_S3C2410)	+= s3c2410_bl.o
diff -Naurp -X dontdiff linux-2.6.11-bk1-h1940/drivers/video/backlight/s3c2410_bl.c linux-2.6.11-bk1-h1940-bl/drivers/video/backlight/s3c2410_bl.c
--- linux-2.6.11-bk1-h1940/drivers/video/backlight/s3c2410_bl.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.11-bk1-h1940-bl/drivers/video/backlight/s3c2410_bl.c	2005-03-26 13:41:05.000000000 +0100
@@ -0,0 +1,172 @@
+/*
+ * linux/drivers/video/backlight/s3c2410_bl.c
+ * Copyright (c) Arnaud Patard <arnaud.patard@rtp-net.org>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file COPYING in the main directory of this archive for
+ * more details.
+ *
+ *	    S3C2410 LCD Controller Backlight Driver
+ *
+ * ChangeLog
+ *
+ * 2005-03-17: Arnaud Patard <arnaud.patard@rtp-net.org>
+ *   - First version
+ */
+
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/fb.h>
+#include <linux/backlight.h>
+#include <asm/arch/s3c2410_bl.h>
+#include <asm/arch/regs-gpio.h>
+
+static int s3c2410bl_get_power(struct backlight_device *bl)
+{
+	struct s3c2410_bl_mach_info *info;
+
+	info = (struct s3c2410_bl_mach_info *)class_get_devdata(&bl->class_dev);
+
+	if (info)
+		return info->power_value;
+	
+	return 0;
+}
+
+static int s3c2410bl_set_power(struct backlight_device *bl, int power)
+{
+	struct s3c2410_bl_mach_info *info;
+
+	info = (struct s3c2410_bl_mach_info *)class_get_devdata(&bl->class_dev);
+	
+	power = !!power;
+
+	if (info) {
+		info->power_value=power;
+		info->backlight_power(power);
+	}
+
+	return 0;
+}
+
+static int s3c2410bl_get_brightness(struct backlight_device *bl)
+{
+	struct s3c2410_bl_mach_info *info;
+
+	info = (struct s3c2410_bl_mach_info *)class_get_devdata(&bl->class_dev);
+
+	if(info)
+		return info->brightness_value;
+
+	return 0;
+}
+
+static int s3c2410bl_set_brightness(struct backlight_device *bl, int brightness)
+{
+	struct s3c2410_bl_mach_info *info;
+
+	info = (struct s3c2410_bl_mach_info *)class_get_devdata(&bl->class_dev);
+	
+	if (info) {
+		if ( (brightness <= info->backlight_max) && brightness )
+		{
+			info->brightness_value=brightness;
+			info->set_brightness(brightness);
+		}
+		else
+			return -1;
+	}
+
+	return 0;
+}
+
+static int is_s3c2410fb(struct fb_info *info)
+{
+	return (!strcmp(info->fix.id,"s3c2410fb"));
+}
+
+static struct backlight_properties s3c2410bl_props = {
+	.owner    	= THIS_MODULE,
+	.get_power	= s3c2410bl_get_power,
+	.set_power	= s3c2410bl_set_power,
+	.get_brightness = s3c2410bl_get_brightness,
+	.set_brightness	= s3c2410bl_set_brightness,
+	.check_fb 	= is_s3c2410fb
+};
+
+
+
+
+static int __init s3c2410bl_probe(struct device *dev)
+{
+	struct backlight_device *bl;
+	struct s3c2410_bl_mach_info *info;
+
+	info = ( struct s3c2410_bl_mach_info *)dev->platform_data;
+	
+	/* Register the backlight device */
+	if (!info) {
+		printk(KERN_ERR "Hm... too bad : no platform data for bl\n");
+	}
+	else {	
+		s3c2410bl_props.max_brightness = info->backlight_max;
+	}
+	
+	bl=backlight_device_register ("s3c2410-bl",info, &s3c2410bl_props);
+	
+	if (IS_ERR (bl))
+		return PTR_ERR (bl);
+
+	dev_set_drvdata(dev, bl);
+	
+	/* Set power */
+	s3c2410bl_set_power(bl,1);
+
+	/* Set default brightness */
+	s3c2410bl_set_brightness(bl,info->backlight_default);
+
+	printk(KERN_ERR "s3c2410 Backlight Driver Initialized.\n");
+	return 0;
+}
+
+static int s3c2410bl_remove(struct device *dev)
+{
+	struct backlight_device *bl = dev->driver_data;
+	
+	if (bl) {
+		backlight_device_unregister(bl);
+		s3c2410bl_set_brightness(bl,0);
+	}
+	
+	printk("s3c2410 Backlight Driver Unloaded\n");
+	
+	return 0;
+					
+}
+
+static struct device_driver s3c2410bl_driver = {
+	.name		= "s3c2410-bl",
+	.bus		= &platform_bus_type,
+	.probe		= s3c2410bl_probe,
+	.remove		= s3c2410bl_remove,
+};
+
+
+
+static int __init s3c2410bl_init(void)
+{
+	return driver_register(&s3c2410bl_driver);
+}
+
+static void __exit s3c2410fb_cleanup(void)
+{
+	driver_unregister(&s3c2410bl_driver);
+}
+
+module_init(s3c2410bl_init);
+module_exit(s3c2410fb_cleanup);
+
+MODULE_AUTHOR("Arnaud Patard <arnaud.patard@rtp-net.org>");
+MODULE_DESCRIPTION("s3c2410 Backlight Driver");
+MODULE_LICENSE("GPLv2");
+
diff -Naurp -X dontdiff linux-2.6.11-bk1-h1940/include/asm-arm/arch-s3c2410/s3c2410_bl.h linux-2.6.11-bk1-h1940-bl/include/asm-arm/arch-s3c2410/s3c2410_bl.h
--- linux-2.6.11-bk1-h1940/include/asm-arm/arch-s3c2410/s3c2410_bl.h	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.11-bk1-h1940-bl/include/asm-arm/arch-s3c2410/s3c2410_bl.h	2005-03-26 13:44:55.000000000 +0100
@@ -0,0 +1,29 @@
+/* linux/include/asm/arch-s3c2410/s3c2410_dl.h
+ *
+ * Copyright (c) 2005 Arnaud Patard <arnaud.patard@rtp-net.org>
+ *
+ *
+ * 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.
+ *
+ *
+ *  Changelog:
+ *     14-Mar-2005     RTP     Created file
+ */
+
+#ifndef __ASM_ARM_S3C2410_BL_H
+#define __ASM_ARM_S3C2410_BL_H
+
+struct s3c2410_bl_mach_info {
+	int		power_value;
+	int		brightness_value;
+	int             backlight_max;
+	int             backlight_default;
+	void            (*backlight_power)(int);
+	void            (*set_brightness)(int);
+};
+
+void __init set_s3c2410bl_info(struct s3c2410_bl_mach_info *hard_s3c2410bl_info);
+
+#endif /* __ASM_ARM_S3C2410_BL_H */
