Initial Contribution

msm-2.6.38: tag AU_LINUX_ANDROID_GINGERBREAD.02.03.04.00.142

Signed-off-by: Bryan Huntsman <bryanh@codeaurora.org>
diff --git a/drivers/leds/leds.h b/drivers/leds/leds.h
index e77c7f8..593a63c 100644
--- a/drivers/leds/leds.h
+++ b/drivers/leds/leds.h
@@ -16,6 +16,21 @@
 #include <linux/device.h>
 #include <linux/rwsem.h>
 #include <linux/leds.h>
+#include <linux/workqueue.h>
+
+#ifdef CONFIG_HAS_EARLYSUSPEND
+
+extern struct workqueue_struct *suspend_work_queue;
+extern int queue_brightness_change(struct led_classdev *led_cdev,
+	enum led_brightness value);
+
+struct deferred_brightness_change {
+	struct work_struct brightness_change_work;
+	struct led_classdev *led_cdev;
+	enum led_brightness value;
+};
+
+#endif
 
 static inline void led_set_brightness(struct led_classdev *led_cdev,
 					enum led_brightness value)
@@ -23,8 +38,12 @@
 	if (value > led_cdev->max_brightness)
 		value = led_cdev->max_brightness;
 	led_cdev->brightness = value;
-	if (!(led_cdev->flags & LED_SUSPENDED))
-		led_cdev->brightness_set(led_cdev, value);
+	if (!(led_cdev->flags & LED_SUSPENDED)) {
+#ifdef CONFIG_HAS_EARLYSUSPEND
+		if (queue_brightness_change(led_cdev, value) != 0)
+#endif
+			led_cdev->brightness_set(led_cdev, value);
+	}
 }
 
 static inline int led_get_brightness(struct led_classdev *led_cdev)