asus-wmi: fix and clean backlight code
Corentin Chary [Sat, 26 Feb 2011 09:20:37 +0000 (10:20 +0100)]
Signed-off-by: Corentin Chary <corentincj@iksaif.net>
Signed-off-by: Matthew Garrett <mjg@redhat.com>

drivers/platform/x86/asus-wmi.c

index fd5b08e..adf7b05 100644 (file)
@@ -765,9 +765,8 @@ static int read_backlight_power(struct asus_wmi *asus)
        return ret ? FB_BLANK_UNBLANK : FB_BLANK_POWERDOWN;
 }
 
-static int read_brightness(struct backlight_device *bd)
+static int read_brightness_max(struct asus_wmi *asus)
 {
-       struct asus_wmi *asus = bl_get_data(bd);
        u32 retval;
        int err;
 
@@ -776,6 +775,25 @@ static int read_brightness(struct backlight_device *bd)
        if (err < 0)
                return err;
 
+       retval = retval & ASUS_WMI_DSTS_MAX_BRIGTH_MASK;
+       retval >>= 8;
+
+       if (!retval)
+               return -ENODEV;
+
+       return retval;
+}
+
+static int read_brightness(struct backlight_device *bd)
+{
+       struct asus_wmi *asus = bl_get_data(bd);
+       u32 retval, err;
+
+       err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_BRIGHTNESS, &retval);
+
+       if (err < 0)
+               return err;
+
        return retval & ASUS_WMI_DSTS_BRIGHTNESS_MASK;
 }
 
@@ -799,7 +817,7 @@ static int update_bl_status(struct backlight_device *bd)
                err = asus_wmi_set_devstate(ASUS_WMI_DEVID_BACKLIGHT,
                                            ctrl_param, NULL);
        }
-       return 0;
+       return err;
 }
 
 static const struct backlight_ops asus_wmi_bl_ops = {
@@ -832,23 +850,19 @@ static int asus_wmi_backlight_init(struct asus_wmi *asus)
        int max;
        int power;
 
-       max = asus_wmi_get_devstate_bits(asus, ASUS_WMI_DEVID_BRIGHTNESS,
-                                        ASUS_WMI_DSTS_MAX_BRIGTH_MASK);
-       power = read_backlight_power(asus);
+       max = read_brightness_max(asus);
 
-       if (max < 0 && power < 0) {
-               /* Try to keep the original error */
-               if (max == -ENODEV && power == -ENODEV)
-                       return -ENODEV;
-               if (max != -ENODEV)
-                       return max;
-               else
-                       return power;
-       }
        if (max == -ENODEV)
                max = 0;
+       else if (max < 0)
+               return max;
+
+       power = read_backlight_power(asus);
+
        if (power == -ENODEV)
                power = FB_BLANK_UNBLANK;
+       else if (power < 0)
+               return power;
 
        memset(&props, 0, sizeof(struct backlight_properties));
        props.max_brightness = max;