linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v10 0/3] Huawei laptops
@ 2018-12-11  6:01 Ayman Bagabas
  2018-12-11  6:01 ` [PATCH v10 1/3] ALSA: hda: fix front speakers on Huawei MBXP Ayman Bagabas
                   ` (2 more replies)
  0 siblings, 3 replies; 11+ messages in thread
From: Ayman Bagabas @ 2018-12-11  6:01 UTC (permalink / raw)
  To: Darren Hart, Andy Shevchenko, Jaroslav Kysela, Takashi Iwai,
	Kailang Yang, Hui Wang, linux-kernel, platform-driver-x86,
	alsa-devel
  Cc: ayman.bagabas

This patch set is based on the new audio LED triggers in topic/leds-trigger branch from
        git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git

Changes in v10:
* Use ec_get_handle instead of acpi_get_handle since we are using the ec device
* Switch to WMI0_EXPENSIVE_GUID and wmi_query_block to fetch keycode when WMI0 is used

Changes in v9:
* Explicitly use NULL in acpi_get_handle
* Drop __initconst from huawei_wmi_keymap

Changes in v8:
* Switch to wmi_driver
* Use devm to allocate and manage devices
* Skip registering LED subsystem if a ACPI controller method was not found

Changes in v7:
* Use audio LED triggers patch set
* Use KEY_CONFIG (XF86Tools) instead of KEY_PROG1.
 In Windows, the key is used to launch Huawei PC manager. XF86Tools is
 used by default on most desktop environments i.e. Gnome.

Changes in v6:
* Review tags

Changes in v5:
* Consistency in file names
* How module would be enabled (Kconfig)
* Match license in SPDX and MODULE_LICENSE 

Changes in v4:
* Code formatting

Changes in v3:
* Support for Huawei MBX
* Style and formatting issues

Ayman Bagabas (3):
  ALSA: hda: fix front speakers on Huawei MBXP.
  x86: add support for Huawei WMI hotkeys.
  ALSA: hda: add support for Huawei WMI micmute LED

 drivers/platform/x86/Kconfig      |  17 +++
 drivers/platform/x86/Makefile     |   1 +
 drivers/platform/x86/huawei-wmi.c | 220 ++++++++++++++++++++++++++++++
 sound/pci/hda/patch_realtek.c     |  22 +++
 4 files changed, 260 insertions(+)
 create mode 100644 drivers/platform/x86/huawei-wmi.c

-- 
2.19.2


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH v10 1/3] ALSA: hda: fix front speakers on Huawei MBXP.
  2018-12-11  6:01 [PATCH v10 0/3] Huawei laptops Ayman Bagabas
@ 2018-12-11  6:01 ` Ayman Bagabas
  2018-12-11  6:01 ` [PATCH v10 2/3] x86: add support for Huawei WMI hotkeys Ayman Bagabas
  2018-12-11  6:01 ` [PATCH v10 3/3] ALSA: hda: add support for Huawei WMI micmute LED Ayman Bagabas
  2 siblings, 0 replies; 11+ messages in thread
From: Ayman Bagabas @ 2018-12-11  6:01 UTC (permalink / raw)
  To: Darren Hart, Andy Shevchenko, Jaroslav Kysela, Takashi Iwai,
	Kailang Yang, Hui Wang, linux-kernel, platform-driver-x86,
	alsa-devel
  Cc: ayman.bagabas

This patch solves bug 200501 'Only 2 of 4 speakers playing sound.'
https://bugzilla.kernel.org/show_bug.cgi?id=200501
It enables the front speakers on Huawei Matebook X Pro laptops.
These laptops come with Dolby Atmos sound system and these pins
configuration enables the front speakers.

Reviewed-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Ayman Bagabas <ayman.bagabas@gmail.com>
---
 sound/pci/hda/patch_realtek.c | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index 993d34c141c2..1326f32f4574 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -5490,6 +5490,7 @@ enum {
 	ALC298_FIXUP_TPT470_DOCK,
 	ALC255_FIXUP_DUMMY_LINEOUT_VERB,
 	ALC255_FIXUP_DELL_HEADSET_MIC,
+	ALC256_FIXUP_HUAWEI_MBXP_PINS,
 	ALC295_FIXUP_HP_X360,
 	ALC221_FIXUP_HP_HEADSET_MIC,
 };
@@ -5761,6 +5762,22 @@ static const struct hda_fixup alc269_fixups[] = {
 		.chained = true,
 		.chain_id = ALC269_FIXUP_HEADSET_MIC
 	},
+	[ALC256_FIXUP_HUAWEI_MBXP_PINS] = {
+		.type = HDA_FIXUP_PINS,
+		.v.pins = (const struct hda_pintbl[]) {
+			{0x12, 0x90a60130},
+			{0x13, 0x40000000},
+			{0x14, 0x90170110},
+			{0x18, 0x411111f0},
+			{0x19, 0x04a11040},
+			{0x1a, 0x411111f0},
+			{0x1b, 0x90170112},
+			{0x1d, 0x40759a05},
+			{0x1e, 0x411111f0},
+			{0x21, 0x04211020},
+			{ }
+		}
+	},
 	[ALC269_FIXUP_ASUS_X101_FUNC] = {
 		.type = HDA_FIXUP_FUNC,
 		.v.func = alc269_fixup_x101_headset_mic,
@@ -6591,6 +6608,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
 	SND_PCI_QUIRK(0x17aa, 0x511f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
 	SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K),
 	SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD),
+	SND_PCI_QUIRK(0x19e5, 0x3204, "Huawei MBXP", ALC256_FIXUP_HUAWEI_MBXP_PINS),
 	SND_PCI_QUIRK(0x1b7d, 0xa831, "Ordissimo EVE2 ", ALC269VB_FIXUP_ORDISSIMO_EVE2), /* Also known as Malata PC-B1303 */
 
 #if 0
-- 
2.19.2


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH v10 2/3] x86: add support for Huawei WMI hotkeys.
  2018-12-11  6:01 [PATCH v10 0/3] Huawei laptops Ayman Bagabas
  2018-12-11  6:01 ` [PATCH v10 1/3] ALSA: hda: fix front speakers on Huawei MBXP Ayman Bagabas
