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

Commit ead90393 authored by Len Brown's avatar Len Brown
Browse files

Merge branch 'fujitsu' into test

parents b815d7b3 0e6a66e9
Loading
Loading
Loading
Loading
+71 −52
Original line number Diff line number Diff line
@@ -44,8 +44,9 @@
 * Hotkeys present on certain Fujitsu laptops (eg: the S6xxx series) are
 * also supported by this driver.
 *
 * This driver has been tested on a Fujitsu Lifebook S6410 and S7020.  It
 * should work on most P-series and S-series Lifebooks, but YMMV.
 * This driver has been tested on a Fujitsu Lifebook S6410, S7020 and
 * P8010.  It should work on most P-series and S-series Lifebooks, but
 * YMMV.
 *
 * The module parameter use_alt_lcd_levels switches between different ACPI
 * brightness controls which are used by different Fujitsu laptops.  In most
@@ -65,7 +66,7 @@
#include <linux/video_output.h>
#include <linux/platform_device.h>

#define FUJITSU_DRIVER_VERSION "0.4.2"
#define FUJITSU_DRIVER_VERSION "0.4.3"

#define FUJITSU_LCD_N_LEVELS 8

@@ -83,10 +84,10 @@
#define ACPI_VIDEO_NOTIFY_DEC_BRIGHTNESS     0x87

/* Hotkey details */
#define LOCK_KEY	0x410	/* codes for the keys in the GIRB register */
#define DISPLAY_KEY	0x411	/* keys are mapped to KEY_SCREENLOCK (the key with the key symbol) */
#define ENERGY_KEY	0x412	/* KEY_MEDIA (the key with the laptop symbol, KEY_EMAIL (E key)) */
#define REST_KEY	0x413	/* KEY_SUSPEND (R key) */
#define KEY1_CODE	0x410	/* codes for the keys in the GIRB register */
#define KEY2_CODE	0x411
#define KEY3_CODE	0x412
#define KEY4_CODE	0x413

#define MAX_HOTKEY_RINGBUFFER_SIZE 100
#define RINGBUFFERSIZE 40
@@ -123,6 +124,7 @@ struct fujitsu_t {
	char phys[32];
	struct backlight_device *bl_device;
	struct platform_device *pf_device;
	int keycode1, keycode2, keycode3, keycode4;

	unsigned int max_brightness;
	unsigned int brightness_changed;
@@ -430,7 +432,7 @@ static struct platform_driver fujitsupf_driver = {
		   }
};

static int dmi_check_cb_s6410(const struct dmi_system_id *id)
static void dmi_check_cb_common(const struct dmi_system_id *id)
{
	acpi_handle handle;
	int have_blnf;
@@ -452,24 +454,40 @@ static int dmi_check_cb_s6410(const struct dmi_system_id *id)
			    "auto-detecting disable_adjust\n");
		disable_brightness_adjust = have_blnf ? 0 : 1;
	}
}

static int dmi_check_cb_s6410(const struct dmi_system_id *id)
{
	dmi_check_cb_common(id);
	fujitsu->keycode1 = KEY_SCREENLOCK;	/* "Lock" */
	fujitsu->keycode2 = KEY_HELP;	/* "Mobility Center" */
	return 0;
}

static int dmi_check_cb_p8010(const struct dmi_system_id *id)
{
	dmi_check_cb_common(id);
	fujitsu->keycode1 = KEY_HELP;	/* "Support" */
	fujitsu->keycode3 = KEY_SWITCHVIDEOMODE;	/* "Presentation" */
	fujitsu->keycode4 = KEY_WWW;	/* "Internet" */
	return 0;
}

static struct dmi_system_id __initdata fujitsu_dmi_table[] = {
	{
	 .ident = "Fujitsu Siemens",
	 .ident = "Fujitsu Siemens S6410",
	 .matches = {
		     DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
		     DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK S6410"),
		     },
	 .callback = dmi_check_cb_s6410},
	{
	 .ident = "FUJITSU LifeBook P8010",
	 .ident = "Fujitsu LifeBook P8010",
	 .matches = {
		     DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
		     DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook P8010"),
		     },
	 .callback = dmi_check_cb_s6410},
	 .callback = dmi_check_cb_p8010},
	{}
};

@@ -547,7 +565,6 @@ static int acpi_fujitsu_add(struct acpi_device *device)
	}

	/* do config (detect defaults) */
	dmi_check_system(fujitsu_dmi_table);
	use_alt_lcd_levels = use_alt_lcd_levels == 1 ? 1 : 0;
	disable_brightness_keys = disable_brightness_keys == 1 ? 1 : 0;
	disable_brightness_adjust = disable_brightness_adjust == 1 ? 1 : 0;
