diff options
| author | Karol Kozimor <sziwan@hell.org.pl> | 2006-06-30 19:04:00 -0400 |
|---|---|---|
| committer | Len Brown <len.brown@intel.com> | 2006-06-30 20:34:06 -0400 |
| commit | 42cb891295795ed9b3048c8922d93f7a71f63968 (patch) | |
| tree | 2312b48ed28963e52fdd5fddca9891d8e78d98d5 | |
| parent | ed2cb07b2bb04f14793cdeecb0b384374e979525 (diff) | |
ACPI: asus_acpi: LED display support
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>
Signed-off-by: Len Brown <len.brown@intel.com>
| -rw-r--r-- | drivers/acpi/asus_acpi.c | 69 |
1 files changed, 63 insertions, 6 deletions
diff --git a/drivers/acpi/asus_acpi.c b/drivers/acpi/asus_acpi.c index fdc3995b8911..b95b52e2932c 100644 --- a/drivers/acpi/asus_acpi.c +++ b/drivers/acpi/asus_acpi.c | |||
| @@ -26,6 +26,7 @@ | |||
| 26 | * Pontus Fuchs - Helper functions, cleanup | 26 | * Pontus Fuchs - Helper functions, cleanup |
| 27 | * Johann Wiesner - Small compile fixes | 27 | * Johann Wiesner - Small compile fixes |
| 28 | * John Belmonte - ACPI code for Toshiba laptop was a good starting point. | 28 | * John Belmonte - ACPI code for Toshiba laptop was a good starting point. |
| 29 | * Éric Burghard - LED display support for W1N | ||
| 29 | * | 30 | * |
| 30 | */ | 31 | */ |
| 31 | 32 | ||
| @@ -44,6 +45,7 @@ | |||
| 44 | #define PROC_MLED "mled" | 45 | #define PROC_MLED "mled" |
| 45 | #define PROC_WLED "wled" | 46 | #define PROC_WLED "wled" |
| 46 | #define PROC_TLED "tled" | 47 | #define PROC_TLED "tled" |
| 48 | #define PROC_LEDD "ledd" | ||
| 47 | #define PROC_INFO "info" | 49 | #define PROC_INFO "info" |
| 48 | #define PROC_LCD "lcd" | 50 | #define PROC_LCD "lcd" |
| 49 | #define PROC_BRN "brn" | 51 | #define PROC_BRN "brn" |
| @@ -88,6 +90,7 @@ struct model_data { | |||
| 88 | char *wled_status; //node to handle wled reading_______A | 90 | char *wled_status; //node to handle wled reading_______A |
| 89 | char *mt_tled; //method to handle tled_____________R | 91 | char *mt_tled; //method to handle tled_____________R |
| 90 | char *tled_status; //node to handle tled reading_______A | 92 | char *tled_status; //node to handle tled reading_______A |
| 93 | char *mt_ledd; //method to handle LED display______R | ||
| 91 | char *mt_lcd_switch; //method to turn LCD ON/OFF_________A | 94 | char *mt_lcd_switch; //method to turn LCD ON/OFF_________A |
| 92 | char *lcd_status; //node to read LCD panel state______A | 95 | char *lcd_status; //node to read LCD panel state______A |
| 93 | char *brightness_up; //method to set brightness up_______A | 96 | char *brightness_up; //method to set brightness up_______A |
| @@ -107,6 +110,7 @@ struct asus_hotk { | |||
| 107 | struct acpi_device *device; //the device we are in | 110 | struct acpi_device *device; //the device we are in |
| 108 | acpi_handle handle; //the handle of the hotk device | 111 | acpi_handle handle; //the handle of the hotk device |
| 109 | char status; //status of the hotk, for LEDs, ... | 112 | char status; //status of the hotk, for LEDs, ... |
| 113 | u32 ledd_status; //status of the LED display | ||
| 110 | struct model_data *methods; //methods available on the laptop | 114 | struct model_data *methods; //methods available on the laptop |
| 111 | u8 brightness; //brightness level | 115 | u8 brightness; //brightness level |
| 112 | enum { | 116 | enum { |
| @@ -127,7 +131,8 @@ struct asus_hotk { | |||
| 127 | P30, //Samsung P30 | 131 | P30, //Samsung P30 |
| 128 | S1x, //S1300A, but also L1400B and M2400A (L84F) | 132 | S1x, //S1300A, but also L1400B and M2400A (L84F) |
| 129 | S2x, //S200 (J1 reported), Victor MP-XP7210 | 133 | S2x, //S200 (J1 reported), Victor MP-XP7210 |
| 130 | xxN, //M2400N, M3700N, M5200N, S1300N, S5200N, W1OOON | 134 | W1N, //W1000N |
| 135 | xxN, //M2400N, M3700N, M5200N, M6800N, S1300N, S5200N | ||
| 131 | //(Centrino) | 136 | //(Centrino) |
| 132 | END_MODEL | 137 | END_MODEL |
| 133 | } model; //Models currently supported | 138 | } model; //Models currently supported |
| @@ -332,6 +337,18 @@ static struct model_data model_conf[END_MODEL] = { | |||
| 332 | .brightness_down = S2x_PREFIX "_Q0A"}, | 337 | .brightness_down = S2x_PREFIX "_Q0A"}, |
| 333 | 338 | ||
| 334 | { | 339 | { |
| 340 | .name = "W1N", | ||
| 341 | .mt_mled = "MLED", | ||
| 342 | .mt_wled = "WLED", | ||
| 343 | .mt_ledd = "SLCM", | ||
| 344 | .mt_lcd_switch = xxN_PREFIX "_Q10", | ||
| 345 | .lcd_status = "\\BKLT", | ||
| 346 | .brightness_set = "SPLV", | ||
| 347 | .brightness_get = "GPLV", | ||
| 348 | .display_set = "SDSP", | ||
| 349 | .display_get = "\\ADVG"}, | ||
| 350 | |||
| 351 | { | ||
| 335 | .name = "xxN", | 352 | .name = "xxN", |
| 336 | .mt_mled = "MLED", | 353 | .mt_mled = "MLED", |
| 337 | /* WLED present, but not controlled by ACPI */ | 354 | /* WLED present, but not controlled by ACPI */ |
| @@ -550,6 +567,36 @@ proc_write_mled(struct file *file, const char __user * buffer, | |||
| 550 | } | 567 | } |
| 551 | 568 | ||
| 552 | /* | 569 | /* |
| 570 | * Proc handlers for LED display | ||
| 571 | */ | ||
| 572 | static int | ||
| 573 | proc_read_ledd(char *page, char **start, off_t off, int count, int *eof, | ||
| 574 | void *data) | ||
| 575 | { | ||
| 576 | return sprintf(page, "0x%08x\n", hotk->ledd_status); | ||
| 577 | } | ||
| 578 | |||
| 579 | static int | ||
| 580 | proc_write_ledd(struct file *file, const char __user * buffer, | ||
| 581 | unsigned long count, void *data) | ||
| 582 | { | ||
| 583 | int value; | ||
| 584 | |||
| 585 | count = parse_arg(buffer, count, &value); | ||
| 586 | if (count > 0) { | ||
| 587 | if (!write_acpi_int | ||
| 588 | (hotk->handle, hotk->methods->mt_ledd, value, NULL)) | ||
| 589 | printk(KERN_WARNING | ||
| 590 | "Asus ACPI: LED display write failed\n"); | ||
| 591 | else | ||
| 592 | hotk->ledd_status = (u32) value; | ||
| 593 | } else if (count < 0) | ||
| 594 | printk(KERN_WARNING "Asus ACPI: Error reading user input\n"); | ||
| 595 | |||
| 596 | return count; | ||
| 597 | } | ||
| 598 | |||
| 599 | /* | ||
| 553 | * Proc handlers for WLED | 600 | * Proc handlers for WLED |
| 554 | */ | 601 | */ |
| 555 | static int | 602 | static int |
| @@ -863,6 +910,11 @@ static int asus_hotk_add_fs(struct acpi_device *device) | |||
| 863 | mode, device); | 910 | mode, device); |
| 864 | } | 911 | } |
| 865 | 912 | ||
| 913 | if (hotk->methods->mt_ledd) { | ||
| 914 | asus_proc_add(PROC_LEDD, &proc_write_ledd, &proc_read_ledd, | ||
| 915 | mode, device); | ||
| 916 | } | ||
| 917 | |||
| 866 | if (hotk->methods->mt_mled) { | 918 | if (hotk->methods->mt_mled) { |
| 867 | asus_proc_add(PROC_MLED, &proc_write_mled, &proc_read_mled, | 919 | asus_proc_add(PROC_MLED, &proc_write_mled, &proc_read_mled, |
| 868 | mode, device); | 920 | mode, device); |
| @@ -906,6 +958,8 @@ static int asus_hotk_remove_fs(struct acpi_device *device) | |||
| 906 | remove_proc_entry(PROC_MLED, acpi_device_dir(device)); | 958 | remove_proc_entry(PROC_MLED, acpi_device_dir(device)); |
| 907 | if (hotk->methods->mt_tled) | 959 | if (hotk->methods->mt_tled) |
| 908 | remove_proc_entry(PROC_TLED, acpi_device_dir(device)); | 960 | remove_proc_entry(PROC_TLED, acpi_device_dir(device)); |
| 961 | if (hotk->methods->mt_ledd) | ||
| 962 | remove_proc_entry(PROC_LEDD, acpi_device_dir(device)); | ||
| 909 | if (hotk->methods->mt_lcd_switch && hotk->methods->lcd_status) | 963 | if (hotk->methods->mt_lcd_switch && hotk->methods->lcd_status) |
| 910 | remove_proc_entry(PROC_LCD, acpi_device_dir(device)); | 964 | remove_proc_entry(PROC_LCD, acpi_device_dir(device)); |
| 911 | if ((hotk->methods->brightness_up | 965 | if ((hotk->methods->brightness_up |
| @@ -1033,8 +1087,7 @@ static int asus_hotk_get_info(void) | |||
| 1033 | strncmp(model->string.pointer, "M5N", 3) == 0 || | 1087 | strncmp(model->string.pointer, "M5N", 3) == 0 || |
| 1034 | strncmp(model->string.pointer, "M6N", 3) == 0 || | 1088 | strncmp(model->string.pointer, "M6N", 3) == 0 || |
| 1035 | strncmp(model->string.pointer, "S1N", 3) == 0 || | 1089 | strncmp(model->string.pointer, "S1N", 3) == 0 || |
| 1036 | strncmp(model->string.pointer, "S5N", 3) == 0 || | 1090 | strncmp(model->string.pointer, "S5N", 3) == 0) |
| 1037 | strncmp(model->string.pointer, "W1N", 3) == 0) | ||
| 1038 | hotk->model = xxN; | 1091 | hotk->model = xxN; |
| 1039 | else if (strncmp(model->string.pointer, "M1", 2) == 0) | 1092 | else if (strncmp(model->string.pointer, "M1", 2) == 0) |
| 1040 | hotk->model = M1A; | 1093 | hotk->model = M1A; |
| @@ -1055,6 +1108,8 @@ static int asus_hotk_get_info(void) | |||
| 1055 | hotk->model = S2x; | 1108 | hotk->model = S2x; |
| 1056 | else if (strncmp(model->string.pointer, "L5", 2) == 0) | 1109 | else if (strncmp(model->string.pointer, "L5", 2) == 0) |
| 1057 | hotk->model = L5x; | 1110 | hotk->model = L5x; |
| 1111 | else if (strncmp(model->string.pointer, "W1N", 3) == 0) | ||
| 1112 | hotk->model = W1N; | ||
| 1058 | 1113 | ||
| 1059 | if (hotk->model == END_MODEL) { | 1114 | if (hotk->model == END_MODEL) { |
| 1060 | printk("unsupported, trying default values, supply the " | 1115 | printk("unsupported, trying default values, supply the " |
| @@ -1078,10 +1133,9 @@ static int asus_hotk_get_info(void) | |||
| 1078 | strncmp(model->string.pointer, "M5N", 3) == 0) | 1133 | strncmp(model->string.pointer, "M5N", 3) == 0) |
| 1079 | hotk->methods->mt_mled = NULL; | 1134 | hotk->methods->mt_mled = NULL; |
| 1080 | /* S5N and M5N have no MLED */ | 1135 | /* S5N and M5N have no MLED */ |
| 1081 | else if (strncmp(model->string.pointer, "M2N", 3) == 0 || | 1136 | else if (strncmp(model->string.pointer, "M2N", 3) == 0) |
| 1082 | strncmp(model->string.pointer, "W1N", 3) == 0) | ||
| 1083 | hotk->methods->mt_wled = "WLED"; | 1137 | hotk->methods->mt_wled = "WLED"; |
| 1084 | /* M2N and W1N have a usable WLED */ | 1138 | /* M2N has a usable WLED */ |
| 1085 | else if (asus_info) { | 1139 | else if (asus_info) { |
| 1086 | if (strncmp(asus_info->oem_table_id, "L1", 2) == 0) | 1140 | if (strncmp(asus_info->oem_table_id, "L1", 2) == 0) |
| 1087 | hotk->methods->mled_status = NULL; | 1141 | hotk->methods->mled_status = NULL; |
| @@ -1175,6 +1229,9 @@ static int asus_hotk_add(struct acpi_device *device) | |||
| 1175 | 1229 | ||
| 1176 | asus_hotk_found = 1; | 1230 | asus_hotk_found = 1; |
| 1177 | 1231 | ||
| 1232 | /* LED display is off by default */ | ||
| 1233 | hotk->ledd_status = 0xFFF; | ||
| 1234 | |||
| 1178 | end: | 1235 | end: |
| 1179 | if (result) { | 1236 | if (result) { |
| 1180 | kfree(hotk); | 1237 | kfree(hotk); |
