return 0;
 }
 
+static int kbdlight_set_level_and_update(int level);
+
 static int kbdlight_get_level(void)
 {
        int status = 0;
                        container_of(work, struct tpacpi_led_classdev, work);
 
        if (likely(tpacpi_lifecycle == TPACPI_LIFE_RUNNING))
-               kbdlight_set_level(data->new_state);
+               kbdlight_set_level_and_update(data->new_state);
 }
 
 static void kbdlight_sysfs_set(struct led_classdev *led_cdev,
                .max_brightness = 2,
                .brightness_set = &kbdlight_sysfs_set,
                .brightness_get = &kbdlight_sysfs_get,
-               .flags          = LED_CORE_SUSPENDRESUME,
        }
 };
 
        flush_workqueue(tpacpi_wq);
 }
 
+static int kbdlight_set_level_and_update(int level)
+{
+       int ret;
+       struct led_classdev *led_cdev;
+
+       ret = kbdlight_set_level(level);
+       led_cdev = &tpacpi_led_kbdlight.led_classdev;
+
+       if (ret == 0 && !(led_cdev->flags & LED_SUSPENDED))
+               led_cdev->brightness = level;
+
+       return ret;
+}
+
 static int kbdlight_read(struct seq_file *m)
 {
        int level;
        if (level == -1)
                return -EINVAL;
 
-       return kbdlight_set_level(level);
+       return kbdlight_set_level_and_update(level);
+}
+
+static void kbdlight_suspend(void)
+{
+       struct led_classdev *led_cdev;
+
+       if (!tp_features.kbdlight)
+               return;
+
+       led_cdev = &tpacpi_led_kbdlight.led_classdev;
+       led_update_brightness(led_cdev);
+       led_classdev_suspend(led_cdev);
+}
+
+static void kbdlight_resume(void)
+{
+       if (!tp_features.kbdlight)
+               return;
+
+       led_classdev_resume(&tpacpi_led_kbdlight.led_classdev);
 }
 
 static struct ibm_struct kbdlight_driver_data = {
        .name = "kbdlight",
        .read = kbdlight_read,
        .write = kbdlight_write,
+       .suspend = kbdlight_suspend,
+       .resume = kbdlight_resume,
        .exit = kbdlight_exit,
 };