Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 95537
b: refs/heads/master
c: 78eed02
h: refs/heads/master
i:
  95535: d1f2cf8
v: v3
  • Loading branch information
Dmitry Torokhov authored and Len Brown committed Apr 29, 2008
1 parent 4448dc2 commit f548835
Show file tree
Hide file tree
Showing 5 changed files with 238 additions and 729 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 68f12ae5d778279e13e406d3913c74c592307770
refs/heads/master: 78eed028f13b1a0b2612368dff3786e400e6cf8b
139 changes: 17 additions & 122 deletions trunk/Documentation/laptops/thinkpad-acpi.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
ThinkPad ACPI Extras Driver

Version 0.20
April 09th, 2008
Version 0.19
January 06th, 2008

Borislav Deianov <borislav@users.sf.net>
Henrique de Moraes Holschuh <hmh@hmh.eng.br>
Expand All @@ -18,11 +18,6 @@ This driver used to be named ibm-acpi until kernel 2.6.21 and release
moved to the drivers/misc tree and renamed to thinkpad-acpi for kernel
2.6.22, and release 0.14.

The driver is named "thinkpad-acpi". In some places, like module
names, "thinkpad_acpi" is used because of userspace issues.

"tpacpi" is used as a shorthand where "thinkpad-acpi" would be too
long due to length limitations on some Linux kernel versions.

Status
------
Expand Down Expand Up @@ -576,47 +571,6 @@ netlink interface and the input layer interface, and don't bother at all
with hotkey_report_mode.


Brightness hotkey notes:

These are the current sane choices for brightness key mapping in
thinkpad-acpi:

For IBM and Lenovo models *without* ACPI backlight control (the ones on
which thinkpad-acpi will autoload its backlight interface by default,
and on which ACPI video does not export a backlight interface):

1. Don't enable or map the brightness hotkeys in thinkpad-acpi, as
these older firmware versions unfortunately won't respect the hotkey
mask for brightness keys anyway, and always reacts to them. This
usually work fine, unless X.org drivers are doing something to block
the BIOS. In that case, use (3) below. This is the default mode of
operation.

2. Enable the hotkeys, but map them to something else that is NOT
KEY_BRIGHTNESS_UP/DOWN or any other keycode that would cause
userspace to try to change the backlight level, and use that as an
on-screen-display hint.

3. IF AND ONLY IF X.org drivers find a way to block the firmware from
automatically changing the brightness, enable the hotkeys and map
them to KEY_BRIGHTNESS_UP and KEY_BRIGHTNESS_DOWN, and feed that to
something that calls xbacklight. thinkpad-acpi will not be able to
change brightness in that case either, so you should disable its
backlight interface.

For Lenovo models *with* ACPI backlight control:

1. Load up ACPI video and use that. ACPI video will report ACPI
events for brightness change keys. Do not mess with thinkpad-acpi
defaults in this case. thinkpad-acpi should not have anything to do
with backlight events in a scenario where ACPI video is loaded:
brightness hotkeys must be disabled, and the backlight interface is
to be kept disabled as well. This is the default mode of operation.

2. Do *NOT* load up ACPI video, enable the hotkeys in thinkpad-acpi,
and map them to KEY_BRIGHTNESS_UP and KEY_BRIGHTNESS_DOWN. Process
these keys on userspace somehow (e.g. by calling xbacklight).

Bluetooth
---------

Expand Down Expand Up @@ -693,31 +647,16 @@ while others are still having problems. For more information:

https://bugs.freedesktop.org/show_bug.cgi?id=2000

ThinkLight control
------------------

procfs: /proc/acpi/ibm/light
sysfs attributes: as per LED class, for the "tpacpi::thinklight" LED

procfs notes:
ThinkLight control -- /proc/acpi/ibm/light
------------------------------------------

The ThinkLight status can be read and set through the procfs interface. A
few models which do not make the status available will show the ThinkLight
status as "unknown". The available commands are:
The current status of the ThinkLight can be found in this file. A few
models which do not make the status available will show it as
"unknown". The available commands are:

echo on > /proc/acpi/ibm/light
echo off > /proc/acpi/ibm/light

sysfs notes:

