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
eaf60d69
Commit
eaf60d69
authored
Apr 28, 2007
by
Len Brown
Browse files
Options
Browse Files
Download
Plain Diff
Pull asus into release branch
parents
de46c337
8ec555c2
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
95 additions
and
56 deletions
+95
-56
drivers/misc/asus-laptop.c
drivers/misc/asus-laptop.c
+95
-56
No files found.
drivers/misc/asus-laptop.c
View file @
eaf60d69
...
...
@@ -3,7 +3,7 @@
*
*
* Copyright (C) 2002-2005 Julien Lerouge, 2003-2006 Karol Kozimor
* Copyright (C) 2006 Corentin Chary
* Copyright (C) 2006
-2007
Corentin Chary
*
* 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
...
...
@@ -48,7 +48,7 @@
#include <acpi/acpi_bus.h>
#include <asm/uaccess.h>
#define ASUS_LAPTOP_VERSION "0.4
0
"
#define ASUS_LAPTOP_VERSION "0.4
1
"
#define ASUS_HOTK_NAME "Asus Laptop Support"
#define ASUS_HOTK_CLASS "hotkey"
...
...
@@ -81,7 +81,8 @@
#define TLED_ON 0x08 //touchpad LED
#define RLED_ON 0x10 //Record LED
#define PLED_ON 0x20 //Phone LED
#define LCD_ON 0x40 //LCD backlight
#define GLED_ON 0x40 //Gaming LED
#define LCD_ON 0x80 //LCD backlight
#define ASUS_LOG ASUS_HOTK_FILE ": "
#define ASUS_ERR KERN_ERR ASUS_LOG
...
...
@@ -94,6 +95,19 @@ MODULE_AUTHOR("Julien Lerouge, Karol Kozimor, Corentin Chary");
MODULE_DESCRIPTION
(
ASUS_HOTK_NAME
);
MODULE_LICENSE
(
"GPL"
);
/* WAPF defines the behavior of the Fn+Fx wlan key
* The significance of values is yet to be found, but
* most of the time:
* 0x0 will do nothing
* 0x1 will allow to control the device with Fn+Fx key.
* 0x4 will send an ACPI event (0x88) while pressing the Fn+Fx key
* 0x5 like 0x1 or 0x4
* So, if something doesn't work as you want, just try other values =)
*/
static
uint
wapf
=
1
;
module_param
(
wapf
,
uint
,
0644
);
MODULE_PARM_DESC
(
wapf
,
"WAPF value"
);
#define ASUS_HANDLE(object, paths...) \
static acpi_handle object##_handle = NULL; \
static char *object##_paths[] = { paths }
...
...
@@ -103,6 +117,7 @@ ASUS_HANDLE(mled_set, ASUS_HOTK_PREFIX "MLED");
ASUS_HANDLE
(
tled_set
,
ASUS_HOTK_PREFIX
"TLED"
);
ASUS_HANDLE
(
rled_set
,
ASUS_HOTK_PREFIX
"RLED"
);
/* W1JC */
ASUS_HANDLE
(
pled_set
,
ASUS_HOTK_PREFIX
"PLED"
);
/* A7J */
ASUS_HANDLE
(
gled_set
,
ASUS_HOTK_PREFIX
"GLED"
);
/* G1, G2 (probably) */
/* LEDD */
ASUS_HANDLE
(
ledd_set
,
ASUS_HOTK_PREFIX
"SLCM"
);
...
...
@@ -221,6 +236,7 @@ ASUS_LED(mled, "mail");
ASUS_LED
(
tled
,
"touchpad"
);
ASUS_LED
(
rled
,
"record"
);
ASUS_LED
(
pled
,
"phone"
);
ASUS_LED
(
gled
,
"gaming"
);
/*
* This function evaluates an ACPI method, given an int as parameter, the
...
...
@@ -245,32 +261,19 @@ static int write_acpi_int(acpi_handle handle, const char *method, int val,
return
(
status
==
AE_OK
);
}
static
int
read_acpi_int
(
acpi_handle
handle
,
const
char
*
method
,
int
*
val
,
struct
acpi_object_list
*
params
)
{
struct
acpi_buffer
output
;
union
acpi_object
out_obj
;
acpi_status
status
;
output
.
length
=
sizeof
(
out_obj
);
output
.
pointer
=
&
out_obj
;
status
=
acpi_evaluate_object
(
handle
,
(
char
*
)
method
,
params
,
&
output
);
*
val
=
out_obj
.
integer
.
value
;
return
(
status
==
AE_OK
)
&&
(
out_obj
.
type
==
ACPI_TYPE_INTEGER
);
}
static
int
read_wireless_status
(
int
mask
)
{
int
status
;
ulong
status
;
acpi_status
rv
=
AE_OK
;
if
(
!
wireless_status_handle
)
return
(
hotk
->
status
&
mask
)
?
1
:
0
;
if
(
read_acpi_int
(
wireless_status_handle
,
NULL
,
&
status
,
NULL
))
{
return
(
status
&
mask
)
?
1
:
0
;
}
else
rv
=
acpi_evaluate_integer
(
wireless_status_handle
,
NULL
,
NULL
,
&
status
);
if
(
ACPI_FAILURE
(
rv
))
printk
(
ASUS_WARNING
"Error reading Wireless status
\n
"
);
else
return
(
status
&
mask
)
?
1
:
0
;
return
(
hotk
->
status
&
mask
)
?
1
:
0
;
}
...
...
@@ -285,19 +288,28 @@ static int read_status(int mask)
return
(
hotk
->
status
&
mask
)
?
1
:
0
;
}
static
void
write_status
(
acpi_handle
handle
,
int
out
,
int
mask
,
int
invert
)
static
void
write_status
(
acpi_handle
handle
,
int
out
,
int
mask
)
{
hotk
->
status
=
(
out
)
?
(
hotk
->
status
|
mask
)
:
(
hotk
->
status
&
~
mask
);
if
(
invert
)
/* invert target value */
switch
(
mask
)
{
case
MLED_ON
:
out
=
!
out
&
0x1
;
break
;
case
GLED_ON
:
out
=
(
out
&
0x1
)
+
1
;
break
;
default:
out
&=
0x1
;
break
;
}
if
(
handle
&&
!
write_acpi_int
(
handle
,
NULL
,
out
,
NULL
))
printk
(
ASUS_WARNING
" write failed
\n
"
);
printk
(
ASUS_WARNING
" write failed
%x
\n
"
,
mask
);
}
/* /sys/class/led handlers */
#define ASUS_LED_HANDLER(object, mask
, invert)
\
#define ASUS_LED_HANDLER(object, mask
)
\
static void object##_led_set(struct led_classdev *led_cdev, \
enum led_brightness value) \
{ \
...
...
@@ -307,13 +319,14 @@ static void write_status(acpi_handle handle, int out, int mask, int invert)
static void object##_led_update(struct work_struct *ignored) \
{ \
int value = object##_led_wk; \
write_status(object##_set_handle, value, (mask)
, (invert));
\
write_status(object##_set_handle, value, (mask)
);
\
}
ASUS_LED_HANDLER
(
mled
,
MLED_ON
,
1
);
ASUS_LED_HANDLER
(
pled
,
PLED_ON
,
0
);
ASUS_LED_HANDLER
(
rled
,
RLED_ON
,
0
);
ASUS_LED_HANDLER
(
tled
,
TLED_ON
,
0
);
ASUS_LED_HANDLER
(
mled
,
MLED_ON
);
ASUS_LED_HANDLER
(
pled
,
PLED_ON
);
ASUS_LED_HANDLER
(
rled
,
RLED_ON
);
ASUS_LED_HANDLER
(
tled
,
TLED_ON
);
ASUS_LED_HANDLER
(
gled
,
GLED_ON
);
static
int
get_lcd_state
(
void
)
{
...
...
@@ -338,7 +351,7 @@ static int set_lcd_state(int value)
printk
(
ASUS_WARNING
"Error switching LCD
\n
"
);
}
write_status
(
NULL
,
lcd
,
LCD_ON
,
0
);
write_status
(
NULL
,
lcd
,
LCD_ON
);
return
0
;
}
...
...
@@ -354,9 +367,11 @@ static void lcd_blank(int blank)
static
int
read_brightness
(
struct
backlight_device
*
bd
)
{
int
value
;
ulong
value
;
acpi_status
rv
=
AE_OK
;
if
(
!
read_acpi_int
(
brightness_get_handle
,
NULL
,
&
value
,
NULL
))
rv
=
acpi_evaluate_integer
(
brightness_get_handle
,
NULL
,
NULL
,
&
value
);
if
(
ACPI_FAILURE
(
rv
))
printk
(
ASUS_WARNING
"Error reading brightness
\n
"
);
return
value
;
...
...
@@ -403,8 +418,10 @@ static ssize_t show_infos(struct device *dev,
struct
device_attribute
*
attr
,
char
*
page
)
{
int
len
=
0
;
int
temp
;
ulong
temp
;
char
buf
[
16
];
//enough for all info
acpi_status
rv
=
AE_OK
;
/*
* We use the easy way, we don't care of off and count, so we don't set eof
* to 1
...
...
@@ -418,9 +435,10 @@ static ssize_t show_infos(struct device *dev,
* bit signifies that the laptop is equipped with a Wi-Fi MiniPCI card.
* The significance of others is yet to be found.
*/
if
(
read_acpi_int
(
hotk
->
handle
,
"SFUN"
,
&
temp
,
NULL
))
len
+=
sprintf
(
page
+
len
,
"SFUN value : 0x%04x
\n
"
,
temp
);
rv
=
acpi_evaluate_integer
(
hotk
->
handle
,
"SFUN"
,
NULL
,
&
temp
);
if
(
!
ACPI_FAILURE
(
rv
))
len
+=
sprintf
(
page
+
len
,
"SFUN value : 0x%04x
\n
"
,
(
uint
)
temp
);
/*
* Another value for userspace: the ASYM method returns 0x02 for
* battery low and 0x04 for battery critical, its readings tend to be
...
...
@@ -428,9 +446,10 @@ static ssize_t show_infos(struct device *dev,
* Note: since not all the laptops provide this method, errors are
* silently ignored.
*/
if
(
read_acpi_int
(
hotk
->
handle
,
"ASYM"
,
&
temp
,
NULL
))
len
+=
sprintf
(
page
+
len
,
"ASYM value : 0x%04x
\n
"
,
temp
);
rv
=
acpi_evaluate_integer
(
hotk
->
handle
,
"ASYM"
,
NULL
,
&
temp
);
if
(
!
ACPI_FAILURE
(
rv
))
len
+=
sprintf
(
page
+
len
,
"ASYM value : 0x%04x
\n
"
,
(
uint
)
temp
);
if
(
asus_info
)
{
snprintf
(
buf
,
16
,
"%d"
,
asus_info
->
length
);
len
+=
sprintf
(
page
+
len
,
"DSDT length : %s
\n
"
,
buf
);
...
...
@@ -465,7 +484,7 @@ static int parse_arg(const char *buf, unsigned long count, int *val)
}
static
ssize_t
store_status
(
const
char
*
buf
,
size_t
count
,
acpi_handle
handle
,
int
mask
,
int
invert
)
acpi_handle
handle
,
int
mask
)
{
int
rv
,
value
;
int
out
=
0
;
...
...
@@ -474,7 +493,7 @@ static ssize_t store_status(const char *buf, size_t count,
if
(
rv
>
0
)
out
=
value
?
1
:
0
;
write_status
(
handle
,
out
,
mask
,
invert
);
write_status
(
handle
,
out
,
mask
);
return
rv
;
}
...
...
@@ -515,7 +534,7 @@ static ssize_t show_wlan(struct device *dev,
static
ssize_t
store_wlan
(
struct
device
*
dev
,
struct
device_attribute
*
attr
,
const
char
*
buf
,
size_t
count
)
{
return
store_status
(
buf
,
count
,
wl_switch_handle
,
WL_ON
,
0
);
return
store_status
(
buf
,
count
,
wl_switch_handle
,
WL_ON
);
}
/*
...
...
@@ -531,7 +550,7 @@ static ssize_t store_bluetooth(struct device *dev,
struct
device_attribute
*
attr
,
const
char
*
buf
,
size_t
count
)
{
return
store_status
(
buf
,
count
,
bt_switch_handle
,
BT_ON
,
0
);
return
store_status
(
buf
,
count
,
bt_switch_handle
,
BT_ON
);
}
/*
...
...
@@ -547,12 +566,15 @@ static void set_display(int value)
static
int
read_display
(
void
)
{
int
value
=
0
;
ulong
value
=
0
;
acpi_status
rv
=
AE_OK
;
/* In most of the case, we know how to set the display, but sometime
we can't read it */
if
(
display_get_handle
)
{
if
(
!
read_acpi_int
(
display_get_handle
,
NULL
,
&
value
,
NULL
))
rv
=
acpi_evaluate_integer
(
display_get_handle
,
NULL
,
NULL
,
&
value
);
if
(
ACPI_FAILURE
(
rv
))
printk
(
ASUS_WARNING
"Error reading display status
\n
"
);
}
...
...
@@ -656,10 +678,10 @@ static void asus_hotk_notify(acpi_handle handle, u32 event, void *data)
* switched
*/
if
(
event
==
ATKD_LCD_ON
)
{
write_status
(
NULL
,
1
,
LCD_ON
,
0
);
write_status
(
NULL
,
1
,
LCD_ON
);
lcd_blank
(
FB_BLANK_UNBLANK
);
}
else
if
(
event
==
ATKD_LCD_OFF
)
{
write_status
(
NULL
,
0
,
LCD_ON
,
0
);
write_status
(
NULL
,
0
,
LCD_ON
);
lcd_blank
(
FB_BLANK_POWERDOWN
);
}
...
...
@@ -771,7 +793,7 @@ static int asus_hotk_get_info(void)
{
struct
acpi_buffer
buffer
=
{
ACPI_ALLOCATE_BUFFER
,
NULL
};
union
acpi_object
*
model
=
NULL
;
int
bsts_result
,
hwrs_result
;
ulong
bsts_result
,
hwrs_result
;
char
*
string
=
NULL
;
acpi_status
status
;
...
...
@@ -794,11 +816,16 @@ static int asus_hotk_get_info(void)
}
/* This needs to be called for some laptops to init properly */
if
(
!
read_acpi_int
(
hotk
->
handle
,
"BSTS"
,
&
bsts_result
,
NULL
))
status
=
acpi_evaluate_integer
(
hotk
->
handle
,
"BSTS"
,
NULL
,
&
bsts_result
);
if
(
ACPI_FAILURE
(
status
))
printk
(
ASUS_WARNING
"Error calling BSTS
\n
"
);
else
if
(
bsts_result
)
printk
(
ASUS_NOTICE
"BSTS called, 0x%02x returned
\n
"
,
bsts_result
);
(
uint
)
bsts_result
);
/* This too ... */
write_acpi_int
(
hotk
->
handle
,
"CWAP"
,
wapf
,
NULL
);
/*
* Try to match the object returned by INIT to the specific model.
...
...
@@ -831,6 +858,7 @@ static int asus_hotk_get_info(void)
ASUS_HANDLE_INIT
(
tled_set
);
ASUS_HANDLE_INIT
(
rled_set
);
ASUS_HANDLE_INIT
(
pled_set
);
ASUS_HANDLE_INIT
(
gled_set
);
ASUS_HANDLE_INIT
(
ledd_set
);
...
...
@@ -840,7 +868,9 @@ static int asus_hotk_get_info(void)
* The significance of others is yet to be found.
* If we don't find the method, we assume the device are present.
*/
if
(
!
read_acpi_int
(
hotk
->
handle
,
"HRWS"
,
&
hwrs_result
,
NULL
))
status
=
acpi_evaluate_integer
(
hotk
->
handle
,
"HRWS"
,
NULL
,
&
hwrs_result
);
if
(
ACPI_FAILURE
(
status
))
hwrs_result
=
WL_HWRS
|
BT_HWRS
;
if
(
hwrs_result
&
WL_HWRS
)
...
...
@@ -928,11 +958,15 @@ static int asus_hotk_add(struct acpi_device *device)
asus_hotk_found
=
1
;
/* WLED and BLED are on by default */
write_status
(
bt_switch_handle
,
1
,
BT_ON
,
0
);
write_status
(
wl_switch_handle
,
1
,
WL_ON
,
0
);
write_status
(
bt_switch_handle
,
1
,
BT_ON
);
write_status
(
wl_switch_handle
,
1
,
WL_ON
);
/* If the h/w switch is off, we need to check the real status */
write_status
(
NULL
,
read_status
(
BT_ON
),
BT_ON
);
write_status
(
NULL
,
read_status
(
WL_ON
),
WL_ON
);
/* LCD Backlight is on by default */
write_status
(
NULL
,
1
,
LCD_ON
,
0
);
write_status
(
NULL
,
1
,
LCD_ON
);
/* LED display is off by default */
hotk
->
ledd_status
=
0xFFF
;
...
...
@@ -991,6 +1025,7 @@ static void asus_led_exit(void)
ASUS_LED_UNREGISTER
(
tled
);
ASUS_LED_UNREGISTER
(
pled
);
ASUS_LED_UNREGISTER
(
rled
);
ASUS_LED_UNREGISTER
(
gled
);
destroy_workqueue
(
led_workqueue
);
}
...
...
@@ -1062,6 +1097,10 @@ static int asus_led_init(struct device *dev)
if
(
rv
)
return
rv
;
rv
=
ASUS_LED_REGISTER
(
gled
,
dev
);
if
(
rv
)
return
rv
;
led_workqueue
=
create_singlethread_workqueue
(
"led_workqueue"
);
if
(
!
led_workqueue
)
return
-
ENOMEM
;
...
...
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