Commit 85185484 authored by Len Brown's avatar Len Brown

[ACPI] acpi4asus-0.24a-0.25-2.6.0-test (Karol Kozimor)

parent 12b9e486
...@@ -284,6 +284,16 @@ P: Jonathan Layes ...@@ -284,6 +284,16 @@ P: Jonathan Layes
L: linux-net@vger.kernel.org L: linux-net@vger.kernel.org
S: Maintained S: Maintained
ASUS ACPI EXTRAS DRIVER
P: Karol Kozimor
M: sziwan@users.sourceforge.net
P: Julien Lerouge
M: julien.lerouge@free.fr
L: acpi4asus-user@lists.sourceforge.net
W: http://sourceforge.net/projects/acpi4asus
W: http://julien.lerouge.free.fr
S: Maintained
ATM ATM
P: Chas Williams P: Chas Williams
M: chas@cmf.nrl.navy.mil M: chas@cmf.nrl.navy.mil
......
...@@ -160,6 +160,9 @@ config ACPI_ASUS ...@@ -160,6 +160,9 @@ config ACPI_ASUS
display brightness and output, switching the LCD backlight on and off, display brightness and output, switching the LCD backlight on and off,
and most importantly, allows you to blink those fancy LEDs intended and most importantly, allows you to blink those fancy LEDs intended
for reporting mail and wireless status. for reporting mail and wireless status.
Note: display switching code is currently considered EXPERIMENTAL,
toying with these values may even lock your machine.
All settings are changed via /proc/acpi/asus directory entries. Owner All settings are changed via /proc/acpi/asus directory entries. Owner
and group for these entries can be set with asus_uid and asus_gid and group for these entries can be set with asus_uid and asus_gid
......
...@@ -26,13 +26,21 @@ ...@@ -26,13 +26,21 @@
* Johann Wiesner - Small compile fixes * Johann Wiesner - Small compile fixes
* John Belmonte - ACPI code for Toshiba laptop was a good starting point. * John Belmonte - ACPI code for Toshiba laptop was a good starting point.
* *
* TODO * TODO:
* add Fn key status * add Fn key status
* Add mode selection on module loading (parameter) -> still necessary ? * Add mode selection on module loading (parameter) -> still necessary?
* Complete display switching -- may require dirty hacks? * Complete display switching -- may require dirty hacks?
* Complete support for Centrino laptops
* Reading certain fields (e.g. \SG66 in A2500H) consistently fails, while
* reading others (\BAOF, the same machine) succeeds. Why?
* *
*/ */
#include <linux/config.h>
#if defined (CONFIG_MODVERSIONS) && !defined (MODVERSIONS) && defined (MODULE)
#include <linux/modversions.h>
#endif
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/init.h> #include <linux/init.h>
...@@ -41,7 +49,7 @@ ...@@ -41,7 +49,7 @@
#include <acpi/acpi_drivers.h> #include <acpi/acpi_drivers.h>
#include <acpi/acpi_bus.h> #include <acpi/acpi_bus.h>
#define ASUS_ACPI_VERSION "0.24a" #define ASUS_ACPI_VERSION "0.25"
#define PROC_ASUS "asus" //the directory #define PROC_ASUS "asus" //the directory
#define PROC_MLED "mled" #define PROC_MLED "mled"
...@@ -110,20 +118,22 @@ struct asus_hotk { ...@@ -110,20 +118,22 @@ struct asus_hotk {
struct model_data *methods; //methods available on the laptop struct model_data *methods; //methods available on the laptop
u8 brightness; //brighness level u8 brightness; //brighness level
enum { enum {
L2X = 0, //L200D -> TODO check Q11 (Fn+F8) A1X=0, //A1340D, A1300F
// Calling this method simply hang the A2X, //A2500H
D1X, //D1
L1X, //L1400B
L2X, //L200D -> TODO check Q11 (Fn+F8)
// Calling this method simply hangs the
// computer, ISMI method hangs the laptop. // computer, ISMI method hangs the laptop.
L3X, //L3C
L3D, //L3400D L3D, //L3400D
L3X, //L3C
M2X, //M2400E M2X, //M2400E
M3N, //M3700N, but also S1300N -> TODO WLED
S1X, //S1300A -> TODO special keys do not work ? S1X, //S1300A -> TODO special keys do not work ?
D1X, //D1 S2X, //S200 (J1 reported), Victor MP-XP7210
L1X, //L1400B
A1X, //A1340D, A1300F
J1X, //S200 (J1)
//TODO A1370D does not seems to have a ATK device //TODO A1370D does not seems to have a ATK device
// L8400 model doesn't have ATK // L8400 model doesn't have ATK
END_MODEL, END_MODEL
} model; //Models currently supported } model; //Models currently supported
u16 event_count[128]; //count for each event TODO make this better u16 event_count[128]; //count for each event TODO make this better
}; };
...@@ -133,7 +143,8 @@ struct asus_hotk { ...@@ -133,7 +143,8 @@ struct asus_hotk {
#define S1X_PREFIX "\\_SB.PCI0.PX40." #define S1X_PREFIX "\\_SB.PCI0.PX40."
#define L1X_PREFIX S1X_PREFIX #define L1X_PREFIX S1X_PREFIX
#define A1X_PREFIX "\\_SB.PCI0.ISA.EC0." #define A1X_PREFIX "\\_SB.PCI0.ISA.EC0."
#define J1X_PREFIX A1X_PREFIX #define S2X_PREFIX A1X_PREFIX
#define M3N_PREFIX "\\_SB.PCI0.SBRG.EC0."
static struct model_data model_conf[END_MODEL] = { static struct model_data model_conf[END_MODEL] = {
/* /*
...@@ -147,33 +158,40 @@ static struct model_data model_conf[END_MODEL] = { ...@@ -147,33 +158,40 @@ static struct model_data model_conf[END_MODEL] = {
* it seems to be a kind of switch, but what for ? * it seems to be a kind of switch, but what for ?
* *
*/ */
{"A1X", "MLED", "\\MAIL", NULL, NULL, A1X_PREFIX "_Q10", "\\BKLI",
A1X_PREFIX "_Q0E", A1X_PREFIX "_Q0F", NULL, NULL, NULL, NULL, NULL},
{"A2X", "MLED", NULL, "WLED", "\\SG66", "\\Q10", "\\BAOF",
"\\Q0E", "\\Q0F", "SPLV", "GPLV", "\\CMOD", "SDSP", "\\INFB"},
{"D1X", "MLED", NULL, NULL, NULL, "\\Q0D", "\\GP11",
"\\Q0C", "\\Q0B", NULL, NULL, "\\BLVL", "SDSP","\\INFB"},
{"L1X", "MLED", NULL, "WLED", NULL, L1X_PREFIX "Q10", "\\PNOF",
L1X_PREFIX "Q0F", L1X_PREFIX "Q0E", "SPLV", "GPLV", "\\BRIT", NULL, NULL},
{"L2X", "MLED", "\\SGP6", "WLED", "\\RCP3", "\\Q10", "\\SGP0", {"L2X", "MLED", "\\SGP6", "WLED", "\\RCP3", "\\Q10", "\\SGP0",
"\\Q0E", "\\Q0F", NULL, NULL, NULL, "SDSP", "\\INFB"}, "\\Q0E", "\\Q0F", NULL, NULL, NULL, "SDSP", "\\INFB"},
{"L3D", "MLED", "\\MALD", "WLED", NULL, "\\Q10", "\\BKLG",
"\\Q0E", "\\Q0F", "SPLV", "GPLV", "\\BLVL", "SDSP", "\\INFB"},
{"L3X", "MLED", NULL, "WLED", NULL, L3X_PREFIX "_Q10", "\\GL32", {"L3X", "MLED", NULL, "WLED", NULL, L3X_PREFIX "_Q10", "\\GL32",
L3X_PREFIX "_Q0F", L3X_PREFIX "_Q0E", "SPLV", "GPLV", "\\BLVL", "SDSP", L3X_PREFIX "_Q0F", L3X_PREFIX "_Q0E", "SPLV", "GPLV", "\\BLVL", "SDSP",
"\\_SB.PCI0.PCI1.VGAC.NMAP"}, "\\_SB.PCI0.PCI1.VGAC.NMAP"},
{"L3D", "MLED", "\\MALD", "WLED", NULL, "\\Q10", "\\BKLG",
"\\Q0E", "\\Q0F", "SPLV", "GPLV", "\\BLVL", "SDSP", "\\INFB"},
{"M2X", "MLED", NULL, "WLED", NULL, "\\Q10", "\\GP06", {"M2X", "MLED", NULL, "WLED", NULL, "\\Q10", "\\GP06",
"\\Q0E","\\Q0F", "SPLV", "GPLV", NULL, "SDSP", "\\INFB"}, "\\Q0E","\\Q0F", "SPLV", "GPLV", NULL, "SDSP", "\\INFB"},
{"M3N", "MLED", NULL, "WLED", "\\PO33", M3N_PREFIX "_Q10", "\\BKLT",
M3N_PREFIX "_Q0F", M3N_PREFIX "_Q0E", "SPLV", "GPLV", "\\LBTN", "SDSP",
"\\ADVG"},
{"S1X", "MLED", "\\EMLE", "WLED", NULL, S1X_PREFIX "Q10", "\\PNOF", {"S1X", "MLED", "\\EMLE", "WLED", NULL, S1X_PREFIX "Q10", "\\PNOF",
S1X_PREFIX "Q0F", S1X_PREFIX "Q0E", "SPLV", "GPLV", "\\BRIT", NULL, NULL}, S1X_PREFIX "Q0F", S1X_PREFIX "Q0E", "SPLV", "GPLV", "\\BRIT", NULL, NULL},
{"D1X", "MLED", NULL, NULL, NULL, "\\Q0D", "\\GP11", {"S2X", "MLED", "\\MAIL", NULL, NULL, S2X_PREFIX "_Q10", "\\BKLI",
"\\Q0C", "\\Q0B", NULL, NULL, "\\BLVL", "SDSP","\\INFB"}, S2X_PREFIX "_Q0B", S2X_PREFIX "_Q0A", NULL, NULL, NULL, NULL, NULL}
{"L1X", "MLED", NULL, "WLED", NULL, L1X_PREFIX "Q10", "\\PNOF",
L1X_PREFIX "Q0F", L1X_PREFIX "Q0E", "SPLV", "GPLV", "\\BRIT", NULL, NULL},
{"A1X", "MLED", "\\MAIL", NULL, NULL, A1X_PREFIX "_Q10", "\\BKLI",
A1X_PREFIX "_Q0E", A1X_PREFIX "_Q0F", NULL, NULL, NULL, NULL, NULL},
{"J1X", "MLED", "\\MAIL", NULL, NULL, J1X_PREFIX "_Q10", "\\BKLI",
J1X_PREFIX "_Q0B", J1X_PREFIX "_Q0A", NULL, NULL, NULL, NULL, NULL}
}; };
/* procdir we use */ /* procdir we use */
...@@ -234,7 +252,7 @@ static int read_acpi_int(acpi_handle handle, const char *method, int *val) ...@@ -234,7 +252,7 @@ static int read_acpi_int(acpi_handle handle, const char *method, int *val)
output.length = sizeof(out_obj); output.length = sizeof(out_obj);
output.pointer = &out_obj; output.pointer = &out_obj;
status = acpi_evaluate_object(handle, (char*) method, NULL, &output); status = acpi_evaluate_object(handle, (char *) method, NULL, &output);
*val = out_obj.integer.value; *val = out_obj.integer.value;
return (status == AE_OK) && (out_obj.type == ACPI_TYPE_INTEGER); return (status == AE_OK) && (out_obj.type == ACPI_TYPE_INTEGER);
} }
...@@ -452,7 +470,7 @@ static void set_brightness(int value, struct asus_hotk *hotk) ...@@ -452,7 +470,7 @@ static void set_brightness(int value, struct asus_hotk *hotk)
{ {
acpi_status status = 0; acpi_status status = 0;
/* ATKD laptop */ /* SPLV laptop */
if(hotk->methods->brightness_set) { if(hotk->methods->brightness_set) {
if (!write_acpi_int(hotk->handle, hotk->methods->brightness_set, if (!write_acpi_int(hotk->handle, hotk->methods->brightness_set,
value, NULL)) value, NULL))
...@@ -460,7 +478,7 @@ static void set_brightness(int value, struct asus_hotk *hotk) ...@@ -460,7 +478,7 @@ static void set_brightness(int value, struct asus_hotk *hotk)
return; return;
} }
/* HOTK laptop if we are here, act as appropriate */ /* No SPLV method if we are here, act as appropriate */
value -= hotk->brightness; value -= hotk->brightness;
while (value != 0) { while (value != 0) {
status = acpi_evaluate_object(NULL, (value > 0) ? status = acpi_evaluate_object(NULL, (value > 0) ?
...@@ -478,7 +496,7 @@ static int read_brightness(struct asus_hotk *hotk) ...@@ -478,7 +496,7 @@ static int read_brightness(struct asus_hotk *hotk)
{ {
int value; int value;
if(hotk->methods->brightness_get) { /* ATKD laptop */ if(hotk->methods->brightness_get) { /* SPLV/GPLV laptop */
if (!read_acpi_int(hotk->handle, hotk->methods->brightness_get, if (!read_acpi_int(hotk->handle, hotk->methods->brightness_get,
&value)) &value))
printk(KERN_NOTICE "Asus ACPI: Error reading brightness\n"); printk(KERN_NOTICE "Asus ACPI: Error reading brightness\n");
...@@ -486,7 +504,7 @@ static int read_brightness(struct asus_hotk *hotk) ...@@ -486,7 +504,7 @@ static int read_brightness(struct asus_hotk *hotk)
if (!read_acpi_int(NULL, hotk->methods->brightness_status, if (!read_acpi_int(NULL, hotk->methods->brightness_status,
&value)) &value))
printk(KERN_NOTICE "Asus ACPI: Error reading brightness\n"); printk(KERN_NOTICE "Asus ACPI: Error reading brightness\n");
} else /* HOTK laptop */ } else /* No GPLV method */
value = hotk->brightness; value = hotk->brightness;
return value; return value;
} }
...@@ -545,7 +563,7 @@ proc_read_disp(char *page, char **start, off_t off, int count, int *eof, ...@@ -545,7 +563,7 @@ proc_read_disp(char *page, char **start, off_t off, int count, int *eof,
} }
/* /*
* Preliminary support for display switching. As of now: 0x01 should activate * Experimental support for display switching. As of now: 0x01 should activate
* the LCD output, 0x02 should do for CRT, and 0x04 for TV-Out. Any combination * the LCD output, 0x02 should do for CRT, and 0x04 for TV-Out. Any combination
* (bitwise) of these will suffice. I never actually tested 3 displays hooked up * (bitwise) of these will suffice. I never actually tested 3 displays hooked up
* simultaneously, so be warned. * simultaneously, so be warned.
...@@ -689,7 +707,7 @@ static int asus_hotk_add_fs(struct acpi_device *device) ...@@ -689,7 +707,7 @@ static int asus_hotk_add_fs(struct acpi_device *device)
static void asus_hotk_notify(acpi_handle handle, u32 event, void *data) static void asus_hotk_notify(acpi_handle handle, u32 event, void *data)
{ {
/* TODO Find a better way to handle events count. Here, in data, we receive /* TODO Find a better way to handle events count. Here, in data, we receive
* the hotk, so we can make anything !! * the hotk, so we can do anything!
*/ */
struct asus_hotk *hotk = (struct asus_hotk *) data; struct asus_hotk *hotk = (struct asus_hotk *) data;
...@@ -749,6 +767,9 @@ static int asus_hotk_get_info(struct asus_hotk *hotk) ...@@ -749,6 +767,9 @@ static int asus_hotk_get_info(struct asus_hotk *hotk)
hotk->model = L3X; hotk->model = L3X;
else if (strncmp(model->string.pointer, "M2", 2) == 0) else if (strncmp(model->string.pointer, "M2", 2) == 0)
hotk->model = M2X; hotk->model = M2X;
else if (strncmp(model->string.pointer, "M3N", 3) == 0 ||
strncmp(model->string.pointer, "S1N", 3) == 0)
hotk->model = M3N; /* S1300N is similar enough */
else if (strncmp(model->string.pointer, "L2", 2) == 0) else if (strncmp(model->string.pointer, "L2", 2) == 0)
hotk->model = L2X; hotk->model = L2X;
else if (strncmp(model->string.pointer, "L8", 2) == 0) else if (strncmp(model->string.pointer, "L8", 2) == 0)
...@@ -761,8 +782,10 @@ static int asus_hotk_get_info(struct asus_hotk *hotk) ...@@ -761,8 +782,10 @@ static int asus_hotk_get_info(struct asus_hotk *hotk)
hotk->model = D1X; hotk->model = D1X;
else if (strncmp(model->string.pointer, "A1", 2) == 0) else if (strncmp(model->string.pointer, "A1", 2) == 0)
hotk->model = A1X; hotk->model = A1X;
else if (strncmp(model->string.pointer, "A2", 2) == 0)
hotk->model = A2X;
else if (strncmp(model->string.pointer, "J1", 2) == 0) else if (strncmp(model->string.pointer, "J1", 2) == 0)
hotk->model = J1X; hotk->model = S2X;
if (hotk->model == END_MODEL) { if (hotk->model == END_MODEL) {
...@@ -850,17 +873,20 @@ static int asus_hotk_add(struct acpi_device *device) ...@@ -850,17 +873,20 @@ static int asus_hotk_add(struct acpi_device *device)
" Notify Handler installed successfully\n"); " Notify Handler installed successfully\n");
} }
/* For HOTK laptops: init the hotk->brightness value */ /* For laptops without GPLV: init the hotk->brightness value */
if ((!hotk->methods->brightness_get) && (!hotk->methods->brightness_status) && 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, status = acpi_evaluate_object(NULL, hotk->methods->brightness_down,
NULL, NULL); NULL, NULL);
if (ACPI_FAILURE(status)) if (ACPI_FAILURE(status))
printk(KERN_NOTICE " Error changing brightness\n"); printk(KERN_NOTICE " Error changing brightness\n");
status = acpi_evaluate_object(NULL, hotk->methods->brightness_up, else {
NULL, NULL); status = acpi_evaluate_object(NULL, hotk->methods->brightness_up,
if (ACPI_FAILURE(status)) NULL, NULL);
printk(KERN_NOTICE " Error changing brightness\n"); if (ACPI_FAILURE(status))
printk(KERN_NOTICE " Strange, error changing"
" brightness\n");
}
} }
end: end:
......
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