The ThinkLight sysfs interface is documented by the LED class
documentation, in Documentation/leds-class.txt. The ThinkLight LED name
is "tpacpi::thinklight".

Due to limitations in the sysfs LED class, if the status of the thinklight
cannot be read or if it is unknown, thinkpad-acpi will report it as "off".
It is impossible to know if the status returned through sysfs is valid.

Docking / undocking -- /proc/acpi/ibm/dock
------------------------------------------

Expand Down Expand Up @@ -876,63 +815,28 @@ The cmos command interface is prone to firmware split-brain problems, as
in newer ThinkPads it is just a compatibility layer. Do not use it, it is
exported just as a debug tool.

LED control
-----------

procfs: /proc/acpi/ibm/led
sysfs attributes: as per LED class, see below for names

Some of the LED indicators can be controlled through this feature. On
some older ThinkPad models, it is possible to query the status of the
LED indicators as well. Newer ThinkPads cannot query the real status
of the LED indicators.
LED control -- /proc/acpi/ibm/led
---------------------------------

procfs notes:

The available commands are:
Some of the LED indicators can be controlled through this feature. The
available commands are:

echo '<LED number> on' >/proc/acpi/ibm/led
echo '<LED number> off' >/proc/acpi/ibm/led
echo '<LED number> blink' >/proc/acpi/ibm/led
echo '<led number> on' >/proc/acpi/ibm/led
echo '<led number> off' >/proc/acpi/ibm/led
echo '<led number> blink' >/proc/acpi/ibm/led

The <LED number> range is 0 to 7. The set of LEDs that can be
controlled varies from model to model. Here is the common ThinkPad
mapping:
The <led number> range is 0 to 7. The set of LEDs that can be
controlled varies from model to model. Here is the mapping on the X40:

0 - power
1 - battery (orange)
2 - battery (green)
3 - UltraBase/dock
3 - UltraBase
4 - UltraBay
5 - UltraBase battery slot
6 - (unknown)
7 - standby

All of the above can be turned on and off and can be made to blink.

sysfs notes:

The ThinkPad LED sysfs interface is described in detail by the LED class
documentation, in Documentation/leds-class.txt.

The leds are named (in LED ID order, from 0 to 7):
"tpacpi::power", "tpacpi:orange:batt", "tpacpi:green:batt",
"tpacpi::dock_active", "tpacpi::bay_active", "tpacpi::dock_batt",
"tpacpi::unknown_led", "tpacpi::standby".

Due to limitations in the sysfs LED class, if the status of the LED
indicators cannot be read due to an error, thinkpad-acpi will report it as
a brightness of zero (same as LED off).

If the thinkpad firmware doesn't support reading the current status,
trying to read the current LED brightness will just return whatever
brightness was last written to that attribute.

These LEDs can blink using hardware acceleration. To request that a
ThinkPad indicator LED should blink in hardware accelerated mode, use the
"timer" trigger, and leave the delay_on and delay_off parameters set to
zero (to request hardware acceleration autodetection).

ACPI sounds -- /proc/acpi/ibm/beep
----------------------------------

Expand Down Expand Up @@ -1186,15 +1090,6 @@ it there will be the following attributes:
dim the display.


WARNING:

Whatever you do, do NOT ever call thinkpad-acpi backlight-level change
interface and the ACPI-based backlight level change interface
(available on newer BIOSes, and driven by the Linux ACPI video driver)
at the same time. The two will interact in bad ways, do funny things,
and maybe reduce the life of the backlight lamps by needlessly kicking
its level up and down at every change.

Volume control -- /proc/acpi/ibm/volume
---------------------------------------

Expand Down
58 changes: 27 additions & 31 deletions trunk/drivers/acpi/video.c
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,6 @@
#define ACPI_VIDEO_NOTIFY_ZERO_BRIGHTNESS 0x88
#define ACPI_VIDEO_NOTIFY_DISPLAY_OFF 0x89

#define ACPI_VIDEO_HEAD_INVALID (~0u - 1)
#define ACPI_VIDEO_HEAD_END (~0u)
#define MAX_NAME_LEN 20

