backlight/fbcon: Add FB_EVENT_CONBLANK
[firefly-linux-kernel-4.4.55.git] / drivers / video / backlight / backlight.c
index 9601bfe309ac2744c922a1f612eb4b6188e12aa0..5490b2ae51342ea8e3a53e4f64e05bf45576a2b9 100644 (file)
@@ -28,19 +28,18 @@ static int fb_notifier_callback(struct notifier_block *self,
        struct fb_event *evdata = data;
 
        /* If we aren't interested in this event, skip it immediately ... */
-       if (event != FB_EVENT_BLANK)
+       if (event != FB_EVENT_BLANK && event != FB_EVENT_CONBLANK)
                return 0;
 
        bd = container_of(self, struct backlight_device, fb_notif);
-       down(&bd->sem);
+       mutex_lock(&bd->props_lock);
        if (bd->props)
                if (!bd->props->check_fb ||
                    bd->props->check_fb(evdata->info)) {
                        bd->props->fb_blank = *(int *)evdata->data;
-                       if (likely(bd->props && bd->props->update_status))
-                               bd->props->update_status(bd);
+                       backlight_update_status(bd);
                }
-       up(&bd->sem);
+       mutex_unlock(&bd->props_lock);
        return 0;
 }
 
@@ -72,10 +71,10 @@ static ssize_t backlight_show_power(struct class_device *cdev, char *buf)
        int rc = -ENXIO;
        struct backlight_device *bd = to_backlight_device(cdev);
 
-       down(&bd->sem);
-       if (likely(bd->props))
+       mutex_lock(&bd->props_lock);
+       if (bd->props)
                rc = sprintf(buf, "%d\n", bd->props->power);
-       up(&bd->sem);
+       mutex_unlock(&bd->props_lock);
 
        return rc;
 }
@@ -93,15 +92,14 @@ static ssize_t backlight_store_power(struct class_device *cdev, const char *buf,
        if (size != count)
                return -EINVAL;
 
-       down(&bd->sem);
-       if (likely(bd->props)) {
+       mutex_lock(&bd->props_lock);
+       if (bd->props) {
                pr_debug("backlight: set power to %d\n", power);
                bd->props->power = power;
-               if (likely(bd->props->update_status))
-                       bd->props->update_status(bd);
+               backlight_update_status(bd);
                rc = count;
        }
-       up(&bd->sem);
+       mutex_unlock(&bd->props_lock);
 
        return rc;
 }
@@ -111,10 +109,10 @@ static ssize_t backlight_show_brightness(struct class_device *cdev, char *buf)
        int rc = -ENXIO;
        struct backlight_device *bd = to_backlight_device(cdev);
 
-       down(&bd->sem);
-       if (likely(bd->props))
+       mutex_lock(&bd->props_lock);
+       if (bd->props)
                rc = sprintf(buf, "%d\n", bd->props->brightness);
-       up(&bd->sem);
+       mutex_unlock(&bd->props_lock);
 
        return rc;
 }
@@ -132,20 +130,19 @@ static ssize_t backlight_store_brightness(struct class_device *cdev, const char
        if (size != count)
                return -EINVAL;
 
-       down(&bd->sem);
-       if (likely(bd->props)) {
+       mutex_lock(&bd->props_lock);
+       if (bd->props) {
                if (brightness > bd->props->max_brightness)
                        rc = -EINVAL;
                else {
                        pr_debug("backlight: set brightness to %d\n",
                                 brightness);
                        bd->props->brightness = brightness;
-                       if (likely(bd->props->update_status))
-                               bd->props->update_status(bd);
+                       backlight_update_status(bd);
                        rc = count;
                }
        }
-       up(&bd->sem);
+       mutex_unlock(&bd->props_lock);
 
        return rc;
 }
@@ -155,10 +152,10 @@ static ssize_t backlight_show_max_brightness(struct class_device *cdev, char *bu
        int rc = -ENXIO;
        struct backlight_device *bd = to_backlight_device(cdev);
 
-       down(&bd->sem);
-       if (likely(bd->props))
+       mutex_lock(&bd->props_lock);
+       if (bd->props)
                rc = sprintf(buf, "%d\n", bd->props->max_brightness);
-       up(&bd->sem);
+       mutex_unlock(&bd->props_lock);
 
        return rc;
 }
@@ -169,10 +166,10 @@ static ssize_t backlight_show_actual_brightness(struct class_device *cdev,
        int rc = -ENXIO;
        struct backlight_device *bd = to_backlight_device(cdev);
 
-       down(&bd->sem);
-       if (likely(bd->props && bd->props->get_brightness))
+       mutex_lock(&bd->props_lock);
+       if (bd->props && bd->props->get_brightness)
                rc = sprintf(buf, "%d\n", bd->props->get_brightness(bd));
-       up(&bd->sem);
+       mutex_unlock(&bd->props_lock);
 
        return rc;
 }
@@ -227,10 +224,11 @@ struct backlight_device *backlight_device_register(const char *name,
        pr_debug("backlight_device_alloc: name=%s\n", name);
 
        new_bd = kmalloc(sizeof(struct backlight_device), GFP_KERNEL);
-       if (unlikely(!new_bd))
+       if (!new_bd)
                return ERR_PTR(-ENOMEM);
 
-       init_MUTEX(&new_bd->sem);
+       mutex_init(&new_bd->update_lock);
+       mutex_init(&new_bd->props_lock);
        new_bd->props = bp;
        memset(&new_bd->class_dev, 0, sizeof(new_bd->class_dev));
        new_bd->class_dev.class = &backlight_class;
@@ -239,19 +237,22 @@ struct backlight_device *backlight_device_register(const char *name,
        class_set_devdata(&new_bd->class_dev, devdata);
 
        rc = class_device_register(&new_bd->class_dev);
-       if (unlikely(rc)) {
-error:         kfree(new_bd);
+       if (rc) {
+               kfree(new_bd);
                return ERR_PTR(rc);
        }
 
        rc = backlight_register_fb(new_bd);
-       if (unlikely(rc))
-               goto error;
+       if (rc) {
+               class_device_unregister(&new_bd->class_dev);
+               return ERR_PTR(rc);
+       }
+
 
        for (i = 0; i < ARRAY_SIZE(bl_class_device_attributes); i++) {
                rc = class_device_create_file(&new_bd->class_dev,
                                              &bl_class_device_attributes[i]);
-               if (unlikely(rc)) {
+               if (rc) {
                        while (--i >= 0)
                                class_device_remove_file(&new_bd->class_dev,
                                                         &bl_class_device_attributes[i]);
@@ -284,9 +285,9 @@ void backlight_device_unregister(struct backlight_device *bd)
                class_device_remove_file(&bd->class_dev,
                                         &bl_class_device_attributes[i]);
 
-       down(&bd->sem);
+       mutex_lock(&bd->props_lock);
        bd->props = NULL;
-       up(&bd->sem);
+       mutex_unlock(&bd->props_lock);
 
        backlight_unregister_fb(bd);