Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'platform-drivers-x86-v4.18-1' of git://git.infradead.org/linux-platform-drivers-x86

Pull x86 platform driver updates from Darren Hart:
"Several incremental improvements including new keycodes, new models,
new quirks, and related documentation. Adds LED platform driver
activation for Mellanox systems. Some minor optimizations and
cleanups. Includes several bug fixes, message silencing, mostly minor

Automated summary:

acer-wmi:
- add another KEY_POWER keycode

apple-gmux:
- fix gmux_get_client_id()'s return type

asus-laptop:
- Simplify getting .drvdata

asus-wireless:
- Fix format specifier

dell-laptop:
- Fix keyboard backlight timeout on XPS 13 9370

dell-smbios:
- Match on www.dell.com in OEM strings too

dell-wmi:
- Ignore new rfkill and fn-lock events
- Set correct keycode for Fn + left arrow

fujitsu-laptop:
- Simplify soft key handling

ideapad-laptop:
- Add E42-80 to no_hw_rfkill
- Add fn-lock setting
- Add MIIX 720-12IKB to no_hw_rfkill

lib/string_helpers:
- Add missed declaration of struct task_struct

intel_scu_ipc:
- Replace mdelay with usleep_range in intel_scu_ipc_i2c_cntrl

mlx-platform:
- Add LED platform driver activation

platform/mellanox:
- Add new ODM system types to mlx-platform
- mlxreg-hotplug: add extra cycle for hotplug work queue
- mlxreg-hotplug: Document fixes for hotplug private data

platform_data/mlxreg:
- Document fixes for hotplug device

silead_dmi:
- Add entry for Chuwi Hi8 tablet touchscreen
- Add touchscreen info for the Onda V891w tablet
- Add info for the PoV mobii TAB-P800W (v2.0)
- Add touchscreen info for the Jumper EZpad 6 Pro

thinkpad_acpi:
- silence false-positive-prone pr_warn
- do not report thermal sensor state for tablet mode switch
- silence HKEY 0x6032, 0x60f0, 0x6030"

* tag 'platform-drivers-x86-v4.18-1' of git://git.infradead.org/linux-platform-drivers-x86: (30 commits)
platform/x86: silead_dmi: Add entry for Chuwi Hi8 tablet touchscreen
platform/x86: dell-laptop: Fix keyboard backlight timeout on XPS 13 9370
platform/x86: dell-wmi: Ignore new rfkill and fn-lock events
platform/x86: mlx-platform: Add LED platform driver activation
platform/mellanox: Add new ODM system types to mlx-platform
platform/mellanox: mlxreg-hotplug: add extra cycle for hotplug work queue
platform/x86: ideapad-laptop: Add E42-80 to no_hw_rfkill
platform/x86: silead_dmi: Add touchscreen info for the Onda V891w tablet
platform/x86: silead_dmi: Add info for the PoV mobii TAB-P800W (v2.0)
platform/x86: silead_dmi: Add touchscreen info for the Jumper EZpad 6 Pro
platform/x86: asus-wireless: Fix format specifier
platform/x86: asus-wmi: Fix NULL pointer dereference
platform/x86: dell-wmi: Set correct keycode for Fn + left arrow
platform/x86: acer-wmi: add another KEY_POWER keycode
platform/x86: ideapad-laptop: Add fn-lock setting
platform/x86: ideapad-laptop: Add MIIX 720-12IKB to no_hw_rfkill
lib/string_helpers: Add missed declaration of struct task_struct
platform/x86: DELL_WMI use depends on instead of select for DELL_SMBIOS
platform/mellanox: mlxreg-hotplug: Document fixes for hotplug private data
platform_data/mlxreg: Document fixes for hotplug device
...

