diff options
author | Scott Thrasher <scott.thrasher@gmail.com> | 2014-05-06 11:06:42 -0400 |
---|---|---|
committer | Matthew Garrett <matthew.garrett@nebula.com> | 2014-06-09 17:45:16 -0400 |
commit | 0ca849ea4fb86d9ee61435559f7159ed627895c3 (patch) | |
tree | a94eaa0e68879b12cdcf3a72651e54d1077e47ce | |
parent | fe808bfb59d693e07ee23c99542cd64e1f41b8c9 (diff) |
platform/x86: samsung-laptop: Add support for Samsung's NP7[34]0U3E models.
These models have only 4 levels of keyboard backlight brightness and forget
how to work the backlight after resuming from S3 sleep. I've added a quirk
to set the appropriate number of backlight levels, and one to re-enable the
keyboard backlight on resume.
(Whitespace cleaned up by Matthew Garrett)
Signed-off-by: Scott Thrasher <scott.thrasher@gmail.com>
Signed-off-by: Matthew Garrett <matthew.garrett@nebula.com>
-rw-r--r-- | drivers/platform/x86/samsung-laptop.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/drivers/platform/x86/samsung-laptop.c b/drivers/platform/x86/samsung-laptop.c index d1f030053176..5a5966512277 100644 --- a/drivers/platform/x86/samsung-laptop.c +++ b/drivers/platform/x86/samsung-laptop.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <linux/debugfs.h> | 27 | #include <linux/debugfs.h> |
28 | #include <linux/ctype.h> | 28 | #include <linux/ctype.h> |
29 | #include <linux/efi.h> | 29 | #include <linux/efi.h> |
30 | #include <linux/suspend.h> | ||
30 | #include <acpi/video.h> | 31 | #include <acpi/video.h> |
31 | 32 | ||
32 | /* | 33 | /* |
@@ -340,6 +341,8 @@ struct samsung_laptop { | |||
340 | struct samsung_laptop_debug debug; | 341 | struct samsung_laptop_debug debug; |
341 | struct samsung_quirks *quirks; | 342 | struct samsung_quirks *quirks; |
342 | 343 | ||
344 | struct notifier_block pm_nb; | ||
345 | |||
343 | bool handle_backlight; | 346 | bool handle_backlight; |
344 | bool has_stepping_quirk; | 347 | bool has_stepping_quirk; |
345 | 348 | ||
@@ -348,6 +351,8 @@ struct samsung_laptop { | |||
348 | 351 | ||
349 | struct samsung_quirks { | 352 | struct samsung_quirks { |
350 | bool broken_acpi_video; | 353 | bool broken_acpi_video; |
354 | bool four_kbd_backlight_levels; | ||
355 | bool enable_kbd_backlight; | ||
351 | }; | 356 | }; |
352 | 357 | ||
353 | static struct samsung_quirks samsung_unknown = {}; | 358 | static struct samsung_quirks samsung_unknown = {}; |
@@ -356,6 +361,11 @@ static struct samsung_quirks samsung_broken_acpi_video = { | |||
356 | .broken_acpi_video = true, | 361 | .broken_acpi_video = true, |
357 | }; | 362 | }; |
358 | 363 | ||
364 | static struct samsung_quirks samsung_np740u3e = { | ||
365 | .four_kbd_backlight_levels = true, | ||
366 | .enable_kbd_backlight = true, | ||
367 | }; | ||
368 | |||
359 | static bool force; | 369 | static bool force; |
360 | module_param(force, bool, 0); | 370 | module_param(force, bool, 0); |
361 | MODULE_PARM_DESC(force, | 371 | MODULE_PARM_DESC(force, |
@@ -1051,6 +1061,8 @@ static int __init samsung_leds_init(struct samsung_laptop *samsung) | |||
1051 | samsung->kbd_led.brightness_set = kbd_led_set; | 1061 | samsung->kbd_led.brightness_set = kbd_led_set; |
1052 | samsung->kbd_led.brightness_get = kbd_led_get; | 1062 | samsung->kbd_led.brightness_get = kbd_led_get; |
1053 | samsung->kbd_led.max_brightness = 8; | 1063 | samsung->kbd_led.max_brightness = 8; |
1064 | if (samsung->quirks->four_kbd_backlight_levels) | ||
1065 | samsung->kbd_led.max_brightness = 4; | ||
1054 | 1066 | ||
1055 | ret = led_classdev_register(&samsung->platform_device->dev, | 1067 | ret = led_classdev_register(&samsung->platform_device->dev, |
1056 | &samsung->kbd_led); | 1068 | &samsung->kbd_led); |
@@ -1414,6 +1426,19 @@ static void samsung_platform_exit(struct samsung_laptop *samsung) | |||
1414 | } | 1426 | } |
1415 | } | 1427 | } |
1416 | 1428 | ||
1429 | static int samsung_pm_notification(struct notifier_block *nb, | ||
1430 | unsigned long val, void *ptr) | ||
1431 | { | ||
1432 | struct samsung_laptop *samsung; | ||
1433 | |||
1434 | samsung = container_of(nb, struct samsung_laptop, pm_nb); | ||
1435 | if (val == PM_POST_HIBERNATION && | ||
1436 | samsung->quirks->enable_kbd_backlight) | ||
1437 | kbd_backlight_enable(samsung); | ||
1438 | |||
1439 | return 0; | ||
1440 | } | ||
1441 | |||
1417 | static int __init samsung_platform_init(struct samsung_laptop *samsung) | 1442 | static int __init samsung_platform_init(struct samsung_laptop *samsung) |
1418 | { | 1443 | { |
1419 | struct platform_device *pdev; | 1444 | struct platform_device *pdev; |
@@ -1534,6 +1559,15 @@ static struct dmi_system_id __initdata samsung_dmi_table[] = { | |||
1534 | }, | 1559 | }, |
1535 | .driver_data = &samsung_broken_acpi_video, | 1560 | .driver_data = &samsung_broken_acpi_video, |
1536 | }, | 1561 | }, |
1562 | { | ||
1563 | .callback = samsung_dmi_matched, | ||
1564 | .ident = "730U3E/740U3E", | ||
1565 | .matches = { | ||
1566 | DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."), | ||
1567 | DMI_MATCH(DMI_PRODUCT_NAME, "730U3E/740U3E"), | ||
1568 | }, | ||
1569 | .driver_data = &samsung_np740u3e, | ||
1570 | }, | ||
1537 | { }, | 1571 | { }, |
1538 | }; | 1572 | }; |
1539 | MODULE_DEVICE_TABLE(dmi, samsung_dmi_table); | 1573 | MODULE_DEVICE_TABLE(dmi, samsung_dmi_table); |
@@ -1608,6 +1642,9 @@ static int __init samsung_init(void) | |||
1608 | if (ret) | 1642 | if (ret) |
1609 | goto error_debugfs; | 1643 | goto error_debugfs; |
1610 | 1644 | ||
1645 | samsung->pm_nb.notifier_call = samsung_pm_notification; | ||
1646 | register_pm_notifier(&samsung->pm_nb); | ||
1647 | |||
1611 | samsung_platform_device = samsung->platform_device; | 1648 | samsung_platform_device = samsung->platform_device; |
1612 | return ret; | 1649 | return ret; |
1613 | 1650 | ||
@@ -1633,6 +1670,7 @@ static void __exit samsung_exit(void) | |||
1633 | struct samsung_laptop *samsung; | 1670 | struct samsung_laptop *samsung; |
1634 | 1671 | ||
1635 | samsung = platform_get_drvdata(samsung_platform_device); | 1672 | samsung = platform_get_drvdata(samsung_platform_device); |
1673 | unregister_pm_notifier(&samsung->pm_nb); | ||
1636 | 1674 | ||
1637 | samsung_debugfs_exit(samsung); | 1675 | samsung_debugfs_exit(samsung); |
1638 | samsung_leds_exit(samsung); | 1676 | samsung_leds_exit(samsung); |