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
dd07a8db
Commit
dd07a8db
authored
Feb 07, 2008
by
Len Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge branches 'release', 'asus', 'sony-laptop' and 'thinkpad' into release
parents
877c357e
31e0729a
fccd5d00
547266e4
Changes
8
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
2901 additions
and
2144 deletions
+2901
-2144
Documentation/thinkpad-acpi.txt
Documentation/thinkpad-acpi.txt
+108
-8
drivers/acpi/asus_acpi.c
drivers/acpi/asus_acpi.c
+45
-10
drivers/misc/Kconfig
drivers/misc/Kconfig
+19
-0
drivers/misc/asus-laptop.c
drivers/misc/asus-laptop.c
+16
-10
drivers/misc/sony-laptop.c
drivers/misc/sony-laptop.c
+275
-170
drivers/misc/thinkpad_acpi.c
drivers/misc/thinkpad_acpi.c
+2436
-1340
drivers/misc/thinkpad_acpi.h
drivers/misc/thinkpad_acpi.h
+0
-606
include/linux/sonypi.h
include/linux/sonypi.h
+2
-0
No files found.
Documentation/thinkpad-acpi.txt
View file @
dd07a8db
ThinkPad ACPI Extras Driver
Version 0.1
7
October 04th, 2007
Version 0.1
9
January 06th, 2008
Borislav Deianov <borislav@users.sf.net>
Henrique de Moraes Holschuh <hmh@hmh.eng.br>
...
...
@@ -215,6 +215,11 @@ The following commands can be written to the /proc/acpi/ibm/hotkey file:
... any other 8-hex-digit mask ...
echo reset > /proc/acpi/ibm/hotkey -- restore the original mask
The procfs interface does not support NVRAM polling control. So as to
maintain maximum bug-to-bug compatibility, it does not report any masks,
nor does it allow one to manipulate the hot key mask when the firmware
does not support masks at all, even if NVRAM polling is in use.
sysfs notes:
hotkey_bios_enabled:
...
...
@@ -231,17 +236,26 @@ sysfs notes:
to this value.
hotkey_enable:
Enables/disables the hot keys feature, and reports
current status of the hot keys feature.
Enables/disables the hot keys feature in the ACPI
firmware, and reports current status of the hot keys
feature. Has no effect on the NVRAM hot key polling
functionality.
0: disables the hot keys feature / feature disabled
1: enables the hot keys feature / feature enabled
hotkey_mask:
bit mask to enable driver-handling and ACPI event
generation for each hot key (see above). Returns the
current status of the hot keys mask, and allows one to
modify it.
bit mask to enable driver-handling (and depending on
the firmware, ACPI event generation) for each hot key
(see above). Returns the current status of the hot keys
mask, and allows one to modify it.
Note: when NVRAM polling is active, the firmware mask
will be different from the value returned by
hotkey_mask. The driver will retain enabled bits for
hotkeys that are under NVRAM polling even if the
firmware refuses them, and will not set these bits on
the firmware hot key mask.
hotkey_all_mask:
bit mask that should enable event reporting for all
...
...
@@ -257,12 +271,48 @@ sysfs notes:
handled by the firmware anyway. Echo it to
hotkey_mask above, to use.
hotkey_source_mask:
bit mask that selects which hot keys will the driver
poll the NVRAM for. This is auto-detected by the driver
based on the capabilities reported by the ACPI firmware,
but it can be overridden at runtime.
Hot keys whose bits are set in both hotkey_source_mask
and also on hotkey_mask are polled for in NVRAM. Only a
few hot keys are available through CMOS NVRAM polling.
Warning: when in NVRAM mode, the volume up/down/mute
keys are synthesized according to changes in the mixer,
so you have to use volume up or volume down to unmute,
as per the ThinkPad volume mixer user interface. When
in ACPI event mode, volume up/down/mute are reported as
separate events, but this behaviour may be corrected in
future releases of this driver, in which case the
ThinkPad volume mixer user interface semanthics will be
enforced.
hotkey_poll_freq:
frequency in Hz for hot key polling. It must be between
0 and 25 Hz. Polling is only carried out when strictly
needed.
Setting hotkey_poll_freq to zero disables polling, and
will cause hot key presses that require NVRAM polling
to never be reported.
Setting hotkey_poll_freq too low will cause repeated
pressings of the same hot key to be misreported as a
single key press, or to not even be detected at all.
The recommended polling frequency is 10Hz.
hotkey_radio_sw:
if the ThinkPad has a hardware radio switch, this
attribute will read 0 if the switch is in the "radios
disabled" postition, and 1 if the switch is in the
"radios enabled" position.
This attribute has poll()/select() support.
hotkey_report_mode:
Returns the state of the procfs ACPI event report mode
filter for hot keys. If it is set to 1 (the default),
...
...
@@ -277,6 +327,25 @@ sysfs notes:
May return -EPERM (write access locked out by module
parameter) or -EACCES (read-only).
wakeup_reason:
Set to 1 if the system is waking up because the user
requested a bay ejection. Set to 2 if the system is
waking up because the user requested the system to
undock. Set to zero for normal wake-ups or wake-ups
due to unknown reasons.
This attribute has poll()/select() support.
wakeup_hotunplug_complete:
Set to 1 if the system was waken up because of an
undock or bay ejection request, and that request
was sucessfully completed. At this point, it might
be useful to send the system back to sleep, at the
user's choice. Refer to HKEY events 0x4003 and
0x3003, below.
This attribute has poll()/select() support.
input layer notes:
A Hot key is mapped to a single input layer EV_KEY event, possibly
...
...
@@ -427,6 +496,23 @@ Non hot-key ACPI HKEY event map:
The above events are not propagated by the driver, except for legacy
compatibility purposes when hotkey_report_mode is set to 1.
0x2304 System is waking up from suspend to undock
0x2305 System is waking up from suspend to eject bay
0x2404 System is waking up from hibernation to undock
0x2405 System is waking up from hibernation to eject bay
The above events are never propagated by the driver.
0x3003 Bay ejection (see 0x2x05) complete, can sleep again
0x4003 Undocked (see 0x2x04), can sleep again
0x5009 Tablet swivel: switched to tablet mode
0x500A Tablet swivel: switched to normal mode
0x500B Tablet pen insterted into its storage bay
0x500C Tablet pen removed from its storage bay
0x5010 Brightness level changed (newer Lenovo BIOSes)
The above events are propagated by the driver.
Compatibility notes:
ibm-acpi and thinkpad-acpi 0.15 (mainline kernels before 2.6.23) never
...
...
@@ -1263,3 +1349,17 @@ Sysfs interface changelog:
and the hwmon class for libsensors4 (lm-sensors 3)
compatibility. Moved all hwmon attributes to this
new platform device.
0x020100: Marker for thinkpad-acpi with hot key NVRAM polling
support. If you must, use it to know you should not
start an userspace NVRAM poller (allows to detect when
NVRAM is compiled out by the user because it is
unneeded/undesired in the first place).
0x020101: Marker for thinkpad-acpi with hot key NVRAM polling
and proper hotkey_mask semanthics (version 8 of the
NVRAM polling patch). Some development snapshots of
0.18 had an earlier version that did strange things
to hotkey_mask.
0x020200: Add poll()/select() support to the following attributes:
hotkey_radio_sw, wakeup_hotunplug_complete, wakeup_reason
drivers/acpi/asus_acpi.c
View file @
dd07a8db
...
...
@@ -142,6 +142,7 @@ struct asus_hotk {
xxN
,
//M2400N, M3700N, M5200N, M6800N, S1300N, S5200N
A4S
,
//Z81sp
//(Centrino)
F3Sa
,
END_MODEL
}
model
;
//Models currently supported
u16
event_count
[
128
];
//count for each event TODO make this better
...
...
@@ -405,7 +406,20 @@ static struct model_data model_conf[END_MODEL] = {
.
brightness_get
=
"GPLV"
,
.
mt_bt_switch
=
"BLED"
,
.
mt_wled
=
"WLED"
}
},
{
.
name
=
"F3Sa"
,
.
mt_bt_switch
=
"BLED"
,
.
mt_wled
=
"WLED"
,
.
mt_mled
=
"MLED"
,
.
brightness_get
=
"GPLV"
,
.
brightness_set
=
"SPLV"
,
.
mt_lcd_switch
=
"
\\
_SB.PCI0.SBRG.EC0._Q10"
,
.
lcd_status
=
"
\\
_SB.PCI0.SBRG.EC0.RPIN"
,
.
display_get
=
"
\\
ADVG"
,
.
display_set
=
"SDSP"
,
},
};
...
...
@@ -710,15 +724,8 @@ static int get_lcd_state(void)
{
int
lcd
=
0
;
if
(
hotk
->
model
!=
L3H
)
{
/* We don't have to check anything if we are here */
if
(
!
read_acpi_int
(
NULL
,
hotk
->
methods
->
lcd_status
,
&
lcd
))
printk
(
KERN_WARNING
"Asus ACPI: Error reading LCD status
\n
"
);
if
(
hotk
->
model
==
L2D
)
lcd
=
~
lcd
;
}
else
{
/* L3H and the like have to be handled differently */
if
(
hotk
->
model
==
L3H
)
{
/* L3H and the like have to be handled differently */
acpi_status
status
=
0
;
struct
acpi_object_list
input
;
union
acpi_object
mt_params
[
2
];
...
...
@@ -745,6 +752,32 @@ static int get_lcd_state(void)
if
(
out_obj
.
type
==
ACPI_TYPE_INTEGER
)
/* That's what the AML code does */
lcd
=
out_obj
.
integer
.
value
>>
8
;
}
else
if
(
hotk
->
model
==
F3Sa
)
{
unsigned
long
tmp
;
union
acpi_object
param
;
struct
acpi_object_list
input
;
acpi_status
status
;
/* Read pin 11 */
param
.
type
=
ACPI_TYPE_INTEGER
;
param
.
integer
.
value
=
0x11
;
input
.
count
=
1
;
input
.
pointer
=
&
param
;
status
=
acpi_evaluate_integer
(
NULL
,
hotk
->
methods
->
lcd_status
,
&
input
,
&
tmp
);
if
(
status
!=
AE_OK
)
return
-
1
;
lcd
=
tmp
;
}
else
{
/* We don't have to check anything if we are here */
if
(
!
read_acpi_int
(
NULL
,
hotk
->
methods
->
lcd_status
,
&
lcd
))
printk
(
KERN_WARNING
"Asus ACPI: Error reading LCD status
\n
"
);
if
(
hotk
->
model
==
L2D
)
lcd
=
~
lcd
;
}
return
(
lcd
&
1
);
...
...
@@ -1134,6 +1167,8 @@ static int asus_model_match(char *model)
return
W5A
;
else
if
(
strncmp
(
model
,
"A4S"
,
3
)
==
0
)
return
A4S
;
else
if
(
strncmp
(
model
,
"F3Sa"
,
4
)
==
0
)
return
F3Sa
;
else
return
END_MODEL
;
}
...
...
drivers/misc/Kconfig
View file @
dd07a8db
...
...
@@ -219,6 +219,25 @@ config THINKPAD_ACPI_BAY
If you are not sure, say Y here.
config THINKPAD_ACPI_HOTKEY_POLL
bool "Suport NVRAM polling for hot keys"
depends on THINKPAD_ACPI
default y
---help---
Some thinkpad models benefit from NVRAM polling to detect a few of
the hot key press events. If you know your ThinkPad model does not
need to do NVRAM polling to support any of the hot keys you use,
unselecting this option will save about 1kB of memory.
ThinkPads T40 and newer, R52 and newer, and X31 and newer are
unlikely to need NVRAM polling in their latest BIOS versions.
NVRAM polling can detect at most the following keys: ThinkPad/Access
IBM, Zoom, Switch Display (fn+F7), ThinkLight, Volume up/down/mute,
Brightness up/down, Display Expand (fn+F8), Hibernate (fn+F12).
If you are not sure, say Y here. The driver enables polling only if
it is strictly necessary to do so.
config ATMEL_SSC
tristate "Device driver for Atmel SSC peripheral"
...
...
drivers/misc/asus-laptop.c
View file @
dd07a8db
...
...
@@ -254,7 +254,7 @@ ASUS_LED(gled, "gaming");
* 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
0 if write is successful, -1
else.
*/
static
int
write_acpi_int
(
acpi_handle
handle
,
const
char
*
method
,
int
val
,
struct
acpi_buffer
*
output
)
...
...
@@ -263,13 +263,19 @@ static int write_acpi_int(acpi_handle handle, const char *method, int val,
union
acpi_object
in_obj
;
//the only param we use
acpi_status
status
;
if
(
!
handle
)
return
0
;
params
.
count
=
1
;
params
.
pointer
=
&
in_obj
;
in_obj
.
type
=
ACPI_TYPE_INTEGER
;
in_obj
.
integer
.
value
=
val
;
status
=
acpi_evaluate_object
(
handle
,
(
char
*
)
method
,
&
params
,
output
);
return
(
status
==
AE_OK
);
if
(
status
==
AE_OK
)
return
0
;
else
return
-
1
;
}
static
int
read_wireless_status
(
int
mask
)
...
...
@@ -321,7 +327,7 @@ static void write_status(acpi_handle handle, int out, int mask)
switch
(
mask
)
{
case
MLED_ON
:
out
=
!
out
&
0x1
;
out
=
!
(
out
&
0x1
)
;
break
;
case
GLED_ON
:
out
=
(
out
&
0x1
)
+
1
;
...
...
@@ -335,7 +341,7 @@ static void write_status(acpi_handle handle, int out, int mask)
break
;
}
if
(
handle
&&
!
write_acpi_int
(
handle
,
NULL
,
out
,
NULL
))
if
(
write_acpi_int
(
handle
,
NULL
,
out
,
NULL
))
printk
(
ASUS_WARNING
" write failed %x
\n
"
,
mask
);
}
...
...
@@ -415,7 +421,7 @@ static int set_brightness(struct backlight_device *bd, int value)
value
=
(
0
<
value
)
?
((
15
<
value
)
?
15
:
value
)
:
0
;
/* 0 <= value <= 15 */
if
(
!
write_acpi_int
(
brightness_set_handle
,
NULL
,
value
,
NULL
))
{
if
(
write_acpi_int
(
brightness_set_handle
,
NULL
,
value
,
NULL
))
{
printk
(
ASUS_WARNING
"Error changing brightness
\n
"
);
ret
=
-
EIO
;
}
...
...
@@ -545,7 +551,7 @@ static ssize_t store_ledd(struct device *dev, struct device_attribute *attr,
rv
=
parse_arg
(
buf
,
count
,
&
value
);
if
(
rv
>
0
)
{
if
(
!
write_acpi_int
(
ledd_set_handle
,
NULL
,
value
,
NULL
))
if
(
write_acpi_int
(
ledd_set_handle
,
NULL
,
value
,
NULL
))
printk
(
ASUS_WARNING
"LED display write failed
\n
"
);
else
hotk
->
ledd_status
=
(
u32
)
value
;
...
...
@@ -590,7 +596,7 @@ static ssize_t store_bluetooth(struct device *dev,
static
void
set_display
(
int
value
)
{
/* no sanity check needed for now */
if
(
!
write_acpi_int
(
display_set_handle
,
NULL
,
value
,
NULL
))
if
(
write_acpi_int
(
display_set_handle
,
NULL
,
value
,
NULL
))
printk
(
ASUS_WARNING
"Error setting display
\n
"
);
return
;
}
...
...
@@ -647,7 +653,7 @@ static ssize_t store_disp(struct device *dev, struct device_attribute *attr,
*/
static
void
set_light_sens_switch
(
int
value
)
{
if
(
!
write_acpi_int
(
ls_switch_handle
,
NULL
,
value
,
NULL
))
if
(
write_acpi_int
(
ls_switch_handle
,
NULL
,
value
,
NULL
))
printk
(
ASUS_WARNING
"Error setting light sensor switch
\n
"
);
hotk
->
light_switch
=
value
;
}
...
...
@@ -672,7 +678,7 @@ static ssize_t store_lssw(struct device *dev, struct device_attribute *attr,
static
void
set_light_sens_level
(
int
value
)
{
if
(
!
write_acpi_int
(
ls_level_handle
,
NULL
,
value
,
NULL
))
if
(
write_acpi_int
(
ls_level_handle
,
NULL
,
value
,
NULL
))
printk
(
ASUS_WARNING
"Error setting light sensor level
\n
"
);
hotk
->
light_level
=
value
;
}
...
...
@@ -860,7 +866,7 @@ static int asus_hotk_get_info(void)
printk
(
ASUS_WARNING
"Couldn't get the DSDT table header
\n
"
);
/* We have to write 0 on init this far for all ASUS models */
if
(
!
write_acpi_int
(
hotk
->
handle
,
"INIT"
,
0
,
&
buffer
))
{
if
(
write_acpi_int
(
hotk
->
handle
,
"INIT"
,
0
,
&
buffer
))
{
printk
(
ASUS_ERR
"Hotkey initialization failed
\n
"
);
return
-
ENODEV
;
}
...
...
drivers/misc/sony-laptop.c
View file @
dd07a8db
This diff is collapsed.
Click to expand it.
drivers/misc/thinkpad_acpi.c
View file @
dd07a8db
This diff is collapsed.
Click to expand it.
drivers/misc/thinkpad_acpi.h
deleted
100644 → 0
View file @
877c357e
This diff is collapsed.
Click to expand it.
include/linux/sonypi.h
View file @
dd07a8db
...
...
@@ -101,6 +101,8 @@
#define SONYPI_EVENT_FNKEY_RELEASED 59
#define SONYPI_EVENT_WIRELESS_ON 60
#define SONYPI_EVENT_WIRELESS_OFF 61
#define SONYPI_EVENT_ZOOM_IN_PRESSED 62
#define SONYPI_EVENT_ZOOM_OUT_PRESSED 63
/* get/set brightness */
#define SONYPI_IOCGBRT _IOR('v', 0, __u8)
...
...
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