On Fri, Mar 9, 2012 at 3:17 AM, AceLan Kao <[email protected]> wrote:
> Some of the ASUS ET2012 All-in-One machines that use a scalar board
> to control the brightness, and it only accepts brightness up or down
> comm. So, I introduced a get_scalar_command() function to pass the
> command to the scalar board through WMI.
>
> Besides, we have to store the brightness value locally, for we need the
> old value to know the brightness is increasing or decreasing.
>
> BTW, since there is no way to retrieve the actual brightness(it would be
> a fixed value), and the max brightness value would be fixed to 1, so we
> have to keep passing the brightness up/down command when we reached the
> max brightness value or 0.
>
> Signed-off-by: AceLan Kao <[email protected]>
> ---
> drivers/platform/x86/asus-wmi.c | 21 +++++++++++++++++++++
> drivers/platform/x86/asus-wmi.h | 1 +
> drivers/platform/x86/eeepc-wmi.c | 13 +++++++++++++
> 3 files changed, 35 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c
> index 72d731c..48e96f3 100644
> --- a/drivers/platform/x86/asus-wmi.c
> +++ b/drivers/platform/x86/asus-wmi.c
> @@ -1116,6 +1116,25 @@ static int read_brightness(struct backlight_device *bd)
> return retval & ASUS_WMI_DSTS_BRIGHTNESS_MASK;
> }
>
> +static u32 get_scalar_command(struct backlight_device *bd)
> +{
> + struct asus_wmi *asus = bl_get_data(bd);
> + u32 ctrl_param = 0;
> + static int brightness_old = -1;
Please add brightness_old to "struct asus_wmi" instead of using a static.
> +
> + if (brightness_old == -1)
> + brightness_old = bd->props.brightness;
> +
> + if ((brightness_old < bd->props.brightness) || bd->props.brightness
> == read_brightness_max(asus))
Use bd->props.max_brightness instead of read_brightness_max()
> + ctrl_param = 0x00008001;
> + else if ((brightness_old > bd->props.brightness) ||
> bd->props.brightness == 0)
> + ctrl_param = 0x00008000;
> +
> + brightness_old = bd->props.brightness;
> +
> + return ctrl_param;
> +}
> +
> static int update_bl_status(struct backlight_device *bd)
> {
> struct asus_wmi *asus = bl_get_data(bd);
> @@ -1123,6 +1142,8 @@ static int update_bl_status(struct backlight_device *bd)
> int power, err;
>
> ctrl_param = bd->props.brightness;
> + if (unlikely(asus->driver->scalar_panel_brightness))
> + ctrl_param = get_scalar_command (bd);
I think I prefer a if (scala) ctrl_param = ; else ctrl_param = ; construct here.
> err = asus_wmi_set_devstate(ASUS_WMI_DEVID_BRIGHTNESS,
> ctrl_param, NULL);
> diff --git a/drivers/platform/x86/asus-wmi.h b/drivers/platform/x86/asus-wmi.h
> index 8147c10..45fb62c 100644
> --- a/drivers/platform/x86/asus-wmi.h
> +++ b/drivers/platform/x86/asus-wmi.h
> @@ -37,6 +37,7 @@ struct asus_wmi;
>
> struct asus_wmi_driver {
> bool hotplug_wireless;
> + bool scalar_panel_brightness;
> int wapf;
>
> const char *name;
> diff --git a/drivers/platform/x86/eeepc-wmi.c
> b/drivers/platform/x86/eeepc-wmi.c
> index 9f6e643..c5f4c64 100644
> --- a/drivers/platform/x86/eeepc-wmi.c
> +++ b/drivers/platform/x86/eeepc-wmi.c
> @@ -161,11 +161,24 @@ static void eeepc_dmi_check(struct asus_wmi_driver
> *driver)
> driver->hotplug_wireless = true;
> pr_info("wlan hotplug enabled\n");
> }
> +
> + if (strncmp(model, "ET2012", 6) == 0) {
> + const struct dmi_device *dev = NULL;
> + char oemstring[30];
> + while ((dev = dmi_find_device(DMI_DEV_TYPE_OEM_STRING, NULL,
> dev))) {
> + if (sscanf(dev->name, "AEMS%24c", oemstring) == 1) {
> + if (oemstring[18] == '3')
> + driver->scalar_panel_brightness =
> true;
> + break;
> + }
> + }
> + }
> }
Can't this be done using real DMI matching functions ? Like
dmi_check_system() + a DMI table ? Could be used to clean the current
eeepc_dmi_check() too.
> static void eeepc_wmi_quirks(struct asus_wmi_driver *driver)
> {
> driver->hotplug_wireless = hotplug_wireless;
> + driver->scalar_panel_brightness = false;
> driver->wapf = -1;
> eeepc_dmi_check(driver);
> }
> --
> 1.7.9
>
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 [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html