Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
linux
linux-davinci
Commits
37672d4c
Commit
37672d4c
authored
Jul 01, 2006
by
Len Brown
Browse files
Options
Browse Files
Download
Plain Diff
Pull asus_acpi-0.30 into release branch
parents
b2f71bad
2df8386c
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
223 additions
and
108 deletions
+223
-108
drivers/acpi/asus_acpi.c
drivers/acpi/asus_acpi.c
+223
-108
No files found.
drivers/acpi/asus_acpi.c
View file @
37672d4c
...
@@ -2,7 +2,7 @@
...
@@ -2,7 +2,7 @@
* asus_acpi.c - Asus Laptop ACPI Extras
* 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
* 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
* it under the terms of the GNU General Public License as published by
...
@@ -26,11 +26,8 @@
...
@@ -26,11 +26,8 @@
* Pontus Fuchs - Helper functions, cleanup
* Pontus Fuchs - Helper functions, cleanup
* 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.
* ric Burghard - LED display support for W1N
*
*
* 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>
#include <linux/kernel.h>
...
@@ -42,12 +39,14 @@
...
@@ -42,12 +39,14 @@
#include <acpi/acpi_bus.h>
#include <acpi/acpi_bus.h>
#include <asm/uaccess.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_ASUS "asus" //the directory
#define PROC_MLED "mled"
#define PROC_MLED "mled"
#define PROC_WLED "wled"
#define PROC_WLED "wled"
#define PROC_TLED "tled"
#define PROC_TLED "tled"
#define PROC_BT "bluetooth"
#define PROC_LEDD "ledd"
#define PROC_INFO "info"
#define PROC_INFO "info"
#define PROC_LCD "lcd"
#define PROC_LCD "lcd"
#define PROC_BRN "brn"
#define PROC_BRN "brn"
...
@@ -67,9 +66,10 @@
...
@@ -67,9 +66,10 @@
/*
/*
* Flags for hotk status
* Flags for hotk status
*/
*/
#define MLED_ON 0x01 //is MLED ON ?
#define MLED_ON 0x01 //mail LED
#define WLED_ON 0x02
#define WLED_ON 0x02 //wireless LED
#define TLED_ON 0x04
#define TLED_ON 0x04 //touchpad LED
#define BT_ON 0x08 //internal Bluetooth
MODULE_AUTHOR
(
"Julien Lerouge, Karol Kozimor"
);
MODULE_AUTHOR
(
"Julien Lerouge, Karol Kozimor"
);
MODULE_DESCRIPTION
(
ACPI_HOTK_NAME
);
MODULE_DESCRIPTION
(
ACPI_HOTK_NAME
);
...
@@ -92,7 +92,10 @@ struct model_data {
...
@@ -92,7 +92,10 @@ struct model_data {
char
*
wled_status
;
//node to handle wled reading_______A
char
*
wled_status
;
//node to handle wled reading_______A
char
*
mt_tled
;
//method to handle tled_____________R
char
*
mt_tled
;
//method to handle tled_____________R
char
*
tled_status
;
//node to handle tled reading_______A
char
*
tled_status
;
//node to handle tled reading_______A
char
*
mt_lcd_switch
;
//method to turn LCD ON/OFF_________A
char
*
mt_ledd
;
//method to handle LED display______R
char
*
mt_bt_switch
;
//method to switch Bluetooth on/off_R
char
*
bt_status
;
//no model currently supports this__?
char
*
mt_lcd_switch
;
//method to turn LCD on/off_________A
char
*
lcd_status
;
//node to read LCD panel state______A
char
*
lcd_status
;
//node to read LCD panel state______A
char
*
brightness_up
;
//method to set brightness up_______A
char
*
brightness_up
;
//method to set brightness up_______A
char
*
brightness_down
;
//guess what ?______________________A
char
*
brightness_down
;
//guess what ?______________________A
...
@@ -111,27 +114,31 @@ struct asus_hotk {
...
@@ -111,27 +114,31 @@ struct asus_hotk {
struct
acpi_device
*
device
;
//the device we are in
struct
acpi_device
*
device
;
//the device we are in
acpi_handle
handle
;
//the handle of the hotk device
acpi_handle
handle
;
//the handle of the hotk device
char
status
;
//status of the hotk, for LEDs, ...
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
struct
model_data
*
methods
;
//methods available on the laptop
u8
brightness
;
//brightness level
u8
brightness
;
//brightness level
enum
{
enum
{
A1x
=
0
,
//A1340D, A1300F
A1x
=
0
,
//A1340D, A1300F
A2x
,
//A2500H
A2x
,
//A2500H
A4G
,
//A4700G
D1x
,
//D1
D1x
,
//D1
L2D
,
//L2000D
L2D
,
//L2000D
L3C
,
//L3800C
L3C
,
//L3800C
L3D
,
//L3400D
L3D
,
//L3400D
L3H
,
//L3H,
but also L2000E
L3H
,
//L3H,
L2000E, L5D
L4R
,
//L4500R
L4R
,
//L4500R
L5x
,
//L5800C
L5x
,
//L5800C
L8L
,
//L8400L
L8L
,
//L8400L
M1A
,
//M1300A
M1A
,
//M1300A
M2E
,
//M2400E, L4400L
M2E
,
//M2400E, L4400L
M6N
,
//M6800N
M6N
,
//M6800N
, W3400N
M6R
,
//M6700R
M6R
,
//M6700R
, A3000G
P30
,
//Samsung P30
P30
,
//Samsung P30
S1x
,
//S1300A, but also L1400B and M2400A (L84F)
S1x
,
//S1300A, but also L1400B and M2400A (L84F)
S2x
,
//S200 (J1 reported), Victor MP-XP7210
S2x
,
//S200 (J1 reported), Victor MP-XP7210
xxN
,
//M2400N, M3700N, M5200N, S1300N, S5200N, W1OOON
W1N
,
//W1000N
W5A
,
//W5A
xxN
,
//M2400N, M3700N, M5200N, M6800N, S1300N, S5200N
//(Centrino)
//(Centrino)
END_MODEL
END_MODEL
}
model
;
//Models currently supported
}
model
;
//Models currently supported
...
@@ -149,17 +156,8 @@ struct asus_hotk {
...
@@ -149,17 +156,8 @@ struct asus_hotk {
static
struct
model_data
model_conf
[
END_MODEL
]
=
{
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,
* 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 ?
* it seems to be a kind of switch, but what for ?
*
*/
*/
{
{
...
@@ -183,6 +181,16 @@ static struct model_data model_conf[END_MODEL] = {
...
@@ -183,6 +181,16 @@ static struct model_data model_conf[END_MODEL] = {
.
display_set
=
"SDSP"
,
.
display_set
=
"SDSP"
,
.
display_get
=
"
\\
INFB"
},
.
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"
,
.
name
=
"D1x"
,
.
mt_mled
=
"MLED"
,
.
mt_mled
=
"MLED"
,
...
@@ -302,7 +310,8 @@ static struct model_data model_conf[END_MODEL] = {
...
@@ -302,7 +310,8 @@ static struct model_data model_conf[END_MODEL] = {
.
brightness_set
=
"SPLV"
,
.
brightness_set
=
"SPLV"
,
.
brightness_get
=
"GPLV"
,
.
brightness_get
=
"GPLV"
,
.
display_set
=
"SDSP"
,
.
display_set
=
"SDSP"
,
.
display_get
=
"
\\
_SB.PCI0.P0P1.VGA.GETD"
},
.
display_get
=
"
\\
SSTE"
},
{
{
.
name
=
"M6R"
,
.
name
=
"M6R"
,
.
mt_mled
=
"MLED"
,
.
mt_mled
=
"MLED"
,
...
@@ -312,7 +321,7 @@ static struct model_data model_conf[END_MODEL] = {
...
@@ -312,7 +321,7 @@ static struct model_data model_conf[END_MODEL] = {
.
brightness_set
=
"SPLV"
,
.
brightness_set
=
"SPLV"
,
.
brightness_get
=
"GPLV"
,
.
brightness_get
=
"GPLV"
,
.
display_set
=
"SDSP"
,
.
display_set
=
"SDSP"
,
.
display_get
=
"
\\
SSTE
"
},
.
display_get
=
"
\\
_SB.PCI0.P0P1.VGA.GETD
"
},
{
{
.
name
=
"P30"
,
.
name
=
"P30"
,
...
@@ -344,6 +353,28 @@ static struct model_data model_conf[END_MODEL] = {
...
@@ -344,6 +353,28 @@ static struct model_data model_conf[END_MODEL] = {
.
brightness_up
=
S2x_PREFIX
"_Q0B"
,
.
brightness_up
=
S2x_PREFIX
"_Q0B"
,
.
brightness_down
=
S2x_PREFIX
"_Q0A"
},
.
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
=
"W5A"
,
.
mt_bt_switch
=
"BLED"
,
.
mt_wled
=
"WLED"
,
.
mt_lcd_switch
=
xxN_PREFIX
"_Q10"
,
.
brightness_set
=
"SPLV"
,
.
brightness_get
=
"GPLV"
,
.
display_set
=
"SDSP"
,
.
display_get
=
"
\\
ADVG"
},
{
{
.
name
=
"xxN"
,
.
name
=
"xxN"
,
.
mt_mled
=
"MLED"
,
.
mt_mled
=
"MLED"
,
...
@@ -562,6 +593,36 @@ proc_write_mled(struct file *file, const char __user * buffer,
...
@@ -562,6 +593,36 @@ proc_write_mled(struct file *file, const char __user * buffer,
return
write_led
(
buffer
,
count
,
hotk
->
methods
->
mt_mled
,
MLED_ON
,
1
);
return
write_led
(
buffer
,
count
,
hotk
->
methods
->
mt_mled
,
MLED_ON
,
1
);
}
}
/*
* 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
* Proc handlers for WLED
*/
*/
...
@@ -580,6 +641,25 @@ proc_write_wled(struct file *file, const char __user * buffer,
...
@@ -580,6 +641,25 @@ proc_write_wled(struct file *file, const char __user * buffer,
return
write_led
(
buffer
,
count
,
hotk
->
methods
->
mt_wled
,
WLED_ON
,
0
);
return
write_led
(
buffer
,
count
,
hotk
->
methods
->
mt_wled
,
WLED_ON
,
0
);
}
}
/*
* Proc handlers for Bluetooth
*/
static
int
proc_read_bluetooth
(
char
*
page
,
char
**
start
,
off_t
off
,
int
count
,
int
*
eof
,
void
*
data
)
{
return
sprintf
(
page
,
"%d
\n
"
,
read_led
(
hotk
->
methods
->
bt_status
,
BT_ON
));
}
static
int
proc_write_bluetooth
(
struct
file
*
file
,
const
char
__user
*
buffer
,
unsigned
long
count
,
void
*
data
)
{
/* Note: mt_bt_switch controls both internal Bluetooth adapter's
presence and its LED */
return
write_led
(
buffer
,
count
,
hotk
->
methods
->
mt_bt_switch
,
BT_ON
,
0
);
}
/*
/*
* Proc handlers for TLED
* Proc handlers for TLED
*/
*/
...
@@ -876,6 +956,11 @@ static int asus_hotk_add_fs(struct acpi_device *device)
...
@@ -876,6 +956,11 @@ static int asus_hotk_add_fs(struct acpi_device *device)
mode
,
device
);
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
)
{
if
(
hotk
->
methods
->
mt_mled
)
{
asus_proc_add
(
PROC_MLED
,
&
proc_write_mled
,
&
proc_read_mled
,
asus_proc_add
(
PROC_MLED
,
&
proc_write_mled
,
&
proc_read_mled
,
mode
,
device
);
mode
,
device
);
...
@@ -886,6 +971,11 @@ static int asus_hotk_add_fs(struct acpi_device *device)
...
@@ -886,6 +971,11 @@ static int asus_hotk_add_fs(struct acpi_device *device)
mode
,
device
);
mode
,
device
);
}
}
if
(
hotk
->
methods
->
mt_bt_switch
)
{
asus_proc_add
(
PROC_BT
,
&
proc_write_bluetooth
,
&
proc_read_bluetooth
,
mode
,
device
);
}
/*
/*
* We need both read node and write method as LCD switch is also accessible
* We need both read node and write method as LCD switch is also accessible
* from keyboard
* from keyboard
...
@@ -919,6 +1009,10 @@ static int asus_hotk_remove_fs(struct acpi_device *device)
...
@@ -919,6 +1009,10 @@ static int asus_hotk_remove_fs(struct acpi_device *device)
remove_proc_entry
(
PROC_MLED
,
acpi_device_dir
(
device
));
remove_proc_entry
(
PROC_MLED
,
acpi_device_dir
(
device
));
if
(
hotk
->
methods
->
mt_tled
)
if
(
hotk
->
methods
->
mt_tled
)
remove_proc_entry
(
PROC_TLED
,
acpi_device_dir
(
device
));
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
)
if
(
hotk
->
methods
->
mt_lcd_switch
&&
hotk
->
methods
->
lcd_status
)
remove_proc_entry
(
PROC_LCD
,
acpi_device_dir
(
device
));
remove_proc_entry
(
PROC_LCD
,
acpi_device_dir
(
device
));
if
((
hotk
->
methods
->
brightness_up
if
((
hotk
->
methods
->
brightness_up
...
@@ -950,6 +1044,65 @@ static void asus_hotk_notify(acpi_handle handle, u32 event, void *data)
...
@@ -950,6 +1044,65 @@ static void asus_hotk_notify(acpi_handle handle, u32 event, void *data)
return
;
return
;
}
}
/*
* 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
* 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
* method, we can make all the detection we want, and modify the hotk struct
...
@@ -960,6 +1113,7 @@ static int asus_hotk_get_info(void)
...
@@ -960,6 +1113,7 @@ static int asus_hotk_get_info(void)
struct
acpi_buffer
dsdt
=
{
ACPI_ALLOCATE_BUFFER
,
NULL
};
struct
acpi_buffer
dsdt
=
{
ACPI_ALLOCATE_BUFFER
,
NULL
};
union
acpi_object
*
model
=
NULL
;
union
acpi_object
*
model
=
NULL
;
int
bsts_result
;
int
bsts_result
;
char
*
string
=
NULL
;
acpi_status
status
;
acpi_status
status
;
/*
/*
...
@@ -989,107 +1143,66 @@ static int asus_hotk_get_info(void)
...
@@ -989,107 +1143,66 @@ static int asus_hotk_get_info(void)
printk
(
KERN_NOTICE
" BSTS called, 0x%02x returned
\n
"
,
printk
(
KERN_NOTICE
" BSTS called, 0x%02x returned
\n
"
,
bsts_result
);
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
* Try to match the object returned by INIT to the specific model.
* return anything. It used to be possible to catch this exception,
* Handle every possible object (or the lack of thereof) the DSDT
* but the implicit return code will now happily confuse the
* writers might throw at us. When in trouble, we pass NULL to
* driver. We assume that every ACPI_TYPE_STRING is a valid model
* asus_model_match() and try something completely different.
* identifier but it's still possible to get completely bogus data.
*/
*/
if
(
model
->
type
==
ACPI_TYPE_STRING
)
{
if
(
buffer
.
pointer
)
{
printk
(
KERN_NOTICE
" %s model detected, "
,
model
->
string
.
pointer
);
model
=
(
union
acpi_object
*
)
buffer
.
pointer
;
}
else
{
switch
(
model
->
type
)
{
if
(
asus_info
&&
/* Samsung P30 */
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
)
{
strncmp
(
asus_info
->
oem_table_id
,
"ODEM"
,
4
)
==
0
)
{
hotk
->
model
=
P30
;
hotk
->
model
=
P30
;
printk
(
KERN_NOTICE
printk
(
KERN_NOTICE
" Samsung P30 detected, supported
\n
"
);
" Samsung P30 detected, supported
\n
"
);
}
else
{
}
else
{
hotk
->
model
=
M2E
;
hotk
->
model
=
M2E
;
printk
(
KERN_WARNING
" no string returned by INIT
\n
"
);
printk
(
KERN_NOTICE
" unsupported model %s, trying "
printk
(
KERN_WARNING
" trying default values, supply "
"default values
\n
"
,
string
);
"the developers with your DSDT
\n
"
);
printk
(
KERN_NOTICE
" send /proc/acpi/dsdt to the developers
\n
"
);
}
}
hotk
->
methods
=
&
model_conf
[
hotk
->
model
];
hotk
->
methods
=
&
model_conf
[
hotk
->
model
];
kfree
(
model
);
return
AE_OK
;
return
AE_OK
;
}
}
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
)
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
)
hotk
->
model
=
M6N
;
else
if
(
strncmp
(
model
->
string
.
pointer
,
"M6R"
,
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
||
strncmp
(
model
->
string
.
pointer
,
"W1N"
,
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
;
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
];
hotk
->
methods
=
&
model_conf
[
hotk
->
model
];
printk
(
KERN_NOTICE
" %s model detected, supported
\n
"
,
string
);
/* Sort of per-model blacklist */
/* Sort of per-model blacklist */
if
(
strncmp
(
model
->
string
.
pointer
,
"L2B"
,
3
)
==
0
)
if
(
strncmp
(
string
,
"L2B"
,
3
)
==
0
)
hotk
->
methods
->
lcd_status
=
NULL
;
hotk
->
methods
->
lcd_status
=
NULL
;
/* L2B is similar enough to L3C to use its settings, with this only
/* L2B is similar enough to L3C to use its settings, with this only
exception */
exception */
else
if
(
strncmp
(
model
->
string
.
pointer
,
"S5N"
,
3
)
==
0
||
else
if
(
strncmp
(
string
,
"A3G"
,
3
)
==
0
)
strncmp
(
model
->
string
.
pointer
,
"M5N"
,
3
)
==
0
)
hotk
->
methods
->
lcd_status
=
"
\\
BLFG"
;
/* A3G is like M6R */
else
if
(
strncmp
(
string
,
"S5N"
,
3
)
==
0
||
strncmp
(
string
,
"M5N"
,
3
)
==
0
||
strncmp
(
string
,
"W3N"
,
3
)
==
0
)
hotk
->
methods
->
mt_mled
=
NULL
;
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
||
else
if
(
strncmp
(
string
,
"L5D"
,
3
)
==
0
)
strncmp
(
model
->
string
.
pointer
,
"W1N"
,
3
)
==
0
)
hotk
->
methods
->
mt_wled
=
NULL
;
/* L5D's WLED is not controlled by ACPI */
else
if
(
strncmp
(
string
,
"M2N"
,
3
)
==
0
||
strncmp
(
string
,
"S1N"
,
3
)
==
0
)
hotk
->
methods
->
mt_wled
=
"WLED"
;
hotk
->
methods
->
mt_wled
=
"WLED"
;
/* M2N and
W
1N have a usable WLED */
/* M2N and
S
1N have a usable WLED */
else
if
(
asus_info
)
{
else
if
(
asus_info
)
{
if
(
strncmp
(
asus_info
->
oem_table_id
,
"L1"
,
2
)
==
0
)
if
(
strncmp
(
asus_info
->
oem_table_id
,
"L1"
,
2
)
==
0
)
hotk
->
methods
->
mled_status
=
NULL
;
hotk
->
methods
->
mled_status
=
NULL
;
...
@@ -1164,8 +1277,7 @@ static int asus_hotk_add(struct acpi_device *device)
...
@@ -1164,8 +1277,7 @@ static int asus_hotk_add(struct acpi_device *device)
/* For laptops without GPLV: init the hotk->brightness value */
/* For laptops without GPLV: init the hotk->brightness value */
if
((
!
hotk
->
methods
->
brightness_get
)
if
((
!
hotk
->
methods
->
brightness_get
)
&&
(
!
hotk
->
methods
->
brightness_status
)
&&
(
!
hotk
->
methods
->
brightness_status
)
&&
(
hotk
->
methods
->
brightness_up
&&
(
hotk
->
methods
->
brightness_up
&&
hotk
->
methods
->
brightness_down
))
{
&&
hotk
->
methods
->
brightness_down
))
{
status
=
status
=
acpi_evaluate_object
(
NULL
,
hotk
->
methods
->
brightness_down
,
acpi_evaluate_object
(
NULL
,
hotk
->
methods
->
brightness_down
,
NULL
,
NULL
);
NULL
,
NULL
);
...
@@ -1184,6 +1296,9 @@ static int asus_hotk_add(struct acpi_device *device)
...
@@ -1184,6 +1296,9 @@ static int asus_hotk_add(struct acpi_device *device)
asus_hotk_found
=
1
;
asus_hotk_found
=
1
;
/* LED display is off by default */
hotk
->
ledd_status
=
0xFFF
;
end:
end:
if
(
result
)
{
if
(
result
)
{
kfree
(
hotk
);
kfree
(
hotk
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment