Skip to content

Commit

Permalink
asus-laptop: Platform detection for Pegatron Lucid
Browse files Browse the repository at this point in the history
Recognize the Pegatron Lucid tablets by their method signatures.

Signed-off-by: Andy Ross <andy.ross@windriver.com>
Signed-off-by: Corentin Chary <corentin.chary@gmail.com>
Signed-off-by: Matthew Garrett <mjg@redhat.com>
  • Loading branch information
Andy Ross authored and Matthew Garrett committed Oct 24, 2011
1 parent ba05b23 commit 8819de7
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 10 deletions.
16 changes: 9 additions & 7 deletions drivers/platform/x86/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -64,15 +64,17 @@ config ASUS_LAPTOP
depends on INPUT
depends on RFKILL || RFKILL = n
select INPUT_SPARSEKMAP
select INPUT_POLLDEV
---help---
This is the new Linux driver for Asus laptops. 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.
This is a driver for Asus laptops, Lenovo SL 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.

For more information and a userspace daemon for handling the extra
buttons see <http://acpi4asus.sf.net>.
For more information see <http://acpi4asus.sf.net>.

If you have an ACPI-compatible ASUS laptop, say Y or M here.

Expand Down
23 changes: 20 additions & 3 deletions drivers/platform/x86/asus-laptop.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
*
* Copyright (C) 2002-2005 Julien Lerouge, 2003-2006 Karol Kozimor
* Copyright (C) 2006-2007 Corentin Chary
* Copyright (C) 2011 Wind River Systems
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
Expand Down Expand Up @@ -48,6 +49,7 @@
#include <linux/uaccess.h>
#include <linux/input.h>
#include <linux/input/sparse-keymap.h>
#include <linux/input-polldev.h>
#include <linux/rfkill.h>
#include <linux/slab.h>
#include <linux/dmi.h>
Expand Down Expand Up @@ -173,6 +175,12 @@ MODULE_PARM_DESC(wwan_status, "Set the wireless status on boot "
#define METHOD_KBD_LIGHT_SET "SLKB"
#define METHOD_KBD_LIGHT_GET "GLKB"

/* For Pegatron Lucid tablet */
#define DEVICE_NAME_PEGA "Lucid"
#define METHOD_PEGA_ENABLE "ENPR"
#define METHOD_PEGA_DISABLE "DAPR"
#define METHOD_PEGA_READ "RDLN"

/*
* Define a specific led structure to keep the main structure clean
*/
Expand Down Expand Up @@ -209,6 +217,7 @@ struct asus_laptop {

int wireless_status;
bool have_rsts;
bool is_pega_lucid;

struct rfkill *gps_rfkill;

Expand Down Expand Up @@ -323,6 +332,14 @@ static int acpi_check_handle(acpi_handle handle, const char *method,
return 0;
}

static bool asus_check_pega_lucid(struct asus_laptop *asus)
{
return !strcmp(asus->name, DEVICE_NAME_PEGA) &&
!acpi_check_handle(asus->handle, METHOD_PEGA_ENABLE, NULL) &&
!acpi_check_handle(asus->handle, METHOD_PEGA_DISABLE, NULL) &&
!acpi_check_handle(asus->handle, METHOD_PEGA_READ, NULL);
}

/* Generic LED function */
static int asus_led_set(struct asus_laptop *asus, const char *method,
int value)
Expand Down Expand Up @@ -1203,7 +1220,6 @@ static mode_t asus_sysfs_is_visible(struct kobject *kobj,
attr == &dev_attr_ls_level.attr) {
supported = !acpi_check_handle(handle, METHOD_ALS_CONTROL, NULL) &&
!acpi_check_handle(handle, METHOD_ALS_LEVEL, NULL);

} else if (attr == &dev_attr_gps.attr) {
supported = !acpi_check_handle(handle, METHOD_GPS_ON, NULL) &&
!acpi_check_handle(handle, METHOD_GPS_OFF, NULL) &&
Expand Down Expand Up @@ -1439,9 +1455,10 @@ static int __devinit asus_acpi_add(struct acpi_device *device)
goto fail_platform;

/*
* Register the platform device first. It is used as a parent for the
* sub-devices below.
* Need platform type detection first, then the platform
* device. It is used as a parent for the sub-devices below.
*/
asus->is_pega_lucid = asus_check_pega_lucid(asus);
result = asus_platform_init(asus);
if (result)
goto fail_platform;
Expand Down

0 comments on commit 8819de7

Please sign in to comment.