summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/ABI/testing/sysfs-platform-ideapad-laptop13
-rw-r--r--Documentation/laptops/thinkpad-acpi.txt2
-rw-r--r--drivers/platform/mellanox/mlxreg-hotplug.c54
-rw-r--r--drivers/platform/x86/acer-wmi.c1
-rw-r--r--drivers/platform/x86/apple-gmux.c2
-rw-r--r--drivers/platform/x86/asus-laptop.c3
-rw-r--r--drivers/platform/x86/asus-wireless.c2
-rw-r--r--drivers/platform/x86/asus-wmi.c3
-rw-r--r--drivers/platform/x86/dell-laptop.c17
-rw-r--r--drivers/platform/x86/dell-smbios-base.c5
-rw-r--r--drivers/platform/x86/dell-wmi.c16
-rw-r--r--drivers/platform/x86/fujitsu-laptop.c47
-rw-r--r--drivers/platform/x86/ideapad-laptop.c66
-rw-r--r--drivers/platform/x86/intel_scu_ipc.c4
-rw-r--r--drivers/platform/x86/mlx-platform.c289
-rw-r--r--drivers/platform/x86/samsung-laptop.c3
-rw-r--r--drivers/platform/x86/silead_dmi.c101
-rw-r--r--drivers/platform/x86/thinkpad_acpi.c30
-rw-r--r--include/linux/platform_data/mlxreg.h3
-rw-r--r--include/linux/string_helpers.h1
20 files changed, 585 insertions, 77 deletions
diff --git a/Documentation/ABI/testing/sysfs-platform-ideapad-laptop b/Documentation/ABI/testing/sysfs-platform-ideapad-laptop
index 597a2f3d1efc..1b31be3f996a 100644
--- a/Documentation/ABI/testing/sysfs-platform-ideapad-laptop
+++ b/Documentation/ABI/testing/sysfs-platform-ideapad-laptop
@@ -25,3 +25,16 @@ Description:
25 Control touchpad mode. 25 Control touchpad mode.
26 * 1 -> Switched On 26 * 1 -> Switched On
27 * 0 -> Switched Off 27 * 0 -> Switched Off
28
29What: /sys/bus/pci/devices/<bdf>/<device>/VPC2004:00/fn_lock
30Date: May 2018
31KernelVersion: 4.18
32Contact: "Oleg Keri <ezhi99@gmail.com>"
33Description:
34 Control fn-lock mode.
35 * 1 -> Switched On
36 * 0 -> Switched Off
37
38 For example:
39 # echo "0" > \
40 /sys/bus/pci/devices/0000:00:1f.0/PNP0C09:00/VPC2004:00/fn_lock
diff --git a/Documentation/laptops/thinkpad-acpi.txt b/Documentation/laptops/thinkpad-acpi.txt
index 00b6dfed573c..6cced88de6da 100644
--- a/Documentation/laptops/thinkpad-acpi.txt
+++ b/Documentation/laptops/thinkpad-acpi.txt
@@ -540,8 +540,10 @@ Events that are propagated by the driver to userspace:
5400x6021 ALARM: a sensor is too hot 5400x6021 ALARM: a sensor is too hot
5410x6022 ALARM: a sensor is extremely hot 5410x6022 ALARM: a sensor is extremely hot
5420x6030 System thermal table changed 5420x6030 System thermal table changed
5430x6032 Thermal Control command set completion (DYTC, Windows)
5430x6040 Nvidia Optimus/AC adapter related (TO BE VERIFIED) 5440x6040 Nvidia Optimus/AC adapter related (TO BE VERIFIED)
5440x60C0 X1 Yoga 2016, Tablet mode status changed 5450x60C0 X1 Yoga 2016, Tablet mode status changed
5460x60F0 Thermal Transformation changed (GMTS, Windows)
545 547
546Battery nearly empty alarms are a last resort attempt to get the 548Battery nearly empty alarms are a last resort attempt to get the
547operating system to hibernate or shutdown cleanly (0x2313), or shutdown 549operating system to hibernate or shutdown cleanly (0x2313), or shutdown
diff --git a/drivers/platform/mellanox/mlxreg-hotplug.c b/drivers/platform/mellanox/mlxreg-hotplug.c
index 36a41ff506f0..ac97aa020db3 100644
--- a/drivers/platform/mellanox/mlxreg-hotplug.c
+++ b/drivers/platform/mellanox/mlxreg-hotplug.c
@@ -55,13 +55,16 @@
55#define MLXREG_HOTPLUG_RST_CNTR 3 55#define MLXREG_HOTPLUG_RST_CNTR 3
56 56
57#define MLXREG_HOTPLUG_ATTRS_MAX 24 57#define MLXREG_HOTPLUG_ATTRS_MAX 24
58#define MLXREG_HOTPLUG_NOT_ASSERT 3
58 59
59/** 60/**
60 * struct mlxreg_hotplug_priv_data - platform private data: 61 * struct mlxreg_hotplug_priv_data - platform private data:
61 * @irq: platform device interrupt number; 62 * @irq: platform device interrupt number;
63 * @dev: basic device;
62 * @pdev: platform device; 64 * @pdev: platform device;
63 * @plat: platform data; 65 * @plat: platform data;
64 * @dwork: delayed work template; 66 * @regmap: register map handle;
67 * @dwork_irq: delayed work template;
65 * @lock: spin lock; 68 * @lock: spin lock;
66 * @hwmon: hwmon device; 69 * @hwmon: hwmon device;
67 * @mlxreg_hotplug_attr: sysfs attributes array; 70 * @mlxreg_hotplug_attr: sysfs attributes array;
@@ -71,6 +74,8 @@
71 * @cell: location of top aggregation interrupt register; 74 * @cell: location of top aggregation interrupt register;
72 * @mask: top aggregation interrupt common mask; 75 * @mask: top aggregation interrupt common mask;
73 * @aggr_cache: last value of aggregation register status; 76 * @aggr_cache: last value of aggregation register status;
77 * @after_probe: flag indication probing completion;
78 * @not_asserted: number of entries in workqueue with no signal assertion;
74 */ 79 */
75struct mlxreg_hotplug_priv_data { 80struct mlxreg_hotplug_priv_data {
76 int irq; 81 int irq;
@@ -79,7 +84,6 @@ struct mlxreg_hotplug_priv_data {
79 struct mlxreg_hotplug_platform_data *plat; 84 struct mlxreg_hotplug_platform_data *plat;
80 struct regmap *regmap; 85 struct regmap *regmap;
81 struct delayed_work dwork_irq; 86 struct delayed_work dwork_irq;
82 struct delayed_work dwork;
83 spinlock_t lock; /* sync with interrupt */ 87 spinlock_t lock; /* sync with interrupt */
84 struct device *hwmon; 88 struct device *hwmon;
85 struct attribute *mlxreg_hotplug_attr[MLXREG_HOTPLUG_ATTRS_MAX + 1]; 89 struct attribute *mlxreg_hotplug_attr[MLXREG_HOTPLUG_ATTRS_MAX + 1];
@@ -91,6 +95,7 @@ struct mlxreg_hotplug_priv_data {
91 u32 mask; 95 u32 mask;
92 u32 aggr_cache; 96 u32 aggr_cache;
93 bool after_probe; 97 bool after_probe;
98 u8 not_asserted;
94}; 99};
95 100
96static int mlxreg_hotplug_device_create(struct mlxreg_hotplug_priv_data *priv, 101static int mlxreg_hotplug_device_create(struct mlxreg_hotplug_priv_data *priv,
@@ -409,6 +414,18 @@ static void mlxreg_hotplug_work_handler(struct work_struct *work)
409 aggr_asserted = priv->aggr_cache ^ regval; 414 aggr_asserted = priv->aggr_cache ^ regval;
410 priv->aggr_cache = regval; 415 priv->aggr_cache = regval;
411 416
417 /*
418 * Handler is invoked, but no assertion is detected at top aggregation
419 * status level. Set aggr_asserted to mask value to allow handler extra
420 * run over all relevant signals to recover any missed signal.
421 */
422 if (priv->not_asserted == MLXREG_HOTPLUG_NOT_ASSERT) {
423 priv->not_asserted = 0;
424 aggr_asserted = pdata->mask;
425 }
426 if (!aggr_asserted)
427 goto unmask_event;
428
412 /* Handle topology and health configuration changes. */ 429 /* Handle topology and health configuration changes. */
413 for (i = 0; i < pdata->counter; i++, item++) { 430 for (i = 0; i < pdata->counter; i++, item++) {
414 if (aggr_asserted & item->aggr_mask) { 431 if (aggr_asserted & item->aggr_mask) {
@@ -419,27 +436,26 @@ static void mlxreg_hotplug_work_handler(struct work_struct *work)
419 } 436 }
420 } 437 }
421 438
422 if (aggr_asserted) { 439 spin_lock_irqsave(&priv->lock, flags);
423 spin_lock_irqsave(&priv->lock, flags);
424 440
425 /* 441 /*
426 * It is possible, that some signals have been inserted, while 442 * It is possible, that some signals have been inserted, while
427 * interrupt has been masked by mlxreg_hotplug_work_handler. 443 * interrupt has been masked by mlxreg_hotplug_work_handler. In this
428 * In this case such signals will be missed. In order to handle 444 * case such signals will be missed. In order to handle these signals
429 * these signals delayed work is canceled and work task 445 * delayed work is canceled and work task re-scheduled for immediate
430 * re-scheduled for immediate execution. It allows to handle 446 * execution. It allows to handle missed signals, if any. In other case
431 * missed signals, if any. In other case work handler just 447 * work handler just validates that no new signals have been received
432 * validates that no new signals have been received during 448 * during masking.
433 * masking. 449 */
434 */ 450 cancel_delayed_work(&priv->dwork_irq);
435 cancel_delayed_work(&priv->dwork_irq); 451 schedule_delayed_work(&priv->dwork_irq, 0);
436 schedule_delayed_work(&priv->dwork_irq, 0);
437 452
438 spin_unlock_irqrestore(&priv->lock, flags); 453 spin_unlock_irqrestore(&priv->lock, flags);
439 454
440 return; 455 return;
441 }
442 456
457unmask_event:
458 priv->not_asserted++;
443 /* Unmask aggregation event (no need acknowledge). */ 459 /* Unmask aggregation event (no need acknowledge). */
444 ret = regmap_write(priv->regmap, pdata->cell + 460 ret = regmap_write(priv->regmap, pdata->cell +
445 MLXREG_HOTPLUG_AGGR_MASK_OFF, pdata->mask); 461 MLXREG_HOTPLUG_AGGR_MASK_OFF, pdata->mask);
diff --git a/drivers/platform/x86/acer-wmi.c b/drivers/platform/x86/acer-wmi.c
index 1be71f956d5c..8952173dd380 100644
--- a/drivers/platform/x86/acer-wmi.c
+++ b/drivers/platform/x86/acer-wmi.c
@@ -129,6 +129,7 @@ static const struct key_entry acer_wmi_keymap[] __initconst = {
129 {KE_IGNORE, 0x83, {KEY_TOUCHPAD_TOGGLE} }, 129 {KE_IGNORE, 0x83, {KEY_TOUCHPAD_TOGGLE} },
130 {KE_KEY, 0x85, {KEY_TOUCHPAD_TOGGLE} }, 130 {KE_KEY, 0x85, {KEY_TOUCHPAD_TOGGLE} },
131 {KE_KEY, 0x86, {KEY_WLAN} }, 131 {KE_KEY, 0x86, {KEY_WLAN} },
132 {KE_KEY, 0x87, {KEY_POWER} },
132 {KE_END, 0} 133 {KE_END, 0}
133}; 134};
134 135
diff --git a/drivers/platform/x86/apple-gmux.c b/drivers/platform/x86/apple-gmux.c
index 7c4eb86c851e..fd2ffebc868f 100644
--- a/drivers/platform/x86/apple-gmux.c
+++ b/drivers/platform/x86/apple-gmux.c
@@ -495,7 +495,7 @@ static int gmux_set_power_state(enum vga_switcheroo_client_id id,
495 return gmux_set_discrete_state(apple_gmux_data, state); 495 return gmux_set_discrete_state(apple_gmux_data, state);
496} 496}
497 497
498static int gmux_get_client_id(struct pci_dev *pdev) 498static enum vga_switcheroo_client_id gmux_get_client_id(struct pci_dev *pdev)
499{ 499{
500 /* 500 /*
501 * Early Macbook Pros with switchable graphics use nvidia 501 * Early Macbook Pros with switchable graphics use nvidia
diff --git a/drivers/platform/x86/asus-laptop.c b/drivers/platform/x86/asus-laptop.c
index c4768be24ba9..700c48ddfa7c 100644
--- a/drivers/platform/x86/asus-laptop.c
+++ b/drivers/platform/x86/asus-laptop.c
@@ -1593,8 +1593,7 @@ static umode_t asus_sysfs_is_visible(struct kobject *kobj,
1593 int idx) 1593 int idx)
1594{ 1594{
1595 struct device *dev = container_of(kobj, struct device, kobj); 1595 struct device *dev = container_of(kobj, struct device, kobj);
1596 struct platform_device *pdev = to_platform_device(dev); 1596 struct asus_laptop *asus = dev_get_drvdata(dev);
1597 struct asus_laptop *asus = platform_get_drvdata(pdev);
1598 acpi_handle handle = asus->handle; 1597 acpi_handle handle = asus->handle;
1599 bool supported; 1598 bool supported;
1600 1599
diff --git a/drivers/platform/x86/asus-wireless.c b/drivers/platform/x86/asus-wireless.c
index f086469ea740..6afd011de9e5 100644
--- a/drivers/platform/x86/asus-wireless.c
+++ b/drivers/platform/x86/asus-wireless.c
@@ -72,7 +72,7 @@ static u64 asus_wireless_method(acpi_handle handle, const char *method,
72 acpi_handle_err(handle, 72 acpi_handle_err(handle,
73 "Failed to eval method %s, param %#x (%d)\n", 73 "Failed to eval method %s, param %#x (%d)\n",
74 method, param, s); 74 method, param, s);
75 acpi_handle_debug(handle, "%s returned %#x\n", method, (uint) ret); 75 acpi_handle_debug(handle, "%s returned %#llx\n", method, ret);
76 return ret; 76 return ret;
77} 77}
78 78
diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c
index ffffb9909ae1..3d523ca64694 100644
--- a/drivers/platform/x86/asus-wmi.c
+++ b/drivers/platform/x86/asus-wmi.c
@@ -1875,8 +1875,7 @@ static umode_t asus_sysfs_is_visible(struct kobject *kobj,
1875 struct attribute *attr, int idx) 1875 struct attribute *attr, int idx)
1876{ 1876{
1877 struct device *dev = container_of(kobj, struct device, kobj); 1877 struct device *dev = container_of(kobj, struct device, kobj);
1878 struct platform_device *pdev = to_platform_device(dev); 1878 struct asus_wmi *asus = dev_get_drvdata(dev);
1879 struct asus_wmi *asus = platform_get_drvdata(pdev);
1880 bool ok = true; 1879 bool ok = true;
1881 int devid = -1; 1880 int devid = -1;
1882 1881
diff --git a/drivers/platform/x86/dell-laptop.c b/drivers/platform/x86/dell-laptop.c
index c52c6723374b..f1fa8612db40 100644
--- a/drivers/platform/x86/dell-laptop.c
+++ b/drivers/platform/x86/dell-laptop.c
@@ -38,6 +38,7 @@
38struct quirk_entry { 38struct quirk_entry {
39 bool touchpad_led; 39 bool touchpad_led;
40 bool kbd_led_levels_off_1; 40 bool kbd_led_levels_off_1;
41 bool kbd_missing_ac_tag;
41 42
42 bool needs_kbd_timeouts; 43 bool needs_kbd_timeouts;
43 /* 44 /*
@@ -68,6 +69,10 @@ static struct quirk_entry quirk_dell_xps13_9333 = {
68 .kbd_timeouts = { 0, 5, 15, 60, 5 * 60, 15 * 60, -1 }, 69 .kbd_timeouts = { 0, 5, 15, 60, 5 * 60, 15 * 60, -1 },
69}; 70};
70 71
72static struct quirk_entry quirk_dell_xps13_9370 = {
73 .kbd_missing_ac_tag = true,
74};
75
71static struct quirk_entry quirk_dell_latitude_e6410 = { 76static struct quirk_entry quirk_dell_latitude_e6410 = {
72 .kbd_led_levels_off_1 = true, 77 .kbd_led_levels_off_1 = true,
73}; 78};
@@ -293,6 +298,15 @@ static const struct dmi_system_id dell_quirks[] __initconst = {
293 }, 298 },
294 { 299 {
295 .callback = dmi_matched, 300 .callback = dmi_matched,
301 .ident = "Dell XPS 13 9370",
302 .matches = {
303 DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
304 DMI_MATCH(DMI_PRODUCT_NAME, "XPS 13 9370"),
305 },
306 .driver_data = &quirk_dell_xps13_9370,
307 },
308 {
309 .callback = dmi_matched,
296 .ident = "Dell Latitude E6410", 310 .ident = "Dell Latitude E6410",
297 .matches = { 311 .matches = {
298 DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), 312 DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
@@ -1401,7 +1415,8 @@ static inline int kbd_init_info(void)
1401 * timeout value which is shared for both battery and AC power 1415 * timeout value which is shared for both battery and AC power
1402 * settings. So do not try to set AC values on old models. 1416 * settings. So do not try to set AC values on old models.
1403 */ 1417 */
1404 if (dell_smbios_find_token(KBD_LED_AC_TOKEN)) 1418 if ((quirks && quirks->kbd_missing_ac_tag) ||
1419 dell_smbios_find_token(KBD_LED_AC_TOKEN))
1405 kbd_timeout_ac_supported = true; 1420 kbd_timeout_ac_supported = true;
1406 1421
1407 kbd_get_state(&state); 1422 kbd_get_state(&state);
diff --git a/drivers/platform/x86/dell-smbios-base.c b/drivers/platform/x86/dell-smbios-base.c
index 33fb2a20458a..9dc282ed5a9e 100644
--- a/drivers/platform/x86/dell-smbios-base.c
+++ b/drivers/platform/x86/dell-smbios-base.c
@@ -555,11 +555,10 @@ static void free_group(struct platform_device *pdev)
555 555
556static int __init dell_smbios_init(void) 556static int __init dell_smbios_init(void)
557{ 557{
558 const struct dmi_device *valid;
559 int ret, wmi, smm; 558 int ret, wmi, smm;
560 559
561 valid = dmi_find_device(DMI_DEV_TYPE_OEM_STRING, "Dell System", NULL); 560 if (!dmi_find_device(DMI_DEV_TYPE_OEM_STRING, "Dell System", NULL) &&
562 if (!valid) { 561 !dmi_find_device(DMI_DEV_TYPE_OEM_STRING, "www.dell.com", NULL)) {
563 pr_err("Unable to run on non-Dell system\n"); 562 pr_err("Unable to run on non-Dell system\n");
564 return -ENODEV; 563 return -ENODEV;
565 } 564 }
diff --git a/drivers/platform/x86/dell-wmi.c b/drivers/platform/x86/dell-wmi.c
index 8d102195a392..16c7f3d9a335 100644
--- a/drivers/platform/x86/dell-wmi.c
+++ b/drivers/platform/x86/dell-wmi.c
@@ -233,7 +233,7 @@ static const u16 bios_to_linux_keycode[256] = {
233 [18] = KEY_PROG1, 233 [18] = KEY_PROG1,
234 [19] = KEY_BRIGHTNESSDOWN, 234 [19] = KEY_BRIGHTNESSDOWN,
235 [20] = KEY_BRIGHTNESSUP, 235 [20] = KEY_BRIGHTNESSUP,
236 [21] = KEY_UNKNOWN, 236 [21] = KEY_BRIGHTNESS_AUTO,
237 [22] = KEY_KBDILLUMTOGGLE, 237 [22] = KEY_KBDILLUMTOGGLE,
238 [23] = KEY_UNKNOWN, 238 [23] = KEY_UNKNOWN,
239 [24] = KEY_SWITCHVIDEOMODE, 239 [24] = KEY_SWITCHVIDEOMODE,
@@ -261,6 +261,12 @@ static const u16 bios_to_linux_keycode[256] = {
261 * override them. 261 * override them.
262 */ 262 */
263static const struct key_entry dell_wmi_keymap_type_0010[] = { 263static const struct key_entry dell_wmi_keymap_type_0010[] = {
264 /* Fn-lock switched to function keys */
265 { KE_IGNORE, 0x0, { KEY_RESERVED } },
266
267 /* Fn-lock switched to multimedia keys */
268 { KE_IGNORE, 0x1, { KEY_RESERVED } },
269
264 /* Mic mute */ 270 /* Mic mute */
265 { KE_KEY, 0x150, { KEY_MICMUTE } }, 271 { KE_KEY, 0x150, { KEY_MICMUTE } },
266 272
@@ -296,6 +302,14 @@ static const struct key_entry dell_wmi_keymap_type_0010[] = {
296 { KE_KEY, 0x851, { KEY_PROG2 } }, 302 { KE_KEY, 0x851, { KEY_PROG2 } },
297 { KE_KEY, 0x852, { KEY_PROG3 } }, 303 { KE_KEY, 0x852, { KEY_PROG3 } },
298 304
305 /*
306 * Radio disable (notify only -- there is no model for which the
307 * WMI event is supposed to trigger an action).
308 */
309 { KE_IGNORE, 0xe008, { KEY_RFKILL } },
310
311 /* Fn-lock */
312 { KE_IGNORE, 0xe035, { KEY_RESERVED } },
299}; 313};
300 314
301/* 315/*
diff --git a/drivers/platform/x86/fujitsu-laptop.c b/drivers/platform/x86/fujitsu-laptop.c
index cd95b6f3a064..6afeaece2f50 100644
--- a/drivers/platform/x86/fujitsu-laptop.c
+++ b/drivers/platform/x86/fujitsu-laptop.c
@@ -91,6 +91,9 @@
91#define FLAG_RFKILL BIT(5) 91#define FLAG_RFKILL BIT(5)
92#define FLAG_LID BIT(8) 92#define FLAG_LID BIT(8)
93#define FLAG_DOCK BIT(9) 93#define FLAG_DOCK BIT(9)
94#define FLAG_TOUCHPAD_TOGGLE BIT(26)
95#define FLAG_MICMUTE BIT(29)
96#define FLAG_SOFTKEYS (FLAG_RFKILL | FLAG_TOUCHPAD_TOGGLE | FLAG_MICMUTE)
94 97
95/* FUNC interface - LED control */ 98/* FUNC interface - LED control */
96#define FUNC_LED_OFF BIT(0) 99#define FUNC_LED_OFF BIT(0)
@@ -456,14 +459,15 @@ static void acpi_fujitsu_bl_notify(struct acpi_device *device, u32 event)
456/* ACPI device for hotkey handling */ 459/* ACPI device for hotkey handling */
457 460
458static const struct key_entry keymap_default[] = { 461static const struct key_entry keymap_default[] = {
459 { KE_KEY, KEY1_CODE, { KEY_PROG1 } }, 462 { KE_KEY, KEY1_CODE, { KEY_PROG1 } },
460 { KE_KEY, KEY2_CODE, { KEY_PROG2 } }, 463 { KE_KEY, KEY2_CODE, { KEY_PROG2 } },
461 { KE_KEY, KEY3_CODE, { KEY_PROG3 } }, 464 { KE_KEY, KEY3_CODE, { KEY_PROG3 } },
462 { KE_KEY, KEY4_CODE, { KEY_PROG4 } }, 465 { KE_KEY, KEY4_CODE, { KEY_PROG4 } },
463 { KE_KEY, KEY5_CODE, { KEY_RFKILL } }, 466 { KE_KEY, KEY5_CODE, { KEY_RFKILL } },
464 { KE_KEY, BIT(5), { KEY_RFKILL } }, 467 /* Soft keys read from status flags */
465 { KE_KEY, BIT(26), { KEY_TOUCHPAD_TOGGLE } }, 468 { KE_KEY, FLAG_RFKILL, { KEY_RFKILL } },
466 { KE_KEY, BIT(29), { KEY_MICMUTE } }, 469 { KE_KEY, FLAG_TOUCHPAD_TOGGLE, { KEY_TOUCHPAD_TOGGLE } },
470 { KE_KEY, FLAG_MICMUTE, { KEY_MICMUTE } },
467 { KE_END, 0 } 471 { KE_END, 0 }
468}; 472};
469 473
@@ -903,7 +907,8 @@ static void acpi_fujitsu_laptop_release(struct acpi_device *device)
903static void acpi_fujitsu_laptop_notify(struct acpi_device *device, u32 event) 907static void acpi_fujitsu_laptop_notify(struct acpi_device *device, u32 event)
904{ 908{
905 struct fujitsu_laptop *priv = acpi_driver_data(device); 909 struct fujitsu_laptop *priv = acpi_driver_data(device);
906 int scancode, i = 0, ret; 910 unsigned long flags;
911 int scancode, i = 0;
907 unsigned int irb; 912 unsigned int irb;
908 913
909 if (event != ACPI_FUJITSU_NOTIFY_CODE) { 914 if (event != ACPI_FUJITSU_NOTIFY_CODE) {
@@ -930,21 +935,17 @@ static void acpi_fujitsu_laptop_notify(struct acpi_device *device, u32 event)
930 "Unknown GIRB result [%x]\n", irb); 935 "Unknown GIRB result [%x]\n", irb);
931 } 936 }
932 937
933 /* On some models (first seen on the Skylake-based Lifebook 938 /*
934 * E736/E746/E756), the touchpad toggle hotkey (Fn+F4) is 939 * First seen on the Skylake-based Lifebook E736/E746/E756), the
935 * handled in software; its state is queried using FUNC_FLAGS 940 * touchpad toggle hotkey (Fn+F4) is handled in software. Other models
941 * have since added additional "soft keys". These are reported in the
942 * status flags queried using FUNC_FLAGS.
936 */ 943 */
937 if (priv->flags_supported & (BIT(5) | BIT(26) | BIT(29))) { 944 if (priv->flags_supported & (FLAG_SOFTKEYS)) {
938 ret = call_fext_func(device, FUNC_FLAGS, 0x1, 0x0, 0x0); 945 flags = call_fext_func(device, FUNC_FLAGS, 0x1, 0x0, 0x0);
939 if (ret & BIT(5)) 946 flags &= (FLAG_SOFTKEYS);
940 sparse_keymap_report_event(priv->input, 947 for_each_set_bit(i, &flags, BITS_PER_LONG)
941 BIT(5), 1, true); 948 sparse_keymap_report_event(priv->input, BIT(i), 1, true);
942 if (ret & BIT(26))
943 sparse_keymap_report_event(priv->input,
944 BIT(26), 1, true);
945 if (ret & BIT(29))
946 sparse_keymap_report_event(priv->input,
947 BIT(29), 1, true);
948 } 949 }
949} 950}
950 951
diff --git a/drivers/platform/x86/ideapad-laptop.c b/drivers/platform/x86/ideapad-laptop.c
index 535199c9e6bc..45b7cb01f410 100644
--- a/drivers/platform/x86/ideapad-laptop.c
+++ b/drivers/platform/x86/ideapad-laptop.c
@@ -43,6 +43,7 @@
43#define IDEAPAD_RFKILL_DEV_NUM (3) 43#define IDEAPAD_RFKILL_DEV_NUM (3)
44 44
45#define BM_CONSERVATION_BIT (5) 45#define BM_CONSERVATION_BIT (5)
46#define HA_FNLOCK_BIT (10)
46 47
47#define CFG_BT_BIT (16) 48#define CFG_BT_BIT (16)
48#define CFG_3G_BIT (17) 49#define CFG_3G_BIT (17)
@@ -59,6 +60,8 @@ static const char *const ideapad_wmi_fnesc_events[] = {
59enum { 60enum {
60 BMCMD_CONSERVATION_ON = 3, 61 BMCMD_CONSERVATION_ON = 3,
61 BMCMD_CONSERVATION_OFF = 5, 62 BMCMD_CONSERVATION_OFF = 5,
63 HACMD_FNLOCK_ON = 0xe,
64 HACMD_FNLOCK_OFF = 0xf,
62}; 65};
63 66
64enum { 67enum {
@@ -139,11 +142,11 @@ static int method_gbmd(acpi_handle handle, unsigned long *ret)
139 return result; 142 return result;
140} 143}
141 144
142static int method_sbmc(acpi_handle handle, int cmd) 145static int method_int1(acpi_handle handle, char *method, int cmd)
143{ 146{
144 acpi_status status; 147 acpi_status status;
145 148
146 status = acpi_execute_simple_method(handle, "SBMC", cmd); 149 status = acpi_execute_simple_method(handle, method, cmd);
147 return ACPI_FAILURE(status) ? -1 : 0; 150 return ACPI_FAILURE(status) ? -1 : 0;
148} 151}
149 152
@@ -487,7 +490,7 @@ static ssize_t conservation_mode_store(struct device *dev,
487 if (ret) 490 if (ret)
488 return ret; 491 return ret;
489 492
490 ret = method_sbmc(priv->adev->handle, state ? 493 ret = method_int1(priv->adev->handle, "SBMC", state ?
491 BMCMD_CONSERVATION_ON : 494 BMCMD_CONSERVATION_ON :
492 BMCMD_CONSERVATION_OFF); 495 BMCMD_CONSERVATION_OFF);
493 if (ret < 0) 496 if (ret < 0)
@@ -497,11 +500,51 @@ static ssize_t conservation_mode_store(struct device *dev,
497 500
498static DEVICE_ATTR_RW(conservation_mode); 501static DEVICE_ATTR_RW(conservation_mode);
499 502
503static ssize_t fn_lock_show(struct device *dev,
504 struct device_attribute *attr,
505 char *buf)
506{
507 struct ideapad_private *priv = dev_get_drvdata(dev);
508 unsigned long result;
509 int hals;
510 int fail = read_method_int(priv->adev->handle, "HALS", &hals);
511
512 if (fail)
513 return sprintf(buf, "-1\n");
514
515 result = hals;
516 return sprintf(buf, "%u\n", test_bit(HA_FNLOCK_BIT, &result));
517}
518
519static ssize_t fn_lock_store(struct device *dev,
520 struct device_attribute *attr,
521 const char *buf, size_t count)
522{
523 struct ideapad_private *priv = dev_get_drvdata(dev);
524 bool state;
525 int ret;
526
527 ret = kstrtobool(buf, &state);
528 if (ret)
529 return ret;
530
531 ret = method_int1(priv->adev->handle, "SALS", state ?
532 HACMD_FNLOCK_ON :
533 HACMD_FNLOCK_OFF);
534 if (ret < 0)
535 return -EIO;
536 return count;
537}
538
539static DEVICE_ATTR_RW(fn_lock);
540
541
500static struct attribute *ideapad_attributes[] = { 542static struct attribute *ideapad_attributes[] = {
501 &dev_attr_camera_power.attr, 543 &dev_attr_camera_power.attr,
502 &dev_attr_fan_mode.attr, 544 &dev_attr_fan_mode.attr,
503 &dev_attr_touchpad.attr, 545 &dev_attr_touchpad.attr,
504 &dev_attr_conservation_mode.attr, 546 &dev_attr_conservation_mode.attr,
547 &dev_attr_fn_lock.attr,
505 NULL 548 NULL
506}; 549};
507 550
@@ -522,6 +565,9 @@ static umode_t ideapad_is_visible(struct kobject *kobj,
522 } else if (attr == &dev_attr_conservation_mode.attr) { 565 } else if (attr == &dev_attr_conservation_mode.attr) {
523 supported = acpi_has_method(priv->adev->handle, "GBMD") && 566 supported = acpi_has_method(priv->adev->handle, "GBMD") &&
524 acpi_has_method(priv->adev->handle, "SBMC"); 567 acpi_has_method(priv->adev->handle, "SBMC");
568 } else if (attr == &dev_attr_fn_lock.attr) {
569 supported = acpi_has_method(priv->adev->handle, "HALS") &&
570 acpi_has_method(priv->adev->handle, "SALS");
525 } else 571 } else
526 supported = true; 572 supported = true;
527 573
@@ -1080,6 +1126,13 @@ static const struct dmi_system_id no_hw_rfkill_list[] = {
1080 }, 1126 },
1081 }, 1127 },
1082 { 1128 {
1129 .ident = "Lenovo ideapad MIIX 720-12IKB",
1130 .matches = {
1131 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
1132 DMI_MATCH(DMI_PRODUCT_VERSION, "MIIX 720-12IKB"),
1133 },
1134 },
1135 {
1083 .ident = "Lenovo Legion Y520-15IKBN", 1136 .ident = "Lenovo Legion Y520-15IKBN",
1084 .matches = { 1137 .matches = {
1085 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), 1138 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
@@ -1163,6 +1216,13 @@ static const struct dmi_system_id no_hw_rfkill_list[] = {
1163 DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo YOGA 920-13IKB"), 1216 DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo YOGA 920-13IKB"),
1164 }, 1217 },
1165 }, 1218 },
1219 {
1220 .ident = "Lenovo Zhaoyang E42-80",
1221 .matches = {
1222 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
1223 DMI_MATCH(DMI_PRODUCT_VERSION, "ZHAOYANG E42-80"),
1224 },
1225 },
1166 {} 1226 {}
1167}; 1227};
1168 1228
diff --git a/drivers/platform/x86/intel_scu_ipc.c b/drivers/platform/x86/intel_scu_ipc.c
index 2c85f75e32b0..75c8fef7a482 100644
--- a/drivers/platform/x86/intel_scu_ipc.c
+++ b/drivers/platform/x86/intel_scu_ipc.c
@@ -584,11 +584,11 @@ int intel_scu_ipc_i2c_cntrl(u32 addr, u32 *data)
584 if (cmd == IPC_I2C_READ) { 584 if (cmd == IPC_I2C_READ) {
585 writel(addr, scu->i2c_base + IPC_I2C_CNTRL_ADDR); 585 writel(addr, scu->i2c_base + IPC_I2C_CNTRL_ADDR);
586 /* Write not getting updated without delay */ 586 /* Write not getting updated without delay */
587 mdelay(1); 587 usleep_range(1000, 2000);
588 *data = readl(scu->i2c_base + I2C_DATA_ADDR); 588 *data = readl(scu->i2c_base + I2C_DATA_ADDR);
589 } else if (cmd == IPC_I2C_WRITE) { 589 } else if (cmd == IPC_I2C_WRITE) {
590 writel(*data, scu->i2c_base + I2C_DATA_ADDR); 590 writel(*data, scu->i2c_base + I2C_DATA_ADDR);
591 mdelay(1); 591 usleep_range(1000, 2000);
592 writel(addr, scu->i2c_base + IPC_I2C_CNTRL_ADDR); 592 writel(addr, scu->i2c_base + IPC_I2C_CNTRL_ADDR);
593 } else { 593 } else {
594 dev_err(scu->dev, 594 dev_err(scu->dev,
diff --git a/drivers/platform/x86/mlx-platform.c b/drivers/platform/x86/mlx-platform.c
index 7a0bd24c1ae2..a0fd9aa6d932 100644
--- a/drivers/platform/x86/mlx-platform.c
+++ b/drivers/platform/x86/mlx-platform.c
@@ -47,6 +47,11 @@
47/* LPC bus IO offsets */ 47/* LPC bus IO offsets */
48#define MLXPLAT_CPLD_LPC_I2C_BASE_ADRR 0x2000 48#define MLXPLAT_CPLD_LPC_I2C_BASE_ADRR 0x2000
49#define MLXPLAT_CPLD_LPC_REG_BASE_ADRR 0x2500 49#define MLXPLAT_CPLD_LPC_REG_BASE_ADRR 0x2500
50#define MLXPLAT_CPLD_LPC_REG_LED1_OFFSET 0x20
51#define MLXPLAT_CPLD_LPC_REG_LED2_OFFSET 0x21
52#define MLXPLAT_CPLD_LPC_REG_LED3_OFFSET 0x22
53#define MLXPLAT_CPLD_LPC_REG_LED4_OFFSET 0x23
54#define MLXPLAT_CPLD_LPC_REG_LED5_OFFSET 0x24
50#define MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET 0x3a 55#define MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET 0x3a
51#define MLXPLAT_CPLD_LPC_REG_AGGR_MASK_OFFSET 0x3b 56#define MLXPLAT_CPLD_LPC_REG_AGGR_MASK_OFFSET 0x3b
52#define MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET 0x40 57#define MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET 0x40
@@ -84,6 +89,8 @@
84#define MLXPLAT_CPLD_PWR_MASK GENMASK(1, 0) 89#define MLXPLAT_CPLD_PWR_MASK GENMASK(1, 0)
85#define MLXPLAT_CPLD_FAN_MASK GENMASK(3, 0) 90#define MLXPLAT_CPLD_FAN_MASK GENMASK(3, 0)
86#define MLXPLAT_CPLD_FAN_NG_MASK GENMASK(5, 0) 91#define MLXPLAT_CPLD_FAN_NG_MASK GENMASK(5, 0)
92#define MLXPLAT_CPLD_LED_LO_NIBBLE_MASK GENMASK(7, 4)
93#define MLXPLAT_CPLD_LED_HI_NIBBLE_MASK GENMASK(3, 0)
87 94
88/* Default I2C parent bus number */ 95/* Default I2C parent bus number */
89#define MLXPLAT_CPLD_PHYS_ADAPTER_DEF_NR 1 96#define MLXPLAT_CPLD_PHYS_ADAPTER_DEF_NR 1
@@ -114,11 +121,13 @@
114 * @pdev_i2c - i2c controller platform device 121 * @pdev_i2c - i2c controller platform device
115 * @pdev_mux - array of mux platform devices 122 * @pdev_mux - array of mux platform devices
116 * @pdev_hotplug - hotplug platform devices 123 * @pdev_hotplug - hotplug platform devices
124 * @pdev_led - led platform devices
117 */ 125 */
118struct mlxplat_priv { 126struct mlxplat_priv {
119 struct platform_device *pdev_i2c; 127 struct platform_device *pdev_i2c;
120 struct platform_device *pdev_mux[MLXPLAT_CPLD_LPC_MUX_DEVS]; 128 struct platform_device *pdev_mux[MLXPLAT_CPLD_LPC_MUX_DEVS];
121 struct platform_device *pdev_hotplug; 129 struct platform_device *pdev_hotplug;
130 struct platform_device *pdev_led;
122}; 131};
123 132
124/* Regions for LPC I2C controller and LPC base register space */ 133/* Regions for LPC I2C controller and LPC base register space */
@@ -592,9 +601,227 @@ struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_default_ng_data = {
592 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW, 601 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
593}; 602};
594 603
604/* Platform led default data */
605static struct mlxreg_core_data mlxplat_mlxcpld_default_led_data[] = {
606 {
607 .label = "status:green",
608 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
609 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
610 },
611 {
612 .label = "status:red",
613 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
614 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
615 },
616 {
617 .label = "psu:green",
618 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
619 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
620 },
621 {
622 .label = "psu:red",
623 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
624 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
625 },
626 {
627 .label = "fan1:green",
628 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
629 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
630 },
631 {
632 .label = "fan1:red",
633 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
634 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
635 },
636 {
637 .label = "fan2:green",
638 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
639 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
640 },
641 {
642 .label = "fan2:red",
643 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
644 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
645 },
646 {
647 .label = "fan3:green",
648 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
649 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
650 },
651 {
652 .label = "fan3:red",
653 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
654 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
655 },
656 {
657 .label = "fan4:green",
658 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
659 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
660 },
661 {
662 .label = "fan4:red",
663 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
664 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
665 },
666};
667
668static struct mlxreg_core_platform_data mlxplat_default_led_data = {
669 .data = mlxplat_mlxcpld_default_led_data,
670 .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_led_data),
671};
672
673/* Platform led MSN21xx system family data */
674static struct mlxreg_core_data mlxplat_mlxcpld_msn21xx_led_data[] = {
675 {
676 .label = "status:green",
677 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
678 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
679 },
680 {
681 .label = "status:red",
682 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
683 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
684 },
685 {
686 .label = "fan:green",
687 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
688 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
689 },
690 {
691 .label = "fan:red",
692 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
693 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
694 },
695 {
696 .label = "psu1:green",
697 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
698 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
699 },
700 {
701 .label = "psu1:red",
702 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
703 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
704 },
705 {
706 .label = "psu2:green",
707 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
708 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
709 },
710 {
711 .label = "psu2:red",
712 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
713 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
714 },
715 {
716 .label = "uid:blue",
717 .reg = MLXPLAT_CPLD_LPC_REG_LED5_OFFSET,
718 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
719 },
720};
721
722static struct mlxreg_core_platform_data mlxplat_msn21xx_led_data = {
723 .data = mlxplat_mlxcpld_msn21xx_led_data,
724 .counter = ARRAY_SIZE(mlxplat_mlxcpld_msn21xx_led_data),
725};
726
727/* Platform led for default data for 200GbE systems */
728static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_led_data[] = {
729 {
730 .label = "status:green",
731 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
732 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
733 },
734 {
735 .label = "status:orange",
736 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
737 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
738 },
739 {
740 .label = "psu:green",
741 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
742 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
743 },
744 {
745 .label = "psu:orange",
746 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
747 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
748 },
749 {
750 .label = "fan1:green",
751 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
752 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
753 },
754 {
755 .label = "fan1:orange",
756 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
757 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
758 },
759 {
760 .label = "fan2:green",
761 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
762 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
763 },
764 {
765 .label = "fan2:orange",
766 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
767 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
768 },
769 {
770 .label = "fan3:green",
771 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
772 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
773 },
774 {
775 .label = "fan3:orange",
776 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
777 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
778 },
779 {
780 .label = "fan4:green",
781 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
782 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
783 },
784 {
785 .label = "fan4:orange",
786 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
787 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
788 },
789 {
790 .label = "fan5:green",
791 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
792 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
793 },
794 {
795 .label = "fan5:orange",
796 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
797 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
798 },
799 {
800 .label = "fan6:green",
801 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
802 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
803 },
804 {
805 .label = "fan6:orange",
806 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
807 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
808 },
809};
810
811static struct mlxreg_core_platform_data mlxplat_default_ng_led_data = {
812 .data = mlxplat_mlxcpld_default_ng_led_data,
813 .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_led_data),
814};
815
816
595static bool mlxplat_mlxcpld_writeable_reg(struct device *dev, unsigned int reg) 817static bool mlxplat_mlxcpld_writeable_reg(struct device *dev, unsigned int reg)
596{ 818{
597 switch (reg) { 819 switch (reg) {
820 case MLXPLAT_CPLD_LPC_REG_LED1_OFFSET:
821 case MLXPLAT_CPLD_LPC_REG_LED2_OFFSET:
822 case MLXPLAT_CPLD_LPC_REG_LED3_OFFSET:
823 case MLXPLAT_CPLD_LPC_REG_LED4_OFFSET:
824 case MLXPLAT_CPLD_LPC_REG_LED5_OFFSET:
598 case MLXPLAT_CPLD_LPC_REG_AGGR_MASK_OFFSET: 825 case MLXPLAT_CPLD_LPC_REG_AGGR_MASK_OFFSET:
599 case MLXPLAT_CPLD_LPC_REG_AGGRLO_MASK_OFFSET: 826 case MLXPLAT_CPLD_LPC_REG_AGGRLO_MASK_OFFSET:
600 case MLXPLAT_CPLD_LPC_REG_PSU_EVENT_OFFSET: 827 case MLXPLAT_CPLD_LPC_REG_PSU_EVENT_OFFSET:
@@ -611,6 +838,11 @@ static bool mlxplat_mlxcpld_writeable_reg(struct device *dev, unsigned int reg)
611static bool mlxplat_mlxcpld_readable_reg(struct device *dev, unsigned int reg) 838static bool mlxplat_mlxcpld_readable_reg(struct device *dev, unsigned int reg)
612{ 839{
613 switch (reg) { 840 switch (reg) {
841 case MLXPLAT_CPLD_LPC_REG_LED1_OFFSET:
842 case MLXPLAT_CPLD_LPC_REG_LED2_OFFSET:
843 case MLXPLAT_CPLD_LPC_REG_LED3_OFFSET:
844 case MLXPLAT_CPLD_LPC_REG_LED4_OFFSET:
845 case MLXPLAT_CPLD_LPC_REG_LED5_OFFSET:
614 case MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET: 846 case MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET:
615 case MLXPLAT_CPLD_LPC_REG_AGGR_MASK_OFFSET: 847 case MLXPLAT_CPLD_LPC_REG_AGGR_MASK_OFFSET:
616 case MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET: 848 case MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET:
@@ -632,6 +864,11 @@ static bool mlxplat_mlxcpld_readable_reg(struct device *dev, unsigned int reg)
632static bool mlxplat_mlxcpld_volatile_reg(struct device *dev, unsigned int reg) 864static bool mlxplat_mlxcpld_volatile_reg(struct device *dev, unsigned int reg)
633{ 865{
634 switch (reg) { 866 switch (reg) {
867 case MLXPLAT_CPLD_LPC_REG_LED1_OFFSET:
868 case MLXPLAT_CPLD_LPC_REG_LED2_OFFSET:
869 case MLXPLAT_CPLD_LPC_REG_LED3_OFFSET:
870 case MLXPLAT_CPLD_LPC_REG_LED4_OFFSET:
871 case MLXPLAT_CPLD_LPC_REG_LED5_OFFSET:
635 case MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET: 872 case MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET:
636 case MLXPLAT_CPLD_LPC_REG_AGGR_MASK_OFFSET: 873 case MLXPLAT_CPLD_LPC_REG_AGGR_MASK_OFFSET:
637 case MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET: 874 case MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET:
@@ -692,6 +929,7 @@ static struct resource mlxplat_mlxcpld_resources[] = {
692 929
693static struct platform_device *mlxplat_dev; 930static struct platform_device *mlxplat_dev;
694static struct mlxreg_core_hotplug_platform_data *mlxplat_hotplug; 931static struct mlxreg_core_hotplug_platform_data *mlxplat_hotplug;
932static struct mlxreg_core_platform_data *mlxplat_led;
695 933
696static int __init mlxplat_dmi_default_matched(const struct dmi_system_id *dmi) 934static int __init mlxplat_dmi_default_matched(const struct dmi_system_id *dmi)
697{ 935{
@@ -705,6 +943,7 @@ static int __init mlxplat_dmi_default_matched(const struct dmi_system_id *dmi)
705 mlxplat_hotplug = &mlxplat_mlxcpld_default_data; 943 mlxplat_hotplug = &mlxplat_mlxcpld_default_data;
706 mlxplat_hotplug->deferred_nr = 944 mlxplat_hotplug->deferred_nr =
707 mlxplat_default_channels[i - 1][MLXPLAT_CPLD_GRP_CHNL_NUM - 1]; 945 mlxplat_default_channels[i - 1][MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
946 mlxplat_led = &mlxplat_default_led_data;
708 947
709 return 1; 948 return 1;
710}; 949};
@@ -721,6 +960,7 @@ static int __init mlxplat_dmi_msn21xx_matched(const struct dmi_system_id *dmi)
721 mlxplat_hotplug = &mlxplat_mlxcpld_msn21xx_data; 960 mlxplat_hotplug = &mlxplat_mlxcpld_msn21xx_data;
722 mlxplat_hotplug->deferred_nr = 961 mlxplat_hotplug->deferred_nr =
723 mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1]; 962 mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
963 mlxplat_led = &mlxplat_msn21xx_led_data;
724 964
725 return 1; 965 return 1;
726}; 966};
@@ -737,6 +977,7 @@ static int __init mlxplat_dmi_msn274x_matched(const struct dmi_system_id *dmi)
737 mlxplat_hotplug = &mlxplat_mlxcpld_msn274x_data; 977 mlxplat_hotplug = &mlxplat_mlxcpld_msn274x_data;
738 mlxplat_hotplug->deferred_nr = 978 mlxplat_hotplug->deferred_nr =
739 mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1]; 979 mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
980 mlxplat_led = &mlxplat_default_led_data;
740 981
741 return 1; 982 return 1;
742}; 983};
@@ -753,6 +994,7 @@ static int __init mlxplat_dmi_msn201x_matched(const struct dmi_system_id *dmi)
753 mlxplat_hotplug = &mlxplat_mlxcpld_msn201x_data; 994 mlxplat_hotplug = &mlxplat_mlxcpld_msn201x_data;
754 mlxplat_hotplug->deferred_nr = 995 mlxplat_hotplug->deferred_nr =
755 mlxplat_default_channels[i - 1][MLXPLAT_CPLD_GRP_CHNL_NUM - 1]; 996 mlxplat_default_channels[i - 1][MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
997 mlxplat_led = &mlxplat_default_ng_led_data;
756 998
757 return 1; 999 return 1;
758}; 1000};
@@ -769,6 +1011,7 @@ static int __init mlxplat_dmi_qmb7xx_matched(const struct dmi_system_id *dmi)
769 mlxplat_hotplug = &mlxplat_mlxcpld_default_ng_data; 1011 mlxplat_hotplug = &mlxplat_mlxcpld_default_ng_data;
770 mlxplat_hotplug->deferred_nr = 1012 mlxplat_hotplug->deferred_nr =
771 mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1]; 1013 mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
1014 mlxplat_led = &mlxplat_msn21xx_led_data;
772 1015
773 return 1; 1016 return 1;
774}; 1017};
@@ -844,6 +1087,36 @@ static const struct dmi_system_id mlxplat_dmi_table[] __initconst = {
844 DMI_MATCH(DMI_PRODUCT_NAME, "SN34"), 1087 DMI_MATCH(DMI_PRODUCT_NAME, "SN34"),
845 }, 1088 },
846 }, 1089 },
1090 {
1091 .callback = mlxplat_dmi_default_matched,
1092 .matches = {
1093 DMI_MATCH(DMI_BOARD_NAME, "VMOD0001"),
1094 },
1095 },
1096 {
1097 .callback = mlxplat_dmi_msn21xx_matched,
1098 .matches = {
1099 DMI_MATCH(DMI_BOARD_NAME, "VMOD0002"),
1100 },
1101 },
1102 {
1103 .callback = mlxplat_dmi_msn274x_matched,
1104 .matches = {
1105 DMI_MATCH(DMI_BOARD_NAME, "VMOD0003"),
1106 },
1107 },
1108 {
1109 .callback = mlxplat_dmi_msn201x_matched,
1110 .matches = {
1111 DMI_MATCH(DMI_BOARD_NAME, "VMOD0004"),
1112 },
1113 },
1114 {
1115 .callback = mlxplat_dmi_qmb7xx_matched,
1116 .matches = {
1117 DMI_MATCH(DMI_BOARD_NAME, "VMOD0005"),
1118 },
1119 },
847 { } 1120 { }
848}; 1121};
849 1122
@@ -960,14 +1233,27 @@ static int __init mlxplat_init(void)
960 goto fail_platform_mux_register; 1233 goto fail_platform_mux_register;
961 } 1234 }
962 1235
1236 /* Add LED driver. */
1237 mlxplat_led->regmap = mlxplat_hotplug->regmap;
1238 priv->pdev_led = platform_device_register_resndata(
1239 &mlxplat_dev->dev, "leds-mlxreg",
1240 PLATFORM_DEVID_NONE, NULL, 0,
1241 mlxplat_led, sizeof(*mlxplat_led));
1242 if (IS_ERR(priv->pdev_led)) {
1243 err = PTR_ERR(priv->pdev_led);
1244 goto fail_platform_hotplug_register;
1245 }
1246
963 /* Sync registers with hardware. */ 1247 /* Sync registers with hardware. */
964 regcache_mark_dirty(mlxplat_hotplug->regmap); 1248 regcache_mark_dirty(mlxplat_hotplug->regmap);
965 err = regcache_sync(mlxplat_hotplug->regmap); 1249 err = regcache_sync(mlxplat_hotplug->regmap);
966 if (err) 1250 if (err)
967 goto fail_platform_hotplug_register; 1251 goto fail_platform_led_register;
968 1252
969 return 0; 1253 return 0;
970 1254
1255fail_platform_led_register:
1256 platform_device_unregister(priv->pdev_led);
971fail_platform_hotplug_register: 1257fail_platform_hotplug_register:
972 platform_device_unregister(priv->pdev_hotplug); 1258 platform_device_unregister(priv->pdev_hotplug);
973fail_platform_mux_register: 1259fail_platform_mux_register:
@@ -986,6 +1272,7 @@ static void __exit mlxplat_exit(void)
986 struct mlxplat_priv *priv = platform_get_drvdata(mlxplat_dev); 1272 struct mlxplat_priv *priv = platform_get_drvdata(mlxplat_dev);
987 int i; 1273 int i;
988 1274
1275 platform_device_unregister(priv->pdev_led);
989 platform_device_unregister(priv->pdev_hotplug); 1276 platform_device_unregister(priv->pdev_hotplug);
990 1277
991 for (i = ARRAY_SIZE(mlxplat_mux_data) - 1; i >= 0 ; i--) 1278 for (i = ARRAY_SIZE(mlxplat_mux_data) - 1; i >= 0 ; i--)
diff --git a/drivers/platform/x86/samsung-laptop.c b/drivers/platform/x86/samsung-laptop.c
index 03305e0b89ff..7b160ee98115 100644
--- a/drivers/platform/x86/samsung-laptop.c
+++ b/drivers/platform/x86/samsung-laptop.c
@@ -1216,8 +1216,7 @@ static umode_t samsung_sysfs_is_visible(struct kobject *kobj,
1216 struct attribute *attr, int idx) 1216 struct attribute *attr, int idx)
1217{ 1217{
1218 struct device *dev = container_of(kobj, struct device, kobj); 1218 struct device *dev = container_of(kobj, struct device, kobj);
1219 struct platform_device *pdev = to_platform_device(dev); 1219 struct samsung_laptop *samsung = dev_get_drvdata(dev);
1220 struct samsung_laptop *samsung = platform_get_drvdata(pdev);
1221 bool ok = true; 1220 bool ok = true;
1222 1221
1223 if (attr == &dev_attr_performance_level.attr) 1222 if (attr == &dev_attr_performance_level.attr)
diff --git a/drivers/platform/x86/silead_dmi.c b/drivers/platform/x86/silead_dmi.c
index 452aacabaa8e..853a7ce4601c 100644
--- a/drivers/platform/x86/silead_dmi.c
+++ b/drivers/platform/x86/silead_dmi.c
@@ -53,6 +53,20 @@ static const struct silead_ts_dmi_data jumper_ezpad_mini3_data = {
53 .properties = jumper_ezpad_mini3_props, 53 .properties = jumper_ezpad_mini3_props,
54}; 54};
55 55
56static const struct property_entry jumper_ezpad_6_pro_props[] = {
57 PROPERTY_ENTRY_U32("touchscreen-size-x", 1980),
58 PROPERTY_ENTRY_U32("touchscreen-size-y", 1500),
59 PROPERTY_ENTRY_STRING("firmware-name", "gsl3692-jumper-ezpad-6-pro.fw"),
60 PROPERTY_ENTRY_U32("silead,max-fingers", 10),
61 PROPERTY_ENTRY_BOOL("silead,home-button"),
62 { }
63};
64
65static const struct silead_ts_dmi_data jumper_ezpad_6_pro_data = {
66 .acpi_name = "MSSL1680:00",
67 .properties = jumper_ezpad_6_pro_props,
68};
69
56static const struct property_entry dexp_ursus_7w_props[] = { 70static const struct property_entry dexp_ursus_7w_props[] = {
57 PROPERTY_ENTRY_U32("touchscreen-size-x", 890), 71 PROPERTY_ENTRY_U32("touchscreen-size-x", 890),
58 PROPERTY_ENTRY_U32("touchscreen-size-y", 630), 72 PROPERTY_ENTRY_U32("touchscreen-size-y", 630),
@@ -127,7 +141,25 @@ static const struct silead_ts_dmi_data pipo_w2s_data = {
127 .properties = pipo_w2s_props, 141 .properties = pipo_w2s_props,
128}; 142};
129 143
130static const struct property_entry pov_mobii_wintab_p800w_props[] = { 144static const struct property_entry pov_mobii_wintab_p800w_v20_props[] = {
145 PROPERTY_ENTRY_U32("touchscreen-min-x", 32),
146 PROPERTY_ENTRY_U32("touchscreen-min-y", 16),
147 PROPERTY_ENTRY_U32("touchscreen-size-x", 1692),
148 PROPERTY_ENTRY_U32("touchscreen-size-y", 1146),
149 PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"),
150 PROPERTY_ENTRY_STRING("firmware-name",
151 "gsl3680-pov-mobii-wintab-p800w-v20.fw"),
152 PROPERTY_ENTRY_U32("silead,max-fingers", 10),
153 PROPERTY_ENTRY_BOOL("silead,home-button"),
154 { }
155};
156
157static const struct silead_ts_dmi_data pov_mobii_wintab_p800w_v20_data = {
158 .acpi_name = "MSSL1680:00",
159 .properties = pov_mobii_wintab_p800w_v20_props,
160};
161
162static const struct property_entry pov_mobii_wintab_p800w_v21_props[] = {
131 PROPERTY_ENTRY_U32("touchscreen-size-x", 1800), 163 PROPERTY_ENTRY_U32("touchscreen-size-x", 1800),
132 PROPERTY_ENTRY_U32("touchscreen-size-y", 1150), 164 PROPERTY_ENTRY_U32("touchscreen-size-y", 1150),
133 PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"), 165 PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"),
@@ -137,9 +169,9 @@ static const struct property_entry pov_mobii_wintab_p800w_props[] = {
137 { } 169 { }
138}; 170};
139 171
140static const struct silead_ts_dmi_data pov_mobii_wintab_p800w_data = { 172static const struct silead_ts_dmi_data pov_mobii_wintab_p800w_v21_data = {
141 .acpi_name = "MSSL1680:00", 173 .acpi_name = "MSSL1680:00",
142 .properties = pov_mobii_wintab_p800w_props, 174 .properties = pov_mobii_wintab_p800w_v21_props,
143}; 175};
144 176
145static const struct property_entry itworks_tw891_props[] = { 177static const struct property_entry itworks_tw891_props[] = {
@@ -277,6 +309,23 @@ static const struct silead_ts_dmi_data teclast_x3_plus_data = {
277 .properties = teclast_x3_plus_props, 309 .properties = teclast_x3_plus_props,
278}; 310};
279 311
312static const struct property_entry onda_v891w_v1_props[] = {
313 PROPERTY_ENTRY_U32("touchscreen-min-x", 46),
314 PROPERTY_ENTRY_U32("touchscreen-min-y", 8),
315 PROPERTY_ENTRY_U32("touchscreen-size-x", 1676),
316 PROPERTY_ENTRY_U32("touchscreen-size-y", 1130),
317 PROPERTY_ENTRY_STRING("firmware-name",
318 "gsl3680-onda-v891w-v1.fw"),
319 PROPERTY_ENTRY_U32("silead,max-fingers", 10),
320 PROPERTY_ENTRY_BOOL("silead,home-button"),
321 { }
322};
323
324static const struct silead_ts_dmi_data onda_v891w_v1_data = {
325 .acpi_name = "MSSL1680:00",
326 .properties = onda_v891w_v1_props,
327};
328
280static const struct dmi_system_id silead_ts_dmi_table[] = { 329static const struct dmi_system_id silead_ts_dmi_table[] = {
281 { 330 {
282 /* CUBE iwork8 Air */ 331 /* CUBE iwork8 Air */
@@ -297,6 +346,17 @@ static const struct dmi_system_id silead_ts_dmi_table[] = {
297 }, 346 },
298 }, 347 },
299 { 348 {
349 /* Jumper EZpad 6 Pro */
350 .driver_data = (void *)&jumper_ezpad_6_pro_data,
351 .matches = {
352 DMI_MATCH(DMI_SYS_VENDOR, "Jumper"),
353 DMI_MATCH(DMI_PRODUCT_NAME, "EZpad"),
354 DMI_MATCH(DMI_BIOS_VERSION, "5.12"),
355 /* Above matches are too generic, add bios-date match */
356 DMI_MATCH(DMI_BIOS_DATE, "08/18/2017"),
357 },
358 },
359 {
300 /* DEXP Ursus 7W */ 360 /* DEXP Ursus 7W */
301 .driver_data = (void *)&dexp_ursus_7w_data, 361 .driver_data = (void *)&dexp_ursus_7w_data,
302 .matches = { 362 .matches = {
@@ -361,8 +421,19 @@ static const struct dmi_system_id silead_ts_dmi_table[] = {
361 }, 421 },
362 }, 422 },
363 { 423 {
364 /* Point of View mobii wintab p800w */ 424 /* Point of View mobii wintab p800w (v2.0) */
365 .driver_data = (void *)&pov_mobii_wintab_p800w_data, 425 .driver_data = (void *)&pov_mobii_wintab_p800w_v20_data,
426 .matches = {
427 DMI_MATCH(DMI_BOARD_VENDOR, "AMI Corporation"),
428 DMI_MATCH(DMI_BOARD_NAME, "Aptio CRB"),
429 DMI_MATCH(DMI_BIOS_VERSION, "3BAIR1014"),
430 /* Above matches are too generic, add bios-date match */
431 DMI_MATCH(DMI_BIOS_DATE, "10/24/2014"),
432 },
433 },
434 {
435 /* Point of View mobii wintab p800w (v2.1) */
436 .driver_data = (void *)&pov_mobii_wintab_p800w_v21_data,
366 .matches = { 437 .matches = {
367 DMI_MATCH(DMI_BOARD_VENDOR, "AMI Corporation"), 438 DMI_MATCH(DMI_BOARD_VENDOR, "AMI Corporation"),
368 DMI_MATCH(DMI_BOARD_NAME, "Aptio CRB"), 439 DMI_MATCH(DMI_BOARD_NAME, "Aptio CRB"),
@@ -413,6 +484,15 @@ static const struct dmi_system_id silead_ts_dmi_table[] = {
413 }, 484 },
414 }, 485 },
415 { 486 {
487 /* Chuwi Hi8 (H1D_S806_206) */
488 .driver_data = (void *)&chuwi_hi8_data,
489 .matches = {
490 DMI_MATCH(DMI_SYS_VENDOR, "Insyde"),
491 DMI_MATCH(DMI_PRODUCT_NAME, "BayTrail"),
492 DMI_MATCH(DMI_BIOS_VERSION, "H1D_S806_206"),
493 },
494 },
495 {
416 /* Chuwi Vi8 (CWI506) */ 496 /* Chuwi Vi8 (CWI506) */
417 .driver_data = (void *)&chuwi_vi8_data, 497 .driver_data = (void *)&chuwi_vi8_data,
418 .matches = { 498 .matches = {
@@ -463,6 +543,17 @@ static const struct dmi_system_id silead_ts_dmi_table[] = {
463 DMI_MATCH(DMI_PRODUCT_NAME, "Y8W81"), 543 DMI_MATCH(DMI_PRODUCT_NAME, "Y8W81"),
464 }, 544 },
465 }, 545 },
546 {
547 /* ONDA V891w revision P891WBEBV1B00 aka v1 */
548 .driver_data = (void *)&onda_v891w_v1_data,
549 .matches = {
550 DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "ONDA"),
551 DMI_EXACT_MATCH(DMI_BOARD_NAME, "ONDA Tablet"),
552 DMI_EXACT_MATCH(DMI_BOARD_VERSION, "V001"),
553 /* Exact match, different versions need different fw */
554 DMI_EXACT_MATCH(DMI_BIOS_VERSION, "ONDA.W89EBBN08"),
555 },
556 },
466 { }, 557 { },
467}; 558};
468 559
diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c
index ab2d28867c52..cae9b0595692 100644
--- a/drivers/platform/x86/thinkpad_acpi.c
+++ b/drivers/platform/x86/thinkpad_acpi.c
@@ -212,7 +212,12 @@ enum tpacpi_hkey_event_t {
212 TP_HKEY_EV_ALARM_BAT_XHOT = 0x6012, /* battery critically hot */ 212 TP_HKEY_EV_ALARM_BAT_XHOT = 0x6012, /* battery critically hot */
213 TP_HKEY_EV_ALARM_SENSOR_HOT = 0x6021, /* sensor too hot */ 213 TP_HKEY_EV_ALARM_SENSOR_HOT = 0x6021, /* sensor too hot */
214 TP_HKEY_EV_ALARM_SENSOR_XHOT = 0x6022, /* sensor critically hot */ 214 TP_HKEY_EV_ALARM_SENSOR_XHOT = 0x6022, /* sensor critically hot */
215 TP_HKEY_EV_THM_TABLE_CHANGED = 0x6030, /* thermal table changed */ 215 TP_HKEY_EV_THM_TABLE_CHANGED = 0x6030, /* windows; thermal table changed */
216 TP_HKEY_EV_THM_CSM_COMPLETED = 0x6032, /* windows; thermal control set
217 * command completed. Related to
218 * AML DYTC */
219 TP_HKEY_EV_THM_TRANSFM_CHANGED = 0x60F0, /* windows; thermal transformation
220 * changed. Related to AML GMTS */
216 221
217 /* AC-related events */ 222 /* AC-related events */
218 TP_HKEY_EV_AC_CHANGED = 0x6040, /* AC status changed */ 223 TP_HKEY_EV_AC_CHANGED = 0x6040, /* AC status changed */
@@ -4034,15 +4039,23 @@ static bool hotkey_notify_6xxx(const u32 hkey,
4034 bool *send_acpi_ev, 4039 bool *send_acpi_ev,
4035 bool *ignore_acpi_ev) 4040 bool *ignore_acpi_ev)
4036{ 4041{
4037 bool known = true;
4038
4039 /* 0x6000-0x6FFF: thermal alarms/notices and keyboard events */ 4042 /* 0x6000-0x6FFF: thermal alarms/notices and keyboard events */
4040 *send_acpi_ev = true; 4043 *send_acpi_ev = true;
4041 *ignore_acpi_ev = false; 4044 *ignore_acpi_ev = false;
4042 4045
4043 switch (hkey) { 4046 switch (hkey) {
4044 case TP_HKEY_EV_THM_TABLE_CHANGED: 4047 case TP_HKEY_EV_THM_TABLE_CHANGED:
4045 pr_info("EC reports that Thermal Table has changed\n"); 4048 pr_debug("EC reports: Thermal Table has changed\n");
4049 /* recommended action: do nothing, we don't have
4050 * Lenovo ATM information */
4051 return true;
4052 case TP_HKEY_EV_THM_CSM_COMPLETED:
4053 pr_debug("EC reports: Thermal Control Command set completed (DYTC)\n");
4054 /* recommended action: do nothing, we don't have
4055 * Lenovo ATM information */
4056 return true;
4057 case TP_HKEY_EV_THM_TRANSFM_CHANGED:
4058 pr_debug("EC reports: Thermal Transformation changed (GMTS)\n");
4046 /* recommended action: do nothing, we don't have 4059 /* recommended action: do nothing, we don't have
4047 * Lenovo ATM information */ 4060 * Lenovo ATM information */
4048 return true; 4061 return true;
@@ -4083,7 +4096,7 @@ static bool hotkey_notify_6xxx(const u32 hkey,
4083 tpacpi_input_send_tabletsw(); 4096 tpacpi_input_send_tabletsw();
4084 hotkey_tablet_mode_notify_change(); 4097 hotkey_tablet_mode_notify_change();
4085 *send_acpi_ev = false; 4098 *send_acpi_ev = false;
4086 break; 4099 return true;
4087 4100
4088 case TP_HKEY_EV_PALM_DETECTED: 4101 case TP_HKEY_EV_PALM_DETECTED:
4089 case TP_HKEY_EV_PALM_UNDETECTED: 4102 case TP_HKEY_EV_PALM_UNDETECTED:
@@ -4092,13 +4105,12 @@ static bool hotkey_notify_6xxx(const u32 hkey,
4092 return true; 4105 return true;
4093 4106
4094 default: 4107 default:
4095 pr_warn("unknown possible thermal alarm or keyboard event received\n"); 4108 /* report simply as unknown, no sensor dump */
4096 known = false; 4109 return false;
4097 } 4110 }
4098 4111
4099 thermal_dump_all_sensors(); 4112 thermal_dump_all_sensors();
4100 4113 return true;
4101 return known;
4102} 4114}
4103 4115
4104static void hotkey_notify(struct ibm_struct *ibm, u32 event) 4116static void hotkey_notify(struct ibm_struct *ibm, u32 event)
diff --git a/include/linux/platform_data/mlxreg.h b/include/linux/platform_data/mlxreg.h
index 2744cff1b297..19f5cb618c55 100644
--- a/include/linux/platform_data/mlxreg.h
+++ b/include/linux/platform_data/mlxreg.h
@@ -58,11 +58,10 @@ struct mlxreg_hotplug_device {
58 * struct mlxreg_core_data - attributes control data: 58 * struct mlxreg_core_data - attributes control data:
59 * 59 *
60 * @label: attribute label; 60 * @label: attribute label;
61 * @label: attribute register offset;
62 * @reg: attribute register; 61 * @reg: attribute register;
63 * @mask: attribute access mask; 62 * @mask: attribute access mask;
64 * @mode: access mode;
65 * @bit: attribute effective bit; 63 * @bit: attribute effective bit;
64 * @mode: access mode;
66 * @np - pointer to node platform associated with attribute; 65 * @np - pointer to node platform associated with attribute;
67 * @hpdev - hotplug device data; 66 * @hpdev - hotplug device data;
68 * @health_cntr: dynamic device health indication counter; 67 * @health_cntr: dynamic device health indication counter;
diff --git a/include/linux/string_helpers.h b/include/linux/string_helpers.h
index 4397c52ec4a4..d23c5030901a 100644
--- a/include/linux/string_helpers.h
+++ b/include/linux/string_helpers.h
@@ -5,6 +5,7 @@
5#include <linux/types.h> 5#include <linux/types.h>
6 6
7struct file; 7struct file;
8struct task_struct;
8 9
9/* Descriptions of the types of units to 10/* Descriptions of the types of units to
10 * print in */ 11 * print in */