Index: linux-2.6.15/drivers/video/backlight/backlight.c
===================================================================
--- linux-2.6.15.orig/drivers/video/backlight/backlight.c	2006-01-29 11:44:30.000000000 +0000
+++ linux-2.6.15/drivers/video/backlight/backlight.c	2006-01-29 12:29:51.000000000 +0000
@@ -21,8 +21,8 @@
 	struct backlight_device *bd = to_backlight_device(cdev);
 
 	down(&bd->sem);
-	if (likely(bd->props && bd->props->get_power))
-		rc = sprintf(buf, "%d\n", bd->props->get_power(bd));
+	if (likely(bd->props))
+		rc = sprintf(buf, "%d\n", bd->props->requested_power);
 	else
 		rc = -ENXIO;
 	up(&bd->sem);
@@ -43,6 +43,7 @@
 	down(&bd->sem);
 	if (likely(bd->props && bd->props->set_power)) {
 		pr_debug("backlight: set power to %d\n", power);
+		bd->props->requested_power = power;
 		bd->props->set_power(bd, power);
 		rc = count;
 	} else
@@ -58,8 +59,8 @@
 	struct backlight_device *bd = to_backlight_device(cdev);
 
 	down(&bd->sem);
-	if (likely(bd->props && bd->props->get_brightness))
-		rc = sprintf(buf, "%d\n", bd->props->get_brightness(bd));
+	if (likely(bd->props))
+		rc = sprintf(buf, "%d\n", bd->props->requested_brightness);
 	else
 		rc = -ENXIO;
 	up(&bd->sem);
@@ -78,8 +79,12 @@
 		return -EINVAL;
 
 	down(&bd->sem);
+	if (likely(bd->props) && brightness > bd->props->max_brightness)
+		brightness = bd->props->max_brightness;
+
 	if (likely(bd->props && bd->props->set_brightness)) {
 		pr_debug("backlight: set brightness to %d\n", brightness);
+		bd->props->requested_brightness = brightness;
 		bd->props->set_brightness(bd, brightness);
 		rc = count;
 	} else
@@ -104,6 +109,21 @@
 	return rc;
 }
 
+static ssize_t backlight_show_actual_brightness(struct class_device *cdev, char *buf)
+{
+	int rc;
+	struct backlight_device *bd = to_backlight_device(cdev);
+
+	down(&bd->sem);
+	if (likely(bd->props))
+		rc = sprintf(buf, "%d\n", bd->props->actual_brightness);
+	else
+		rc = -ENXIO;
+	up(&bd->sem);
+
+	return rc;
+}
+
 static void backlight_class_release(struct class_device *dev)
 {
 	struct backlight_device *bd = to_backlight_device(dev);
@@ -125,6 +145,7 @@
 static struct class_device_attribute bl_class_device_attributes[] = {
 	DECLARE_ATTR(power, 0644, backlight_show_power, backlight_store_power),
 	DECLARE_ATTR(brightness, 0644, backlight_show_brightness, backlight_store_brightness),
+	DECLARE_ATTR(actual_brightness, 0444, backlight_show_actual_brightness, NULL),
 	DECLARE_ATTR(max_brightness, 0444, backlight_show_max_brightness, NULL),
 };
 
@@ -232,6 +253,9 @@
 					 &bl_class_device_attributes[i]);
 
 	down(&bd->sem);
+	if (likely(bd->props && bd->props->set_brightness))
+		bd->props->set_brightness(bd, 0);
+
 	bd->props = NULL;
 	up(&bd->sem);
 
Index: linux-2.6.15/drivers/video/backlight/corgi_bl.c
===================================================================
--- linux-2.6.15.orig/drivers/video/backlight/corgi_bl.c	2006-01-29 11:44:30.000000000 +0000
+++ linux-2.6.15/drivers/video/backlight/corgi_bl.c	2006-01-29 12:32:04.000000000 +0000
@@ -25,24 +25,21 @@
 #define CORGI_DEFAULT_INTENSITY		0x1f
 #define CORGI_LIMIT_MASK		0x0b
 
-static int corgibl_powermode = FB_BLANK_UNBLANK;
-static int current_intensity = 0;
 static int corgibl_limit = 0;
 static void (*corgibl_mach_set_intensity)(int intensity);
 static spinlock_t bl_lock = SPIN_LOCK_UNLOCKED;
 static struct backlight_properties corgibl_data;
+static struct backlight_device *corgi_backlight_device;
 
