Commit 6c3df88f authored by Lee, Chun-Yi's avatar Lee, Chun-Yi Committed by Matthew Garrett

acer-wmi: Detect the WiFi/Bluetooth/3G devices available

Check the Acer OEM-specific Type AA to detect the WiFi/Bluetooth/3G
devices available or not, and set the devices capability flag.
Signed-off-by: default avatarLee, Chun-Yi <jlee@novell.com>
Reviewed-by: default avatarJean Delvare <jdelvare@suse.de>
Reviewed-by: default avatarDmitry Torokhov <dtor@mail.ru>
Acked-by: default avatarThomas Renninger <trenn@suse.de>
Acked-by: default avatarJiri Benc <jbenc@suse.cz>
Cc: Carlos Corbacho <carlos@strangeworlds.co.uk>
Cc: Corentin Chary <corentincj@iksaif.net>
Signed-off-by: default avatarMatthew Garrett <mjg@redhat.com>
parent b3c9092b
...@@ -39,6 +39,7 @@ ...@@ -39,6 +39,7 @@
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/input.h> #include <linux/input.h>
#include <linux/input/sparse-keymap.h> #include <linux/input/sparse-keymap.h>
#include <linux/dmi.h>
#include <acpi/acpi_drivers.h> #include <acpi/acpi_drivers.h>
...@@ -124,7 +125,9 @@ struct event_return_value { ...@@ -124,7 +125,9 @@ struct event_return_value {
/* /*
* GUID3 Get Device Status device flags * GUID3 Get Device Status device flags
*/ */
#define ACER_WMID3_GDS_WIRELESS (1<<0) /* WiFi */
#define ACER_WMID3_GDS_THREEG (1<<6) /* 3G */ #define ACER_WMID3_GDS_THREEG (1<<6) /* 3G */
#define ACER_WMID3_GDS_BLUETOOTH (1<<11) /* BT */
struct wmid3_gds_input_param { /* Get Device Status input parameter */ struct wmid3_gds_input_param { /* Get Device Status input parameter */
u8 function_num; /* Function Number */ u8 function_num; /* Function Number */
...@@ -139,6 +142,13 @@ struct wmid3_gds_return_value { /* Get Device Status return value*/ ...@@ -139,6 +142,13 @@ struct wmid3_gds_return_value { /* Get Device Status return value*/
u32 reserved; u32 reserved;
} __attribute__((packed)); } __attribute__((packed));
struct hotkey_function_type_aa {
u8 type;
u8 length;
u16 handle;
u16 commun_func_bitmap;
} __attribute__((packed));
/* /*
* Interface capability flags * Interface capability flags
*/ */
...@@ -169,6 +179,7 @@ static int mailled = -1; ...@@ -169,6 +179,7 @@ static int mailled = -1;
static int brightness = -1; static int brightness = -1;
static int threeg = -1; static int threeg = -1;
static int force_series; static int force_series;
static bool has_type_aa;
module_param(mailled, int, 0444); module_param(mailled, int, 0444);
module_param(brightness, int, 0444); module_param(brightness, int, 0444);
...@@ -807,6 +818,28 @@ static acpi_status WMID_set_u32(u32 value, u32 cap, struct wmi_interface *iface) ...@@ -807,6 +818,28 @@ static acpi_status WMID_set_u32(u32 value, u32 cap, struct wmi_interface *iface)
return WMI_execute_u32(method_id, (u32)value, NULL); return WMI_execute_u32(method_id, (u32)value, NULL);
} }
static void type_aa_dmi_decode(const struct dmi_header *header, void *dummy)
{
struct hotkey_function_type_aa *type_aa;
/* We are looking for OEM-specific Type AAh */
if (header->type != 0xAA)
return;
has_type_aa = true;
type_aa = (struct hotkey_function_type_aa *) header;
printk(ACER_INFO "Function bitmap for Communication Button: 0x%x\n",
type_aa->commun_func_bitmap);
if (type_aa->commun_func_bitmap & ACER_WMID3_GDS_WIRELESS)
interface->capability |= ACER_CAP_WIRELESS;
if (type_aa->commun_func_bitmap & ACER_WMID3_GDS_THREEG)
interface->capability |= ACER_CAP_THREEG;
if (type_aa->commun_func_bitmap & ACER_WMID3_GDS_BLUETOOTH)
interface->capability |= ACER_CAP_BLUETOOTH;
}
static acpi_status WMID_set_capabilities(void) static acpi_status WMID_set_capabilities(void)
{ {
struct acpi_buffer out = {ACPI_ALLOCATE_BUFFER, NULL}; struct acpi_buffer out = {ACPI_ALLOCATE_BUFFER, NULL};
...@@ -827,16 +860,17 @@ static acpi_status WMID_set_capabilities(void) ...@@ -827,16 +860,17 @@ static acpi_status WMID_set_capabilities(void)
return AE_ERROR; return AE_ERROR;
} }
/* Not sure on the meaning of the relevant bits yet to detect these */ dmi_walk(type_aa_dmi_decode, NULL);
interface->capability |= ACER_CAP_WIRELESS; if (!has_type_aa) {
interface->capability |= ACER_CAP_THREEG; interface->capability |= ACER_CAP_WIRELESS;
interface->capability |= ACER_CAP_THREEG;
if (devices & 0x10)
interface->capability |= ACER_CAP_BLUETOOTH;
}
/* WMID always provides brightness methods */ /* WMID always provides brightness methods */
interface->capability |= ACER_CAP_BRIGHTNESS; interface->capability |= ACER_CAP_BRIGHTNESS;
if (devices & 0x10)
interface->capability |= ACER_CAP_BLUETOOTH;
if (!(devices & 0x20)) if (!(devices & 0x20))
max_brightness = 0x9; max_brightness = 0x9;
...@@ -915,7 +949,8 @@ static void __init acer_commandline_init(void) ...@@ -915,7 +949,8 @@ static void __init acer_commandline_init(void)
* capability isn't available on the given interface * capability isn't available on the given interface
*/ */
set_u32(mailled, ACER_CAP_MAILLED); set_u32(mailled, ACER_CAP_MAILLED);
set_u32(threeg, ACER_CAP_THREEG); if (!has_type_aa)
set_u32(threeg, ACER_CAP_THREEG);
set_u32(brightness, ACER_CAP_BRIGHTNESS); set_u32(brightness, ACER_CAP_BRIGHTNESS);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment