提交 e11e211a 编写于 作者: H Henrique de Moraes Holschuh 提交者: Len Brown

ACPI: thinkpad-acpi: prefer standard ACPI backlight level control

Newer Lenovo BIOSes support the standard ACPI backlight brightness
interface (_BCM, _BQC, _BCL).  It should be used instead of the native
thinkpad backlight brightness control interface when possible.

This patch disables the native brightness support in the driver by default
when we detect that the standard ACPI interface is available.  The local
admin can still enable it using the module parameter "brightness_enable".

Note that we need to detect the standard ACPI backlight interface only in
boxes for which we would load the native backlight interface in the first
place, and that no ThinkPad BIOS has _BCL but misses the other methods, so
the detection routines can be really simple.
Signed-off-by: NHenrique de Moraes Holschuh <hmh@hmh.eng.br>
Signed-off-by: NLen Brown <len.brown@intel.com>
上级 87cc537a
...@@ -942,11 +942,15 @@ and CMOS. The driver tries to autodetect which interface to use. ...@@ -942,11 +942,15 @@ and CMOS. The driver tries to autodetect which interface to use.
When display backlight brightness controls are available through the When display backlight brightness controls are available through the
standard ACPI interface, it is best to use it instead of this direct standard ACPI interface, it is best to use it instead of this direct
ThinkPad-specific interface. ThinkPad-specific interface. The driver will disable its native
backlight brightness control interface if it detects that the standard
ACPI interface is available in the ThinkPad.
The brightness_enable module parameter can be used to control whether The brightness_enable module parameter can be used to control whether
the LCD brightness control feature will be enabled when available. the LCD brightness control feature will be enabled when available.
brightness_enable=0 forces it to be disabled. brightness_enable=0 forces it to be disabled. brightness_enable=1
forces it to be enabled when available, even if the standard ACPI
interface is also available.
Procfs notes: Procfs notes:
......
...@@ -3174,6 +3174,39 @@ static int __init brightness_check_levels(void) ...@@ -3174,6 +3174,39 @@ static int __init brightness_check_levels(void)
return (ACPI_SUCCESS(status) && found_node != NULL); return (ACPI_SUCCESS(status) && found_node != NULL);
} }
static acpi_status __init brightness_find_bcl(acpi_handle handle, u32 lvl,
void *context, void **rv)
{
char name[ACPI_PATH_SEGMENT_LENGTH];
struct acpi_buffer buffer = { sizeof(name), &name };
if (ACPI_SUCCESS(acpi_get_name(handle, ACPI_SINGLE_NAME, &buffer)) &&
!strncmp("_BCL", name, sizeof(name) - 1)) {
*rv = handle;
return AE_CTRL_TERMINATE;
} else {
return AE_OK;
}
}
static int __init brightness_check_std_acpi_support(void)
{
int status;
void *found_node = NULL;
if (!vid_handle) {
IBM_ACPIHANDLE_INIT(vid);
}
if (!vid_handle)
return 0;
/* Search for a _BCL method, but don't execute it */
status = acpi_walk_namespace(ACPI_TYPE_METHOD, vid_handle, 3,
brightness_find_bcl, NULL, &found_node);
return (ACPI_SUCCESS(status) && found_node != NULL);
}
static int __init brightness_init(struct ibm_init_struct *iibm) static int __init brightness_init(struct ibm_init_struct *iibm)
{ {
int b; int b;
...@@ -3186,6 +3219,12 @@ static int __init brightness_init(struct ibm_init_struct *iibm) ...@@ -3186,6 +3219,12 @@ static int __init brightness_init(struct ibm_init_struct *iibm)
dbg_printk(TPACPI_DBG_INIT, dbg_printk(TPACPI_DBG_INIT,
"brightness support disabled by module parameter\n"); "brightness support disabled by module parameter\n");
return 1; return 1;
} else if (brightness_enable > 1) {
if (brightness_check_std_acpi_support()) {
printk(IBM_NOTICE
"standard ACPI backlight interface available, not loading native one...\n");
return 1;
}
} }
if (!brightness_mode) { if (!brightness_mode) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册