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
ecfe7f09
Commit
ecfe7f09
authored
Sep 17, 2007
by
Len Brown
Browse files
Options
Browse Files
Download
Plain Diff
Pull thinkpad into release branch
parents
95e3f66f
3b0c6485
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
165 additions
and
96 deletions
+165
-96
Documentation/thinkpad-acpi.txt
Documentation/thinkpad-acpi.txt
+77
-19
drivers/misc/Kconfig
drivers/misc/Kconfig
+0
-20
drivers/misc/thinkpad_acpi.c
drivers/misc/thinkpad_acpi.c
+87
-57
drivers/misc/thinkpad_acpi.h
drivers/misc/thinkpad_acpi.h
+1
-0
No files found.
Documentation/thinkpad-acpi.txt
View file @
ecfe7f09
ThinkPad ACPI Extras Driver
ThinkPad ACPI Extras Driver
Version 0.1
5
Version 0.1
6
July 1st
, 2007
August 2nd
, 2007
Borislav Deianov <borislav@users.sf.net>
Borislav Deianov <borislav@users.sf.net>
Henrique de Moraes Holschuh <hmh@hmh.eng.br>
Henrique de Moraes Holschuh <hmh@hmh.eng.br>
...
@@ -161,20 +161,22 @@ system. Enabling the hotkey functionality of thinkpad-acpi signals the
...
@@ -161,20 +161,22 @@ system. Enabling the hotkey functionality of thinkpad-acpi signals the
firmware that such a driver is present, and modifies how the ThinkPad
firmware that such a driver is present, and modifies how the ThinkPad
firmware will behave in many situations.
firmware will behave in many situations.
The driver enables the hot key feature automatically when loaded. The
feature can later be disabled and enabled back at runtime. The driver
will also restore the hot key feature to its previous state and mask
when it is unloaded.
When the hotkey feature is enabled and the hot key mask is set (see
When the hotkey feature is enabled and the hot key mask is set (see
below), the various hot keys either generate ACPI events in the
below), the driver will report HKEY events in the following format:
following format:
ibm/hotkey HKEY 00000080 0000xxxx
ibm/hotkey HKEY 00000080 0000xxxx
or events over the input layer. The input layer support accepts the
Some of these events refer to hot key presses, but not all.
standard IOCTLs to remap the keycodes assigned to each hotkey.
When the input device is open, the driver will suppress any ACPI hot key
The driver will generate events over the input layer for hot keys and
events that get translated into a meaningful input layer event, in order
radio switches, and over the ACPI netlink layer for other events. The
to avoid sending duplicate events to userspace. Hot keys that are
input layer support accepts the standard IOCTLs to remap the keycodes
mapped to KEY_RESERVED in the keymap are not translated, and will always
assigned to each hot key.
generate an ACPI ibm/hotkey HKEY event, and no input layer events.
The hot key bit mask allows some control over which hot keys generate
The hot key bit mask allows some control over which hot keys generate
events. If a key is "masked" (bit set to 0 in the mask), the firmware
events. If a key is "masked" (bit set to 0 in the mask), the firmware
...
@@ -256,6 +258,20 @@ sysfs notes:
...
@@ -256,6 +258,20 @@ sysfs notes:
disabled" postition, and 1 if the switch is in the
disabled" postition, and 1 if the switch is in the
"radios enabled" position.
"radios enabled" position.
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),
all hot key presses are reported both through the input
layer and also as ACPI events through procfs (but not
through netlink). If it is set to 2, hot key presses
are reported only through the input layer.
This attribute is read-only in kernels 2.6.23 or later,
and read-write on earlier kernels.
May return -EPERM (write access locked out by module
parameter) or -EACCES (read-only).
input layer notes:
input layer notes:
A Hot key is mapped to a single input layer EV_KEY event, possibly
A Hot key is mapped to a single input layer EV_KEY event, possibly
...
@@ -393,21 +409,63 @@ unknown by the driver if the ThinkPad firmware triggered these events on
...
@@ -393,21 +409,63 @@ unknown by the driver if the ThinkPad firmware triggered these events on
hot key press or release, but the firmware will do it for either one, not
hot key press or release, but the firmware will do it for either one, not
both.
both.
If a key is mapped to KEY_RESERVED, it generates no input events at all,
If a key is mapped to KEY_RESERVED, it generates no input events at all.
and it may generate a legacy thinkpad-acpi ACPI hotkey event.
If a key is mapped to KEY_UNKNOWN, it generates an input event that
If a key is mapped to KEY_UNKNOWN, it generates an input event that
includes an scan code, and it may also generate a legacy thinkpad-acpi
includes an scan code. If a key is mapped to anything else, it will
ACPI hotkey event.
generate input device EV_KEY events.
If a key is mapped to anything else, it will only generate legacy
thinkpad-acpi ACPI hotkey events if nobody has opened the input device.
Non hot-key ACPI HKEY event map:
Non hot-key ACPI HKEY event map:
0x5001 Lid closed
0x5001 Lid closed
0x5002 Lid opened
0x5002 Lid opened
0x7000 Radio Switch may have changed state
0x7000 Radio Switch may have changed state
The above events are not propagated by the driver, except for legacy
compatibility purposes when hotkey_report_mode is set to 1.
Compatibility notes:
ibm-acpi and thinkpad-acpi 0.15 (mainline kernels before 2.6.23) never
supported the input layer, and sent events over the procfs ACPI event
interface.
To avoid sending duplicate events over the input layer and the ACPI
event interface, thinkpad-acpi 0.16 implements a module parameter
(hotkey_report_mode), and also a sysfs device attribute with the same
name.
Make no mistake here: userspace is expected to switch to using the input
layer interface of thinkpad-acpi, together with the ACPI netlink event
interface in kernels 2.6.23 and later, or with the ACPI procfs event
interface in kernels 2.6.22 and earlier.
If no hotkey_report_mode module parameter is specified (or it is set to
zero), the driver defaults to mode 1 (see below), and on kernels 2.6.22
and earlier, also allows one to change the hotkey_report_mode through
sysfs. In kernels 2.6.23 and later, where the netlink ACPI event
interface is available, hotkey_report_mode cannot be changed through
sysfs (it is read-only).
If the hotkey_report_mode module parameter is set to 1 or 2, it cannot
be changed later through sysfs (any writes will return -EPERM to signal
that hotkey_report_mode was locked. On 2.6.23 and later, where
hotkey_report_mode cannot be changed at all, writes will return -EACES).
hotkey_report_mode set to 1 makes the driver export through the procfs
ACPI event interface all hot key presses (which are *also* sent to the
input layer). This is a legacy compatibility behaviour, and it is also
the default mode of operation for the driver.
hotkey_report_mode set to 2 makes the driver filter out the hot key
presses from the procfs ACPI event interface, so these events will only
be sent through the input layer. Userspace that has been updated to use
the thinkpad-acpi input layer interface should set hotkey_report_mode to
2.
Hot key press events are never sent to the ACPI netlink event interface.
Really up-to-date userspace under kernel 2.6.23 and later is to use the
netlink interface and the input layer interface, and don't bother at all
with hotkey_report_mode.
Bluetooth
Bluetooth
---------
---------
...
...
drivers/misc/Kconfig
View file @
ecfe7f09
...
@@ -202,25 +202,5 @@ config THINKPAD_ACPI_BAY
...
@@ -202,25 +202,5 @@ config THINKPAD_ACPI_BAY
If you are not sure, say Y here.
If you are not sure, say Y here.
config THINKPAD_ACPI_INPUT_ENABLED
bool "Enable input layer support by default"
depends on THINKPAD_ACPI
default n
---help---
This option enables thinkpad-acpi hot key handling over the input
layer at driver load time. When it is unset, the driver does not
enable hot key handling by default, and also starts up with a mostly
empty keymap.
This option should be enabled if you have a new enough HAL or other
userspace support that properly handles the thinkpad-acpi event
device. It auto-tunes the hot key support to those reported by the
firmware and enables it automatically.
If unsure, say N here to retain the old behaviour of ibm-acpi, and
thinkpad-acpi up to kernel 2.6.21: userspace will have to enable and
set up the thinkpad-acpi hot key handling using the sysfs interace
after loading the driver.
endif # MISC_DEVICES
endif # MISC_DEVICES
drivers/misc/thinkpad_acpi.c
View file @
ecfe7f09
...
@@ -21,7 +21,7 @@
...
@@ -21,7 +21,7 @@
* 02110-1301, USA.
* 02110-1301, USA.
*/
*/
#define IBM_VERSION "0.1
5
"
#define IBM_VERSION "0.1
6
"
#define TPACPI_SYSFS_VERSION 0x010000
#define TPACPI_SYSFS_VERSION 0x010000
/*
/*
...
@@ -906,9 +906,26 @@ static ssize_t hotkey_radio_sw_show(struct device *dev,
...
@@ -906,9 +906,26 @@ static ssize_t hotkey_radio_sw_show(struct device *dev,
static
struct
device_attribute
dev_attr_hotkey_radio_sw
=
static
struct
device_attribute
dev_attr_hotkey_radio_sw
=
__ATTR
(
hotkey_radio_sw
,
S_IRUGO
,
hotkey_radio_sw_show
,
NULL
);
__ATTR
(
hotkey_radio_sw
,
S_IRUGO
,
hotkey_radio_sw_show
,
NULL
);
/* sysfs hotkey report_mode -------------------------------------------- */
static
ssize_t
hotkey_report_mode_show
(
struct
device
*
dev
,
struct
device_attribute
*
attr
,
char
*
buf
)
{
return
snprintf
(
buf
,
PAGE_SIZE
,
"%d
\n
"
,
(
hotkey_report_mode
!=
0
)
?
hotkey_report_mode
:
1
);
}
static
struct
device_attribute
dev_attr_hotkey_report_mode
=
__ATTR
(
hotkey_report_mode
,
S_IRUGO
,
hotkey_report_mode_show
,
NULL
);
/* --------------------------------------------------------------------- */
/* --------------------------------------------------------------------- */
static
struct
attribute
*
hotkey_mask_attributes
[]
=
{
static
struct
attribute
*
hotkey_attributes
[]
__initdata
=
{
&
dev_attr_hotkey_enable
.
attr
,
&
dev_attr_hotkey_report_mode
.
attr
,
};
static
struct
attribute
*
hotkey_mask_attributes
[]
__initdata
=
{
&
dev_attr_hotkey_mask
.
attr
,
&
dev_attr_hotkey_mask
.
attr
,
&
dev_attr_hotkey_bios_enabled
.
attr
,
&
dev_attr_hotkey_bios_enabled
.
attr
,
&
dev_attr_hotkey_bios_mask
.
attr
,
&
dev_attr_hotkey_bios_mask
.
attr
,
...
@@ -987,11 +1004,12 @@ static int __init hotkey_init(struct ibm_init_struct *iibm)
...
@@ -987,11 +1004,12 @@ static int __init hotkey_init(struct ibm_init_struct *iibm)
str_supported
(
tp_features
.
hotkey
));
str_supported
(
tp_features
.
hotkey
));
if
(
tp_features
.
hotkey
)
{
if
(
tp_features
.
hotkey
)
{
hotkey_dev_attributes
=
create_attr_set
(
7
,
NULL
);
hotkey_dev_attributes
=
create_attr_set
(
8
,
NULL
);
if
(
!
hotkey_dev_attributes
)
if
(
!
hotkey_dev_attributes
)
return
-
ENOMEM
;
return
-
ENOMEM
;
res
=
add_to_attr_set
(
hotkey_dev_attributes
,
res
=
add_many_to_attr_set
(
hotkey_dev_attributes
,
&
dev_attr_hotkey_enable
.
attr
);
hotkey_attributes
,
ARRAY_SIZE
(
hotkey_attributes
));
if
(
res
)
if
(
res
)
return
res
;
return
res
;
...
@@ -1055,11 +1073,6 @@ static int __init hotkey_init(struct ibm_init_struct *iibm)
...
@@ -1055,11 +1073,6 @@ static int __init hotkey_init(struct ibm_init_struct *iibm)
TPACPI_HOTKEY_MAP_SIZE
);
TPACPI_HOTKEY_MAP_SIZE
);
}
}
#ifndef CONFIG_THINKPAD_ACPI_INPUT_ENABLED
for
(
i
=
0
;
i
<
12
;
i
++
)
hotkey_keycode_map
[
i
]
=
KEY_UNKNOWN
;
#endif
/* ! CONFIG_THINKPAD_ACPI_INPUT_ENABLED */
set_bit
(
EV_KEY
,
tpacpi_inputdev
->
evbit
);
set_bit
(
EV_KEY
,
tpacpi_inputdev
->
evbit
);
set_bit
(
EV_MSC
,
tpacpi_inputdev
->
evbit
);
set_bit
(
EV_MSC
,
tpacpi_inputdev
->
evbit
);
set_bit
(
MSC_SCAN
,
tpacpi_inputdev
->
mscbit
);
set_bit
(
MSC_SCAN
,
tpacpi_inputdev
->
mscbit
);
...
@@ -1081,14 +1094,17 @@ static int __init hotkey_init(struct ibm_init_struct *iibm)
...
@@ -1081,14 +1094,17 @@ static int __init hotkey_init(struct ibm_init_struct *iibm)
set_bit
(
SW_RADIO
,
tpacpi_inputdev
->
swbit
);
set_bit
(
SW_RADIO
,
tpacpi_inputdev
->
swbit
);
}
}
#ifdef CONFIG_THINKPAD_ACPI_INPUT_ENABLED
dbg_printk
(
TPACPI_DBG_INIT
,
dbg_printk
(
TPACPI_DBG_INIT
,
"enabling hot key handling
\n
"
);
"enabling hot key handling
\n
"
);
res
=
hotkey_set
(
1
,
(
hotkey_all_mask
&
~
hotkey_reserved_mask
)
res
=
hotkey_set
(
1
,
(
hotkey_all_mask
&
~
hotkey_reserved_mask
)
|
hotkey_orig_mask
);
|
hotkey_orig_mask
);
if
(
res
)
if
(
res
)
return
res
;
return
res
;
#endif
/* CONFIG_THINKPAD_ACPI_INPUT_ENABLED */
dbg_printk
(
TPACPI_DBG_INIT
,
"legacy hot key reporting over procfs %s
\n
"
,
(
hotkey_report_mode
<
2
)
?
"enabled"
:
"disabled"
);
}
}
return
(
tp_features
.
hotkey
)
?
0
:
1
;
return
(
tp_features
.
hotkey
)
?
0
:
1
;
...
@@ -1142,58 +1158,65 @@ static void hotkey_notify(struct ibm_struct *ibm, u32 event)
...
@@ -1142,58 +1158,65 @@ static void hotkey_notify(struct ibm_struct *ibm, u32 event)
{
{
u32
hkey
;
u32
hkey
;
unsigned
int
keycode
,
scancode
;
unsigned
int
keycode
,
scancode
;
int
send
acpi
=
1
;
int
send
_acpi_ev
=
0
;
if
(
event
==
0x80
&&
acpi_evalf
(
hkey_handle
,
&
hkey
,
"MHKP"
,
"d"
))
{
if
(
event
==
0x80
&&
acpi_evalf
(
hkey_handle
,
&
hkey
,
"MHKP"
,
"d"
))
{
if
(
tpacpi_inputdev
->
users
>
0
)
{
switch
(
hkey
>>
12
)
{
switch
(
hkey
>>
12
)
{
case
1
:
case
1
:
/* 0x1000-0x1FFF: key presses */
/* 0x1000-0x1FFF: key presses */
scancode
=
hkey
&
0xfff
;
scancode
=
hkey
&
0xfff
;
if
(
scancode
>
0
&&
scancode
<
0x21
)
{
if
(
scancode
>
0
&&
scancode
<
0x21
)
{
scancode
--
;
scancode
--
;
keycode
=
hotkey_keycode_map
[
scancode
];
keycode
=
hotkey_keycode_map
[
scancode
];
tpacpi_input_send_key
(
scancode
,
keycode
);
tpacpi_input_send_key
(
scancode
,
keycode
);
}
else
{
sendacpi
=
(
keycode
==
KEY_RESERVED
printk
(
IBM_ERR
||
keycode
==
KEY_UNKNOWN
);
"hotkey 0x%04x out of range for keyboard map
\n
"
,
}
else
{
hkey
);
printk
(
IBM_ERR
send_acpi_ev
=
1
;
"hotkey 0x%04x out of range for keyboard map
\n
"
,
}
hkey
);
break
;
}
case
5
:
break
;
/* 0x5000-0x5FFF: LID */
case
5
:
/* we don't handle it through this path, just
/* 0x5000-0x5FFF: LID */
* eat up known LID events */
/* we don't handle it through this path, just
if
(
hkey
!=
0x5001
&&
hkey
!=
0x5002
)
{
* eat up known LID events */
printk
(
IBM_ERR
if
(
hkey
!=
0x5001
&&
hkey
!=
0x5002
)
{
"unknown LID-related hotkey event: 0x%04x
\n
"
,
printk
(
IBM_ERR
hkey
);
"unknown LID-related hotkey event: 0x%04x
\n
"
,
send_acpi_ev
=
1
;
hkey
);
}
}
break
;
case
7
:
/* 0x7000-0x7FFF: misc */
if
(
tp_features
.
hotkey_wlsw
&&
hkey
==
0x7000
)
{
tpacpi_input_send_radiosw
();
break
;
break
;
case
7
:
/* 0x7000-0x7FFF: misc */
if
(
tp_features
.
hotkey_wlsw
&&
hkey
==
0x7000
)
{
tpacpi_input_send_radiosw
();
sendacpi
=
0
;
break
;
}
/* fallthrough to default */
default:
/* case 2: dock-related */
/* 0x2305 - T43 waking up due to bay lever eject while aslept */
/* case 3: ultra-bay related. maybe bay in dock? */
/* 0x3003 - T43 after wake up by bay lever eject (0x2305) */
printk
(
IBM_NOTICE
"unhandled hotkey event 0x%04x
\n
"
,
hkey
);
}
}
/* fallthrough to default */
default:
/* case 2: dock-related */
/* 0x2305 - T43 waking up due to bay lever eject while aslept */
/* case 3: ultra-bay related. maybe bay in dock? */
/* 0x3003 - T43 after wake up by bay lever eject (0x2305) */
printk
(
IBM_NOTICE
"unhandled HKEY event 0x%04x
\n
"
,
hkey
);
send_acpi_ev
=
1
;
}
}
if
(
sendacpi
)
acpi_bus_generate_proc_event
(
ibm
->
acpi
->
device
,
event
,
hkey
);
}
else
{
}
else
{
printk
(
IBM_ERR
"unknown hotkey notification event %d
\n
"
,
event
);
printk
(
IBM_ERR
"unknown hotkey notification event %d
\n
"
,
event
);
acpi_bus_generate_proc_event
(
ibm
->
acpi
->
device
,
event
,
0
);
hkey
=
0
;
send_acpi_ev
=
1
;
}
/* Legacy events */
if
(
send_acpi_ev
||
hotkey_report_mode
<
2
)
acpi_bus_generate_proc_event
(
ibm
->
acpi
->
device
,
event
,
hkey
);
/* netlink events */
if
(
send_acpi_ev
)
{
acpi_bus_generate_netlink_event
(
ibm
->
acpi
->
device
->
pnp
.
device_class
,
ibm
->
acpi
->
device
->
dev
.
bus_id
,
event
,
hkey
);
}
}
}
}
...
@@ -4623,6 +4646,9 @@ module_param_named(fan_control, fan_control_allowed, bool, 0);
...
@@ -4623,6 +4646,9 @@ module_param_named(fan_control, fan_control_allowed, bool, 0);
static
int
brightness_mode
;
static
int
brightness_mode
;
module_param_named
(
brightness_mode
,
brightness_mode
,
int
,
0
);
module_param_named
(
brightness_mode
,
brightness_mode
,
int
,
0
);
static
unsigned
int
hotkey_report_mode
;
module_param
(
hotkey_report_mode
,
uint
,
0
);
#define IBM_PARAM(feature) \
#define IBM_PARAM(feature) \
module_param_call(feature, set_ibm_param, NULL, NULL, 0)
module_param_call(feature, set_ibm_param, NULL, NULL, 0)
...
@@ -4648,6 +4674,10 @@ static int __init thinkpad_acpi_module_init(void)
...
@@ -4648,6 +4674,10 @@ static int __init thinkpad_acpi_module_init(void)
{
{
int
ret
,
i
;
int
ret
,
i
;
/* Parameter checking */
if
(
hotkey_report_mode
>
2
)
return
-
EINVAL
;
/* Driver-level probe */
/* Driver-level probe */
get_thinkpad_model_data
(
&
thinkpad_id
);
get_thinkpad_model_data
(
&
thinkpad_id
);
...
...
drivers/misc/thinkpad_acpi.h
View file @
ecfe7f09
...
@@ -181,6 +181,7 @@ static void tpacpi_remove_driver_attributes(struct device_driver *drv);
...
@@ -181,6 +181,7 @@ static void tpacpi_remove_driver_attributes(struct device_driver *drv);
static
int
experimental
;
static
int
experimental
;
static
u32
dbg_level
;
static
u32
dbg_level
;
static
int
force_load
;
static
int
force_load
;
static
unsigned
int
hotkey_report_mode
;
static
int
thinkpad_acpi_module_init
(
void
);
static
int
thinkpad_acpi_module_init
(
void
);
static
void
thinkpad_acpi_module_exit
(
void
);
static
void
thinkpad_acpi_module_exit
(
void
);
...
...
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