Ccing Dmitry and Matthew, they may want to comment that one.

On Thu, Mar 24, 2011 at 11:02 PM, Andy Ross <[email protected]> wrote:
> Support the built-in accelerometer on the Lucid tablets as a standard
> 3-axis input device.
>
> Signed-off-by: Andy Ross <[email protected]>
> ---
>  drivers/platform/x86/Kconfig       |    9 ++-
>  drivers/platform/x86/asus-laptop.c |  137 
> +++++++++++++++++++++++++++++++++++-
>  2 files changed, 141 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/platform/x86/Kconfig b/drivers/platform/x86/Kconfig
> index b6f983e..43906f5 100644
> --- a/drivers/platform/x86/Kconfig
> +++ b/drivers/platform/x86/Kconfig
> @@ -67,10 +67,11 @@ config ASUS_LAPTOP
>          This is a driver for Asus laptops and the Pegatron Lucid
>          tablet. It may also support some MEDION, JVC or VICTOR
>          laptops. It makes all the extra buttons generate standard
> -         ACPI events and input events. It also adds support for video
> -         output switching, LCD backlight control, Bluetooth and Wlan
> -         control, and most importantly, allows you to blink those
> -         fancy LEDs.
> +         ACPI events and input events, and on the Lucid the built-in
> +         accelerometer appears as an input device.  It also adds
> +         support for video output switching, LCD backlight control,
> +         Bluetooth and Wlan control, and most importantly, allows you
> +         to blink those fancy LEDs.
>
>          For more information and a userspace daemon for handling the extra
>          buttons see <http://acpi4asus.sf.net>.
> diff --git a/drivers/platform/x86/asus-laptop.c 
> b/drivers/platform/x86/asus-laptop.c
> index 6651d8c..9b07368 100644
> --- a/drivers/platform/x86/asus-laptop.c
> +++ b/drivers/platform/x86/asus-laptop.c
> @@ -224,6 +224,14 @@ static char *display_get_paths[] = {
>  #define PEGA_READ_ALS_H        0x02
>  #define PEGA_READ_ALS_L        0x03
>
> +#define PEGA_ACCEL_NAME "pega_accel"
> +#define PEGA_ACCEL_DESC "Pegatron Lucid Tablet Accelerometer"
> +#define METHOD_XLRX "XLRX"
> +#define METHOD_XLRY "XLRY"
> +#define METHOD_XLRZ "XLRZ"
> +#define PEGA_ACC_CLAMP 512 /* 1G accel is reported as ~256, so clamp to 2G */
> +#define PEGA_ACC_RETRIES 3
> +
>  /*
>  * Define a specific led structure to keep the main structure clean
>  */
> @@ -249,6 +257,7 @@ struct asus_laptop {
>
>        struct input_dev *inputdev;
>        struct key_entry *keymap;
> +       struct input_polled_dev *pega_accel_poll;
>
>        struct asus_led mled;
>        struct asus_led tled;
> @@ -262,6 +271,10 @@ struct asus_laptop {
>        bool have_rsts;
>        bool have_pega_lucid;
>        int lcd_state;
> +       bool pega_acc_live;
> +       int pega_acc_x;
> +       int pega_acc_y;
> +       int pega_acc_z;
>
>        struct rfkill *gps_rfkill;
>
> @@ -390,6 +403,99 @@ static int asus_pega_lucid_set(struct asus_laptop *asus, 
> int unit, bool enable)
>        return write_acpi_int(asus->handle, method, unit);
>  }
>
> +static int pega_acc_axis(struct asus_laptop *asus, int curr, char *method)
> +{
> +       int i, delta;
> +       unsigned long long val;
> +       for (i = 0; i < PEGA_ACC_RETRIES; i++) {
> +               acpi_evaluate_integer(asus->handle, method, NULL, &val);
> +
> +               /* The output is noisy.  From reading the ASL
> +                * dissassembly, timeout errors are returned with 1's
> +                * in the high word, and the lack of locking around
> +                * thei hi/lo byte reads means that a transition
> +                * between (for example) -1 and 0 could be read as
> +                * 0xff00 or 0x00ff. */
> +               delta = abs(curr - (short)val);
> +               if (delta < 128 && !(val & ~0xffff))
> +                       break;
> +       }
> +       return clamp_val((short)val, -PEGA_ACC_CLAMP, PEGA_ACC_CLAMP);
> +}

Wow :/ How long is an acpi_evaluate_integer call here ?

> +static int asus_platform_probe(struct platform_device *pd)
> +{
> +       struct asus_laptop *asus = dev_get_drvdata(&pd->dev);
> +
> +       /* This is instantiated during platform driver initialization
> +        * becuase if it's done from underneath asus_acpi_add(), the
> +        * resulting input device can be grabbed by an early userspace
> +        * reader before ACPI initialization is finished and something
> +        * oopses underneath the acpi_evaluate_integer() call out of
> +        * pega_accel_poll().  Firmware bug? */
> +       pega_accel_probe(asus);
> +
> +       return 0;
> +}

When is asus_platform_probe called exactly ? Because I'd say it's
called during asus_platform_probe(), and that doesn't fix your issue
right ?

-- 
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

Reply via email to