Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
2285bc3d
cloud-kernel
项目概览
openanolis
/
cloud-kernel
大约 1 年 前同步成功
通知
158
Star
36
Fork
7
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
10
列表
看板
标记
里程碑
合并请求
2
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
cloud-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
10
Issue
10
列表
看板
标记
里程碑
合并请求
2
合并请求
2
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
2285bc3d
编写于
10月 22, 2008
作者:
L
Len Brown
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'asus-cleanup' into test
上级
bcb631f3
c6c38bac
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
110 addition
and
111 deletion
+110
-111
drivers/acpi/asus_acpi.c
drivers/acpi/asus_acpi.c
+110
-111
未找到文件。
drivers/acpi/asus_acpi.c
浏览文件 @
2285bc3d
...
...
@@ -42,7 +42,7 @@
#define ASUS_ACPI_VERSION "0.30"
#define PROC_ASUS "asus" /
/the directory
#define PROC_ASUS "asus"
/
* The directory */
#define PROC_MLED "mled"
#define PROC_WLED "wled"
#define PROC_TLED "tled"
...
...
@@ -66,10 +66,10 @@
/*
* Flags for hotk status
*/
#define MLED_ON 0x01 /
/mail LED
#define WLED_ON 0x02 /
/wireless LED
#define TLED_ON 0x04 /
/touchpad LED
#define BT_ON 0x08 /
/internal Bluetooth
#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
);
...
...
@@ -82,28 +82,28 @@ MODULE_PARM_DESC(asus_uid, "UID for entries in /proc/acpi/asus");
module_param
(
asus_gid
,
uint
,
0
);
MODULE_PARM_DESC
(
asus_gid
,
"GID for entries in /proc/acpi/asus"
);
/* For each model, all features implemented,
/* For each model, all features implemented,
* those marked with R are relative to HOTK, A for absolute */
struct
model_data
{
char
*
name
;
/
/name of the laptop________________A
char
*
mt_mled
;
/
/method to handle mled_____________R
char
*
mled_status
;
/
/node to handle mled reading_______A
char
*
mt_wled
;
/
/method to handle wled_____________R
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_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
char
*
brightness_set
;
/
/method to set absolute brightness_R
char
*
brightness_get
;
/
/method to get absolute brightness_R
char
*
brightness_status
;
//node to get brightness____________A
char
*
display_set
;
/
/method to set video output________R
char
*
display_get
;
/
/method to get video output________R
char
*
name
;
/
* name of the laptop________________A */
char
*
mt_mled
;
/
* method to handle mled_____________R */
char
*
mled_status
;
/
* node to handle mled reading_______A */
char
*
mt_wled
;
/
* method to handle wled_____________R */
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_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
;
/
* method to set brightness down ____A */
char
*
brightness_set
;
/
* method to set absolute brightness_R */
char
*
brightness_get
;
/
* method to get absolute brightness_R */
char
*
brightness_status
;
/* node to get brightness____________A */
char
*
display_set
;
/
* method to set video output________R */
char
*
display_get
;
/
* method to get video output________R */
};
/*
...
...
@@ -111,41 +111,41 @@ struct model_data {
* about the hotk device
*/
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
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
{
A1x
=
0
,
/
/A1340D, A1300F
A2x
,
/
/A2500H
A4G
,
/
/A4700G
D1x
,
/
/D1
L2D
,
/
/L2000D
L3C
,
/
/L3800C
L3D
,
/
/L3400D
L3H
,
/
/L3H, L2000E, L5D
L4R
,
/
/L4500R
L5x
,
/
/L5800C
L8L
,
/
/L8400L
M1A
,
/
/M1300A
M2E
,
/
/M2400E, L4400L
M6N
,
/
/M6800N, W3400N
M6R
,
/
/M6700R, A3000G
P30
,
/
/Samsung P30
S1x
,
/
/S1300A, but also L1400B and M2400A (L84F)
S2x
,
/
/S200 (J1 reported), Victor MP-XP7210
W1N
,
/
/W1000N
W5A
,
/
/W5A
W3V
,
/
/W3030V
xxN
,
/
/M2400N, M3700N, M5200N, M6800N, S1300N, S5200N
A4S
,
//Z81sp
//(Centrino)
F3Sa
,
A1x
=
0
,
/
* A1340D, A1300F */
A2x
,
/
* A2500H */
A4G
,
/
* A4700G */
D1x
,
/
* D1 */
L2D
,
/
* L2000D */
L3C
,
/
* L3800C */
L3D
,
/
* L3400D */
L3H
,
/
* L3H, L2000E, L5D */
L4R
,
/
* L4500R */
L5x
,
/
* L5800C */
L8L
,
/
* L8400L */
M1A
,
/
* M1300A */
M2E
,
/
* M2400E, L4400L */
M6N
,
/
* M6800N, W3400N */
M6R
,
/
* M6700R, A3000G */
P30
,
/
* Samsung P30 */
S1x
,
/
* S1300A, but also L1400B and M2400A (L84F) */
S2x
,
/
* S200 (J1 reported), Victor MP-XP7210 */
W1N
,
/
* W1000N */
W5A
,
/
* W5A */
W3V
,
/
* W3030V */
xxN
,
/
* M2400N, M3700N, M5200N, M6800N,
S1300N, S5200N*/
A4S
,
/* Z81sp */
F3Sa
,
/* (Centrino) */
END_MODEL
}
model
;
/
/Models currently supported
u16
event_count
[
128
];
/
/count for each event TODO make this better
}
model
;
/
* Models currently supported */
u16
event_count
[
128
];
/
* Count for each event TODO make this better */
};
/* Here we go */
...
...
@@ -459,18 +459,18 @@ static struct acpi_driver asus_hotk_driver = {
},
};
/*
/*
* This function evaluates an ACPI method, given an int as parameter, the
* method is searched within the scope of the handle, can be NULL. The output
* of the method is written is output, which can also be NULL
*
* returns 1 if write is successful, 0 else.
* returns 1 if write is successful, 0 else.
*/
static
int
write_acpi_int
(
acpi_handle
handle
,
const
char
*
method
,
int
val
,
struct
acpi_buffer
*
output
)
{
struct
acpi_object_list
params
;
/
/list of input parameters (an int here)
union
acpi_object
in_obj
;
/
/the only param we use
struct
acpi_object_list
params
;
/
* list of input parameters (int) */
union
acpi_object
in_obj
;
/
* the only param we use */
acpi_status
status
;
params
.
count
=
1
;
...
...
@@ -507,18 +507,18 @@ proc_read_info(char *page, char **start, off_t off, int count, int *eof,
{
int
len
=
0
;
int
temp
;
char
buf
[
16
];
/
/enough for all info
char
buf
[
16
];
/
* enough for all info */
/*
* We use the easy way, we don't care of off and count,
so we don't set eof
* to 1
* We use the easy way, we don't care of off and count,
*
so we don't set eof
to 1
*/
len
+=
sprintf
(
page
,
ACPI_HOTK_NAME
" "
ASUS_ACPI_VERSION
"
\n
"
);
len
+=
sprintf
(
page
+
len
,
"Model reference : %s
\n
"
,
hotk
->
methods
->
name
);
/*
* The SFUN method probably allows the original driver to get the list
* of features supported by a given model. For now, 0x0100 or 0x0800
/*
* The SFUN method probably allows the original driver to get the list
* of features supported by a given model. For now, 0x0100 or 0x0800
* bit signifies that the laptop is equipped with a Wi-Fi MiniPCI card.
* The significance of others is yet to be found.
*/
...
...
@@ -528,7 +528,7 @@ proc_read_info(char *page, char **start, off_t off, int count, int *eof,
/*
* Another value for userspace: the ASYM method returns 0x02 for
* battery low and 0x04 for battery critical, its readings tend to be
* more accurate than those provided by _BST.
* more accurate than those provided by _BST.
* Note: since not all the laptops provide this method, errors are
* silently ignored.
*/
...
...
@@ -579,7 +579,7 @@ static int read_led(const char *ledname, int ledmask)
return
(
hotk
->
status
&
ledmask
)
?
1
:
0
;
}
static
int
parse_arg
(
const
char
__user
*
buf
,
unsigned
long
count
,
int
*
val
)
static
int
parse_arg
(
const
char
__user
*
buf
,
unsigned
long
count
,
int
*
val
)
{
char
s
[
32
];
if
(
!
count
)
...
...
@@ -596,7 +596,7 @@ static int parse_arg(const char __user * buf, unsigned long count, int *val)
/* FIXME: kill extraneous args so it can be called independently */
static
int
write_led
(
const
char
__user
*
buffer
,
unsigned
long
count
,
write_led
(
const
char
__user
*
buffer
,
unsigned
long
count
,
char
*
ledname
,
int
ledmask
,
int
invert
)
{
int
rv
,
value
;
...
...
@@ -631,7 +631,7 @@ proc_read_mled(char *page, char **start, off_t off, int count, int *eof,
}
static
int
proc_write_mled
(
struct
file
*
file
,
const
char
__user
*
buffer
,
proc_write_mled
(
struct
file
*
file
,
const
char
__user
*
buffer
,
unsigned
long
count
,
void
*
data
)
{
return
write_led
(
buffer
,
count
,
hotk
->
methods
->
mt_mled
,
MLED_ON
,
1
);
...
...
@@ -648,7 +648,7 @@ proc_read_ledd(char *page, char **start, off_t off, int count, int *eof,
}
static
int
proc_write_ledd
(
struct
file
*
file
,
const
char
__user
*
buffer
,
proc_write_ledd
(
struct
file
*
file
,
const
char
__user
*
buffer
,
unsigned
long
count
,
void
*
data
)
{
int
rv
,
value
;
...
...
@@ -677,7 +677,7 @@ proc_read_wled(char *page, char **start, off_t off, int count, int *eof,
}
static
int
proc_write_wled
(
struct
file
*
file
,
const
char
__user
*
buffer
,
proc_write_wled
(
struct
file
*
file
,
const
char
__user
*
buffer
,
unsigned
long
count
,
void
*
data
)
{
return
write_led
(
buffer
,
count
,
hotk
->
methods
->
mt_wled
,
WLED_ON
,
0
);
...
...
@@ -694,10 +694,10 @@ proc_read_bluetooth(char *page, char **start, off_t off, int count, int *eof,
}
static
int
proc_write_bluetooth
(
struct
file
*
file
,
const
char
__user
*
buffer
,
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
/* 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
);
}
...
...
@@ -714,7 +714,7 @@ proc_read_tled(char *page, char **start, off_t off, int count, int *eof,
}
static
int
proc_write_tled
(
struct
file
*
file
,
const
char
__user
*
buffer
,
proc_write_tled
(
struct
file
*
file
,
const
char
__user
*
buffer
,
unsigned
long
count
,
void
*
data
)
{
return
write_led
(
buffer
,
count
,
hotk
->
methods
->
mt_tled
,
TLED_ON
,
0
);
...
...
@@ -734,7 +734,7 @@ static int get_lcd_state(void)
input
.
count
=
2
;
input
.
pointer
=
mt_params
;
/* Note: the following values are partly guessed up, but
/* Note: the following values are partly guessed up, but
otherwise they seem to work */
mt_params
[
0
].
type
=
ACPI_TYPE_INTEGER
;
mt_params
[
0
].
integer
.
value
=
0x02
;
...
...
@@ -796,12 +796,13 @@ static int set_lcd_state(int value)
acpi_evaluate_object
(
NULL
,
hotk
->
methods
->
mt_lcd_switch
,
NULL
,
NULL
);
}
else
{
/* L3H and the like have to be handled differently */
}
else
{
/* L3H and the like must be handled differently */
if
(
!
write_acpi_int
(
hotk
->
handle
,
hotk
->
methods
->
mt_lcd_switch
,
0x07
,
NULL
))
status
=
AE_ERROR
;
/* L3H's AML executes EHK (0x07) upon Fn+F7 keypress,
/* L3H's AML executes EHK (0x07) upon Fn+F7 keypress,
the exact behaviour is simulated here */
}
if
(
ACPI_FAILURE
(
status
))
...
...
@@ -819,7 +820,7 @@ proc_read_lcd(char *page, char **start, off_t off, int count, int *eof,
}
static
int
proc_write_lcd
(
struct
file
*
file
,
const
char
__user
*
buffer
,
proc_write_lcd
(
struct
file
*
file
,
const
char
__user
*
buffer
,
unsigned
long
count
,
void
*
data
)
{
int
rv
,
value
;
...
...
@@ -897,7 +898,7 @@ proc_read_brn(char *page, char **start, off_t off, int count, int *eof,
}
static
int
proc_write_brn
(
struct
file
*
file
,
const
char
__user
*
buffer
,
proc_write_brn
(
struct
file
*
file
,
const
char
__user
*
buffer
,
unsigned
long
count
,
void
*
data
)
{
int
rv
,
value
;
...
...
@@ -921,7 +922,7 @@ static void set_display(int value)
}
/*
* Now, *this* one could be more user-friendly, but so far, no-one has
* Now, *this* one could be more user-friendly, but so far, no-one has
* complained. The significance of bits is the same as in proc_write_disp()
*/
static
int
...
...
@@ -933,18 +934,18 @@ proc_read_disp(char *page, char **start, off_t off, int count, int *eof,
if
(
!
read_acpi_int
(
hotk
->
handle
,
hotk
->
methods
->
display_get
,
&
value
))
printk
(
KERN_WARNING
"Asus ACPI: Error reading display status
\n
"
);
value
&=
0x07
;
/* needed for some models, shouldn't hurt others */
value
&=
0x07
;
/* needed for some models, shouldn't hurt others */
return
sprintf
(
page
,
"%d
\n
"
,
value
);
}
/*
* Experimental support for display switching. As of now: 1 should activate
* the LCD output, 2 should do for CRT, and 4 for TV-Out. Any combination
* (bitwise) of these will suffice. I never actually tested 3 displays hooked
up
* simultaneously, so be warned. See the acpi4asus README for more info.
* Experimental support for display switching. As of now: 1 should activate
* the LCD output, 2 should do for CRT, and 4 for TV-Out. Any combination
* (bitwise) of these will suffice. I never actually tested 3 displays hooked
*
up
simultaneously, so be warned. See the acpi4asus README for more info.
*/
static
int
proc_write_disp
(
struct
file
*
file
,
const
char
__user
*
buffer
,
proc_write_disp
(
struct
file
*
file
,
const
char
__user
*
buffer
,
unsigned
long
count
,
void
*
data
)
{
int
rv
,
value
;
...
...
@@ -957,12 +958,12 @@ proc_write_disp(struct file *file, const char __user * buffer,
typedef
int
(
proc_readfunc
)
(
char
*
page
,
char
**
start
,
off_t
off
,
int
count
,
int
*
eof
,
void
*
data
);
typedef
int
(
proc_writefunc
)
(
struct
file
*
file
,
const
char
__user
*
buffer
,
typedef
int
(
proc_writefunc
)
(
struct
file
*
file
,
const
char
__user
*
buffer
,
unsigned
long
count
,
void
*
data
);
static
int
asus_proc_add
(
char
*
name
,
proc_writefunc
*
writefunc
,
proc_readfunc
*
readfunc
,
mode_t
mode
,
asus_proc_add
(
char
*
name
,
proc_writefunc
*
writefunc
,
proc_readfunc
*
readfunc
,
mode_t
mode
,
struct
acpi_device
*
device
)
{
struct
proc_dir_entry
*
proc
=
...
...
@@ -1040,9 +1041,9 @@ static int asus_hotk_add_fs(struct acpi_device *device)
&
proc_read_bluetooth
,
mode
,
device
);
}
/*
* We need both read node and write method as LCD switch is also
accessible
*
from keyboard
/*
* We need both read node and write method as LCD switch is also
*
accessible from the keyboard
*/
if
(
hotk
->
methods
->
mt_lcd_switch
&&
hotk
->
methods
->
lcd_status
)
{
asus_proc_add
(
PROC_LCD
,
&
proc_write_lcd
,
&
proc_read_lcd
,
mode
,
...
...
@@ -1096,11 +1097,10 @@ static void asus_hotk_notify(acpi_handle handle, u32 event, void *data)
if
(
!
hotk
)
return
;
if
((
event
&
~
((
u32
)
BR_UP
))
<
16
)
{
if
((
event
&
~
((
u32
)
BR_UP
))
<
16
)
hotk
->
brightness
=
(
event
&
~
((
u32
)
BR_UP
));
}
else
if
((
event
&
~
((
u32
)
BR_DOWN
))
<
16
)
{
else
if
((
event
&
~
((
u32
)
BR_DOWN
))
<
16
)
hotk
->
brightness
=
(
event
&
~
((
u32
)
BR_DOWN
));
}
acpi_bus_generate_proc_event
(
hotk
->
device
,
event
,
hotk
->
event_count
[
event
%
128
]
++
);
...
...
@@ -1186,8 +1186,8 @@ static int asus_hotk_get_info(void)
acpi_status
status
;
/*
* Get DSDT headers early enough to allow for differentiating between
* models, but late enough to allow acpi_bus_register_driver() to fail
* Get DSDT headers early enough to allow for differentiating between
* models, but late enough to allow acpi_bus_register_driver() to fail
* before doing anything ACPI-specific. Should we encounter a machine,
* which needs special handling (i.e. its hotkey device has a different
* HID), this bit will be moved. A global variable asus_info contains
...
...
@@ -1212,8 +1212,8 @@ static int asus_hotk_get_info(void)
/*
* 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
* 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
(
buffer
.
pointer
)
{
...
...
@@ -1254,7 +1254,7 @@ static int asus_hotk_get_info(void)
/* Sort of per-model blacklist */
if
(
strncmp
(
string
,
"L2B"
,
3
)
==
0
)
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 */
else
if
(
strncmp
(
string
,
"A3G"
,
3
)
==
0
)
hotk
->
methods
->
lcd_status
=
"
\\
BLFG"
;
...
...
@@ -1366,10 +1366,9 @@ static int asus_hotk_add(struct acpi_device *device)
/* LED display is off by default */
hotk
->
ledd_status
=
0xFFF
;
end:
if
(
result
)
{
end:
if
(
result
)
kfree
(
hotk
);
}
return
result
;
}
...
...
@@ -1394,8 +1393,8 @@ static int asus_hotk_remove(struct acpi_device *device, int type)
}
static
struct
backlight_ops
asus_backlight_data
=
{
.
get_brightness
=
read_brightness
,
.
update_status
=
set_brightness_status
,
.
get_brightness
=
read_brightness
,
.
update_status
=
set_brightness_status
,
};
static
void
asus_acpi_exit
(
void
)
...
...
@@ -1442,15 +1441,15 @@ static int __init asus_acpi_init(void)
return
-
ENODEV
;
}
asus_backlight_device
=
backlight_device_register
(
"asus"
,
NULL
,
NULL
,
asus_backlight_device
=
backlight_device_register
(
"asus"
,
NULL
,
NULL
,
&
asus_backlight_data
);
if
(
IS_ERR
(
asus_backlight_device
))
{
if
(
IS_ERR
(
asus_backlight_device
))
{
printk
(
KERN_ERR
"Could not register asus backlight device
\n
"
);
asus_backlight_device
=
NULL
;
asus_acpi_exit
();
return
-
ENODEV
;
}
asus_backlight_device
->
props
.
max_brightness
=
15
;
asus_backlight_device
->
props
.
max_brightness
=
15
;
return
0
;
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录