On Mon, Mar 19, 2012 at 1:22 PM, AceLan Kao <acelan.kao@xxxxxxxxxxxxx> wrote:
> Dear Corentin,
>
> 2012/3/19 Corentin Chary <corentin.chary@xxxxxxxxx>:
>> On Mon, Mar 19, 2012 at 10:46 AM, AceLan Kao <acelan.kao@xxxxxxxxxxxxx> wrote:
>>> Due to some implementation reasons, ASUS ET2012 All-in-One machines
>>> can't report the correct backlight power status, it will always return
>>> 1. To track the backlight power status correctly, we have to store the
>>> status by ourselves.
>>>
>>> BTW, by the BIOS design, the backlight power will be turn on/off
>>> sequently, no matter what the value of the parameter will be.
>>> More over, the brightness adjustment command will turn on the backlight
>>> power. Those behaviors will make us fail to track the backlight power
>>> status.
>>> For example, While we are trying to turn on the backlight power,
>>> we will send out the brightness adjustment command and then trying to
>>> figure out if we have to turn on the backlight power, then send out
>>> the command. But, the real case is that, the backlight power turns on
>>> while sending the brightness adjustment command, and then we send out
>>> the command to turn on the backlight power, it actually will turn off
>>> the backlight power and the backlight power status we recorded becomes
>>> wrong. So, we have to seperate these two commands by a if statement.
>>>
>>> Signed-off-by: AceLan Kao <acelan.kao@xxxxxxxxxxxxx>
>>> ---
>>> drivers/platform/x86/asus-wmi.c | 33 ++++++++++++++++++++-------------
>>> drivers/platform/x86/asus-wmi.h | 2 ++
>>> drivers/platform/x86/eeepc-wmi.c | 15 ++++++++++++---
>>> 3 files changed, 34 insertions(+), 16 deletions(-)
>>>
>>> diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c
>>> index ea80fbe..9cd459a 100644
>>> --- a/drivers/platform/x86/asus-wmi.c
>>> +++ b/drivers/platform/x86/asus-wmi.c
>>> @@ -1076,7 +1076,12 @@ static int asus_wmi_hwmon_init(struct asus_wmi *asus)
>>> */
>>> static int read_backlight_power(struct asus_wmi *asus)
>>> {
>>> - int ret = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_BACKLIGHT);
>>> + int ret;
>>> + if (asus->driver->quirks->store_backlight_power)
>>> + ret = !asus->driver->panel_power;
>>> + else
>>> + ret = asus_wmi_get_devstate_simple(asus,
>>> + ASUS_WMI_DEVID_BACKLIGHT);
>>>
>>> if (ret < 0)
>>> return ret;
>>> @@ -1138,24 +1143,23 @@ static int update_bl_status(struct backlight_device *bd)
>>> {
>>> struct asus_wmi *asus = bl_get_data(bd);
>>> u32 ctrl_param;
>>> - int power, err;
>>> -
>>> - if (asus->driver->quirks->scalar_panel_brightness)
>>> - ctrl_param = get_scalar_command(bd);
>>> - else
>>> - ctrl_param = bd->props.brightness;
>>> -
>>> - err = asus_wmi_set_devstate(ASUS_WMI_DEVID_BRIGHTNESS,
>>> - ctrl_param, NULL);
>>> -
>>> - if (err < 0)
>>> - return err;
>>> + int power, err = 0;
>>>
>>> power = read_backlight_power(asus);
>>> if (power != -ENODEV && bd->props.power != power) {
>>> ctrl_param = !!(bd->props.power == FB_BLANK_UNBLANK);
>>> err = asus_wmi_set_devstate(ASUS_WMI_DEVID_BACKLIGHT,
>>> ctrl_param, NULL);
>>> + if (asus->driver->quirks->store_backlight_power)
>>> + asus->driver->panel_power = bd->props.power;
>>> + } else {
>>> + if (asus->driver->quirks->scalar_panel_brightness)
>>> + ctrl_param = get_scalar_command(bd);
>>> + else
>>> + ctrl_param = bd->props.brightness;
>>> +
>>> + err = asus_wmi_set_devstate(ASUS_WMI_DEVID_BRIGHTNESS,
>>> + ctrl_param, NULL);
>>> }
>>
>> Something I didn't notice, why is this moved in an "else" ?
>> Does this break something on your hardware ?
> Yes, in the original sequence, it will send out a brightness command through
> WMI anyway, even if we hit this function because of changing the
> backlight power.
>
> And in the ET2012 series machines, it will turn on the backlight power
> automatically
> when you send out the brightness command.
> And the backlight power command actually is a backlight toggle command
> in ET2012.
> That is no matter what the parameter is while sending the backlight
> power command,
> it will turn on and off the backlight power in a row.
> So, when we're trying to turn on the backlight power, the panel will
> be turned on
> by the brightness command and the turn on backlight command will actually
> turn off the backlight.
>
> To avoid this, I use an if else statement to distinguish these 2 cases,
> brightness or backlight power, and this should do no harm to normal machines,
> hope I don't miss anything.
Ok I see. I pushed some patches on top of these two, they are
available at http://git.iksaif.net/?p=acpi4asus-dkms.git;a=summary
These are mostly cleanups, fix for asus-nb-wmi, and I restored the
ability to update both brightness and power (still disabled for
et2012).
Could you test these patches ?
Thanks,
--
Corentin Chary
http://xf.iksaif.net
--
To unsubscribe from this list: send the line "unsubscribe platform-driver-x86" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
[Linux USB Devel]
[Video for Linux]
[Linux Audio Users]
[Photo]
[Yosemite News]
[Yosemite Photos]
[Free Online Dating]
[Linux Kernel]
[Linux SCSI]
[XFree86]