Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8819de7f authored by Andy Ross's avatar Andy Ross Committed by Matthew Garrett
Browse files

asus-laptop: Platform detection for Pegatron Lucid



Recognize the Pegatron Lucid tablets by their method signatures.

Signed-off-by: default avatarAndy Ross <andy.ross@windriver.com>
Signed-off-by: default avatarCorentin Chary <corentin.chary@gmail.com>
Signed-off-by: default avatarMatthew Garrett <mjg@redhat.com>
parent ba05b237
Loading
Loading
Loading
Loading
+9 −7
Original line number Diff line number Diff line
@@ -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.

+20 −3
Original line number Diff line number Diff line
@@ -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
@@ -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>
@@ -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
 */
@@ -209,6 +217,7 @@ struct asus_laptop {

	int wireless_status;
	bool have_rsts;
	bool is_pega_lucid;

	struct rfkill *gps_rfkill;

@@ -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)
@@ -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) &&
@@ -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;