+585 -77
+13
Documentation/ABI/testing/sysfs-platform-ideapad-laptop
··· 25 25 Control touchpad mode. 26 26 * 1 -> Switched On 27 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
+2
Documentation/laptops/thinkpad-acpi.txt
··· 540 540 0x6021 ALARM: a sensor is too hot 541 541 0x6022 ALARM: a sensor is extremely hot 542 542 0x6030 System thermal table changed 543 + 0x6032 Thermal Control command set completion (DYTC, Windows) 543 544 0x6040 Nvidia Optimus/AC adapter related (TO BE VERIFIED) 544 545 0x60C0 X1 Yoga 2016, Tablet mode status changed 546 + 0x60F0 Thermal Transformation changed (GMTS, Windows) 545 547 546 548 Battery nearly empty alarms are a last resort attempt to get the 547 549 operating system to hibernate or shutdown cleanly (0x2313), or shutdown
+35 -19
drivers/platform/mellanox/mlxreg-hotplug.c
··· 55 55 #define MLXREG_HOTPLUG_RST_CNTR 3 56 56 57 57 #define MLXREG_HOTPLUG_ATTRS_MAX 24 58 + #define MLXREG_HOTPLUG_NOT_ASSERT 3 58 59 59 60 /** 60 61 * struct mlxreg_hotplug_priv_data - platform private data: 61 62 * @irq: platform device interrupt number; 63 + * @dev: basic device; 62 64 * @pdev: platform device; 63 65 * @plat: platform data; 64 - * @dwork: delayed work template; 66 + * @regmap: register map handle; 67 + * @dwork_irq: delayed work template; 65 68 * @lock: spin lock; 66 69 * @hwmon: hwmon device; 67 70 * @mlxreg_hotplug_attr: sysfs attributes array; ··· 74 71 * @cell: location of top aggregation interrupt register; 75 72 * @mask: top aggregation interrupt common mask; 76 73 * @aggr_cache: last value of aggregation register status; 74 + * @after_probe: flag indication probing completion; 75 + * @not_asserted: number of entries in workqueue with no signal assertion; 77 76 */ 78 77 struct mlxreg_hotplug_priv_data { 79 78 int irq; ··· 84 79 struct mlxreg_hotplug_platform_data *plat; 85 80 struct regmap *regmap; 86 81 struct delayed_work dwork_irq; 87 - struct delayed_work dwork; 88 82 spinlock_t lock; /* sync with interrupt */ 89 83 struct device *hwmon; 90 84 struct attribute *mlxreg_hotplug_attr[MLXREG_HOTPLUG_ATTRS_MAX + 1]; ··· 95 91 u32 mask; 96 92 u32 aggr_cache; 97 93 bool after_probe; 94 + u8 not_asserted; 98 95 }; 99 96 100 97 static int mlxreg_hotplug_device_create(struct mlxreg_hotplug_priv_data *priv, ··· 414 409 aggr_asserted = priv->aggr_cache ^ regval; 415 410 priv->aggr_cache = regval; 416 411 412 + /* 413 + * Handler is invoked, but no assertion is detected at top aggregation 414 + * status level. Set aggr_asserted to mask value to allow handler extra 415 + * run over all relevant signals to recover any missed signal. 416 + */ 417 + if (priv->not_asserted == MLXREG_HOTPLUG_NOT_ASSERT) { 418 + priv->not_asserted = 0; 419 + aggr_asserted = pdata->mask; 420 + } 421 + if (!aggr_asserted) 422 + goto unmask_event; 423 + 417 424 /* Handle topology and health configuration changes. */ 418 425 for (i = 0; i < pdata->counter; i++, item++) { 419 426 if (aggr_asserted & item->aggr_mask) { ··· 436 419 } 437 420 } 438 421 439 - if (aggr_asserted) { 440 - spin_lock_irqsave(&priv->lock, flags); 422 + spin_lock_irqsave(&priv->lock, flags); 441 423 442 - /* 443 - * It is possible, that some signals have been inserted, while 444 - * interrupt has been masked by mlxreg_hotplug_work_handler. 445 - * In this case such signals will be missed. In order to handle 446 - * these signals delayed work is canceled and work task 447 - * re-scheduled for immediate execution. It allows to handle 448 - * missed signals, if any. In other case work handler just 449 - * validates that no new signals have been received during 450 - * masking. 451 - */ 452 - cancel_delayed_work(&priv->dwork_irq); 453 - schedule_delayed_work(&priv->dwork_irq, 0); 424 + /* 425 + * It is possible, that some signals have been inserted, while 426 + * interrupt has been masked by mlxreg_hotplug_work_handler. In this 427 + * case such signals will be missed. In order to handle these signals 428 + * delayed work is canceled and work task re-scheduled for immediate 429 + * execution. It allows to handle missed signals, if any. In other case 430 + * work handler just validates that no new signals have been received 431 + * during masking. 432 + */ 433 + cancel_delayed_work(&priv->dwork_irq); 434 + schedule_delayed_work(&priv->dwork_irq, 0); 454 435 455 - spin_unlock_irqrestore(&priv->lock, flags); 436 + spin_unlock_irqrestore(&priv->lock, flags); 456 437 457 - return; 458 - } 438 + return; 459 439 440 + unmask_event: 441 + priv->not_asserted++; 460 442 /* Unmask aggregation event (no need acknowledge). */ 461 443 ret = regmap_write(priv->regmap, pdata->cell + 462 444 MLXREG_HOTPLUG_AGGR_MASK_OFF, pdata->mask);
+1
drivers/platform/x86/acer-wmi.c
··· 129 129 {KE_IGNORE, 0x83, {KEY_TOUCHPAD_TOGGLE} }, 130 130 {KE_KEY, 0x85, {KEY_TOUCHPAD_TOGGLE} }, 131 131 {KE_KEY, 0x86, {KEY_WLAN} }, 132 + {KE_KEY, 0x87, {KEY_POWER} }, 132 133 {KE_END, 0} 133 134 }; 134 135
+1 -1
drivers/platform/x86/apple-gmux.c
··· 495 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 501 * Early Macbook Pros with switchable graphics use nvidia
+1 -2
drivers/platform/x86/asus-laptop.c
··· 1593 1593 int idx) 1594 1594 { 1595 1595 struct device *dev = container_of(kobj, struct device, kobj); 1596 - struct platform_device *pdev = to_platform_device(dev); 1597 - struct asus_laptop *asus = platform_get_drvdata(pdev); 1596 + struct asus_laptop *asus = dev_get_drvdata(dev); 1598 1597 acpi_handle handle = asus->handle; 1599 1598 bool supported; 1600 1599
+1 -1
drivers/platform/x86/asus-wireless.c
··· 72 72 acpi_handle_err(handle, 73 73 "Failed to eval method %s, param %#x (%d)\n", 74 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 76 return ret; 77 77 } 78 78
+1 -2
drivers/platform/x86/asus-wmi.c
··· 1875 1875 struct attribute *attr, int idx) 1876 1876 { 1877 1877 struct device *dev = container_of(kobj, struct device, kobj); 1878 - struct platform_device *pdev = to_platform_device(dev); 1879 - struct asus_wmi *asus = platform_get_drvdata(pdev); 1878 + struct asus_wmi *asus = dev_get_drvdata(dev); 1880 1879 bool ok = true; 1881 1880 int devid = -1; 1882 1881
+16 -1
drivers/platform/x86/dell-laptop.c
··· 38 38 struct quirk_entry { 39 39 bool touchpad_led; 40 40 bool kbd_led_levels_off_1; 41 + bool kbd_missing_ac_tag; 41 42 42 43 bool needs_kbd_timeouts; 43 44 /* ··· 67 66 static struct quirk_entry quirk_dell_xps13_9333 = { 68 67 .needs_kbd_timeouts = true, 69 68 .kbd_timeouts = { 0, 5, 15, 60, 5 * 60, 15 * 60, -1 }, 69 + }; 70 + 71 + static struct quirk_entry quirk_dell_xps13_9370 = { 72 + .kbd_missing_ac_tag = true, 70 73 }; 71 74 72 75 static struct quirk_entry quirk_dell_latitude_e6410 = { ··· 295 290 DMI_MATCH(DMI_PRODUCT_NAME, "XPS13 9333"), 296 291 }, 297 292 .driver_data = &quirk_dell_xps13_9333, 293 + }, 294 + { 295 + .callback = dmi_matched, 296 + .ident = "Dell XPS 13 9370", 297 + .matches = { 298 + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), 299 + DMI_MATCH(DMI_PRODUCT_NAME, "XPS 13 9370"), 300 + }, 301 + .driver_data = &quirk_dell_xps13_9370, 298 302 }, 299 303 { 300 304 .callback = dmi_matched, ··· 1415 1401 * timeout value which is shared for both battery and AC power 1416 1402 * settings. So do not try to set AC values on old models. 1417 1403 */ 1418 - if (dell_smbios_find_token(KBD_LED_AC_TOKEN)) 1404 + if ((quirks && quirks->kbd_missing_ac_tag) || 1405 + dell_smbios_find_token(KBD_LED_AC_TOKEN)) 1419 1406 kbd_timeout_ac_supported = true; 1420 1407 1421 1408 kbd_get_state(&state);
+2 -3
drivers/platform/x86/dell-smbios-base.c
··· 555 555 556 556 static int __init dell_smbios_init(void) 557 557 { 558 - const struct dmi_device *valid; 559 558 int ret, wmi, smm; 560 559 561 - valid = dmi_find_device(DMI_DEV_TYPE_OEM_STRING, "Dell System", NULL); 562 - if (!valid) { 560 + if (!dmi_find_device(DMI_DEV_TYPE_OEM_STRING, "Dell System", NULL) && 561 + !dmi_find_device(DMI_DEV_TYPE_OEM_STRING, "www.dell.com", NULL)) { 563 562 pr_err("Unable to run on non-Dell system\n"); 564 563 return -ENODEV; 565 564 }
+15 -1
drivers/platform/x86/dell-wmi.c
··· 233 233 [18] = KEY_PROG1, 234 234 [19] = KEY_BRIGHTNESSDOWN, 235 235 [20] = KEY_BRIGHTNESSUP, 236 - [21] = KEY_UNKNOWN, 236 + [21] = KEY_BRIGHTNESS_AUTO, 237 237 [22] = KEY_KBDILLUMTOGGLE, 238 238 [23] = KEY_UNKNOWN, 239 239 [24] = KEY_SWITCHVIDEOMODE, ··· 261 261 * override them. 262 262 */ 263 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 270 /* Mic mute */ 265 271 { KE_KEY, 0x150, { KEY_MICMUTE } }, 266 272 ··· 302 296 { KE_KEY, 0x851, { KEY_PROG2 } }, 303 297 { KE_KEY, 0x852, { KEY_PROG3 } }, 304 298 299 + /* 300 + * Radio disable (notify only -- there is no model for which the 301 + * WMI event is supposed to trigger an action). 302 + */ 303 + { KE_IGNORE, 0xe008, { KEY_RFKILL } }, 304 + 305 + /* Fn-lock */ 306 + { KE_IGNORE, 0xe035, { KEY_RESERVED } }, 305 307 }; 306 308 307 309 /*
+24 -23
drivers/platform/x86/fujitsu-laptop.c
··· 91 91 #define FLAG_RFKILL BIT(5) 92 92 #define FLAG_LID BIT(8) 93 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 98 /* FUNC interface - LED control */ 96 99 #define FUNC_LED_OFF BIT(0) ··· 459 456 /* ACPI device for hotkey handling */ 460 457 461 458 static const struct key_entry keymap_default[] = { 462 - { KE_KEY, KEY1_CODE, { KEY_PROG1 } }, 463 - { KE_KEY, KEY2_CODE, { KEY_PROG2 } }, 464 - { KE_KEY, KEY3_CODE, { KEY_PROG3 } }, 465 - { KE_KEY, KEY4_CODE, { KEY_PROG4 } }, 466 - { KE_KEY, KEY5_CODE, { KEY_RFKILL } }, 467 - { KE_KEY, BIT(5), { KEY_RFKILL } }, 468 - { KE_KEY, BIT(26), { KEY_TOUCHPAD_TOGGLE } }, 469 - { KE_KEY, BIT(29), { KEY_MICMUTE } }, 459 + { KE_KEY, KEY1_CODE, { KEY_PROG1 } }, 460 + { KE_KEY, KEY2_CODE, { KEY_PROG2 } }, 461 + { KE_KEY, KEY3_CODE, { KEY_PROG3 } }, 462 + { KE_KEY, KEY4_CODE, { KEY_PROG4 } }, 463 + { KE_KEY, KEY5_CODE, { KEY_RFKILL } }, 464 + /* Soft keys read from status flags */ 465 + { KE_KEY, FLAG_RFKILL, { KEY_RFKILL } }, 466 + { KE_KEY, FLAG_TOUCHPAD_TOGGLE, { KEY_TOUCHPAD_TOGGLE } }, 467 + { KE_KEY, FLAG_MICMUTE, { KEY_MICMUTE } }, 470 468 { KE_END, 0 } 471 469 }; 472 470 ··· 907 903 static void acpi_fujitsu_laptop_notify(struct acpi_device *device, u32 event) 908 904 { 909 905 struct fujitsu_laptop *priv = acpi_driver_data(device); 910 - int scancode, i = 0, ret; 906 + unsigned long flags; 907 + int scancode, i = 0; 911 908 unsigned int irb; 912 909 913 910 if (event != ACPI_FUJITSU_NOTIFY_CODE) { ··· 935 930 "Unknown GIRB result [%x]\n", irb); 936 931 } 937 932 938 - /* On some models (first seen on the Skylake-based Lifebook 939 - * E736/E746/E756), the touchpad toggle hotkey (Fn+F4) is 940 - * handled in software; its state is queried using FUNC_FLAGS 933 + /* 934 + * First seen on the Skylake-based Lifebook E736/E746/E756), the 935 + * touchpad toggle hotkey (Fn+F4) is handled in software. Other models 936 + * have since added additional "soft keys". These are reported in the 937 + * status flags queried using FUNC_FLAGS. 941 938 */ 942 - if (priv->flags_supported & (BIT(5) | BIT(26) | BIT(29))) { 943 - ret = call_fext_func(device, FUNC_FLAGS, 0x1, 0x0, 0x0); 944 - if (ret & BIT(5)) 945 - sparse_keymap_report_event(priv->input, 946 - BIT(5), 1, true); 947 - if (ret & BIT(26)) 948 - sparse_keymap_report_event(priv->input, 949 - BIT(26), 1, true); 950 - if (ret & BIT(29)) 951 - sparse_keymap_report_event(priv->input, 952 - BIT(29), 1, true); 939 + if (priv->flags_supported & (FLAG_SOFTKEYS)) { 940 + flags = call_fext_func(device, FUNC_FLAGS, 0x1, 0x0, 0x0); 941 + flags &= (FLAG_SOFTKEYS); 942 + for_each_set_bit(i, &flags, BITS_PER_LONG) 943 + sparse_keymap_report_event(priv->input, BIT(i), 1, true); 953 944 } 954 945 } 955 946
+63 -3
drivers/platform/x86/ideapad-laptop.c
··· 43 43 #define IDEAPAD_RFKILL_DEV_NUM (3) 44 44 45 45 #define BM_CONSERVATION_BIT (5) 46 + #define HA_FNLOCK_BIT (10) 46 47 47 48 #define CFG_BT_BIT (16) 48 49 #define CFG_3G_BIT (17) ··· 60 59 enum { 61 60 BMCMD_CONSERVATION_ON = 3, 62 61 BMCMD_CONSERVATION_OFF = 5, 62 + HACMD_FNLOCK_ON = 0xe, 63 + HACMD_FNLOCK_OFF = 0xf, 63 64 }; 64 65 65 66 enum { ··· 142 139 return result; 143 140 } 144 141 145 - static int method_sbmc(acpi_handle handle, int cmd) 142 + static int method_int1(acpi_handle handle, char *method, int cmd) 146 143 { 147 144 acpi_status status; 148 145 149 - status = acpi_execute_simple_method(handle, "SBMC", cmd); 146 + status = acpi_execute_simple_method(handle, method, cmd); 150 147 return ACPI_FAILURE(status) ? -1 : 0; 151 148 } 152 149 ··· 490 487 if (ret) 491 488 return ret; 492 489 493 - ret = method_sbmc(priv->adev->handle, state ? 490 + ret = method_int1(priv->adev->handle, "SBMC", state ? 494 491 BMCMD_CONSERVATION_ON : 495 492 BMCMD_CONSERVATION_OFF); 496 493 if (ret < 0) ··· 500 497 501 498 static DEVICE_ATTR_RW(conservation_mode); 502 499 500 + static ssize_t fn_lock_show(struct device *dev, 501 + struct device_attribute *attr, 502 + char *buf) 503 + { 504 + struct ideapad_private *priv = dev_get_drvdata(dev); 505 + unsigned long result; 506 + int hals; 507 + int fail = read_method_int(priv->adev->handle, "HALS", &hals); 508 + 509 + if (fail) 510 + return sprintf(buf, "-1\n"); 511 + 512 + result = hals; 513 + return sprintf(buf, "%u\n", test_bit(HA_FNLOCK_BIT, &result)); 514 + } 515 + 516 + static ssize_t fn_lock_store(struct device *dev, 517 + struct device_attribute *attr, 518 + const char *buf, size_t count) 519 + { 520 + struct ideapad_private *priv = dev_get_drvdata(dev); 521 + bool state; 522 + int ret; 523 + 524 + ret = kstrtobool(buf, &state); 525 + if (ret) 526 + return ret; 527 + 528 + ret = method_int1(priv->adev->handle, "SALS", state ? 529 + HACMD_FNLOCK_ON : 530 + HACMD_FNLOCK_OFF); 531 + if (ret < 0) 532 + return -EIO; 533 + return count; 534 + } 535 + 536 + static DEVICE_ATTR_RW(fn_lock); 537 + 538 + 503 539 static struct attribute *ideapad_attributes[] = { 504 540 &dev_attr_camera_power.attr, 505 541 &dev_attr_fan_mode.attr, 506 542 &dev_attr_touchpad.attr, 507 543 &dev_attr_conservation_mode.attr, 544 + &dev_attr_fn_lock.attr, 508 545 NULL 509 546 }; 510 547 ··· 565 522 } else if (attr == &dev_attr_conservation_mode.attr) { 566 523 supported = acpi_has_method(priv->adev->handle, "GBMD") && 567 524 acpi_has_method(priv->adev->handle, "SBMC"); 525 + } else if (attr == &dev_attr_fn_lock.attr) { 526 + supported = acpi_has_method(priv->adev->handle, "HALS") && 527 + acpi_has_method(priv->adev->handle, "SALS"); 568 528 } else 569 529 supported = true; 570 530 ··· 1126 1080 }, 1127 1081 }, 1128 1082 { 1083 + .ident = "Lenovo ideapad MIIX 720-12IKB", 1084 + .matches = { 1085 + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), 1086 + DMI_MATCH(DMI_PRODUCT_VERSION, "MIIX 720-12IKB"), 1087 + }, 1088 + }, 1089 + { 1129 1090 .ident = "Lenovo Legion Y520-15IKBN", 1130 1091 .matches = { 1131 1092 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), ··· 1214 1161 .matches = { 1215 1162 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), 1216 1163 DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo YOGA 920-13IKB"), 1164 + }, 1165 + }, 1166 + { 1167 + .ident = "Lenovo Zhaoyang E42-80", 1168 + .matches = { 1169 + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), 1170 + DMI_MATCH(DMI_PRODUCT_VERSION, "ZHAOYANG E42-80"), 1217 1171 }, 1218 1172 }, 1219 1173 {}
+2 -2
drivers/platform/x86/intel_scu_ipc.c
··· 584 584 if (cmd == IPC_I2C_READ) { 585 585 writel(addr, scu->i2c_base + IPC_I2C_CNTRL_ADDR); 586 586 /* Write not getting updated without delay */ 587 - mdelay(1); 587 + usleep_range(1000, 2000); 588 588 *data = readl(scu->i2c_base + I2C_DATA_ADDR); 589 589 } else if (cmd == IPC_I2C_WRITE) { 590 590 writel(*data, scu->i2c_base + I2C_DATA_ADDR); 591 - mdelay(1); 591 + usleep_range(1000, 2000); 592 592 writel(addr, scu->i2c_base + IPC_I2C_CNTRL_ADDR); 593 593 } else { 594 594 dev_err(scu->dev,
+288 -1
drivers/platform/x86/mlx-platform.c
··· 47 47 /* LPC bus IO offsets */ 48 48 #define MLXPLAT_CPLD_LPC_I2C_BASE_ADRR 0x2000 49 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 55 #define MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET 0x3a 51 56 #define MLXPLAT_CPLD_LPC_REG_AGGR_MASK_OFFSET 0x3b 52 57 #define MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET 0x40 ··· 89 84 #define MLXPLAT_CPLD_PWR_MASK GENMASK(1, 0) 90 85 #define MLXPLAT_CPLD_FAN_MASK GENMASK(3, 0) 91 86 #define MLXPLAT_CPLD_FAN_NG_MASK GENMASK(5, 0) 87 + #define MLXPLAT_CPLD_LED_LO_NIBBLE_MASK GENMASK(7, 4) 88 + #define MLXPLAT_CPLD_LED_HI_NIBBLE_MASK GENMASK(3, 0) 92 89 93 90 /* Default I2C parent bus number */ 94 91 #define MLXPLAT_CPLD_PHYS_ADAPTER_DEF_NR 1 ··· 121 114 * @pdev_i2c - i2c controller platform device 122 115 * @pdev_mux - array of mux platform devices 123 116 * @pdev_hotplug - hotplug platform devices 117 + * @pdev_led - led platform devices 124 118 */ 125 119 struct mlxplat_priv { 126 120 struct platform_device *pdev_i2c; 127 121 struct platform_device *pdev_mux[MLXPLAT_CPLD_LPC_MUX_DEVS]; 128 122 struct platform_device *pdev_hotplug; 123 + struct platform_device *pdev_led; 129 124 }; 130 125 131 126 /* Regions for LPC I2C controller and LPC base register space */ ··· 601 592 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW, 602 593 }; 603 594 595 + /* Platform led default data */ 596 + static struct mlxreg_core_data mlxplat_mlxcpld_default_led_data[] = { 597 + { 598 + .label = "status:green", 599 + .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET, 600 + .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK, 601 + }, 602 + { 603 + .label = "status:red", 604 + .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET, 605 + .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK 606 + }, 607 + { 608 + .label = "psu:green", 609 + .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET, 610 + .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK, 611 + }, 612 + { 613 + .label = "psu:red", 614 + .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET, 615 + .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK, 616 + }, 617 + { 618 + .label = "fan1:green", 619 + .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET, 620 + .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK, 621 + }, 622 + { 623 + .label = "fan1:red", 624 + .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET, 625 + .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK, 626 + }, 627 + { 628 + .label = "fan2:green", 629 + .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET, 630 + .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK, 631 + }, 632 + { 633 + .label = "fan2:red", 634 + .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET, 635 + .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK, 636 + }, 637 + { 638 + .label = "fan3:green", 639 + .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET, 640 + .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK, 641 + }, 642 + { 643 + .label = "fan3:red", 644 + .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET, 645 + .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK, 646 + }, 647 + { 648 + .label = "fan4:green", 649 + .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET, 650 + .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK, 651 + }, 652 + { 653 + .label = "fan4:red", 654 + .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET, 655 + .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK, 656 + }, 657 + }; 658 + 659 + static struct mlxreg_core_platform_data mlxplat_default_led_data = { 660 + .data = mlxplat_mlxcpld_default_led_data, 661 + .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_led_data), 662 + }; 663 + 664 + /* Platform led MSN21xx system family data */ 665 + static struct mlxreg_core_data mlxplat_mlxcpld_msn21xx_led_data[] = { 666 + { 667 + .label = "status:green", 668 + .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET, 669 + .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK, 670 + }, 671 + { 672 + .label = "status:red", 673 + .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET, 674 + .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK 675 + }, 676 + { 677 + .label = "fan:green", 678 + .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET, 679 + .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK, 680 + }, 681 + { 682 + .label = "fan:red", 683 + .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET, 684 + .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK, 685 + }, 686 + { 687 + .label = "psu1:green", 688 + .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET, 689 + .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK, 690 + }, 691 + { 692 + .label = "psu1:red", 693 + .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET, 694 + .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK, 695 + }, 696 + { 697 + .label = "psu2:green", 698 + .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET, 699 + .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK, 700 + }, 701 + { 702 + .label = "psu2:red", 703 + .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET, 704 + .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK, 705 + }, 706 + { 707 + .label = "uid:blue", 708 + .reg = MLXPLAT_CPLD_LPC_REG_LED5_OFFSET, 709 + .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK, 710 + }, 711 + }; 712 + 713 + static struct mlxreg_core_platform_data mlxplat_msn21xx_led_data = { 714 + .data = mlxplat_mlxcpld_msn21xx_led_data, 715 + .counter = ARRAY_SIZE(mlxplat_mlxcpld_msn21xx_led_data), 716 + }; 717 + 718 + /* Platform led for default data for 200GbE systems */ 719 + static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_led_data[] = { 720 + { 721 + .label = "status:green", 722 + .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET, 723 + .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK, 724 + }, 725 + { 726 + .label = "status:orange", 727 + .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET, 728 + .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK 729 + }, 730 + { 731 + .label = "psu:green", 732 + .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET, 733 + .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK, 734 + }, 735 + { 736 + .label = "psu:orange", 737 + .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET, 738 + .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK, 739 + }, 740 + { 741 + .label = "fan1:green", 742 + .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET, 743 + .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK, 744 + }, 745 + { 746 + .label = "fan1:orange", 747 + .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET, 748 + .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK, 749 + }, 750 + { 751 + .label = "fan2:green", 752 + .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET, 753 + .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK, 754 + }, 755 + { 756 + .label = "fan2:orange", 757 + .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET, 758 + .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK, 759 + }, 760 + { 761 + .label = "fan3:green", 762 + .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET, 763 + .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK, 764 + }, 765 + { 766 + .label = "fan3:orange", 767 + .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET, 768 + .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK, 769 + }, 770 + { 771 + .label = "fan4:green", 772 + .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET, 773 + .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK, 774 + }, 775 + { 776 + .label = "fan4:orange", 777 + .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET, 778 + .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK, 779 + }, 780 + { 781 + .label = "fan5:green", 782 + .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET, 783 + .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK, 784 + }, 785 + { 786 + .label = "fan5:orange", 787 + .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET, 788 + .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK, 789 + }, 790 + { 791 + .label = "fan6:green", 792 + .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET, 793 + .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK, 794 + }, 795 + { 796 + .label = "fan6:orange", 797 + .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET, 798 + .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK, 799 + }, 800 + }; 801 + 802 + static struct mlxreg_core_platform_data mlxplat_default_ng_led_data = { 803 + .data = mlxplat_mlxcpld_default_ng_led_data, 804 + .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_led_data), 805 + }; 806 + 807 + 604 808 static bool mlxplat_mlxcpld_writeable_reg(struct device *dev, unsigned int reg) 605 809 { 606 810 switch (reg) { 811 + case MLXPLAT_CPLD_LPC_REG_LED1_OFFSET: 812 + case MLXPLAT_CPLD_LPC_REG_LED2_OFFSET: 813 + case MLXPLAT_CPLD_LPC_REG_LED3_OFFSET: 814 + case MLXPLAT_CPLD_LPC_REG_LED4_OFFSET: 815 + case MLXPLAT_CPLD_LPC_REG_LED5_OFFSET: 607 816 case MLXPLAT_CPLD_LPC_REG_AGGR_MASK_OFFSET: 608 817 case MLXPLAT_CPLD_LPC_REG_AGGRLO_MASK_OFFSET: 609 818 case MLXPLAT_CPLD_LPC_REG_PSU_EVENT_OFFSET: ··· 838 611 static bool mlxplat_mlxcpld_readable_reg(struct device *dev, unsigned int reg) 839 612 { 840 613 switch (reg) { 614 + case MLXPLAT_CPLD_LPC_REG_LED1_OFFSET: 615 + case MLXPLAT_CPLD_LPC_REG_LED2_OFFSET: 616 + case MLXPLAT_CPLD_LPC_REG_LED3_OFFSET: 617 + case MLXPLAT_CPLD_LPC_REG_LED4_OFFSET: 618 + case MLXPLAT_CPLD_LPC_REG_LED5_OFFSET: 841 619 case MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET: 842 620 case MLXPLAT_CPLD_LPC_REG_AGGR_MASK_OFFSET: 843 621 case MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET: ··· 864 632 static bool mlxplat_mlxcpld_volatile_reg(struct device *dev, unsigned int reg) 865 633 { 866 634 switch (reg) { 635 + case MLXPLAT_CPLD_LPC_REG_LED1_OFFSET: 636 + case MLXPLAT_CPLD_LPC_REG_LED2_OFFSET: 637 + case MLXPLAT_CPLD_LPC_REG_LED3_OFFSET: 638 + case MLXPLAT_CPLD_LPC_REG_LED4_OFFSET: 639 + case MLXPLAT_CPLD_LPC_REG_LED5_OFFSET: 867 640 case MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET: 868 641 case MLXPLAT_CPLD_LPC_REG_AGGR_MASK_OFFSET: 869 642 case MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET: ··· 929 692 930 693 static struct platform_device *mlxplat_dev; 931 694 static struct mlxreg_core_hotplug_platform_data *mlxplat_hotplug; 695 + static struct mlxreg_core_platform_data *mlxplat_led; 932 696 933 697 static int __init mlxplat_dmi_default_matched(const struct dmi_system_id *dmi) 934 698 { ··· 943 705 mlxplat_hotplug = &mlxplat_mlxcpld_default_data; 944 706 mlxplat_hotplug->deferred_nr = 945 707 mlxplat_default_channels[i - 1][MLXPLAT_CPLD_GRP_CHNL_NUM - 1]; 708 + mlxplat_led = &mlxplat_default_led_data; 946 709 947 710 return 1; 948 711 }; ··· 960 721 mlxplat_hotplug = &mlxplat_mlxcpld_msn21xx_data; 961 722 mlxplat_hotplug->deferred_nr = 962 723 mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1]; 724 + mlxplat_led = &mlxplat_msn21xx_led_data; 963 725 964 726 return 1; 965 727 }; ··· 977 737 mlxplat_hotplug = &mlxplat_mlxcpld_msn274x_data; 978 738 mlxplat_hotplug->deferred_nr = 979 739 mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1]; 740 + mlxplat_led = &mlxplat_default_led_data; 980 741 981 742 return 1; 982 743 }; ··· 994 753 mlxplat_hotplug = &mlxplat_mlxcpld_msn201x_data; 995 754 mlxplat_hotplug->deferred_nr = 996 755 mlxplat_default_channels[i - 1][MLXPLAT_CPLD_GRP_CHNL_NUM - 1]; 756 + mlxplat_led = &mlxplat_default_ng_led_data; 997 757 998 758 return 1; 999 759 }; ··· 1011 769 mlxplat_hotplug = &mlxplat_mlxcpld_default_ng_data; 1012 770 mlxplat_hotplug->deferred_nr = 1013 771 mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1]; 772 + mlxplat_led = &mlxplat_msn21xx_led_data; 1014 773 1015 774 return 1; 1016 775 }; ··· 1085 842 .matches = { 1086 843 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"), 1087 844 DMI_MATCH(DMI_PRODUCT_NAME, "SN34"), 845 + }, 846 + }, 847 + { 848 + .callback = mlxplat_dmi_default_matched, 849 + .matches = { 850 + DMI_MATCH(DMI_BOARD_NAME, "VMOD0001"), 851 + }, 852 + }, 853 + { 854 + .callback = mlxplat_dmi_msn21xx_matched, 855 + .matches = { 856 + DMI_MATCH(DMI_BOARD_NAME, "VMOD0002"), 857 + }, 858 + }, 859 + { 860 + .callback = mlxplat_dmi_msn274x_matched, 861 + .matches = { 862 + DMI_MATCH(DMI_BOARD_NAME, "VMOD0003"), 863 + }, 864 + }, 865 + { 866 + .callback = mlxplat_dmi_msn201x_matched, 867 + .matches = { 868 + DMI_MATCH(DMI_BOARD_NAME, "VMOD0004"), 869 + }, 870 + }, 871 + { 872 + .callback = mlxplat_dmi_qmb7xx_matched, 873 + .matches = { 874 + DMI_MATCH(DMI_BOARD_NAME, "VMOD0005"), 1088 875 }, 1089 876 }, 1090 877 { } ··· 1233 960 goto fail_platform_mux_register; 1234 961 } 1235 962 963 + /* Add LED driver. */ 964 + mlxplat_led->regmap = mlxplat_hotplug->regmap; 965 + priv->pdev_led = platform_device_register_resndata( 966 + &mlxplat_dev->dev, "leds-mlxreg", 967 + PLATFORM_DEVID_NONE, NULL, 0, 968 + mlxplat_led, sizeof(*mlxplat_led)); 969 + if (IS_ERR(priv->pdev_led)) { 970 + err = PTR_ERR(priv->pdev_led); 971 + goto fail_platform_hotplug_register; 972 + } 973 + 1236 974 /* Sync registers with hardware. */ 1237 975 regcache_mark_dirty(mlxplat_hotplug->regmap); 1238 976 err = regcache_sync(mlxplat_hotplug->regmap); 1239 977 if (err) 1240 - goto fail_platform_hotplug_register; 978 + goto fail_platform_led_register; 1241 979 1242 980 return 0; 1243 981 982 + fail_platform_led_register: 983 + platform_device_unregister(priv->pdev_led); 1244 984 fail_platform_hotplug_register: 1245 985 platform_device_unregister(priv->pdev_hotplug); 1246 986 fail_platform_mux_register: ··· 1272 986 struct mlxplat_priv *priv = platform_get_drvdata(mlxplat_dev); 1273 987 int i; 1274 988 989 + platform_device_unregister(priv->pdev_led); 1275 990 platform_device_unregister(priv->pdev_hotplug); 1276 991 1277 992 for (i = ARRAY_SIZE(mlxplat_mux_data) - 1; i >= 0 ; i--)
+1 -2
drivers/platform/x86/samsung-laptop.c
··· 1216 1216 struct attribute *attr, int idx) 1217 1217 { 1218 1218 struct device *dev = container_of(kobj, struct device, kobj); 1219 - struct platform_device *pdev = to_platform_device(dev); 1220 - struct samsung_laptop *samsung = platform_get_drvdata(pdev); 1219 + struct samsung_laptop *samsung = dev_get_drvdata(dev); 1221 1220 bool ok = true; 1222 1221 1223 1222 if (attr == &dev_attr_performance_level.attr)
+96 -5
drivers/platform/x86/silead_dmi.c
··· 53 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 70 static const struct property_entry dexp_ursus_7w_props[] = { 57 71 PROPERTY_ENTRY_U32("touchscreen-size-x", 890), 58 72 PROPERTY_ENTRY_U32("touchscreen-size-y", 630), ··· 141 127 .properties = pipo_w2s_props, 142 128 }; 143 129 144 - static const struct property_entry pov_mobii_wintab_p800w_props[] = { 130 + static const struct property_entry pov_mobii_wintab_p800w_v20_props[] = { 131 + PROPERTY_ENTRY_U32("touchscreen-min-x", 32), 132 + PROPERTY_ENTRY_U32("touchscreen-min-y", 16), 133 + PROPERTY_ENTRY_U32("touchscreen-size-x", 1692), 134 + PROPERTY_ENTRY_U32("touchscreen-size-y", 1146), 135 + PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"), 136 + PROPERTY_ENTRY_STRING("firmware-name", 137 + "gsl3680-pov-mobii-wintab-p800w-v20.fw"), 138 + PROPERTY_ENTRY_U32("silead,max-fingers", 10), 139 + PROPERTY_ENTRY_BOOL("silead,home-button"), 140 + { } 141 + }; 142 + 143 + static const struct silead_ts_dmi_data pov_mobii_wintab_p800w_v20_data = { 144 + .acpi_name = "MSSL1680:00", 145 + .properties = pov_mobii_wintab_p800w_v20_props, 146 + }; 147 + 148 + static const struct property_entry pov_mobii_wintab_p800w_v21_props[] = { 145 149 PROPERTY_ENTRY_U32("touchscreen-size-x", 1800), 146 150 PROPERTY_ENTRY_U32("touchscreen-size-y", 1150), 147 151 PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"), ··· 169 137 { } 170 138 }; 171 139 172 - static const struct silead_ts_dmi_data pov_mobii_wintab_p800w_data = { 140 + static const struct silead_ts_dmi_data pov_mobii_wintab_p800w_v21_data = { 173 141 .acpi_name = "MSSL1680:00", 174 - .properties = pov_mobii_wintab_p800w_props, 142 + .properties = pov_mobii_wintab_p800w_v21_props, 175 143 }; 176 144 177 145 static const struct property_entry itworks_tw891_props[] = { ··· 309 277 .properties = teclast_x3_plus_props, 310 278 }; 311 279 280 + static const struct property_entry onda_v891w_v1_props[] = { 281 + PROPERTY_ENTRY_U32("touchscreen-min-x", 46), 282 + PROPERTY_ENTRY_U32("touchscreen-min-y", 8), 283 + PROPERTY_ENTRY_U32("touchscreen-size-x", 1676), 284 + PROPERTY_ENTRY_U32("touchscreen-size-y", 1130), 285 + PROPERTY_ENTRY_STRING("firmware-name", 286 + "gsl3680-onda-v891w-v1.fw"), 287 + PROPERTY_ENTRY_U32("silead,max-fingers", 10), 288 + PROPERTY_ENTRY_BOOL("silead,home-button"), 289 + { } 290 + }; 291 + 292 + static const struct silead_ts_dmi_data onda_v891w_v1_data = { 293 + .acpi_name = "MSSL1680:00", 294 + .properties = onda_v891w_v1_props, 295 + }; 296 + 312 297 static const struct dmi_system_id silead_ts_dmi_table[] = { 313 298 { 314 299 /* CUBE iwork8 Air */ ··· 343 294 DMI_MATCH(DMI_SYS_VENDOR, "Insyde"), 344 295 /* jumperx.T87.KFBNEEA02 with the version-nr dropped */ 345 296 DMI_MATCH(DMI_BIOS_VERSION, "jumperx.T87.KFBNEEA"), 297 + }, 298 + }, 299 + { 300 + /* Jumper EZpad 6 Pro */ 301 + .driver_data = (void *)&jumper_ezpad_6_pro_data, 302 + .matches = { 303 + DMI_MATCH(DMI_SYS_VENDOR, "Jumper"), 304 + DMI_MATCH(DMI_PRODUCT_NAME, "EZpad"), 305 + DMI_MATCH(DMI_BIOS_VERSION, "5.12"), 306 + /* Above matches are too generic, add bios-date match */ 307 + DMI_MATCH(DMI_BIOS_DATE, "08/18/2017"), 346 308 }, 347 309 }, 348 310 { ··· 421 361 }, 422 362 }, 423 363 { 424 - /* Point of View mobii wintab p800w */ 425 - .driver_data = (void *)&pov_mobii_wintab_p800w_data, 364 + /* Point of View mobii wintab p800w (v2.0) */ 365 + .driver_data = (void *)&pov_mobii_wintab_p800w_v20_data, 366 + .matches = { 367 + DMI_MATCH(DMI_BOARD_VENDOR, "AMI Corporation"), 368 + DMI_MATCH(DMI_BOARD_NAME, "Aptio CRB"), 369 + DMI_MATCH(DMI_BIOS_VERSION, "3BAIR1014"), 370 + /* Above matches are too generic, add bios-date match */ 371 + DMI_MATCH(DMI_BIOS_DATE, "10/24/2014"), 372 + }, 373 + }, 374 + { 375 + /* Point of View mobii wintab p800w (v2.1) */ 376 + .driver_data = (void *)&pov_mobii_wintab_p800w_v21_data, 426 377 .matches = { 427 378 DMI_MATCH(DMI_BOARD_VENDOR, "AMI Corporation"), 428 379 DMI_MATCH(DMI_BOARD_NAME, "Aptio CRB"), ··· 481 410 .matches = { 482 411 DMI_MATCH(DMI_SYS_VENDOR, "ilife"), 483 412 DMI_MATCH(DMI_PRODUCT_NAME, "S806"), 413 + }, 414 + }, 415 + { 416 + /* Chuwi Hi8 (H1D_S806_206) */ 417 + .driver_data = (void *)&chuwi_hi8_data, 418 + .matches = { 419 + DMI_MATCH(DMI_SYS_VENDOR, "Insyde"), 420 + DMI_MATCH(DMI_PRODUCT_NAME, "BayTrail"), 421 + DMI_MATCH(DMI_BIOS_VERSION, "H1D_S806_206"), 484 422 }, 485 423 }, 486 424 { ··· 541 461 .matches = { 542 462 DMI_MATCH(DMI_SYS_VENDOR, "YOURS"), 543 463 DMI_MATCH(DMI_PRODUCT_NAME, "Y8W81"), 464 + }, 465 + }, 466 + { 467 + /* ONDA V891w revision P891WBEBV1B00 aka v1 */ 468 + .driver_data = (void *)&onda_v891w_v1_data, 469 + .matches = { 470 + DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "ONDA"), 471 + DMI_EXACT_MATCH(DMI_BOARD_NAME, "ONDA Tablet"), 472 + DMI_EXACT_MATCH(DMI_BOARD_VERSION, "V001"), 473 + /* Exact match, different versions need different fw */ 474 + DMI_EXACT_MATCH(DMI_BIOS_VERSION, "ONDA.W89EBBN08"), 544 475 }, 545 476 }, 546 477 { },
+21 -9
drivers/platform/x86/thinkpad_acpi.c
··· 212 212 TP_HKEY_EV_ALARM_BAT_XHOT = 0x6012, /* battery critically hot */ 213 213 TP_HKEY_EV_ALARM_SENSOR_HOT = 0x6021, /* sensor too hot */ 214 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 222 /* AC-related events */ 218 223 TP_HKEY_EV_AC_CHANGED = 0x6040, /* AC status changed */ ··· 4039 4034 bool *send_acpi_ev, 4040 4035 bool *ignore_acpi_ev) 4041 4036 { 4042 - bool known = true; 4043 - 4044 4037 /* 0x6000-0x6FFF: thermal alarms/notices and keyboard events */ 4045 4038 *send_acpi_ev = true; 4046 4039 *ignore_acpi_ev = false; 4047 4040 4048 4041 switch (hkey) { 4049 4042 case TP_HKEY_EV_THM_TABLE_CHANGED: 4050 - pr_info("EC reports that Thermal Table has changed\n"); 4043 + pr_debug("EC reports: Thermal Table has changed\n"); 4044 + /* recommended action: do nothing, we don't have 4045 + * Lenovo ATM information */ 4046 + return true; 4047 + case TP_HKEY_EV_THM_CSM_COMPLETED: 4048 + pr_debug("EC reports: Thermal Control Command set completed (DYTC)\n"); 4049 + /* recommended action: do nothing, we don't have 4050 + * Lenovo ATM information */ 4051 + return true; 4052 + case TP_HKEY_EV_THM_TRANSFM_CHANGED: 4053 + pr_debug("EC reports: Thermal Transformation changed (GMTS)\n"); 4051 4054 /* recommended action: do nothing, we don't have 4052 4055 * Lenovo ATM information */ 4053 4056 return true; ··· 4096 4083 tpacpi_input_send_tabletsw(); 4097 4084 hotkey_tablet_mode_notify_change(); 4098 4085 *send_acpi_ev = false; 4099 - break; 4086 + return true; 4100 4087 4101 4088 case TP_HKEY_EV_PALM_DETECTED: 4102 4089 case TP_HKEY_EV_PALM_UNDETECTED: ··· 4105 4092 return true; 4106 4093 4107 4094 default: 4108 - pr_warn("unknown possible thermal alarm or keyboard event received\n"); 4109 - known = false; 4095 + /* report simply as unknown, no sensor dump */ 4096 + return false; 4110 4097 } 4111 4098 4112 4099 thermal_dump_all_sensors(); 4113 - 4114 - return known; 4100 + return true; 4115 4101 } 4116 4102 4117 4103 static void hotkey_notify(struct ibm_struct *ibm, u32 event)
+1 -2
include/linux/platform_data/mlxreg.h
··· 58 58 * struct mlxreg_core_data - attributes control data: 59 59 * 60 60 * @label: attribute label; 61 - * @label: attribute register offset; 62 61 * @reg: attribute register; 63 62 * @mask: attribute access mask; 64 - * @mode: access mode; 65 63 * @bit: attribute effective bit; 64 + * @mode: access mode; 66 65 * @np - pointer to node platform associated with attribute; 67 66 * @hpdev - hotplug device data; 68 67 * @health_cntr: dynamic device health indication counter;
+1
include/linux/string_helpers.h
··· 5 5 #include <linux/types.h> 6 6 7 7 struct file; 8 + struct task_struct; 8 9 9 10 /* Descriptions of the types of units to 10 11 * print in */