@ 2018-12-11  6:01 ` Ayman Bagabas
  2018-12-11 10:14   ` Andy Shevchenko
  2018-12-11  6:01 ` [PATCH v10 3/3] ALSA: hda: add support for Huawei WMI micmute LED Ayman Bagabas
  2 siblings, 1 reply; 11+ messages in thread
From: Ayman Bagabas @ 2018-12-11  6:01 UTC (permalink / raw)
  To: Darren Hart, Andy Shevchenko, Jaroslav Kysela, Takashi Iwai,
	Kailang Yang, Hui Wang, linux-kernel, platform-driver-x86,
	alsa-devel
  Cc: ayman.bagabas

This driver adds support for missing hotkeys on some Huawei laptops.
Laptops such as the Matebook X have non functioning hotkeys. Whereas
newer laptops such as the Matebook X Pro come with working hotkeys out
of the box.

Old laptops, such as the Matebook X, report hotkey events through ACPI
device "\WMI0". However, new laptops, such as the Matebook X Pro,
does not have this WMI device.

All the hotkeys on the Matebook X Pro work fine
without this patch except (micmute, wlan, and huawei key). These keys
and the brightness keys report events to "\AMW0" ACPI device. One
problem is that brightness keys on the Matebook X Pro work without this
patch. This results in reporting two brightness key press
events one is captured by ACPI and another by this driver.

A solution would be to check if such event came from the "\AMW0" WMI driver
then skip reporting event. Another solution would be to leave this to
user-space to handle. Which can be achieved by using "hwdb" tables and
remap those keys to "unknown". This solution seems more natural to me
because it leaves the decision to user-space.

Reviewed-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Ayman Bagabas <ayman.bagabas@gmail.com>
---
 drivers/platform/x86/Kconfig      |  17 +++
 drivers/platform/x86/Makefile     |   1 +
 drivers/platform/x86/huawei-wmi.c | 220 ++++++++++++++++++++++++++++++
 3 files changed, 238 insertions(+)
 create mode 100644 drivers/platform/x86/huawei-wmi.c

diff --git a/drivers/platform/x86/Kconfig b/drivers/platform/x86/Kconfig
index 87f70e8f4dd0..45ef4d22f14c 100644
--- a/drivers/platform/x86/Kconfig
+++ b/drivers/platform/x86/Kconfig
@@ -1292,6 +1292,23 @@ config INTEL_ATOMISP2_PM
 	  To compile this driver as a module, choose M here: the module
 	  will be called intel_atomisp2_pm.
 
+config HUAWEI_WMI
+	tristate "Huawei WMI hotkeys driver"
+	depends on ACPI_WMI
+	depends on INPUT
+	select INPUT_SPARSEKMAP
+	select LEDS_CLASS
+	select LEDS_TRIGGERS
+	select LEDS_TRIGGER_AUDIO
+	select NEW_LEDS
+	help
+	  This driver provides support for Huawei WMI hotkeys.
+	  It enables the missing keys and adds support to the micmute
+	  LED found on some of these laptops.
+
+	  To compile this driver as a module, choose M here: the module
+	  will be called huawei-wmi.
+
 endif # X86_PLATFORM_DEVICES
 
 config PMC_ATOM
diff --git a/drivers/platform/x86/Makefile b/drivers/platform/x86/Makefile
index 39ae94135406..d841c550e3cc 100644
--- a/drivers/platform/x86/Makefile
+++ b/drivers/platform/x86/Makefile
@@ -32,6 +32,7 @@ obj-$(CONFIG_ACERHDF)		+= acerhdf.o
 obj-$(CONFIG_HP_ACCEL)		+= hp_accel.o
 obj-$(CONFIG_HP_WIRELESS)	+= hp-wireless.o
 obj-$(CONFIG_HP_WMI)		+= hp-wmi.o
+obj-$(CONFIG_HUAWEI_WMI)		+= huawei-wmi.o
 obj-$(CONFIG_AMILO_RFKILL)	+= amilo-rfkill.o
 obj-$(CONFIG_GPD_POCKET_FAN)	+= gpd-pocket-fan.o
 obj-$(CONFIG_TC1100_WMI)	+= tc1100-wmi.o
diff --git a/drivers/platform/x86/huawei-wmi.c b/drivers/platform/x86/huawei-wmi.c
new file mode 100644
index 000000000000..89ba7ea33499
--- /dev/null
+++ b/drivers/platform/x86/huawei-wmi.c
@@ -0,0 +1,220 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ *  Huawei WMI hotkeys
+ *
+ *  Copyright (C) 2018	      Ayman Bagabas <ayman.bagabas@gmail.com>
+ */
+
+#include <linux/acpi.h>
+#include <linux/input.h>
+#include <linux/input/sparse-keymap.h>
+#include <linux/leds.h>
+#include <linux/module.h>
+#include <linux/wmi.h>
+
+/*
+ * Huawei WMI GUIDs
+ */
+#define WMI0_EVENT_GUID "59142400-C6A3-40fa-BADB-8A2652834100"
+#define AMW0_EVENT_GUID "ABBC0F5C-8EA1-11D1-A000-C90629100000"
+
+#define WMI0_EXPENSIVE_GUID "39142400-C6A3-40fa-BADB-8A2652834100"
+
+struct huawei_wmi_priv {
+	struct input_dev *idev;
+	struct led_classdev cdev;
+	acpi_handle handle;
+	char *acpi_method;
+};
+
+static const struct key_entry huawei_wmi_keymap[] = {
+	{ KE_KEY,    0x281, { KEY_BRIGHTNESSDOWN } },
+	{ KE_KEY,    0x282, { KEY_BRIGHTNESSUP } },
+	{ KE_KEY,    0x284, { KEY_MUTE } },
+	{ KE_KEY,    0x285, { KEY_VOLUMEDOWN } },
+	{ KE_KEY,    0x286, { KEY_VOLUMEUP } },
+	{ KE_KEY,    0x287, { KEY_MICMUTE } },
+	{ KE_KEY,    0x289, { KEY_WLAN } },
+	// Huawei |M| key
+	{ KE_KEY,    0x28a, { KEY_CONFIG } },
+	// Keyboard backlight
+	{ KE_IGNORE, 0x293, { KEY_KBDILLUMTOGGLE } },
+	{ KE_IGNORE, 0x294, { KEY_KBDILLUMUP } },
+	{ KE_IGNORE, 0x295, { KEY_KBDILLUMUP } },
+	{ KE_END,	 0 }
+};
+
+static int huawei_wmi_micmute_led_set(struct led_classdev *led_cdev,
+		enum led_brightness brightness)
+{
+	struct huawei_wmi_priv *priv = dev_get_drvdata(led_cdev->dev->parent);
+	acpi_status status;
+	union acpi_object args[3];
+	struct acpi_object_list arg_list = {
+		.pointer = args,
+		.count = ARRAY_SIZE(args),
+	};
+
+	args[0].type = args[1].type = args[2].type = ACPI_TYPE_INTEGER;
+	args[1].integer.value = 0x04;
+
+	if (strcmp(priv->acpi_method, "SPIN") == 0) {
+		args[0].integer.value = 0;
+		args[2].integer.value = brightness ? 1 : 0;
+	} else if (strcmp(priv->acpi_method, "WPIN") == 0) {
+		args[0].integer.value = 1;
+		args[2].integer.value = brightness ? 0 : 1;
+	} else {
+		return -EINVAL;
+	}
+
+	status = acpi_evaluate_object(priv->handle, priv->acpi_method, &arg_list, NULL);
+	if (ACPI_FAILURE(status))
+		return -ENXIO;
+
+	return 0;
+}
+
+static int huawei_wmi_leds_setup(struct wmi_device *wdev)
+{
+	struct huawei_wmi_priv *priv = dev_get_drvdata(&wdev->dev);
+	acpi_status status;
+
+	/* Skip registering LED subsystem if no ACPI method was found.
+	 * ec_get_handle() returns the first embedded controller device
+	 * handle which then used to locate SPIN and WPIN methods.
+	 */
+	priv->handle = ec_get_handle();
+	if (!priv->handle)
+		return 0;
+
+	if (acpi_has_method(priv->handle, "SPIN"))
+		priv->acpi_method = "SPIN";
+	else if (acpi_has_method(priv->handle, "WPIN"))
+		priv->acpi_method = "WPIN";
+	else
+		return 0;
+
+	priv->cdev.name = "platform::micmute";
+	priv->cdev.max_brightness = 1;
+	priv->cdev.brightness_set_blocking = huawei_wmi_micmute_led_set;
+	priv->cdev.default_trigger = "audio-micmute";
+	priv->cdev.brightness = ledtrig_audio_get(LED_AUDIO_MICMUTE);
+	priv->cdev.dev = &wdev->dev;
+	priv->cdev.flags = LED_CORE_SUSPENDRESUME;
+
+	return devm_led_classdev_register(&wdev->dev, &priv->cdev);
+}
+
+static void huawei_wmi_process_key(struct wmi_device *wdev, int code)
+{
+	struct huawei_wmi_priv *priv = dev_get_drvdata(&wdev->dev);
+	const struct key_entry *key;
+
+	/*
+	 * WMI0 uses code 0x80 to indicate a hotkey event.
+	 * The actual key is fetched from the method WQ00
+	 * using WMI0_EXPENSIVE_GUID.
+	 */
+	if (code == 0x80) {
+		struct acpi_buffer response = { ACPI_ALLOCATE_BUFFER, NULL };
+		union acpi_object *obj;
+		acpi_status status;
+
+		status = wmi_query_block(WMI0_EXPENSIVE_GUID, 0, &response);
+		if (ACPI_FAILURE(status))
+			return;
+
+		obj = (union acpi_object *)response.pointer;
+		if (obj && obj->type == ACPI_TYPE_INTEGER)
+			code = obj->integer.value;
+
+		kfree(response.pointer);
+	}
+
+	key = sparse_keymap_entry_from_scancode(priv->idev, code);
+	if (!key) {
+		dev_info(&wdev->dev, "Unknown key pressed, code: 0x%04x\n", code);
+		return;
+	}
+
+	sparse_keymap_report_entry(priv->idev, key, 1, true);
+}
+
+static void huawei_wmi_notify(struct wmi_device *wdev,
+		union acpi_object *obj)
+{
+	if (obj->type == ACPI_TYPE_INTEGER)
+		huawei_wmi_process_key(wdev, obj->integer.value);
+	else
+		dev_info(&wdev->dev, "Bad response type %d\n", obj->type);
+}
+
+static int huawei_wmi_input_setup(struct wmi_device *wdev)
+{
+	struct huawei_wmi_priv *priv = dev_get_drvdata(&wdev->dev);
+	int err;
+
+	priv->idev = devm_input_allocate_device(&wdev->dev);
+	if (!priv->idev)
+		return -ENOMEM;
+
+	priv->idev->name = "Huawei WMI hotkeys";
+	priv->idev->phys = "wmi/input0";
+	priv->idev->id.bustype = BUS_HOST;
+	priv->idev->dev.parent = &wdev->dev;
+
+	err = sparse_keymap_setup(priv->idev, huawei_wmi_keymap, NULL);
+	if (err)
+		return err;
+
+	err = input_register_device(priv->idev);
+	if (err)
+		return err;
+
+	return 0;
+}
+
+static int huawei_wmi_probe(struct wmi_device *wdev)
+{
+	struct huawei_wmi_priv *priv;
+	int err;
+
+	priv = devm_kzalloc(&wdev->dev, sizeof(struct huawei_wmi_priv), GFP_KERNEL);
+	if (!priv)
+		return -ENOMEM;
+	dev_set_drvdata(&wdev->dev, priv);
+
+	err = huawei_wmi_input_setup(wdev);
+	if (err)
+		return err;
+
+	err = huawei_wmi_leds_setup(wdev);
+	if (err)
+		return err;
+
+	return 0;
+}
+
+static const struct wmi_device_id huawei_wmi_id_table[] = {
+	{ .guid_string = WMI0_EVENT_GUID },
+	{ .guid_string = AMW0_EVENT_GUID },
+	{  }
+};
+
+static struct wmi_driver huawei_wmi_driver = {
+	.driver = {
+		.name = "huawei-wmi",
+	},
+	.id_table = huawei_wmi_id_table,
+	.probe = huawei_wmi_probe,
+	.notify = huawei_wmi_notify,
+};
+
+module_wmi_driver(huawei_wmi_driver);
+
+MODULE_ALIAS("wmi:"WMI0_EVENT_GUID);
+MODULE_ALIAS("wmi:"AMW0_EVENT_GUID);
+MODULE_AUTHOR("Ayman Bagabas <ayman.bagabas@gmail.com>");
+MODULE_DESCRIPTION("Huawei WMI hotkeys");
+MODULE_LICENSE("GPL v2");
-- 
2.19.2


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH v10 3/3] ALSA: hda: add support for Huawei WMI micmute LED
  2018-12-11  6:01 [PATCH v10 0/3] Huawei laptops Ayman Bagabas
  2018-12-11  6:01 ` [PATCH v10 1/3] ALSA: hda: fix front speakers on Huawei MBXP Ayman Bagabas
  2018-12-11  6:01 ` [PATCH v10 2/3] x86: add support for Huawei WMI hotkeys Ayman Bagabas
@ 2018-12-11  6:01 ` Ayman Bagabas
  2018-12-11 10:09   ` Andy Shevchenko
  2 siblings, 1 reply; 11+ messages in thread
From: Ayman Bagabas @ 2018-12-11  6:01 UTC (permalink / raw)
  To: Darren Hart, Andy Shevchenko, Jaroslav Kysela, Takashi Iwai,
	Kailang Yang, Hui Wang, linux-kernel, platform-driver-x86,
	alsa-devel
  Cc: ayman.bagabas

Some of Huawei laptops come with a LED in the micmute key. This patch
enables the use of micmute LED for these devices:
1. Matebook X (19e5:3200), (19e5:3201)
2. Matebook X Pro (19e5:3204)

Reviewed-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Ayman Bagabas <ayman.bagabas@gmail.com>
---
 sound/pci/hda/patch_realtek.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index 1326f32f4574..9766fd249bdf 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -5776,7 +5776,9 @@ static const struct hda_fixup alc269_fixups[] = {
 			{0x1e, 0x411111f0},
 			{0x21, 0x04211020},
 			{ }
-		}
+		},
+		.chained = true,
+		.chain_id = ALC255_FIXUP_MIC_MUTE_LED
 	},
 	[ALC269_FIXUP_ASUS_X101_FUNC] = {
 		.type = HDA_FIXUP_FUNC,
@@ -6608,6 +6610,8 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
 	SND_PCI_QUIRK(0x17aa, 0x511f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
 	SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K),
 	SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD),
+	SND_PCI_QUIRK(0x19e5, 0x3200, "Huawei MBX", ALC255_FIXUP_MIC_MUTE_LED),
+	SND_PCI_QUIRK(0x19e5, 0x3201, "Huawei MBX", ALC255_FIXUP_MIC_MUTE_LED),
 	SND_PCI_QUIRK(0x19e5, 0x3204, "Huawei MBXP", ALC256_FIXUP_HUAWEI_MBXP_PINS),
 	SND_PCI_QUIRK(0x1b7d, 0xa831, "Ordissimo EVE2 ", ALC269VB_FIXUP_ORDISSIMO_EVE2), /* Also known as Malata PC-B1303 */
 
-- 
2.19.2


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH v10 3/3] ALSA: hda: add support for Huawei WMI micmute LED
  2018-12-11  6:01 ` [PATCH v10 3/3] ALSA: hda: add support for Huawei WMI micmute LED Ayman Bagabas
