Re: [PATCH] ACPI / Video: Fix initial brightness problem on Acer Ferrari One

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Friday 02 April 2010, Zhang Rui wrote:
> On Fri, 2010-04-02 at 03:45 +0800, Rafael J. Wysocki wrote:
> > On Thursday 01 April 2010, Zhang Rui wrote:
> > > On Thu, 2010-04-01 at 09:34 +0800, Zhang Rui wrote:
> > > > On Thu, 2010-04-01 at 09:19 +0800, Rafael J. Wysocki wrote:
> > > > > From: Rafael J. Wysocki <rjw@xxxxxxx>
> > > > > 
> > > > > On Acer Ferrari One, when _BQC is invoked for the first time, the
> > > > > minimum brightness is returned, so the ACPI video drivers sets the
> > > > > minimum brightness on boot.  This is not desirable, so use the
> > > > > following rule:
> > > > > 	If _BQC initially returns an invalid value or the minimum
> > > > > 	brightness, use either the brightness level supposed to be
> > > > > 	used on AC power, or the brightness level supposed to be
> > > > > 	used on battery, depending on whether or not the system is
> > > > > 	on AC power.  If these values are not exported by the BIOS,
> > > > > 	use the maximum brightness level.
> > > > > 
> > > > > Signed-off-by: Rafael J. Wysocki <rjw@xxxxxxx>
> > > > > ---
> > > > >  drivers/acpi/video.c |   26 +++++++++++++++++++++++---
> > > > >  1 file changed, 23 insertions(+), 3 deletions(-)
> > > > > 
> > > > > Index: linux-2.6/drivers/acpi/video.c
> > > > > ===================================================================
> > > > > --- linux-2.6.orig/drivers/acpi/video.c
> > > > > +++ linux-2.6/drivers/acpi/video.c
> > > > > @@ -44,6 +44,7 @@
> > > > >  #include <acpi/acpi_bus.h>
> > > > >  #include <acpi/acpi_drivers.h>
> > > > >  #include <linux/suspend.h>
> > > > > +#include <linux/power_supply.h>
> > > > >  
> > > > >  #define PREFIX "ACPI: "
> > > > >  
> > > > > @@ -920,11 +928,20 @@ acpi_video_init_brightness(struct acpi_v
> > > > >  		 * Set the backlight to the initial state.
> > > > >  		 * On some buggy laptops, _BQC returns an uninitialized value
> > > > >  		 * when invoked for the first time, i.e. level_old is invalid.
> > > > > -		 * set the backlight to max_level in this case
> > > > > +		 * On some other systems _BQC returns the minimum brightness
> > > > > +		 * when invoked for the first time, which also usually is
> > > > > +		 * undesirable.  In that cases use the "AC power" value if on AC
> > > > > +		 * power or the "battery" value otherwise.  If these vaules are
> > > > > +		 * not exported, use max_level.
> > > > >  		 */
> > > > > -		for (i = 2; i < br->count; i++)
> > > > > -			if (level_old == br->levels[i])
> > > > > +		for (i = 3; i < br->count; i++)
> > > > > +			if (level_old == br->levels[i]) {
> > > > >  				level = level_old;
> > > > > +				goto set_level;
> > > > > +			}
> > > > > +		if (!br->flags._BCL_no_ac_battery_levels)
> > > > > +			level = power_supply_is_system_supplied() ?
> > > > > +
> > > > > 						br->levels[0] : br->levels[1];
> > > > 
> > > > this doesn't work currently.
> > > > br->levels[0] and br->levels[1] doesn't equal the "AC power" value and
> > > > "Battery" value, because the "AC power" and "Battery" value is not
> > > > exported by many BIOS at all.
> > 
> > But if the BIOS doesn't export these values,
> > br->flags._BCL_no_ac_battery_levels will be true, won't it?
> > 
> no.
> for example, I have seen a _BCL package like this: {100, 0, 10, 20, ...,
> 90, 100}.
> Only one value, not sure the "AC power" or "Battery" value, is returned,
> the br->flags._BCL_no_ac_battery_levels is also set in this case.

Yes, it is, and that's fine.

The code added by the patch won't be executed in that case.

> > ---
> > From: Rafael J. Wysocki <rjw@xxxxxxx>
> > Subject: ACPI / Video: Fix initial brightness problem on Acer Ferrari One (v. 2)
> > 
> > On Acer Ferrari One, when _BQC is invoked for the first time, the
> > minimum brightness is returned, so the ACPI video drivers sets the
> > minimum brightness on boot.  This is not desirable, so use the
> > following rule:
> > 	Set brightness to either the level supposed to be used on
> > 	AC power, or the brightness level supposed to be used on
> > 	battery, depending on whether or not the system is on AC
> > 	power.  If these values are not exported by the BIOS, use the
> > 	brightness level initially returned by _BQC.  If that value
> > 	is invalid, use the maximum brightness level.
> > 
> > Signed-off-by: Rafael J. Wysocki <rjw@xxxxxxx>
> > ---
> >  drivers/acpi/video.c |   16 +++++++++++++++-
> >  1 file changed, 15 insertions(+), 1 deletion(-)
> > 
> > Index: linux-2.6/drivers/acpi/video.c
> > ===================================================================
> > --- linux-2.6.orig/drivers/acpi/video.c
> > +++ linux-2.6/drivers/acpi/video.c
> > @@ -44,6 +44,7 @@
> >  #include <acpi/acpi_bus.h>
> >  #include <acpi/acpi_drivers.h>
> >  #include <linux/suspend.h>
> > +#include <linux/power_supply.h>
> >  
> >  #define PREFIX "ACPI: "
> >  
> > @@ -915,6 +916,18 @@ acpi_video_init_brightness(struct acpi_v
> >  
> >  	br->flags._BQC_use_index = (level == max_level ? 0 : 1);
> >  
> I think the patch will work if we add some code here:
> 
> 	if (!br->flags._BCL_no_ac_battery_levels) {
> 		/* the "AC power" and "Battery" brightness value is not reliable */
> 		br->levels[0] = ...; /* the maximum value? */
> 		br->levels[1] = ...; /* br->levels[maximum -1 ]? */
> 	}

Well, the code that checks the "AC power" and "battery" levels does this:

        for (i = 2; i < count; i++) {
                if (br->levels[i] == br->levels[0])
                        level_ac_battery++;
                if (br->levels[i] == br->levels[1])
                        level_ac_battery++;
        }

        if (level_ac_battery < 2) {
                level_ac_battery = 2 - level_ac_battery;
                br->flags._BCL_no_ac_battery_levels = 1;

so in your example case the code below won't use the "AC power" and "battery"
values, which I believe is correct.  [We'll try to use the initial brightness
and fall back to max_level in that case, as described in the changelog.]

> > +	/*
> > +	 * Set brightness to the "AC power" value if on AC power or to the
> > +	 * "battery" value otherwise.  If these vaules are not exported, try
> > +	 * to use the value returned by the initial _BQC and fall back to
> > +	 * max_level.
> > +	 */
> > +	if (!br->flags._BCL_no_ac_battery_levels) {
> > +		level = power_supply_is_system_supplied() ?
> > +					br->levels[0] : br->levels[1];
> > +		goto set_level;
> > +	}
> > +
> >  	if (!br->flags._BQC_use_index) {
> >  		/*
> >  		 * Set the backlight to the initial state.
> > @@ -930,7 +943,8 @@ acpi_video_init_brightness(struct acpi_v
> >  
> >  	if (br->flags._BCL_reversed)
> >  		level_old = (br->count - 1) - level_old;
> > -	level = br->levels[level_old];
> > +	level = level_old >= 0 && level_old < br->count ?
> > +				br->levels[level_old] : max_level;
> >  
> >  set_level:
> >  	result = acpi_video_device_lcd_set_level(device, level);

Thanks,
Rafael
--
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux IBM ACPI]     [Linux Power Management]     [Linux Kernel]     [Linux Laptop]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]

  Powered by Linux