From: Seth Forshee <seth.forshee@canonical.com>
To: linux-acpi@vger.kernel.org
Cc: Matthew Garrett <mjg59@srcf.ucam.org>,
Len Brown <lenb@kernel.org>, "Rafael J. Wysocki" <rjw@sisk.pl>,
Ben Jencks <ben@bjencks.net>, joeyli <jlee@suse.com>,
Seth Forshee <seth.forshee@canonical.com>
Subject: [PATCH 4/5] acpi_video: Disable use of _BQC when value doesn't match those set through _BCM
Date: Thu, 7 Mar 2013 13:39:39 -0600 [thread overview]
Message-ID: <1362685180-7768-4-git-send-email-seth.forshee@canonical.com> (raw)
In-Reply-To: <1362685180-7768-1-git-send-email-seth.forshee@canonical.com>
Check the value returned by _BQC after each brightness change, and if it
doesn't match the value written disable use of _BQC. This works around
problems on some Lenovos when valid brightness values are ignored by
_BCM.
Signed-off-by: Seth Forshee <seth.forshee@canonical.com>
---
drivers/acpi/video.c | 59 ++++++++++++++++++++++++++++++++++++--------------
1 file changed, 43 insertions(+), 16 deletions(-)
diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c
index b83fbbd..6a19bf7 100644
--- a/drivers/acpi/video.c
+++ b/drivers/acpi/video.c
@@ -230,6 +230,8 @@ static int acpi_video_device_lcd_set_state(struct acpi_video_device *device,
int state);
static int acpi_video_device_lcd_set_level(struct acpi_video_device *device,
int level);
+static int acpi_video_device_get_bqc_level(struct acpi_video_device *device,
+ unsigned long long *level);
static int acpi_video_device_lcd_get_level_current(
struct acpi_video_device *device,
unsigned long long *level, int init);
@@ -395,6 +397,20 @@ acpi_video_device_lcd_set_state(struct acpi_video_device *device, int state)
result = -EIO;
break;
}
+
+ if (device->cap._BQC || device->cap._BCQ) {
+ int bqc_result;
+ unsigned long long level;
+ bqc_result = acpi_video_device_get_bqc_level(device,
+ &level);
+ if (!bqc_result &&
+ level != device->brightness->levels[curr_state]) {
+ printk(KERN_WARNING FW_BUG
+ "%s level does not match level set; disabling\n",
+ device->cap._BQC ? "_BQC" : "_BCQ");
+ device->cap._BQC = device->cap._BCQ = 0;
+ }
+ }
} while (curr_state != state);
device->brightness->curr_state = curr_state;
@@ -495,26 +511,36 @@ static struct dmi_system_id video_dmi_table[] __initdata = {
};
static int
+acpi_video_device_get_bqc_level(struct acpi_video_device *device,
+ unsigned long long *level)
+{
+ acpi_status status;
+ char *buf = device->cap._BQC ? "_BQC" : "_BCQ";
+
+ status = acpi_evaluate_integer(device->dev->handle, buf, NULL, level);
+ if (ACPI_FAILURE(status))
+ return -EIO;
+
+ if (device->brightness->flags._BQC_use_index) {
+ if (device->brightness->flags._BCL_reversed)
+ *level = device->brightness->count - 3 - *level;
+ *level = device->brightness->levels[*level + 2];
+ }
+
+ *level += bqc_offset_aml_bug_workaround;
+ return 0;
+}
+
+static int
acpi_video_device_lcd_get_level_current(struct acpi_video_device *device,
unsigned long long *level, int init)
{
- acpi_status status = AE_OK;
+ int result;
int i;
if (device->cap._BQC || device->cap._BCQ) {
- char *buf = device->cap._BQC ? "_BQC" : "_BCQ";
-
- status = acpi_evaluate_integer(device->dev->handle, buf,
- NULL, level);
- if (ACPI_SUCCESS(status)) {
- if (device->brightness->flags._BQC_use_index) {
- if (device->brightness->flags._BCL_reversed)
- *level = device->brightness->count
- - 3 - (*level);
- *level = device->brightness->levels[*level + 2];
-
- }
- *level += bqc_offset_aml_bug_workaround;
+ result = acpi_video_device_get_bqc_level(device, level);
+ if (!result) {
for (i = 2; i < device->brightness->count; i++)
if (device->brightness->levels[i] == *level) {
device->brightness->curr_state = i;
@@ -527,7 +553,7 @@ acpi_video_device_lcd_get_level_current(struct acpi_video_device *device,
*/
ACPI_WARNING((AE_INFO,
"%s returned an invalid level",
- buf));
+ device->cap._BQC ? "_BQC" : "_BCQ"));
device->cap._BQC = device->cap._BCQ = 0;
}
} else {
@@ -539,7 +565,8 @@ acpi_video_device_lcd_get_level_current(struct acpi_video_device *device,
* buggy _BQC.
* http://bugzilla.kernel.org/show_bug.cgi?id=12233
*/
- ACPI_WARNING((AE_INFO, "Evaluating %s failed", buf));
+ ACPI_WARNING((AE_INFO, "Evaluating %s failed",
+ device->cap._BQC ? "_BQC" : "_BCQ"));
device->cap._BQC = device->cap._BCQ = 0;
}
}
--
1.7.9.5
next prev parent reply other threads:[~2013-03-07 19:39 UTC|newest]
Thread overview: 69+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-02-11 16:21 [PATCH] ACPI: Disable Windows 8 compatibility for some Lenovo ThinkPads Seth Forshee
2013-02-11 17:52 ` Matthew Garrett
2013-02-11 19:06 ` Seth Forshee
2013-02-11 19:09 ` Matthew Garrett
2013-02-11 19:31 ` Rafael J. Wysocki
2013-02-12 3:05 ` Seth Forshee
2013-02-13 20:32 ` Seth Forshee
2013-02-13 20:55 ` Matthew Garrett
2013-02-13 21:04 ` Ben Jencks
2013-02-13 21:49 ` Seth Forshee
2013-02-13 21:46 ` Seth Forshee
2013-02-13 21:54 ` Matthew Garrett
2013-02-13 22:04 ` Seth Forshee
2013-03-07 19:38 ` Seth Forshee
2013-03-07 19:39 ` [PATCH 1/5] ACPICA: Add interface for getting latest Windows version requested via _OSI Seth Forshee
2013-03-07 19:39 ` [PATCH 2/5] acpi_video: Avoid unnecessary conversions between backlight levels and indexes Seth Forshee
2013-03-07 19:39 ` [PATCH 3/5] acpi_video: Add workaround for broken Windows 8 backlight implementations Seth Forshee
2013-04-04 11:44 ` Aaron Lu
2013-04-04 12:35 ` Seth Forshee
2013-04-04 13:46 ` Aaron Lu
2013-04-04 14:02 ` Seth Forshee
2013-04-04 14:27 ` Aaron Lu
2013-03-07 19:39 ` Seth Forshee [this message]
2013-03-07 19:39 ` [PATCH 5/5] acpi_video: Don't handle ACPI brightness notifications by default Seth Forshee
2013-08-02 5:55 ` Aaron Lu
2013-08-02 14:41 ` Rafael J. Wysocki
2013-08-02 14:52 ` Aaron Lu
2013-08-03 0:26 ` Rafael J. Wysocki
2013-08-03 9:46 ` Aaron Lu
2013-08-03 11:23 ` Rafael J. Wysocki
2013-08-03 12:10 ` Aaron Lu
2013-08-03 22:07 ` Rafael J. Wysocki
2013-08-04 1:08 ` Aaron Lu
2013-03-18 21:25 ` [PATCH] ACPI: Disable Windows 8 compatibility for some Lenovo ThinkPads Seth Forshee
2013-04-02 5:18 ` Ben Jencks
2013-04-02 9:15 ` Aaron Lu
2013-04-02 11:23 ` Matthew Garrett
2013-04-02 13:44 ` Aaron Lu
2013-04-02 19:08 ` Matthew Garrett
2013-04-19 12:24 ` Seth Forshee
2013-04-20 22:06 ` Rafael J. Wysocki
2013-04-21 2:29 ` Seth Forshee
2013-04-21 15:46 ` Henrique de Moraes Holschuh
2013-02-13 21:09 ` Ben Jencks
2013-04-01 1:53 ` Aaron Lu
2013-04-01 13:03 ` Seth Forshee
2013-04-02 9:08 ` Aaron Lu
2013-04-02 13:00 ` Seth Forshee
2013-04-02 13:43 ` Aaron Lu
2013-04-03 7:04 ` Ben Jencks
2013-04-03 7:27 ` Aaron Lu
2013-04-03 13:45 ` Seth Forshee
2013-04-04 11:39 ` Aaron Lu
2013-04-19 3:15 ` Aaron Lu
2013-04-20 22:06 ` Rafael J. Wysocki
2013-04-21 11:07 ` Aaron Lu
2013-04-21 12:11 ` Aaron Lu
2013-04-21 21:42 ` Rafael J. Wysocki
2013-04-22 9:39 ` Aaron Lu
2013-04-22 11:51 ` Rafael J. Wysocki
2013-04-22 12:11 ` Aaron Lu
2013-04-22 13:06 ` Seth Forshee
2013-04-22 13:40 ` Aaron Lu
2013-04-22 13:56 ` Seth Forshee
2013-04-22 14:07 ` Aaron Lu
2013-04-22 15:11 ` Seth Forshee
2013-04-22 2:18 ` joeyli
2013-04-22 10:08 ` Aaron Lu
2013-04-22 12:00 ` joeyli
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1362685180-7768-4-git-send-email-seth.forshee@canonical.com \
--to=seth.forshee@canonical.com \
--cc=ben@bjencks.net \
--cc=jlee@suse.com \
--cc=lenb@kernel.org \
--cc=linux-acpi@vger.kernel.org \
--cc=mjg59@srcf.ucam.org \
--cc=rjw@sisk.pl \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).