backlight: Fix external uses of backlight internal semaphore

backlight_device->sem has a very specific use as documented in the
header file. The external users of this are using it for a different
reason, to serialise access to the update_status() method.

backlight users were supposed to implement their own internal
serialisation of update_status() if needed but everyone is doing
things differently and incorrectly. Therefore add a global mutex to
take care of serialisation for everyone, once and for all.

Locking for get_brightness remains optional since most users don't
need it.

Also update the lcd class in a similar way.

Signed-off-by: Richard Purdie <rpurdie@rpsys.net>
diff --git a/drivers/video/backlight/backlight.c b/drivers/video/backlight/backlight.c
index 7a85be4..347081d 100644
--- a/drivers/video/backlight/backlight.c
+++ b/drivers/video/backlight/backlight.c
@@ -37,8 +37,7 @@
 		if (!bd->props->check_fb ||
 		    bd->props->check_fb(evdata->info)) {
 			bd->props->fb_blank = *(int *)evdata->data;
-			if (bd->props && bd->props->update_status)
-				bd->props->update_status(bd);
+			backlight_update_status(bd);
 		}
 	up(&bd->sem);
 	return 0;
@@ -97,8 +96,7 @@
 	if (bd->props) {
 		pr_debug("backlight: set power to %d\n", power);
 		bd->props->power = power;
-		if (bd->props->update_status)
-			bd->props->update_status(bd);
+		backlight_update_status(bd);
 		rc = count;
 	}
 	up(&bd->sem);
@@ -140,8 +138,7 @@
 			pr_debug("backlight: set brightness to %d\n",
 				 brightness);
 			bd->props->brightness = brightness;
-			if (bd->props->update_status)
-				bd->props->update_status(bd);
+			backlight_update_status(bd);
 			rc = count;
 		}
 	}
@@ -230,6 +227,7 @@
 	if (!new_bd)
 		return ERR_PTR(-ENOMEM);
 
+	mutex_init(&new_bd->update_lock);
 	init_MUTEX(&new_bd->sem);
 	new_bd->props = bp;
 	memset(&new_bd->class_dev, 0, sizeof(new_bd->class_dev));