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

Commit fb42d1f4 authored by Azael Avalos's avatar Azael Avalos Committed by Darren Hart
Browse files

toshiba_acpi: Fix the enabling of the Special Functions



Some Toshiba laptops with the "Special Functions" feature enabled
fail to properly enable such feature unless a specific value is
used to enable the hotkey events.

This patch adds a new function called "*_enable_special_functions",
that simply makes a call to the HCI_HOTKEY_EVENT call, but this time
we are using a different parameter to make the "Special Functions"
mode work as expected.

Signed-off-by: default avatarAzael Avalos <coproscefalo@gmail.com>
Signed-off-by: default avatarDarren Hart <dvhart@linux.intel.com>
parent a2b3471b
Loading
Loading
Loading
Loading
+24 −1
Original line number Diff line number Diff line
@@ -129,6 +129,7 @@ MODULE_LICENSE("GPL");
#define HCI_ACCEL_MASK			0x7fff
#define HCI_HOTKEY_DISABLE		0x0b
#define HCI_HOTKEY_ENABLE		0x09
#define HCI_HOTKEY_SPECIAL_FUNCTIONS	0x10
#define HCI_LCD_BRIGHTNESS_BITS		3
#define HCI_LCD_BRIGHTNESS_SHIFT	(16-HCI_LCD_BRIGHTNESS_BITS)
#define HCI_LCD_BRIGHTNESS_LEVELS	(1 << HCI_LCD_BRIGHTNESS_BITS)
@@ -2335,6 +2336,20 @@ static int toshiba_acpi_enable_hotkeys(struct toshiba_acpi_dev *dev)
	return 0;
}

static void toshiba_acpi_enable_special_functions(struct toshiba_acpi_dev *dev)
{
	u32 result;

	/*
	 * Re-activate the hotkeys, but this time, we are using the
	 * "Special Functions" mode.
	 */
	result = hci_write1(dev, HCI_HOTKEY_EVENT,
			    HCI_HOTKEY_SPECIAL_FUNCTIONS);
	if (result != TOS_SUCCESS)
		pr_err("Could not enable the Special Function mode\n");
}

static bool toshiba_acpi_i8042_filter(unsigned char data, unsigned char str,
				      struct serio *port)
{
@@ -2638,6 +2653,7 @@ static int toshiba_acpi_add(struct acpi_device *acpi_dev)
{
	struct toshiba_acpi_dev *dev;
	const char *hci_method;
	u32 special_functions;
	u32 dummy;
	bool bt_present;
	int ret = 0;
@@ -2669,7 +2685,7 @@ static int toshiba_acpi_add(struct acpi_device *acpi_dev)
	 * with the new keyboard layout, query for its presence to help
	 * determine the keymap layout to use.
	 */
	ret = toshiba_function_keys_get(dev, &dummy);
	ret = toshiba_function_keys_get(dev, &special_functions);
	dev->kbd_function_keys_supported = !ret;

	if (toshiba_acpi_setup_keyboard(dev))
@@ -2761,6 +2777,13 @@ static int toshiba_acpi_add(struct acpi_device *acpi_dev)
	ret = get_fan_status(dev, &dummy);
	dev->fan_supported = !ret;

	/*
	 * Enable the "Special Functions" mode only if they are
	 * supported and if they are activated.
	 */
	if (dev->kbd_function_keys_supported && special_functions)
		toshiba_acpi_enable_special_functions(dev);

	ret = sysfs_create_group(&dev->acpi_dev->dev.kobj,
				 &toshiba_attr_group);
	if (ret) {