Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 62559
b: refs/heads/master
c: 24d3b77
h: refs/heads/master
i:
  62557: 360752a
  62555: 64f2cea
  62551: 4f5bdbb
  62543: 2c0d82c
  62527: bfed6b5
v: v3
  • Loading branch information
Henrique de Moraes Holschuh authored and Len Brown committed Jul 22, 2007
1 parent 0f6cff8 commit 8789c2d
Show file tree
Hide file tree
Showing 5 changed files with 68 additions and 10 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: d5a2f2f1d68e2da538ac28540cddd9ccc733b001
refs/heads/master: 24d3b77467b6aaf59e38dce4aa86d05541858195
6 changes: 6 additions & 0 deletions trunk/Documentation/thinkpad-acpi.txt
Original file line number Diff line number Diff line change
Expand Up @@ -860,6 +860,12 @@ cannot be controlled.
The backlight control has eight levels, ranging from 0 to 7. Some of the
levels may not be distinct.

There are two interfaces to the firmware for brightness control, EC and CMOS.
To select which one should be used, use the brightness_mode module parameter:
brightness_mode=1 selects EC mode, brightness_mode=2 selects CMOS mode,
brightness_mode=3 selects both EC and CMOS. The driver tries to autodetect
which interface to use.

Procfs notes:

The available commands are:
Expand Down
1 change: 1 addition & 0 deletions trunk/drivers/misc/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,7 @@ config THINKPAD_ACPI
depends on X86 && ACPI
select BACKLIGHT_CLASS_DEVICE
select HWMON
select NVRAM
---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
62 changes: 53 additions & 9 deletions trunk/drivers/misc/thinkpad_acpi.c
Original file line number Diff line number Diff line change
Expand Up @@ -2953,9 +2953,22 @@ static int __init brightness_init(struct ibm_init_struct *iibm)

vdbg_printk(TPACPI_DBG_INIT, "initializing brightness subdriver\n");

if (!brightness_mode) {
if (thinkpad_id.vendor == PCI_VENDOR_ID_LENOVO)
brightness_mode = 2;
else
brightness_mode = 3;

dbg_printk(TPACPI_DBG_INIT, "selected brightness_mode=%d\n",
brightness_mode);
}

if (brightness_mode > 3)
return -EINVAL;

b = brightness_get(NULL);
if (b < 0)
return b;
return 1;

ibm_backlight_device = backlight_device_register(
TPACPI_BACKLIGHT_DEV_NAME, NULL, NULL,
Expand Down Expand Up @@ -2991,13 +3004,35 @@ static int brightness_update_status(struct backlight_device *bd)
bd->props.brightness : 0);
}

/*
* ThinkPads can read brightness from two places: EC 0x31, or
* CMOS NVRAM byte 0x5E, bits 0-3.
*/
static int brightness_get(struct backlight_device *bd)
{
u8 level;
if (!acpi_ec_read(brightness_offset, &level))
return -EIO;
u8 lec = 0, lcmos = 0, level = 0;

level &= 0x7;
if (brightness_mode & 1) {
if (!acpi_ec_read(brightness_offset, &lec))
return -EIO;
lec &= 7;
level = lec;
};
if (brightness_mode & 2) {
lcmos = (nvram_read_byte(TP_NVRAM_ADDR_BRIGHTNESS)
& TP_NVRAM_MASK_LEVEL_BRIGHTNESS)
>> TP_NVRAM_POS_LEVEL_BRIGHTNESS;
level = lcmos;
}

if (brightness_mode == 3 && lec != lcmos) {
printk(IBM_ERR
"CMOS NVRAM (%u) and EC (%u) do not agree "
"on display brightness level\n",
(unsigned int) lcmos,
(unsigned int) lec);
return -EIO;
}

return level;
}
Expand All @@ -3007,14 +3042,20 @@ static int brightness_set(int value)
int cmos_cmd, inc, i;
int current_value = brightness_get(NULL);

value &= 7;
if (value > 7)
return -EINVAL;

cmos_cmd = value > current_value ? TP_CMOS_BRIGHTNESS_UP : TP_CMOS_BRIGHTNESS_DOWN;
cmos_cmd = value > current_value ?
TP_CMOS_BRIGHTNESS_UP :
TP_CMOS_BRIGHTNESS_DOWN;
inc = value > current_value ? 1 : -1;

for (i = current_value; i != value; i += inc) {
if (issue_thinkpad_cmos_command(cmos_cmd))
if ((brightness_mode & 2) &&
issue_thinkpad_cmos_command(cmos_cmd))
return -EIO;
if (!acpi_ec_write(brightness_offset, i + inc))
if ((brightness_mode & 1) &&
!acpi_ec_write(brightness_offset, i + inc))
return -EIO;
}

Expand Down Expand Up @@ -4485,6 +4526,9 @@ module_param(force_load, bool, 0);
static int fan_control_allowed;
module_param_named(fan_control, fan_control_allowed, bool, 0);

static int brightness_mode;
module_param_named(brightness_mode, brightness_mode, int, 0);

#define IBM_PARAM(feature) \
module_param_call(feature, set_ibm_param, NULL, NULL, 0)

Expand Down
7 changes: 7 additions & 0 deletions trunk/drivers/misc/thinkpad_acpi.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
#include <linux/list.h>
#include <linux/mutex.h>

#include <linux/nvram.h>
#include <linux/proc_fs.h>
#include <linux/sysfs.h>
#include <linux/backlight.h>
Expand Down Expand Up @@ -80,6 +81,11 @@
#define TP_CMOS_BRIGHTNESS_UP 4
#define TP_CMOS_BRIGHTNESS_DOWN 5

/* ThinkPad CMOS NVRAM constants */
#define TP_NVRAM_ADDR_BRIGHTNESS 0x5e
#define TP_NVRAM_MASK_LEVEL_BRIGHTNESS 0x07
#define TP_NVRAM_POS_LEVEL_BRIGHTNESS 0

#define onoff(status,bit) ((status) & (1 << (bit)) ? "on" : "off")
#define enabled(status,bit) ((status) & (1 << (bit)) ? "enabled" : "disabled")
#define strlencmp(a,b) (strncmp((a), (b), strlen(b)))
Expand Down Expand Up @@ -323,6 +329,7 @@ static int bluetooth_write(char *buf);

static struct backlight_device *ibm_backlight_device;
static int brightness_offset = 0x31;
static int brightness_mode;

static int brightness_init(struct ibm_init_struct *iibm);
static void brightness_exit(void);
Expand Down

0 comments on commit 8789c2d

Please sign in to comment.