@ 2018-12-11 10:09   ` Andy Shevchenko
  2018-12-11 10:27     ` Takashi Iwai
  0 siblings, 1 reply; 11+ messages in thread
From: Andy Shevchenko @ 2018-12-11 10:09 UTC (permalink / raw)
  To: Ayman Bagabas
  Cc: Darren Hart, Andy Shevchenko, Jaroslav Kysela, Takashi Iwai,
	Kailang Yang, Hui Wang, Linux Kernel Mailing List,
	Platform Driver, ALSA Development Mailing List

On Tue, Dec 11, 2018 at 8:02 AM Ayman Bagabas <ayman.bagabas@gmail.com> wrote:
>
> Some of Huawei laptops come with a LED in the micmute key. This patch
> enables the use of micmute LED for these devices:
> 1. Matebook X (19e5:3200), (19e5:3201)
> 2. Matebook X Pro (19e5:3204)
>
> Reviewed-by: Takashi Iwai <tiwai@suse.de>
> Signed-off-by: Ayman Bagabas <ayman.bagabas@gmail.com>
> ---
>  sound/pci/hda/patch_realtek.c | 6 +++++-
>  1 file changed, 5 insertions(+), 1 deletion(-)
>
> diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
> index 1326f32f4574..9766fd249bdf 100644
> --- a/sound/pci/hda/patch_realtek.c
> +++ b/sound/pci/hda/patch_realtek.c
> @@ -5776,7 +5776,9 @@ static const struct hda_fixup alc269_fixups[] = {
>                         {0x1e, 0x411111f0},
>                         {0x21, 0x04211020},
>                         { }

> -               }
> +               },

