Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
e5689329
Commit
e5689329
authored
Oct 08, 2004
by
Len Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge intel.com:/home/lenb/src/26-stable-dev
into intel.com:/home/lenb/src/26-latest-dev
parents
3d20b932
ae7cb441
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
62 additions
and
63 deletions
+62
-63
drivers/acpi/asus_acpi.c
drivers/acpi/asus_acpi.c
+62
-63
No files found.
drivers/acpi/asus_acpi.c
View file @
e5689329
...
...
@@ -42,7 +42,7 @@
#include <acpi/acpi_bus.h>
#include <asm/uaccess.h>
#define ASUS_ACPI_VERSION "0.2
8
"
#define ASUS_ACPI_VERSION "0.2
9
"
#define PROC_ASUS "asus" //the directory
#define PROC_MLED "mled"
...
...
@@ -129,10 +129,12 @@ struct asus_hotk {
M1A
,
//M1300A
M2E
,
//M2400E, L4400L
M6N
,
//M6800N
M6R
,
//M6700R
P30
,
//Samsung P30
S1x
,
//S1300A, but also L1400B and M2400A (L84F)
S2x
,
//S200 (J1 reported), Victor MP-XP7210
xxN
,
//M2400N, M3700N, M5200N, S1300N, S5200N (Centrino)
xxN
,
//M2400N, M3700N, M5200N, S1300N, S5200N, W1OOON
//(Centrino)
END_MODEL
}
model
;
//Models currently supported
u16
event_count
[
128
];
//count for each event TODO make this better
...
...
@@ -315,6 +317,18 @@ static struct model_data model_conf[END_MODEL] = {
.
display_set
=
"SDSP"
,
.
display_get
=
"
\\
SSTE"
},
{
.
name
=
"M6R"
,
.
mt_mled
=
"MLED"
,
.
mt_wled
=
"WLED"
,
.
mt_lcd_switch
=
xxN_PREFIX
"_Q10"
,
.
lcd_status
=
"
\\
_SB.PCI0.SBSM.SEO4"
,
.
brightness_set
=
"SPLV"
,
.
brightness_get
=
"GPLV"
,
.
display_set
=
"SDSP"
,
.
display_get
=
"
\\
SSTE"
},
{
.
name
=
"P30"
,
...
...
@@ -372,6 +386,9 @@ static struct proc_dir_entry *asus_proc_dir;
*/
static
struct
acpi_table_header
*
asus_info
;
/* The actual device the driver binds to */
static
struct
asus_hotk
*
hotk
;
/*
* The hotkey driver declaration
*/
...
...
@@ -436,7 +453,6 @@ proc_read_info(char *page, char **start, off_t off, int count, int *eof,
{
int
len
=
0
;
int
temp
;
struct
asus_hotk
*
hotk
=
(
struct
asus_hotk
*
)
data
;
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
...
...
@@ -495,7 +511,7 @@ proc_read_info(char *page, char **start, off_t off, int count, int *eof,
/* Generic LED functions */
static
int
read_led
(
struct
asus_hotk
*
hotk
,
const
char
*
ledname
,
int
ledmask
)
read_led
(
const
char
*
ledname
,
int
ledmask
)
{
if
(
ledname
)
{
int
led_status
;
...
...
@@ -526,7 +542,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
,
struct
asus_hotk
*
hotk
,
write_led
(
const
char
__user
*
buffer
,
unsigned
long
count
,
char
*
ledname
,
int
ledmask
,
int
invert
)
{
int
value
;
...
...
@@ -556,8 +572,7 @@ static int
proc_read_mled
(
char
*
page
,
char
**
start
,
off_t
off
,
int
count
,
int
*
eof
,
void
*
data
)
{
struct
asus_hotk
*
hotk
=
(
struct
asus_hotk
*
)
data
;
return
sprintf
(
page
,
"%d
\n
"
,
read_led
(
hotk
,
hotk
->
methods
->
mled_status
,
MLED_ON
));
return
sprintf
(
page
,
"%d
\n
"
,
read_led
(
hotk
->
methods
->
mled_status
,
MLED_ON
));
}
...
...
@@ -565,8 +580,7 @@ static int
proc_write_mled
(
struct
file
*
file
,
const
char
__user
*
buffer
,
unsigned
long
count
,
void
*
data
)
{
struct
asus_hotk
*
hotk
=
(
struct
asus_hotk
*
)
data
;
return
write_led
(
buffer
,
count
,
hotk
,
hotk
->
methods
->
mt_mled
,
MLED_ON
,
1
);
return
write_led
(
buffer
,
count
,
hotk
->
methods
->
mt_mled
,
MLED_ON
,
1
);
}
/*
...
...
@@ -576,16 +590,14 @@ static int
proc_read_wled
(
char
*
page
,
char
**
start
,
off_t
off
,
int
count
,
int
*
eof
,
void
*
data
)
{
struct
asus_hotk
*
hotk
=
(
struct
asus_hotk
*
)
data
;
return
sprintf
(
page
,
"%d
\n
"
,
read_led
(
hotk
,
hotk
->
methods
->
wled_status
,
WLED_ON
));
return
sprintf
(
page
,
"%d
\n
"
,
read_led
(
hotk
->
methods
->
wled_status
,
WLED_ON
));
}
static
int
proc_write_wled
(
struct
file
*
file
,
const
char
__user
*
buffer
,
unsigned
long
count
,
void
*
data
)
{
struct
asus_hotk
*
hotk
=
(
struct
asus_hotk
*
)
data
;
return
write_led
(
buffer
,
count
,
hotk
,
hotk
->
methods
->
mt_wled
,
WLED_ON
,
0
);
return
write_led
(
buffer
,
count
,
hotk
->
methods
->
mt_wled
,
WLED_ON
,
0
);
}
/*
...
...
@@ -595,20 +607,18 @@ static int
proc_read_tled
(
char
*
page
,
char
**
start
,
off_t
off
,
int
count
,
int
*
eof
,
void
*
data
)
{
struct
asus_hotk
*
hotk
=
(
struct
asus_hotk
*
)
data
;
return
sprintf
(
page
,
"%d
\n
"
,
read_led
(
hotk
,
hotk
->
methods
->
tled_status
,
TLED_ON
));
return
sprintf
(
page
,
"%d
\n
"
,
read_led
(
hotk
->
methods
->
tled_status
,
TLED_ON
));
}
static
int
proc_write_tled
(
struct
file
*
file
,
const
char
__user
*
buffer
,
unsigned
long
count
,
void
*
data
)
{
struct
asus_hotk
*
hotk
=
(
struct
asus_hotk
*
)
data
;
return
write_led
(
buffer
,
count
,
hotk
,
hotk
->
methods
->
mt_tled
,
TLED_ON
,
0
);
return
write_led
(
buffer
,
count
,
hotk
->
methods
->
mt_tled
,
TLED_ON
,
0
);
}
static
int
get_lcd_state
(
struct
asus_hotk
*
hotk
)
static
int
get_lcd_state
(
void
)
{
int
lcd
=
0
;
...
...
@@ -649,13 +659,13 @@ static int get_lcd_state(struct asus_hotk *hotk)
return
(
lcd
&
1
);
}
static
int
set_lcd_state
(
struct
asus_hotk
*
hotk
,
int
value
)
static
int
set_lcd_state
(
int
value
)
{
int
lcd
=
0
;
acpi_status
status
=
0
;
lcd
=
value
?
1
:
0
;
if
(
lcd
!=
get_lcd_state
(
hotk
))
{
if
(
lcd
!=
get_lcd_state
())
{
/* switch */
if
(
hotk
->
model
!=
L3H
)
{
status
=
...
...
@@ -678,7 +688,7 @@ static int
proc_read_lcd
(
char
*
page
,
char
**
start
,
off_t
off
,
int
count
,
int
*
eof
,
void
*
data
)
{
return
sprintf
(
page
,
"%d
\n
"
,
get_lcd_state
(
(
struct
asus_hotk
*
)
data
));
return
sprintf
(
page
,
"%d
\n
"
,
get_lcd_state
());
}
...
...
@@ -687,16 +697,15 @@ proc_write_lcd(struct file *file, const char __user *buffer,
unsigned
long
count
,
void
*
data
)
{
int
value
;
struct
asus_hotk
*
hotk
=
(
struct
asus_hotk
*
)
data
;
count
=
parse_arg
(
buffer
,
count
,
&
value
);
if
(
count
>
0
)
set_lcd_state
(
hotk
,
value
);
set_lcd_state
(
value
);
return
count
;
}
static
int
read_brightness
(
struct
asus_hotk
*
hotk
)
static
int
read_brightness
(
void
)
{
int
value
;
...
...
@@ -716,7 +725,7 @@ static int read_brightness(struct asus_hotk *hotk)
/*
* Change the brightness level
*/
static
void
set_brightness
(
int
value
,
struct
asus_hotk
*
hotk
)
static
void
set_brightness
(
int
value
)
{
acpi_status
status
=
0
;
...
...
@@ -729,7 +738,7 @@ static void set_brightness(int value, struct asus_hotk *hotk)
}
/* No SPLV method if we are here, act as appropriate */
value
-=
read_brightness
(
hotk
);
value
-=
read_brightness
();
while
(
value
!=
0
)
{
status
=
acpi_evaluate_object
(
NULL
,
(
value
>
0
)
?
hotk
->
methods
->
brightness_up
:
...
...
@@ -746,8 +755,7 @@ static int
proc_read_brn
(
char
*
page
,
char
**
start
,
off_t
off
,
int
count
,
int
*
eof
,
void
*
data
)
{
struct
asus_hotk
*
hotk
=
(
struct
asus_hotk
*
)
data
;
return
sprintf
(
page
,
"%d
\n
"
,
read_brightness
(
hotk
));
return
sprintf
(
page
,
"%d
\n
"
,
read_brightness
());
}
static
int
...
...
@@ -755,13 +763,12 @@ proc_write_brn(struct file *file, const char __user *buffer,
unsigned
long
count
,
void
*
data
)
{
int
value
;
struct
asus_hotk
*
hotk
=
(
struct
asus_hotk
*
)
data
;
count
=
parse_arg
(
buffer
,
count
,
&
value
);
if
(
count
>
0
)
{
value
=
(
0
<
value
)
?
((
15
<
value
)
?
15
:
value
)
:
0
;
/* 0 <= value <= 15 */
set_brightness
(
value
,
hotk
);
set_brightness
(
value
);
}
else
if
(
count
<
0
)
{
printk
(
KERN_WARNING
"Asus ACPI: Error reading user input
\n
"
);
}
...
...
@@ -769,7 +776,7 @@ proc_write_brn(struct file *file, const char __user *buffer,
return
count
;
}
static
void
set_display
(
int
value
,
struct
asus_hotk
*
hotk
)
static
void
set_display
(
int
value
)
{
/* no sanity check needed for now */
if
(
!
write_acpi_int
(
hotk
->
handle
,
hotk
->
methods
->
display_set
,
...
...
@@ -787,7 +794,6 @@ proc_read_disp(char *page, char **start, off_t off, int count, int *eof,
void
*
data
)
{
int
value
=
0
;
struct
asus_hotk
*
hotk
=
(
struct
asus_hotk
*
)
data
;
if
(
!
read_acpi_int
(
hotk
->
handle
,
hotk
->
methods
->
display_get
,
&
value
))
printk
(
KERN_WARNING
"Asus ACPI: Error reading display status
\n
"
);
...
...
@@ -806,11 +812,10 @@ proc_write_disp(struct file *file, const char __user *buffer,
unsigned
long
count
,
void
*
data
)
{
int
value
;
struct
asus_hotk
*
hotk
=
(
struct
asus_hotk
*
)
data
;
count
=
parse_arg
(
buffer
,
count
,
&
value
);
if
(
count
>
0
)
set_display
(
value
,
hotk
);
set_display
(
value
);
else
if
(
count
<
0
)
printk
(
KERN_WARNING
"Asus ACPI: Error reading user input
\n
"
);
...
...
@@ -845,7 +850,6 @@ __init asus_proc_add(char *name, proc_writefunc *writefunc,
static
int
__init
asus_hotk_add_fs
(
struct
acpi_device
*
device
)
{
struct
proc_dir_entry
*
proc
;
struct
asus_hotk
*
hotk
=
acpi_driver_data
(
device
);
mode_t
mode
;
/*
...
...
@@ -910,9 +914,6 @@ static int __init asus_hotk_add_fs(struct acpi_device *device)
static
int
asus_hotk_remove_fs
(
struct
acpi_device
*
device
)
{
struct
asus_hotk
*
hotk
=
acpi_driver_data
(
device
);
if
(
acpi_device_dir
(
device
))
{
remove_proc_entry
(
PROC_INFO
,
acpi_device_dir
(
device
));
if
(
hotk
->
methods
->
mt_wled
)
...
...
@@ -935,11 +936,7 @@ static int asus_hotk_remove_fs(struct acpi_device* device)
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
* the hotk, so we can do anything!
*/
struct
asus_hotk
*
hotk
=
(
struct
asus_hotk
*
)
data
;
/* TODO Find a better way to handle events count.*/
if
(
!
hotk
)
return
;
...
...
@@ -959,7 +956,7 @@ static void asus_hotk_notify(acpi_handle handle, u32 event, void *data)
* 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
*/
static
int
__init
asus_hotk_get_info
(
struct
asus_hotk
*
hotk
)
static
int
__init
asus_hotk_get_info
(
void
)
{
struct
acpi_buffer
buffer
=
{
ACPI_ALLOCATE_BUFFER
,
NULL
};
struct
acpi_buffer
dsdt
=
{
ACPI_ALLOCATE_BUFFER
,
NULL
};
...
...
@@ -1030,12 +1027,15 @@ static int __init asus_hotk_get_info(struct asus_hotk *hotk)
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
,
"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
;
...
...
@@ -1072,12 +1072,14 @@ static int __init asus_hotk_get_info(struct asus_hotk *hotk)
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
,
"S5N"
,
3
)
==
0
)
else
if
(
strncmp
(
model
->
string
.
pointer
,
"S5N"
,
3
)
==
0
||
strncmp
(
model
->
string
.
pointer
,
"M5N"
,
3
)
==
0
)
hotk
->
methods
->
mt_mled
=
NULL
;
/* S5N has no MLED */
else
if
(
strncmp
(
model
->
string
.
pointer
,
"M2N"
,
3
)
==
0
)
/* S5N and M5N have no MLED */
else
if
(
strncmp
(
model
->
string
.
pointer
,
"M2N"
,
3
)
==
0
||
strncmp
(
model
->
string
.
pointer
,
"W1N"
,
3
)
==
0
)
hotk
->
methods
->
mt_wled
=
"WLED"
;
/* M2N
has
a usable WLED */
/* M2N
and W1N have
a usable WLED */
else
if
(
asus_info
)
{
if
(
strncmp
(
asus_info
->
oem_table_id
,
"L1"
,
2
)
==
0
)
hotk
->
methods
->
mled_status
=
NULL
;
...
...
@@ -1090,19 +1092,16 @@ static int __init asus_hotk_get_info(struct asus_hotk *hotk)
}
static
int
__init
asus_hotk_check
(
struct
asus_hotk
*
hotk
)
static
int
__init
asus_hotk_check
(
void
)
{
int
result
=
0
;
if
(
!
hotk
)
return
(
-
EINVAL
);
result
=
acpi_bus_get_status
(
hotk
->
device
);
if
(
result
)
return
(
result
);
if
(
hotk
->
device
->
status
.
present
)
{
result
=
asus_hotk_get_info
(
hotk
);
result
=
asus_hotk_get_info
();
}
else
{
printk
(
KERN_ERR
" Hotkey device not present, aborting
\n
"
);
return
(
-
EINVAL
);
...
...
@@ -1114,7 +1113,6 @@ static int __init asus_hotk_check(struct asus_hotk *hotk)
static
int
__init
asus_hotk_add
(
struct
acpi_device
*
device
)
{
struct
asus_hotk
*
hotk
=
NULL
;
acpi_status
status
=
AE_OK
;
int
result
;
...
...
@@ -1137,7 +1135,7 @@ static int __init asus_hotk_add(struct acpi_device *device)
hotk
->
device
=
device
;
result
=
asus_hotk_check
(
hotk
);
result
=
asus_hotk_check
();
if
(
result
)
goto
end
;
...
...
@@ -1182,13 +1180,10 @@ static int __init asus_hotk_add(struct acpi_device *device)
static
int
asus_hotk_remove
(
struct
acpi_device
*
device
,
int
type
)
{
acpi_status
status
=
0
;
struct
asus_hotk
*
hotk
=
NULL
;
if
(
!
device
||
!
acpi_driver_data
(
device
))
return
(
-
EINVAL
);
hotk
=
(
struct
asus_hotk
*
)
acpi_driver_data
(
device
);
status
=
acpi_remove_notify_handler
(
hotk
->
handle
,
ACPI_SYSTEM_NOTIFY
,
asus_hotk_notify
);
if
(
ACPI_FAILURE
(
status
))
...
...
@@ -1206,20 +1201,24 @@ static int __init asus_acpi_init(void)
{
int
result
;
if
(
acpi_disabled
)
return
-
ENODEV
;
asus_proc_dir
=
proc_mkdir
(
PROC_ASUS
,
acpi_root_dir
);
if
(
!
asus_proc_dir
)
{
printk
(
KERN_ERR
"Asus ACPI: Unable to create /proc entry
\n
"
);
return
(
-
ENODEV
)
;
return
-
ENODEV
;
}
asus_proc_dir
->
owner
=
THIS_MODULE
;
result
=
acpi_bus_register_driver
(
&
asus_hotk_driver
);
if
(
result
<
0
)
{
if
(
result
<
1
)
{
acpi_bus_unregister_driver
(
&
asus_hotk_driver
);
remove_proc_entry
(
PROC_ASUS
,
acpi_root_dir
);
return
(
-
ENODEV
)
;
return
-
ENODEV
;
}
return
(
0
)
;
return
0
;
}
...
...
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