classmate-laptop: little optimization for cmpc_rfkill_block
authorHerton Ronaldo Krzesinski <herton@mandriva.com.br>
Tue, 30 Nov 2010 18:30:43 +0000 (16:30 -0200)
committerMatthew Garrett <mjg@redhat.com>
Fri, 7 Jan 2011 22:03:41 +0000 (17:03 -0500)
We don't need to call bios/acpi (cmpc_set_rfkill_wlan) if the blocked
state is already set to the same value (little optimization). This can
happen for example if we initialize the module with same initial
hardware state (rfkill core always call cmpc_rfkill_block on
initialization here).

Also GWRI method only accepts 0 or 1 for setting rfkill block, as can be
seen on AML code from acpidump->DSDT from a classmate sample I have, so
should be fine setting state only to 0 or 1 directly.

Signed-off-by: Herton Ronaldo Krzesinski <herton@mandriva.com.br>
Signed-off-by: Matthew Garrett <mjg@redhat.com>
Acked-by: Thadeu Lima de Souza Cascardo <cascardo@holoscopio.com>
drivers/platform/x86/classmate-laptop.c

index d2b7720c0e6f713c89d3c03d2ca2cf8787aebb4f..3dabd00b1d5a13d0fee3184b80d8a3e04fdd6dec 100644 (file)
@@ -522,18 +522,20 @@ static int cmpc_rfkill_block(void *data, bool blocked)
        acpi_status status;
        acpi_handle handle;
        unsigned long long state;
+       bool is_blocked;
 
        handle = data;
        status = cmpc_get_rfkill_wlan(handle, &state);
        if (ACPI_FAILURE(status))
                return -ENODEV;
-       if (blocked)
-               state &= ~1;
-       else
-               state |= 1;
-       status = cmpc_set_rfkill_wlan(handle, state);
-       if (ACPI_FAILURE(status))
-               return -ENODEV;
+       /* Check if we really need to call cmpc_set_rfkill_wlan */
+       is_blocked = state & 1 ? false : true;
+       if (is_blocked != blocked) {
+               state = blocked ? 0 : 1;
+               status = cmpc_set_rfkill_wlan(handle, state);
+               if (ACPI_FAILURE(status))
+                       return -ENODEV;
+       }
        return 0;
 }