This is not related change, but we may fix it when applying.

> +               .chained = true,
> +               .chain_id = ALC255_FIXUP_MIC_MUTE_LED
>         },
>         [ALC269_FIXUP_ASUS_X101_FUNC] = {
>                 .type = HDA_FIXUP_FUNC,
> @@ -6608,6 +6610,8 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
>         SND_PCI_QUIRK(0x17aa, 0x511f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
>         SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K),
>         SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD),
> +       SND_PCI_QUIRK(0x19e5, 0x3200, "Huawei MBX", ALC255_FIXUP_MIC_MUTE_LED),
> +       SND_PCI_QUIRK(0x19e5, 0x3201, "Huawei MBX", ALC255_FIXUP_MIC_MUTE_LED),
>         SND_PCI_QUIRK(0x19e5, 0x3204, "Huawei MBXP", ALC256_FIXUP_HUAWEI_MBXP_PINS),
>         SND_PCI_QUIRK(0x1b7d, 0xa831, "Ordissimo EVE2 ", ALC269VB_FIXUP_ORDISSIMO_EVE2), /* Also known as Malata PC-B1303 */
>
> --
> 2.19.2
>


-- 
With Best Regards,
Andy Shevchenko

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v10 2/3] x86: add support for Huawei WMI hotkeys.
  2018-12-11  6:01 ` [PATCH v10 2/3] x86: add support for Huawei WMI hotkeys Ayman Bagabas
@ 2018-12-11 10:14   ` Andy Shevchenko
  2018-12-11 20:10     ` ayman.bagabas
  0 siblings, 1 reply; 11+ messages in thread
From: Andy Shevchenko @ 2018-12-11 10:14 UTC (permalink / raw)
  To: Ayman Bagabas
  Cc: Darren Hart, Andy Shevchenko, Jaroslav Kysela, Takashi Iwai,
	Kailang Yang, Hui Wang, Linux Kernel Mailing List,
	Platform Driver, ALSA Development Mailing List

On Tue, Dec 11, 2018 at 8:02 AM Ayman Bagabas <ayman.bagabas@gmail.com> wrote:
>
> This driver adds support for missing hotkeys on some Huawei laptops.
> Laptops such as the Matebook X have non functioning hotkeys. Whereas
> newer laptops such as the Matebook X Pro come with working hotkeys out
> of the box.
>
> Old laptops, such as the Matebook X, report hotkey events through ACPI
> device "\WMI0". However, new laptops, such as the Matebook X Pro,
> does not have this WMI device.
>
> All the hotkeys on the Matebook X Pro work fine
> without this patch except (micmute, wlan, and huawei key). These keys
> and the brightness keys report events to "\AMW0" ACPI device. One
> problem is that brightness keys on the Matebook X Pro work without this
> patch. This results in reporting two brightness key press
> events one is captured by ACPI and another by this driver.
>
> A solution would be to check if such event came from the "\AMW0" WMI driver
> then skip reporting event. Another solution would be to leave this to
> user-space to handle. Which can be achieved by using "hwdb" tables and
> remap those keys to "unknown". This solution seems more natural to me
> because it leaves the decision to user-space.
>
> Reviewed-by: Takashi Iwai <tiwai@suse.de>
> Signed-off-by: Ayman Bagabas <ayman.bagabas@gmail.com>
> ---
>  drivers/platform/x86/Kconfig      |  17 +++
>  drivers/platform/x86/Makefile     |   1 +
>  drivers/platform/x86/huawei-wmi.c | 220 ++++++++++++++++++++++++++++++
>  3 files changed, 238 insertions(+)
>  create mode 100644 drivers/platform/x86/huawei-wmi.c
>
> diff --git a/drivers/platform/x86/Kconfig b/drivers/platform/x86/Kconfig
> index 87f70e8f4dd0..45ef4d22f14c 100644
> --- a/drivers/platform/x86/Kconfig
> +++ b/drivers/platform/x86/Kconfig
> @@ -1292,6 +1292,23 @@ config INTEL_ATOMISP2_PM
>           To compile this driver as a module, choose M here: the module
>           will be called intel_atomisp2_pm.
>
> +config HUAWEI_WMI
> +       tristate "Huawei WMI hotkeys driver"
> +       depends on ACPI_WMI
> +       depends on INPUT
> +       select INPUT_SPARSEKMAP
> +       select LEDS_CLASS
> +       select LEDS_TRIGGERS
> +       select LEDS_TRIGGER_AUDIO
> +       select NEW_LEDS
> +       help
> +         This driver provides support for Huawei WMI hotkeys.
> +         It enables the missing keys and adds support to the micmute
> +         LED found on some of these laptops.
> +
> +         To compile this driver as a module, choose M here: the module
> +         will be called huawei-wmi.
> +
>  endif # X86_PLATFORM_DEVICES
>
>  config PMC_ATOM
> diff --git a/drivers/platform/x86/Makefile b/drivers/platform/x86/Makefile
> index 39ae94135406..d841c550e3cc 100644
> --- a/drivers/platform/x86/Makefile
> +++ b/drivers/platform/x86/Makefile
> @@ -32,6 +32,7 @@ obj-$(CONFIG_ACERHDF)         += acerhdf.o
>  obj-$(CONFIG_HP_ACCEL)         += hp_accel.o
>  obj-$(CONFIG_HP_WIRELESS)      += hp-wireless.o
>  obj-$(CONFIG_HP_WMI)           += hp-wmi.o
> +obj-$(CONFIG_HUAWEI_WMI)               += huawei-wmi.o
>  obj-$(CONFIG_AMILO_RFKILL)     += amilo-rfkill.o
>  obj-$(CONFIG_GPD_POCKET_FAN)   += gpd-pocket-fan.o
>  obj-$(CONFIG_TC1100_WMI)       += tc1100-wmi.o
> diff --git a/drivers/platform/x86/huawei-wmi.c b/drivers/platform/x86/huawei-wmi.c
> new file mode 100644
> index 000000000000..89ba7ea33499
> --- /dev/null
> +++ b/drivers/platform/x86/huawei-wmi.c
> @@ -0,0 +1,220 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + *  Huawei WMI hotkeys
> + *
> + *  Copyright (C) 2018       Ayman Bagabas <ayman.bagabas@gmail.com>
> + */
> +
> +#include <linux/acpi.h>
> +#include <linux/input.h>
> +#include <linux/input/sparse-keymap.h>
> +#include <linux/leds.h>
> +#include <linux/module.h>
> +#include <linux/wmi.h>
> +
> +/*
> + * Huawei WMI GUIDs
> + */
> +#define WMI0_EVENT_GUID "59142400-C6A3-40fa-BADB-8A2652834100"
> +#define AMW0_EVENT_GUID "ABBC0F5C-8EA1-11D1-A000-C90629100000"
> +
> +#define WMI0_EXPENSIVE_GUID "39142400-C6A3-40fa-BADB-8A2652834100"
> +
> +struct huawei_wmi_priv {
> +       struct input_dev *idev;
> +       struct led_classdev cdev;
> +       acpi_handle handle;
> +       char *acpi_method;
> +};
> +
> +static const struct key_entry huawei_wmi_keymap[] = {
> +       { KE_KEY,    0x281, { KEY_BRIGHTNESSDOWN } },
> +       { KE_KEY,    0x282, { KEY_BRIGHTNESSUP } },
> +       { KE_KEY,    0x284, { KEY_MUTE } },
> +       { KE_KEY,    0x285, { KEY_VOLUMEDOWN } },
> +       { KE_KEY,    0x286, { KEY_VOLUMEUP } },
> +       { KE_KEY,    0x287, { KEY_MICMUTE } },
> +       { KE_KEY,    0x289, { KEY_WLAN } },
> +       // Huawei |M| key
> +       { KE_KEY,    0x28a, { KEY_CONFIG } },
> +       // Keyboard backlight
> +       { KE_IGNORE, 0x293, { KEY_KBDILLUMTOGGLE } },
> +       { KE_IGNORE, 0x294, { KEY_KBDILLUMUP } },
> +       { KE_IGNORE, 0x295, { KEY_KBDILLUMUP } },
> +       { KE_END,        0 }
> +};
> +
> +static int huawei_wmi_micmute_led_set(struct led_classdev *led_cdev,
> +               enum led_brightness brightness)
> +{
> +       struct huawei_wmi_priv *priv = dev_get_drvdata(led_cdev->dev->parent);
> +       acpi_status status;
> +       union acpi_object args[3];
> +       struct acpi_object_list arg_list = {
> +               .pointer = args,
> +               .count = ARRAY_SIZE(args),
> +       };
> +
> +       args[0].type = args[1].type = args[2].type = ACPI_TYPE_INTEGER;
> +       args[1].integer.value = 0x04;
> +
> +       if (strcmp(priv->acpi_method, "SPIN") == 0) {
> +               args[0].integer.value = 0;
> +               args[2].integer.value = brightness ? 1 : 0;
> +       } else if (strcmp(priv->acpi_method, "WPIN") == 0) {
> +               args[0].integer.value = 1;
> +               args[2].integer.value = brightness ? 0 : 1;
> +       } else {
> +               return -EINVAL;
> +       }
> +
> +       status = acpi_evaluate_object(priv->handle, priv->acpi_method, &arg_list, NULL);
> +       if (ACPI_FAILURE(status))
> +               return -ENXIO;
> +
> +       return 0;
> +}
> +
> +static int huawei_wmi_leds_setup(struct wmi_device *wdev)
> +{
> +       struct huawei_wmi_priv *priv = dev_get_drvdata(&wdev->dev);
> +       acpi_status status;
> +

> +       /* Skip registering LED subsystem if no ACPI method was found.
> +        * ec_get_handle() returns the first embedded controller device
> +        * handle which then used to locate SPIN and WPIN methods.
> +        */

Comment style is cripple here.
All issues we may fix when applying.

> +       priv->handle = ec_get_handle();
> +       if (!priv->handle)
> +               return 0;
> +
> +       if (acpi_has_method(priv->handle, "SPIN"))
> +               priv->acpi_method = "SPIN";
> +       else if (acpi_has_method(priv->handle, "WPIN"))
> +               priv->acpi_method = "WPIN";
> +       else
> +               return 0;
> +
> +       priv->cdev.name = "platform::micmute";
> +       priv->cdev.max_brightness = 1;
> +       priv->cdev.brightness_set_blocking = huawei_wmi_micmute_led_set;
> +       priv->cdev.default_trigger = "audio-micmute";
> +       priv->cdev.brightness = ledtrig_audio_get(LED_AUDIO_MICMUTE);
> +       priv->cdev.dev = &wdev->dev;
> +       priv->cdev.flags = LED_CORE_SUSPENDRESUME;
> +
> +       return devm_led_classdev_register(&wdev->dev, &priv->cdev);
> +}
> +
> +static void huawei_wmi_process_key(struct wmi_device *wdev, int code)
> +{
> +       struct huawei_wmi_priv *priv = dev_get_drvdata(&wdev->dev);
> +       const struct key_entry *key;
> +
> +       /*
> +        * WMI0 uses code 0x80 to indicate a hotkey event.
> +        * The actual key is fetched from the method WQ00
> +        * using WMI0_EXPENSIVE_GUID.
> +        */
> +       if (code == 0x80) {
> +               struct acpi_buffer response = { ACPI_ALLOCATE_BUFFER, NULL };
> +               union acpi_object *obj;
> +               acpi_status status;
> +
> +               status = wmi_query_block(WMI0_EXPENSIVE_GUID, 0, &response);
> +               if (ACPI_FAILURE(status))
> +                       return;
> +
> +               obj = (union acpi_object *)response.pointer;
> +               if (obj && obj->type == ACPI_TYPE_INTEGER)
> +                       code = obj->integer.value;
> +
> +               kfree(response.pointer);
> +       }
> +
> +       key = sparse_keymap_entry_from_scancode(priv->idev, code);
> +       if (!key) {
> +               dev_info(&wdev->dev, "Unknown key pressed, code: 0x%04x\n", code);
> +               return;
> +       }
> +
> +       sparse_keymap_report_entry(priv->idev, key, 1, true);
> +}
> +
> +static void huawei_wmi_notify(struct wmi_device *wdev,
> +               union acpi_object *obj)
> +{
> +       if (obj->type == ACPI_TYPE_INTEGER)
> +               huawei_wmi_process_key(wdev, obj->integer.value);
> +       else
> +               dev_info(&wdev->dev, "Bad response type %d\n", obj->type);
> +}
> +
> +static int huawei_wmi_input_setup(struct wmi_device *wdev)
> +{
> +       struct huawei_wmi_priv *priv = dev_get_drvdata(&wdev->dev);
> +       int err;
> +
> +       priv->idev = devm_input_allocate_device(&wdev->dev);
> +       if (!priv->idev)
> +               return -ENOMEM;
> +
> +       priv->idev->name = "Huawei WMI hotkeys";
> +       priv->idev->phys = "wmi/input0";
> +       priv->idev->id.bustype = BUS_HOST;
> +       priv->idev->dev.parent = &wdev->dev;
> +
> +       err = sparse_keymap_setup(priv->idev, huawei_wmi_keymap, NULL);
> +       if (err)
> +               return err;
> +

> +       err = input_register_device(priv->idev);
> +       if (err)
> +               return err;
> +
> +       return 0;

return input_register_device(...);

> +}
> +
> +static int huawei_wmi_probe(struct wmi_device *wdev)
> +{
> +       struct huawei_wmi_priv *priv;
> +       int err;
> +
> +       priv = devm_kzalloc(&wdev->dev, sizeof(struct huawei_wmi_priv), GFP_KERNEL);
> +       if (!priv)
> +               return -ENOMEM;

+ blank line.

> +       dev_set_drvdata(&wdev->dev, priv);
> +
> +       err = huawei_wmi_input_setup(wdev);
> +       if (err)
> +               return err;
> +

> +       err = huawei_wmi_leds_setup(wdev);
> +       if (err)
> +               return err;
> +
> +       return 0;

return huawei_wmi_leds_setup(...);

> +}
> +
> +static const struct wmi_device_id huawei_wmi_id_table[] = {
> +       { .guid_string = WMI0_EVENT_GUID },
> +       { .guid_string = AMW0_EVENT_GUID },
> +       {  }
> +};
> +
> +static struct wmi_driver huawei_wmi_driver = {
> +       .driver = {
> +               .name = "huawei-wmi",
> +       },
> +       .id_table = huawei_wmi_id_table,
> +       .probe = huawei_wmi_probe,
> +       .notify = huawei_wmi_notify,
> +};
> +
> +module_wmi_driver(huawei_wmi_driver);
> +
> +MODULE_ALIAS("wmi:"WMI0_EVENT_GUID);
> +MODULE_ALIAS("wmi:"AMW0_EVENT_GUID);
> +MODULE_AUTHOR("Ayman Bagabas <ayman.bagabas@gmail.com>");
> +MODULE_DESCRIPTION("Huawei WMI hotkeys");
> +MODULE_LICENSE("GPL v2");
> --
> 2.19.2
>


-- 
With Best Regards,
Andy Shevchenko

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v10 3/3] ALSA: hda: add support for Huawei WMI micmute LED
  2018-12-11 10:09   ` Andy Shevchenko
