diff options
author | Carlos Corbacho <carlos@strangeworlds.co.uk> | 2008-06-21 04:09:53 -0400 |
---|---|---|
committer | Andi Kleen <andi@basil.nowhere.org> | 2008-07-16 17:27:02 -0400 |
commit | 81143522aa823036c4aa35bdd3b2e41966cf6e15 (patch) | |
tree | a196808097139443ba355450c36a22b816fda0d9 | |
parent | 5753dd539a86d8fc40a25e1a2cd1005a6525f083 (diff) |
acer-wmi: Add debugfs file for device detection
Add a debugfs file for showing the full results of the method we use to
detect devices on WMID laptops.
This should be useful in the case that a Linux user gets an Acer laptop
with 3G support (and/ or people who enjoy ripping their wireless cards out)
so we can get some feedback on how this value changes in these cases.
(At the moment, we always enable the wireless and 3G control. In the case
of the former, this is fairly safe. In the case of the latter though,
trying to toggle this device if it doesn't exist on a laptop causes ACPI
warnings/ errors).
To summarise: If you have an Acer laptop with a built in 3G card, please
report back the value from this file.
Signed-off-by: Carlos Corbacho <carlos@strangeworlds.co.uk>
Signed-off-by: Len Brown <len.brown@intel.com>
Signed-off-by: Andi Kleen <ak@linux.intel.com>
-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 | ||