Linux Audio

Check our new training course

Loading...
Note: File does not exist in v4.6.
 1/*
 2 * WMI Thunderbolt driver
 3 *
 4 * Copyright (C) 2017 Dell Inc. All Rights Reserved.
 5 *
 6 *  This program is free software; you can redistribute it and/or modify it
 7 *  under the terms of the GNU General Public License version 2 as published
 8 *  by the Free Software Foundation.
 9 *
10 *  This program is distributed in the hope that it will be useful,
11 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 *  GNU General Public License for more details.
14 */
15
16#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
17
18#include <linux/acpi.h>
19#include <linux/device.h>
20#include <linux/fs.h>
21#include <linux/kernel.h>
22#include <linux/module.h>
23#include <linux/string.h>
24#include <linux/sysfs.h>
25#include <linux/types.h>
26#include <linux/wmi.h>
27
28#define INTEL_WMI_THUNDERBOLT_GUID "86CCFD48-205E-4A77-9C48-2021CBEDE341"
29
30static ssize_t force_power_store(struct device *dev,
31				 struct device_attribute *attr,
32				 const char *buf, size_t count)
33{
34	struct acpi_buffer input;
35	acpi_status status;
36	u8 mode;
37
38	input.length = sizeof(u8);
39	input.pointer = &mode;
40	mode = hex_to_bin(buf[0]);
41	if (mode == 0 || mode == 1) {
42		status = wmi_evaluate_method(INTEL_WMI_THUNDERBOLT_GUID, 0, 1,
43					     &input, NULL);
44		if (ACPI_FAILURE(status))
45			return -ENODEV;
46	} else {
47		return -EINVAL;
48	}
49	return count;
50}
51
52static DEVICE_ATTR_WO(force_power);
53
54static struct attribute *tbt_attrs[] = {
55	&dev_attr_force_power.attr,
56	NULL
57};
58
59static const struct attribute_group tbt_attribute_group = {
60	.attrs = tbt_attrs,
61};
62
63static int intel_wmi_thunderbolt_probe(struct wmi_device *wdev)
64{
65	int ret;
66
67	ret = sysfs_create_group(&wdev->dev.kobj, &tbt_attribute_group);
68	kobject_uevent(&wdev->dev.kobj, KOBJ_CHANGE);
69	return ret;
70}
71
72static int intel_wmi_thunderbolt_remove(struct wmi_device *wdev)
73{
74	sysfs_remove_group(&wdev->dev.kobj, &tbt_attribute_group);
75	kobject_uevent(&wdev->dev.kobj, KOBJ_CHANGE);
76	return 0;
77}
78
79static const struct wmi_device_id intel_wmi_thunderbolt_id_table[] = {
80	{ .guid_string = INTEL_WMI_THUNDERBOLT_GUID },
81	{ },
82};
83
84static struct wmi_driver intel_wmi_thunderbolt_driver = {
85	.driver = {
86		.name = "intel-wmi-thunderbolt",
87	},
88	.probe = intel_wmi_thunderbolt_probe,
89	.remove = intel_wmi_thunderbolt_remove,
90	.id_table = intel_wmi_thunderbolt_id_table,
91};
92
93module_wmi_driver(intel_wmi_thunderbolt_driver);
94
95MODULE_ALIAS("wmi:" INTEL_WMI_THUNDERBOLT_GUID);
96MODULE_AUTHOR("Mario Limonciello <mario.limonciello@dell.com>");
97MODULE_DESCRIPTION("Intel WMI Thunderbolt force power driver");
98MODULE_LICENSE("GPL");