1 | // SPDX-License-Identifier: GPL-2.0 |
2 | /* |
3 | * WMI Thunderbolt driver |
4 | * |
5 | * Copyright (C) 2017 Dell Inc. All Rights Reserved. |
6 | */ |
7 | |
8 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt |
9 | |
10 | #include <linux/acpi.h> |
11 | #include <linux/device.h> |
12 | #include <linux/fs.h> |
13 | #include <linux/kernel.h> |
14 | #include <linux/module.h> |
15 | #include <linux/string.h> |
16 | #include <linux/sysfs.h> |
17 | #include <linux/types.h> |
18 | #include <linux/wmi.h> |
19 | |
20 | #define INTEL_WMI_THUNDERBOLT_GUID "86CCFD48-205E-4A77-9C48-2021CBEDE341" |
21 | |
22 | static ssize_t force_power_store(struct device *dev, |
23 | struct device_attribute *attr, |
24 | const char *buf, size_t count) |
25 | { |
26 | struct acpi_buffer input; |
27 | acpi_status status; |
28 | u8 mode; |
29 | |
30 | input.length = sizeof(u8); |
31 | input.pointer = &mode; |
32 | mode = hex_to_bin(ch: buf[0]); |
33 | dev_dbg(dev, "force_power: storing %#x\n" , mode); |
34 | if (mode == 0 || mode == 1) { |
35 | status = wmidev_evaluate_method(to_wmi_device(dev), instance: 0, method_id: 1, in: &input, NULL); |
36 | if (ACPI_FAILURE(status)) { |
37 | dev_dbg(dev, "force_power: failed to evaluate ACPI method\n" ); |
38 | return -ENODEV; |
39 | } |
40 | } else { |
41 | dev_dbg(dev, "force_power: unsupported mode\n" ); |
42 | return -EINVAL; |
43 | } |
44 | return count; |
45 | } |
46 | |
47 | static DEVICE_ATTR_WO(force_power); |
48 | |
49 | static struct attribute *tbt_attrs[] = { |
50 | &dev_attr_force_power.attr, |
51 | NULL |
52 | }; |
53 | ATTRIBUTE_GROUPS(tbt); |
54 | |
55 | static const struct wmi_device_id intel_wmi_thunderbolt_id_table[] = { |
56 | { .guid_string = INTEL_WMI_THUNDERBOLT_GUID }, |
57 | { }, |
58 | }; |
59 | |
60 | static struct wmi_driver intel_wmi_thunderbolt_driver = { |
61 | .driver = { |
62 | .name = "intel-wmi-thunderbolt" , |
63 | .dev_groups = tbt_groups, |
64 | }, |
65 | .id_table = intel_wmi_thunderbolt_id_table, |
66 | .no_singleton = true, |
67 | }; |
68 | |
69 | module_wmi_driver(intel_wmi_thunderbolt_driver); |
70 | |
71 | MODULE_DEVICE_TABLE(wmi, intel_wmi_thunderbolt_id_table); |
72 | MODULE_AUTHOR("Mario Limonciello <mario.limonciello@dell.com>" ); |
73 | MODULE_DESCRIPTION("Intel WMI Thunderbolt force power driver" ); |
74 | MODULE_LICENSE("GPL v2" ); |
75 | |