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>
This commit is contained in:
@@ -189,11 +189,9 @@ static void appledisplay_work(struct work_struct *work)
|
||||
container_of(work, struct appledisplay, work.work);
|
||||
int retval;
|
||||
|
||||
up(&pdata->bd->sem);
|
||||
retval = appledisplay_bl_get_brightness(pdata->bd);
|
||||
if (retval >= 0)
|
||||
pdata->bd->props->brightness = retval;
|
||||
down(&pdata->bd->sem);
|
||||
|
||||
/* Poll again in about 125ms if there's still a button pressed */
|
||||
if (pdata->button_pressed)
|
||||
@@ -288,9 +286,7 @@ static int appledisplay_probe(struct usb_interface *iface,
|
||||
}
|
||||
|
||||
/* Try to get brightness */
|
||||
up(&pdata->bd->sem);
|
||||
brightness = appledisplay_bl_get_brightness(pdata->bd);
|
||||
down(&pdata->bd->sem);
|
||||
|
||||
if (brightness < 0) {
|
||||
retval = brightness;
|
||||
@@ -299,9 +295,7 @@ static int appledisplay_probe(struct usb_interface *iface,
|
||||
}
|
||||
|
||||
/* Set brightness in backlight device */
|
||||
up(&pdata->bd->sem);
|
||||
pdata->bd->props->brightness = brightness;
|
||||
down(&pdata->bd->sem);
|
||||
|
||||
/* save our data pointer in the interface device */
|
||||
usb_set_intfdata(iface, pdata);
|
||||
|
Reference in New Issue
Block a user