@ 2018-12-11 10:27     ` Takashi Iwai
  0 siblings, 0 replies; 11+ messages in thread
From: Takashi Iwai @ 2018-12-11 10:27 UTC (permalink / raw)
  To: Andy Shevchenko
  Cc: Ayman Bagabas, ALSA Development Mailing List, Hui Wang,
	Andy Shevchenko, Darren Hart, Jaroslav Kysela, Kailang Yang,
	Linux Kernel Mailing List, Platform Driver

On Tue, 11 Dec 2018 11:09:59 +0100,
Andy Shevchenko wrote:
> 
> On Tue, Dec 11, 2018 at 8:02 AM Ayman Bagabas <ayman.bagabas@gmail.com> wrote:
> >
> > Some of Huawei laptops come with a LED in the micmute key. This patch
> > enables the use of micmute LED for these devices:
> > 1. Matebook X (19e5:3200), (19e5:3201)
> > 2. Matebook X Pro (19e5:3204)
> >
> > Reviewed-by: Takashi Iwai <tiwai@suse.de>
> > Signed-off-by: Ayman Bagabas <ayman.bagabas@gmail.com>
> > ---
> >  sound/pci/hda/patch_realtek.c | 6 +++++-
> >  1 file changed, 5 insertions(+), 1 deletion(-)
> >
> > diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
> > index 1326f32f4574..9766fd249bdf 100644
> > --- a/sound/pci/hda/patch_realtek.c
> > +++ b/sound/pci/hda/patch_realtek.c
> > @@ -5776,7 +5776,9 @@ static const struct hda_fixup alc269_fixups[] = {
> >                         {0x1e, 0x411111f0},
> >                         {0x21, 0x04211020},
> >                         { }
> 
> > -               }
> > +               },
> 
> This is not related change, but we may fix it when applying.
> 
> > +               .chained = true,
> > +               .chain_id = ALC255_FIXUP_MIC_MUTE_LED

The comma is needed only because you add more fields.  So this isn't
wrong, per se.

OTOH, you can avoid this extra change if you already had a comma in
the first patch, yeah.


thanks,

Takashi

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v10 2/3] x86: add support for Huawei WMI hotkeys.
  2018-12-11 10:14   ` Andy Shevchenko
