static acpi_handle hotkey_handle;
 static struct key_entry hotkey_keycode_map[GENERIC_HOTKEY_MAP_MAX];
 
-int loongson_laptop_turn_on_backlight(void);
-int loongson_laptop_turn_off_backlight(void);
+static bool bl_powered;
 static int loongson_laptop_backlight_update(struct backlight_device *bd);
 
 /* 2. ACPI Helpers and device model */
        return level;
 }
 
+static int ec_backlight_set_power(bool state)
+{
+       int status;
+       union acpi_object arg0 = { ACPI_TYPE_INTEGER };
+       struct acpi_object_list args = { 1, &arg0 };
+
+       arg0.integer.value = state;
+       status = acpi_evaluate_object(NULL, "\\BLSW", &args, NULL);
+       if (ACPI_FAILURE(status)) {
+               pr_info("Loongson lvds error: 0x%x\n", status);
+               return -EIO;
+       }
+
+       return 0;
+}
+
 static int loongson_laptop_backlight_update(struct backlight_device *bd)
 {
-       int lvl = ec_backlight_level(bd->props.brightness);
+       bool target_powered = !backlight_is_blank(bd);
+       int ret = 0, lvl = ec_backlight_level(bd->props.brightness);
 
        if (lvl < 0)
                return -EIO;
+
        if (ec_set_brightness(lvl))
                return -EIO;
 
-       return 0;
+       if (target_powered != bl_powered) {
+               ret = ec_backlight_set_power(target_powered);
+               if (ret < 0)
+                       return ret;
+
+               bl_powered = target_powered;
+       }
+
+       return ret;
 }
 
 static int loongson_laptop_get_brightness(struct backlight_device *bd)
 
 static int laptop_backlight_register(void)
 {
-       int status = 0;
+       int status = 0, ret;
        struct backlight_properties props;
 
        memset(&props, 0, sizeof(props));
        if (!acpi_evalf(hotkey_handle, &status, "ECLL", "d"))
                return -EIO;
 
+       ret = ec_backlight_set_power(true);
+       if (ret)
+               return ret;
+
+       bl_powered = true;
+
        props.max_brightness = status;
        props.brightness = ec_get_brightness();
+       props.power = BACKLIGHT_POWER_ON;
        props.type = BACKLIGHT_PLATFORM;
 
        backlight_device_register("loongson_laptop",
                                NULL, NULL, &backlight_laptop_ops, &props);
 
-       return 0;
-}
-
-int loongson_laptop_turn_on_backlight(void)
-{
-       int status;
-       union acpi_object arg0 = { ACPI_TYPE_INTEGER };
-       struct acpi_object_list args = { 1, &arg0 };
-
-       arg0.integer.value = 1;
-       status = acpi_evaluate_object(NULL, "\\BLSW", &args, NULL);
-       if (ACPI_FAILURE(status)) {
-               pr_info("Loongson lvds error: 0x%x\n", status);
-               return -ENODEV;
-       }
-
-       return 0;
-}
-
-int loongson_laptop_turn_off_backlight(void)
-{
-       int status;
-       union acpi_object arg0 = { ACPI_TYPE_INTEGER };
-       struct acpi_object_list args = { 1, &arg0 };
-
-       arg0.integer.value = 0;
-       status = acpi_evaluate_object(NULL, "\\BLSW", &args, NULL);
-       if (ACPI_FAILURE(status)) {
-               pr_info("Loongson lvds error: 0x%x\n", status);
-               return -ENODEV;
-       }
 
        return 0;
 }