* [PATCH 0/9] drivers/acpi/asus_acpi.c updates
@ 2006-01-18 21:21 Karol Kozimor
2006-01-18 21:26 ` [PATCH 1/9] misc cleanups Karol Kozimor
` (9 more replies)
0 siblings, 10 replies; 21+ messages in thread
From: Karol Kozimor @ 2006-01-18 21:21 UTC (permalink / raw)
To: Brown, Len; +Cc: linux-acpi
Hi,
The following batch of patches update the asus_acpi driver to version 0.30
through the following changes:
Readd WLED for S1N
Rework model detection for more flexibility and less oopses
Resolve confusion, "bluetooth" entry controls both the internal adapter
*and* its LED
Added support for L5D
Added support for W5A (patch from Fernando A. P. Gomes)
Added support for A4759GUH (A4G, patch from Giuseppe Rota)
Added support for W3400N
Added support for W1N LED display (thx Éric BURGHARD)
Added support for A3000G
Please apply.
Best regards,
--
Karol 'sziwan' Kozimor
sziwan@hell.org.pl
-
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH 1/9] misc cleanups
2006-01-18 21:21 [PATCH 0/9] drivers/acpi/asus_acpi.c updates Karol Kozimor
@ 2006-01-18 21:26 ` Karol Kozimor
2006-01-18 21:28 ` [PATCH 2/9] support A3G Karol Kozimor
` (8 subsequent siblings)
9 siblings, 0 replies; 21+ messages in thread
From: Karol Kozimor @ 2006-01-18 21:26 UTC (permalink / raw)
To: Brown, Len; +Cc: linux-acpi
This patch updates the version string, copyright notices and does
whitespace cleanup (it looks weird, blame Lindent).
Signed-off-by: Karol Kozimor <sziwan@hell.org.pl>
--- a/drivers/acpi/asus_acpi.c 2006-01-18 17:21:37.000000000 +0100
+++ b/drivers/acpi/asus_acpi.c 2006-01-18 18:31:18.000000000 +0100
@@ -2,7 +2,7 @@
* asus_acpi.c - Asus Laptop ACPI Extras
*
*
- * Copyright (C) 2002, 2003, 2004 Julien Lerouge, Karol Kozimor
+ * Copyright (C) 2002-2005 Julien Lerouge, 2003-2006 Karol Kozimor
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -27,10 +27,6 @@
* Johann Wiesner - Small compile fixes
* John Belmonte - ACPI code for Toshiba laptop was a good starting point.
*
- * TODO:
- * add Fn key status
- * Add mode selection on module loading (parameter) -> still necessary?
- * Complete display switching -- may require dirty hacks or calling _DOS?
*/
#include <linux/kernel.h>
@@ -42,7 +38,7 @@
#include <acpi/acpi_bus.h>
#include <asm/uaccess.h>
-#define ASUS_ACPI_VERSION "0.29"
+#define ASUS_ACPI_VERSION "0.30"
#define PROC_ASUS "asus" //the directory
#define PROC_MLED "mled"
@@ -149,17 +145,8 @@
static struct model_data model_conf[END_MODEL] = {
/*
- * Those pathnames are relative to the HOTK / ATKD device :
- * - mt_mled
- * - mt_wled
- * - brightness_set
- * - brightness_get
- * - display_set
- * - display_get
- *
* TODO I have seen a SWBX and AIBX method on some models, like L1400B,
* it seems to be a kind of switch, but what for ?
- *
*/
{
@@ -993,7 +980,7 @@
if (buffer.pointer == NULL)
return -EINVAL;
- model = (union acpi_object *) buffer.pointer;
+ model = (union acpi_object *)buffer.pointer;
/*
* Samsung P30 has a device with a valid _HID whose INIT does not
* return anything. It used to be possible to catch this exception,
@@ -1002,7 +989,8 @@
* identifier but it's still possible to get completely bogus data.
*/
if (model->type == ACPI_TYPE_STRING) {
- printk(KERN_NOTICE " %s model detected, ", model->string.pointer);
+ printk(KERN_NOTICE " %s model detected, ",
+ model->string.pointer);
} else {
if (asus_info && /* Samsung P30 */
strncmp(asus_info->oem_table_id, "ODEM", 4) == 0) {
@@ -1016,7 +1004,7 @@
"the developers with your DSDT\n");
}
hotk->methods = &model_conf[hotk->model];
-
+
acpi_os_free(model);
return AE_OK;
@@ -1162,8 +1150,7 @@
/* For laptops without GPLV: init the hotk->brightness value */
if ((!hotk->methods->brightness_get)
&& (!hotk->methods->brightness_status)
- && (hotk->methods->brightness_up
- && hotk->methods->brightness_down)) {
+ && (hotk->methods->brightness_up && hotk->methods->brightness_down)) {
status =
acpi_evaluate_object(NULL, hotk->methods->brightness_down,
NULL, NULL);
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH 2/9] support A3G
2006-01-18 21:21 [PATCH 0/9] drivers/acpi/asus_acpi.c updates Karol Kozimor
2006-01-18 21:26 ` [PATCH 1/9] misc cleanups Karol Kozimor
@ 2006-01-18 21:28 ` Karol Kozimor
2006-01-18 21:36 ` [PATCH 3/9] LED display support Karol Kozimor
` (7 subsequent siblings)
9 siblings, 0 replies; 21+ messages in thread
From: Karol Kozimor @ 2006-01-18 21:28 UTC (permalink / raw)
To: Brown, Len; +Cc: linux-acpi
This patch adds support for Asus A3G.
Signed-off-by: Karol Kozimor <sziwan@hell.org.pl>
--- a/drivers/acpi/asus_acpi.c 2006-01-18 17:27:23.000000000 +0100
+++ b/drivers/acpi/asus_acpi.c 2006-01-18 17:28:11.000000000 +0100
@@ -127,7 +127,7 @@ struct asus_hotk {
M1A, //M1300A
M2E, //M2400E, L4400L
M6N, //M6800N
- M6R, //M6700R
+ M6R, //M6700R, A3000G
P30, //Samsung P30
S1x, //S1300A, but also L1400B and M2400A (L84F)
S2x, //S200 (J1 reported), Victor MP-XP7210
@@ -1038,7 +1038,8 @@ static int __init asus_hotk_get_info(voi
hotk->model = L4R;
else if (strncmp(model->string.pointer, "M6N", 3) == 0)
hotk->model = M6N;
- else if (strncmp(model->string.pointer, "M6R", 3) == 0)
+ else if (strncmp(model->string.pointer, "M6R", 3) == 0 ||
+ strncmp(model->string.pointer, "A3G", 3) == 0)
hotk->model = M6R;
else if (strncmp(model->string.pointer, "M2N", 3) == 0 ||
strncmp(model->string.pointer, "M3N", 3) == 0 ||
@@ -1083,6 +1084,9 @@ static int __init asus_hotk_get_info(voi
hotk->methods->lcd_status = NULL;
/* L2B is similar enough to L3C to use its settings, with this only
exception */
+ else if (strncmp(model->string.pointer, "A3G", 3) == 0)
+ hotk->methods->lcd_status = "\\BLFG";
+ /* A3G is like M6R */
else if (strncmp(model->string.pointer, "S5N", 3) == 0 ||
strncmp(model->string.pointer, "M5N", 3) == 0)
hotk->methods->mt_mled = NULL;
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH 3/9] LED display support
2006-01-18 21:21 [PATCH 0/9] drivers/acpi/asus_acpi.c updates Karol Kozimor
2006-01-18 21:26 ` [PATCH 1/9] misc cleanups Karol Kozimor
2006-01-18 21:28 ` [PATCH 2/9] support A3G Karol Kozimor
@ 2006-01-18 21:36 ` Karol Kozimor
2006-01-18 21:38 ` [PATCH 4/9] support W3400N Karol Kozimor
` (6 subsequent siblings)
9 siblings, 0 replies; 21+ messages in thread
From: Karol Kozimor @ 2006-01-18 21:36 UTC (permalink / raw)
To: Brown, Len; +Cc: linux-acpi
This patch adds handling for front LED displays found on W1N and the like.
Additionally, W1N is given its own model_data instance.
Patch originally by Éric Burghard.
Signed-off-by: Karol Kozimor <sziwan@hell.org.pl>
--- a/drivers/acpi/asus_acpi.c 2006-01-18 17:28:11.000000000 +0100
+++ b/drivers/acpi/asus_acpi.c 2006-01-18 17:29:43.000000000 +0100
@@ -26,6 +26,7 @@
* Pontus Fuchs - Helper functions, cleanup
* Johann Wiesner - Small compile fixes
* John Belmonte - ACPI code for Toshiba laptop was a good starting point.
+ * Éric Burghard - LED display support for W1N
*
* TODO:
* add Fn key status
@@ -48,6 +49,7 @@
#define PROC_MLED "mled"
#define PROC_WLED "wled"
#define PROC_TLED "tled"
+#define PROC_LEDD "ledd"
#define PROC_INFO "info"
#define PROC_LCD "lcd"
#define PROC_BRN "brn"
@@ -92,6 +94,7 @@ struct model_data {
char *wled_status; //node to handle wled reading_______A
char *mt_tled; //method to handle tled_____________R
char *tled_status; //node to handle tled reading_______A
+ char *mt_ledd; //method to handle LED display______R
char *mt_lcd_switch; //method to turn LCD ON/OFF_________A
char *lcd_status; //node to read LCD panel state______A
char *brightness_up; //method to set brightness up_______A
@@ -111,6 +114,7 @@ struct asus_hotk {
struct acpi_device *device; //the device we are in
acpi_handle handle; //the handle of the hotk device
char status; //status of the hotk, for LEDs, ...
+ u32 ledd_status; //status of the LED display
struct model_data *methods; //methods available on the laptop
u8 brightness; //brightness level
enum {
@@ -131,7 +135,8 @@ struct asus_hotk {
P30, //Samsung P30
S1x, //S1300A, but also L1400B and M2400A (L84F)
S2x, //S200 (J1 reported), Victor MP-XP7210
- xxN, //M2400N, M3700N, M5200N, S1300N, S5200N, W1OOON
+ W1N, //W1000N
+ xxN, //M2400N, M3700N, M5200N, M6800N, S1300N, S5200N
//(Centrino)
END_MODEL
} model; //Models currently supported
@@ -345,6 +350,18 @@ static struct model_data model_conf[END_
.brightness_down = S2x_PREFIX "_Q0A"},
{
+ .name = "W1N",
+ .mt_mled = "MLED",
+ .mt_wled = "WLED",
+ .mt_ledd = "SLCM",
+ .mt_lcd_switch = xxN_PREFIX "_Q10",
+ .lcd_status = "\\BKLT",
+ .brightness_set = "SPLV",
+ .brightness_get = "GPLV",
+ .display_set = "SDSP",
+ .display_get = "\\ADVG"},
+
+ {
.name = "xxN",
.mt_mled = "MLED",
/* WLED present, but not controlled by ACPI */
@@ -563,6 +580,36 @@ proc_write_mled(struct file *file, const
}
/*
+ * Proc handlers for LED display
+ */
+static int
+proc_read_ledd(char *page, char **start, off_t off, int count, int *eof,
+ void *data)
+{
+ return sprintf(page, "0x%08x\n", hotk->ledd_status);
+}
+
+static int
+proc_write_ledd(struct file *file, const char __user * buffer,
+ unsigned long count, void *data)
+{
+ int value;
+
+ count = parse_arg(buffer, count, &value);
+ if (count > 0) {
+ if (!write_acpi_int
+ (hotk->handle, hotk->methods->mt_ledd, value, NULL))
+ printk(KERN_WARNING
+ "Asus ACPI: LED display write failed\n");
+ else
+ hotk->ledd_status = (u32) value;
+ } else if (count < 0)
+ printk(KERN_WARNING "Asus ACPI: Error reading user input\n");
+
+ return count;
+}
+
+/*
* Proc handlers for WLED
*/
static int
@@ -876,6 +923,11 @@ static int __init asus_hotk_add_fs(struc
mode, device);
}
+ if (hotk->methods->mt_ledd) {
+ asus_proc_add(PROC_LEDD, &proc_write_ledd, &proc_read_ledd,
+ mode, device);
+ }
+
if (hotk->methods->mt_mled) {
asus_proc_add(PROC_MLED, &proc_write_mled, &proc_read_mled,
mode, device);
@@ -919,6 +971,8 @@ static int asus_hotk_remove_fs(struct ac
remove_proc_entry(PROC_MLED, acpi_device_dir(device));
if (hotk->methods->mt_tled)
remove_proc_entry(PROC_TLED, acpi_device_dir(device));
+ if (hotk->methods->mt_ledd)
+ remove_proc_entry(PROC_LEDD, acpi_device_dir(device));
if (hotk->methods->mt_lcd_switch && hotk->methods->lcd_status)
remove_proc_entry(PROC_LCD, acpi_device_dir(device));
if ((hotk->methods->brightness_up
@@ -1046,8 +1100,7 @@ static int __init asus_hotk_get_info(voi
strncmp(model->string.pointer, "M5N", 3) == 0 ||
strncmp(model->string.pointer, "M6N", 3) == 0 ||
strncmp(model->string.pointer, "S1N", 3) == 0 ||
- strncmp(model->string.pointer, "S5N", 3) == 0 ||
- strncmp(model->string.pointer, "W1N", 3) == 0)
+ strncmp(model->string.pointer, "S5N", 3) == 0)
hotk->model = xxN;
else if (strncmp(model->string.pointer, "M1", 2) == 0)
hotk->model = M1A;
@@ -1068,6 +1121,8 @@ static int __init asus_hotk_get_info(voi
hotk->model = S2x;
else if (strncmp(model->string.pointer, "L5", 2) == 0)
hotk->model = L5x;
+ else if (strncmp(model->string.pointer, "W1N", 3) == 0)
+ hotk->model = W1N;
if (hotk->model == END_MODEL) {
printk("unsupported, trying default values, supply the "
@@ -1091,10 +1146,9 @@ static int __init asus_hotk_get_info(voi
strncmp(model->string.pointer, "M5N", 3) == 0)
hotk->methods->mt_mled = NULL;
/* S5N and M5N have no MLED */
- else if (strncmp(model->string.pointer, "M2N", 3) == 0 ||
- strncmp(model->string.pointer, "W1N", 3) == 0)
+ else if (strncmp(model->string.pointer, "M2N", 3) == 0)
hotk->methods->mt_wled = "WLED";
- /* M2N and W1N have a usable WLED */
+ /* M2N has a usable WLED */
else if (asus_info) {
if (strncmp(asus_info->oem_table_id, "L1", 2) == 0)
hotk->methods->mled_status = NULL;
@@ -1184,6 +1238,9 @@ static int __init asus_hotk_add(struct a
}
}
+ /* LED display is off by default */
+ hotk->ledd_status = 0xFFF;
+
end:
if (result) {
kfree(hotk);
-
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH 4/9] support W3400N
2006-01-18 21:21 [PATCH 0/9] drivers/acpi/asus_acpi.c updates Karol Kozimor
` (2 preceding siblings ...)
2006-01-18 21:36 ` [PATCH 3/9] LED display support Karol Kozimor
@ 2006-01-18 21:38 ` Karol Kozimor
2006-01-18 21:41 ` [PATCH 5/9] support A4G Karol Kozimor
` (5 subsequent siblings)
9 siblings, 0 replies; 21+ messages in thread
From: Karol Kozimor @ 2006-01-18 21:38 UTC (permalink / raw)
To: Brown, Len; +Cc: linux-acpi
This patch adds support for Asus W3400N.
Signed-off-by: Karol Kozimor <sziwan@hell.org.pl>
--- a/drivers/acpi/asus_acpi.c 2006-01-18 17:32:25.000000000 +0100
+++ b/drivers/acpi/asus_acpi.c 2006-01-18 17:36:00.000000000 +0100
@@ -130,7 +130,7 @@ struct asus_hotk {
L8L, //L8400L
M1A, //M1300A
M2E, //M2400E, L4400L
- M6N, //M6800N
+ M6N, //M6800N, W3400N
M6R, //M6700R, A3000G
P30, //Samsung P30
S1x, //S1300A, but also L1400B and M2400A (L84F)
@@ -1090,7 +1090,8 @@ static int __init asus_hotk_get_info(voi
hotk->model = L8L;
else if (strncmp(model->string.pointer, "L4R", 3) == 0)
hotk->model = L4R;
- else if (strncmp(model->string.pointer, "M6N", 3) == 0)
+ else if (strncmp(model->string.pointer, "M6N", 3) == 0 ||
+ strncmp(model->string.pointer, "W3N", 3) == 0)
hotk->model = M6N;
else if (strncmp(model->string.pointer, "M6R", 3) == 0 ||
strncmp(model->string.pointer, "A3G", 3) == 0)
@@ -1143,9 +1144,10 @@ static int __init asus_hotk_get_info(voi
hotk->methods->lcd_status = "\\BLFG";
/* A3G is like M6R */
else if (strncmp(model->string.pointer, "S5N", 3) == 0 ||
- strncmp(model->string.pointer, "M5N", 3) == 0)
+ strncmp(model->string.pointer, "M5N", 3) == 0 ||
+ strncmp(model->string.pointer, "W3N", 3) == 0)
hotk->methods->mt_mled = NULL;
- /* S5N and M5N have no MLED */
+ /* S5N, M5N and W3N have no MLED */
else if (strncmp(model->string.pointer, "M2N", 3) == 0)
hotk->methods->mt_wled = "WLED";
/* M2N has a usable WLED */
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH 5/9] support A4G
2006-01-18 21:21 [PATCH 0/9] drivers/acpi/asus_acpi.c updates Karol Kozimor
` (3 preceding siblings ...)
2006-01-18 21:38 ` [PATCH 4/9] support W3400N Karol Kozimor
@ 2006-01-18 21:41 ` Karol Kozimor
2006-01-18 21:48 ` [PATCH 6/9] handle internal Bluetooth / support W5A Karol Kozimor
` (4 subsequent siblings)
9 siblings, 0 replies; 21+ messages in thread
From: Karol Kozimor @ 2006-01-18 21:41 UTC (permalink / raw)
To: Brown, Len; +Cc: linux-acpi
This patch adds support for Asus A4G.
Originally by Giuseppe Rota.
Signed-off-by: Karol Kozimor <sziwan@hell.org.pl>
--- a/drivers/acpi/asus_acpi.c 2006-01-18 17:36:00.000000000 +0100
+++ b/drivers/acpi/asus_acpi.c 2006-01-18 17:44:03.000000000 +0100
@@ -120,6 +120,7 @@ struct asus_hotk {
enum {
A1x = 0, //A1340D, A1300F
A2x, //A2500H
+ A4G, //A4700G
D1x, //D1
L2D, //L2000D
L3C, //L3800C
@@ -189,6 +190,16 @@ static struct model_data model_conf[END_
.display_get = "\\INFB"},
{
+ .name = "A4G",
+ .mt_mled = "MLED",
+/* WLED present, but not controlled by ACPI */
+ .mt_lcd_switch = xxN_PREFIX "_Q10",
+ .brightness_set = "SPLV",
+ .brightness_get = "GPLV",
+ .display_set = "SDSP",
+ .display_get = "\\ADVG"},
+
+ {
.name = "D1x",
.mt_mled = "MLED",
.mt_lcd_switch = "\\Q0D",
@@ -1122,6 +1133,8 @@ static int __init asus_hotk_get_info(voi
hotk->model = S2x;
else if (strncmp(model->string.pointer, "L5", 2) == 0)
hotk->model = L5x;
+ else if (strncmp(model->string.pointer, "A4G", 3) == 0)
+ hotk->model = A4G;
else if (strncmp(model->string.pointer, "W1N", 3) == 0)
hotk->model = W1N;
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH 6/9] handle internal Bluetooth / support W5A
2006-01-18 21:21 [PATCH 0/9] drivers/acpi/asus_acpi.c updates Karol Kozimor
` (4 preceding siblings ...)
2006-01-18 21:41 ` [PATCH 5/9] support A4G Karol Kozimor
@ 2006-01-18 21:48 ` Karol Kozimor
2006-01-18 21:52 ` [PATCH 7/9] support L5D Karol Kozimor
` (3 subsequent siblings)
9 siblings, 0 replies; 21+ messages in thread
From: Karol Kozimor @ 2006-01-18 21:48 UTC (permalink / raw)
To: Brown, Len; +Cc: linux-acpi
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: Karol Kozimor <sziwan@hell.org.pl>
--- a/drivers/acpi/asus_acpi.c 2006-01-18 17:44:03.000000000 +0100
+++ b/drivers/acpi/asus_acpi.c 2006-01-18 17:56:16.000000000 +0100
@@ -49,6 +49,7 @@
#define PROC_MLED "mled"
#define PROC_WLED "wled"
#define PROC_TLED "tled"
+#define PROC_BT "bluetooth"
#define PROC_LEDD "ledd"
#define PROC_INFO "info"
#define PROC_LCD "lcd"
@@ -69,9 +70,10 @@
/*
* Flags for hotk status
*/
-#define MLED_ON 0x01 //is MLED ON ?
-#define WLED_ON 0x02
-#define TLED_ON 0x04
+#define MLED_ON 0x01 //mail LED
+#define WLED_ON 0x02 //wireless LED
+#define TLED_ON 0x04 //touchpad LED
+#define BT_ON 0x08 //internal Bluetooth
MODULE_AUTHOR("Julien Lerouge, Karol Kozimor");
MODULE_DESCRIPTION(ACPI_HOTK_NAME);
@@ -95,7 +97,9 @@ struct model_data {
char *mt_tled; //method to handle tled_____________R
char *tled_status; //node to handle tled reading_______A
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 *brightness_up; //method to set brightness up_______A
char *brightness_down; //guess what ?______________________A
@@ -137,6 +141,7 @@ struct asus_hotk {
S1x, //S1300A, but also L1400B and M2400A (L84F)
S2x, //S200 (J1 reported), Victor MP-XP7210
W1N, //W1000N
+ W5A, //W5A
xxN, //M2400N, M3700N, M5200N, M6800N, S1300N, S5200N
//(Centrino)
END_MODEL
@@ -373,6 +378,16 @@ static struct model_data model_conf[END_
.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",
.mt_mled = "MLED",
/* WLED present, but not controlled by ACPI */
@@ -639,6 +654,25 @@ proc_write_wled(struct file *file, const
}
/*
+ * 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
*/
static int
@@ -949,6 +983,11 @@ static int __init asus_hotk_add_fs(struc
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
* from keyboard
@@ -984,6 +1023,8 @@ static int asus_hotk_remove_fs(struct ac
remove_proc_entry(PROC_TLED, acpi_device_dir(device));
if (hotk->methods->mt_ledd)
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)
remove_proc_entry(PROC_LCD, acpi_device_dir(device));
if ((hotk->methods->brightness_up
@@ -1137,6 +1178,8 @@ static int __init asus_hotk_get_info(voi
hotk->model = A4G;
else if (strncmp(model->string.pointer, "W1N", 3) == 0)
hotk->model = W1N;
+ else if (strncmp(model->string.pointer, "W5A", 3) == 0)
+ hotk->model = W5A;
if (hotk->model == END_MODEL) {
printk("unsupported, trying default values, supply the "
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH 7/9] support L5D
2006-01-18 21:21 [PATCH 0/9] drivers/acpi/asus_acpi.c updates Karol Kozimor
` (5 preceding siblings ...)
2006-01-18 21:48 ` [PATCH 6/9] handle internal Bluetooth / support W5A Karol Kozimor
@ 2006-01-18 21:52 ` Karol Kozimor
2006-01-18 22:02 ` [PATCH 8/9] rework model detection Karol Kozimor
` (2 subsequent siblings)
9 siblings, 0 replies; 21+ messages in thread
From: Karol Kozimor @ 2006-01-18 21:52 UTC (permalink / raw)
To: Brown, Len; +Cc: linux-acpi
This patch adds support for Asus L5D and thus fixes
http://bugme.osdl.org/show_bug.cgi?id=4695
Signed-off-by: Karol Kozimor <sziwan@hell.org.pl>
--- a/drivers/acpi/asus_acpi.c 2006-01-18 18:08:48.000000000 +0100
+++ b/drivers/acpi/asus_acpi.c 2006-01-18 18:10:40.000000000 +0100
@@ -129,7 +129,7 @@ struct asus_hotk {
L2D, //L2000D
L3C, //L3800C
L3D, //L3400D
- L3H, //L3H, but also L2000E
+ L3H, //L3H, L2000E, L5D
L4R, //L4500R
L5x, //L5800C
L8L, //L8400L
@@ -1123,8 +1123,9 @@ static int __init asus_hotk_get_info(voi
hotk->model = END_MODEL;
if (strncmp(model->string.pointer, "L3D", 3) == 0)
hotk->model = L3D;
- else if (strncmp(model->string.pointer, "L3H", 3) == 0 ||
- strncmp(model->string.pointer, "L2E", 3) == 0)
+ else if (strncmp(model->string.pointer, "L2E", 3) == 0 ||
+ strncmp(model->string.pointer, "L3H", 3) == 0 ||
+ strncmp(model->string.pointer, "L5D", 3) == 0)
hotk->model = L3H;
else if (strncmp(model->string.pointer, "L3", 2) == 0 ||
strncmp(model->string.pointer, "L2B", 3) == 0)
@@ -1195,6 +1196,9 @@ static int __init asus_hotk_get_info(voi
strncmp(model->string.pointer, "W3N", 3) == 0)
hotk->methods->mt_mled = NULL;
/* S5N, M5N and W3N have no MLED */
+ else if (strncmp(model->string.pointer, "L5D", 3) == 0)
+ hotk->methods->mt_wled = NULL;
+ /* L5D's WLED is not controlled by ACPI */
else if (strncmp(model->string.pointer, "M2N", 3) == 0)
hotk->methods->mt_wled = "WLED";
/* M2N has a usable WLED */
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH 8/9] rework model detection
2006-01-18 21:21 [PATCH 0/9] drivers/acpi/asus_acpi.c updates Karol Kozimor
` (6 preceding siblings ...)
2006-01-18 21:52 ` [PATCH 7/9] support L5D Karol Kozimor
@ 2006-01-18 22:02 ` Karol Kozimor
2006-01-18 22:04 ` [PATCH 9/9] add S1N WLED control Karol Kozimor
2006-06-30 22:59 ` [PATCH 0/10] drivers/acpi/asus_acpi.c updates [RESEND] Karol Kozimor
9 siblings, 0 replies; 21+ messages in thread
From: Karol Kozimor @ 2006-01-18 22:02 UTC (permalink / raw)
To: Brown, Len; +Cc: linux-acpi
This patch reworks laptop model detection.
This addresses the Samsung P30 issue, where the INIT method would return no
object, but the implicit return in the AML interpreter would confuse the
driver. It also accounts for a newer batch of Asus models whose INIT
returns ACPI_TYPE_BUFFER instead of STRING.
The handling is now much leaner, if we get a buffer or a string, we check
against known values, in every other case we use a different path
(currently DSDT signatures). The bulk of this patch is separating the
string matching from asus_hotk_get_info() into a separate function.
This patch properly fixes http://bugme.osdl.org/show_bug.cgi?id=5067 and
http://bugme.osdl.org/show_bug.cgi?id=5092 and makes the driver fully
functional again with acpi=strict on all machines.
Signed-off-by: Karol Kozimor <sziwan@hell.org.pl>
--- a/drivers/acpi/asus_acpi.c 2006-01-18 18:10:40.000000000 +0100
+++ b/drivers/acpi/asus_acpi.c 2006-01-18 18:20:11.000000000 +0100
@@ -1048,6 +1048,65 @@ static void asus_hotk_notify(acpi_handle
}
/*
+ * Match the model string to the list of supported models. Return END_MODEL if
+ * no match or model is NULL.
+ */
+static int __init asus_model_match(char *model)
+{
+ if (model == NULL)
+ return END_MODEL;
+
+ if (strncmp(model, "L3D", 3) == 0)
+ return L3D;
+ else if (strncmp(model, "L2E", 3) == 0 ||
+ strncmp(model, "L3H", 3) == 0 || strncmp(model, "L5D", 3) == 0)
+ return L3H;
+ else if (strncmp(model, "L3", 2) == 0 || strncmp(model, "L2B", 3) == 0)
+ return L3C;
+ else if (strncmp(model, "L8L", 3) == 0)
+ return L8L;
+ else if (strncmp(model, "L4R", 3) == 0)
+ return L4R;
+ else if (strncmp(model, "M6N", 3) == 0 || strncmp(model, "W3N", 3) == 0)
+ return M6N;
+ else if (strncmp(model, "M6R", 3) == 0 || strncmp(model, "A3G", 3) == 0)
+ return M6R;
+ else if (strncmp(model, "M2N", 3) == 0 ||
+ strncmp(model, "M3N", 3) == 0 ||
+ strncmp(model, "M5N", 3) == 0 ||
+ strncmp(model, "M6N", 3) == 0 ||
+ strncmp(model, "S1N", 3) == 0 ||
+ strncmp(model, "S5N", 3) == 0 || strncmp(model, "W1N", 3) == 0)
+ return xxN;
+ else if (strncmp(model, "M1", 2) == 0)
+ return M1A;
+ else if (strncmp(model, "M2", 2) == 0 || strncmp(model, "L4E", 3) == 0)
+ return M2E;
+ else if (strncmp(model, "L2", 2) == 0)
+ return L2D;
+ else if (strncmp(model, "L8", 2) == 0)
+ return S1x;
+ else if (strncmp(model, "D1", 2) == 0)
+ return D1x;
+ else if (strncmp(model, "A1", 2) == 0)
+ return A1x;
+ else if (strncmp(model, "A2", 2) == 0)
+ return A2x;
+ else if (strncmp(model, "J1", 2) == 0)
+ return S2x;
+ else if (strncmp(model, "L5", 2) == 0)
+ return L5x;
+ else if (strncmp(model, "A4G", 3) == 0)
+ return A4G;
+ else if (strncmp(model, "W1N", 3) == 0)
+ return W1N;
+ else if (strncmp(model, "W5A", 3) == 0)
+ return W5A;
+ else
+ return END_MODEL;
+}
+
+/*
* This function is used to initialize the hotk with right values. In this
* method, we can make all the detection we want, and modify the hotk struct
*/
@@ -1057,6 +1116,7 @@ static int __init asus_hotk_get_info(voi
struct acpi_buffer dsdt = { ACPI_ALLOCATE_BUFFER, NULL };
union acpi_object *model = NULL;
int bsts_result;
+ char *string = NULL;
acpi_status status;
/*
@@ -1086,120 +1146,63 @@ static int __init asus_hotk_get_info(voi
printk(KERN_NOTICE " BSTS called, 0x%02x returned\n",
bsts_result);
- /* This is unlikely with implicit return */
- if (buffer.pointer == NULL)
- return -EINVAL;
-
- model = (union acpi_object *)buffer.pointer;
/*
- * Samsung P30 has a device with a valid _HID whose INIT does not
- * return anything. It used to be possible to catch this exception,
- * but the implicit return code will now happily confuse the
- * driver. We assume that every ACPI_TYPE_STRING is a valid model
- * identifier but it's still possible to get completely bogus data.
+ * Try to match the object returned by INIT to the specific model.
+ * Handle every possible object (or the lack of thereof) the DSDT
+ * writers might throw at us. When in trouble, we pass NULL to
+ * asus_model_match() and try something completely different.
*/
- if (model->type == ACPI_TYPE_STRING) {
- printk(KERN_NOTICE " %s model detected, ",
- model->string.pointer);
- } else {
- if (asus_info && /* Samsung P30 */
+ if (buffer.pointer) {
+ model = (union acpi_object *)buffer.pointer;
+ switch (model->type) {
+ case ACPI_TYPE_STRING:
+ string = model->string.pointer;
+ break;
+ case ACPI_TYPE_BUFFER:
+ string = model->buffer.pointer;
+ break;
+ default:
+ acpi_os_free(model);
+ break;
+ }
+ }
+ hotk->model = asus_model_match(string);
+ if (hotk->model == END_MODEL) { /* match failed */
+ if (asus_info &&
strncmp(asus_info->oem_table_id, "ODEM", 4) == 0) {
hotk->model = P30;
printk(KERN_NOTICE
" Samsung P30 detected, supported\n");
} else {
hotk->model = M2E;
- printk(KERN_WARNING " no string returned by INIT\n");
- printk(KERN_WARNING " trying default values, supply "
- "the developers with your DSDT\n");
+ printk(KERN_NOTICE " unsupported model %s, trying "
+ "default values\n", string);
+ printk(KERN_NOTICE
+ " send /proc/acpi/dsdt to the developers\n");
}
hotk->methods = &model_conf[hotk->model];
-
- acpi_os_free(model);
-
return AE_OK;
}
-
- hotk->model = END_MODEL;
- if (strncmp(model->string.pointer, "L3D", 3) == 0)
- hotk->model = L3D;
- else if (strncmp(model->string.pointer, "L2E", 3) == 0 ||
- strncmp(model->string.pointer, "L3H", 3) == 0 ||
- strncmp(model->string.pointer, "L5D", 3) == 0)
- hotk->model = L3H;
- else if (strncmp(model->string.pointer, "L3", 2) == 0 ||
- strncmp(model->string.pointer, "L2B", 3) == 0)
- hotk->model = L3C;
- else if (strncmp(model->string.pointer, "L8L", 3) == 0)
- hotk->model = L8L;
- else if (strncmp(model->string.pointer, "L4R", 3) == 0)
- hotk->model = L4R;
- else if (strncmp(model->string.pointer, "M6N", 3) == 0 ||
- strncmp(model->string.pointer, "W3N", 3) == 0)
- hotk->model = M6N;
- else if (strncmp(model->string.pointer, "M6R", 3) == 0 ||
- strncmp(model->string.pointer, "A3G", 3) == 0)
- hotk->model = M6R;
- else if (strncmp(model->string.pointer, "M2N", 3) == 0 ||
- strncmp(model->string.pointer, "M3N", 3) == 0 ||
- strncmp(model->string.pointer, "M5N", 3) == 0 ||
- strncmp(model->string.pointer, "M6N", 3) == 0 ||
- strncmp(model->string.pointer, "S1N", 3) == 0 ||
- strncmp(model->string.pointer, "S5N", 3) == 0)
- hotk->model = xxN;
- else if (strncmp(model->string.pointer, "M1", 2) == 0)
- hotk->model = M1A;
- else if (strncmp(model->string.pointer, "M2", 2) == 0 ||
- strncmp(model->string.pointer, "L4E", 3) == 0)
- hotk->model = M2E;
- else if (strncmp(model->string.pointer, "L2", 2) == 0)
- hotk->model = L2D;
- else if (strncmp(model->string.pointer, "L8", 2) == 0)
- hotk->model = S1x;
- else if (strncmp(model->string.pointer, "D1", 2) == 0)
- hotk->model = D1x;
- else if (strncmp(model->string.pointer, "A1", 2) == 0)
- hotk->model = A1x;
- else if (strncmp(model->string.pointer, "A2", 2) == 0)
- hotk->model = A2x;
- else if (strncmp(model->string.pointer, "J1", 2) == 0)
- hotk->model = S2x;
- else if (strncmp(model->string.pointer, "L5", 2) == 0)
- hotk->model = L5x;
- else if (strncmp(model->string.pointer, "A4G", 3) == 0)
- hotk->model = A4G;
- else if (strncmp(model->string.pointer, "W1N", 3) == 0)
- hotk->model = W1N;
- else if (strncmp(model->string.pointer, "W5A", 3) == 0)
- hotk->model = W5A;
-
- if (hotk->model == END_MODEL) {
- printk("unsupported, trying default values, supply the "
- "developers with your DSDT\n");
- hotk->model = M2E;
- } else {
- printk("supported\n");
- }
-
hotk->methods = &model_conf[hotk->model];
+ printk(KERN_NOTICE " %s model detected, supported\n", string);
/* Sort of per-model blacklist */
- if (strncmp(model->string.pointer, "L2B", 3) == 0)
+ if (strncmp(string, "L2B", 3) == 0)
hotk->methods->lcd_status = NULL;
/* L2B is similar enough to L3C to use its settings, with this only
exception */
- else if (strncmp(model->string.pointer, "A3G", 3) == 0)
+ else if (strncmp(string, "A3G", 3) == 0)
hotk->methods->lcd_status = "\\BLFG";
/* A3G is like M6R */
- else if (strncmp(model->string.pointer, "S5N", 3) == 0 ||
- strncmp(model->string.pointer, "M5N", 3) == 0 ||
- strncmp(model->string.pointer, "W3N", 3) == 0)
+ else if (strncmp(string, "S5N", 3) == 0 ||
+ strncmp(string, "M5N", 3) == 0 ||
+ strncmp(string, "W3N", 3) == 0)
hotk->methods->mt_mled = NULL;
/* S5N, M5N and W3N have no MLED */
- else if (strncmp(model->string.pointer, "L5D", 3) == 0)
+ else if (strncmp(string, "L5D", 3) == 0)
hotk->methods->mt_wled = NULL;
/* L5D's WLED is not controlled by ACPI */
- else if (strncmp(model->string.pointer, "M2N", 3) == 0)
+ else if (strncmp(string, "M2N", 3) == 0)
hotk->methods->mt_wled = "WLED";
/* M2N has a usable WLED */
else if (asus_info) {
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH 9/9] add S1N WLED control
2006-01-18 21:21 [PATCH 0/9] drivers/acpi/asus_acpi.c updates Karol Kozimor
` (7 preceding siblings ...)
2006-01-18 22:02 ` [PATCH 8/9] rework model detection Karol Kozimor
@ 2006-01-18 22:04 ` Karol Kozimor
2006-06-30 22:59 ` [PATCH 0/10] drivers/acpi/asus_acpi.c updates [RESEND] Karol Kozimor
9 siblings, 0 replies; 21+ messages in thread
From: Karol Kozimor @ 2006-01-18 22:04 UTC (permalink / raw)
To: Brown, Len; +Cc: linux-acpi
This small patch adds back WLED control for S1N models, this was
accidentally removed a while ago.
Signed-off-by: Karol Kozimor <sziwan@hell.org.pl>
--- a/drivers/acpi/asus_acpi.c 2006-01-18 18:20:11.000000000 +0100
+++ b/drivers/acpi/asus_acpi.c 2006-01-18 18:24:16.000000000 +0100
@@ -1202,9 +1202,10 @@ static int __init asus_hotk_get_info(voi
else if (strncmp(string, "L5D", 3) == 0)
hotk->methods->mt_wled = NULL;
/* L5D's WLED is not controlled by ACPI */
- else if (strncmp(string, "M2N", 3) == 0)
+ else if (strncmp(string, "M2N", 3) == 0 ||
+ strncmp(string, "S1N", 3) == 0)
hotk->methods->mt_wled = "WLED";
- /* M2N has a usable WLED */
+ /* M2N and S1N have a usable WLED */
else if (asus_info) {
if (strncmp(asus_info->oem_table_id, "L1", 2) == 0)
hotk->methods->mled_status = NULL;
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH 0/10] drivers/acpi/asus_acpi.c updates [RESEND]
@ 2006-06-30 22:59 ` Karol Kozimor
2006-06-30 23:02 ` [PATCH 1/10] misc cleanups Karol Kozimor
` (9 more replies)
0 siblings, 10 replies; 21+ messages in thread
From: Karol Kozimor @ 2006-06-30 22:59 UTC (permalink / raw)
To: Brown, Len; +Cc: linux-acpi
Hi,
The following batch of patches update the asus_acpi driver to version 0.30
through the following changes:
Readd WLED for S1N
Rework model detection for more flexibility and less oopses
Resolve confusion, "bluetooth" entry controls both the internal adapter
*and* its LED
Added support for L5D
Added support for W5A (patch from Fernando A. P. Gomes)
Added support for A4759GUH (A4G, patch from Giuseppe Rota)
Added support for W3400N
Added support for W1N LED display (thx Éric BURGHARD)
Added support for A3000G
Fix M6R/M6N mismerge
Please apply.
Best regards,
--
Karol 'sziwan' Kozimor
sziwan@hell.org.pl
-
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH 1/10] misc cleanups
2006-06-30 22:59 ` [PATCH 0/10] drivers/acpi/asus_acpi.c updates [RESEND] Karol Kozimor
@ 2006-06-30 23:02 ` Karol Kozimor
2006-06-30 23:03 ` [PATCH 2/10] support A3G Karol Kozimor
` (8 subsequent siblings)
9 siblings, 0 replies; 21+ messages in thread
From: Karol Kozimor @ 2006-06-30 23:02 UTC (permalink / raw)
To: Brown, Len; +Cc: linux-acpi
This patch updates the version string, copyright notices and does
whitespace cleanup (it looks weird, blame Lindent).
Signed-off-by: Karol Kozimor <sziwan@hell.org.pl>
--- a/drivers/acpi/asus_acpi.c 2006-01-18 17:21:37.000000000 +0100
+++ b/drivers/acpi/asus_acpi.c 2006-01-18 18:31:18.000000000 +0100
@@ -2,7 +2,7 @@
* asus_acpi.c - Asus Laptop ACPI Extras
*
*
- * Copyright (C) 2002, 2003, 2004 Julien Lerouge, Karol Kozimor
+ * Copyright (C) 2002-2005 Julien Lerouge, 2003-2006 Karol Kozimor
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -27,10 +27,6 @@
* Johann Wiesner - Small compile fixes
* John Belmonte - ACPI code for Toshiba laptop was a good starting point.
*
- * TODO:
- * add Fn key status
- * Add mode selection on module loading (parameter) -> still necessary?
- * Complete display switching -- may require dirty hacks or calling _DOS?
*/
#include <linux/kernel.h>
@@ -42,7 +38,7 @@
#include <acpi/acpi_bus.h>
#include <asm/uaccess.h>
-#define ASUS_ACPI_VERSION "0.29"
+#define ASUS_ACPI_VERSION "0.30"
#define PROC_ASUS "asus" //the directory
#define PROC_MLED "mled"
@@ -149,17 +145,8 @@
static struct model_data model_conf[END_MODEL] = {
/*
- * Those pathnames are relative to the HOTK / ATKD device :
- * - mt_mled
- * - mt_wled
- * - brightness_set
- * - brightness_get
- * - display_set
- * - display_get
- *
* TODO I have seen a SWBX and AIBX method on some models, like L1400B,
* it seems to be a kind of switch, but what for ?
- *
*/
{
@@ -993,7 +980,7 @@
if (buffer.pointer == NULL)
return -EINVAL;
- model = (union acpi_object *) buffer.pointer;
+ model = (union acpi_object *)buffer.pointer;
/*
* Samsung P30 has a device with a valid _HID whose INIT does not
* return anything. It used to be possible to catch this exception,
@@ -1002,7 +989,8 @@
* identifier but it's still possible to get completely bogus data.
*/
if (model->type == ACPI_TYPE_STRING) {
- printk(KERN_NOTICE " %s model detected, ", model->string.pointer);
+ printk(KERN_NOTICE " %s model detected, ",
+ model->string.pointer);
} else {
if (asus_info && /* Samsung P30 */
strncmp(asus_info->oem_table_id, "ODEM", 4) == 0) {
@@ -1016,7 +1004,7 @@
"the developers with your DSDT\n");
}
hotk->methods = &model_conf[hotk->model];
-
+
kfree(model);
return AE_OK;
@@ -1162,8 +1150,7 @@
/* For laptops without GPLV: init the hotk->brightness value */
if ((!hotk->methods->brightness_get)
&& (!hotk->methods->brightness_status)
- && (hotk->methods->brightness_up
- && hotk->methods->brightness_down)) {
+ && (hotk->methods->brightness_up && hotk->methods->brightness_down)) {
status =
acpi_evaluate_object(NULL, hotk->methods->brightness_down,
NULL, NULL);
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH 2/10] support A3G
2006-06-30 22:59 ` [PATCH 0/10] drivers/acpi/asus_acpi.c updates [RESEND] Karol Kozimor
2006-06-30 23:02 ` [PATCH 1/10] misc cleanups Karol Kozimor
@ 2006-06-30 23:03 ` Karol Kozimor
2006-06-30 23:04 ` [PATCH 3/10] LED display support Karol Kozimor
` (7 subsequent siblings)
9 siblings, 0 replies; 21+ messages in thread
From: Karol Kozimor @ 2006-06-30 23:03 UTC (permalink / raw)
To: Brown, Len; +Cc: linux-acpi
This patch adds support for Asus A3G.
Signed-off-by: Karol Kozimor <sziwan@hell.org.pl>
--- a/drivers/acpi/asus_acpi.c 2006-01-18 17:27:23.000000000 +0100
+++ b/drivers/acpi/asus_acpi.c 2006-01-18 17:28:11.000000000 +0100
@@ -127,7 +127,7 @@ struct asus_hotk {
M1A, //M1300A
M2E, //M2400E, L4400L
M6N, //M6800N
- M6R, //M6700R
+ M6R, //M6700R, A3000G
P30, //Samsung P30
S1x, //S1300A, but also L1400B and M2400A (L84F)
S2x, //S200 (J1 reported), Victor MP-XP7210
@@ -1038,7 +1038,8 @@ static int __init asus_hotk_get_info(voi
hotk->model = L4R;
else if (strncmp(model->string.pointer, "M6N", 3) == 0)
hotk->model = M6N;
- else if (strncmp(model->string.pointer, "M6R", 3) == 0)
+ else if (strncmp(model->string.pointer, "M6R", 3) == 0 ||
+ strncmp(model->string.pointer, "A3G", 3) == 0)
hotk->model = M6R;
else if (strncmp(model->string.pointer, "M2N", 3) == 0 ||
strncmp(model->string.pointer, "M3N", 3) == 0 ||
@@ -1083,6 +1084,9 @@ static int __init asus_hotk_get_info(voi
hotk->methods->lcd_status = NULL;
/* L2B is similar enough to L3C to use its settings, with this only
exception */
+ else if (strncmp(model->string.pointer, "A3G", 3) == 0)
+ hotk->methods->lcd_status = "\\BLFG";
+ /* A3G is like M6R */
else if (strncmp(model->string.pointer, "S5N", 3) == 0 ||
strncmp(model->string.pointer, "M5N", 3) == 0)
hotk->methods->mt_mled = NULL;
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH 3/10] LED display support
2006-06-30 22:59 ` [PATCH 0/10] drivers/acpi/asus_acpi.c updates [RESEND] Karol Kozimor
2006-06-30 23:02 ` [PATCH 1/10] misc cleanups Karol Kozimor
2006-06-30 23:03 ` [PATCH 2/10] support A3G Karol Kozimor
@ 2006-06-30 23:04 ` Karol Kozimor
2006-06-30 23:05 ` [PATCH 4/10] support W3400N Karol Kozimor
` (6 subsequent siblings)
9 siblings, 0 replies; 21+ messages in thread
From: Karol Kozimor @ 2006-06-30 23:04 UTC (permalink / raw)
To: Brown, Len; +Cc: linux-acpi
This patch adds handling for front LED displays found on W1N and the like.
Additionally, W1N is given its own model_data instance.
Patch originally by Éric Burghard.
Signed-off-by: Karol Kozimor <sziwan@hell.org.pl>
--- a/drivers/acpi/asus_acpi.c 2006-01-18 17:28:11.000000000 +0100
+++ b/drivers/acpi/asus_acpi.c 2006-01-18 17:29:43.000000000 +0100
@@ -26,6 +26,7 @@
* Pontus Fuchs - Helper functions, cleanup
* Johann Wiesner - Small compile fixes
* John Belmonte - ACPI code for Toshiba laptop was a good starting point.
+ * Éric Burghard - LED display support for W1N
*
* TODO:
* add Fn key status
@@ -48,6 +49,7 @@
#define PROC_MLED "mled"
#define PROC_WLED "wled"
#define PROC_TLED "tled"
+#define PROC_LEDD "ledd"
#define PROC_INFO "info"
#define PROC_LCD "lcd"
#define PROC_BRN "brn"
@@ -92,6 +94,7 @@ struct model_data {
char *wled_status; //node to handle wled reading_______A
char *mt_tled; //method to handle tled_____________R
char *tled_status; //node to handle tled reading_______A
+ char *mt_ledd; //method to handle LED display______R
char *mt_lcd_switch; //method to turn LCD ON/OFF_________A
char *lcd_status; //node to read LCD panel state______A
char *brightness_up; //method to set brightness up_______A
@@ -111,6 +114,7 @@ struct asus_hotk {
struct acpi_device *device; //the device we are in
acpi_handle handle; //the handle of the hotk device
char status; //status of the hotk, for LEDs, ...
+ u32 ledd_status; //status of the LED display
struct model_data *methods; //methods available on the laptop
u8 brightness; //brightness level
enum {
@@ -131,7 +135,8 @@ struct asus_hotk {
P30, //Samsung P30
S1x, //S1300A, but also L1400B and M2400A (L84F)
S2x, //S200 (J1 reported), Victor MP-XP7210
- xxN, //M2400N, M3700N, M5200N, S1300N, S5200N, W1OOON
+ W1N, //W1000N
+ xxN, //M2400N, M3700N, M5200N, M6800N, S1300N, S5200N
//(Centrino)
END_MODEL
} model; //Models currently supported
@@ -345,6 +350,18 @@ static struct model_data model_conf[END_
.brightness_down = S2x_PREFIX "_Q0A"},
{
+ .name = "W1N",
+ .mt_mled = "MLED",
+ .mt_wled = "WLED",
+ .mt_ledd = "SLCM",
+ .mt_lcd_switch = xxN_PREFIX "_Q10",
+ .lcd_status = "\\BKLT",
+ .brightness_set = "SPLV",
+ .brightness_get = "GPLV",
+ .display_set = "SDSP",
+ .display_get = "\\ADVG"},
+
+ {
.name = "xxN",
.mt_mled = "MLED",
/* WLED present, but not controlled by ACPI */
@@ -563,6 +580,36 @@ proc_write_mled(struct file *file, const
}
/*
+ * Proc handlers for LED display
+ */
+static int
+proc_read_ledd(char *page, char **start, off_t off, int count, int *eof,
+ void *data)
+{
+ return sprintf(page, "0x%08x\n", hotk->ledd_status);
+}
+
+static int
+proc_write_ledd(struct file *file, const char __user * buffer,
+ unsigned long count, void *data)
+{
+ int value;
+
+ count = parse_arg(buffer, count, &value);
+ if (count > 0) {
+ if (!write_acpi_int
+ (hotk->handle, hotk->methods->mt_ledd, value, NULL))
+ printk(KERN_WARNING
+ "Asus ACPI: LED display write failed\n");
+ else
+ hotk->ledd_status = (u32) value;
+ } else if (count < 0)
+ printk(KERN_WARNING "Asus ACPI: Error reading user input\n");
+
+ return count;
+}
+
+/*
* Proc handlers for WLED
*/
static int
@@ -876,6 +923,11 @@ static int __init asus_hotk_add_fs(struc
mode, device);
}
+ if (hotk->methods->mt_ledd) {
+ asus_proc_add(PROC_LEDD, &proc_write_ledd, &proc_read_ledd,
+ mode, device);
+ }
+
if (hotk->methods->mt_mled) {
asus_proc_add(PROC_MLED, &proc_write_mled, &proc_read_mled,
mode, device);
@@ -919,6 +971,8 @@ static int asus_hotk_remove_fs(struct ac
remove_proc_entry(PROC_MLED, acpi_device_dir(device));
if (hotk->methods->mt_tled)
remove_proc_entry(PROC_TLED, acpi_device_dir(device));
+ if (hotk->methods->mt_ledd)
+ remove_proc_entry(PROC_LEDD, acpi_device_dir(device));
if (hotk->methods->mt_lcd_switch && hotk->methods->lcd_status)
remove_proc_entry(PROC_LCD, acpi_device_dir(device));
if ((hotk->methods->brightness_up
@@ -1046,8 +1100,7 @@ static int __init asus_hotk_get_info(voi
strncmp(model->string.pointer, "M5N", 3) == 0 ||
strncmp(model->string.pointer, "M6N", 3) == 0 ||
strncmp(model->string.pointer, "S1N", 3) == 0 ||
- strncmp(model->string.pointer, "S5N", 3) == 0 ||
- strncmp(model->string.pointer, "W1N", 3) == 0)
+ strncmp(model->string.pointer, "S5N", 3) == 0)
hotk->model = xxN;
else if (strncmp(model->string.pointer, "M1", 2) == 0)
hotk->model = M1A;
@@ -1068,6 +1121,8 @@ static int __init asus_hotk_get_info(voi
hotk->model = S2x;
else if (strncmp(model->string.pointer, "L5", 2) == 0)
hotk->model = L5x;
+ else if (strncmp(model->string.pointer, "W1N", 3) == 0)
+ hotk->model = W1N;
if (hotk->model == END_MODEL) {
printk("unsupported, trying default values, supply the "
@@ -1091,10 +1146,9 @@ static int __init asus_hotk_get_info(voi
strncmp(model->string.pointer, "M5N", 3) == 0)
hotk->methods->mt_mled = NULL;
/* S5N and M5N have no MLED */
- else if (strncmp(model->string.pointer, "M2N", 3) == 0 ||
- strncmp(model->string.pointer, "W1N", 3) == 0)
+ else if (strncmp(model->string.pointer, "M2N", 3) == 0)
hotk->methods->mt_wled = "WLED";
- /* M2N and W1N have a usable WLED */
+ /* M2N has a usable WLED */
else if (asus_info) {
if (strncmp(asus_info->oem_table_id, "L1", 2) == 0)
hotk->methods->mled_status = NULL;
@@ -1184,6 +1238,9 @@ static int __init asus_hotk_add(struct a
}
}
+ /* LED display is off by default */
+ hotk->ledd_status = 0xFFF;
+
end:
if (result) {
kfree(hotk);
-
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH 4/10] support W3400N
2006-06-30 22:59 ` [PATCH 0/10] drivers/acpi/asus_acpi.c updates [RESEND] Karol Kozimor
` (2 preceding siblings ...)
2006-06-30 23:04 ` [PATCH 3/10] LED display support Karol Kozimor
@ 2006-06-30 23:05 ` Karol Kozimor
2006-06-30 23:05 ` [PATCH 5/10] support A4G Karol Kozimor
` (5 subsequent siblings)
9 siblings, 0 replies; 21+ messages in thread
From: Karol Kozimor @ 2006-06-30 23:05 UTC (permalink / raw)
To: Brown, Len; +Cc: linux-acpi
This patch adds support for Asus W3400N.
Signed-off-by: Karol Kozimor <sziwan@hell.org.pl>
--- a/drivers/acpi/asus_acpi.c 2006-01-18 17:32:25.000000000 +0100
+++ b/drivers/acpi/asus_acpi.c 2006-01-18 17:36:00.000000000 +0100
@@ -130,7 +130,7 @@ struct asus_hotk {
L8L, //L8400L
M1A, //M1300A
M2E, //M2400E, L4400L
- M6N, //M6800N
+ M6N, //M6800N, W3400N
M6R, //M6700R, A3000G
P30, //Samsung P30
S1x, //S1300A, but also L1400B and M2400A (L84F)
@@ -1090,7 +1090,8 @@ static int __init asus_hotk_get_info(voi
hotk->model = L8L;
else if (strncmp(model->string.pointer, "L4R", 3) == 0)
hotk->model = L4R;
- else if (strncmp(model->string.pointer, "M6N", 3) == 0)
+ else if (strncmp(model->string.pointer, "M6N", 3) == 0 ||
+ strncmp(model->string.pointer, "W3N", 3) == 0)
hotk->model = M6N;
else if (strncmp(model->string.pointer, "M6R", 3) == 0 ||
strncmp(model->string.pointer, "A3G", 3) == 0)
@@ -1143,9 +1144,10 @@ static int __init asus_hotk_get_info(voi
hotk->methods->lcd_status = "\\BLFG";
/* A3G is like M6R */
else if (strncmp(model->string.pointer, "S5N", 3) == 0 ||
- strncmp(model->string.pointer, "M5N", 3) == 0)
+ strncmp(model->string.pointer, "M5N", 3) == 0 ||
+ strncmp(model->string.pointer, "W3N", 3) == 0)
hotk->methods->mt_mled = NULL;
- /* S5N and M5N have no MLED */
+ /* S5N, M5N and W3N have no MLED */
else if (strncmp(model->string.pointer, "M2N", 3) == 0)
hotk->methods->mt_wled = "WLED";
/* M2N has a usable WLED */
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH 5/10] support A4G
2006-06-30 22:59 ` [PATCH 0/10] drivers/acpi/asus_acpi.c updates [RESEND] Karol Kozimor
` (3 preceding siblings ...)
2006-06-30 23:05 ` [PATCH 4/10] support W3400N Karol Kozimor
@ 2006-06-30 23:05 ` Karol Kozimor
2006-06-30 23:07 ` [PATCH 6/10] handle internal Bluetooth / support W5A Karol Kozimor
` (4 subsequent siblings)
9 siblings, 0 replies; 21+ messages in thread
From: Karol Kozimor @ 2006-06-30 23:05 UTC (permalink / raw)
To: Brown, Len; +Cc: linux-acpi
This patch adds support for Asus A4G.
Originally by Giuseppe Rota.
Signed-off-by: Karol Kozimor <sziwan@hell.org.pl>
--- a/drivers/acpi/asus_acpi.c 2006-01-18 17:36:00.000000000 +0100
+++ b/drivers/acpi/asus_acpi.c 2006-01-18 17:44:03.000000000 +0100
@@ -120,6 +120,7 @@ struct asus_hotk {
enum {
A1x = 0, //A1340D, A1300F
A2x, //A2500H
+ A4G, //A4700G
D1x, //D1
L2D, //L2000D
L3C, //L3800C
@@ -189,6 +190,16 @@ static struct model_data model_conf[END_
.display_get = "\\INFB"},
{
+ .name = "A4G",
+ .mt_mled = "MLED",
+/* WLED present, but not controlled by ACPI */
+ .mt_lcd_switch = xxN_PREFIX "_Q10",
+ .brightness_set = "SPLV",
+ .brightness_get = "GPLV",
+ .display_set = "SDSP",
+ .display_get = "\\ADVG"},
+
+ {
.name = "D1x",
.mt_mled = "MLED",
.mt_lcd_switch = "\\Q0D",
@@ -1122,6 +1133,8 @@ static int __init asus_hotk_get_info(voi
hotk->model = S2x;
else if (strncmp(model->string.pointer, "L5", 2) == 0)
hotk->model = L5x;
+ else if (strncmp(model->string.pointer, "A4G", 3) == 0)
+ hotk->model = A4G;
else if (strncmp(model->string.pointer, "W1N", 3) == 0)
hotk->model = W1N;
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH 6/10] handle internal Bluetooth / support W5A
2006-06-30 22:59 ` [PATCH 0/10] drivers/acpi/asus_acpi.c updates [RESEND] Karol Kozimor
` (4 preceding siblings ...)
2006-06-30 23:05 ` [PATCH 5/10] support A4G Karol Kozimor
@ 2006-06-30 23:07 ` Karol Kozimor
2006-06-30 23:08 ` [PATCH 7/10] support L5D Karol Kozimor
` (3 subsequent siblings)
9 siblings, 0 replies; 21+ messages in thread
From: Karol Kozimor @ 2006-06-30 23:07 UTC (permalink / raw)
To: Brown, Len; +Cc: linux-acpi
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: Karol Kozimor <sziwan@hell.org.pl>
--- a/drivers/acpi/asus_acpi.c 2006-01-18 17:44:03.000000000 +0100
+++ b/drivers/acpi/asus_acpi.c 2006-01-18 17:56:16.000000000 +0100
@@ -49,6 +49,7 @@
#define PROC_MLED "mled"
#define PROC_WLED "wled"
#define PROC_TLED "tled"
+#define PROC_BT "bluetooth"
#define PROC_LEDD "ledd"
#define PROC_INFO "info"
#define PROC_LCD "lcd"
@@ -69,9 +70,10 @@
/*
* Flags for hotk status
*/
-#define MLED_ON 0x01 //is MLED ON ?
-#define WLED_ON 0x02
-#define TLED_ON 0x04
+#define MLED_ON 0x01 //mail LED
+#define WLED_ON 0x02 //wireless LED
+#define TLED_ON 0x04 //touchpad LED
+#define BT_ON 0x08 //internal Bluetooth
MODULE_AUTHOR("Julien Lerouge, Karol Kozimor");
MODULE_DESCRIPTION(ACPI_HOTK_NAME);
@@ -95,7 +97,9 @@ struct model_data {
char *mt_tled; //method to handle tled_____________R
char *tled_status; //node to handle tled reading_______A
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 *brightness_up; //method to set brightness up_______A
char *brightness_down; //guess what ?______________________A
@@ -137,6 +141,7 @@ struct asus_hotk {
S1x, //S1300A, but also L1400B and M2400A (L84F)
S2x, //S200 (J1 reported), Victor MP-XP7210
W1N, //W1000N
+ W5A, //W5A
xxN, //M2400N, M3700N, M5200N, M6800N, S1300N, S5200N
//(Centrino)
END_MODEL
@@ -373,6 +378,16 @@ static struct model_data model_conf[END_
.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",
.mt_mled = "MLED",
/* WLED present, but not controlled by ACPI */
@@ -639,6 +654,25 @@ proc_write_wled(struct file *file, const
}
/*
+ * 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
*/
static int
@@ -949,6 +983,11 @@ static int __init asus_hotk_add_fs(struc
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
* from keyboard
@@ -984,6 +1023,8 @@ static int asus_hotk_remove_fs(struct ac
remove_proc_entry(PROC_TLED, acpi_device_dir(device));
if (hotk->methods->mt_ledd)
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)
remove_proc_entry(PROC_LCD, acpi_device_dir(device));
if ((hotk->methods->brightness_up
@@ -1137,6 +1178,8 @@ static int __init asus_hotk_get_info(voi
hotk->model = A4G;
else if (strncmp(model->string.pointer, "W1N", 3) == 0)
hotk->model = W1N;
+ else if (strncmp(model->string.pointer, "W5A", 3) == 0)
+ hotk->model = W5A;
if (hotk->model == END_MODEL) {
printk("unsupported, trying default values, supply the "
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH 7/10] support L5D
2006-06-30 22:59 ` [PATCH 0/10] drivers/acpi/asus_acpi.c updates [RESEND] Karol Kozimor
` (5 preceding siblings ...)
2006-06-30 23:07 ` [PATCH 6/10] handle internal Bluetooth / support W5A Karol Kozimor
@ 2006-06-30 23:08 ` Karol Kozimor
2006-06-30 23:11 ` [PATCH 8/10] rework model detection Karol Kozimor
` (2 subsequent siblings)
9 siblings, 0 replies; 21+ messages in thread
From: Karol Kozimor @ 2006-06-30 23:08 UTC (permalink / raw)
To: Brown, Len; +Cc: linux-acpi
This patch adds support for Asus L5D and thus fixes
http://bugme.osdl.org/show_bug.cgi?id=4695
Signed-off-by: Karol Kozimor <sziwan@hell.org.pl>
--- a/drivers/acpi/asus_acpi.c 2006-01-18 18:08:48.000000000 +0100
+++ b/drivers/acpi/asus_acpi.c 2006-01-18 18:10:40.000000000 +0100
@@ -129,7 +129,7 @@ struct asus_hotk {
L2D, //L2000D
L3C, //L3800C
L3D, //L3400D
- L3H, //L3H, but also L2000E
+ L3H, //L3H, L2000E, L5D
L4R, //L4500R
L5x, //L5800C
L8L, //L8400L
@@ -1123,8 +1123,9 @@ static int __init asus_hotk_get_info(voi
hotk->model = END_MODEL;
if (strncmp(model->string.pointer, "L3D", 3) == 0)
hotk->model = L3D;
- else if (strncmp(model->string.pointer, "L3H", 3) == 0 ||
- strncmp(model->string.pointer, "L2E", 3) == 0)
+ else if (strncmp(model->string.pointer, "L2E", 3) == 0 ||
+ strncmp(model->string.pointer, "L3H", 3) == 0 ||
+ strncmp(model->string.pointer, "L5D", 3) == 0)
hotk->model = L3H;
else if (strncmp(model->string.pointer, "L3", 2) == 0 ||
strncmp(model->string.pointer, "L2B", 3) == 0)
@@ -1195,6 +1196,9 @@ static int __init asus_hotk_get_info(voi
strncmp(model->string.pointer, "W3N", 3) == 0)
hotk->methods->mt_mled = NULL;
/* S5N, M5N and W3N have no MLED */
+ else if (strncmp(model->string.pointer, "L5D", 3) == 0)
+ hotk->methods->mt_wled = NULL;
+ /* L5D's WLED is not controlled by ACPI */
else if (strncmp(model->string.pointer, "M2N", 3) == 0)
hotk->methods->mt_wled = "WLED";
/* M2N has a usable WLED */
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH 8/10] rework model detection
2006-06-30 22:59 ` [PATCH 0/10] drivers/acpi/asus_acpi.c updates [RESEND] Karol Kozimor
` (6 preceding siblings ...)
2006-06-30 23:08 ` [PATCH 7/10] support L5D Karol Kozimor
@ 2006-06-30 23:11 ` Karol Kozimor
2006-06-30 23:12 ` [PATCH 9/10] add S1N WLED control Karol Kozimor
2006-06-30 23:14 ` [PATCH 10/10] " Karol Kozimor
9 siblings, 0 replies; 21+ messages in thread
From: Karol Kozimor @ 2006-06-30 23:11 UTC (permalink / raw)
To: Brown, Len; +Cc: linux-acpi
This patch reworks laptop model detection.
This addresses the Samsung P30 issue, where the INIT method would return no
object, but the implicit return in the AML interpreter would confuse the
driver. It also accounts for a newer batch of Asus models whose INIT
returns ACPI_TYPE_BUFFER instead of STRING.
The handling is now much leaner, if we get a buffer or a string, we check
against known values, in every other case we use a different path
(currently DSDT signatures). The bulk of this patch is separating the
string matching from asus_hotk_get_info() into a separate function.
This patch properly fixes http://bugme.osdl.org/show_bug.cgi?id=5067 and
http://bugme.osdl.org/show_bug.cgi?id=5092 and makes the driver fully
functional again with acpi=strict on all machines.
Signed-off-by: Karol Kozimor <sziwan@hell.org.pl>
--- a/drivers/acpi/asus_acpi.c 2006-01-18 18:10:40.000000000 +0100
+++ b/drivers/acpi/asus_acpi.c 2006-01-18 18:20:11.000000000 +0100
@@ -1048,6 +1048,65 @@ static void asus_hotk_notify(acpi_handle
}
/*
+ * Match the model string to the list of supported models. Return END_MODEL if
+ * no match or model is NULL.
+ */
+static int asus_model_match(char *model)
+{
+ if (model == NULL)
+ return END_MODEL;
+
+ if (strncmp(model, "L3D", 3) == 0)
+ return L3D;
+ else if (strncmp(model, "L2E", 3) == 0 ||
+ strncmp(model, "L3H", 3) == 0 || strncmp(model, "L5D", 3) == 0)
+ return L3H;
+ else if (strncmp(model, "L3", 2) == 0 || strncmp(model, "L2B", 3) == 0)
+ return L3C;
+ else if (strncmp(model, "L8L", 3) == 0)
+ return L8L;
+ else if (strncmp(model, "L4R", 3) == 0)
+ return L4R;
+ else if (strncmp(model, "M6N", 3) == 0 || strncmp(model, "W3N", 3) == 0)
+ return M6N;
+ else if (strncmp(model, "M6R", 3) == 0 || strncmp(model, "A3G", 3) == 0)
+ return M6R;
+ else if (strncmp(model, "M2N", 3) == 0 ||
+ strncmp(model, "M3N", 3) == 0 ||
+ strncmp(model, "M5N", 3) == 0 ||
+ strncmp(model, "M6N", 3) == 0 ||
+ strncmp(model, "S1N", 3) == 0 ||
+ strncmp(model, "S5N", 3) == 0 || strncmp(model, "W1N", 3) == 0)
+ return xxN;
+ else if (strncmp(model, "M1", 2) == 0)
+ return M1A;
+ else if (strncmp(model, "M2", 2) == 0 || strncmp(model, "L4E", 3) == 0)
+ return M2E;
+ else if (strncmp(model, "L2", 2) == 0)
+ return L2D;
+ else if (strncmp(model, "L8", 2) == 0)
+ return S1x;
+ else if (strncmp(model, "D1", 2) == 0)
+ return D1x;
+ else if (strncmp(model, "A1", 2) == 0)
+ return A1x;
+ else if (strncmp(model, "A2", 2) == 0)
+ return A2x;
+ else if (strncmp(model, "J1", 2) == 0)
+ return S2x;
+ else if (strncmp(model, "L5", 2) == 0)
+ return L5x;
+ else if (strncmp(model, "A4G", 3) == 0)
+ return A4G;
+ else if (strncmp(model, "W1N", 3) == 0)
+ return W1N;
+ else if (strncmp(model, "W5A", 3) == 0)
+ return W5A;
+ else
+ return END_MODEL;
+}
+
+/*
* This function is used to initialize the hotk with right values. In this
* method, we can make all the detection we want, and modify the hotk struct
*/
@@ -1057,6 +1116,7 @@ static int __init asus_hotk_get_info(voi
struct acpi_buffer dsdt = { ACPI_ALLOCATE_BUFFER, NULL };
union acpi_object *model = NULL;
int bsts_result;
+ char *string = NULL;
acpi_status status;
/*
@@ -1086,120 +1146,63 @@ static int __init asus_hotk_get_info(voi
printk(KERN_NOTICE " BSTS called, 0x%02x returned\n",
bsts_result);
- /* This is unlikely with implicit return */
- if (buffer.pointer == NULL)
- return -EINVAL;
-
- model = (union acpi_object *)buffer.pointer;
/*
- * Samsung P30 has a device with a valid _HID whose INIT does not
- * return anything. It used to be possible to catch this exception,
- * but the implicit return code will now happily confuse the
- * driver. We assume that every ACPI_TYPE_STRING is a valid model
- * identifier but it's still possible to get completely bogus data.
+ * Try to match the object returned by INIT to the specific model.
+ * Handle every possible object (or the lack of thereof) the DSDT
+ * writers might throw at us. When in trouble, we pass NULL to
+ * asus_model_match() and try something completely different.
*/
- if (model->type == ACPI_TYPE_STRING) {
- printk(KERN_NOTICE " %s model detected, ",
- model->string.pointer);
- } else {
- if (asus_info && /* Samsung P30 */
+ if (buffer.pointer) {
+ model = (union acpi_object *)buffer.pointer;
+ switch (model->type) {
+ case ACPI_TYPE_STRING:
+ string = model->string.pointer;
+ break;
+ case ACPI_TYPE_BUFFER:
+ string = model->buffer.pointer;
+ break;
+ default:
+ kfree(model);
+ break;
+ }
+ }
+ hotk->model = asus_model_match(string);
+ if (hotk->model == END_MODEL) { /* match failed */
+ if (asus_info &&
strncmp(asus_info->oem_table_id, "ODEM", 4) == 0) {
hotk->model = P30;
printk(KERN_NOTICE
" Samsung P30 detected, supported\n");
} else {
hotk->model = M2E;
- printk(KERN_WARNING " no string returned by INIT\n");
- printk(KERN_WARNING " trying default values, supply "
- "the developers with your DSDT\n");
+ printk(KERN_NOTICE " unsupported model %s, trying "
+ "default values\n", string);
+ printk(KERN_NOTICE
+ " send /proc/acpi/dsdt to the developers\n");
}
hotk->methods = &model_conf[hotk->model];
-
- kfree(model);
-
return AE_OK;
}
-
- hotk->model = END_MODEL;
- if (strncmp(model->string.pointer, "L3D", 3) == 0)
- hotk->model = L3D;
- else if (strncmp(model->string.pointer, "L2E", 3) == 0 ||
- strncmp(model->string.pointer, "L3H", 3) == 0 ||
- strncmp(model->string.pointer, "L5D", 3) == 0)
- hotk->model = L3H;
- else if (strncmp(model->string.pointer, "L3", 2) == 0 ||
- strncmp(model->string.pointer, "L2B", 3) == 0)
- hotk->model = L3C;
- else if (strncmp(model->string.pointer, "L8L", 3) == 0)
- hotk->model = L8L;
- else if (strncmp(model->string.pointer, "L4R", 3) == 0)
- hotk->model = L4R;
- else if (strncmp(model->string.pointer, "M6N", 3) == 0 ||
- strncmp(model->string.pointer, "W3N", 3) == 0)
- hotk->model = M6N;
- else if (strncmp(model->string.pointer, "M6R", 3) == 0 ||
- strncmp(model->string.pointer, "A3G", 3) == 0)
- hotk->model = M6R;
- else if (strncmp(model->string.pointer, "M2N", 3) == 0 ||
- strncmp(model->string.pointer, "M3N", 3) == 0 ||
- strncmp(model->string.pointer, "M5N", 3) == 0 ||
- strncmp(model->string.pointer, "M6N", 3) == 0 ||
- strncmp(model->string.pointer, "S1N", 3) == 0 ||
- strncmp(model->string.pointer, "S5N", 3) == 0)
- hotk->model = xxN;
- else if (strncmp(model->string.pointer, "M1", 2) == 0)
- hotk->model = M1A;
- else if (strncmp(model->string.pointer, "M2", 2) == 0 ||
- strncmp(model->string.pointer, "L4E", 3) == 0)
- hotk->model = M2E;
- else if (strncmp(model->string.pointer, "L2", 2) == 0)
- hotk->model = L2D;
- else if (strncmp(model->string.pointer, "L8", 2) == 0)
- hotk->model = S1x;
- else if (strncmp(model->string.pointer, "D1", 2) == 0)
- hotk->model = D1x;
- else if (strncmp(model->string.pointer, "A1", 2) == 0)
- hotk->model = A1x;
- else if (strncmp(model->string.pointer, "A2", 2) == 0)
- hotk->model = A2x;
- else if (strncmp(model->string.pointer, "J1", 2) == 0)
- hotk->model = S2x;
- else if (strncmp(model->string.pointer, "L5", 2) == 0)
- hotk->model = L5x;
- else if (strncmp(model->string.pointer, "A4G", 3) == 0)
- hotk->model = A4G;
- else if (strncmp(model->string.pointer, "W1N", 3) == 0)
- hotk->model = W1N;
- else if (strncmp(model->string.pointer, "W5A", 3) == 0)
- hotk->model = W5A;
-
- if (hotk->model == END_MODEL) {
- printk("unsupported, trying default values, supply the "
- "developers with your DSDT\n");
- hotk->model = M2E;
- } else {
- printk("supported\n");
- }
-
hotk->methods = &model_conf[hotk->model];
+ printk(KERN_NOTICE " %s model detected, supported\n", string);
/* Sort of per-model blacklist */
- if (strncmp(model->string.pointer, "L2B", 3) == 0)
+ if (strncmp(string, "L2B", 3) == 0)
hotk->methods->lcd_status = NULL;
/* L2B is similar enough to L3C to use its settings, with this only
exception */
- else if (strncmp(model->string.pointer, "A3G", 3) == 0)
+ else if (strncmp(string, "A3G", 3) == 0)
hotk->methods->lcd_status = "\\BLFG";
/* A3G is like M6R */
- else if (strncmp(model->string.pointer, "S5N", 3) == 0 ||
- strncmp(model->string.pointer, "M5N", 3) == 0 ||
- strncmp(model->string.pointer, "W3N", 3) == 0)
+ else if (strncmp(string, "S5N", 3) == 0 ||
+ strncmp(string, "M5N", 3) == 0 ||
+ strncmp(string, "W3N", 3) == 0)
hotk->methods->mt_mled = NULL;
/* S5N, M5N and W3N have no MLED */
- else if (strncmp(model->string.pointer, "L5D", 3) == 0)
+ else if (strncmp(string, "L5D", 3) == 0)
hotk->methods->mt_wled = NULL;
/* L5D's WLED is not controlled by ACPI */
- else if (strncmp(model->string.pointer, "M2N", 3) == 0)
+ else if (strncmp(string, "M2N", 3) == 0)
hotk->methods->mt_wled = "WLED";
/* M2N has a usable WLED */
else if (asus_info) {
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH 9/10] add S1N WLED control
2006-06-30 22:59 ` [PATCH 0/10] drivers/acpi/asus_acpi.c updates [RESEND] Karol Kozimor
` (7 preceding siblings ...)
2006-06-30 23:11 ` [PATCH 8/10] rework model detection Karol Kozimor
@ 2006-06-30 23:12 ` Karol Kozimor
2006-06-30 23:14 ` [PATCH 10/10] " Karol Kozimor
9 siblings, 0 replies; 21+ messages in thread
From: Karol Kozimor @ 2006-06-30 23:12 UTC (permalink / raw)
To: Brown, Len; +Cc: linux-acpi
This small patch adds back WLED control for S1N models, this was
accidentally removed a while ago.
Signed-off-by: Karol Kozimor <sziwan@hell.org.pl>
--- a/drivers/acpi/asus_acpi.c 2006-01-18 18:20:11.000000000 +0100
+++ b/drivers/acpi/asus_acpi.c 2006-01-18 18:24:16.000000000 +0100
@@ -1202,9 +1202,10 @@ static int __init asus_hotk_get_info(voi
else if (strncmp(string, "L5D", 3) == 0)
hotk->methods->mt_wled = NULL;
/* L5D's WLED is not controlled by ACPI */
- else if (strncmp(string, "M2N", 3) == 0)
+ else if (strncmp(string, "M2N", 3) == 0 ||
+ strncmp(string, "S1N", 3) == 0)
hotk->methods->mt_wled = "WLED";
- /* M2N has a usable WLED */
+ /* M2N and S1N have a usable WLED */
else if (asus_info) {
if (strncmp(asus_info->oem_table_id, "L1", 2) == 0)
hotk->methods->mled_status = NULL;
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH 10/10] add S1N WLED control
2006-06-30 22:59 ` [PATCH 0/10] drivers/acpi/asus_acpi.c updates [RESEND] Karol Kozimor
` (8 preceding siblings ...)
2006-06-30 23:12 ` [PATCH 9/10] add S1N WLED control Karol Kozimor
@ 2006-06-30 23:14 ` Karol Kozimor
9 siblings, 0 replies; 21+ messages in thread
From: Karol Kozimor @ 2006-06-30 23:14 UTC (permalink / raw)
To: Brown, Len; +Cc: linux-acpi
This patch switches back the display nodes for M6R and M6N -- this happened
a while ago when a patch was misapplied (only the in-tree version was
affected).
Signed-off-by: Karol Kozimor <sziwan@hell.org.pl>
--- a/drivers/acpi/asus_acpi.c 2006-07-01 00:39:12.000000000 +0200
+++ b/drivers/acpi/asus_acpi.c 2006-07-01 00:51:14.000000000 +0200
@@ -310,7 +310,8 @@
.brightness_set = "SPLV",
.brightness_get = "GPLV",
.display_set = "SDSP",
- .display_get = "\\_SB.PCI0.P0P1.VGA.GETD"},
+ .display_get = "\\SSTE"},
+
{
.name = "M6R",
.mt_mled = "MLED",
@@ -320,7 +321,7 @@
.brightness_set = "SPLV",
.brightness_get = "GPLV",
.display_set = "SDSP",
- .display_get = "\\SSTE"},
+ .display_get = "\\_SB.PCI0.P0P1.VGA.GETD"},
{
.name = "P30",
^ permalink raw reply [flat|nested] 21+ messages in thread
end of thread, other threads:[~2006-06-30 23:14 UTC | newest]
Thread overview: 21+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-01-18 21:21 [PATCH 0/9] drivers/acpi/asus_acpi.c updates Karol Kozimor
2006-01-18 21:26 ` [PATCH 1/9] misc cleanups Karol Kozimor
2006-01-18 21:28 ` [PATCH 2/9] support A3G Karol Kozimor
2006-01-18 21:36 ` [PATCH 3/9] LED display support Karol Kozimor
2006-01-18 21:38 ` [PATCH 4/9] support W3400N Karol Kozimor
2006-01-18 21:41 ` [PATCH 5/9] support A4G Karol Kozimor
2006-01-18 21:48 ` [PATCH 6/9] handle internal Bluetooth / support W5A Karol Kozimor
2006-01-18 21:52 ` [PATCH 7/9] support L5D Karol Kozimor
2006-01-18 22:02 ` [PATCH 8/9] rework model detection Karol Kozimor
2006-01-18 22:04 ` [PATCH 9/9] add S1N WLED control Karol Kozimor
2006-06-30 22:59 ` [PATCH 0/10] drivers/acpi/asus_acpi.c updates [RESEND] Karol Kozimor
2006-06-30 23:02 ` [PATCH 1/10] misc cleanups Karol Kozimor
2006-06-30 23:03 ` [PATCH 2/10] support A3G Karol Kozimor
2006-06-30 23:04 ` [PATCH 3/10] LED display support Karol Kozimor
2006-06-30 23:05 ` [PATCH 4/10] support W3400N Karol Kozimor
2006-06-30 23:05 ` [PATCH 5/10] support A4G Karol Kozimor
2006-06-30 23:07 ` [PATCH 6/10] handle internal Bluetooth / support W5A Karol Kozimor
2006-06-30 23:08 ` [PATCH 7/10] support L5D Karol Kozimor
2006-06-30 23:11 ` [PATCH 8/10] rework model detection Karol Kozimor
2006-06-30 23:12 ` [PATCH 9/10] add S1N WLED control Karol Kozimor
2006-06-30 23:14 ` [PATCH 10/10] " Karol Kozimor
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).