-static void corgibl_send_intensity(int intensity)
+static int corgibl_send_intensity(struct backlight_device *bd, int intensity)
 {
 	unsigned long flags;
 	void (*corgi_kick_batt)(void);
 
-	if (corgibl_powermode != FB_BLANK_UNBLANK) {
+	if (corgibl_data.requested_power != FB_BLANK_UNBLANK)
 		intensity = 0;
-	} else {
-		if (corgibl_limit)
-			intensity &= CORGI_LIMIT_MASK;
-	}
+	else if (corgibl_limit)
+		intensity &= CORGI_LIMIT_MASK;
 
 	spin_lock_irqsave(&bl_lock, flags);
 
@@ -50,45 +47,27 @@
 
 	spin_unlock_irqrestore(&bl_lock, flags);
 
+	corgibl_data.actual_brightness = intensity;
+
  	corgi_kick_batt = symbol_get(sharpsl_battery_kick);
  	if (corgi_kick_batt) {
  		corgi_kick_batt();
  		symbol_put(sharpsl_battery_kick);
  	}
-}
-
-static void corgibl_blank(int blank)
-{
-	switch(blank) {
 
-	case FB_BLANK_NORMAL:
-	case FB_BLANK_VSYNC_SUSPEND:
-	case FB_BLANK_HSYNC_SUSPEND:
-	case FB_BLANK_POWERDOWN:
-		if (corgibl_powermode == FB_BLANK_UNBLANK) {
-			corgibl_send_intensity(0);
-			corgibl_powermode = blank;
-		}
-		break;
-	case FB_BLANK_UNBLANK:
-		if (corgibl_powermode != FB_BLANK_UNBLANK) {
-			corgibl_powermode = blank;
-			corgibl_send_intensity(current_intensity);
-		}
-		break;
-	}
+	return 0;
 }
 
 #ifdef CONFIG_PM
 static int corgibl_suspend(struct platform_device *dev, pm_message_t state)
 {
-	corgibl_blank(FB_BLANK_POWERDOWN);
+	corgibl_send_intensity(corgi_backlight_device, 0);
 	return 0;
 }
 
 static int corgibl_resume(struct platform_device *dev)
 {
-	corgibl_blank(FB_BLANK_UNBLANK);
+	corgibl_send_intensity(corgi_backlight_device, corgibl_data.requested_brightness);
 	return 0;
 }
 #else
@@ -99,29 +78,10 @@
 
 static int corgibl_set_power(struct backlight_device *bd, int state)
 {
-	corgibl_blank(state);
+	corgibl_send_intensity(corgi_backlight_device, corgibl_data.requested_brightness);
 	return 0;
 }
 
-static int corgibl_get_power(struct backlight_device *bd)
-{
-	return corgibl_powermode;
-}
-
-static int corgibl_set_intensity(struct backlight_device *bd, int intensity)
-{
-	if (intensity > corgibl_data.max_brightness)
-		intensity = corgibl_data.max_brightness;
-	corgibl_send_intensity(intensity);
-	current_intensity=intensity;
-	return 0;
-}
-
-static int corgibl_get_intensity(struct backlight_device *bd)
-{
-	return current_intensity;
-}
-
 /*
  * Called when the battery is low to limit the backlight intensity.
  * If limit==0 clear any limit, otherwise limit the intensity
@@ -129,21 +89,17 @@
 void corgibl_limit_intensity(int limit)
 {
 	corgibl_limit = (limit ? 1 : 0);
-	corgibl_send_intensity(current_intensity);
+	corgibl_send_intensity(corgi_backlight_device, corgibl_data.requested_brightness);
 }
 EXPORT_SYMBOL(corgibl_limit_intensity);
 
 
 static struct backlight_properties corgibl_data = {
 	.owner		= THIS_MODULE,
-	.get_power      = corgibl_get_power,
 	.set_power      = corgibl_set_power,
-	.get_brightness = corgibl_get_intensity,
-	.set_brightness = corgibl_set_intensity,
+	.set_brightness = corgibl_send_intensity,
 };
 
-static struct backlight_device *corgi_backlight_device;
-
 static int __init corgibl_probe(struct platform_device *pdev)
 {
 	struct corgibl_machinfo *machinfo = pdev->dev.platform_data;
@@ -156,7 +112,7 @@
 	if (IS_ERR (corgi_backlight_device))
 		return PTR_ERR (corgi_backlight_device);
 
-	corgibl_set_intensity(NULL, CORGI_DEFAULT_INTENSITY);
+	corgibl_send_intensity(corgi_backlight_device, CORGI_DEFAULT_INTENSITY);
 	corgibl_limit_intensity(0);
 
 	printk("Corgi Backlight Driver Initialized.\n");
@@ -167,8 +123,6 @@
 {
 	backlight_device_unregister(corgi_backlight_device);
 
-	corgibl_set_intensity(NULL, 0);
-
 	printk("Corgi Backlight Driver Unloaded\n");
 	return 0;
 }
Index: linux-2.6.15/include/linux/backlight.h
===================================================================
--- linux-2.6.15.orig/include/linux/backlight.h	2006-01-28 23:49:26.000000000 +0000
+++ linux-2.6.15/include/linux/backlight.h	2006-01-29 12:23:03.000000000 +0000
@@ -19,16 +19,19 @@
 struct backlight_properties {
 	/* Owner module */
 	struct module *owner;
-	/* Get the backlight power status (0: full on, 1..3: power saving
-	   modes; 4: full off), see FB_BLANK_XXX */
-	int (*get_power)(struct backlight_device *);
-	/* Enable or disable power to the LCD (0: on; 4: off, see FB_BLANK_XXX) */
-	int (*set_power)(struct backlight_device *, int power);
+	/* Actual backlight brightness (as determined by the driver) for given 
+           brightness/power settings */
+	int actual_brightness;
 	/* Maximal value for brightness (read-only) */
 	int max_brightness;
-	/* Get current backlight brightness */
-	int (*get_brightness)(struct backlight_device *);
-	/* Set backlight brightness (0..max_brightness) */
+	/* User requested power setting (0: full on, 1..3: power saving
+	   modes; 4: full off), see FB_BLANK_XXX */
+	int requested_power;
+	/* Change LCD power mode (0: on; 4: off, see FB_BLANK_XXX) */
+	int (*set_power)(struct backlight_device *, int power);
+	/* User requested backlight brightness */
+	int requested_brightness;
+	/* Change backlight brightness (0..max_brightness) */
 	int (*set_brightness)(struct backlight_device *, int brightness);
 	/* Check if given framebuffer device is the one bound to this backlight;
 	   return 0 if not, !=0 if it is. If NULL, backlight always matches the fb. */
