diff options
Diffstat (limited to 'drivers/hwmon')
-rw-r--r-- | drivers/hwmon/applesmc.c | 38 |
1 files changed, 26 insertions, 12 deletions
diff --git a/drivers/hwmon/applesmc.c b/drivers/hwmon/applesmc.c index 753b34885f9d..7ea6a8f66056 100644 --- a/drivers/hwmon/applesmc.c +++ b/drivers/hwmon/applesmc.c | |||
@@ -178,6 +178,8 @@ static const int debug; | |||
178 | static struct platform_device *pdev; | 178 | static struct platform_device *pdev; |
179 | static s16 rest_x; | 179 | static s16 rest_x; |
180 | static s16 rest_y; | 180 | static s16 rest_y; |
181 | static u8 backlight_state[2]; | ||
182 | |||
181 | static struct device *hwmon_dev; | 183 | static struct device *hwmon_dev; |
182 | static struct input_polled_dev *applesmc_idev; | 184 | static struct input_polled_dev *applesmc_idev; |
183 | 185 | ||
@@ -497,17 +499,36 @@ static int applesmc_probe(struct platform_device *dev) | |||
497 | return 0; | 499 | return 0; |
498 | } | 500 | } |
499 | 501 | ||
500 | static int applesmc_resume(struct platform_device *dev) | 502 | /* Synchronize device with memorized backlight state */ |
503 | static int applesmc_pm_resume(struct device *dev) | ||
501 | { | 504 | { |
502 | return applesmc_device_init(); | 505 | mutex_lock(&applesmc_lock); |
506 | if (applesmc_light) | ||
507 | applesmc_write_key(BACKLIGHT_KEY, backlight_state, 2); | ||
508 | mutex_unlock(&applesmc_lock); | ||
509 | return 0; | ||
503 | } | 510 | } |
504 | 511 | ||
512 | /* Reinitialize device on resume from hibernation */ | ||
513 | static int applesmc_pm_restore(struct device *dev) | ||
514 | { | ||
515 | int ret = applesmc_device_init(); | ||
516 | if (ret) | ||
517 | return ret; | ||
518 | return applesmc_pm_resume(dev); | ||
519 | } | ||
520 | |||
521 | static struct dev_pm_ops applesmc_pm_ops = { | ||
522 | .resume = applesmc_pm_resume, | ||
523 | .restore = applesmc_pm_restore, | ||
524 | }; | ||
525 | |||
505 | static struct platform_driver applesmc_driver = { | 526 | static struct platform_driver applesmc_driver = { |
506 | .probe = applesmc_probe, | 527 | .probe = applesmc_probe, |
507 | .resume = applesmc_resume, | ||
508 | .driver = { | 528 | .driver = { |
509 | .name = "applesmc", | 529 | .name = "applesmc", |
510 | .owner = THIS_MODULE, | 530 | .owner = THIS_MODULE, |
531 | .pm = &applesmc_pm_ops, | ||
511 | }, | 532 | }, |
512 | }; | 533 | }; |
513 | 534 | ||
@@ -804,17 +825,10 @@ static ssize_t applesmc_calibrate_store(struct device *dev, | |||
804 | return count; | 825 | return count; |
805 | } | 826 | } |
806 | 827 | ||
807 | /* Store the next backlight value to be written by the work */ | ||
808 | static unsigned int backlight_value; | ||
809 | |||
810 | static void applesmc_backlight_set(struct work_struct *work) | 828 | static void applesmc_backlight_set(struct work_struct *work) |
811 | { | 829 | { |
812 | u8 buffer[2]; | ||
813 | |||
814 | mutex_lock(&applesmc_lock); | 830 | mutex_lock(&applesmc_lock); |
815 | buffer[0] = backlight_value; | 831 | applesmc_write_key(BACKLIGHT_KEY, backlight_state, 2); |
816 | buffer[1] = 0x00; | ||
817 | applesmc_write_key(BACKLIGHT_KEY, buffer, 2); | ||
818 | mutex_unlock(&applesmc_lock); | 832 | mutex_unlock(&applesmc_lock); |
819 | } | 833 | } |
820 | static DECLARE_WORK(backlight_work, &applesmc_backlight_set); | 834 | static DECLARE_WORK(backlight_work, &applesmc_backlight_set); |
@@ -824,7 +838,7 @@ static void applesmc_brightness_set(struct led_classdev *led_cdev, | |||
824 | { | 838 | { |
825 | int ret; | 839 | int ret; |
826 | 840 | ||
827 | backlight_value = value; | 841 | backlight_state[0] = value; |
828 | ret = queue_work(applesmc_led_wq, &backlight_work); | 842 | ret = queue_work(applesmc_led_wq, &backlight_work); |
829 | 843 | ||
830 | if (debug && (!ret)) | 844 | if (debug && (!ret)) |