diff options
| author | Henrique de Moraes Holschuh <hmh@hmh.eng.br> | 2009-08-01 11:04:20 -0400 |
|---|---|---|
| committer | Len Brown <len.brown@intel.com> | 2009-08-01 23:55:53 -0400 |
| commit | 59fe4fe34d7afdf63208124f313be9056feaa2f4 (patch) | |
| tree | 519c227b9f27509ac2ce03de9e6d271698536375 | |
| parent | 5b05d4696d38c3172e79e855cc1e2ed044589508 (diff) | |
thinkpad-acpi: fix incorrect use of TPACPI_BRGHT_MODE_ECNVRAM
HBRV-based default selection of backlight control strategy didn't work
well, at least the X41 defines it but doesn't use it and I don't think
it will stop there.
Switch to a white/blacklist. All models that have HBRV defined have
been included in the list, and initially all ATI GPUs will get
ECNVRAM, and the Intel GPUs will get UCMS_STEP.
Symptoms of incorrect backlight mode selection are:
1. Non-working backlight control through sysfs;
2. Backlight gets reset to the lowest level at every shutdown, reboot
and when thinkpad-acpi gets unloaded;
This fixes a regression in 2.6.30, bugzilla #13826
Signed-off-by: Henrique de Moraes Holschuh <hmh@hmh.eng.br>
Reported-by: Tobias Diedrich <ranma+kernel@tdiedrich.de>
Cc: stable@kernel.org
Signed-off-by: Len Brown <len.brown@intel.com>
| -rw-r--r-- | drivers/platform/x86/thinkpad_acpi.c | 61 |
1 files changed, 47 insertions, 14 deletions
diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c index 18f9ee63c50a..e85600852502 100644 --- a/drivers/platform/x86/thinkpad_acpi.c +++ b/drivers/platform/x86/thinkpad_acpi.c | |||
| @@ -5642,14 +5642,48 @@ static struct backlight_ops ibm_backlight_data = { | |||
| 5642 | 5642 | ||
| 5643 | /* --------------------------------------------------------------------- */ | 5643 | /* --------------------------------------------------------------------- */ |
| 5644 | 5644 | ||
| 5645 | /* | ||
| 5646 | * These are only useful for models that have only one possibility | ||
| 5647 | * of GPU. If the BIOS model handles both ATI and Intel, don't use | ||
| 5648 | * these quirks. | ||
| 5649 | */ | ||
| 5650 | #define TPACPI_BRGHT_Q_NOEC 0x0001 /* Must NOT use EC HBRV */ | ||
| 5651 | #define TPACPI_BRGHT_Q_EC 0x0002 /* Should or must use EC HBRV */ | ||
| 5652 | #define TPACPI_BRGHT_Q_ASK 0x8000 /* Ask for user report */ | ||
| 5653 | |||
| 5654 | static const struct tpacpi_quirk brightness_quirk_table[] __initconst = { | ||
| 5655 | /* Models with ATI GPUs known to require ECNVRAM mode */ | ||
| 5656 | TPACPI_Q_IBM('1', 'Y', TPACPI_BRGHT_Q_EC), /* T43/p ATI */ | ||
| 5657 | |||
| 5658 | /* Models with ATI GPUs (waiting confirmation) */ | ||
| 5659 | TPACPI_Q_IBM('1', 'R', TPACPI_BRGHT_Q_ASK|TPACPI_BRGHT_Q_EC), | ||
| 5660 | TPACPI_Q_IBM('1', 'Q', TPACPI_BRGHT_Q_ASK|TPACPI_BRGHT_Q_EC), | ||
| 5661 | TPACPI_Q_IBM('7', '6', TPACPI_BRGHT_Q_ASK|TPACPI_BRGHT_Q_EC), | ||
| 5662 | TPACPI_Q_IBM('7', '8', TPACPI_BRGHT_Q_ASK|TPACPI_BRGHT_Q_EC), | ||
| 5663 | |||
| 5664 | /* Models with Intel Extreme Graphics 2 (waiting confirmation) */ | ||
| 5665 | TPACPI_Q_IBM('1', 'V', TPACPI_BRGHT_Q_ASK|TPACPI_BRGHT_Q_NOEC), | ||
| 5666 | TPACPI_Q_IBM('1', 'W', TPACPI_BRGHT_Q_ASK|TPACPI_BRGHT_Q_NOEC), | ||
| 5667 | TPACPI_Q_IBM('1', 'U', TPACPI_BRGHT_Q_ASK|TPACPI_BRGHT_Q_NOEC), | ||
| 5668 | |||
| 5669 | /* Models with Intel GMA900 */ | ||
| 5670 | TPACPI_Q_IBM('7', '0', TPACPI_BRGHT_Q_NOEC), /* T43, R52 */ | ||
| 5671 | TPACPI_Q_IBM('7', '4', TPACPI_BRGHT_Q_NOEC), /* X41 */ | ||
| 5672 | TPACPI_Q_IBM('7', '5', TPACPI_BRGHT_Q_NOEC), /* X41 Tablet */ | ||
| 5673 | }; | ||
| 5674 | |||
| 5645 | static int __init brightness_init(struct ibm_init_struct *iibm) | 5675 | static int __init brightness_init(struct ibm_init_struct *iibm) |
| 5646 | { | 5676 | { |
| 5647 | int b; | 5677 | int b; |
| 5678 | unsigned long quirks; | ||
| 5648 | 5679 | ||
| 5649 | vdbg_printk(TPACPI_DBG_INIT, "initializing brightness subdriver\n"); | 5680 | vdbg_printk(TPACPI_DBG_INIT, "initializing brightness subdriver\n"); |
| 5650 | 5681 | ||
| 5651 | mutex_init(&brightness_mutex); | 5682 | mutex_init(&brightness_mutex); |
| 5652 | 5683 | ||
| 5684 | quirks = tpacpi_check_quirks(brightness_quirk_table, | ||
| 5685 | ARRAY_SIZE(brightness_quirk_table)); | ||
| 5686 | |||
| 5653 | /* | 5687 | /* |
| 5654 | * We always attempt to detect acpi support, so as to switch | 5688 | * We always attempt to detect acpi support, so as to switch |
| 5655 | * Lenovo Vista BIOS to ACPI brightness mode even if we are not | 5689 | * Lenovo Vista BIOS to ACPI brightness mode even if we are not |
| @@ -5706,23 +5740,13 @@ static int __init brightness_init(struct ibm_init_struct *iibm) | |||
| 5706 | /* TPACPI_BRGHT_MODE_AUTO not implemented yet, just use default */ | 5740 | /* TPACPI_BRGHT_MODE_AUTO not implemented yet, just use default */ |
| 5707 | if (brightness_mode == TPACPI_BRGHT_MODE_AUTO || | 5741 | if (brightness_mode == TPACPI_BRGHT_MODE_AUTO || |
| 5708 | brightness_mode == TPACPI_BRGHT_MODE_MAX) { | 5742 | brightness_mode == TPACPI_BRGHT_MODE_MAX) { |
| 5709 | if (thinkpad_id.vendor == PCI_VENDOR_ID_IBM) { | 5743 | if (quirks & TPACPI_BRGHT_Q_EC) |
| 5710 | /* | 5744 | brightness_mode = TPACPI_BRGHT_MODE_ECNVRAM; |
| 5711 | * IBM models that define HBRV probably have | 5745 | else |
| 5712 | * EC-based backlight level control | ||
| 5713 | */ | ||
| 5714 | if (acpi_evalf(ec_handle, NULL, "HBRV", "qd")) | ||
| 5715 | /* T40-T43, R50-R52, R50e, R51e, X31-X41 */ | ||
| 5716 | brightness_mode = TPACPI_BRGHT_MODE_ECNVRAM; | ||
| 5717 | else | ||
| 5718 | /* all other IBM ThinkPads */ | ||
| 5719 | brightness_mode = TPACPI_BRGHT_MODE_UCMS_STEP; | ||
| 5720 | } else | ||
| 5721 | /* All Lenovo ThinkPads */ | ||
| 5722 | brightness_mode = TPACPI_BRGHT_MODE_UCMS_STEP; | 5746 | brightness_mode = TPACPI_BRGHT_MODE_UCMS_STEP; |
| 5723 | 5747 | ||
| 5724 | dbg_printk(TPACPI_DBG_BRGHT, | 5748 | dbg_printk(TPACPI_DBG_BRGHT, |
| 5725 | "selected brightness_mode=%d\n", | 5749 | "driver auto-selected brightness_mode=%d\n", |
| 5726 | brightness_mode); | 5750 | brightness_mode); |
| 5727 | } | 5751 | } |
| 5728 | 5752 | ||
| @@ -5749,6 +5773,15 @@ static int __init brightness_init(struct ibm_init_struct *iibm) | |||
| 5749 | vdbg_printk(TPACPI_DBG_INIT | TPACPI_DBG_BRGHT, | 5773 | vdbg_printk(TPACPI_DBG_INIT | TPACPI_DBG_BRGHT, |
| 5750 | "brightness is supported\n"); | 5774 | "brightness is supported\n"); |
| 5751 | 5775 | ||
| 5776 | if (quirks & TPACPI_BRGHT_Q_ASK) { | ||
| 5777 | printk(TPACPI_NOTICE | ||
| 5778 | "brightness: will use unverified default: " | ||
| 5779 | "brightness_mode=%d\n", brightness_mode); | ||
| 5780 | printk(TPACPI_NOTICE | ||
| 5781 | "brightness: please report to %s whether it works well " | ||
| 5782 | "or not on your ThinkPad\n", TPACPI_MAIL); | ||
| 5783 | } | ||
| 5784 | |||
| 5752 | ibm_backlight_device->props.max_brightness = | 5785 | ibm_backlight_device->props.max_brightness = |
| 5753 | (tp_features.bright_16levels)? 15 : 7; | 5786 | (tp_features.bright_16levels)? 15 : 7; |
| 5754 | ibm_backlight_device->props.brightness = b & TP_EC_BACKLIGHT_LVLMSK; | 5787 | ibm_backlight_device->props.brightness = b & TP_EC_BACKLIGHT_LVLMSK; |
