11db9e952d
Changes: - Address issue preventing the Surface HID driver to load on the Surface Laptop Studio.
201 lines
7.2 KiB
Diff
201 lines
7.2 KiB
Diff
From 7075cd222eea9ec651ec36a05e41061f4fc5757b Mon Sep 17 00:00:00 2001
|
|
From: Maximilian Luz <luzmaximilian@gmail.com>
|
|
Date: Sun, 10 Oct 2021 01:27:17 +0200
|
|
Subject: [PATCH] platform/surface: aggregator_registry: Add support for
|
|
Surface Laptop Studio
|
|
|
|
Add support for the Surface Laptop Studio.
|
|
|
|
In contrast to previous Surface Laptop models, this one has its HID
|
|
devices attached to target ID 1 (instead of 2). It also has a couple
|
|
more of them, including a new notifier for when the pen is stashed /
|
|
taken out of its place, a "Sys Control" device, and two other
|
|
unidentified HID devices with unknown usages.
|
|
|
|
Battery and performance profile interfaces remain the same.
|
|
|
|
Signed-off-by: Maximilian Luz <luzmaximilian@gmail.com>
|
|
Patchset: surface-sam
|
|
---
|
|
.../surface/surface_aggregator_registry.c | 54 +++++++++++++++++++
|
|
1 file changed, 54 insertions(+)
|
|
|
|
diff --git a/drivers/platform/surface/surface_aggregator_registry.c b/drivers/platform/surface/surface_aggregator_registry.c
|
|
index 4428c4330229..1679811eff50 100644
|
|
--- a/drivers/platform/surface/surface_aggregator_registry.c
|
|
+++ b/drivers/platform/surface/surface_aggregator_registry.c
|
|
@@ -77,6 +77,42 @@ static const struct software_node ssam_node_bas_dtx = {
|
|
.parent = &ssam_node_root,
|
|
};
|
|
|
|
+/* HID keyboard (TID1). */
|
|
+static const struct software_node ssam_node_hid_tid1_keyboard = {
|
|
+ .name = "ssam:01:15:01:01:00",
|
|
+ .parent = &ssam_node_root,
|
|
+};
|
|
+
|
|
+/* HID pen stash (TID1; pen taken / stashed away evens). */
|
|
+static const struct software_node ssam_node_hid_tid1_penstash = {
|
|
+ .name = "ssam:01:15:01:02:00",
|
|
+ .parent = &ssam_node_root,
|
|
+};
|
|
+
|
|
+/* HID touchpad (TID1). */
|
|
+static const struct software_node ssam_node_hid_tid1_touchpad = {
|
|
+ .name = "ssam:01:15:01:03:00",
|
|
+ .parent = &ssam_node_root,
|
|
+};
|
|
+
|
|
+/* HID device instance 6 (TID1, unknown HID device). */
|
|
+static const struct software_node ssam_node_hid_tid1_iid6 = {
|
|
+ .name = "ssam:01:15:01:06:00",
|
|
+ .parent = &ssam_node_root,
|
|
+};
|
|
+
|
|
+/* HID device instance 7 (TID1, unknown HID device). */
|
|
+static const struct software_node ssam_node_hid_tid1_iid7 = {
|
|
+ .name = "ssam:01:15:01:07:00",
|
|
+ .parent = &ssam_node_root,
|
|
+};
|
|
+
|
|
+/* HID system controls (TID1). */
|
|
+static const struct software_node ssam_node_hid_tid1_sysctrl = {
|
|
+ .name = "ssam:01:15:01:08:00",
|
|
+ .parent = &ssam_node_root,
|
|
+};
|
|
+
|
|
/* HID keyboard. */
|
|
static const struct software_node ssam_node_hid_main_keyboard = {
|
|
.name = "ssam:01:15:02:01:00",
|
|
@@ -159,6 +195,21 @@ static const struct software_node *ssam_node_group_sl3[] = {
|
|
NULL,
|
|
};
|
|
|
|
+/* Devices for Surface Laptop Studio. */
|
|
+static const struct software_node *ssam_node_group_sls[] = {
|
|
+ &ssam_node_root,
|
|
+ &ssam_node_bat_ac,
|
|
+ &ssam_node_bat_main,
|
|
+ &ssam_node_tmp_pprof,
|
|
+ &ssam_node_hid_tid1_keyboard,
|
|
+ &ssam_node_hid_tid1_penstash,
|
|
+ &ssam_node_hid_tid1_touchpad,
|
|
+ &ssam_node_hid_tid1_iid6,
|
|
+ &ssam_node_hid_tid1_iid7,
|
|
+ &ssam_node_hid_tid1_sysctrl,
|
|
+ NULL,
|
|
+};
|
|
+
|
|
/* Devices for Surface Laptop Go. */
|
|
static const struct software_node *ssam_node_group_slg1[] = {
|
|
&ssam_node_root,
|
|
@@ -507,6 +558,9 @@ static const struct acpi_device_id ssam_platform_hub_match[] = {
|
|
/* Surface Laptop Go 1 */
|
|
{ "MSHW0118", (unsigned long)ssam_node_group_slg1 },
|
|
|
|
+ /* Surface Laptop Studio */
|
|
+ { "MSHW0123", (unsigned long)ssam_node_group_sls },
|
|
+
|
|
{ },
|
|
};
|
|
MODULE_DEVICE_TABLE(acpi, ssam_platform_hub_match);
|
|
--
|
|
2.33.0
|
|
|
|
From 5e7bd7d6ce73a75e25aedd826dbe4ba8ef80028e Mon Sep 17 00:00:00 2001
|
|
From: Maximilian Luz <luzmaximilian@gmail.com>
|
|
Date: Sun, 10 Oct 2021 15:07:42 +0200
|
|
Subject: [PATCH] HID: surface-hid: Use correct event registry for managing HID
|
|
events
|
|
|
|
Fix a timeout error caused by using the wrong registry for some devices,
|
|
preventing the driver to probe and manage events correctly.
|
|
|
|
Until now, we have only ever seen the REG-category registry being used
|
|
on devices addressed with target ID 2. In fact, we have only ever seen
|
|
Surface Aggregator Module (SAM) HID devices with target ID 2. For those
|
|
devices, the registry also has to be addressed with target ID 2.
|
|
|
|
Some devices, like the new Surface Laptop Studio, however, address their
|
|
HID devices on target ID 1. As a result of this, any target ID 2
|
|
commands time out. This includes event management commands addressed to
|
|
the target ID 2 REG-category registry. For these devices, the registry
|
|
has to be addressed via target ID 1 instead.
|
|
|
|
We therefore assume that the target ID of the registry to be used
|
|
depends on the target ID of the respective device. Implement this
|
|
accordingly.
|
|
|
|
Fixes: b05ff1002a5c1 ("HID: Add support for Surface Aggregator Module HID transport")
|
|
Signed-off-by: Maximilian Luz <luzmaximilian@gmail.com>
|
|
Patchset: surface-sam
|
|
---
|
|
drivers/hid/surface-hid/surface_hid.c | 2 +-
|
|
include/linux/surface_aggregator/controller.h | 4 ++--
|
|
2 files changed, 3 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/drivers/hid/surface-hid/surface_hid.c b/drivers/hid/surface-hid/surface_hid.c
|
|
index a3a70e4f3f6c..daa452367c0b 100644
|
|
--- a/drivers/hid/surface-hid/surface_hid.c
|
|
+++ b/drivers/hid/surface-hid/surface_hid.c
|
|
@@ -209,7 +209,7 @@ static int surface_hid_probe(struct ssam_device *sdev)
|
|
|
|
shid->notif.base.priority = 1;
|
|
shid->notif.base.fn = ssam_hid_event_fn;
|
|
- shid->notif.event.reg = SSAM_EVENT_REGISTRY_REG;
|
|
+ shid->notif.event.reg = SSAM_EVENT_REGISTRY_REG(sdev->uid.target);
|
|
shid->notif.event.id.target_category = sdev->uid.category;
|
|
shid->notif.event.id.instance = sdev->uid.instance;
|
|
shid->notif.event.mask = SSAM_EVENT_MASK_STRICT;
|
|
diff --git a/include/linux/surface_aggregator/controller.h b/include/linux/surface_aggregator/controller.h
|
|
index 068e1982ad37..74bfdffaf7b0 100644
|
|
--- a/include/linux/surface_aggregator/controller.h
|
|
+++ b/include/linux/surface_aggregator/controller.h
|
|
@@ -792,8 +792,8 @@ enum ssam_event_mask {
|
|
#define SSAM_EVENT_REGISTRY_KIP \
|
|
SSAM_EVENT_REGISTRY(SSAM_SSH_TC_KIP, 0x02, 0x27, 0x28)
|
|
|
|
-#define SSAM_EVENT_REGISTRY_REG \
|
|
- SSAM_EVENT_REGISTRY(SSAM_SSH_TC_REG, 0x02, 0x01, 0x02)
|
|
+#define SSAM_EVENT_REGISTRY_REG(tid)\
|
|
+ SSAM_EVENT_REGISTRY(SSAM_SSH_TC_REG, tid, 0x01, 0x02)
|
|
|
|
/**
|
|
* enum ssam_event_notifier_flags - Flags for event notifiers.
|
|
--
|
|
2.33.0
|
|
|
|
From 8f79ffa11f64ee32c97642d4149f5b6e02ec8e68 Mon Sep 17 00:00:00 2001
|
|
From: Maximilian Luz <luzmaximilian@gmail.com>
|
|
Date: Sun, 10 Oct 2021 19:48:10 +0200
|
|
Subject: [PATCH] HID: surface-hid: Allow driver matching for target ID 1
|
|
devices
|
|
|
|
Until now we have only ever seen HID devices with target ID 2. The new
|
|
Surface Laptop Studio however uses HID devices with target ID 1. Allow
|
|
matching this driver to those as well.
|
|
|
|
Fixes: b05ff1002a5c1 ("HID: Add support for Surface Aggregator Module HID transport")
|
|
Signed-off-by: Maximilian Luz <luzmaximilian@gmail.com>
|
|
Patchset: surface-sam
|
|
---
|
|
drivers/hid/surface-hid/surface_hid.c | 2 +-
|
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
|
|
diff --git a/drivers/hid/surface-hid/surface_hid.c b/drivers/hid/surface-hid/surface_hid.c
|
|
index daa452367c0b..d4aa8c81903a 100644
|
|
--- a/drivers/hid/surface-hid/surface_hid.c
|
|
+++ b/drivers/hid/surface-hid/surface_hid.c
|
|
@@ -230,7 +230,7 @@ static void surface_hid_remove(struct ssam_device *sdev)
|
|
}
|
|
|
|
static const struct ssam_device_id surface_hid_match[] = {
|
|
- { SSAM_SDEV(HID, 0x02, SSAM_ANY_IID, 0x00) },
|
|
+ { SSAM_SDEV(HID, SSAM_ANY_TID, SSAM_ANY_IID, 0x00) },
|
|
{ },
|
|
};
|
|
MODULE_DEVICE_TABLE(ssam, surface_hid_match);
|
|
--
|
|
2.33.0
|
|
|