#define ACPI_VIDEO_DISPLAY_CRT 1
Expand Down Expand Up @@ -1440,11 +1438,15 @@ static int acpi_video_bus_remove_fs(struct acpi_device *device)
static struct acpi_video_device_attrib*
acpi_video_get_device_attr(struct acpi_video_bus *video, unsigned long device_id)
{
int count;
struct acpi_video_enumerated_device *ids;
int i;

for (i = 0; i < video->attached_count; i++) {
ids = &video->attached_array[i];
if ((ids->value.int_val & 0xffff) == device_id)
return &ids->value.attrib;
}

for(count = 0; count < video->attached_count; count++)
if((video->attached_array[count].value.int_val & 0xffff) == device_id)
return &(video->attached_array[count].value.attrib);
return NULL;
}

Expand Down Expand Up @@ -1571,20 +1573,16 @@ static void
acpi_video_device_bind(struct acpi_video_bus *video,
struct acpi_video_device *device)
{
struct acpi_video_enumerated_device *ids;
int i;

#define IDS_VAL(i) video->attached_array[i].value.int_val
#define IDS_BIND(i) video->attached_array[i].bind_info

for (i = 0; IDS_VAL(i) != ACPI_VIDEO_HEAD_INVALID &&
i < video->attached_count; i++) {
if (device->device_id == (IDS_VAL(i) & 0xffff)) {
IDS_BIND(i) = device;
for (i = 0; i < video->attached_count; i++) {
ids = &video->attached_array[i];
if (device->device_id == (ids->value.int_val & 0xffff)) {
ids->bind_info = device;
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "device_bind %d\n", i));
}
}
#undef IDS_VAL
#undef IDS_BIND
}

/*
Expand All @@ -1603,7 +1601,7 @@ static int acpi_video_device_enumerate(struct acpi_video_bus *video)
int status;
int count;
int i;
struct acpi_video_enumerated_device *active_device_list;
struct acpi_video_enumerated_device *active_list;
struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
union acpi_object *dod = NULL;
union acpi_object *obj;
Expand All @@ -1624,13 +1622,10 @@ static int acpi_video_device_enumerate(struct acpi_video_bus *video)
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found %d video heads in _DOD\n",
dod->package.count));

active_device_list = kmalloc((1 +
dod->package.count) *
sizeof(struct
acpi_video_enumerated_device),
GFP_KERNEL);

if (!active_device_list) {
active_list = kcalloc(1 + dod->package.count,
sizeof(struct acpi_video_enumerated_device),
GFP_KERNEL);
if (!active_list) {
status = -ENOMEM;
goto out;
}
Expand All @@ -1640,23 +1635,24 @@ static int acpi_video_device_enumerate(struct acpi_video_bus *video)
obj = &dod->package.elements[i];

if (obj->type != ACPI_TYPE_INTEGER) {
printk(KERN_ERR PREFIX "Invalid _DOD data\n");
active_device_list[i].value.int_val =
ACPI_VIDEO_HEAD_INVALID;
printk(KERN_ERR PREFIX
"Invalid _DOD data in element %d\n", i);
continue;
}
active_device_list[i].value.int_val = obj->integer.value;
active_device_list[i].bind_info = NULL;

active_list[count].value.int_val = obj->integer.value;
active_list[count].bind_info = NULL;
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "dod element[%d] = %d\n", i,
(int)obj->integer.value));
count++;
}
active_device_list[count].value.int_val = ACPI_VIDEO_HEAD_END;

kfree(video->attached_array);

video->attached_array = active_device_list;
video->attached_array = active_list;
video->attached_count = count;
out:

out:
kfree(buffer.pointer);
return status;
}
Expand Down
5 changes: 1 addition & 4 deletions trunk/drivers/misc/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -241,13 +241,10 @@ config SONYPI_COMPAT
config THINKPAD_ACPI
tristate "ThinkPad ACPI Laptop Extras"
depends on X86 && ACPI
select BACKLIGHT_LCD_SUPPORT
select BACKLIGHT_CLASS_DEVICE
select HWMON
select NVRAM
select INPUT
select NEW_LEDS
select LEDS_CLASS
depends on INPUT
---help---
This is a driver for the IBM and Lenovo ThinkPad laptops. It adds
support for Fn-Fx key combinations, Bluetooth control, video
Expand Down
Loading

0 comments on commit f548835

Please sign in to comment.