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
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
Show 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 @@
...
@@ -3,7 +3,7 @@
*
*
*
*
* Copyright (C) 2002-2005 Julien Lerouge, 2003-2006 Karol Kozimor
* 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
* 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
...
@@ -48,7 +48,7 @@
...
@@ -48,7 +48,7 @@
#include <acpi/acpi_bus.h>
#include <acpi/acpi_bus.h>
#include <asm/uaccess.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_NAME "Asus Laptop Support"
#define ASUS_HOTK_CLASS "hotkey"
#define ASUS_HOTK_CLASS "hotkey"
...
@@ -81,7 +81,8 @@
...
@@ -81,7 +81,8 @@
#define TLED_ON 0x08 //touchpad LED
#define TLED_ON 0x08 //touchpad LED
#define RLED_ON 0x10 //Record LED
#define RLED_ON 0x10 //Record LED
#define PLED_ON 0x20 //Phone 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_LOG ASUS_HOTK_FILE ": "
#define ASUS_ERR KERN_ERR ASUS_LOG
#define ASUS_ERR KERN_ERR ASUS_LOG
...
@@ -94,6 +95,19 @@ MODULE_AUTHOR("Julien Lerouge, Karol Kozimor, Corentin Chary");
...
@@ -94,6 +95,19 @@ MODULE_AUTHOR("Julien Lerouge, Karol Kozimor, Corentin Chary");
MODULE_DESCRIPTION
(
ASUS_HOTK_NAME
);
MODULE_DESCRIPTION
(
ASUS_HOTK_NAME
);
MODULE_LICENSE
(
"GPL"
);
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...) \
#define ASUS_HANDLE(object, paths...) \
static acpi_handle object##_handle = NULL; \
static acpi_handle object##_handle = NULL; \
static char *object##_paths[] = { paths }
static char *object##_paths[] = { paths }
...
@@ -103,6 +117,7 @@ ASUS_HANDLE(mled_set, ASUS_HOTK_PREFIX "MLED");
...
@@ -103,6 +117,7 @@ ASUS_HANDLE(mled_set, ASUS_HOTK_PREFIX "MLED");
ASUS_HANDLE
(
tled_set
,
ASUS_HOTK_PREFIX
"TLED"
);
ASUS_HANDLE
(
tled_set
,
ASUS_HOTK_PREFIX
"TLED"
);
ASUS_HANDLE
(
rled_set
,
ASUS_HOTK_PREFIX
"RLED"
);
/* W1JC */
ASUS_HANDLE
(
rled_set
,
ASUS_HOTK_PREFIX
"RLED"
);
/* W1JC */
ASUS_HANDLE
(
pled_set
,
ASUS_HOTK_PREFIX
"PLED"
);
/* A7J */
ASUS_HANDLE
(
pled_set
,
ASUS_HOTK_PREFIX
"PLED"
);
/* A7J */
ASUS_HANDLE
(
gled_set
,
ASUS_HOTK_PREFIX
"GLED"
);
/* G1, G2 (probably) */
/* LEDD */
/* LEDD */
ASUS_HANDLE
(
ledd_set
,
ASUS_HOTK_PREFIX
"SLCM"
);
ASUS_HANDLE
(
ledd_set
,
ASUS_HOTK_PREFIX
"SLCM"
);
...
@@ -221,6 +236,7 @@ ASUS_LED(mled, "mail");
...
@@ -221,6 +236,7 @@ ASUS_LED(mled, "mail");
ASUS_LED
(
tled
,
"touchpad"
);
ASUS_LED
(
tled
,
"touchpad"
);
ASUS_LED
(
rled
,
"record"
);
ASUS_LED
(
rled
,
"record"
);
ASUS_LED
(
pled
,
"phone"
);
ASUS_LED
(
pled
,
"phone"
);
ASUS_LED
(
gled
,
"gaming"
);
/*
/*
* This function evaluates an ACPI method, given an int as parameter, the
* 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,
...
@@ -245,32 +261,19 @@ static int write_acpi_int(acpi_handle handle, const char *method, int val,
return
(
status
==
AE_OK
);
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
)
static
int
read_wireless_status
(
int
mask
)
{
{
int
status
;
ulong
status
;
acpi_status
rv
=
AE_OK
;
if
(
!
wireless_status_handle
)
if
(
!
wireless_status_handle
)
return
(
hotk
->
status
&
mask
)
?
1
:
0
;
return
(
hotk
->
status
&
mask
)
?
1
:
0
;
if
(
read_acpi_int
(
wireless_status_handle
,
NULL
,
&
status
,
NULL
))
{
rv
=
acpi_evaluate_integer
(
wireless_status_handle
,
NULL
,
NULL
,
&
status
);
return
(
status
&
mask
)
?
1
:
0
;
if
(
ACPI_FAILURE
(
rv
))
}
else
printk
(
ASUS_WARNING
"Error reading Wireless status
\n
"
);
printk
(
ASUS_WARNING
"Error reading Wireless status
\n
"
);
else
return
(
status
&
mask
)
?
1
:
0
;
return
(
hotk
->
status
&
mask
)
?
1
:
0
;
return
(
hotk
->
status
&
mask
)
?
1
:
0
;
}
}
...
@@ -285,19 +288,28 @@ static int read_status(int mask)
...
@@ -285,19 +288,28 @@ static int read_status(int mask)
return
(
hotk
->
status
&
mask
)
?
1
:
0
;
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
);
hotk
->
status
=
(
out
)
?
(
hotk
->
status
|
mask
)
:
(
hotk
->
status
&
~
mask
);
if
(
invert
)
/* invert target value */
switch
(
mask
)
{
case
MLED_ON
:
out
=
!
out
&
0x1
;
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
))
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 */
/* /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, \
static void object##_led_set(struct led_classdev *led_cdev, \
enum led_brightness value) \
enum led_brightness value) \
{ \
{ \
...
@@ -307,13 +319,14 @@ static void write_status(acpi_handle handle, int out, int mask, int invert)
...
@@ -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) \
static void object##_led_update(struct work_struct *ignored) \
{ \
{ \
int value = object##_led_wk; \
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
(
mled
,
MLED_ON
);
ASUS_LED_HANDLER
(
pled
,
PLED_ON
,
0
);
ASUS_LED_HANDLER
(
pled
,
PLED_ON
);
ASUS_LED_HANDLER
(
rled
,
RLED_ON
,
0
);
ASUS_LED_HANDLER
(
rled
,
RLED_ON
);
ASUS_LED_HANDLER
(
tled
,
TLED_ON
,
0
);
ASUS_LED_HANDLER
(
tled
,
TLED_ON
);
ASUS_LED_HANDLER
(
gled
,
GLED_ON
);
static
int
get_lcd_state
(
void
)
static
int
get_lcd_state
(
void
)
{
{
...
@@ -338,7 +351,7 @@ static int set_lcd_state(int value)
...
@@ -338,7 +351,7 @@ static int set_lcd_state(int value)
printk
(
ASUS_WARNING
"Error switching LCD
\n
"
);
printk
(
ASUS_WARNING
"Error switching LCD
\n
"
);
}
}
write_status
(
NULL
,
lcd
,
LCD_ON
,
0
);
write_status
(
NULL
,
lcd
,
LCD_ON
);
return
0
;
return
0
;
}
}
...
@@ -354,9 +367,11 @@ static void lcd_blank(int blank)
...
@@ -354,9 +367,11 @@ static void lcd_blank(int blank)
static
int
read_brightness
(
struct
backlight_device
*
bd
)
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
"
);
printk
(
ASUS_WARNING
"Error reading brightness
\n
"
);
return
value
;
return
value
;
...
@@ -403,8 +418,10 @@ static ssize_t show_infos(struct device *dev,
...
@@ -403,8 +418,10 @@ static ssize_t show_infos(struct device *dev,
struct
device_attribute
*
attr
,
char
*
page
)
struct
device_attribute
*
attr
,
char
*
page
)
{
{
int
len
=
0
;
int
len
=
0
;
int
temp
;
ulong
temp
;
char
buf
[
16
];
//enough for all info
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
* We use the easy way, we don't care of off and count, so we don't set eof
* to 1
* to 1
...
@@ -418,9 +435,10 @@ static ssize_t show_infos(struct device *dev,
...
@@ -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.
* bit signifies that the laptop is equipped with a Wi-Fi MiniPCI card.
* The significance of others is yet to be found.
* The significance of others is yet to be found.
*/
*/
if
(
read_acpi_int
(
hotk
->
handle
,
"SFUN"
,
&
temp
,
NULL
))
rv
=
acpi_evaluate_integer
(
hotk
->
handle
,
"SFUN"
,
NULL
,
&
temp
);
len
+=
if
(
!
ACPI_FAILURE
(
rv
))
sprintf
(
page
+
len
,
"SFUN value : 0x%04x
\n
"
,
temp
);
len
+=
sprintf
(
page
+
len
,
"SFUN value : 0x%04x
\n
"
,
(
uint
)
temp
);
/*
/*
* Another value for userspace: the ASYM method returns 0x02 for
* Another value for userspace: the ASYM method returns 0x02 for
* battery low and 0x04 for battery critical, its readings tend to be
* battery low and 0x04 for battery critical, its readings tend to be
...
@@ -428,9 +446,10 @@ static ssize_t show_infos(struct device *dev,
...
@@ -428,9 +446,10 @@ static ssize_t show_infos(struct device *dev,
* Note: since not all the laptops provide this method, errors are
* Note: since not all the laptops provide this method, errors are
* silently ignored.
* silently ignored.
*/
*/
if
(
read_acpi_int
(
hotk
->
handle
,
"ASYM"
,
&
temp
,
NULL
))
rv
=
acpi_evaluate_integer
(
hotk
->
handle
,
"ASYM"
,
NULL
,
&
temp
);
len
+=
if
(
!
ACPI_FAILURE
(
rv
))
sprintf
(
page
+
len
,
"ASYM value : 0x%04x
\n
"
,
temp
);
len
+=
sprintf
(
page
+
len
,
"ASYM value : 0x%04x
\n
"
,
(
uint
)
temp
);
if
(
asus_info
)
{
if
(
asus_info
)
{
snprintf
(
buf
,
16
,
"%d"
,
asus_info
->
length
);
snprintf
(
buf
,
16
,
"%d"
,
asus_info
->
length
);
len
+=
sprintf
(
page
+
len
,
"DSDT length : %s
\n
"
,
buf
);
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)
...
@@ -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
,
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
rv
,
value
;
int
out
=
0
;
int
out
=
0
;
...
@@ -474,7 +493,7 @@ static ssize_t store_status(const char *buf, size_t count,
...
@@ -474,7 +493,7 @@ static ssize_t store_status(const char *buf, size_t count,
if
(
rv
>
0
)
if
(
rv
>
0
)
out
=
value
?
1
:
0
;
out
=
value
?
1
:
0
;
write_status
(
handle
,
out
,
mask
,
invert
);
write_status
(
handle
,
out
,
mask
);
return
rv
;
return
rv
;
}
}
...
@@ -515,7 +534,7 @@ static ssize_t show_wlan(struct device *dev,
...
@@ -515,7 +534,7 @@ static ssize_t show_wlan(struct device *dev,
static
ssize_t
store_wlan
(
struct
device
*
dev
,
struct
device_attribute
*
attr
,
static
ssize_t
store_wlan
(
struct
device
*
dev
,
struct
device_attribute
*
attr
,
const
char
*
buf
,
size_t
count
)
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,
...
@@ -531,7 +550,7 @@ static ssize_t store_bluetooth(struct device *dev,
struct
device_attribute
*
attr
,
const
char
*
buf
,
struct
device_attribute
*
attr
,
const
char
*
buf
,
size_t
count
)
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)
...
@@ -547,12 +566,15 @@ static void set_display(int value)
static
int
read_display
(
void
)
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
/* In most of the case, we know how to set the display, but sometime
we can't read it */
we can't read it */
if
(
display_get_handle
)
{
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
"
);
printk
(
ASUS_WARNING
"Error reading display status
\n
"
);
}
}
...
@@ -656,10 +678,10 @@ static void asus_hotk_notify(acpi_handle handle, u32 event, void *data)
...
@@ -656,10 +678,10 @@ static void asus_hotk_notify(acpi_handle handle, u32 event, void *data)
* switched
* switched
*/
*/
if
(
event
==
ATKD_LCD_ON
)
{
if
(
event
==
ATKD_LCD_ON
)
{
write_status
(
NULL
,
1
,
LCD_ON
,
0
);
write_status
(
NULL
,
1
,
LCD_ON
);
lcd_blank
(
FB_BLANK_UNBLANK
);
lcd_blank
(
FB_BLANK_UNBLANK
);
}
else
if
(
event
==
ATKD_LCD_OFF
)
{
}
else
if
(
event
==
ATKD_LCD_OFF
)
{
write_status
(
NULL
,
0
,
LCD_ON
,
0
);
write_status
(
NULL
,
0
,
LCD_ON
);
lcd_blank
(
FB_BLANK_POWERDOWN
);
lcd_blank
(
FB_BLANK_POWERDOWN
);
}
}
...
@@ -771,7 +793,7 @@ static int asus_hotk_get_info(void)
...
@@ -771,7 +793,7 @@ static int asus_hotk_get_info(void)
{
{
struct
acpi_buffer
buffer
=
{
ACPI_ALLOCATE_BUFFER
,
NULL
};
struct
acpi_buffer
buffer
=
{
ACPI_ALLOCATE_BUFFER
,
NULL
};
union
acpi_object
*
model
=
NULL
;
union
acpi_object
*
model
=
NULL
;
int
bsts_result
,
hwrs_result
;
ulong
bsts_result
,
hwrs_result
;
char
*
string
=
NULL
;
char
*
string
=
NULL
;
acpi_status
status
;
acpi_status
status
;
...
@@ -794,11 +816,16 @@ static int asus_hotk_get_info(void)
...
@@ -794,11 +816,16 @@ static int asus_hotk_get_info(void)
}
}
/* This needs to be called for some laptops to init properly */
/* 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
"
);
printk
(
ASUS_WARNING
"Error calling BSTS
\n
"
);
else
if
(
bsts_result
)
else
if
(
bsts_result
)
printk
(
ASUS_NOTICE
"BSTS called, 0x%02x returned
\n
"
,
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.
* Try to match the object returned by INIT to the specific model.
...
@@ -831,6 +858,7 @@ static int asus_hotk_get_info(void)
...
@@ -831,6 +858,7 @@ static int asus_hotk_get_info(void)
ASUS_HANDLE_INIT
(
tled_set
);
ASUS_HANDLE_INIT
(
tled_set
);
ASUS_HANDLE_INIT
(
rled_set
);
ASUS_HANDLE_INIT
(
rled_set
);
ASUS_HANDLE_INIT
(
pled_set
);
ASUS_HANDLE_INIT
(
pled_set
);
ASUS_HANDLE_INIT
(
gled_set
);
ASUS_HANDLE_INIT
(
ledd_set
);
ASUS_HANDLE_INIT
(
ledd_set
);
...
@@ -840,7 +868,9 @@ static int asus_hotk_get_info(void)
...
@@ -840,7 +868,9 @@ static int asus_hotk_get_info(void)
* The significance of others is yet to be found.
* The significance of others is yet to be found.
* If we don't find the method, we assume the device are present.
* 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
;
hwrs_result
=
WL_HWRS
|
BT_HWRS
;
if
(
hwrs_result
&
WL_HWRS
)
if
(
hwrs_result
&
WL_HWRS
)
...
@@ -928,11 +958,15 @@ static int asus_hotk_add(struct acpi_device *device)
...
@@ -928,11 +958,15 @@ static int asus_hotk_add(struct acpi_device *device)
asus_hotk_found
=
1
;
asus_hotk_found
=
1
;
/* WLED and BLED are on by default */
/* WLED and BLED are on by default */
write_status
(
bt_switch_handle
,
1
,
BT_ON
,
0
);
write_status
(
bt_switch_handle
,
1
,
BT_ON
);
write_status
(
wl_switch_handle
,
1
,
WL_ON
,
0
);
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 */
/* 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 */
/* LED display is off by default */
hotk
->
ledd_status
=
0xFFF
;
hotk
->
ledd_status
=
0xFFF
;
...
@@ -991,6 +1025,7 @@ static void asus_led_exit(void)
...
@@ -991,6 +1025,7 @@ static void asus_led_exit(void)
ASUS_LED_UNREGISTER
(
tled
);
ASUS_LED_UNREGISTER
(
tled
);
ASUS_LED_UNREGISTER
(
pled
);
ASUS_LED_UNREGISTER
(
pled
);
ASUS_LED_UNREGISTER
(
rled
);
ASUS_LED_UNREGISTER
(
rled
);
ASUS_LED_UNREGISTER
(
gled
);
destroy_workqueue
(
led_workqueue
);
destroy_workqueue
(
led_workqueue
);
}
}
...
@@ -1062,6 +1097,10 @@ static int asus_led_init(struct device *dev)
...
@@ -1062,6 +1097,10 @@ static int asus_led_init(struct device *dev)
if
(
rv
)
if
(
rv
)
return
rv
;
return
rv
;
rv
=
ASUS_LED_REGISTER
(
gled
,
dev
);
if
(
rv
)
return
rv
;
led_workqueue
=
create_singlethread_workqueue
(
"led_workqueue"
);
led_workqueue
=
create_singlethread_workqueue
(
"led_workqueue"
);
if
(
!
led_workqueue
)
if
(
!
led_workqueue
)
return
-
ENOMEM
;
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