diff options
Diffstat (limited to 'drivers/misc')
-rw-r--r-- | drivers/misc/acer-wmi.c | 66 |
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 | ||
156 | struct 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 */ |
156 | struct wmi_interface { | 163 | struct 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 | */ | ||
971 | static 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 | */ |
961 | static int __devinit acer_platform_probe(struct platform_device *device) | 993 | static 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 | ||
1149 | static void remove_debugfs(void) | ||
1150 | { | ||
1151 | debugfs_remove(interface->debug.devices); | ||
1152 | debugfs_remove(interface->debug.root); | ||
1153 | } | ||
1154 | |||
1155 | static 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 | |||
1171 | error_debugfs: | ||
1172 | remove_debugfs(); | ||
1173 | return -ENOMEM; | ||
1174 | } | ||
1175 | |||
1117 | static int __init acer_wmi_init(void) | 1176 | static 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 | ||