Commit e067aaa7 authored by Karol Kozimor's avatar Karol Kozimor Committed by Len Brown

ACPI: asus_acpi: handle internal Bluetooth / support W5A

This patch creates a new file named "bluetooth" under /proc/acpi/asus/.
This file controls both the internal Bluetooth adapter's presence on the
USB bus and the associated LED.

echo 1 > /proc/acpi/asus/bluetooth to enable, 0 to disable.

Additionally, the patch add support for Asus W5A, the first model that uses
this feature.

Patch originally by Fernando A. P. Gomes.
Signed-off-by: default avatarKarol Kozimor <sziwan@hell.org.pl>
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent f78c589d
...@@ -45,6 +45,7 @@ ...@@ -45,6 +45,7 @@
#define PROC_MLED "mled" #define PROC_MLED "mled"
#define PROC_WLED "wled" #define PROC_WLED "wled"
#define PROC_TLED "tled" #define PROC_TLED "tled"
#define PROC_BT "bluetooth"
#define PROC_LEDD "ledd" #define PROC_LEDD "ledd"
#define PROC_INFO "info" #define PROC_INFO "info"
#define PROC_LCD "lcd" #define PROC_LCD "lcd"
...@@ -65,9 +66,10 @@ ...@@ -65,9 +66,10 @@
/* /*
* Flags for hotk status * Flags for hotk status
*/ */
#define MLED_ON 0x01 //is MLED ON ? #define MLED_ON 0x01 //mail LED
#define WLED_ON 0x02 #define WLED_ON 0x02 //wireless LED
#define TLED_ON 0x04 #define TLED_ON 0x04 //touchpad LED
#define BT_ON 0x08 //internal Bluetooth
MODULE_AUTHOR("Julien Lerouge, Karol Kozimor"); MODULE_AUTHOR("Julien Lerouge, Karol Kozimor");
MODULE_DESCRIPTION(ACPI_HOTK_NAME); MODULE_DESCRIPTION(ACPI_HOTK_NAME);
...@@ -91,7 +93,9 @@ struct model_data { ...@@ -91,7 +93,9 @@ struct model_data {
char *mt_tled; //method to handle tled_____________R char *mt_tled; //method to handle tled_____________R
char *tled_status; //node to handle tled reading_______A char *tled_status; //node to handle tled reading_______A
char *mt_ledd; //method to handle LED display______R char *mt_ledd; //method to handle LED display______R
char *mt_lcd_switch; //method to turn LCD ON/OFF_________A char *mt_bt_switch; //method to switch Bluetooth on/off_R
char *bt_status; //no model currently supports this__?
char *mt_lcd_switch; //method to turn LCD on/off_________A
char *lcd_status; //node to read LCD panel state______A char *lcd_status; //node to read LCD panel state______A
char *brightness_up; //method to set brightness up_______A char *brightness_up; //method to set brightness up_______A
char *brightness_down; //guess what ?______________________A char *brightness_down; //guess what ?______________________A
...@@ -133,6 +137,7 @@ struct asus_hotk { ...@@ -133,6 +137,7 @@ struct asus_hotk {
S1x, //S1300A, but also L1400B and M2400A (L84F) S1x, //S1300A, but also L1400B and M2400A (L84F)
S2x, //S200 (J1 reported), Victor MP-XP7210 S2x, //S200 (J1 reported), Victor MP-XP7210
W1N, //W1000N W1N, //W1000N
W5A, //W5A
xxN, //M2400N, M3700N, M5200N, M6800N, S1300N, S5200N xxN, //M2400N, M3700N, M5200N, M6800N, S1300N, S5200N
//(Centrino) //(Centrino)
END_MODEL END_MODEL
...@@ -359,6 +364,16 @@ static struct model_data model_conf[END_MODEL] = { ...@@ -359,6 +364,16 @@ static struct model_data model_conf[END_MODEL] = {
.display_set = "SDSP", .display_set = "SDSP",
.display_get = "\\ADVG"}, .display_get = "\\ADVG"},
{
.name = "W5A",
.mt_bt_switch = "BLED",
.mt_wled = "WLED",
.mt_lcd_switch = xxN_PREFIX "_Q10",
.brightness_set = "SPLV",
.brightness_get = "GPLV",
.display_set = "SDSP",
.display_get = "\\ADVG"},
{ {
.name = "xxN", .name = "xxN",
.mt_mled = "MLED", .mt_mled = "MLED",
...@@ -625,6 +640,25 @@ proc_write_wled(struct file *file, const char __user * buffer, ...@@ -625,6 +640,25 @@ proc_write_wled(struct file *file, const char __user * buffer,
return write_led(buffer, count, hotk->methods->mt_wled, WLED_ON, 0); return write_led(buffer, count, hotk->methods->mt_wled, WLED_ON, 0);
} }
/*
* Proc handlers for Bluetooth
*/
static int
proc_read_bluetooth(char *page, char **start, off_t off, int count, int *eof,
void *data)
{
return sprintf(page, "%d\n", read_led(hotk->methods->bt_status, BT_ON));
}
static int
proc_write_bluetooth(struct file *file, const char __user * buffer,
unsigned long count, void *data)
{
/* Note: mt_bt_switch controls both internal Bluetooth adapter's
presence and its LED */
return write_led(buffer, count, hotk->methods->mt_bt_switch, BT_ON, 0);
}
/* /*
* Proc handlers for TLED * Proc handlers for TLED
*/ */
...@@ -936,6 +970,11 @@ static int asus_hotk_add_fs(struct acpi_device *device) ...@@ -936,6 +970,11 @@ static int asus_hotk_add_fs(struct acpi_device *device)
mode, device); mode, device);
} }
if (hotk->methods->mt_bt_switch) {
asus_proc_add(PROC_BT, &proc_write_bluetooth,
&proc_read_bluetooth, mode, device);
}
/* /*
* We need both read node and write method as LCD switch is also accessible * We need both read node and write method as LCD switch is also accessible
* from keyboard * from keyboard
...@@ -971,6 +1010,8 @@ static int asus_hotk_remove_fs(struct acpi_device *device) ...@@ -971,6 +1010,8 @@ static int asus_hotk_remove_fs(struct acpi_device *device)
remove_proc_entry(PROC_TLED, acpi_device_dir(device)); remove_proc_entry(PROC_TLED, acpi_device_dir(device));
if (hotk->methods->mt_ledd) if (hotk->methods->mt_ledd)
remove_proc_entry(PROC_LEDD, acpi_device_dir(device)); remove_proc_entry(PROC_LEDD, acpi_device_dir(device));
if (hotk->methods->mt_bt_switch)
remove_proc_entry(PROC_BT, acpi_device_dir(device));
if (hotk->methods->mt_lcd_switch && hotk->methods->lcd_status) if (hotk->methods->mt_lcd_switch && hotk->methods->lcd_status)
remove_proc_entry(PROC_LCD, acpi_device_dir(device)); remove_proc_entry(PROC_LCD, acpi_device_dir(device));
if ((hotk->methods->brightness_up if ((hotk->methods->brightness_up
...@@ -1124,6 +1165,8 @@ static int asus_hotk_get_info(void) ...@@ -1124,6 +1165,8 @@ static int asus_hotk_get_info(void)
hotk->model = A4G; hotk->model = A4G;
else if (strncmp(model->string.pointer, "W1N", 3) == 0) else if (strncmp(model->string.pointer, "W1N", 3) == 0)
hotk->model = W1N; hotk->model = W1N;
else if (strncmp(model->string.pointer, "W5A", 3) == 0)
hotk->model = W5A;
if (hotk->model == END_MODEL) { if (hotk->model == END_MODEL) {
printk("unsupported, trying default values, supply the " printk("unsupported, trying default values, supply the "
......
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