aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/misc
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/misc')
-rw-r--r--drivers/misc/acer-wmi.c66
1 files changed, 66 insertions, 0 deletions
diff --git a/drivers/misc/acer-wmi.c b/drivers/misc/acer-wmi.c
index dd0b8d8b5bd9..d8b8574e303c 100644
--- a/drivers/misc/acer-wmi.c
+++ b/drivers/misc/acer-wmi.c
@@ -35,6 +35,7 @@
35#include <linux/platform_device.h> 35#include <linux/platform_device.h>
36#include <linux/acpi.h> 36#include <linux/acpi.h>
37#include <linux/i8042.h> 37#include <linux/i8042.h>
38#include <linux/debugfs.h>
38 39
39#include <acpi/acpi_drivers.h> 40#include <acpi/acpi_drivers.h>
40 41
@@ -152,6 +153,12 @@ struct acer_data {
152 int brightness; 153 int brightness;
153}; 154};
154 155
156struct acer_debug {
157 struct dentry *root;
158 struct dentry *devices;
159 u32 wmid_devices;
160};
161
155/* Each low-level interface must define at least some of the following */ 162/* Each low-level interface must define at least some of the following */
156struct wmi_interface { 163struct wmi_interface {
157 /* The WMI device type */ 164 /* The WMI device type */
@@ -162,6 +169,9 @@ struct wmi_interface {
162 169
163 /* Private data for the current interface */ 170 /* Private data for the current interface */
164 struct acer_data data; 171 struct acer_data data;
172
173 /* debugfs entries associated with this interface */
174 struct acer_debug debug;
165}; 175};
166 176
167/* The static interface pointer, points to the currently detected interface */ 177/* The static interface pointer, points to the currently detected interface */
@@ -956,6 +966,28 @@ static DEVICE_ATTR(interface, S_IWUGO | S_IRUGO | S_IWUSR,
956 show_interface, NULL); 966 show_interface, NULL);
957 967
958/* 968/*
969 * debugfs functions
970 */
971static u32 get_wmid_devices(void)
972{
973 struct acpi_buffer out = {ACPI_ALLOCATE_BUFFER, NULL};
974 union acpi_object *obj;
975 acpi_status status;
976
977 status = wmi_query_block(WMID_GUID2, 1, &out);
978 if (ACPI_FAILURE(status))
979 return 0;
980
981 obj = (union acpi_object *) out.pointer;
982 if (obj && obj->type == ACPI_TYPE_BUFFER &&
983 obj->buffer.length == sizeof(u32)) {
984 return *((u32 *) obj->buffer.pointer);
985 } else {
986 return 0;
987 }
988}
989
990/*
959 * Platform device 991 * Platform device
960 */ 992 */
961static int __devinit acer_platform_probe(struct platform_device *device) 993static int __devinit acer_platform_probe(struct platform_device *device)
@@ -1114,6 +1146,33 @@ error_sysfs:
1114 return retval; 1146 return retval;
1115} 1147}
1116 1148
1149static void remove_debugfs(void)
1150{
1151 debugfs_remove(interface->debug.devices);
1152 debugfs_remove(interface->debug.root);
1153}
1154
1155static int create_debugfs(void)
1156{
1157 interface->debug.root = debugfs_create_dir("acer-wmi", NULL);
1158 if (!interface->debug.root) {
1159 printk(ACER_ERR "Failed to create debugfs directory");
1160 return -ENOMEM;
1161 }
1162
1163 interface->debug.devices = debugfs_create_u32("devices", S_IRUGO,
1164 interface->debug.root,
1165 &interface->debug.wmid_devices);
1166 if (!interface->debug.devices)
1167 goto error_debugfs;
1168
1169 return 0;
1170
1171error_debugfs:
1172 remove_debugfs();
1173 return -ENOMEM;
1174}
1175
1117static int __init acer_wmi_init(void) 1176static int __init acer_wmi_init(void)
1118{ 1177{
1119 int err; 1178 int err;
@@ -1173,6 +1232,13 @@ static int __init acer_wmi_init(void)
1173 if (err) 1232 if (err)
1174 return err; 1233 return err;
1175 1234
1235 if (wmi_has_guid(WMID_GUID2)) {
1236 interface->debug.wmid_devices = get_wmid_devices();
1237 err = create_debugfs();
1238 if (err)
1239 return err;
1240 }
1241
1176 /* Override any initial settings with values from the commandline */ 1242 /* Override any initial settings with values from the commandline */
1177 acer_commandline_init(); 1243 acer_commandline_init();
1178 1244