diff options
Diffstat (limited to 'drivers/misc/acer-wmi.c')
-rw-r--r-- | drivers/misc/acer-wmi.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/drivers/misc/acer-wmi.c b/drivers/misc/acer-wmi.c index e7a3fe508dff..c6c77a505ec1 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: |
@@ -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; |