diff options
-rw-r--r-- | Documentation/ABI/testing/sysfs-platform-ideapad-laptop | 13 | ||||
-rw-r--r-- | Documentation/laptops/thinkpad-acpi.txt | 2 | ||||
-rw-r--r-- | drivers/platform/mellanox/mlxreg-hotplug.c | 54 | ||||
-rw-r--r-- | drivers/platform/x86/acer-wmi.c | 1 | ||||
-rw-r--r-- | drivers/platform/x86/apple-gmux.c | 2 | ||||
-rw-r--r-- | drivers/platform/x86/asus-laptop.c | 3 | ||||
-rw-r--r-- | drivers/platform/x86/asus-wireless.c | 2 | ||||
-rw-r--r-- | drivers/platform/x86/asus-wmi.c | 3 | ||||
-rw-r--r-- | drivers/platform/x86/dell-laptop.c | 17 | ||||
-rw-r--r-- | drivers/platform/x86/dell-smbios-base.c | 5 | ||||
-rw-r--r-- | drivers/platform/x86/dell-wmi.c | 16 | ||||
-rw-r--r-- | drivers/platform/x86/fujitsu-laptop.c | 47 | ||||
-rw-r--r-- | drivers/platform/x86/ideapad-laptop.c | 66 | ||||
-rw-r--r-- | drivers/platform/x86/intel_scu_ipc.c | 4 | ||||
-rw-r--r-- | drivers/platform/x86/mlx-platform.c | 289 | ||||
-rw-r--r-- | drivers/platform/x86/samsung-laptop.c | 3 | ||||
-rw-r--r-- | drivers/platform/x86/silead_dmi.c | 101 | ||||
-rw-r--r-- | drivers/platform/x86/thinkpad_acpi.c | 30 | ||||
-rw-r--r-- | include/linux/platform_data/mlxreg.h | 3 | ||||
-rw-r--r-- | include/linux/string_helpers.h | 1 |
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 | |||
29 | What: /sys/bus/pci/devices/<bdf>/<device>/VPC2004:00/fn_lock | ||
30 | Date: May 2018 | ||
31 | KernelVersion: 4.18 | ||
32 | Contact: "Oleg Keri <ezhi99@gmail.com>" | ||
33 | Description: | ||
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: | |||
540 | 0x6021 ALARM: a sensor is too hot | 540 | 0x6021 ALARM: a sensor is too hot |
541 | 0x6022 ALARM: a sensor is extremely hot | 541 | 0x6022 ALARM: a sensor is extremely hot |
542 | 0x6030 System thermal table changed | 542 | 0x6030 System thermal table changed |
543 | 0x6032 Thermal Control command set completion (DYTC, Windows) | ||
543 | 0x6040 Nvidia Optimus/AC adapter related (TO BE VERIFIED) | 544 | 0x6040 Nvidia Optimus/AC adapter related (TO BE VERIFIED) |
544 | 0x60C0 X1 Yoga 2016, Tablet mode status changed | 545 | 0x60C0 X1 Yoga 2016, Tablet mode status changed |
546 | 0x60F0 Thermal Transformation changed (GMTS, Windows) | ||
545 | 547 | ||
546 | Battery nearly empty alarms are a last resort attempt to get the | 548 | Battery nearly empty alarms are a last resort attempt to get the |
547 | operating system to hibernate or shutdown cleanly (0x2313), or shutdown | 549 | operating 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 | */ |
75 | struct mlxreg_hotplug_priv_data { | 80 | struct 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 | ||
96 | static int mlxreg_hotplug_device_create(struct mlxreg_hotplug_priv_data *priv, | 101 | static 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 | ||
457 | unmask_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 | ||
498 | static int gmux_get_client_id(struct pci_dev *pdev) | 498 | static 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 @@ | |||
38 | struct quirk_entry { | 38 | struct 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 | ||
72 | static struct quirk_entry quirk_dell_xps13_9370 = { | ||
73 | .kbd_missing_ac_tag = true, | ||
74 | }; | ||
75 | |||
71 | static struct quirk_entry quirk_dell_latitude_e6410 = { | 76 | static 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 | ||
556 | static int __init dell_smbios_init(void) | 556 | static 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 | */ |
263 | static const struct key_entry dell_wmi_keymap_type_0010[] = { | 263 | static 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 | ||
458 | static const struct key_entry keymap_default[] = { | 461 | static 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) | |||
903 | static void acpi_fujitsu_laptop_notify(struct acpi_device *device, u32 event) | 907 | static 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[] = { | |||
59 | enum { | 60 | enum { |
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 | ||
64 | enum { | 67 | enum { |
@@ -139,11 +142,11 @@ static int method_gbmd(acpi_handle handle, unsigned long *ret) | |||
139 | return result; | 142 | return result; |
140 | } | 143 | } |
141 | 144 | ||
142 | static int method_sbmc(acpi_handle handle, int cmd) | 145 | static 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 | ||
498 | static DEVICE_ATTR_RW(conservation_mode); | 501 | static DEVICE_ATTR_RW(conservation_mode); |
499 | 502 | ||
503 | static 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 | |||
519 | static 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 | |||
539 | static DEVICE_ATTR_RW(fn_lock); | ||
540 | |||
541 | |||
500 | static struct attribute *ideapad_attributes[] = { | 542 | static 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 | */ |
118 | struct mlxplat_priv { | 126 | struct 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 */ | ||
605 | static 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 | |||
668 | static 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 */ | ||
674 | static 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 | |||
722 | static 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 */ | ||
728 | static 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 | |||
811 | static 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 | |||
595 | static bool mlxplat_mlxcpld_writeable_reg(struct device *dev, unsigned int reg) | 817 | static 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) | |||
611 | static bool mlxplat_mlxcpld_readable_reg(struct device *dev, unsigned int reg) | 838 | static 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) | |||
632 | static bool mlxplat_mlxcpld_volatile_reg(struct device *dev, unsigned int reg) | 864 | static 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 | ||
693 | static struct platform_device *mlxplat_dev; | 930 | static struct platform_device *mlxplat_dev; |
694 | static struct mlxreg_core_hotplug_platform_data *mlxplat_hotplug; | 931 | static struct mlxreg_core_hotplug_platform_data *mlxplat_hotplug; |
932 | static struct mlxreg_core_platform_data *mlxplat_led; | ||
695 | 933 | ||
696 | static int __init mlxplat_dmi_default_matched(const struct dmi_system_id *dmi) | 934 | static 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 | ||
1255 | fail_platform_led_register: | ||
1256 | platform_device_unregister(priv->pdev_led); | ||
971 | fail_platform_hotplug_register: | 1257 | fail_platform_hotplug_register: |
972 | platform_device_unregister(priv->pdev_hotplug); | 1258 | platform_device_unregister(priv->pdev_hotplug); |
973 | fail_platform_mux_register: | 1259 | fail_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 | ||
56 | static 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 | |||
65 | static 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 | |||
56 | static const struct property_entry dexp_ursus_7w_props[] = { | 70 | static 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 | ||
130 | static const struct property_entry pov_mobii_wintab_p800w_props[] = { | 144 | static 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 | |||
157 | static 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 | |||
162 | static 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 | ||
140 | static const struct silead_ts_dmi_data pov_mobii_wintab_p800w_data = { | 172 | static 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 | ||
145 | static const struct property_entry itworks_tw891_props[] = { | 177 | static 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 | ||
312 | static 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 | |||
324 | static const struct silead_ts_dmi_data onda_v891w_v1_data = { | ||
325 | .acpi_name = "MSSL1680:00", | ||
326 | .properties = onda_v891w_v1_props, | ||
327 | }; | ||
328 | |||
280 | static const struct dmi_system_id silead_ts_dmi_table[] = { | 329 | static 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 | ||
4104 | static void hotkey_notify(struct ibm_struct *ibm, u32 event) | 4116 | static 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 | ||
7 | struct file; | 7 | struct file; |
8 | struct 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 */ |