@ 2018-12-11 20:10     ` ayman.bagabas
  2018-12-12  6:56       ` Takashi Iwai
  0 siblings, 1 reply; 11+ messages in thread
From: ayman.bagabas @ 2018-12-11 20:10 UTC (permalink / raw)
  To: Andy Shevchenko
  Cc: Darren Hart, Andy Shevchenko, Jaroslav Kysela, Takashi Iwai,
	Kailang Yang, Hui Wang, Linux Kernel Mailing List,
	Platform Driver, ALSA Development Mailing List

On Tue, 2018-12-11 at 12:14 +0200, Andy Shevchenko wrote:
> On Tue, Dec 11, 2018 at 8:02 AM Ayman Bagabas <
> ayman.bagabas@gmail.com> wrote:
> > This driver adds support for missing hotkeys on some Huawei
> > laptops.
> > Laptops such as the Matebook X have non functioning hotkeys.
> > Whereas
> > newer laptops such as the Matebook X Pro come with working hotkeys
> > out
> > of the box.
> > 
> > Old laptops, such as the Matebook X, report hotkey events through
> > ACPI
> > device "\WMI0". However, new laptops, such as the Matebook X Pro,
> > does not have this WMI device.
> > 
> > All the hotkeys on the Matebook X Pro work fine
> > without this patch except (micmute, wlan, and huawei key). These
> > keys
> > and the brightness keys report events to "\AMW0" ACPI device. One
> > problem is that brightness keys on the Matebook X Pro work without
> > this
> > patch. This results in reporting two brightness key press
> > events one is captured by ACPI and another by this driver.
> > 
> > A solution would be to check if such event came from the "\AMW0"
> > WMI driver
> > then skip reporting event. Another solution would be to leave this
> > to
> > user-space to handle. Which can be achieved by using "hwdb" tables
> > and
> > remap those keys to "unknown". This solution seems more natural to
> > me
> > because it leaves the decision to user-space.
> > 
> > Reviewed-by: Takashi Iwai <tiwai@suse.de>
> > Signed-off-by: Ayman Bagabas <ayman.bagabas@gmail.com>
> > ---
> >  drivers/platform/x86/Kconfig      |  17 +++
> >  drivers/platform/x86/Makefile     |   1 +
> >  drivers/platform/x86/huawei-wmi.c | 220
> > ++++++++++++++++++++++++++++++
> >  3 files changed, 238 insertions(+)
> >  create mode 100644 drivers/platform/x86/huawei-wmi.c
> > 
> > diff --git a/drivers/platform/x86/Kconfig
> > b/drivers/platform/x86/Kconfig
> > index 87f70e8f4dd0..45ef4d22f14c 100644
> > --- a/drivers/platform/x86/Kconfig
> > +++ b/drivers/platform/x86/Kconfig
> > @@ -1292,6 +1292,23 @@ config INTEL_ATOMISP2_PM
> >           To compile this driver as a module, choose M here: the
> > module
> >           will be called intel_atomisp2_pm.
> > 
> > +config HUAWEI_WMI
> > +       tristate "Huawei WMI hotkeys driver"
> > +       depends on ACPI_WMI
> > +       depends on INPUT
> > +       select INPUT_SPARSEKMAP
> > +       select LEDS_CLASS
> > +       select LEDS_TRIGGERS
> > +       select LEDS_TRIGGER_AUDIO
> > +       select NEW_LEDS
> > +       help
> > +         This driver provides support for Huawei WMI hotkeys.
> > +         It enables the missing keys and adds support to the
> > micmute
> > +         LED found on some of these laptops.
> > +
> > +         To compile this driver as a module, choose M here: the
> > module
> > +         will be called huawei-wmi.
> > +
> >  endif # X86_PLATFORM_DEVICES
> > 
> >  config PMC_ATOM
> > diff --git a/drivers/platform/x86/Makefile
> > b/drivers/platform/x86/Makefile
> > index 39ae94135406..d841c550e3cc 100644
> > --- a/drivers/platform/x86/Makefile
> > +++ b/drivers/platform/x86/Makefile
> > @@ -32,6 +32,7 @@ obj-$(CONFIG_ACERHDF)         += acerhdf.o
> >  obj-$(CONFIG_HP_ACCEL)         += hp_accel.o
> >  obj-$(CONFIG_HP_WIRELESS)      += hp-wireless.o
> >  obj-$(CONFIG_HP_WMI)           += hp-wmi.o
> > +obj-$(CONFIG_HUAWEI_WMI)               += huawei-wmi.o
> >  obj-$(CONFIG_AMILO_RFKILL)     += amilo-rfkill.o
> >  obj-$(CONFIG_GPD_POCKET_FAN)   += gpd-pocket-fan.o
> >  obj-$(CONFIG_TC1100_WMI)       += tc1100-wmi.o
> > diff --git a/drivers/platform/x86/huawei-wmi.c
> > b/drivers/platform/x86/huawei-wmi.c
> > new file mode 100644
> > index 000000000000..89ba7ea33499
> > --- /dev/null
> > +++ b/drivers/platform/x86/huawei-wmi.c
> > @@ -0,0 +1,220 @@
> > +// SPDX-License-Identifier: GPL-2.0
> > +/*
> > + *  Huawei WMI hotkeys
> > + *
> > + *  Copyright (C) 2018       Ayman Bagabas <
> > ayman.bagabas@gmail.com>
> > + */
> > +
> > +#include <linux/acpi.h>
> > +#include <linux/input.h>
> > +#include <linux/input/sparse-keymap.h>
> > +#include <linux/leds.h>
> > +#include <linux/module.h>
> > +#include <linux/wmi.h>
> > +
> > +/*
> > + * Huawei WMI GUIDs
> > + */
> > +#define WMI0_EVENT_GUID "59142400-C6A3-40fa-BADB-8A2652834100"
> > +#define AMW0_EVENT_GUID "ABBC0F5C-8EA1-11D1-A000-C90629100000"
> > +
> > +#define WMI0_EXPENSIVE_GUID "39142400-C6A3-40fa-BADB-8A2652834100"
> > +
> > +struct huawei_wmi_priv {
> > +       struct input_dev *idev;
> > +       struct led_classdev cdev;
> > +       acpi_handle handle;
> > +       char *acpi_method;
> > +};
> > +
> > +static const struct key_entry huawei_wmi_keymap[] = {
> > +       { KE_KEY,    0x281, { KEY_BRIGHTNESSDOWN } },
> > +       { KE_KEY,    0x282, { KEY_BRIGHTNESSUP } },
> > +       { KE_KEY,    0x284, { KEY_MUTE } },
> > +       { KE_KEY,    0x285, { KEY_VOLUMEDOWN } },
> > +       { KE_KEY,    0x286, { KEY_VOLUMEUP } },
> > +       { KE_KEY,    0x287, { KEY_MICMUTE } },
> > +       { KE_KEY,    0x289, { KEY_WLAN } },
> > +       // Huawei |M| key
> > +       { KE_KEY,    0x28a, { KEY_CONFIG } },
> > +       // Keyboard backlight
> > +       { KE_IGNORE, 0x293, { KEY_KBDILLUMTOGGLE } },
> > +       { KE_IGNORE, 0x294, { KEY_KBDILLUMUP } },
> > +       { KE_IGNORE, 0x295, { KEY_KBDILLUMUP } },
> > +       { KE_END,        0 }
> > +};
> > +
> > +static int huawei_wmi_micmute_led_set(struct led_classdev
> > *led_cdev,
> > +               enum led_brightness brightness)
> > +{
> > +       struct huawei_wmi_priv *priv = dev_get_drvdata(led_cdev-
> > >dev->parent);
> > +       acpi_status status;
> > +       union acpi_object args[3];
> > +       struct acpi_object_list arg_list = {
> > +               .pointer = args,
> > +               .count = ARRAY_SIZE(args),
> > +       };
> > +
> > +       args[0].type = args[1].type = args[2].type =
> > ACPI_TYPE_INTEGER;
> > +       args[1].integer.value = 0x04;
> > +
> > +       if (strcmp(priv->acpi_method, "SPIN") == 0) {
> > +               args[0].integer.value = 0;
> > +               args[2].integer.value = brightness ? 1 : 0;
> > +       } else if (strcmp(priv->acpi_method, "WPIN") == 0) {
> > +               args[0].integer.value = 1;
> > +               args[2].integer.value = brightness ? 0 : 1;
> > +       } else {
> > +               return -EINVAL;
> > +       }
> > +
> > +       status = acpi_evaluate_object(priv->handle, priv-
> > >acpi_method, &arg_list, NULL);
> > +       if (ACPI_FAILURE(status))
> > +               return -ENXIO;
> > +
> > +       return 0;
> > +}
> > +
> > +static int huawei_wmi_leds_setup(struct wmi_device *wdev)
> > +{
> > +       struct huawei_wmi_priv *priv = dev_get_drvdata(&wdev->dev);
> > +       acpi_status status;
> > +
> > +       /* Skip registering LED subsystem if no ACPI method was
> > found.
> > +        * ec_get_handle() returns the first embedded controller
> > device
> > +        * handle which then used to locate SPIN and WPIN methods.
> > +        */
> 
> Comment style is cripple here.
> All issues we may fix when applying.
> 
> > +       priv->handle = ec_get_handle();
> > +       if (!priv->handle)
> > +               return 0;
> > +
> > +       if (acpi_has_method(priv->handle, "SPIN"))
> > +               priv->acpi_method = "SPIN";
> > +       else if (acpi_has_method(priv->handle, "WPIN"))
> > +               priv->acpi_method = "WPIN";
> > +       else
> > +               return 0;
> > +
> > +       priv->cdev.name = "platform::micmute";
> > +       priv->cdev.max_brightness = 1;
> > +       priv->cdev.brightness_set_blocking =
> > huawei_wmi_micmute_led_set;
> > +       priv->cdev.default_trigger = "audio-micmute";
> > +       priv->cdev.brightness =
> > ledtrig_audio_get(LED_AUDIO_MICMUTE);
> > +       priv->cdev.dev = &wdev->dev;
> > +       priv->cdev.flags = LED_CORE_SUSPENDRESUME;
> > +
> > +       return devm_led_classdev_register(&wdev->dev, &priv->cdev);
> > +}
> > +
> > +static void huawei_wmi_process_key(struct wmi_device *wdev, int
> > code)
> > +{
> > +       struct huawei_wmi_priv *priv = dev_get_drvdata(&wdev->dev);
> > +       const struct key_entry *key;
> > +
> > +       /*
> > +        * WMI0 uses code 0x80 to indicate a hotkey event.
> > +        * The actual key is fetched from the method WQ00
> > +        * using WMI0_EXPENSIVE_GUID.
> > +        */
> > +       if (code == 0x80) {
> > +               struct acpi_buffer response = {
> > ACPI_ALLOCATE_BUFFER, NULL };
> > +               union acpi_object *obj;
> > +               acpi_status status;
> > +
> > +               status = wmi_query_block(WMI0_EXPENSIVE_GUID, 0,
> > &response);
> > +               if (ACPI_FAILURE(status))
> > +                       return;
> > +
> > +               obj = (union acpi_object *)response.pointer;
> > +               if (obj && obj->type == ACPI_TYPE_INTEGER)
> > +                       code = obj->integer.value;
> > +
> > +               kfree(response.pointer);
> > +       }
> > +
> > +       key = sparse_keymap_entry_from_scancode(priv->idev, code);
> > +       if (!key) {
> > +               dev_info(&wdev->dev, "Unknown key pressed, code:
> > 0x%04x\n", code);
> > +               return;
> > +       }
> > +
> > +       sparse_keymap_report_entry(priv->idev, key, 1, true);
> > +}
> > +
> > +static void huawei_wmi_notify(struct wmi_device *wdev,
> > +               union acpi_object *obj)
> > +{
> > +       if (obj->type == ACPI_TYPE_INTEGER)
> > +               huawei_wmi_process_key(wdev, obj->integer.value);
> > +       else
> > +               dev_info(&wdev->dev, "Bad response type %d\n", obj-
> > >type);
> > +}
> > +
> > +static int huawei_wmi_input_setup(struct wmi_device *wdev)
> > +{
> > +       struct huawei_wmi_priv *priv = dev_get_drvdata(&wdev->dev);
> > +       int err;
> > +
> > +       priv->idev = devm_input_allocate_device(&wdev->dev);
> > +       if (!priv->idev)
> > +               return -ENOMEM;
> > +
> > +       priv->idev->name = "Huawei WMI hotkeys";
> > +       priv->idev->phys = "wmi/input0";
> > +       priv->idev->id.bustype = BUS_HOST;
> > +       priv->idev->dev.parent = &wdev->dev;
> > +
> > +       err = sparse_keymap_setup(priv->idev, huawei_wmi_keymap,
> > NULL);
> > +       if (err)
> > +               return err;
> > +
> > +       err = input_register_device(priv->idev);
> > +       if (err)
> > +               return err;
> > +
> > +       return 0;
> 
> return input_register_device(...);
> 
> > +}
> > +
> > +static int huawei_wmi_probe(struct wmi_device *wdev)
> > +{
> > +       struct huawei_wmi_priv *priv;
> > +       int err;
> > +
> > +       priv = devm_kzalloc(&wdev->dev, sizeof(struct
> > huawei_wmi_priv), GFP_KERNEL);
> > +       if (!priv)
> > +               return -ENOMEM;
> 
> + blank line.
> 
> > +       dev_set_drvdata(&wdev->dev, priv);
> > +
> > +       err = huawei_wmi_input_setup(wdev);
> > +       if (err)
> > +               return err;
> > +
> > +       err = huawei_wmi_leds_setup(wdev);
> > +       if (err)
> > +               return err;
> > +
> > +       return 0;
> 
> return huawei_wmi_leds_setup(...);
> 
> > +}
> > +
> > +static const struct wmi_device_id huawei_wmi_id_table[] = {
> > +       { .guid_string = WMI0_EVENT_GUID },
> > +       { .guid_string = AMW0_EVENT_GUID },
> > +       {  }
> > +};
> > +
> > +static struct wmi_driver huawei_wmi_driver = {
> > +       .driver = {
> > +               .name = "huawei-wmi",
> > +       },
> > +       .id_table = huawei_wmi_id_table,
> > +       .probe = huawei_wmi_probe,
> > +       .notify = huawei_wmi_notify,
> > +};
> > +
> > +module_wmi_driver(huawei_wmi_driver);
> > +
> > +MODULE_ALIAS("wmi:"WMI0_EVENT_GUID);
> > +MODULE_ALIAS("wmi:"AMW0_EVENT_GUID);
> > +MODULE_AUTHOR("Ayman Bagabas <ayman.bagabas@gmail.com>");
> > +MODULE_DESCRIPTION("Huawei WMI hotkeys");
> > +MODULE_LICENSE("GPL v2");
> > --
> > 2.19.2
> > 
> 
> 

Do I need to resubmit?


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v10 2/3] x86: add support for Huawei WMI hotkeys.
  2018-12-11 20:10     ` ayman.bagabas
@ 2018-12-12  6:56       ` Takashi Iwai
  2018-12-12 13:48         ` Andy Shevchenko
  0 siblings, 1 reply; 11+ messages in thread
From: Takashi Iwai @ 2018-12-12  6:56 UTC (permalink / raw)
  To: ayman.bagabas
  Cc: Andy Shevchenko, ALSA Development Mailing List, Hui Wang,
	Andy Shevchenko, Darren Hart, Jaroslav Kysela, Kailang Yang,
	Linux Kernel Mailing List, Platform Driver

On Tue, 11 Dec 2018 21:10:07 +0100,
<ayman.bagabas@gmail.com> wrote:
> 
> 
> Do I need to resubmit?

Yes, please.

Andy, I think it's better to merge the series through my tree, as it
uses the new leds audio trigger stuff.

Could you give ACK if the revised one is OK?

Then I'll merge them to the immutable branch topic/leds-trigger, so
that you can merge to your tree cleanly, too.


thanks,

Takashi

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v10 2/3] x86: add support for Huawei WMI hotkeys.
  2018-12-12  6:56       ` Takashi Iwai
