aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorScott Thrasher <scott.thrasher@gmail.com>2014-05-06 11:06:42 -0400
committerMatthew Garrett <matthew.garrett@nebula.com>2014-06-09 17:45:16 -0400
commit0ca849ea4fb86d9ee61435559f7159ed627895c3 (patch)
treea94eaa0e68879b12cdcf3a72651e54d1077e47ce
parentfe808bfb59d693e07ee23c99542cd64e1f41b8c9 (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.c38
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
349struct samsung_quirks { 352struct 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
353static struct samsung_quirks samsung_unknown = {}; 358static 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
364static struct samsung_quirks samsung_np740u3e = {
365 .four_kbd_backlight_levels = true,
366 .enable_kbd_backlight = true,
367};
368
359static bool force; 369static bool force;
360module_param(force, bool, 0); 370module_param(force, bool, 0);
361MODULE_PARM_DESC(force, 371MODULE_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
1429static 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
1417static int __init samsung_platform_init(struct samsung_laptop *samsung) 1442static 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};
1539MODULE_DEVICE_TABLE(dmi, samsung_dmi_table); 1573MODULE_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);