@@ -623,15 +640,15 @@ static void acpi_fujitsu_notify(acpi_handle handle, u32 event, void *data)
			keycode = 0;
			if (disable_brightness_keys != 1) {
				if (oldb == 0) {
					acpi_bus_generate_proc_event(fujitsu->
						dev,
					acpi_bus_generate_proc_event
					    (fujitsu->dev,
					     ACPI_VIDEO_NOTIFY_DEC_BRIGHTNESS,
					     0);
					keycode = KEY_BRIGHTNESSDOWN;
				} else if (oldb ==
					   (fujitsu->max_brightness) - 1) {
					acpi_bus_generate_proc_event(fujitsu->
						dev,
					acpi_bus_generate_proc_event
					    (fujitsu->dev,
					     ACPI_VIDEO_NOTIFY_INC_BRIGHTNESS,
					     0);
					keycode = KEY_BRIGHTNESSUP;
@@ -646,8 +663,7 @@ static void acpi_fujitsu_notify(acpi_handle handle, u32 event, void *data)
			}
			if (disable_brightness_keys != 1) {
				acpi_bus_generate_proc_event(fujitsu->dev,
					ACPI_VIDEO_NOTIFY_INC_BRIGHTNESS,
					0);
					ACPI_VIDEO_NOTIFY_INC_BRIGHTNESS, 0);
				keycode = KEY_BRIGHTNESSUP;
			}
		} else if (oldb > newb) {
@@ -659,8 +675,7 @@ static void acpi_fujitsu_notify(acpi_handle handle, u32 event, void *data)
			}
			if (disable_brightness_keys != 1) {
				acpi_bus_generate_proc_event(fujitsu->dev,
					ACPI_VIDEO_NOTIFY_DEC_BRIGHTNESS,
					0);
					ACPI_VIDEO_NOTIFY_DEC_BRIGHTNESS, 0);
				keycode = KEY_BRIGHTNESSDOWN;
			}
		} else {
@@ -742,10 +757,10 @@ static int acpi_fujitsu_hotkey_add(struct acpi_device *device)
	input->id.product = 0x06;
	input->dev.parent = &device->dev;
	input->evbit[0] = BIT(EV_KEY);
	set_bit(KEY_SCREENLOCK, input->keybit);
	set_bit(KEY_MEDIA, input->keybit);
	set_bit(KEY_EMAIL, input->keybit);
	set_bit(KEY_SUSPEND, input->keybit);
	set_bit(fujitsu->keycode1, input->keybit);
	set_bit(fujitsu->keycode2, input->keybit);
	set_bit(fujitsu->keycode3, input->keybit);
	set_bit(fujitsu->keycode4, input->keybit);
	set_bit(KEY_UNKNOWN, input->keybit);

	error = input_register_device(input);
@@ -833,17 +848,17 @@ static void acpi_fujitsu_hotkey_notify(acpi_handle handle, u32 event,
				    irb);

			switch (irb & 0x4ff) {
			case LOCK_KEY:
				keycode = KEY_SCREENLOCK;
			case KEY1_CODE:
				keycode = fujitsu->keycode1;
				break;
			case DISPLAY_KEY:
				keycode = KEY_MEDIA;
			case KEY2_CODE:
				keycode = fujitsu->keycode2;
				break;
			case ENERGY_KEY:
				keycode = KEY_EMAIL;
			case KEY3_CODE:
				keycode = fujitsu->keycode3;
				break;
			case REST_KEY:
				keycode = KEY_SUSPEND;
			case KEY4_CODE:
				keycode = fujitsu->keycode4;
				break;
			case 0:
				keycode = 0;
@@ -943,6 +958,11 @@ static int __init fujitsu_init(void)
	if (!fujitsu)
		return -ENOMEM;
	memset(fujitsu, 0, sizeof(struct fujitsu_t));
	fujitsu->keycode1 = KEY_PROG1;
	fujitsu->keycode2 = KEY_PROG2;
	fujitsu->keycode3 = KEY_PROG3;
	fujitsu->keycode4 = KEY_PROG4;
	dmi_check_system(fujitsu_dmi_table);

	result = acpi_bus_register_driver(&acpi_fujitsu_driver);
	if (result < 0) {
@@ -1076,10 +1096,8 @@ MODULE_DESCRIPTION("Fujitsu laptop extras support");
MODULE_VERSION(FUJITSU_DRIVER_VERSION);
MODULE_LICENSE("GPL");

MODULE_ALIAS
    ("dmi:*:svnFUJITSUSIEMENS:*:pvr:rvnFUJITSU:rnFJNB1D3:*:cvrS6410:*");
MODULE_ALIAS
    ("dmi:*:svnFUJITSU:*:pvr:rvnFUJITSU:rnFJNB19C:*:cvrS7020:*");
MODULE_ALIAS("dmi:*:svnFUJITSUSIEMENS:*:pvr:rvnFUJITSU:rnFJNB1D3:*:cvrS6410:*");
MODULE_ALIAS("dmi:*:svnFUJITSU:*:pvr:rvnFUJITSU:rnFJNB19C:*:cvrS7020:*");

static struct pnp_device_id pnp_ids[] = {
	{.id = "FUJ02bf"},
@@ -1087,4 +1105,5 @@ static struct pnp_device_id pnp_ids[] = {
	{.id = "FUJ02E3"},
	{.id = ""}
};

MODULE_DEVICE_TABLE(pnp, pnp_ids);