@ 2018-12-12 13:48         ` Andy Shevchenko
  2018-12-12 13:49           ` Andy Shevchenko
  0 siblings, 1 reply; 11+ messages in thread
From: Andy Shevchenko @ 2018-12-12 13:48 UTC (permalink / raw)
  To: Takashi Iwai
  Cc: Ayman Bagabas, ALSA Development Mailing List, Hui Wang,
	Andy Shevchenko, Darren Hart, Jaroslav Kysela, Kailang Yang,
	Linux Kernel Mailing List, Platform Driver

On Wed, Dec 12, 2018 at 8:56 AM Takashi Iwai <tiwai@suse.de> wrote:
>
> On Tue, 11 Dec 2018 21:10:07 +0100,
> <ayman.bagabas@gmail.com> wrote:
> >
> >
> > Do I need to resubmit?
>
> Yes, please.
>
> Andy, I think it's better to merge the series through my tree, as it
> uses the new leds audio trigger stuff.
>
> Could you give ACK if the revised one is OK?

For addressed comments
Acked-by: Andy Shevchenko <andy.shevchenko@gmail.com>

>
> Then I'll merge them to the immutable branch topic/leds-trigger, so
> that you can merge to your tree cleanly, too.
>
>
> thanks,
>
> Takashi



-- 
With Best Regards,
Andy Shevchenko

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v10 2/3] x86: add support for Huawei WMI hotkeys.
  2018-12-12 13:48         ` Andy Shevchenko
@ 2018-12-12 13:49           ` Andy Shevchenko
  0 siblings, 0 replies; 11+ messages in thread
