From b9259f0b0261d9ef109c1c08bfb59531af90e33e Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Fri, 2 Oct 2009 09:35:45 -0700 Subject: [PATCH] .30 patch added --- review-2.6.30/series | 1 + ...ect-use-of-tpacpi_brght_mode_ecnvram.patch | 166 ++++++++++++++++++ 2 files changed, 167 insertions(+) create mode 100644 review-2.6.30/thinkpad-acpi-fix-incorrect-use-of-tpacpi_brght_mode_ecnvram.patch diff --git a/review-2.6.30/series b/review-2.6.30/series index c0e44d60a96..406a06d837d 100644 --- a/review-2.6.30/series +++ b/review-2.6.30/series @@ -28,3 +28,4 @@ powerpc-fix-incorrect-setting-of-__have_arch_pte_special.patch proc-kcore-work-around-a-bug.patch pm-pcmcia-drop-second-argument-of-pcmcia_socket_dev_suspend.patch pm-yenta-fix-cardbus-suspend-resume-regression.patch +thinkpad-acpi-fix-incorrect-use-of-tpacpi_brght_mode_ecnvram.patch diff --git a/review-2.6.30/thinkpad-acpi-fix-incorrect-use-of-tpacpi_brght_mode_ecnvram.patch b/review-2.6.30/thinkpad-acpi-fix-incorrect-use-of-tpacpi_brght_mode_ecnvram.patch new file mode 100644 index 00000000000..6f78bc71e75 --- /dev/null +++ b/review-2.6.30/thinkpad-acpi-fix-incorrect-use-of-tpacpi_brght_mode_ecnvram.patch @@ -0,0 +1,166 @@ +From hmh@hmh.eng.br Fri Oct 2 09:07:50 2009 +From: Henrique de Moraes Holschuh +Date: Fri, 25 Sep 2009 21:57:33 -0300 +Subject: thinkpad-acpi: fix incorrect use of TPACPI_BRGHT_MODE_ECNVRAM +To: stable@kernel.org +Cc: linux-acpi@vger.kernel.org, ibm-acpi-devel@lists.sourceforge.net +Message-ID: <1253926653-6147-1-git-send-email-hmh@hmh.eng.br> + +From: Henrique de Moraes Holschuh + +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 blacklist, and make sure only Radeon- +based models get ECNVRAM. + +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. This fix is +already present on 2.6.31. + +This is a minimal patch for 2.6.30-stable, based on mainline +commits: 050df107c408a3df048524b3783a5fc6d4dccfdb, + 7d95a3d564901e88ed42810f054e579874151999, + 59fe4fe34d7afdf63208124f313be9056feaa2f4, + 6da25bf51689a5cc60370d30275dbb9e6852e0cb + +Signed-off-by: Henrique de Moraes Holschuh +Reported-by: Tobias Diedrich +Reported-by: Robert de Rooy +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/platform/x86/thinkpad_acpi.c | 74 ++++++++++++++++++++++++++++------- + 1 file changed, 61 insertions(+), 13 deletions(-) + +--- a/drivers/platform/x86/thinkpad_acpi.c ++++ b/drivers/platform/x86/thinkpad_acpi.c +@@ -286,6 +286,8 @@ struct thinkpad_id_data { + + u16 bios_model; /* Big Endian, TP-1Y = 0x5931, 0 = unknown */ + u16 ec_model; ++ u16 bios_release; /* 1ZETK1WW = 0x314b, 0 = unknown */ ++ u16 ec_release; + + char *model_str; /* ThinkPad T43 */ + char *nummodel_str; /* 9384A9C for a 9384-A9C model */ +@@ -362,6 +364,45 @@ static void tpacpi_log_usertask(const ch + } \ + } while (0) + ++#define TPACPI_MATCH_ANY 0xffffU ++#define TPACPI_MATCH_UNKNOWN 0U ++ ++/* TPID('1', 'Y') == 0x5931 */ ++#define TPID(__c1, __c2) (((__c2) << 8) | (__c1)) ++ ++#define TPACPI_Q_IBM(__id1, __id2, __quirk) \ ++ { .vendor = PCI_VENDOR_ID_IBM, \ ++ .bios = TPID(__id1, __id2), \ ++ .ec = TPACPI_MATCH_ANY, \ ++ .quirks = (__quirk) } ++ ++struct tpacpi_quirk { ++ unsigned int vendor; ++ u16 bios; ++ u16 ec; ++ unsigned long quirks; ++}; ++ ++static unsigned long __init tpacpi_check_quirks( ++ const struct tpacpi_quirk *qlist, ++ unsigned int qlist_size) ++{ ++ while (qlist_size) { ++ if ((qlist->vendor == thinkpad_id.vendor || ++ qlist->vendor == TPACPI_MATCH_ANY) && ++ (qlist->bios == thinkpad_id.bios_model || ++ qlist->bios == TPACPI_MATCH_ANY) && ++ (qlist->ec == thinkpad_id.ec_model || ++ qlist->ec == TPACPI_MATCH_ANY)) ++ return qlist->quirks; ++ ++ qlist_size--; ++ qlist++; ++ } ++ return 0; ++} ++ ++ + /**************************************************************************** + **************************************************************************** + * +@@ -5757,14 +5798,27 @@ static struct backlight_ops ibm_backligh + + /* --------------------------------------------------------------------- */ + ++#define TPACPI_BRGHT_Q_EC 0x0002 /* Should or must use EC HBRV */ ++ ++static const struct tpacpi_quirk brightness_quirk_table[] __initconst = { ++ TPACPI_Q_IBM('1', 'Y', TPACPI_BRGHT_Q_EC), ++ TPACPI_Q_IBM('1', 'Q', TPACPI_BRGHT_Q_EC), ++ TPACPI_Q_IBM('7', '6', TPACPI_BRGHT_Q_EC), ++ TPACPI_Q_IBM('7', '8', TPACPI_BRGHT_Q_EC), ++}; ++ + static int __init brightness_init(struct ibm_init_struct *iibm) + { + int b; ++ unsigned long quirks; + + vdbg_printk(TPACPI_DBG_INIT, "initializing brightness subdriver\n"); + + mutex_init(&brightness_mutex); + ++ quirks = tpacpi_check_quirks(brightness_quirk_table, ++ ARRAY_SIZE(brightness_quirk_table)); ++ + /* + * We always attempt to detect acpi support, so as to switch + * Lenovo Vista BIOS to ACPI brightness mode even if we are not +@@ -5821,19 +5875,9 @@ static int __init brightness_init(struct + /* TPACPI_BRGHT_MODE_AUTO not implemented yet, just use default */ + if (brightness_mode == TPACPI_BRGHT_MODE_AUTO || + brightness_mode == TPACPI_BRGHT_MODE_MAX) { +- if (thinkpad_id.vendor == PCI_VENDOR_ID_IBM) { +- /* +- * IBM models that define HBRV probably have +- * EC-based backlight level control +- */ +- if (acpi_evalf(ec_handle, NULL, "HBRV", "qd")) +- /* T40-T43, R50-R52, R50e, R51e, X31-X41 */ +- brightness_mode = TPACPI_BRGHT_MODE_ECNVRAM; +- else +- /* all other IBM ThinkPads */ +- brightness_mode = TPACPI_BRGHT_MODE_UCMS_STEP; +- } else +- /* All Lenovo ThinkPads */ ++ if (quirks & TPACPI_BRGHT_Q_EC) ++ brightness_mode = TPACPI_BRGHT_MODE_ECNVRAM; ++ else + brightness_mode = TPACPI_BRGHT_MODE_UCMS_STEP; + + dbg_printk(TPACPI_DBG_BRGHT, +@@ -7387,6 +7431,8 @@ static int __must_check __init get_think + return 0; + tp->bios_model = tp->bios_version_str[0] + | (tp->bios_version_str[1] << 8); ++ tp->bios_release = (tp->bios_version_str[4] << 8) ++ | tp->bios_version_str[5]; + + /* + * ThinkPad T23 or newer, A31 or newer, R50e or newer, +@@ -7407,6 +7453,8 @@ static int __must_check __init get_think + return -ENOMEM; + tp->ec_model = ec_fw_string[0] + | (ec_fw_string[1] << 8); ++ tp->ec_release = (ec_fw_string[4] << 8) ++ | ec_fw_string[5]; + break; + } + } -- 2.47.3