diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2019-03-10 16:16:37 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2019-03-10 16:16:37 -0400 |
| commit | dbbdf54c7206bf3f201f9ddaa5f4dd87835271cc (patch) | |
| tree | 941dbf0dada73344acdfe891ec1d50a01316566d | |
| parent | 45ba8d5d061b13494c2a7a7652d51b9da3d9e77a (diff) | |
| parent | 9c22cc020db637850ba47a14a598d09f706f19ad (diff) | |
Merge tag 'platform-drivers-x86-v5.1-1' of git://git.infradead.org/linux-platform-drivers-x86
Pull x86 platform driver updates from Darren Hart:
- use MODULE_DEVICE_TABLE across several wmi drivers, keeping
wmi_device_id and MODULE_ALIAS() declarations in sync
- add several Ideapad models to the no_hw_rfkill list
- add support for new Mellanox platforms, including new fan and LED
functionality
- address Dell keyboard backlight change event and power button release
issues
- update dell_rbu to use appropriate memory allocation mechanisms
- several small fixes and Ice Lake support for intel_pmc_core
- fix a suspend regression for Cherry Trail based devices in
intel_int0002_vgpio
- a few other routine fixes
* tag 'platform-drivers-x86-v5.1-1' of git://git.infradead.org/linux-platform-drivers-x86: (50 commits)
MAINTAINERS: Include mlxreg.h in Mellanox Platform Driver files
platform/x86: ideapad-laptop: Add S130-14IGM to no_hw_rfkill list
platform/x86: mlx-platform: Fix access mode for fan_dir attribute
platform/x86: mlx-platform: Add UID LED for the next generation systems
platform/x86: mlx-platform: Add extra CPLD for next generation systems
platform/x86: wmi-bmof: use MODULE_DEVICE_TABLE() instead of MODULE_ALIAS()
platform/x86: intel-wmi-thunderbolt: use MODULE_DEVICE_TABLE() instead of MODULE_ALIAS()
platform/x86: huawei-wmi: use MODULE_DEVICE_TABLE() instead of MODULE_ALIAS()
platform/x86: dell-wmi: use MODULE_DEVICE_TABLE() instead of MODULE_ALIAS()
platform/x86: dell-wmi-descriptor: use MODULE_DEVICE_TABLE() instead of MODULE_ALIAS()
platform/x86: dell-smbios-wmi: use MODULE_DEVICE_TABLE() instead of MODULE_ALIAS()
platform/x86: wmi: add WMI support to MODULE_DEVICE_TABLE()
platform/x86: wmi: move struct wmi_device_id to mod_devicetable.h
modpost: file2alias: define size of alias
platform/x86: touchscreen_dmi: Add info for the CHUWI Hi10 Air tablet
platform/x86: ideapad-laptop: Add Ideapad 530S-14ARR to no_hw_rfkill list
platform/x86: ideapad-laptop: Add Yoga C930 to no_hw_rfkill_list
platform/x86: intel_pmc_core: Quirk to ignore XTAL shutdown
platform/x86: intel_pmc_core: Add Package cstates residency info
platform/x86: intel_pmc_core: Add ICL platform support
...
27 files changed, 541 insertions, 100 deletions
diff --git a/Documentation/ABI/stable/sysfs-driver-mlxreg-io b/Documentation/ABI/stable/sysfs-driver-mlxreg-io index 169fe08a649b..156319fc5b80 100644 --- a/Documentation/ABI/stable/sysfs-driver-mlxreg-io +++ b/Documentation/ABI/stable/sysfs-driver-mlxreg-io | |||
| @@ -21,7 +21,19 @@ Description: These files show with which CPLD versions have been burned | |||
| 21 | The files are read only. | 21 | The files are read only. |
| 22 | 22 | ||
| 23 | What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/ | 23 | What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/ |
| 24 | cpld3_version | 24 | fan_dir |
| 25 | |||
| 26 | Date: December 2018 | ||
| 27 | KernelVersion: 5.0 | ||
| 28 | Contact: Vadim Pasternak <vadimpmellanox.com> | ||
| 29 | Description: This file shows the system fans direction: | ||
| 30 | forward direction - relevant bit is set 0; | ||
| 31 | reversed direction - relevant bit is set 1. | ||
| 32 | |||
| 33 | The files are read only. | ||
| 34 | |||
| 35 | What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/ | ||
| 36 | jtag_enable | ||
| 25 | 37 | ||
| 26 | Date: November 2018 | 38 | Date: November 2018 |
| 27 | KernelVersion: 5.0 | 39 | KernelVersion: 5.0 |
diff --git a/MAINTAINERS b/MAINTAINERS index 08995da6e16a..17b59b66474b 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -9900,6 +9900,7 @@ M: Vadim Pasternak <vadimp@mellanox.com> | |||
| 9900 | L: platform-driver-x86@vger.kernel.org | 9900 | L: platform-driver-x86@vger.kernel.org |
| 9901 | S: Supported | 9901 | S: Supported |
| 9902 | F: drivers/platform/mellanox/ | 9902 | F: drivers/platform/mellanox/ |
| 9903 | F: include/linux/platform_data/mlxreg.h | ||
| 9903 | 9904 | ||
| 9904 | MELLANOX MLX4 core VPI driver | 9905 | MELLANOX MLX4 core VPI driver |
| 9905 | M: Tariq Toukan <tariqt@mellanox.com> | 9906 | M: Tariq Toukan <tariqt@mellanox.com> |
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c index 5efd4219f112..446c959a8f08 100644 --- a/drivers/acpi/scan.c +++ b/drivers/acpi/scan.c | |||
| @@ -1545,6 +1545,7 @@ static bool acpi_device_enumeration_by_parent(struct acpi_device *device) | |||
| 1545 | */ | 1545 | */ |
| 1546 | static const struct acpi_device_id i2c_multi_instantiate_ids[] = { | 1546 | static const struct acpi_device_id i2c_multi_instantiate_ids[] = { |
| 1547 | {"BSG1160", }, | 1547 | {"BSG1160", }, |
| 1548 | {"BSG2150", }, | ||
| 1548 | {"INT33FE", }, | 1549 | {"INT33FE", }, |
| 1549 | {"INT3515", }, | 1550 | {"INT3515", }, |
| 1550 | {} | 1551 | {} |
diff --git a/drivers/leds/leds-mlxreg.c b/drivers/leds/leds-mlxreg.c index 1ee48cb21df9..cabe379071a7 100644 --- a/drivers/leds/leds-mlxreg.c +++ b/drivers/leds/leds-mlxreg.c | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #define MLXREG_LED_AMBER_SOLID 0x09 /* Solid amber */ | 22 | #define MLXREG_LED_AMBER_SOLID 0x09 /* Solid amber */ |
| 23 | #define MLXREG_LED_BLINK_3HZ 167 /* ~167 msec off/on - HW support */ | 23 | #define MLXREG_LED_BLINK_3HZ 167 /* ~167 msec off/on - HW support */ |
| 24 | #define MLXREG_LED_BLINK_6HZ 83 /* ~83 msec off/on - HW support */ | 24 | #define MLXREG_LED_BLINK_6HZ 83 /* ~83 msec off/on - HW support */ |
| 25 | #define MLXREG_LED_CAPABILITY_CLEAR GENMASK(31, 8) /* Clear mask */ | ||
| 25 | 26 | ||
| 26 | /** | 27 | /** |
| 27 | * struct mlxreg_led_data - led control data: | 28 | * struct mlxreg_led_data - led control data: |
| @@ -187,6 +188,7 @@ static int mlxreg_led_config(struct mlxreg_led_priv_data *priv) | |||
| 187 | struct mlxreg_led_data *led_data; | 188 | struct mlxreg_led_data *led_data; |
| 188 | struct led_classdev *led_cdev; | 189 | struct led_classdev *led_cdev; |
| 189 | enum led_brightness brightness; | 190 | enum led_brightness brightness; |
| 191 | u32 regval; | ||
| 190 | int i; | 192 | int i; |
| 191 | int err; | 193 | int err; |
| 192 | 194 | ||
| @@ -196,6 +198,23 @@ static int mlxreg_led_config(struct mlxreg_led_priv_data *priv) | |||
| 196 | if (!led_data) | 198 | if (!led_data) |
| 197 | return -ENOMEM; | 199 | return -ENOMEM; |
| 198 | 200 | ||
| 201 | if (data->capability) { | ||
| 202 | err = regmap_read(led_pdata->regmap, data->capability, | ||
| 203 | ®val); | ||
| 204 | if (err) { | ||
| 205 | dev_err(&priv->pdev->dev, "Failed to query capability register\n"); | ||
| 206 | return err; | ||
| 207 | } | ||
| 208 | if (!(regval & data->bit)) | ||
| 209 | continue; | ||
| 210 | /* | ||
| 211 | * Field "bit" can contain one capability bit in 0 byte | ||
| 212 | * and offset bit in 1-3 bytes. Clear capability bit and | ||
| 213 | * keep only offset bit. | ||
| 214 | */ | ||
| 215 | data->bit &= MLXREG_LED_CAPABILITY_CLEAR; | ||
| 216 | } | ||
| 217 | |||
| 199 | led_cdev = &led_data->led_cdev; | 218 | led_cdev = &led_data->led_cdev; |
| 200 | led_data->data_parent = priv; | 219 | led_data->data_parent = priv; |
| 201 | if (strstr(data->label, "red") || | 220 | if (strstr(data->label, "red") || |
diff --git a/drivers/platform/mellanox/mlxreg-hotplug.c b/drivers/platform/mellanox/mlxreg-hotplug.c index b6d44550d98c..687ce6817d0d 100644 --- a/drivers/platform/mellanox/mlxreg-hotplug.c +++ b/drivers/platform/mellanox/mlxreg-hotplug.c | |||
| @@ -248,7 +248,8 @@ mlxreg_hotplug_work_helper(struct mlxreg_hotplug_priv_data *priv, | |||
| 248 | struct mlxreg_core_item *item) | 248 | struct mlxreg_core_item *item) |
| 249 | { | 249 | { |
| 250 | struct mlxreg_core_data *data; | 250 | struct mlxreg_core_data *data; |
| 251 | u32 asserted, regval, bit; | 251 | unsigned long asserted; |
| 252 | u32 regval, bit; | ||
| 252 | int ret; | 253 | int ret; |
| 253 | 254 | ||
| 254 | /* | 255 | /* |
| @@ -281,7 +282,7 @@ mlxreg_hotplug_work_helper(struct mlxreg_hotplug_priv_data *priv, | |||
| 281 | asserted = item->cache ^ regval; | 282 | asserted = item->cache ^ regval; |
| 282 | item->cache = regval; | 283 | item->cache = regval; |
| 283 | 284 | ||
| 284 | for_each_set_bit(bit, (unsigned long *)&asserted, 8) { | 285 | for_each_set_bit(bit, &asserted, 8) { |
| 285 | data = item->data + bit; | 286 | data = item->data + bit; |
| 286 | if (regval & BIT(bit)) { | 287 | if (regval & BIT(bit)) { |
| 287 | if (item->inversed) | 288 | if (item->inversed) |
| @@ -495,7 +496,9 @@ static int mlxreg_hotplug_set_irq(struct mlxreg_hotplug_priv_data *priv) | |||
| 495 | { | 496 | { |
| 496 | struct mlxreg_core_hotplug_platform_data *pdata; | 497 | struct mlxreg_core_hotplug_platform_data *pdata; |
| 497 | struct mlxreg_core_item *item; | 498 | struct mlxreg_core_item *item; |
| 498 | int i, ret; | 499 | struct mlxreg_core_data *data; |
| 500 | u32 regval; | ||
| 501 | int i, j, ret; | ||
| 499 | 502 | ||
| 500 | pdata = dev_get_platdata(&priv->pdev->dev); | 503 | pdata = dev_get_platdata(&priv->pdev->dev); |
| 501 | item = pdata->items; | 504 | item = pdata->items; |
| @@ -507,6 +510,25 @@ static int mlxreg_hotplug_set_irq(struct mlxreg_hotplug_priv_data *priv) | |||
| 507 | if (ret) | 510 | if (ret) |
| 508 | goto out; | 511 | goto out; |
| 509 | 512 | ||
| 513 | /* | ||
| 514 | * Verify if hardware configuration requires to disable | ||
| 515 | * interrupt capability for some of components. | ||
| 516 | */ | ||
| 517 | data = item->data; | ||
| 518 | for (j = 0; j < item->count; j++, data++) { | ||
| 519 | /* Verify if the attribute has capability register. */ | ||
| 520 | if (data->capability) { | ||
| 521 | /* Read capability register. */ | ||
| 522 | ret = regmap_read(priv->regmap, | ||
| 523 | data->capability, ®val); | ||
| 524 | if (ret) | ||
| 525 | goto out; | ||
| 526 | |||
| 527 | if (!(regval & data->bit)) | ||
| 528 | item->mask &= ~BIT(j); | ||
| 529 | } | ||
| 530 | } | ||
| 531 | |||
| 510 | /* Set group initial status as mask and unmask group event. */ | 532 | /* Set group initial status as mask and unmask group event. */ |
| 511 | if (item->inversed) { | 533 | if (item->inversed) { |
| 512 | item->cache = item->mask; | 534 | item->cache = item->mask; |
diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c index 37b5de541270..ee1fa93708ec 100644 --- a/drivers/platform/x86/asus-wmi.c +++ b/drivers/platform/x86/asus-wmi.c | |||
| @@ -2265,12 +2265,12 @@ static int asus_wmi_probe(struct platform_device *pdev) | |||
| 2265 | int ret; | 2265 | int ret; |
| 2266 | 2266 | ||
| 2267 | if (!wmi_has_guid(ASUS_WMI_MGMT_GUID)) { | 2267 | if (!wmi_has_guid(ASUS_WMI_MGMT_GUID)) { |
| 2268 | pr_warn("Management GUID not found\n"); | 2268 | pr_warn("ASUS Management GUID not found\n"); |
| 2269 | return -ENODEV; | 2269 | return -ENODEV; |
| 2270 | } | 2270 | } |
| 2271 | 2271 | ||
| 2272 | if (wdrv->event_guid && !wmi_has_guid(wdrv->event_guid)) { | 2272 | if (wdrv->event_guid && !wmi_has_guid(wdrv->event_guid)) { |
| 2273 | pr_warn("Event GUID not found\n"); | 2273 | pr_warn("ASUS Event GUID not found\n"); |
| 2274 | return -ENODEV; | 2274 | return -ENODEV; |
| 2275 | } | 2275 | } |
| 2276 | 2276 | ||
| @@ -2320,11 +2320,6 @@ EXPORT_SYMBOL_GPL(asus_wmi_unregister_driver); | |||
| 2320 | 2320 | ||
| 2321 | static int __init asus_wmi_init(void) | 2321 | static int __init asus_wmi_init(void) |
| 2322 | { | 2322 | { |
| 2323 | if (!wmi_has_guid(ASUS_WMI_MGMT_GUID)) { | ||
| 2324 | pr_info("Asus Management GUID not found\n"); | ||
| 2325 | return -ENODEV; | ||
| 2326 | } | ||
| 2327 | |||
| 2328 | pr_info("ASUS WMI generic driver loaded\n"); | 2323 | pr_info("ASUS WMI generic driver loaded\n"); |
| 2329 | return 0; | 2324 | return 0; |
| 2330 | } | 2325 | } |
diff --git a/drivers/platform/x86/dell-smbios-wmi.c b/drivers/platform/x86/dell-smbios-wmi.c index cf2229ece9ff..c3ed3c8c17b9 100644 --- a/drivers/platform/x86/dell-smbios-wmi.c +++ b/drivers/platform/x86/dell-smbios-wmi.c | |||
| @@ -277,4 +277,4 @@ void exit_dell_smbios_wmi(void) | |||
| 277 | wmi_driver_unregister(&dell_smbios_wmi_driver); | 277 | wmi_driver_unregister(&dell_smbios_wmi_driver); |
| 278 | } | 278 | } |
| 279 | 279 | ||
| 280 | MODULE_ALIAS("wmi:" DELL_WMI_SMBIOS_GUID); | 280 | MODULE_DEVICE_TABLE(wmi, dell_smbios_wmi_id_table); |
diff --git a/drivers/platform/x86/dell-wmi-descriptor.c b/drivers/platform/x86/dell-wmi-descriptor.c index 072821aa47fc..14ab250b7d5a 100644 --- a/drivers/platform/x86/dell-wmi-descriptor.c +++ b/drivers/platform/x86/dell-wmi-descriptor.c | |||
| @@ -207,7 +207,7 @@ static struct wmi_driver dell_wmi_descriptor_driver = { | |||
| 207 | 207 | ||
| 208 | module_wmi_driver(dell_wmi_descriptor_driver); | 208 | module_wmi_driver(dell_wmi_descriptor_driver); |
| 209 | 209 | ||
| 210 | MODULE_ALIAS("wmi:" DELL_WMI_DESCRIPTOR_GUID); | 210 | MODULE_DEVICE_TABLE(wmi, dell_wmi_descriptor_id_table); |
| 211 | MODULE_AUTHOR("Mario Limonciello <mario.limonciello@dell.com>"); | 211 | MODULE_AUTHOR("Mario Limonciello <mario.limonciello@dell.com>"); |
| 212 | MODULE_DESCRIPTION("Dell WMI descriptor driver"); | 212 | MODULE_DESCRIPTION("Dell WMI descriptor driver"); |
| 213 | MODULE_LICENSE("GPL"); | 213 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/platform/x86/dell-wmi.c b/drivers/platform/x86/dell-wmi.c index 16c7f3d9a335..d118bb73fcae 100644 --- a/drivers/platform/x86/dell-wmi.c +++ b/drivers/platform/x86/dell-wmi.c | |||
| @@ -50,8 +50,6 @@ MODULE_LICENSE("GPL"); | |||
| 50 | 50 | ||
| 51 | static bool wmi_requires_smbios_request; | 51 | static bool wmi_requires_smbios_request; |
| 52 | 52 | ||
| 53 | MODULE_ALIAS("wmi:"DELL_EVENT_GUID); | ||
| 54 | |||
| 55 | struct dell_wmi_priv { | 53 | struct dell_wmi_priv { |
| 56 | struct input_dev *input_dev; | 54 | struct input_dev *input_dev; |
| 57 | u32 interface_version; | 55 | u32 interface_version; |
| @@ -267,6 +265,9 @@ static const struct key_entry dell_wmi_keymap_type_0010[] = { | |||
| 267 | /* Fn-lock switched to multimedia keys */ | 265 | /* Fn-lock switched to multimedia keys */ |
| 268 | { KE_IGNORE, 0x1, { KEY_RESERVED } }, | 266 | { KE_IGNORE, 0x1, { KEY_RESERVED } }, |
| 269 | 267 | ||
| 268 | /* Keyboard backlight change notification */ | ||
| 269 | { KE_IGNORE, 0x3f, { KEY_RESERVED } }, | ||
| 270 | |||
| 270 | /* Mic mute */ | 271 | /* Mic mute */ |
| 271 | { KE_KEY, 0x150, { KEY_MICMUTE } }, | 272 | { KE_KEY, 0x150, { KEY_MICMUTE } }, |
| 272 | 273 | ||
| @@ -738,3 +739,5 @@ static void __exit dell_wmi_exit(void) | |||
| 738 | wmi_driver_unregister(&dell_wmi_driver); | 739 | wmi_driver_unregister(&dell_wmi_driver); |
| 739 | } | 740 | } |
| 740 | module_exit(dell_wmi_exit); | 741 | module_exit(dell_wmi_exit); |
| 742 | |||
| 743 | MODULE_DEVICE_TABLE(wmi, dell_wmi_id_table); | ||
diff --git a/drivers/platform/x86/dell_rbu.c b/drivers/platform/x86/dell_rbu.c index ccefa84f7305..031c68903583 100644 --- a/drivers/platform/x86/dell_rbu.c +++ b/drivers/platform/x86/dell_rbu.c | |||
| @@ -59,7 +59,6 @@ static struct _rbu_data { | |||
| 59 | unsigned long image_update_buffer_size; | 59 | unsigned long image_update_buffer_size; |
| 60 | unsigned long bios_image_size; | 60 | unsigned long bios_image_size; |
| 61 | int image_update_ordernum; | 61 | int image_update_ordernum; |
| 62 | int dma_alloc; | ||
| 63 | spinlock_t lock; | 62 | spinlock_t lock; |
| 64 | unsigned long packet_read_count; | 63 | unsigned long packet_read_count; |
| 65 | unsigned long num_packets; | 64 | unsigned long num_packets; |
| @@ -89,7 +88,6 @@ static struct packet_data packet_data_head; | |||
| 89 | 88 | ||
| 90 | static struct platform_device *rbu_device; | 89 | static struct platform_device *rbu_device; |
| 91 | static int context; | 90 | static int context; |
| 92 | static dma_addr_t dell_rbu_dmaaddr; | ||
| 93 | 91 | ||
| 94 | static void init_packet_head(void) | 92 | static void init_packet_head(void) |
| 95 | { | 93 | { |
| @@ -380,12 +378,8 @@ static void img_update_free(void) | |||
| 380 | */ | 378 | */ |
| 381 | memset(rbu_data.image_update_buffer, 0, | 379 | memset(rbu_data.image_update_buffer, 0, |
| 382 | rbu_data.image_update_buffer_size); | 380 | rbu_data.image_update_buffer_size); |
| 383 | if (rbu_data.dma_alloc == 1) | 381 | free_pages((unsigned long) rbu_data.image_update_buffer, |
| 384 | dma_free_coherent(NULL, rbu_data.bios_image_size, | 382 | rbu_data.image_update_ordernum); |
| 385 | rbu_data.image_update_buffer, dell_rbu_dmaaddr); | ||
| 386 | else | ||
| 387 | free_pages((unsigned long) rbu_data.image_update_buffer, | ||
| 388 | rbu_data.image_update_ordernum); | ||
| 389 | 383 | ||
| 390 | /* | 384 | /* |
| 391 | * Re-initialize the rbu_data variables after a free | 385 | * Re-initialize the rbu_data variables after a free |
| @@ -394,7 +388,6 @@ static void img_update_free(void) | |||
| 394 | rbu_data.image_update_buffer = NULL; | 388 | rbu_data.image_update_buffer = NULL; |
| 395 | rbu_data.image_update_buffer_size = 0; | 389 | rbu_data.image_update_buffer_size = 0; |
| 396 | rbu_data.bios_image_size = 0; | 390 | rbu_data.bios_image_size = 0; |
| 397 | rbu_data.dma_alloc = 0; | ||
| 398 | } | 391 | } |
| 399 | 392 | ||
| 400 | /* | 393 | /* |
| @@ -410,10 +403,8 @@ static void img_update_free(void) | |||
| 410 | static int img_update_realloc(unsigned long size) | 403 | static int img_update_realloc(unsigned long size) |
| 411 | { | 404 | { |
| 412 | unsigned char *image_update_buffer = NULL; | 405 | unsigned char *image_update_buffer = NULL; |
| 413 | unsigned long rc; | ||
| 414 | unsigned long img_buf_phys_addr; | 406 | unsigned long img_buf_phys_addr; |
| 415 | int ordernum; | 407 | int ordernum; |
| 416 | int dma_alloc = 0; | ||
| 417 | 408 | ||
| 418 | /* | 409 | /* |
| 419 | * check if the buffer of sufficient size has been | 410 | * check if the buffer of sufficient size has been |
| @@ -444,36 +435,23 @@ static int img_update_realloc(unsigned long size) | |||
| 444 | 435 | ||
| 445 | ordernum = get_order(size); | 436 | ordernum = get_order(size); |
| 446 | image_update_buffer = | 437 | image_update_buffer = |
| 447 | (unsigned char *) __get_free_pages(GFP_KERNEL, ordernum); | 438 | (unsigned char *)__get_free_pages(GFP_DMA32, ordernum); |
| 448 | |||
| 449 | img_buf_phys_addr = | ||
| 450 | (unsigned long) virt_to_phys(image_update_buffer); | ||
| 451 | |||
| 452 | if (img_buf_phys_addr > BIOS_SCAN_LIMIT) { | ||
| 453 | free_pages((unsigned long) image_update_buffer, ordernum); | ||
| 454 | ordernum = -1; | ||
| 455 | image_update_buffer = dma_alloc_coherent(NULL, size, | ||
| 456 | &dell_rbu_dmaaddr, GFP_KERNEL); | ||
| 457 | dma_alloc = 1; | ||
| 458 | } | ||
| 459 | |||
| 460 | spin_lock(&rbu_data.lock); | 439 | spin_lock(&rbu_data.lock); |
| 461 | 440 | if (!image_update_buffer) { | |
| 462 | if (image_update_buffer != NULL) { | ||
| 463 | rbu_data.image_update_buffer = image_update_buffer; | ||
| 464 | rbu_data.image_update_buffer_size = size; | ||
| 465 | rbu_data.bios_image_size = | ||
| 466 | rbu_data.image_update_buffer_size; | ||
| 467 | rbu_data.image_update_ordernum = ordernum; | ||
| 468 | rbu_data.dma_alloc = dma_alloc; | ||
| 469 | rc = 0; | ||
| 470 | } else { | ||
| 471 | pr_debug("Not enough memory for image update:" | 441 | pr_debug("Not enough memory for image update:" |
| 472 | "size = %ld\n", size); | 442 | "size = %ld\n", size); |
| 473 | rc = -ENOMEM; | 443 | return -ENOMEM; |
| 474 | } | 444 | } |
| 475 | 445 | ||
| 476 | return rc; | 446 | img_buf_phys_addr = (unsigned long)virt_to_phys(image_update_buffer); |
| 447 | if (WARN_ON_ONCE(img_buf_phys_addr > BIOS_SCAN_LIMIT)) | ||
| 448 | return -EINVAL; /* can't happen per definition */ | ||
| 449 | |||
| 450 | rbu_data.image_update_buffer = image_update_buffer; | ||
| 451 | rbu_data.image_update_buffer_size = size; | ||
| 452 | rbu_data.bios_image_size = rbu_data.image_update_buffer_size; | ||
| 453 | rbu_data.image_update_ordernum = ordernum; | ||
| 454 | return 0; | ||
| 477 | } | 455 | } |
| 478 | 456 | ||
| 479 | static ssize_t read_packet_data(char *buffer, loff_t pos, size_t count) | 457 | static ssize_t read_packet_data(char *buffer, loff_t pos, size_t count) |
diff --git a/drivers/platform/x86/huawei-wmi.c b/drivers/platform/x86/huawei-wmi.c index 59872f87b741..52fcac5b393a 100644 --- a/drivers/platform/x86/huawei-wmi.c +++ b/drivers/platform/x86/huawei-wmi.c | |||
| @@ -201,8 +201,7 @@ static struct wmi_driver huawei_wmi_driver = { | |||
| 201 | 201 | ||
| 202 | module_wmi_driver(huawei_wmi_driver); | 202 | module_wmi_driver(huawei_wmi_driver); |
| 203 | 203 | ||
| 204 | MODULE_ALIAS("wmi:"WMI0_EVENT_GUID); | 204 | MODULE_DEVICE_TABLE(wmi, huawei_wmi_id_table); |
| 205 | MODULE_ALIAS("wmi:"AMW0_EVENT_GUID); | ||
| 206 | MODULE_AUTHOR("Ayman Bagabas <ayman.bagabas@gmail.com>"); | 205 | MODULE_AUTHOR("Ayman Bagabas <ayman.bagabas@gmail.com>"); |
| 207 | MODULE_DESCRIPTION("Huawei WMI hotkeys"); | 206 | MODULE_DESCRIPTION("Huawei WMI hotkeys"); |
| 208 | MODULE_LICENSE("GPL v2"); | 207 | MODULE_LICENSE("GPL v2"); |
diff --git a/drivers/platform/x86/i2c-multi-instantiate.c b/drivers/platform/x86/i2c-multi-instantiate.c index 3d893e0ac250..197d8a192721 100644 --- a/drivers/platform/x86/i2c-multi-instantiate.c +++ b/drivers/platform/x86/i2c-multi-instantiate.c | |||
| @@ -159,6 +159,14 @@ static const struct i2c_inst_data bsg1160_data[] = { | |||
| 159 | {} | 159 | {} |
| 160 | }; | 160 | }; |
| 161 | 161 | ||
| 162 | static const struct i2c_inst_data bsg2150_data[] = { | ||
| 163 | { "bmc150_accel", IRQ_RESOURCE_GPIO, 0 }, | ||
| 164 | { "bmc150_magn" }, | ||
| 165 | /* The resources describe a 3th client, but it is not really there. */ | ||
| 166 | { "bsg2150_dummy_dev" }, | ||
| 167 | {} | ||
| 168 | }; | ||
| 169 | |||
| 162 | static const struct i2c_inst_data int3515_data[] = { | 170 | static const struct i2c_inst_data int3515_data[] = { |
| 163 | { "tps6598x", IRQ_RESOURCE_APIC, 0 }, | 171 | { "tps6598x", IRQ_RESOURCE_APIC, 0 }, |
| 164 | { "tps6598x", IRQ_RESOURCE_APIC, 1 }, | 172 | { "tps6598x", IRQ_RESOURCE_APIC, 1 }, |
| @@ -173,6 +181,7 @@ static const struct i2c_inst_data int3515_data[] = { | |||
| 173 | */ | 181 | */ |
| 174 | static const struct acpi_device_id i2c_multi_inst_acpi_ids[] = { | 182 | static const struct acpi_device_id i2c_multi_inst_acpi_ids[] = { |
| 175 | { "BSG1160", (unsigned long)bsg1160_data }, | 183 | { "BSG1160", (unsigned long)bsg1160_data }, |
| 184 | { "BSG2150", (unsigned long)bsg2150_data }, | ||
| 176 | { "INT3515", (unsigned long)int3515_data }, | 185 | { "INT3515", (unsigned long)int3515_data }, |
| 177 | { } | 186 | { } |
| 178 | }; | 187 | }; |
diff --git a/drivers/platform/x86/ideapad-laptop.c b/drivers/platform/x86/ideapad-laptop.c index 1589dffab9fa..c53ae86b59c7 100644 --- a/drivers/platform/x86/ideapad-laptop.c +++ b/drivers/platform/x86/ideapad-laptop.c | |||
| @@ -989,7 +989,7 @@ static const struct dmi_system_id no_hw_rfkill_list[] = { | |||
| 989 | .ident = "Lenovo RESCUER R720-15IKBN", | 989 | .ident = "Lenovo RESCUER R720-15IKBN", |
| 990 | .matches = { | 990 | .matches = { |
| 991 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | 991 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), |
| 992 | DMI_MATCH(DMI_BOARD_NAME, "80WW"), | 992 | DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo R720-15IKBN"), |
| 993 | }, | 993 | }, |
| 994 | }, | 994 | }, |
| 995 | { | 995 | { |
| @@ -1091,6 +1091,27 @@ static const struct dmi_system_id no_hw_rfkill_list[] = { | |||
| 1091 | }, | 1091 | }, |
| 1092 | }, | 1092 | }, |
| 1093 | { | 1093 | { |
| 1094 | .ident = "Lenovo ideapad 330-15ICH", | ||
| 1095 | .matches = { | ||
| 1096 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
| 1097 | DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo ideapad 330-15ICH"), | ||
| 1098 | }, | ||
| 1099 | }, | ||
| 1100 | { | ||
| 1101 | .ident = "Lenovo ideapad 530S-14ARR", | ||
| 1102 | .matches = { | ||
| 1103 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
| 1104 | DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo ideapad 530S-14ARR"), | ||
| 1105 | }, | ||
| 1106 | }, | ||
| 1107 | { | ||
| 1108 | .ident = "Lenovo ideapad S130-14IGM", | ||
| 1109 | .matches = { | ||
| 1110 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
| 1111 | DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo ideapad S130-14IGM"), | ||
| 1112 | }, | ||
| 1113 | }, | ||
| 1114 | { | ||
| 1094 | .ident = "Lenovo ideapad Y700-14ISK", | 1115 | .ident = "Lenovo ideapad Y700-14ISK", |
| 1095 | .matches = { | 1116 | .matches = { |
| 1096 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | 1117 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), |
| @@ -1154,6 +1175,13 @@ static const struct dmi_system_id no_hw_rfkill_list[] = { | |||
| 1154 | }, | 1175 | }, |
| 1155 | }, | 1176 | }, |
| 1156 | { | 1177 | { |
| 1178 | .ident = "Lenovo Legion Y530-15ICH-1060", | ||
| 1179 | .matches = { | ||
| 1180 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
| 1181 | DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo Legion Y530-15ICH-1060"), | ||
| 1182 | }, | ||
| 1183 | }, | ||
| 1184 | { | ||
| 1157 | .ident = "Lenovo Legion Y720-15IKB", | 1185 | .ident = "Lenovo Legion Y720-15IKB", |
| 1158 | .matches = { | 1186 | .matches = { |
| 1159 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | 1187 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), |
| @@ -1245,6 +1273,13 @@ static const struct dmi_system_id no_hw_rfkill_list[] = { | |||
| 1245 | }, | 1273 | }, |
| 1246 | }, | 1274 | }, |
| 1247 | { | 1275 | { |
| 1276 | .ident = "Lenovo YOGA C930-13IKB", | ||
| 1277 | .matches = { | ||
| 1278 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
| 1279 | DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo YOGA C930-13IKB"), | ||
| 1280 | }, | ||
| 1281 | }, | ||
| 1282 | { | ||
| 1248 | .ident = "Lenovo Zhaoyang E42-80", | 1283 | .ident = "Lenovo Zhaoyang E42-80", |
| 1249 | .matches = { | 1284 | .matches = { |
| 1250 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | 1285 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), |
diff --git a/drivers/platform/x86/intel-hid.c b/drivers/platform/x86/intel-hid.c index e28bcf61b126..bc0d55a59015 100644 --- a/drivers/platform/x86/intel-hid.c +++ b/drivers/platform/x86/intel-hid.c | |||
| @@ -363,7 +363,7 @@ wakeup: | |||
| 363 | * the 5-button array, but still send notifies with power button | 363 | * the 5-button array, but still send notifies with power button |
| 364 | * event code to this device object on power button actions. | 364 | * event code to this device object on power button actions. |
| 365 | * | 365 | * |
| 366 | * Report the power button press; catch and ignore the button release. | 366 | * Report the power button press and release. |
| 367 | */ | 367 | */ |
| 368 | if (!priv->array) { | 368 | if (!priv->array) { |
| 369 | if (event == 0xce) { | 369 | if (event == 0xce) { |
| @@ -372,8 +372,11 @@ wakeup: | |||
| 372 | return; | 372 | return; |
| 373 | } | 373 | } |
| 374 | 374 | ||
| 375 | if (event == 0xcf) | 375 | if (event == 0xcf) { |
| 376 | input_report_key(priv->input_dev, KEY_POWER, 0); | ||
| 377 | input_sync(priv->input_dev); | ||
| 376 | return; | 378 | return; |
| 379 | } | ||
| 377 | } | 380 | } |
| 378 | 381 | ||
| 379 | /* 0xC0 is for HID events, other values are for 5 button array */ | 382 | /* 0xC0 is for HID events, other values are for 5 button array */ |
diff --git a/drivers/platform/x86/intel-wmi-thunderbolt.c b/drivers/platform/x86/intel-wmi-thunderbolt.c index 9ded8e2af312..4dfa61434a76 100644 --- a/drivers/platform/x86/intel-wmi-thunderbolt.c +++ b/drivers/platform/x86/intel-wmi-thunderbolt.c | |||
| @@ -88,7 +88,7 @@ static struct wmi_driver intel_wmi_thunderbolt_driver = { | |||
| 88 | 88 | ||
| 89 | module_wmi_driver(intel_wmi_thunderbolt_driver); | 89 | module_wmi_driver(intel_wmi_thunderbolt_driver); |
| 90 | 90 | ||
| 91 | MODULE_ALIAS("wmi:" INTEL_WMI_THUNDERBOLT_GUID); | 91 | MODULE_DEVICE_TABLE(wmi, intel_wmi_thunderbolt_id_table); |
| 92 | MODULE_AUTHOR("Mario Limonciello <mario.limonciello@dell.com>"); | 92 | MODULE_AUTHOR("Mario Limonciello <mario.limonciello@dell.com>"); |
| 93 | MODULE_DESCRIPTION("Intel WMI Thunderbolt force power driver"); | 93 | MODULE_DESCRIPTION("Intel WMI Thunderbolt force power driver"); |
| 94 | MODULE_LICENSE("GPL v2"); | 94 | MODULE_LICENSE("GPL v2"); |
diff --git a/drivers/platform/x86/intel_int0002_vgpio.c b/drivers/platform/x86/intel_int0002_vgpio.c index 4b8f7305fc8a..1694a9aec77c 100644 --- a/drivers/platform/x86/intel_int0002_vgpio.c +++ b/drivers/platform/x86/intel_int0002_vgpio.c | |||
| @@ -51,11 +51,14 @@ | |||
| 51 | #define GPE0A_STS_PORT 0x420 | 51 | #define GPE0A_STS_PORT 0x420 |
| 52 | #define GPE0A_EN_PORT 0x428 | 52 | #define GPE0A_EN_PORT 0x428 |
| 53 | 53 | ||
| 54 | #define ICPU(model) { X86_VENDOR_INTEL, 6, model, X86_FEATURE_ANY, } | 54 | #define BAYTRAIL 0x01 |
| 55 | #define CHERRYTRAIL 0x02 | ||
| 56 | |||
| 57 | #define ICPU(model, data) { X86_VENDOR_INTEL, 6, model, X86_FEATURE_ANY, data } | ||
| 55 | 58 | ||
| 56 | static const struct x86_cpu_id int0002_cpu_ids[] = { | 59 | static const struct x86_cpu_id int0002_cpu_ids[] = { |
| 57 | ICPU(INTEL_FAM6_ATOM_SILVERMONT), /* Valleyview, Bay Trail */ | 60 | ICPU(INTEL_FAM6_ATOM_SILVERMONT, BAYTRAIL), /* Valleyview, Bay Trail */ |
| 58 | ICPU(INTEL_FAM6_ATOM_AIRMONT), /* Braswell, Cherry Trail */ | 61 | ICPU(INTEL_FAM6_ATOM_AIRMONT, CHERRYTRAIL), /* Braswell, Cherry Trail */ |
| 59 | {} | 62 | {} |
| 60 | }; | 63 | }; |
| 61 | 64 | ||
| @@ -135,7 +138,7 @@ static irqreturn_t int0002_irq(int irq, void *data) | |||
| 135 | return IRQ_HANDLED; | 138 | return IRQ_HANDLED; |
| 136 | } | 139 | } |
| 137 | 140 | ||
| 138 | static struct irq_chip int0002_irqchip = { | 141 | static struct irq_chip int0002_byt_irqchip = { |
| 139 | .name = DRV_NAME, | 142 | .name = DRV_NAME, |
| 140 | .irq_ack = int0002_irq_ack, | 143 | .irq_ack = int0002_irq_ack, |
| 141 | .irq_mask = int0002_irq_mask, | 144 | .irq_mask = int0002_irq_mask, |
| @@ -143,10 +146,22 @@ static struct irq_chip int0002_irqchip = { | |||
| 143 | .irq_set_wake = int0002_irq_set_wake, | 146 | .irq_set_wake = int0002_irq_set_wake, |
| 144 | }; | 147 | }; |
| 145 | 148 | ||
| 149 | static struct irq_chip int0002_cht_irqchip = { | ||
| 150 | .name = DRV_NAME, | ||
| 151 | .irq_ack = int0002_irq_ack, | ||
| 152 | .irq_mask = int0002_irq_mask, | ||
| 153 | .irq_unmask = int0002_irq_unmask, | ||
| 154 | /* | ||
| 155 | * No set_wake, on CHT the IRQ is typically shared with the ACPI SCI | ||
| 156 | * and we don't want to mess with the ACPI SCI irq settings. | ||
| 157 | */ | ||
| 158 | }; | ||
| 159 | |||
| 146 | static int int0002_probe(struct platform_device *pdev) | 160 | static int int0002_probe(struct platform_device *pdev) |
| 147 | { | 161 | { |
| 148 | struct device *dev = &pdev->dev; | 162 | struct device *dev = &pdev->dev; |
| 149 | const struct x86_cpu_id *cpu_id; | 163 | const struct x86_cpu_id *cpu_id; |
| 164 | struct irq_chip *irq_chip; | ||
| 150 | struct gpio_chip *chip; | 165 | struct gpio_chip *chip; |
| 151 | int irq, ret; | 166 | int irq, ret; |
| 152 | 167 | ||
| @@ -195,14 +210,19 @@ static int int0002_probe(struct platform_device *pdev) | |||
| 195 | return ret; | 210 | return ret; |
| 196 | } | 211 | } |
| 197 | 212 | ||
| 198 | ret = gpiochip_irqchip_add(chip, &int0002_irqchip, 0, handle_edge_irq, | 213 | if (cpu_id->driver_data == BAYTRAIL) |
| 214 | irq_chip = &int0002_byt_irqchip; | ||
| 215 | else | ||
| 216 | irq_chip = &int0002_cht_irqchip; | ||
| 217 | |||
| 218 | ret = gpiochip_irqchip_add(chip, irq_chip, 0, handle_edge_irq, | ||
| 199 | IRQ_TYPE_NONE); | 219 | IRQ_TYPE_NONE); |
| 200 | if (ret) { | 220 | if (ret) { |
| 201 | dev_err(dev, "Error adding irqchip: %d\n", ret); | 221 | dev_err(dev, "Error adding irqchip: %d\n", ret); |
| 202 | return ret; | 222 | return ret; |
| 203 | } | 223 | } |
| 204 | 224 | ||
| 205 | gpiochip_set_chained_irqchip(chip, &int0002_irqchip, irq, NULL); | 225 | gpiochip_set_chained_irqchip(chip, irq_chip, irq, NULL); |
| 206 | 226 | ||
| 207 | return 0; | 227 | return 0; |
| 208 | } | 228 | } |
diff --git a/drivers/platform/x86/intel_pmc_core.c b/drivers/platform/x86/intel_pmc_core.c index 22dbf115782e..f2c621b55f49 100644 --- a/drivers/platform/x86/intel_pmc_core.c +++ b/drivers/platform/x86/intel_pmc_core.c | |||
| @@ -15,6 +15,7 @@ | |||
| 15 | #include <linux/bitfield.h> | 15 | #include <linux/bitfield.h> |
| 16 | #include <linux/debugfs.h> | 16 | #include <linux/debugfs.h> |
| 17 | #include <linux/delay.h> | 17 | #include <linux/delay.h> |
| 18 | #include <linux/dmi.h> | ||
| 18 | #include <linux/io.h> | 19 | #include <linux/io.h> |
| 19 | #include <linux/module.h> | 20 | #include <linux/module.h> |
| 20 | #include <linux/pci.h> | 21 | #include <linux/pci.h> |
| @@ -22,14 +23,24 @@ | |||
| 22 | 23 | ||
| 23 | #include <asm/cpu_device_id.h> | 24 | #include <asm/cpu_device_id.h> |
| 24 | #include <asm/intel-family.h> | 25 | #include <asm/intel-family.h> |
| 26 | #include <asm/msr.h> | ||
| 25 | 27 | ||
| 26 | #include "intel_pmc_core.h" | 28 | #include "intel_pmc_core.h" |
| 27 | 29 | ||
| 28 | #define ICPU(model, data) \ | ||
| 29 | { X86_VENDOR_INTEL, 6, model, X86_FEATURE_MWAIT, (kernel_ulong_t)data } | ||
| 30 | |||
| 31 | static struct pmc_dev pmc; | 30 | static struct pmc_dev pmc; |
| 32 | 31 | ||
| 32 | /* PKGC MSRs are common across Intel Core SoCs */ | ||
| 33 | static const struct pmc_bit_map msr_map[] = { | ||
| 34 | {"Package C2", MSR_PKG_C2_RESIDENCY}, | ||
| 35 | {"Package C3", MSR_PKG_C3_RESIDENCY}, | ||
| 36 | {"Package C6", MSR_PKG_C6_RESIDENCY}, | ||
| 37 | {"Package C7", MSR_PKG_C7_RESIDENCY}, | ||
| 38 | {"Package C8", MSR_PKG_C8_RESIDENCY}, | ||
| 39 | {"Package C9", MSR_PKG_C9_RESIDENCY}, | ||
| 40 | {"Package C10", MSR_PKG_C10_RESIDENCY}, | ||
| 41 | {} | ||
| 42 | }; | ||
| 43 | |||
| 33 | static const struct pmc_bit_map spt_pll_map[] = { | 44 | static const struct pmc_bit_map spt_pll_map[] = { |
| 34 | {"MIPI PLL", SPT_PMC_BIT_MPHY_CMN_LANE0}, | 45 | {"MIPI PLL", SPT_PMC_BIT_MPHY_CMN_LANE0}, |
| 35 | {"GEN2 USB2PCIE2 PLL", SPT_PMC_BIT_MPHY_CMN_LANE1}, | 46 | {"GEN2 USB2PCIE2 PLL", SPT_PMC_BIT_MPHY_CMN_LANE1}, |
| @@ -108,6 +119,7 @@ static const struct pmc_bit_map spt_ltr_show_map[] = { | |||
| 108 | {"SATA", SPT_PMC_LTR_SATA}, | 119 | {"SATA", SPT_PMC_LTR_SATA}, |
| 109 | {"GIGABIT_ETHERNET", SPT_PMC_LTR_GBE}, | 120 | {"GIGABIT_ETHERNET", SPT_PMC_LTR_GBE}, |
| 110 | {"XHCI", SPT_PMC_LTR_XHCI}, | 121 | {"XHCI", SPT_PMC_LTR_XHCI}, |
| 122 | {"Reserved", SPT_PMC_LTR_RESERVED}, | ||
| 111 | {"ME", SPT_PMC_LTR_ME}, | 123 | {"ME", SPT_PMC_LTR_ME}, |
| 112 | /* EVA is Enterprise Value Add, doesn't really exist on PCH */ | 124 | /* EVA is Enterprise Value Add, doesn't really exist on PCH */ |
| 113 | {"EVA", SPT_PMC_LTR_EVA}, | 125 | {"EVA", SPT_PMC_LTR_EVA}, |
| @@ -131,6 +143,7 @@ static const struct pmc_reg_map spt_reg_map = { | |||
| 131 | .mphy_sts = spt_mphy_map, | 143 | .mphy_sts = spt_mphy_map, |
| 132 | .pll_sts = spt_pll_map, | 144 | .pll_sts = spt_pll_map, |
| 133 | .ltr_show_sts = spt_ltr_show_map, | 145 | .ltr_show_sts = spt_ltr_show_map, |
| 146 | .msr_sts = msr_map, | ||
| 134 | .slp_s0_offset = SPT_PMC_SLP_S0_RES_COUNTER_OFFSET, | 147 | .slp_s0_offset = SPT_PMC_SLP_S0_RES_COUNTER_OFFSET, |
| 135 | .ltr_ignore_offset = SPT_PMC_LTR_IGNORE_OFFSET, | 148 | .ltr_ignore_offset = SPT_PMC_LTR_IGNORE_OFFSET, |
| 136 | .regmap_length = SPT_PMC_MMIO_REG_LEN, | 149 | .regmap_length = SPT_PMC_MMIO_REG_LEN, |
| @@ -139,6 +152,7 @@ static const struct pmc_reg_map spt_reg_map = { | |||
| 139 | .pm_cfg_offset = SPT_PMC_PM_CFG_OFFSET, | 152 | .pm_cfg_offset = SPT_PMC_PM_CFG_OFFSET, |
| 140 | .pm_read_disable_bit = SPT_PMC_READ_DISABLE_BIT, | 153 | .pm_read_disable_bit = SPT_PMC_READ_DISABLE_BIT, |
| 141 | .ltr_ignore_max = SPT_NUM_IP_IGN_ALLOWED, | 154 | .ltr_ignore_max = SPT_NUM_IP_IGN_ALLOWED, |
| 155 | .pm_vric1_offset = SPT_PMC_VRIC1_OFFSET, | ||
| 142 | }; | 156 | }; |
| 143 | 157 | ||
| 144 | /* Cannonlake: PGD PFET Enable Ack Status Register(s) bitmap */ | 158 | /* Cannonlake: PGD PFET Enable Ack Status Register(s) bitmap */ |
| @@ -168,25 +182,26 @@ static const struct pmc_bit_map cnp_pfear_map[] = { | |||
| 168 | {"SDX", BIT(4)}, | 182 | {"SDX", BIT(4)}, |
| 169 | {"SPE", BIT(5)}, | 183 | {"SPE", BIT(5)}, |
| 170 | {"Fuse", BIT(6)}, | 184 | {"Fuse", BIT(6)}, |
| 171 | {"Res_23", BIT(7)}, | 185 | /* Reserved for Cannonlake but valid for Icelake */ |
| 186 | {"SBR8", BIT(7)}, | ||
| 172 | 187 | ||
| 173 | {"CSME_FSC", BIT(0)}, | 188 | {"CSME_FSC", BIT(0)}, |
| 174 | {"USB3_OTG", BIT(1)}, | 189 | {"USB3_OTG", BIT(1)}, |
| 175 | {"EXI", BIT(2)}, | 190 | {"EXI", BIT(2)}, |
| 176 | {"CSE", BIT(3)}, | 191 | {"CSE", BIT(3)}, |
| 177 | {"csme_kvm", BIT(4)}, | 192 | {"CSME_KVM", BIT(4)}, |
| 178 | {"csme_pmt", BIT(5)}, | 193 | {"CSME_PMT", BIT(5)}, |
| 179 | {"csme_clink", BIT(6)}, | 194 | {"CSME_CLINK", BIT(6)}, |
| 180 | {"csme_ptio", BIT(7)}, | 195 | {"CSME_PTIO", BIT(7)}, |
| 181 | 196 | ||
| 182 | {"csme_usbr", BIT(0)}, | 197 | {"CSME_USBR", BIT(0)}, |
| 183 | {"csme_susram", BIT(1)}, | 198 | {"CSME_SUSRAM", BIT(1)}, |
| 184 | {"csme_smt1", BIT(2)}, | 199 | {"CSME_SMT1", BIT(2)}, |
| 185 | {"CSME_SMT4", BIT(3)}, | 200 | {"CSME_SMT4", BIT(3)}, |
| 186 | {"csme_sms2", BIT(4)}, | 201 | {"CSME_SMS2", BIT(4)}, |
| 187 | {"csme_sms1", BIT(5)}, | 202 | {"CSME_SMS1", BIT(5)}, |
| 188 | {"csme_rtc", BIT(6)}, | 203 | {"CSME_RTC", BIT(6)}, |
| 189 | {"csme_psf", BIT(7)}, | 204 | {"CSME_PSF", BIT(7)}, |
| 190 | 205 | ||
| 191 | {"SBR0", BIT(0)}, | 206 | {"SBR0", BIT(0)}, |
| 192 | {"SBR1", BIT(1)}, | 207 | {"SBR1", BIT(1)}, |
| @@ -203,7 +218,7 @@ static const struct pmc_bit_map cnp_pfear_map[] = { | |||
| 203 | {"CNVI", BIT(3)}, | 218 | {"CNVI", BIT(3)}, |
| 204 | {"UFS0", BIT(4)}, | 219 | {"UFS0", BIT(4)}, |
| 205 | {"EMMC", BIT(5)}, | 220 | {"EMMC", BIT(5)}, |
| 206 | {"Res_6", BIT(6)}, | 221 | {"SPF", BIT(6)}, |
| 207 | {"SBR6", BIT(7)}, | 222 | {"SBR6", BIT(7)}, |
| 208 | 223 | ||
| 209 | {"SBR7", BIT(0)}, | 224 | {"SBR7", BIT(0)}, |
| @@ -211,6 +226,20 @@ static const struct pmc_bit_map cnp_pfear_map[] = { | |||
| 211 | {"HDA_PGD4", BIT(2)}, | 226 | {"HDA_PGD4", BIT(2)}, |
| 212 | {"HDA_PGD5", BIT(3)}, | 227 | {"HDA_PGD5", BIT(3)}, |
| 213 | {"HDA_PGD6", BIT(4)}, | 228 | {"HDA_PGD6", BIT(4)}, |
| 229 | /* Reserved for Cannonlake but valid for Icelake */ | ||
| 230 | {"PSF6", BIT(5)}, | ||
| 231 | {"PSF7", BIT(6)}, | ||
| 232 | {"PSF8", BIT(7)}, | ||
| 233 | |||
| 234 | /* Icelake generation onwards only */ | ||
| 235 | {"RES_65", BIT(0)}, | ||
| 236 | {"RES_66", BIT(1)}, | ||
| 237 | {"RES_67", BIT(2)}, | ||
| 238 | {"TAM", BIT(3)}, | ||
| 239 | {"GBETSN", BIT(4)}, | ||
| 240 | {"TBTLSX", BIT(5)}, | ||
| 241 | {"RES_71", BIT(6)}, | ||
| 242 | {"RES_72", BIT(7)}, | ||
| 214 | {} | 243 | {} |
| 215 | }; | 244 | }; |
| 216 | 245 | ||
| @@ -276,6 +305,7 @@ static const struct pmc_bit_map cnp_ltr_show_map[] = { | |||
| 276 | {"SATA", CNP_PMC_LTR_SATA}, | 305 | {"SATA", CNP_PMC_LTR_SATA}, |
| 277 | {"GIGABIT_ETHERNET", CNP_PMC_LTR_GBE}, | 306 | {"GIGABIT_ETHERNET", CNP_PMC_LTR_GBE}, |
| 278 | {"XHCI", CNP_PMC_LTR_XHCI}, | 307 | {"XHCI", CNP_PMC_LTR_XHCI}, |
| 308 | {"Reserved", CNP_PMC_LTR_RESERVED}, | ||
| 279 | {"ME", CNP_PMC_LTR_ME}, | 309 | {"ME", CNP_PMC_LTR_ME}, |
| 280 | /* EVA is Enterprise Value Add, doesn't really exist on PCH */ | 310 | /* EVA is Enterprise Value Add, doesn't really exist on PCH */ |
| 281 | {"EVA", CNP_PMC_LTR_EVA}, | 311 | {"EVA", CNP_PMC_LTR_EVA}, |
| @@ -291,6 +321,8 @@ static const struct pmc_bit_map cnp_ltr_show_map[] = { | |||
| 291 | {"ISH", CNP_PMC_LTR_ISH}, | 321 | {"ISH", CNP_PMC_LTR_ISH}, |
| 292 | {"UFSX2", CNP_PMC_LTR_UFSX2}, | 322 | {"UFSX2", CNP_PMC_LTR_UFSX2}, |
| 293 | {"EMMC", CNP_PMC_LTR_EMMC}, | 323 | {"EMMC", CNP_PMC_LTR_EMMC}, |
| 324 | /* Reserved for Cannonlake but valid for Icelake */ | ||
| 325 | {"WIGIG", ICL_PMC_LTR_WIGIG}, | ||
| 294 | /* Below two cannot be used for LTR_IGNORE */ | 326 | /* Below two cannot be used for LTR_IGNORE */ |
| 295 | {"CURRENT_PLATFORM", CNP_PMC_LTR_CUR_PLT}, | 327 | {"CURRENT_PLATFORM", CNP_PMC_LTR_CUR_PLT}, |
| 296 | {"AGGREGATED_SYSTEM", CNP_PMC_LTR_CUR_ASLT}, | 328 | {"AGGREGATED_SYSTEM", CNP_PMC_LTR_CUR_ASLT}, |
| @@ -302,6 +334,7 @@ static const struct pmc_reg_map cnp_reg_map = { | |||
| 302 | .slp_s0_offset = CNP_PMC_SLP_S0_RES_COUNTER_OFFSET, | 334 | .slp_s0_offset = CNP_PMC_SLP_S0_RES_COUNTER_OFFSET, |
| 303 | .slps0_dbg_maps = cnp_slps0_dbg_maps, | 335 | .slps0_dbg_maps = cnp_slps0_dbg_maps, |
| 304 | .ltr_show_sts = cnp_ltr_show_map, | 336 | .ltr_show_sts = cnp_ltr_show_map, |
| 337 | .msr_sts = msr_map, | ||
| 305 | .slps0_dbg_offset = CNP_PMC_SLPS0_DBG_OFFSET, | 338 | .slps0_dbg_offset = CNP_PMC_SLPS0_DBG_OFFSET, |
| 306 | .ltr_ignore_offset = CNP_PMC_LTR_IGNORE_OFFSET, | 339 | .ltr_ignore_offset = CNP_PMC_LTR_IGNORE_OFFSET, |
| 307 | .regmap_length = CNP_PMC_MMIO_REG_LEN, | 340 | .regmap_length = CNP_PMC_MMIO_REG_LEN, |
| @@ -312,6 +345,22 @@ static const struct pmc_reg_map cnp_reg_map = { | |||
| 312 | .ltr_ignore_max = CNP_NUM_IP_IGN_ALLOWED, | 345 | .ltr_ignore_max = CNP_NUM_IP_IGN_ALLOWED, |
| 313 | }; | 346 | }; |
| 314 | 347 | ||
| 348 | static const struct pmc_reg_map icl_reg_map = { | ||
| 349 | .pfear_sts = cnp_pfear_map, | ||
| 350 | .slp_s0_offset = CNP_PMC_SLP_S0_RES_COUNTER_OFFSET, | ||
| 351 | .slps0_dbg_maps = cnp_slps0_dbg_maps, | ||
| 352 | .ltr_show_sts = cnp_ltr_show_map, | ||
| 353 | .msr_sts = msr_map, | ||
| 354 | .slps0_dbg_offset = CNP_PMC_SLPS0_DBG_OFFSET, | ||
| 355 | .ltr_ignore_offset = CNP_PMC_LTR_IGNORE_OFFSET, | ||
| 356 | .regmap_length = CNP_PMC_MMIO_REG_LEN, | ||
| 357 | .ppfear0_offset = CNP_PMC_HOST_PPFEAR0A, | ||
| 358 | .ppfear_buckets = ICL_PPFEAR_NUM_ENTRIES, | ||
| 359 | .pm_cfg_offset = CNP_PMC_PM_CFG_OFFSET, | ||
| 360 | .pm_read_disable_bit = CNP_PMC_READ_DISABLE_BIT, | ||
| 361 | .ltr_ignore_max = ICL_NUM_IP_IGN_ALLOWED, | ||
| 362 | }; | ||
| 363 | |||
| 315 | static inline u8 pmc_core_reg_read_byte(struct pmc_dev *pmcdev, int offset) | 364 | static inline u8 pmc_core_reg_read_byte(struct pmc_dev *pmcdev, int offset) |
| 316 | { | 365 | { |
| 317 | return readb(pmcdev->regbase + offset); | 366 | return readb(pmcdev->regbase + offset); |
| @@ -328,9 +377,9 @@ static inline void pmc_core_reg_write(struct pmc_dev *pmcdev, int | |||
| 328 | writel(val, pmcdev->regbase + reg_offset); | 377 | writel(val, pmcdev->regbase + reg_offset); |
| 329 | } | 378 | } |
| 330 | 379 | ||
| 331 | static inline u32 pmc_core_adjust_slp_s0_step(u32 value) | 380 | static inline u64 pmc_core_adjust_slp_s0_step(u32 value) |
| 332 | { | 381 | { |
| 333 | return value * SPT_PMC_SLP_S0_RES_COUNTER_STEP; | 382 | return (u64)value * SPT_PMC_SLP_S0_RES_COUNTER_STEP; |
| 334 | } | 383 | } |
| 335 | 384 | ||
| 336 | static int pmc_core_dev_state_get(void *data, u64 *val) | 385 | static int pmc_core_dev_state_get(void *data, u64 *val) |
| @@ -380,7 +429,8 @@ static int pmc_core_ppfear_show(struct seq_file *s, void *unused) | |||
| 380 | index < PPFEAR_MAX_NUM_ENTRIES; index++, iter++) | 429 | index < PPFEAR_MAX_NUM_ENTRIES; index++, iter++) |
| 381 | pf_regs[index] = pmc_core_reg_read_byte(pmcdev, iter); | 430 | pf_regs[index] = pmc_core_reg_read_byte(pmcdev, iter); |
| 382 | 431 | ||
| 383 | for (index = 0; map[index].name; index++) | 432 | for (index = 0; map[index].name && |
| 433 | index < pmcdev->map->ppfear_buckets * 8; index++) | ||
| 384 | pmc_core_display_map(s, index, pf_regs[index / 8], map); | 434 | pmc_core_display_map(s, index, pf_regs[index / 8], map); |
| 385 | 435 | ||
| 386 | return 0; | 436 | return 0; |
| @@ -677,6 +727,25 @@ static int pmc_core_ltr_show(struct seq_file *s, void *unused) | |||
| 677 | } | 727 | } |
| 678 | DEFINE_SHOW_ATTRIBUTE(pmc_core_ltr); | 728 | DEFINE_SHOW_ATTRIBUTE(pmc_core_ltr); |
| 679 | 729 | ||
| 730 | static int pmc_core_pkgc_show(struct seq_file *s, void *unused) | ||
| 731 | { | ||
| 732 | struct pmc_dev *pmcdev = s->private; | ||
| 733 | const struct pmc_bit_map *map = pmcdev->map->msr_sts; | ||
| 734 | u64 pcstate_count; | ||
| 735 | int index; | ||
| 736 | |||
| 737 | for (index = 0; map[index].name ; index++) { | ||
| 738 | if (rdmsrl_safe(map[index].bit_mask, &pcstate_count)) | ||
| 739 | continue; | ||
| 740 | |||
| 741 | seq_printf(s, "%-8s : 0x%llx\n", map[index].name, | ||
| 742 | pcstate_count); | ||
| 743 | } | ||
| 744 | |||
| 745 | return 0; | ||
| 746 | } | ||
| 747 | DEFINE_SHOW_ATTRIBUTE(pmc_core_pkgc); | ||
| 748 | |||
| 680 | static void pmc_core_dbgfs_unregister(struct pmc_dev *pmcdev) | 749 | static void pmc_core_dbgfs_unregister(struct pmc_dev *pmcdev) |
| 681 | { | 750 | { |
| 682 | debugfs_remove_recursive(pmcdev->dbgfs_dir); | 751 | debugfs_remove_recursive(pmcdev->dbgfs_dir); |
| @@ -701,7 +770,10 @@ static int pmc_core_dbgfs_register(struct pmc_dev *pmcdev) | |||
| 701 | debugfs_create_file("ltr_ignore", 0644, dir, pmcdev, | 770 | debugfs_create_file("ltr_ignore", 0644, dir, pmcdev, |
| 702 | &pmc_core_ltr_ignore_ops); | 771 | &pmc_core_ltr_ignore_ops); |
| 703 | 772 | ||
| 704 | debugfs_create_file("ltr_show", 0644, dir, pmcdev, &pmc_core_ltr_fops); | 773 | debugfs_create_file("ltr_show", 0444, dir, pmcdev, &pmc_core_ltr_fops); |
| 774 | |||
| 775 | debugfs_create_file("package_cstate_show", 0444, dir, pmcdev, | ||
| 776 | &pmc_core_pkgc_fops); | ||
| 705 | 777 | ||
| 706 | if (pmcdev->map->pll_sts) | 778 | if (pmcdev->map->pll_sts) |
| 707 | debugfs_create_file("pll_status", 0444, dir, pmcdev, | 779 | debugfs_create_file("pll_status", 0444, dir, pmcdev, |
| @@ -735,11 +807,12 @@ static inline void pmc_core_dbgfs_unregister(struct pmc_dev *pmcdev) | |||
| 735 | #endif /* CONFIG_DEBUG_FS */ | 807 | #endif /* CONFIG_DEBUG_FS */ |
| 736 | 808 | ||
| 737 | static const struct x86_cpu_id intel_pmc_core_ids[] = { | 809 | static const struct x86_cpu_id intel_pmc_core_ids[] = { |
| 738 | ICPU(INTEL_FAM6_SKYLAKE_MOBILE, &spt_reg_map), | 810 | INTEL_CPU_FAM6(SKYLAKE_MOBILE, spt_reg_map), |
| 739 | ICPU(INTEL_FAM6_SKYLAKE_DESKTOP, &spt_reg_map), | 811 | INTEL_CPU_FAM6(SKYLAKE_DESKTOP, spt_reg_map), |
| 740 | ICPU(INTEL_FAM6_KABYLAKE_MOBILE, &spt_reg_map), | 812 | INTEL_CPU_FAM6(KABYLAKE_MOBILE, spt_reg_map), |
| 741 | ICPU(INTEL_FAM6_KABYLAKE_DESKTOP, &spt_reg_map), | 813 | INTEL_CPU_FAM6(KABYLAKE_DESKTOP, spt_reg_map), |
| 742 | ICPU(INTEL_FAM6_CANNONLAKE_MOBILE, &cnp_reg_map), | 814 | INTEL_CPU_FAM6(CANNONLAKE_MOBILE, cnp_reg_map), |
| 815 | INTEL_CPU_FAM6(ICELAKE_MOBILE, icl_reg_map), | ||
| 743 | {} | 816 | {} |
| 744 | }; | 817 | }; |
| 745 | 818 | ||
| @@ -750,6 +823,37 @@ static const struct pci_device_id pmc_pci_ids[] = { | |||
| 750 | { 0, }, | 823 | { 0, }, |
| 751 | }; | 824 | }; |
| 752 | 825 | ||
| 826 | /* | ||
| 827 | * This quirk can be used on those platforms where | ||
| 828 | * the platform BIOS enforces 24Mhx Crystal to shutdown | ||
| 829 | * before PMC can assert SLP_S0#. | ||
| 830 | */ | ||
| 831 | int quirk_xtal_ignore(const struct dmi_system_id *id) | ||
| 832 | { | ||
| 833 | struct pmc_dev *pmcdev = &pmc; | ||
| 834 | u32 value; | ||
| 835 | |||
| 836 | value = pmc_core_reg_read(pmcdev, pmcdev->map->pm_vric1_offset); | ||
| 837 | /* 24MHz Crystal Shutdown Qualification Disable */ | ||
| 838 | value |= SPT_PMC_VRIC1_XTALSDQDIS; | ||
| 839 | /* Low Voltage Mode Enable */ | ||
| 840 | value &= ~SPT_PMC_VRIC1_SLPS0LVEN; | ||
| 841 | pmc_core_reg_write(pmcdev, pmcdev->map->pm_vric1_offset, value); | ||
| 842 | return 0; | ||
| 843 | } | ||
| 844 | |||
| 845 | static const struct dmi_system_id pmc_core_dmi_table[] = { | ||
| 846 | { | ||
| 847 | .callback = quirk_xtal_ignore, | ||
| 848 | .ident = "HP Elite x2 1013 G3", | ||
| 849 | .matches = { | ||
| 850 | DMI_MATCH(DMI_SYS_VENDOR, "HP"), | ||
| 851 | DMI_MATCH(DMI_PRODUCT_NAME, "HP Elite x2 1013 G3"), | ||
| 852 | }, | ||
| 853 | }, | ||
| 854 | {} | ||
| 855 | }; | ||
| 856 | |||
| 753 | static int __init pmc_core_probe(void) | 857 | static int __init pmc_core_probe(void) |
| 754 | { | 858 | { |
| 755 | struct pmc_dev *pmcdev = &pmc; | 859 | struct pmc_dev *pmcdev = &pmc; |
| @@ -768,7 +872,7 @@ static int __init pmc_core_probe(void) | |||
| 768 | * Sunrisepoint PCH regmap can't be used. Use Cannonlake PCH regmap | 872 | * Sunrisepoint PCH regmap can't be used. Use Cannonlake PCH regmap |
| 769 | * in this case. | 873 | * in this case. |
| 770 | */ | 874 | */ |
| 771 | if (!pci_dev_present(pmc_pci_ids)) | 875 | if (pmcdev->map == &spt_reg_map && !pci_dev_present(pmc_pci_ids)) |
| 772 | pmcdev->map = &cnp_reg_map; | 876 | pmcdev->map = &cnp_reg_map; |
| 773 | 877 | ||
| 774 | if (lpit_read_residency_count_address(&slp_s0_addr)) | 878 | if (lpit_read_residency_count_address(&slp_s0_addr)) |
| @@ -791,6 +895,7 @@ static int __init pmc_core_probe(void) | |||
| 791 | return err; | 895 | return err; |
| 792 | } | 896 | } |
| 793 | 897 | ||
| 898 | dmi_check_system(pmc_core_dmi_table); | ||
| 794 | pr_info(" initialized\n"); | 899 | pr_info(" initialized\n"); |
| 795 | return 0; | 900 | return 0; |
| 796 | } | 901 | } |
diff --git a/drivers/platform/x86/intel_pmc_core.h b/drivers/platform/x86/intel_pmc_core.h index 89554cba5758..88d9c0653a5f 100644 --- a/drivers/platform/x86/intel_pmc_core.h +++ b/drivers/platform/x86/intel_pmc_core.h | |||
| @@ -25,6 +25,7 @@ | |||
| 25 | #define SPT_PMC_MTPMC_OFFSET 0x20 | 25 | #define SPT_PMC_MTPMC_OFFSET 0x20 |
| 26 | #define SPT_PMC_MFPMC_OFFSET 0x38 | 26 | #define SPT_PMC_MFPMC_OFFSET 0x38 |
| 27 | #define SPT_PMC_LTR_IGNORE_OFFSET 0x30C | 27 | #define SPT_PMC_LTR_IGNORE_OFFSET 0x30C |
| 28 | #define SPT_PMC_VRIC1_OFFSET 0x31c | ||
| 28 | #define SPT_PMC_MPHY_CORE_STS_0 0x1143 | 29 | #define SPT_PMC_MPHY_CORE_STS_0 0x1143 |
| 29 | #define SPT_PMC_MPHY_CORE_STS_1 0x1142 | 30 | #define SPT_PMC_MPHY_CORE_STS_1 0x1142 |
| 30 | #define SPT_PMC_MPHY_COM_STS_0 0x1155 | 31 | #define SPT_PMC_MPHY_COM_STS_0 0x1155 |
| @@ -32,7 +33,7 @@ | |||
| 32 | #define SPT_PMC_SLP_S0_RES_COUNTER_STEP 0x64 | 33 | #define SPT_PMC_SLP_S0_RES_COUNTER_STEP 0x64 |
| 33 | #define PMC_BASE_ADDR_MASK ~(SPT_PMC_MMIO_REG_LEN - 1) | 34 | #define PMC_BASE_ADDR_MASK ~(SPT_PMC_MMIO_REG_LEN - 1) |
| 34 | #define MTPMC_MASK 0xffff0000 | 35 | #define MTPMC_MASK 0xffff0000 |
| 35 | #define PPFEAR_MAX_NUM_ENTRIES 5 | 36 | #define PPFEAR_MAX_NUM_ENTRIES 12 |
| 36 | #define SPT_PPFEAR_NUM_ENTRIES 5 | 37 | #define SPT_PPFEAR_NUM_ENTRIES 5 |
| 37 | #define SPT_PMC_READ_DISABLE_BIT 0x16 | 38 | #define SPT_PMC_READ_DISABLE_BIT 0x16 |
| 38 | #define SPT_PMC_MSG_FULL_STS_BIT 0x18 | 39 | #define SPT_PMC_MSG_FULL_STS_BIT 0x18 |
| @@ -46,6 +47,7 @@ | |||
| 46 | #define SPT_PMC_LTR_SATA 0x368 | 47 | #define SPT_PMC_LTR_SATA 0x368 |
| 47 | #define SPT_PMC_LTR_GBE 0x36C | 48 | #define SPT_PMC_LTR_GBE 0x36C |
| 48 | #define SPT_PMC_LTR_XHCI 0x370 | 49 | #define SPT_PMC_LTR_XHCI 0x370 |
| 50 | #define SPT_PMC_LTR_RESERVED 0x374 | ||
| 49 | #define SPT_PMC_LTR_ME 0x378 | 51 | #define SPT_PMC_LTR_ME 0x378 |
| 50 | #define SPT_PMC_LTR_EVA 0x37C | 52 | #define SPT_PMC_LTR_EVA 0x37C |
| 51 | #define SPT_PMC_LTR_SPC 0x380 | 53 | #define SPT_PMC_LTR_SPC 0x380 |
| @@ -135,6 +137,9 @@ enum ppfear_regs { | |||
| 135 | #define SPT_PMC_BIT_MPHY_CMN_LANE2 BIT(2) | 137 | #define SPT_PMC_BIT_MPHY_CMN_LANE2 BIT(2) |
| 136 | #define SPT_PMC_BIT_MPHY_CMN_LANE3 BIT(3) | 138 | #define SPT_PMC_BIT_MPHY_CMN_LANE3 BIT(3) |
| 137 | 139 | ||
| 140 | #define SPT_PMC_VRIC1_SLPS0LVEN BIT(13) | ||
| 141 | #define SPT_PMC_VRIC1_XTALSDQDIS BIT(22) | ||
| 142 | |||
| 138 | /* Cannonlake Power Management Controller register offsets */ | 143 | /* Cannonlake Power Management Controller register offsets */ |
| 139 | #define CNP_PMC_SLPS0_DBG_OFFSET 0x10B4 | 144 | #define CNP_PMC_SLPS0_DBG_OFFSET 0x10B4 |
| 140 | #define CNP_PMC_PM_CFG_OFFSET 0x1818 | 145 | #define CNP_PMC_PM_CFG_OFFSET 0x1818 |
| @@ -156,6 +161,7 @@ enum ppfear_regs { | |||
| 156 | #define CNP_PMC_LTR_SATA 0x1B68 | 161 | #define CNP_PMC_LTR_SATA 0x1B68 |
| 157 | #define CNP_PMC_LTR_GBE 0x1B6C | 162 | #define CNP_PMC_LTR_GBE 0x1B6C |
| 158 | #define CNP_PMC_LTR_XHCI 0x1B70 | 163 | #define CNP_PMC_LTR_XHCI 0x1B70 |
| 164 | #define CNP_PMC_LTR_RESERVED 0x1B74 | ||
| 159 | #define CNP_PMC_LTR_ME 0x1B78 | 165 | #define CNP_PMC_LTR_ME 0x1B78 |
| 160 | #define CNP_PMC_LTR_EVA 0x1B7C | 166 | #define CNP_PMC_LTR_EVA 0x1B7C |
| 161 | #define CNP_PMC_LTR_SPC 0x1B80 | 167 | #define CNP_PMC_LTR_SPC 0x1B80 |
| @@ -176,6 +182,10 @@ enum ppfear_regs { | |||
| 176 | #define LTR_REQ_SNOOP BIT(15) | 182 | #define LTR_REQ_SNOOP BIT(15) |
| 177 | #define LTR_REQ_NONSNOOP BIT(31) | 183 | #define LTR_REQ_NONSNOOP BIT(31) |
| 178 | 184 | ||
| 185 | #define ICL_PPFEAR_NUM_ENTRIES 9 | ||
| 186 | #define ICL_NUM_IP_IGN_ALLOWED 20 | ||
| 187 | #define ICL_PMC_LTR_WIGIG 0x1BFC | ||
| 188 | |||
| 179 | struct pmc_bit_map { | 189 | struct pmc_bit_map { |
| 180 | const char *name; | 190 | const char *name; |
| 181 | u32 bit_mask; | 191 | u32 bit_mask; |
| @@ -208,6 +218,7 @@ struct pmc_reg_map { | |||
| 208 | const struct pmc_bit_map *pll_sts; | 218 | const struct pmc_bit_map *pll_sts; |
| 209 | const struct pmc_bit_map **slps0_dbg_maps; | 219 | const struct pmc_bit_map **slps0_dbg_maps; |
| 210 | const struct pmc_bit_map *ltr_show_sts; | 220 | const struct pmc_bit_map *ltr_show_sts; |
| 221 | const struct pmc_bit_map *msr_sts; | ||
| 211 | const u32 slp_s0_offset; | 222 | const u32 slp_s0_offset; |
| 212 | const u32 ltr_ignore_offset; | 223 | const u32 ltr_ignore_offset; |
| 213 | const int regmap_length; | 224 | const int regmap_length; |
| @@ -217,6 +228,7 @@ struct pmc_reg_map { | |||
| 217 | const int pm_read_disable_bit; | 228 | const int pm_read_disable_bit; |
| 218 | const u32 slps0_dbg_offset; | 229 | const u32 slps0_dbg_offset; |
| 219 | const u32 ltr_ignore_max; | 230 | const u32 ltr_ignore_max; |
| 231 | const u32 pm_vric1_offset; | ||
| 220 | }; | 232 | }; |
| 221 | 233 | ||
| 222 | /** | 234 | /** |
diff --git a/drivers/platform/x86/mlx-platform.c b/drivers/platform/x86/mlx-platform.c index df3fcd36776a..48fa7573e29b 100644 --- a/drivers/platform/x86/mlx-platform.c +++ b/drivers/platform/x86/mlx-platform.c | |||
| @@ -25,6 +25,7 @@ | |||
| 25 | #define MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET 0x00 | 25 | #define MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET 0x00 |
| 26 | #define MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET 0x01 | 26 | #define MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET 0x01 |
| 27 | #define MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET 0x02 | 27 | #define MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET 0x02 |
| 28 | #define MLXPLAT_CPLD_LPC_REG_CPLD4_VER_OFFSET 0x03 | ||
| 28 | #define MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET 0x1d | 29 | #define MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET 0x1d |
| 29 | #define MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET 0x1e | 30 | #define MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET 0x1e |
| 30 | #define MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET 0x1f | 31 | #define MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET 0x1f |
| @@ -33,6 +34,7 @@ | |||
| 33 | #define MLXPLAT_CPLD_LPC_REG_LED3_OFFSET 0x22 | 34 | #define MLXPLAT_CPLD_LPC_REG_LED3_OFFSET 0x22 |
| 34 | #define MLXPLAT_CPLD_LPC_REG_LED4_OFFSET 0x23 | 35 | #define MLXPLAT_CPLD_LPC_REG_LED4_OFFSET 0x23 |
| 35 | #define MLXPLAT_CPLD_LPC_REG_LED5_OFFSET 0x24 | 36 | #define MLXPLAT_CPLD_LPC_REG_LED5_OFFSET 0x24 |
| 37 | #define MLXPLAT_CPLD_LPC_REG_FAN_DIRECTION 0x2a | ||
| 36 | #define MLXPLAT_CPLD_LPC_REG_GP1_OFFSET 0x30 | 38 | #define MLXPLAT_CPLD_LPC_REG_GP1_OFFSET 0x30 |
| 37 | #define MLXPLAT_CPLD_LPC_REG_WP1_OFFSET 0x31 | 39 | #define MLXPLAT_CPLD_LPC_REG_WP1_OFFSET 0x31 |
| 38 | #define MLXPLAT_CPLD_LPC_REG_GP2_OFFSET 0x32 | 40 | #define MLXPLAT_CPLD_LPC_REG_GP2_OFFSET 0x32 |
| @@ -67,6 +69,9 @@ | |||
| 67 | #define MLXPLAT_CPLD_LPC_REG_TACHO10_OFFSET 0xee | 69 | #define MLXPLAT_CPLD_LPC_REG_TACHO10_OFFSET 0xee |
| 68 | #define MLXPLAT_CPLD_LPC_REG_TACHO11_OFFSET 0xef | 70 | #define MLXPLAT_CPLD_LPC_REG_TACHO11_OFFSET 0xef |
| 69 | #define MLXPLAT_CPLD_LPC_REG_TACHO12_OFFSET 0xf0 | 71 | #define MLXPLAT_CPLD_LPC_REG_TACHO12_OFFSET 0xf0 |
| 72 | #define MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET 0xf5 | ||
| 73 | #define MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET 0xf6 | ||
| 74 | #define MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET 0xf7 | ||
| 70 | #define MLXPLAT_CPLD_LPC_IO_RANGE 0x100 | 75 | #define MLXPLAT_CPLD_LPC_IO_RANGE 0x100 |
| 71 | #define MLXPLAT_CPLD_LPC_I2C_CH1_OFF 0xdb | 76 | #define MLXPLAT_CPLD_LPC_I2C_CH1_OFF 0xdb |
| 72 | #define MLXPLAT_CPLD_LPC_I2C_CH2_OFF 0xda | 77 | #define MLXPLAT_CPLD_LPC_I2C_CH2_OFF 0xda |
| @@ -584,36 +589,48 @@ static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_fan_items_data[] = { | |||
| 584 | .label = "fan1", | 589 | .label = "fan1", |
| 585 | .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET, | 590 | .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET, |
| 586 | .mask = BIT(0), | 591 | .mask = BIT(0), |
| 592 | .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET, | ||
| 593 | .bit = BIT(0), | ||
| 587 | .hpdev.nr = MLXPLAT_CPLD_NR_NONE, | 594 | .hpdev.nr = MLXPLAT_CPLD_NR_NONE, |
| 588 | }, | 595 | }, |
| 589 | { | 596 | { |
| 590 | .label = "fan2", | 597 | .label = "fan2", |
| 591 | .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET, | 598 | .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET, |
| 592 | .mask = BIT(1), | 599 | .mask = BIT(1), |
| 600 | .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET, | ||
| 601 | .bit = BIT(1), | ||
| 593 | .hpdev.nr = MLXPLAT_CPLD_NR_NONE, | 602 | .hpdev.nr = MLXPLAT_CPLD_NR_NONE, |
| 594 | }, | 603 | }, |
| 595 | { | 604 | { |
| 596 | .label = "fan3", | 605 | .label = "fan3", |
| 597 | .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET, | 606 | .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET, |
| 598 | .mask = BIT(2), | 607 | .mask = BIT(2), |
| 608 | .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET, | ||
| 609 | .bit = BIT(2), | ||
| 599 | .hpdev.nr = MLXPLAT_CPLD_NR_NONE, | 610 | .hpdev.nr = MLXPLAT_CPLD_NR_NONE, |
| 600 | }, | 611 | }, |
| 601 | { | 612 | { |
| 602 | .label = "fan4", | 613 | .label = "fan4", |
| 603 | .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET, | 614 | .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET, |
| 604 | .mask = BIT(3), | 615 | .mask = BIT(3), |
| 616 | .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET, | ||
| 617 | .bit = BIT(3), | ||
| 605 | .hpdev.nr = MLXPLAT_CPLD_NR_NONE, | 618 | .hpdev.nr = MLXPLAT_CPLD_NR_NONE, |
| 606 | }, | 619 | }, |
| 607 | { | 620 | { |
| 608 | .label = "fan5", | 621 | .label = "fan5", |
| 609 | .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET, | 622 | .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET, |
| 610 | .mask = BIT(4), | 623 | .mask = BIT(4), |
| 624 | .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET, | ||
| 625 | .bit = BIT(4), | ||
| 611 | .hpdev.nr = MLXPLAT_CPLD_NR_NONE, | 626 | .hpdev.nr = MLXPLAT_CPLD_NR_NONE, |
| 612 | }, | 627 | }, |
| 613 | { | 628 | { |
| 614 | .label = "fan6", | 629 | .label = "fan6", |
| 615 | .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET, | 630 | .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET, |
| 616 | .mask = BIT(5), | 631 | .mask = BIT(5), |
| 632 | .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET, | ||
| 633 | .bit = BIT(5), | ||
| 617 | .hpdev.nr = MLXPLAT_CPLD_NR_NONE, | 634 | .hpdev.nr = MLXPLAT_CPLD_NR_NONE, |
| 618 | }, | 635 | }, |
| 619 | }; | 636 | }; |
| @@ -816,61 +833,90 @@ static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_led_data[] = { | |||
| 816 | .label = "fan1:green", | 833 | .label = "fan1:green", |
| 817 | .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET, | 834 | .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET, |
| 818 | .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK, | 835 | .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK, |
| 836 | .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET, | ||
| 837 | .bit = BIT(0), | ||
| 819 | }, | 838 | }, |
| 820 | { | 839 | { |
| 821 | .label = "fan1:orange", | 840 | .label = "fan1:orange", |
| 822 | .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET, | 841 | .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET, |
| 823 | .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK, | 842 | .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK, |
| 843 | .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET, | ||
| 844 | .bit = BIT(0), | ||
| 824 | }, | 845 | }, |
| 825 | { | 846 | { |
| 826 | .label = "fan2:green", | 847 | .label = "fan2:green", |
| 827 | .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET, | 848 | .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET, |
| 828 | .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK, | 849 | .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK, |
| 850 | .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET, | ||
| 851 | .bit = BIT(1), | ||
| 829 | }, | 852 | }, |
| 830 | { | 853 | { |
| 831 | .label = "fan2:orange", | 854 | .label = "fan2:orange", |
| 832 | .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET, | 855 | .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET, |
| 833 | .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK, | 856 | .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK, |
| 857 | .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET, | ||
| 858 | .bit = BIT(1), | ||
| 834 | }, | 859 | }, |
| 835 | { | 860 | { |
| 836 | .label = "fan3:green", | 861 | .label = "fan3:green", |
| 837 | .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET, | 862 | .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET, |
| 838 | .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK, | 863 | .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK, |
| 864 | .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET, | ||
| 865 | .bit = BIT(2), | ||
| 839 | }, | 866 | }, |
| 840 | { | 867 | { |
| 841 | .label = "fan3:orange", | 868 | .label = "fan3:orange", |
| 842 | .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET, | 869 | .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET, |
| 843 | .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK, | 870 | .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK, |
| 871 | .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET, | ||
| 872 | .bit = BIT(2), | ||
| 844 | }, | 873 | }, |
| 845 | { | 874 | { |
| 846 | .label = "fan4:green", | 875 | .label = "fan4:green", |
| 847 | .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET, | 876 | .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET, |
| 848 | .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK, | 877 | .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK, |
| 878 | .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET, | ||
| 879 | .bit = BIT(3), | ||
| 849 | }, | 880 | }, |
| 850 | { | 881 | { |
| 851 | .label = "fan4:orange", | 882 | .label = "fan4:orange", |
| 852 | .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET, | 883 | .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET, |
| 853 | .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK, | 884 | .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK, |
| 885 | .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET, | ||
| 886 | .bit = BIT(3), | ||
| 854 | }, | 887 | }, |
| 855 | { | 888 | { |
| 856 | .label = "fan5:green", | 889 | .label = "fan5:green", |
| 857 | .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET, | 890 | .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET, |
| 858 | .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK, | 891 | .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK, |
| 892 | .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET, | ||
| 893 | .bit = BIT(4), | ||
| 859 | }, | 894 | }, |
| 860 | { | 895 | { |
| 861 | .label = "fan5:orange", | 896 | .label = "fan5:orange", |
| 862 | .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET, | 897 | .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET, |
| 863 | .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK, | 898 | .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK, |
| 899 | .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET, | ||
| 900 | .bit = BIT(4), | ||
| 864 | }, | 901 | }, |
| 865 | { | 902 | { |
| 866 | .label = "fan6:green", | 903 | .label = "fan6:green", |
| 867 | .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET, | 904 | .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET, |
| 868 | .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK, | 905 | .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK, |
| 906 | .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET, | ||
| 907 | .bit = BIT(5), | ||
| 869 | }, | 908 | }, |
| 870 | { | 909 | { |
| 871 | .label = "fan6:orange", | 910 | .label = "fan6:orange", |
| 872 | .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET, | 911 | .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET, |
| 873 | .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK, | 912 | .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK, |
| 913 | .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET, | ||
| 914 | .bit = BIT(5), | ||
| 915 | }, | ||
| 916 | { | ||
| 917 | .label = "uid:blue", | ||
| 918 | .reg = MLXPLAT_CPLD_LPC_REG_LED5_OFFSET, | ||
| 919 | .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK, | ||
| 874 | }, | 920 | }, |
| 875 | }; | 921 | }; |
| 876 | 922 | ||
| @@ -1100,6 +1146,12 @@ static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_regs_io_data[] = { | |||
| 1100 | .mode = 0444, | 1146 | .mode = 0444, |
| 1101 | }, | 1147 | }, |
| 1102 | { | 1148 | { |
| 1149 | .label = "cpld4_version", | ||
| 1150 | .reg = MLXPLAT_CPLD_LPC_REG_CPLD4_VER_OFFSET, | ||
| 1151 | .bit = GENMASK(7, 0), | ||
| 1152 | .mode = 0444, | ||
| 1153 | }, | ||
| 1154 | { | ||
| 1103 | .label = "reset_long_pb", | 1155 | .label = "reset_long_pb", |
| 1104 | .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET, | 1156 | .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET, |
| 1105 | .mask = GENMASK(7, 0) & ~BIT(0), | 1157 | .mask = GENMASK(7, 0) & ~BIT(0), |
| @@ -1184,6 +1236,12 @@ static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_regs_io_data[] = { | |||
| 1184 | .bit = 1, | 1236 | .bit = 1, |
| 1185 | .mode = 0444, | 1237 | .mode = 0444, |
| 1186 | }, | 1238 | }, |
| 1239 | { | ||
| 1240 | .label = "fan_dir", | ||
| 1241 | .reg = MLXPLAT_CPLD_LPC_REG_FAN_DIRECTION, | ||
| 1242 | .bit = GENMASK(7, 0), | ||
| 1243 | .mode = 0444, | ||
| 1244 | }, | ||
| 1187 | }; | 1245 | }; |
| 1188 | 1246 | ||
| 1189 | static struct mlxreg_core_platform_data mlxplat_default_ng_regs_io_data = { | 1247 | static struct mlxreg_core_platform_data mlxplat_default_ng_regs_io_data = { |
| @@ -1201,61 +1259,85 @@ static struct mlxreg_core_data mlxplat_mlxcpld_default_fan_data[] = { | |||
| 1201 | .label = "tacho1", | 1259 | .label = "tacho1", |
| 1202 | .reg = MLXPLAT_CPLD_LPC_REG_TACHO1_OFFSET, | 1260 | .reg = MLXPLAT_CPLD_LPC_REG_TACHO1_OFFSET, |
| 1203 | .mask = GENMASK(7, 0), | 1261 | .mask = GENMASK(7, 0), |
| 1262 | .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET, | ||
| 1263 | .bit = BIT(0), | ||
| 1204 | }, | 1264 | }, |
| 1205 | { | 1265 | { |
| 1206 | .label = "tacho2", | 1266 | .label = "tacho2", |
| 1207 | .reg = MLXPLAT_CPLD_LPC_REG_TACHO2_OFFSET, | 1267 | .reg = MLXPLAT_CPLD_LPC_REG_TACHO2_OFFSET, |
| 1208 | .mask = GENMASK(7, 0), | 1268 | .mask = GENMASK(7, 0), |
| 1269 | .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET, | ||
| 1270 | .bit = BIT(1), | ||
| 1209 | }, | 1271 | }, |
| 1210 | { | 1272 | { |
| 1211 | .label = "tacho3", | 1273 | .label = "tacho3", |
| 1212 | .reg = MLXPLAT_CPLD_LPC_REG_TACHO3_OFFSET, | 1274 | .reg = MLXPLAT_CPLD_LPC_REG_TACHO3_OFFSET, |
| 1213 | .mask = GENMASK(7, 0), | 1275 | .mask = GENMASK(7, 0), |
| 1276 | .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET, | ||
| 1277 | .bit = BIT(2), | ||
| 1214 | }, | 1278 | }, |
| 1215 | { | 1279 | { |
| 1216 | .label = "tacho4", | 1280 | .label = "tacho4", |
| 1217 | .reg = MLXPLAT_CPLD_LPC_REG_TACHO4_OFFSET, | 1281 | .reg = MLXPLAT_CPLD_LPC_REG_TACHO4_OFFSET, |
| 1218 | .mask = GENMASK(7, 0), | 1282 | .mask = GENMASK(7, 0), |
| 1283 | .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET, | ||
| 1284 | .bit = BIT(3), | ||
| 1219 | }, | 1285 | }, |
| 1220 | { | 1286 | { |
| 1221 | .label = "tacho5", | 1287 | .label = "tacho5", |
| 1222 | .reg = MLXPLAT_CPLD_LPC_REG_TACHO5_OFFSET, | 1288 | .reg = MLXPLAT_CPLD_LPC_REG_TACHO5_OFFSET, |
| 1223 | .mask = GENMASK(7, 0), | 1289 | .mask = GENMASK(7, 0), |
| 1290 | .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET, | ||
| 1291 | .bit = BIT(4), | ||
| 1224 | }, | 1292 | }, |
| 1225 | { | 1293 | { |
| 1226 | .label = "tacho6", | 1294 | .label = "tacho6", |
| 1227 | .reg = MLXPLAT_CPLD_LPC_REG_TACHO6_OFFSET, | 1295 | .reg = MLXPLAT_CPLD_LPC_REG_TACHO6_OFFSET, |
| 1228 | .mask = GENMASK(7, 0), | 1296 | .mask = GENMASK(7, 0), |
| 1297 | .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET, | ||
| 1298 | .bit = BIT(5), | ||
| 1229 | }, | 1299 | }, |
| 1230 | { | 1300 | { |
| 1231 | .label = "tacho7", | 1301 | .label = "tacho7", |
| 1232 | .reg = MLXPLAT_CPLD_LPC_REG_TACHO7_OFFSET, | 1302 | .reg = MLXPLAT_CPLD_LPC_REG_TACHO7_OFFSET, |
| 1233 | .mask = GENMASK(7, 0), | 1303 | .mask = GENMASK(7, 0), |
| 1304 | .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET, | ||
| 1305 | .bit = BIT(6), | ||
| 1234 | }, | 1306 | }, |
| 1235 | { | 1307 | { |
| 1236 | .label = "tacho8", | 1308 | .label = "tacho8", |
| 1237 | .reg = MLXPLAT_CPLD_LPC_REG_TACHO8_OFFSET, | 1309 | .reg = MLXPLAT_CPLD_LPC_REG_TACHO8_OFFSET, |
| 1238 | .mask = GENMASK(7, 0), | 1310 | .mask = GENMASK(7, 0), |
| 1311 | .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET, | ||
| 1312 | .bit = BIT(7), | ||
| 1239 | }, | 1313 | }, |
| 1240 | { | 1314 | { |
| 1241 | .label = "tacho9", | 1315 | .label = "tacho9", |
| 1242 | .reg = MLXPLAT_CPLD_LPC_REG_TACHO9_OFFSET, | 1316 | .reg = MLXPLAT_CPLD_LPC_REG_TACHO9_OFFSET, |
| 1243 | .mask = GENMASK(7, 0), | 1317 | .mask = GENMASK(7, 0), |
| 1318 | .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET, | ||
| 1319 | .bit = BIT(0), | ||
| 1244 | }, | 1320 | }, |
| 1245 | { | 1321 | { |
| 1246 | .label = "tacho10", | 1322 | .label = "tacho10", |
| 1247 | .reg = MLXPLAT_CPLD_LPC_REG_TACHO10_OFFSET, | 1323 | .reg = MLXPLAT_CPLD_LPC_REG_TACHO10_OFFSET, |
| 1248 | .mask = GENMASK(7, 0), | 1324 | .mask = GENMASK(7, 0), |
| 1325 | .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET, | ||
| 1326 | .bit = BIT(1), | ||
| 1249 | }, | 1327 | }, |
| 1250 | { | 1328 | { |
| 1251 | .label = "tacho11", | 1329 | .label = "tacho11", |
| 1252 | .reg = MLXPLAT_CPLD_LPC_REG_TACHO11_OFFSET, | 1330 | .reg = MLXPLAT_CPLD_LPC_REG_TACHO11_OFFSET, |
| 1253 | .mask = GENMASK(7, 0), | 1331 | .mask = GENMASK(7, 0), |
| 1332 | .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET, | ||
| 1333 | .bit = BIT(2), | ||
| 1254 | }, | 1334 | }, |
| 1255 | { | 1335 | { |
| 1256 | .label = "tacho12", | 1336 | .label = "tacho12", |
| 1257 | .reg = MLXPLAT_CPLD_LPC_REG_TACHO12_OFFSET, | 1337 | .reg = MLXPLAT_CPLD_LPC_REG_TACHO12_OFFSET, |
| 1258 | .mask = GENMASK(7, 0), | 1338 | .mask = GENMASK(7, 0), |
| 1339 | .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET, | ||
| 1340 | .bit = BIT(3), | ||
| 1259 | }, | 1341 | }, |
| 1260 | }; | 1342 | }; |
| 1261 | 1343 | ||
| @@ -1299,6 +1381,7 @@ static bool mlxplat_mlxcpld_readable_reg(struct device *dev, unsigned int reg) | |||
| 1299 | case MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET: | 1381 | case MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET: |
| 1300 | case MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET: | 1382 | case MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET: |
| 1301 | case MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET: | 1383 | case MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET: |
| 1384 | case MLXPLAT_CPLD_LPC_REG_CPLD4_VER_OFFSET: | ||
| 1302 | case MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET: | 1385 | case MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET: |
| 1303 | case MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET: | 1386 | case MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET: |
| 1304 | case MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET: | 1387 | case MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET: |
| @@ -1307,6 +1390,7 @@ static bool mlxplat_mlxcpld_readable_reg(struct device *dev, unsigned int reg) | |||
| 1307 | case MLXPLAT_CPLD_LPC_REG_LED3_OFFSET: | 1390 | case MLXPLAT_CPLD_LPC_REG_LED3_OFFSET: |
| 1308 | case MLXPLAT_CPLD_LPC_REG_LED4_OFFSET: | 1391 | case MLXPLAT_CPLD_LPC_REG_LED4_OFFSET: |
| 1309 | case MLXPLAT_CPLD_LPC_REG_LED5_OFFSET: | 1392 | case MLXPLAT_CPLD_LPC_REG_LED5_OFFSET: |
| 1393 | case MLXPLAT_CPLD_LPC_REG_FAN_DIRECTION: | ||
| 1310 | case MLXPLAT_CPLD_LPC_REG_GP1_OFFSET: | 1394 | case MLXPLAT_CPLD_LPC_REG_GP1_OFFSET: |
| 1311 | case MLXPLAT_CPLD_LPC_REG_WP1_OFFSET: | 1395 | case MLXPLAT_CPLD_LPC_REG_WP1_OFFSET: |
| 1312 | case MLXPLAT_CPLD_LPC_REG_GP2_OFFSET: | 1396 | case MLXPLAT_CPLD_LPC_REG_GP2_OFFSET: |
| @@ -1341,6 +1425,9 @@ static bool mlxplat_mlxcpld_readable_reg(struct device *dev, unsigned int reg) | |||
| 1341 | case MLXPLAT_CPLD_LPC_REG_TACHO11_OFFSET: | 1425 | case MLXPLAT_CPLD_LPC_REG_TACHO11_OFFSET: |
| 1342 | case MLXPLAT_CPLD_LPC_REG_TACHO12_OFFSET: | 1426 | case MLXPLAT_CPLD_LPC_REG_TACHO12_OFFSET: |
| 1343 | case MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET: | 1427 | case MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET: |
| 1428 | case MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET: | ||
| 1429 | case MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET: | ||
| 1430 | case MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET: | ||
| 1344 | return true; | 1431 | return true; |
| 1345 | } | 1432 | } |
| 1346 | return false; | 1433 | return false; |
| @@ -1352,6 +1439,7 @@ static bool mlxplat_mlxcpld_volatile_reg(struct device *dev, unsigned int reg) | |||
| 1352 | case MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET: | 1439 | case MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET: |
| 1353 | case MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET: | 1440 | case MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET: |
| 1354 | case MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET: | 1441 | case MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET: |
| 1442 | case MLXPLAT_CPLD_LPC_REG_CPLD4_VER_OFFSET: | ||
| 1355 | case MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET: | 1443 | case MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET: |
| 1356 | case MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET: | 1444 | case MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET: |
| 1357 | case MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET: | 1445 | case MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET: |
| @@ -1360,6 +1448,7 @@ static bool mlxplat_mlxcpld_volatile_reg(struct device *dev, unsigned int reg) | |||
| 1360 | case MLXPLAT_CPLD_LPC_REG_LED3_OFFSET: | 1448 | case MLXPLAT_CPLD_LPC_REG_LED3_OFFSET: |
| 1361 | case MLXPLAT_CPLD_LPC_REG_LED4_OFFSET: | 1449 | case MLXPLAT_CPLD_LPC_REG_LED4_OFFSET: |
| 1362 | case MLXPLAT_CPLD_LPC_REG_LED5_OFFSET: | 1450 | case MLXPLAT_CPLD_LPC_REG_LED5_OFFSET: |
| 1451 | case MLXPLAT_CPLD_LPC_REG_FAN_DIRECTION: | ||
| 1363 | case MLXPLAT_CPLD_LPC_REG_GP1_OFFSET: | 1452 | case MLXPLAT_CPLD_LPC_REG_GP1_OFFSET: |
| 1364 | case MLXPLAT_CPLD_LPC_REG_GP2_OFFSET: | 1453 | case MLXPLAT_CPLD_LPC_REG_GP2_OFFSET: |
| 1365 | case MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET: | 1454 | case MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET: |
| @@ -1392,6 +1481,9 @@ static bool mlxplat_mlxcpld_volatile_reg(struct device *dev, unsigned int reg) | |||
| 1392 | case MLXPLAT_CPLD_LPC_REG_TACHO11_OFFSET: | 1481 | case MLXPLAT_CPLD_LPC_REG_TACHO11_OFFSET: |
| 1393 | case MLXPLAT_CPLD_LPC_REG_TACHO12_OFFSET: | 1482 | case MLXPLAT_CPLD_LPC_REG_TACHO12_OFFSET: |
| 1394 | case MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET: | 1483 | case MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET: |
| 1484 | case MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET: | ||
| 1485 | case MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET: | ||
| 1486 | case MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET: | ||
| 1395 | return true; | 1487 | return true; |
| 1396 | } | 1488 | } |
| 1397 | return false; | 1489 | return false; |
| @@ -1614,6 +1706,13 @@ static const struct dmi_system_id mlxplat_dmi_table[] __initconst = { | |||
| 1614 | }, | 1706 | }, |
| 1615 | }, | 1707 | }, |
| 1616 | { | 1708 | { |
| 1709 | .callback = mlxplat_dmi_qmb7xx_matched, | ||
| 1710 | .matches = { | ||
| 1711 | DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"), | ||
| 1712 | DMI_MATCH(DMI_PRODUCT_NAME, "MSN38"), | ||
| 1713 | }, | ||
| 1714 | }, | ||
| 1715 | { | ||
| 1617 | .callback = mlxplat_dmi_default_matched, | 1716 | .callback = mlxplat_dmi_default_matched, |
| 1618 | .matches = { | 1717 | .matches = { |
| 1619 | DMI_MATCH(DMI_BOARD_NAME, "VMOD0001"), | 1718 | DMI_MATCH(DMI_BOARD_NAME, "VMOD0001"), |
| @@ -1643,6 +1742,12 @@ static const struct dmi_system_id mlxplat_dmi_table[] __initconst = { | |||
| 1643 | DMI_MATCH(DMI_BOARD_NAME, "VMOD0005"), | 1742 | DMI_MATCH(DMI_BOARD_NAME, "VMOD0005"), |
| 1644 | }, | 1743 | }, |
| 1645 | }, | 1744 | }, |
| 1745 | { | ||
| 1746 | .callback = mlxplat_dmi_qmb7xx_matched, | ||
| 1747 | .matches = { | ||
| 1748 | DMI_MATCH(DMI_BOARD_NAME, "VMOD0007"), | ||
| 1749 | }, | ||
| 1750 | }, | ||
| 1646 | { } | 1751 | { } |
| 1647 | }; | 1752 | }; |
| 1648 | 1753 | ||
diff --git a/drivers/platform/x86/touchscreen_dmi.c b/drivers/platform/x86/touchscreen_dmi.c index 8c5d47c0aea6..2d56ff7c8230 100644 --- a/drivers/platform/x86/touchscreen_dmi.c +++ b/drivers/platform/x86/touchscreen_dmi.c | |||
| @@ -41,6 +41,20 @@ static const struct ts_dmi_data chuwi_hi8_data = { | |||
| 41 | .properties = chuwi_hi8_props, | 41 | .properties = chuwi_hi8_props, |
| 42 | }; | 42 | }; |
| 43 | 43 | ||
| 44 | static const struct property_entry chuwi_hi8_air_props[] = { | ||
| 45 | PROPERTY_ENTRY_U32("touchscreen-size-x", 1728), | ||
| 46 | PROPERTY_ENTRY_U32("touchscreen-size-y", 1148), | ||
| 47 | PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"), | ||
| 48 | PROPERTY_ENTRY_STRING("firmware-name", "gsl3676-chuwi-hi8-air.fw"), | ||
| 49 | PROPERTY_ENTRY_U32("silead,max-fingers", 10), | ||
| 50 | { } | ||
| 51 | }; | ||
| 52 | |||
| 53 | static const struct ts_dmi_data chuwi_hi8_air_data = { | ||
| 54 | .acpi_name = "MSSL1680:00", | ||
| 55 | .properties = chuwi_hi8_air_props, | ||
| 56 | }; | ||
| 57 | |||
| 44 | static const struct property_entry chuwi_hi8_pro_props[] = { | 58 | static const struct property_entry chuwi_hi8_pro_props[] = { |
| 45 | PROPERTY_ENTRY_U32("touchscreen-min-x", 6), | 59 | PROPERTY_ENTRY_U32("touchscreen-min-x", 6), |
| 46 | PROPERTY_ENTRY_U32("touchscreen-min-y", 3), | 60 | PROPERTY_ENTRY_U32("touchscreen-min-y", 3), |
| @@ -58,6 +72,25 @@ static const struct ts_dmi_data chuwi_hi8_pro_data = { | |||
| 58 | .properties = chuwi_hi8_pro_props, | 72 | .properties = chuwi_hi8_pro_props, |
| 59 | }; | 73 | }; |
| 60 | 74 | ||
| 75 | static const struct property_entry chuwi_hi10_air_props[] = { | ||
| 76 | PROPERTY_ENTRY_U32("touchscreen-size-x", 1981), | ||
| 77 | PROPERTY_ENTRY_U32("touchscreen-size-y", 1271), | ||
| 78 | PROPERTY_ENTRY_U32("touchscreen-min-x", 99), | ||
| 79 | PROPERTY_ENTRY_U32("touchscreen-min-y", 9), | ||
| 80 | PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"), | ||
| 81 | PROPERTY_ENTRY_U32("touchscreen-fuzz-x", 5), | ||
| 82 | PROPERTY_ENTRY_U32("touchscreen-fuzz-y", 4), | ||
| 83 | PROPERTY_ENTRY_STRING("firmware-name", "gsl1680-chuwi-hi10-air.fw"), | ||
| 84 | PROPERTY_ENTRY_U32("silead,max-fingers", 10), | ||
| 85 | PROPERTY_ENTRY_BOOL("silead,home-button"), | ||
| 86 | { } | ||
| 87 | }; | ||
| 88 | |||
| 89 | static const struct ts_dmi_data chuwi_hi10_air_data = { | ||
| 90 | .acpi_name = "MSSL1680:00", | ||
| 91 | .properties = chuwi_hi10_air_props, | ||
| 92 | }; | ||
| 93 | |||
| 61 | static const struct property_entry chuwi_vi8_props[] = { | 94 | static const struct property_entry chuwi_vi8_props[] = { |
| 62 | PROPERTY_ENTRY_U32("touchscreen-min-x", 4), | 95 | PROPERTY_ENTRY_U32("touchscreen-min-x", 4), |
| 63 | PROPERTY_ENTRY_U32("touchscreen-min-y", 6), | 96 | PROPERTY_ENTRY_U32("touchscreen-min-y", 6), |
| @@ -369,6 +402,24 @@ static const struct ts_dmi_data pov_mobii_wintab_p800w_v21_data = { | |||
| 369 | .properties = pov_mobii_wintab_p800w_v21_props, | 402 | .properties = pov_mobii_wintab_p800w_v21_props, |
| 370 | }; | 403 | }; |
| 371 | 404 | ||
| 405 | static const struct property_entry pov_mobii_wintab_p1006w_v10_props[] = { | ||
| 406 | PROPERTY_ENTRY_U32("touchscreen-min-x", 1), | ||
| 407 | PROPERTY_ENTRY_U32("touchscreen-min-y", 3), | ||
| 408 | PROPERTY_ENTRY_U32("touchscreen-size-x", 1984), | ||
| 409 | PROPERTY_ENTRY_U32("touchscreen-size-y", 1520), | ||
| 410 | PROPERTY_ENTRY_BOOL("touchscreen-inverted-y"), | ||
| 411 | PROPERTY_ENTRY_STRING("firmware-name", | ||
| 412 | "gsl3692-pov-mobii-wintab-p1006w-v10.fw"), | ||
| 413 | PROPERTY_ENTRY_U32("silead,max-fingers", 10), | ||
| 414 | PROPERTY_ENTRY_BOOL("silead,home-button"), | ||
| 415 | { } | ||
| 416 | }; | ||
| 417 | |||
| 418 | static const struct ts_dmi_data pov_mobii_wintab_p1006w_v10_data = { | ||
| 419 | .acpi_name = "MSSL1680:00", | ||
| 420 | .properties = pov_mobii_wintab_p1006w_v10_props, | ||
| 421 | }; | ||
| 422 | |||
| 372 | static const struct property_entry teclast_x3_plus_props[] = { | 423 | static const struct property_entry teclast_x3_plus_props[] = { |
| 373 | PROPERTY_ENTRY_U32("touchscreen-size-x", 1980), | 424 | PROPERTY_ENTRY_U32("touchscreen-size-x", 1980), |
| 374 | PROPERTY_ENTRY_U32("touchscreen-size-y", 1500), | 425 | PROPERTY_ENTRY_U32("touchscreen-size-y", 1500), |
| @@ -498,6 +549,15 @@ static const struct dmi_system_id touchscreen_dmi_table[] = { | |||
| 498 | }, | 549 | }, |
| 499 | }, | 550 | }, |
| 500 | { | 551 | { |
| 552 | /* Chuwi Hi8 Air (CWI543) */ | ||
| 553 | .driver_data = (void *)&chuwi_hi8_air_data, | ||
| 554 | .matches = { | ||
| 555 | DMI_MATCH(DMI_BOARD_VENDOR, "Default string"), | ||
| 556 | DMI_MATCH(DMI_BOARD_NAME, "Cherry Trail CR"), | ||
| 557 | DMI_MATCH(DMI_PRODUCT_NAME, "Hi8 Air"), | ||
| 558 | }, | ||
| 559 | }, | ||
| 560 | { | ||
| 501 | /* Chuwi Hi8 Pro (CWI513) */ | 561 | /* Chuwi Hi8 Pro (CWI513) */ |
| 502 | .driver_data = (void *)&chuwi_hi8_pro_data, | 562 | .driver_data = (void *)&chuwi_hi8_pro_data, |
| 503 | .matches = { | 563 | .matches = { |
| @@ -506,6 +566,14 @@ static const struct dmi_system_id touchscreen_dmi_table[] = { | |||
| 506 | }, | 566 | }, |
| 507 | }, | 567 | }, |
| 508 | { | 568 | { |
| 569 | /* Chuwi Hi10 Air */ | ||
| 570 | .driver_data = (void *)&chuwi_hi10_air_data, | ||
| 571 | .matches = { | ||
| 572 | DMI_MATCH(DMI_BOARD_VENDOR, "Hampoo"), | ||
| 573 | DMI_MATCH(DMI_PRODUCT_SKU, "P1W6_C109D_B"), | ||
| 574 | }, | ||
| 575 | }, | ||
| 576 | { | ||
| 509 | /* Chuwi Vi8 (CWI506) */ | 577 | /* Chuwi Vi8 (CWI506) */ |
| 510 | .driver_data = (void *)&chuwi_vi8_data, | 578 | .driver_data = (void *)&chuwi_vi8_data, |
| 511 | .matches = { | 579 | .matches = { |
| @@ -707,6 +775,17 @@ static const struct dmi_system_id touchscreen_dmi_table[] = { | |||
| 707 | }, | 775 | }, |
| 708 | }, | 776 | }, |
| 709 | { | 777 | { |
| 778 | /* Point of View mobii wintab p1006w (v1.0) */ | ||
| 779 | .driver_data = (void *)&pov_mobii_wintab_p1006w_v10_data, | ||
| 780 | .matches = { | ||
| 781 | DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Insyde"), | ||
| 782 | DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "BayTrail"), | ||
| 783 | /* Note 105b is Foxcon's USB/PCI vendor id */ | ||
| 784 | DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "105B"), | ||
| 785 | DMI_EXACT_MATCH(DMI_BOARD_NAME, "0E57"), | ||
| 786 | }, | ||
| 787 | }, | ||
| 788 | { | ||
| 710 | /* Teclast X3 Plus */ | 789 | /* Teclast X3 Plus */ |
| 711 | .driver_data = (void *)&teclast_x3_plus_data, | 790 | .driver_data = (void *)&teclast_x3_plus_data, |
| 712 | .matches = { | 791 | .matches = { |
diff --git a/drivers/platform/x86/wmi-bmof.c b/drivers/platform/x86/wmi-bmof.c index c4530ba715e8..8751a13134be 100644 --- a/drivers/platform/x86/wmi-bmof.c +++ b/drivers/platform/x86/wmi-bmof.c | |||
| @@ -119,7 +119,7 @@ static struct wmi_driver wmi_bmof_driver = { | |||
| 119 | 119 | ||
| 120 | module_wmi_driver(wmi_bmof_driver); | 120 | module_wmi_driver(wmi_bmof_driver); |
| 121 | 121 | ||
| 122 | MODULE_ALIAS("wmi:" WMI_BMOF_GUID); | 122 | MODULE_DEVICE_TABLE(wmi, wmi_bmof_id_table); |
| 123 | MODULE_AUTHOR("Andrew Lutomirski <luto@kernel.org>"); | 123 | MODULE_AUTHOR("Andrew Lutomirski <luto@kernel.org>"); |
| 124 | MODULE_DESCRIPTION("WMI embedded Binary MOF driver"); | 124 | MODULE_DESCRIPTION("WMI embedded Binary MOF driver"); |
| 125 | MODULE_LICENSE("GPL"); | 125 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/platform/x86/wmi.c b/drivers/platform/x86/wmi.c index bea35be68706..7b26b6ccf1a0 100644 --- a/drivers/platform/x86/wmi.c +++ b/drivers/platform/x86/wmi.c | |||
| @@ -768,7 +768,10 @@ static int wmi_dev_match(struct device *dev, struct device_driver *driver) | |||
| 768 | struct wmi_block *wblock = dev_to_wblock(dev); | 768 | struct wmi_block *wblock = dev_to_wblock(dev); |
| 769 | const struct wmi_device_id *id = wmi_driver->id_table; | 769 | const struct wmi_device_id *id = wmi_driver->id_table; |
| 770 | 770 | ||
| 771 | while (id->guid_string) { | 771 | if (id == NULL) |
| 772 | return 0; | ||
| 773 | |||
| 774 | while (*id->guid_string) { | ||
| 772 | uuid_le driver_guid; | 775 | uuid_le driver_guid; |
| 773 | 776 | ||
| 774 | if (WARN_ON(uuid_le_to_bin(id->guid_string, &driver_guid))) | 777 | if (WARN_ON(uuid_le_to_bin(id->guid_string, &driver_guid))) |
diff --git a/include/linux/mod_devicetable.h b/include/linux/mod_devicetable.h index 14eaeeb46f41..448621c32e4d 100644 --- a/include/linux/mod_devicetable.h +++ b/include/linux/mod_devicetable.h | |||
| @@ -788,4 +788,16 @@ struct tee_client_device_id { | |||
| 788 | uuid_t uuid; | 788 | uuid_t uuid; |
| 789 | }; | 789 | }; |
| 790 | 790 | ||
| 791 | /* WMI */ | ||
| 792 | |||
| 793 | #define WMI_MODULE_PREFIX "wmi:" | ||
| 794 | |||
| 795 | /** | ||
| 796 | * struct wmi_device_id - WMI device identifier | ||
| 797 | * @guid_string: 36 char string of the form fa50ff2b-f2e8-45de-83fa-65417f2f49ba | ||
| 798 | */ | ||
| 799 | struct wmi_device_id { | ||
| 800 | const char guid_string[UUID_STRING_LEN+1]; | ||
| 801 | }; | ||
| 802 | |||
| 791 | #endif /* LINUX_MOD_DEVICETABLE_H */ | 803 | #endif /* LINUX_MOD_DEVICETABLE_H */ |
diff --git a/include/linux/platform_data/mlxreg.h b/include/linux/platform_data/mlxreg.h index 19f5cb618c55..1b2f86f96743 100644 --- a/include/linux/platform_data/mlxreg.h +++ b/include/linux/platform_data/mlxreg.h | |||
| @@ -61,6 +61,7 @@ struct mlxreg_hotplug_device { | |||
| 61 | * @reg: attribute register; | 61 | * @reg: attribute register; |
| 62 | * @mask: attribute access mask; | 62 | * @mask: attribute access mask; |
| 63 | * @bit: attribute effective bit; | 63 | * @bit: attribute effective bit; |
| 64 | * @capability: attribute capability register; | ||
| 64 | * @mode: access mode; | 65 | * @mode: access mode; |
| 65 | * @np - pointer to node platform associated with attribute; | 66 | * @np - pointer to node platform associated with attribute; |
| 66 | * @hpdev - hotplug device data; | 67 | * @hpdev - hotplug device data; |
| @@ -72,6 +73,7 @@ struct mlxreg_core_data { | |||
| 72 | u32 reg; | 73 | u32 reg; |
| 73 | u32 mask; | 74 | u32 mask; |
| 74 | u32 bit; | 75 | u32 bit; |
| 76 | u32 capability; | ||
| 75 | umode_t mode; | 77 | umode_t mode; |
| 76 | struct device_node *np; | 78 | struct device_node *np; |
| 77 | struct mlxreg_hotplug_device hpdev; | 79 | struct mlxreg_hotplug_device hpdev; |
| @@ -107,9 +109,9 @@ struct mlxreg_core_item { | |||
| 107 | /** | 109 | /** |
| 108 | * struct mlxreg_core_platform_data - platform data: | 110 | * struct mlxreg_core_platform_data - platform data: |
| 109 | * | 111 | * |
| 110 | * @led_data: led private data; | 112 | * @data: instance private data; |
| 111 | * @regmap: register map of parent device; | 113 | * @regmap: register map of parent device; |
| 112 | * @counter: number of led instances; | 114 | * @counter: number of instances; |
| 113 | */ | 115 | */ |
| 114 | struct mlxreg_core_platform_data { | 116 | struct mlxreg_core_platform_data { |
| 115 | struct mlxreg_core_data *data; | 117 | struct mlxreg_core_data *data; |
diff --git a/include/linux/wmi.h b/include/linux/wmi.h index 4757cb5077e5..592f81afecbb 100644 --- a/include/linux/wmi.h +++ b/include/linux/wmi.h | |||
| @@ -18,6 +18,7 @@ | |||
| 18 | 18 | ||
| 19 | #include <linux/device.h> | 19 | #include <linux/device.h> |
| 20 | #include <linux/acpi.h> | 20 | #include <linux/acpi.h> |
| 21 | #include <linux/mod_devicetable.h> | ||
| 21 | #include <uapi/linux/wmi.h> | 22 | #include <uapi/linux/wmi.h> |
| 22 | 23 | ||
| 23 | struct wmi_device { | 24 | struct wmi_device { |
| @@ -39,10 +40,6 @@ extern union acpi_object *wmidev_block_query(struct wmi_device *wdev, | |||
| 39 | 40 | ||
| 40 | extern int set_required_buffer_size(struct wmi_device *wdev, u64 length); | 41 | extern int set_required_buffer_size(struct wmi_device *wdev, u64 length); |
| 41 | 42 | ||
| 42 | struct wmi_device_id { | ||
| 43 | const char *guid_string; | ||
| 44 | }; | ||
| 45 | |||
| 46 | struct wmi_driver { | 43 | struct wmi_driver { |
| 47 | struct device_driver driver; | 44 | struct device_driver driver; |
| 48 | const struct wmi_device_id *id_table; | 45 | const struct wmi_device_id *id_table; |
diff --git a/scripts/mod/devicetable-offsets.c b/scripts/mod/devicetable-offsets.c index 160718383a71..054405b90ba4 100644 --- a/scripts/mod/devicetable-offsets.c +++ b/scripts/mod/devicetable-offsets.c | |||
| @@ -228,5 +228,8 @@ int main(void) | |||
| 228 | DEVID(tee_client_device_id); | 228 | DEVID(tee_client_device_id); |
| 229 | DEVID_FIELD(tee_client_device_id, uuid); | 229 | DEVID_FIELD(tee_client_device_id, uuid); |
| 230 | 230 | ||
| 231 | DEVID(wmi_device_id); | ||
| 232 | DEVID_FIELD(wmi_device_id, guid_string); | ||
| 233 | |||
| 231 | return 0; | 234 | return 0; |
| 232 | } | 235 | } |
diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c index d0e41723627f..e17a29ae2e97 100644 --- a/scripts/mod/file2alias.c +++ b/scripts/mod/file2alias.c | |||
| @@ -40,6 +40,7 @@ typedef struct { | |||
| 40 | typedef struct { | 40 | typedef struct { |
| 41 | __u8 b[16]; | 41 | __u8 b[16]; |
| 42 | } uuid_t; | 42 | } uuid_t; |
| 43 | #define UUID_STRING_LEN 36 | ||
| 43 | 44 | ||
| 44 | /* Big exception to the "don't include kernel headers into userspace, which | 45 | /* Big exception to the "don't include kernel headers into userspace, which |
| 45 | * even potentially has different endianness and word sizes, since | 46 | * even potentially has different endianness and word sizes, since |
| @@ -53,6 +54,9 @@ struct devtable { | |||
| 53 | int (*do_entry)(const char *filename, void *symval, char *alias); | 54 | int (*do_entry)(const char *filename, void *symval, char *alias); |
| 54 | }; | 55 | }; |
| 55 | 56 | ||
| 57 | /* Size of alias provided to do_entry functions */ | ||
| 58 | #define ALIAS_SIZE 500 | ||
| 59 | |||
| 56 | /* Define a variable f that holds the value of field f of struct devid | 60 | /* Define a variable f that holds the value of field f of struct devid |
| 57 | * based at address m. | 61 | * based at address m. |
| 58 | */ | 62 | */ |
| @@ -1305,6 +1309,27 @@ static int do_tee_entry(const char *filename, void *symval, char *alias) | |||
| 1305 | return 1; | 1309 | return 1; |
| 1306 | } | 1310 | } |
| 1307 | 1311 | ||
| 1312 | /* Looks like: wmi:guid */ | ||
| 1313 | static int do_wmi_entry(const char *filename, void *symval, char *alias) | ||
| 1314 | { | ||
| 1315 | int len; | ||
| 1316 | DEF_FIELD_ADDR(symval, wmi_device_id, guid_string); | ||
| 1317 | |||
| 1318 | if (strlen(*guid_string) != UUID_STRING_LEN) { | ||
| 1319 | warn("Invalid WMI device id 'wmi:%s' in '%s'\n", | ||
| 1320 | *guid_string, filename); | ||
| 1321 | return 0; | ||
| 1322 | } | ||
| 1323 | |||
| 1324 | len = snprintf(alias, ALIAS_SIZE, WMI_MODULE_PREFIX "%s", *guid_string); | ||
| 1325 | if (len < 0 || len >= ALIAS_SIZE) { | ||
| 1326 | warn("Could not generate all MODULE_ALIAS's in '%s'\n", | ||
| 1327 | filename); | ||
| 1328 | return 0; | ||
| 1329 | } | ||
| 1330 | return 1; | ||
| 1331 | } | ||
| 1332 | |||
| 1308 | /* Does namelen bytes of name exactly match the symbol? */ | 1333 | /* Does namelen bytes of name exactly match the symbol? */ |
| 1309 | static bool sym_is(const char *name, unsigned namelen, const char *symbol) | 1334 | static bool sym_is(const char *name, unsigned namelen, const char *symbol) |
| 1310 | { | 1335 | { |
| @@ -1321,7 +1346,7 @@ static void do_table(void *symval, unsigned long size, | |||
| 1321 | struct module *mod) | 1346 | struct module *mod) |
| 1322 | { | 1347 | { |
| 1323 | unsigned int i; | 1348 | unsigned int i; |
| 1324 | char alias[500]; | 1349 | char alias[ALIAS_SIZE]; |
| 1325 | 1350 | ||
| 1326 | device_id_check(mod->name, device_id, size, id_size, symval); | 1351 | device_id_check(mod->name, device_id, size, id_size, symval); |
| 1327 | /* Leave last one: it's the terminator. */ | 1352 | /* Leave last one: it's the terminator. */ |
| @@ -1376,6 +1401,7 @@ static const struct devtable devtable[] = { | |||
| 1376 | {"tbsvc", SIZE_tb_service_id, do_tbsvc_entry}, | 1401 | {"tbsvc", SIZE_tb_service_id, do_tbsvc_entry}, |
| 1377 | {"typec", SIZE_typec_device_id, do_typec_entry}, | 1402 | {"typec", SIZE_typec_device_id, do_typec_entry}, |
| 1378 | {"tee", SIZE_tee_client_device_id, do_tee_entry}, | 1403 | {"tee", SIZE_tee_client_device_id, do_tee_entry}, |
| 1404 | {"wmi", SIZE_wmi_device_id, do_wmi_entry}, | ||
| 1379 | }; | 1405 | }; |
| 1380 | 1406 | ||
| 1381 | /* Create MODULE_ALIAS() statements. | 1407 | /* Create MODULE_ALIAS() statements. |
