aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/misc
diff options
context:
space:
mode:
authorHenrique de Moraes Holschuh <hmh@hmh.eng.br>2007-10-30 15:46:22 -0400
committerLen Brown <len.brown@intel.com>2007-11-05 13:07:11 -0500
commite11e211a0b21bbb625fac2056bdb54dd02020556 (patch)
treec3ac4b86432138f467190c7bad40fae68b4cda6a /drivers/misc
parent87cc537a54fc017d998cf603f5fab9ca4a85d668 (diff)
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: Henrique de Moraes Holschuh <hmh@hmh.eng.br> Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/misc')
-rw-r--r--drivers/misc/thinkpad_acpi.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/drivers/misc/thinkpad_acpi.c b/drivers/misc/thinkpad_acpi.c
index 56a21e6b80a9..109bd2750439 100644
--- a/drivers/misc/thinkpad_acpi.c
+++ b/drivers/misc/thinkpad_acpi.c
@@ -3174,6 +3174,39 @@ static int __init brightness_check_levels(void)
3174 return (ACPI_SUCCESS(status) && found_node != NULL); 3174 return (ACPI_SUCCESS(status) && found_node != NULL);
3175} 3175}
3176 3176
3177static acpi_status __init brightness_find_bcl(acpi_handle handle, u32 lvl,
3178 void *context, void **rv)
3179{
3180 char name[ACPI_PATH_SEGMENT_LENGTH];
3181 struct acpi_buffer buffer = { sizeof(name), &name };
3182
3183 if (ACPI_SUCCESS(acpi_get_name(handle, ACPI_SINGLE_NAME, &buffer)) &&
3184 !strncmp("_BCL", name, sizeof(name) - 1)) {
3185 *rv = handle;
3186 return AE_CTRL_TERMINATE;
3187 } else {
3188 return AE_OK;
3189 }
3190}
3191
3192static int __init brightness_check_std_acpi_support(void)
3193{
3194 int status;
3195 void *found_node = NULL;
3196
3197 if (!vid_handle) {
3198 IBM_ACPIHANDLE_INIT(vid);
3199 }
3200 if (!vid_handle)
3201 return 0;
3202
3203 /* Search for a _BCL method, but don't execute it */
3204 status = acpi_walk_namespace(ACPI_TYPE_METHOD, vid_handle, 3,
3205 brightness_find_bcl, NULL, &found_node);
3206
3207 return (ACPI_SUCCESS(status) && found_node != NULL);
3208}
3209
3177static int __init brightness_init(struct ibm_init_struct *iibm) 3210static int __init brightness_init(struct ibm_init_struct *iibm)
3178{ 3211{
3179 int b; 3212 int b;
@@ -3186,6 +3219,12 @@ static int __init brightness_init(struct ibm_init_struct *iibm)
3186 dbg_printk(TPACPI_DBG_INIT, 3219 dbg_printk(TPACPI_DBG_INIT,
3187 "brightness support disabled by module parameter\n"); 3220 "brightness support disabled by module parameter\n");
3188 return 1; 3221 return 1;
3222 } else if (brightness_enable > 1) {
3223 if (brightness_check_std_acpi_support()) {
3224 printk(IBM_NOTICE
3225 "standard ACPI backlight interface available, not loading native one...\n");
3226 return 1;
3227 }
3189 } 3228 }
3190 3229
3191 if (!brightness_mode) { 3230 if (!brightness_mode) {