diff options
Diffstat (limited to 'drivers/misc/acer-wmi.c')
| -rw-r--r-- | drivers/misc/acer-wmi.c | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/drivers/misc/acer-wmi.c b/drivers/misc/acer-wmi.c index e7a3fe508dff..d8b0d326e452 100644 --- a/drivers/misc/acer-wmi.c +++ b/drivers/misc/acer-wmi.c | |||
| @@ -192,6 +192,9 @@ static struct quirk_entry *quirks; | |||
| 192 | 192 | ||
| 193 | static void set_quirks(void) | 193 | static void set_quirks(void) |
| 194 | { | 194 | { |
| 195 | if (!interface) | ||
| 196 | return; | ||
| 197 | |||
| 195 | if (quirks->mailled) | 198 | if (quirks->mailled) |
| 196 | interface->capability |= ACER_CAP_MAILLED; | 199 | interface->capability |= ACER_CAP_MAILLED; |
| 197 | 200 | ||
| @@ -803,11 +806,30 @@ static acpi_status get_u32(u32 *value, u32 cap) | |||
| 803 | 806 | ||
| 804 | static acpi_status set_u32(u32 value, u32 cap) | 807 | static acpi_status set_u32(u32 value, u32 cap) |
| 805 | { | 808 | { |
| 809 | acpi_status status; | ||
| 810 | |||
| 806 | if (interface->capability & cap) { | 811 | if (interface->capability & cap) { |
| 807 | switch (interface->type) { | 812 | switch (interface->type) { |
| 808 | case ACER_AMW0: | 813 | case ACER_AMW0: |
| 809 | return AMW0_set_u32(value, cap, interface); | 814 | return AMW0_set_u32(value, cap, interface); |
| 810 | case ACER_AMW0_V2: | 815 | case ACER_AMW0_V2: |
| 816 | if (cap == ACER_CAP_MAILLED) | ||
| 817 | return AMW0_set_u32(value, cap, interface); | ||
| 818 | |||
| 819 | /* | ||
| 820 | * On some models, some WMID methods don't toggle | ||
| 821 | * properly. For those cases, we want to run the AMW0 | ||
| 822 | * method afterwards to be certain we've really toggled | ||
| 823 | * the device state. | ||
| 824 | */ | ||
| 825 | if (cap == ACER_CAP_WIRELESS || | ||
| 826 | cap == ACER_CAP_BLUETOOTH) { | ||
| 827 | status = WMID_set_u32(value, cap, interface); | ||
| 828 | if (ACPI_FAILURE(status)) | ||
| 829 | return status; | ||
| 830 | |||
| 831 | return AMW0_set_u32(value, cap, interface); | ||
| 832 | } | ||
| 811 | case ACER_WMID: | 833 | case ACER_WMID: |
| 812 | return WMID_set_u32(value, cap, interface); | 834 | return WMID_set_u32(value, cap, interface); |
| 813 | default: | 835 | default: |
| @@ -1167,7 +1189,7 @@ static int create_debugfs(void) | |||
| 1167 | return 0; | 1189 | return 0; |
| 1168 | 1190 | ||
| 1169 | error_debugfs: | 1191 | error_debugfs: |
| 1170 | remove_debugfs(); | 1192 | remove_debugfs(); |
| 1171 | return -ENOMEM; | 1193 | return -ENOMEM; |
| 1172 | } | 1194 | } |
| 1173 | 1195 | ||
| @@ -1218,6 +1240,8 @@ static int __init acer_wmi_init(void) | |||
| 1218 | return -ENODEV; | 1240 | return -ENODEV; |
| 1219 | } | 1241 | } |
| 1220 | 1242 | ||
| 1243 | set_quirks(); | ||
| 1244 | |||
| 1221 | if (platform_driver_register(&acer_platform_driver)) { | 1245 | if (platform_driver_register(&acer_platform_driver)) { |
| 1222 | printk(ACER_ERR "Unable to register platform driver.\n"); | 1246 | printk(ACER_ERR "Unable to register platform driver.\n"); |
| 1223 | goto error_platform_register; | 1247 | goto error_platform_register; |
| @@ -1248,6 +1272,7 @@ error_platform_register: | |||
| 1248 | static void __exit acer_wmi_exit(void) | 1272 | static void __exit acer_wmi_exit(void) |
| 1249 | { | 1273 | { |
| 1250 | remove_sysfs(acer_platform_device); | 1274 | remove_sysfs(acer_platform_device); |
| 1275 | remove_debugfs(); | ||
| 1251 | platform_device_del(acer_platform_device); | 1276 | platform_device_del(acer_platform_device); |
| 1252 | platform_driver_unregister(&acer_platform_driver); | 1277 | platform_driver_unregister(&acer_platform_driver); |
| 1253 | 1278 | ||