From: Andy Shevchenko @ 2018-12-12 13:49 UTC (permalink / raw)
  To: Takashi Iwai
  Cc: Ayman Bagabas, ALSA Development Mailing List, Hui Wang,
	Andy Shevchenko, Darren Hart, Jaroslav Kysela, Kailang Yang,
	Linux Kernel Mailing List, Platform Driver

On Wed, Dec 12, 2018 at 3:48 PM Andy Shevchenko
<andy.shevchenko@gmail.com> wrote:
>
> On Wed, Dec 12, 2018 at 8:56 AM Takashi Iwai <tiwai@suse.de> wrote:
> >
> > On Tue, 11 Dec 2018 21:10:07 +0100,
> > <ayman.bagabas@gmail.com> wrote:
> > >
> > >
> > > Do I need to resubmit?
> >
> > Yes, please.
> >
> > Andy, I think it's better to merge the series through my tree, as it
> > uses the new leds audio trigger stuff.
> >
> > Could you give ACK if the revised one is OK?
>
> For addressed comments
> Acked-by: Andy Shevchenko <andy.shevchenko@gmail.com>

And for the entire series

Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>

>
> >
> > Then I'll merge them to the immutable branch topic/leds-trigger, so
> > that you can merge to your tree cleanly, too.
> >
> >
> > thanks,
> >
> > Takashi
>
>
>
> --
> With Best Regards,
> Andy Shevchenko



-- 
With Best Regards,
Andy Shevchenko

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2018-12-12 13:49 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-12-11  6:01 [PATCH v10 0/3] Huawei laptops Ayman Bagabas
2018-12-11  6:01 ` [PATCH v10 1/3] ALSA: hda: fix front speakers on Huawei MBXP Ayman Bagabas
2018-12-11  6:01 ` [PATCH v10 2/3] x86: add support for Huawei WMI hotkeys Ayman Bagabas
2018-12-11 10:14   ` Andy Shevchenko
2018-12-11 20:10     ` ayman.bagabas
2018-12-12  6:56       ` Takashi Iwai
2018-12-12 13:48         ` Andy Shevchenko
2018-12-12 13:49           ` Andy Shevchenko
2018-12-11  6:01 ` [PATCH v10 3/3] ALSA: hda: add support for Huawei WMI micmute LED Ayman Bagabas
2018-12-11 10:09   ` Andy Shevchenko
2018-12-11 10:27     ` Takashi Iwai

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).