浏览代码

Update v5.14 patches

Changes:
 - Add Surface Aggregator Module support for Surface Pro 8.
   - Add keyboard-cover support (keyboard and touchpad)
   - Add battery status support
   - Add platform profile support

Links:
 - kernel: https://github.com/linux-surface/kernel/commit/43661b9f926b435092df35a5736c63bf41f896a9
Maximilian Luz 3 年之前
父节点
当前提交
1027645b8a

+ 1 - 0
configs/surface-5.14.config

@@ -9,6 +9,7 @@ CONFIG_SURFACE_AGGREGATOR_REGISTRY=m
 
 CONFIG_SURFACE_ACPI_NOTIFY=m
 CONFIG_SURFACE_DTX=m
+CONFIG_SURFACE_KIP_TABLET_SWITCH=m
 CONFIG_SURFACE_PLATFORM_PROFILE=m
 
 CONFIG_SURFACE_HID=m

+ 1666 - 1
patches/5.14/0005-surface-sam.patch

@@ -165,7 +165,7 @@ index 068e1982ad37..74bfdffaf7b0 100644
 -- 
 2.33.1
 
-From 5e2878df21d278ab0c87254810f3453c7b5c69c7 Mon Sep 17 00:00:00 2001
+From e37ee323ec827c2ef5ad30f7105203715afc76f4 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
@@ -198,3 +198,1668 @@ index daa452367c0b..d4aa8c81903a 100644
 -- 
 2.33.1
 
+From 00dbcbeeae4d15358e9af0e9a4cee711f09e896d Mon Sep 17 00:00:00 2001
+From: Maximilian Luz <luzmaximilian@gmail.com>
+Date: Wed, 2 Jun 2021 03:34:06 +0200
+Subject: [PATCH] platform/surface: aggregator: Make client device removal more
+ generic
+
+Currently, there are similar functions defined in the Aggregator
+Registry and the controller core.
+
+Make client device removal more generic and export it. We can then use
+this function later on to remove client devices from device hubs as well
+as the controller and avoid re-defining similar things.
+
+Signed-off-by: Maximilian Luz <luzmaximilian@gmail.com>
+Patchset: surface-sam
+---
+ drivers/platform/surface/aggregator/bus.c  | 24 ++++++++--------------
+ drivers/platform/surface/aggregator/bus.h  |  3 ---
+ drivers/platform/surface/aggregator/core.c |  3 ++-
+ include/linux/surface_aggregator/device.h  |  9 ++++++++
+ 4 files changed, 19 insertions(+), 20 deletions(-)
+
+diff --git a/drivers/platform/surface/aggregator/bus.c b/drivers/platform/surface/aggregator/bus.c
+index 0169677c243e..eaa8626baead 100644
+--- a/drivers/platform/surface/aggregator/bus.c
++++ b/drivers/platform/surface/aggregator/bus.c
+@@ -376,27 +376,19 @@ static int ssam_remove_device(struct device *dev, void *_data)
+ }
+ 
+ /**
+- * ssam_controller_remove_clients() - Remove SSAM client devices registered as
+- * direct children under the given controller.
+- * @ctrl: The controller to remove all direct clients for.
++ * ssam_remove_clients() - Remove SSAM client devices registered as direct
++ * children under the given parent device.
++ * @dev: The (parent) device to remove all direct clients for.
+  *
+- * Remove all SSAM client devices registered as direct children under the
+- * given controller. Note that this only accounts for direct children of the
+- * controller device. This does not take care of any client devices where the
+- * parent device has been manually set before calling ssam_device_add. Refer
+- * to ssam_device_add()/ssam_device_remove() for more details on those cases.
+- *
+- * To avoid new devices being added in parallel to this call, the main
+- * controller lock (not statelock) must be held during this (and if
+- * necessary, any subsequent deinitialization) call.
++ * Remove all SSAM client devices registered as direct children under the given
++ * device. Note that this only accounts for direct children of the device.
++ * Refer to ssam_device_add()/ssam_device_remove() for more details.
+  */
+-void ssam_controller_remove_clients(struct ssam_controller *ctrl)
++void ssam_remove_clients(struct device *dev)
+ {
+-	struct device *dev;
+-
+-	dev = ssam_controller_device(ctrl);
+ 	device_for_each_child_reverse(dev, NULL, ssam_remove_device);
+ }
++EXPORT_SYMBOL_GPL(ssam_remove_clients);
+ 
+ /**
+  * ssam_bus_register() - Register and set-up the SSAM client device bus.
+diff --git a/drivers/platform/surface/aggregator/bus.h b/drivers/platform/surface/aggregator/bus.h
+index ed032c2cbdb2..6964ee84e79c 100644
+--- a/drivers/platform/surface/aggregator/bus.h
++++ b/drivers/platform/surface/aggregator/bus.h
+@@ -12,14 +12,11 @@
+ 
+ #ifdef CONFIG_SURFACE_AGGREGATOR_BUS
+ 
+-void ssam_controller_remove_clients(struct ssam_controller *ctrl);
+-
+ int ssam_bus_register(void);
+ void ssam_bus_unregister(void);
+ 
+ #else /* CONFIG_SURFACE_AGGREGATOR_BUS */
+ 
+-static inline void ssam_controller_remove_clients(struct ssam_controller *ctrl) {}
+ static inline int ssam_bus_register(void) { return 0; }
+ static inline void ssam_bus_unregister(void) {}
+ 
+diff --git a/drivers/platform/surface/aggregator/core.c b/drivers/platform/surface/aggregator/core.c
+index 279d9df19c01..124df0100a9f 100644
+--- a/drivers/platform/surface/aggregator/core.c
++++ b/drivers/platform/surface/aggregator/core.c
+@@ -22,6 +22,7 @@
+ #include <linux/sysfs.h>
+ 
+ #include <linux/surface_aggregator/controller.h>
++#include <linux/surface_aggregator/device.h>
+ 
+ #include "bus.h"
+ #include "controller.h"
+@@ -742,7 +743,7 @@ static void ssam_serial_hub_remove(struct serdev_device *serdev)
+ 	ssam_controller_lock(ctrl);
+ 
+ 	/* Remove all client devices. */
+-	ssam_controller_remove_clients(ctrl);
++	ssam_remove_clients(&serdev->dev);
+ 
+ 	/* Act as if suspending to silence events. */
+ 	status = ssam_ctrl_notif_display_off(ctrl);
+diff --git a/include/linux/surface_aggregator/device.h b/include/linux/surface_aggregator/device.h
+index f636c5310321..cc257097eb05 100644
+--- a/include/linux/surface_aggregator/device.h
++++ b/include/linux/surface_aggregator/device.h
+@@ -319,6 +319,15 @@ void ssam_device_driver_unregister(struct ssam_device_driver *d);
+ 		      ssam_device_driver_unregister)
+ 
+ 
++/* -- Helpers for controller and hub devices. ------------------------------- */
++
++#ifdef CONFIG_SURFACE_AGGREGATOR_BUS
++void ssam_remove_clients(struct device *dev);
++#else /* CONFIG_SURFACE_AGGREGATOR_BUS */
++static inline void ssam_remove_clients(struct device *dev) {}
++#endif /* CONFIG_SURFACE_AGGREGATOR_BUS */
++
++
+ /* -- Helpers for client-device requests. ----------------------------------- */
+ 
+ /**
+-- 
+2.33.1
+
+From f0aaf21cefd42ce8f828d54a11207d72fea9e579 Mon Sep 17 00:00:00 2001
+From: Maximilian Luz <luzmaximilian@gmail.com>
+Date: Wed, 27 Oct 2021 02:06:38 +0200
+Subject: [PATCH] platform/surface: aggregator_registry: Use generic client
+ removal function
+
+Use generic client removal function introduced in the previous commit
+instead of defining our own one.
+
+Signed-off-by: Maximilian Luz <luzmaximilian@gmail.com>
+Patchset: surface-sam
+---
+ .../surface/surface_aggregator_registry.c     | 24 ++++---------------
+ 1 file changed, 5 insertions(+), 19 deletions(-)
+
+diff --git a/drivers/platform/surface/surface_aggregator_registry.c b/drivers/platform/surface/surface_aggregator_registry.c
+index 1679811eff50..d63f975bfd4c 100644
+--- a/drivers/platform/surface/surface_aggregator_registry.c
++++ b/drivers/platform/surface/surface_aggregator_registry.c
+@@ -249,20 +249,6 @@ static int ssam_uid_from_string(const char *str, struct ssam_device_uid *uid)
+ 	return 0;
+ }
+ 
+-static int ssam_hub_remove_devices_fn(struct device *dev, void *data)
+-{
+-	if (!is_ssam_device(dev))
+-		return 0;
+-
+-	ssam_device_remove(to_ssam_device(dev));
+-	return 0;
+-}
+-
+-static void ssam_hub_remove_devices(struct device *parent)
+-{
+-	device_for_each_child_reverse(parent, NULL, ssam_hub_remove_devices_fn);
+-}
+-
+ static int ssam_hub_add_device(struct device *parent, struct ssam_controller *ctrl,
+ 			       struct fwnode_handle *node)
+ {
+@@ -308,7 +294,7 @@ static int ssam_hub_add_devices(struct device *parent, struct ssam_controller *c
+ 
+ 	return 0;
+ err:
+-	ssam_hub_remove_devices(parent);
++	ssam_remove_clients(parent);
+ 	return status;
+ }
+ 
+@@ -405,7 +391,7 @@ static void ssam_base_hub_update_workfn(struct work_struct *work)
+ 	if (hub->state == SSAM_BASE_HUB_CONNECTED)
+ 		status = ssam_hub_add_devices(&hub->sdev->dev, hub->sdev->ctrl, node);
+ 	else
+-		ssam_hub_remove_devices(&hub->sdev->dev);
++		ssam_remove_clients(&hub->sdev->dev);
+ 
+ 	if (status)
+ 		dev_err(&hub->sdev->dev, "failed to update base-hub devices: %d\n", status);
+@@ -487,7 +473,7 @@ static int ssam_base_hub_probe(struct ssam_device *sdev)
+ err:
+ 	ssam_notifier_unregister(sdev->ctrl, &hub->notif);
+ 	cancel_delayed_work_sync(&hub->update_work);
+-	ssam_hub_remove_devices(&sdev->dev);
++	ssam_remove_clients(&sdev->dev);
+ 	return status;
+ }
+ 
+@@ -499,7 +485,7 @@ static void ssam_base_hub_remove(struct ssam_device *sdev)
+ 
+ 	ssam_notifier_unregister(sdev->ctrl, &hub->notif);
+ 	cancel_delayed_work_sync(&hub->update_work);
+-	ssam_hub_remove_devices(&sdev->dev);
++	ssam_remove_clients(&sdev->dev);
+ }
+ 
+ static const struct ssam_device_id ssam_base_hub_match[] = {
+@@ -613,7 +599,7 @@ static int ssam_platform_hub_remove(struct platform_device *pdev)
+ {
+ 	const struct software_node **nodes = platform_get_drvdata(pdev);
+ 
+-	ssam_hub_remove_devices(&pdev->dev);
++	ssam_remove_clients(&pdev->dev);
+ 	set_secondary_fwnode(&pdev->dev, NULL);
+ 	software_node_unregister_node_group(nodes);
+ 	return 0;
+-- 
+2.33.1
+
+From e86647069fa14e01aff6a31583743f271d666d95 Mon Sep 17 00:00:00 2001
+From: Maximilian Luz <luzmaximilian@gmail.com>
+Date: Wed, 27 Oct 2021 02:07:33 +0200
+Subject: [PATCH] platform/surface: aggregator_registry: Rename device
+ registration function
+
+Rename the device registration function to better align names with the
+newly introduced device removal function.
+
+Signed-off-by: Maximilian Luz <luzmaximilian@gmail.com>
+Patchset: surface-sam
+---
+ drivers/platform/surface/surface_aggregator_registry.c | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/platform/surface/surface_aggregator_registry.c b/drivers/platform/surface/surface_aggregator_registry.c
+index d63f975bfd4c..2e0d3a808d47 100644
+--- a/drivers/platform/surface/surface_aggregator_registry.c
++++ b/drivers/platform/surface/surface_aggregator_registry.c
+@@ -274,8 +274,8 @@ static int ssam_hub_add_device(struct device *parent, struct ssam_controller *ct
+ 	return status;
+ }
+ 
+-static int ssam_hub_add_devices(struct device *parent, struct ssam_controller *ctrl,
+-				struct fwnode_handle *node)
++static int ssam_hub_register_clients(struct device *parent, struct ssam_controller *ctrl,
++				     struct fwnode_handle *node)
+ {
+ 	struct fwnode_handle *child;
+ 	int status;
+@@ -389,7 +389,7 @@ static void ssam_base_hub_update_workfn(struct work_struct *work)
+ 	hub->state = state;
+ 
+ 	if (hub->state == SSAM_BASE_HUB_CONNECTED)
+-		status = ssam_hub_add_devices(&hub->sdev->dev, hub->sdev->ctrl, node);
++		status = ssam_hub_register_clients(&hub->sdev->dev, hub->sdev->ctrl, node);
+ 	else
+ 		ssam_remove_clients(&hub->sdev->dev);
+ 
+@@ -585,7 +585,7 @@ static int ssam_platform_hub_probe(struct platform_device *pdev)
+ 
+ 	set_secondary_fwnode(&pdev->dev, root);
+ 
+-	status = ssam_hub_add_devices(&pdev->dev, ctrl, root);
++	status = ssam_hub_register_clients(&pdev->dev, ctrl, root);
+ 	if (status) {
+ 		set_secondary_fwnode(&pdev->dev, NULL);
+ 		software_node_unregister_node_group(nodes);
+-- 
+2.33.1
+
+From 88d3d04fcfc74c04cb2b406f6b68cd589cfc5d63 Mon Sep 17 00:00:00 2001
+From: Maximilian Luz <luzmaximilian@gmail.com>
+Date: Tue, 8 Jun 2021 00:24:47 +0200
+Subject: [PATCH] platform/surface: aggregator: Allow devices to be marked as
+ hot-removed
+
+Some SSAM devices, notably keyboard and touchpad on the Surface Book 3
+and Surface Pro 8, can be hot-removed. When this occurs, communication
+with the device may fail and time out. This timeout may unnecessarily
+block and slow down device removal and even cause issues when the
+devices are detached and re-attached quickly. Thus, communication should
+generally be avoided once hot-removal is detected.
+
+While we already remove a device as soon as we detect its hot-removal,
+the corresponding device driver may still attempt to communicate with
+the device during teardown. This is especially critical as communication
+failure may also extend to event disablement.
+
+Add a flag to allow marking devices as hot-removed. This can then be
+used during client driver teardown to check if any communication
+attemtps should be avoided.
+
+Signed-off-by: Maximilian Luz <luzmaximilian@gmail.com>
+Patchset: surface-sam
+---
+ drivers/platform/surface/aggregator/bus.c | 33 +++++++++++++++
+ include/linux/surface_aggregator/device.h | 50 +++++++++++++++++++++--
+ 2 files changed, 80 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/platform/surface/aggregator/bus.c b/drivers/platform/surface/aggregator/bus.c
+index eaa8626baead..9cb6337f2b35 100644
+--- a/drivers/platform/surface/aggregator/bus.c
++++ b/drivers/platform/surface/aggregator/bus.c
+@@ -390,6 +390,39 @@ void ssam_remove_clients(struct device *dev)
+ }
+ EXPORT_SYMBOL_GPL(ssam_remove_clients);
+ 
++static int ssam_mark_device_hot_removed(struct device *dev, void *_data)
++{
++	struct ssam_device *sdev = to_ssam_device(dev);
++
++	if (is_ssam_device(dev))
++		ssam_device_mark_hot_removed(sdev);
++
++	return 0;
++}
++
++/**
++ * ssam_hot_remove_clients() - Remove SSAM client devices registered as direct
++ * children under the given parent device and mark them as hot-removed.
++ * @dev: The (parent) device to remove all direct clients for.
++ *
++ * Remove all SSAM client devices registered as direct children under the given
++ * device.
++ *
++ * Note that this only accounts for direct children of the device. Refer to
++ * ssam_device_add()/ssam_device_remove() for more details.
++ */
++void ssam_hot_remove_clients(struct device *dev)
++{
++	/* Mark devices as hot-removed before we remove any */
++	device_for_each_child_reverse(dev, NULL, ssam_mark_device_hot_removed);
++
++	ssam_remove_clients(dev);
++}
++EXPORT_SYMBOL_GPL(ssam_hot_remove_clients);
++
++
++/* -- Bus registration. ----------------------------------------------------- */
++
+ /**
+  * ssam_bus_register() - Register and set-up the SSAM client device bus.
+  */
+diff --git a/include/linux/surface_aggregator/device.h b/include/linux/surface_aggregator/device.h
+index cc257097eb05..b474a9baab42 100644
+--- a/include/linux/surface_aggregator/device.h
++++ b/include/linux/surface_aggregator/device.h
+@@ -148,17 +148,30 @@ struct ssam_device_uid {
+ #define SSAM_SDEV(cat, tid, iid, fun) \
+ 	SSAM_DEVICE(SSAM_DOMAIN_SERIALHUB, SSAM_SSH_TC_##cat, tid, iid, fun)
+ 
++/*
++ * enum ssam_device_flags - Flags for SSAM client devices.
++ * @SSAM_DEVICE_HOT_REMOVED_BIT:
++ *	The device has been hot-removed. Further communication with it may time
++ *	out and should be avoided.
++ */
++enum ssam_device_flags {
++	SSAM_DEVICE_HOT_REMOVED_BIT = 0,
++};
++
+ /**
+  * struct ssam_device - SSAM client device.
+- * @dev:  Driver model representation of the device.
+- * @ctrl: SSAM controller managing this device.
+- * @uid:  UID identifying the device.
++ * @dev:   Driver model representation of the device.
++ * @ctrl:  SSAM controller managing this device.
++ * @uid:   UID identifying the device.
++ * @flags: Device state flags, see &enum ssam_device_flags.
+  */
+ struct ssam_device {
+ 	struct device dev;
+ 	struct ssam_controller *ctrl;
+ 
+ 	struct ssam_device_uid uid;
++
++	unsigned long flags;
+ };
+ 
+ /**
+@@ -240,6 +253,35 @@ struct ssam_device *ssam_device_alloc(struct ssam_controller *ctrl,
+ int ssam_device_add(struct ssam_device *sdev);
+ void ssam_device_remove(struct ssam_device *sdev);
+ 
++/**
++ * ssam_device_mark_hot_removed() - Mark the given device as hot-removed.
++ * @sdev: The device to mark as hot-removed.
++ *
++ * Mark the device as having been hot-removed. This signals drivers using the
++ * device that communication with the device should be avoided and may lead to
++ * timeouts.
++ */
++static inline void ssam_device_mark_hot_removed(struct ssam_device *sdev)
++{
++	dev_dbg(&sdev->dev, "marking device as hot-removed\n");
++	set_bit(SSAM_DEVICE_HOT_REMOVED_BIT, &sdev->flags);
++}
++
++/**
++ * ssam_device_is_hot_removed() - Check if the given device has been
++ * hot-removed.
++ * @sdev: The device to check.
++ *
++ * Checks if the given device has been marked as hot-removed. See
++ * ssam_device_mark_hot_removed() for more details.
++ *
++ * Return: Returns ``true`` if the device has been marked as hot-removed.
++ */
++static inline bool ssam_device_is_hot_removed(struct ssam_device *sdev)
++{
++	return test_bit(SSAM_DEVICE_HOT_REMOVED_BIT, &sdev->flags);
++}
++
+ /**
+  * ssam_device_get() - Increment reference count of SSAM client device.
+  * @sdev: The device to increment the reference count of.
+@@ -323,8 +365,10 @@ void ssam_device_driver_unregister(struct ssam_device_driver *d);
+ 
+ #ifdef CONFIG_SURFACE_AGGREGATOR_BUS
+ void ssam_remove_clients(struct device *dev);
++void ssam_hot_remove_clients(struct device *dev);
+ #else /* CONFIG_SURFACE_AGGREGATOR_BUS */
+ static inline void ssam_remove_clients(struct device *dev) {}
++static inline void ssam_hot_remove_clients(struct device *dev) {}
+ #endif /* CONFIG_SURFACE_AGGREGATOR_BUS */
+ 
+ 
+-- 
+2.33.1
+
+From d74f2c3b78911fb6cb98c23f345c03d01f84f148 Mon Sep 17 00:00:00 2001
+From: Maximilian Luz <luzmaximilian@gmail.com>
+Date: Tue, 8 Jun 2021 00:48:22 +0200
+Subject: [PATCH] platform/surface: aggregator: Allow notifiers to avoid
+ communication on unregistering
+
+When SSAM client devices have been (physically) hot-removed,
+communication attempts with those devices may fail and time out. This
+can even extend to event notifiers, due to which timeouts may occur
+during device removal, slowing down that process.
+
+Add a flag to the notifier unregister function that allows skipping
+communication with the EC to prevent this. Furthermore, add wrappers for
+registering and unregistering notifiers belonging to SSAM client devices
+that automatically check if the device has been marked as hot-removed
+and communication should be avoided.
+
+Note that non-SSAM client devices can generally not be hot-removed, so
+also add a convenience wrapper for those, defaulting to allow
+communication.
+
+Signed-off-by: Maximilian Luz <luzmaximilian@gmail.com>
+Patchset: surface-sam
+---
+ .../driver-api/surface_aggregator/client.rst  |  6 +-
+ .../platform/surface/aggregator/controller.c  | 53 ++++++++++------
+ include/linux/surface_aggregator/controller.h | 24 +++++++-
+ include/linux/surface_aggregator/device.h     | 60 +++++++++++++++++++
+ 4 files changed, 122 insertions(+), 21 deletions(-)
+
+diff --git a/Documentation/driver-api/surface_aggregator/client.rst b/Documentation/driver-api/surface_aggregator/client.rst
+index e519d374c378..27f95abdbe99 100644
+--- a/Documentation/driver-api/surface_aggregator/client.rst
++++ b/Documentation/driver-api/surface_aggregator/client.rst
+@@ -17,6 +17,8 @@
+ .. |SSAM_DEVICE| replace:: :c:func:`SSAM_DEVICE`
+ .. |ssam_notifier_register| replace:: :c:func:`ssam_notifier_register`
+ .. |ssam_notifier_unregister| replace:: :c:func:`ssam_notifier_unregister`
++.. |ssam_device_notifier_register| replace:: :c:func:`ssam_device_notifier_register`
++.. |ssam_device_notifier_unregister| replace:: :c:func:`ssam_device_notifier_unregister`
+ .. |ssam_request_sync| replace:: :c:func:`ssam_request_sync`
+ .. |ssam_event_mask| replace:: :c:type:`enum ssam_event_mask <ssam_event_mask>`
+ 
+@@ -312,7 +314,9 @@ Handling Events
+ To receive events from the SAM EC, an event notifier must be registered for
+ the desired event via |ssam_notifier_register|. The notifier must be
+ unregistered via |ssam_notifier_unregister| once it is not required any
+-more.
++more. For |ssam_device| type clients, the |ssam_device_notifier_register| and
++|ssam_device_notifier_unregister| wrappers should be preferred as they properly
++handle hot-removal of client devices.
+ 
+ Event notifiers are registered by providing (at minimum) a callback to call
+ in case an event has been received, the registry specifying how the event
+diff --git a/drivers/platform/surface/aggregator/controller.c b/drivers/platform/surface/aggregator/controller.c
+index b8c377b3f932..dc0f22be2630 100644
+--- a/drivers/platform/surface/aggregator/controller.c
++++ b/drivers/platform/surface/aggregator/controller.c
+@@ -2199,16 +2199,26 @@ static int ssam_nf_refcount_enable(struct ssam_controller *ctrl,
+ }
+ 
+ /**
+- * ssam_nf_refcount_disable_free() - Disable event for reference count entry if it is
+- * no longer in use and free the corresponding entry.
++ * ssam_nf_refcount_disable_free() - Disable event for reference count entry if
++ * it is no longer in use and free the corresponding entry.
+  * @ctrl:  The controller to disable the event on.
+  * @entry: The reference count entry for the event to be disabled.
+  * @flags: The flags used for enabling the event on the EC.
++ * @ec:    Flag specifying if the event should actually be disabled on the EC.
+  *
+- * If the reference count equals zero, i.e. the event is no longer requested by
+- * any client, the event will be disabled and the corresponding reference count
+- * entry freed. The reference count entry must not be used any more after a
+- * call to this function.
++ * If ``ec`` equals ``true`` and the reference count equals zero (i.e.  the
++ * event is no longer requested by any client), the specified event will be
++ * disabled on the EC via the corresponding request.
++ *
++ * If ``ec`` equals ``false``, no request will be sent to the EC and the event
++ * can be considered in a detached state (i.e. no longer used but still
++ * enabled). Disabling an event via this method may be required for
++ * hot-removable devices, where event disable requests may time out after the
++ * device has been physically removed.
++ *
++ * In both cases, if the reference count equals zero, the corresponding
++ * reference count entry will be freed. The reference count entry must not be
++ * used any more after a call to this function.
+  *
+  * Also checks if the flags used for disabling the event match the flags used
+  * for enabling the event and warns if they do not (regardless of reference
+@@ -2223,7 +2233,7 @@ static int ssam_nf_refcount_enable(struct ssam_controller *ctrl,
+  * returns the status of the event-enable EC command.
+  */
+ static int ssam_nf_refcount_disable_free(struct ssam_controller *ctrl,
+-					 struct ssam_nf_refcount_entry *entry, u8 flags)
++					 struct ssam_nf_refcount_entry *entry, u8 flags, bool ec)
+ {
+ 	const struct ssam_event_registry reg = entry->key.reg;
+ 	const struct ssam_event_id id = entry->key.id;
+@@ -2232,8 +2242,9 @@ static int ssam_nf_refcount_disable_free(struct ssam_controller *ctrl,
+ 
+ 	lockdep_assert_held(&nf->lock);
+ 
+-	ssam_dbg(ctrl, "disabling event (reg: %#04x, tc: %#04x, iid: %#04x, rc: %d)\n",
+-		 reg.target_category, id.target_category, id.instance, entry->refcount);
++	ssam_dbg(ctrl, "%s event (reg: %#04x, tc: %#04x, iid: %#04x, rc: %d)\n",
++		 ec ? "disabling" : "detaching", reg.target_category, id.target_category,
++		 id.instance, entry->refcount);
+ 
+ 	if (entry->flags != flags) {
+ 		ssam_warn(ctrl,
+@@ -2242,7 +2253,7 @@ static int ssam_nf_refcount_disable_free(struct ssam_controller *ctrl,
+ 			  id.instance);
+ 	}
+ 
+-	if (entry->refcount == 0) {
++	if (ec && entry->refcount == 0) {
+ 		status = ssam_ssh_event_disable(ctrl, reg, id, flags);
+ 		kfree(entry);
+ 	}
+@@ -2322,20 +2333,26 @@ int ssam_notifier_register(struct ssam_controller *ctrl, struct ssam_event_notif
+ EXPORT_SYMBOL_GPL(ssam_notifier_register);
+ 
+ /**
+- * ssam_notifier_unregister() - Unregister an event notifier.
+- * @ctrl: The controller the notifier has been registered on.
+- * @n:    The event notifier to unregister.
++ * __ssam_notifier_unregister() - Unregister an event notifier.
++ * @ctrl:    The controller the notifier has been registered on.
++ * @n:       The event notifier to unregister.
++ * @disable: Whether to disable the corresponding event on the EC.
+  *
+  * Unregister an event notifier. Decrement the usage counter of the associated
+  * SAM event if the notifier is not marked as an observer. If the usage counter
+- * reaches zero, the event will be disabled.
++ * reaches zero and ``disable`` equals ``true``, the event will be disabled.
++ *
++ * Useful for hot-removable devices, where communication may fail once the
++ * device has been physically removed. In that case, specifying ``disable`` as
++ * ``false`` avoids communication with the EC.
+  *
+  * Return: Returns zero on success, %-ENOENT if the given notifier block has
+  * not been registered on the controller. If the given notifier block was the
+  * last one associated with its specific event, returns the status of the
+  * event-disable EC-command.
+  */
+-int ssam_notifier_unregister(struct ssam_controller *ctrl, struct ssam_event_notifier *n)
++int __ssam_notifier_unregister(struct ssam_controller *ctrl, struct ssam_event_notifier *n,
++			       bool disable)
+ {
+ 	u16 rqid = ssh_tc_to_rqid(n->event.id.target_category);
+ 	struct ssam_nf_refcount_entry *entry;
+@@ -2373,7 +2390,7 @@ int ssam_notifier_unregister(struct ssam_controller *ctrl, struct ssam_event_not
+ 			goto remove;
+ 		}
+ 
+-		status = ssam_nf_refcount_disable_free(ctrl, entry, n->event.flags);
++		status = ssam_nf_refcount_disable_free(ctrl, entry, n->event.flags, disable);
+ 	}
+ 
+ remove:
+@@ -2383,7 +2400,7 @@ int ssam_notifier_unregister(struct ssam_controller *ctrl, struct ssam_event_not
+ 
+ 	return status;
+ }
+-EXPORT_SYMBOL_GPL(ssam_notifier_unregister);
++EXPORT_SYMBOL_GPL(__ssam_notifier_unregister);
+ 
+ /**
+  * ssam_controller_event_enable() - Enable the specified event.
+@@ -2477,7 +2494,7 @@ int ssam_controller_event_disable(struct ssam_controller *ctrl,
+ 		return -ENOENT;
+ 	}
+ 
+-	status = ssam_nf_refcount_disable_free(ctrl, entry, flags);
++	status = ssam_nf_refcount_disable_free(ctrl, entry, flags, true);
+ 
+ 	mutex_unlock(&nf->lock);
+ 	return status;
+diff --git a/include/linux/surface_aggregator/controller.h b/include/linux/surface_aggregator/controller.h
+index 74bfdffaf7b0..50a2b4926c06 100644
+--- a/include/linux/surface_aggregator/controller.h
++++ b/include/linux/surface_aggregator/controller.h
+@@ -835,8 +835,28 @@ struct ssam_event_notifier {
+ int ssam_notifier_register(struct ssam_controller *ctrl,
+ 			   struct ssam_event_notifier *n);
+ 
+-int ssam_notifier_unregister(struct ssam_controller *ctrl,
+-			     struct ssam_event_notifier *n);
++int __ssam_notifier_unregister(struct ssam_controller *ctrl,
++			       struct ssam_event_notifier *n, bool disable);
++
++/**
++ * ssam_notifier_unregister() - Unregister an event notifier.
++ * @ctrl:    The controller the notifier has been registered on.
++ * @n:       The event notifier to unregister.
++ *
++ * Unregister an event notifier. Decrement the usage counter of the associated
++ * SAM event if the notifier is not marked as an observer. If the usage counter
++ * reaches zero, the event will be disabled.
++ *
++ * Return: Returns zero on success, %-ENOENT if the given notifier block has
++ * not been registered on the controller. If the given notifier block was the
++ * last one associated with its specific event, returns the status of the
++ * event-disable EC-command.
++ */
++static inline int ssam_notifier_unregister(struct ssam_controller *ctrl,
++					   struct ssam_event_notifier *n)
++{
++	return __ssam_notifier_unregister(ctrl, n, true);
++}
+ 
+ int ssam_controller_event_enable(struct ssam_controller *ctrl,
+ 				 struct ssam_event_registry reg,
+diff --git a/include/linux/surface_aggregator/device.h b/include/linux/surface_aggregator/device.h
+index b474a9baab42..76e6300b07d5 100644
+--- a/include/linux/surface_aggregator/device.h
++++ b/include/linux/surface_aggregator/device.h
+@@ -474,4 +474,64 @@ static inline void ssam_hot_remove_clients(struct device *dev) {}
+ 				    sdev->uid.instance, ret);		\
+ 	}
+ 
++
++/* -- Helpers for client-device notifiers. ---------------------------------- */
++
++/**
++ * ssam_device_notifier_register() - Register an event notifier for the
++ * specified client device.
++ * @sdev: The device the notifier should be registered on.
++ * @n:    The event notifier to register.
++ *
++ * Register an event notifier. Increment the usage counter of the associated
++ * SAM event if the notifier is not marked as an observer. If the event is not
++ * marked as an observer and is currently not enabled, it will be enabled
++ * during this call. If the notifier is marked as an observer, no attempt will
++ * be made at enabling any event and no reference count will be modified.
++ *
++ * Notifiers marked as observers do not need to be associated with one specific
++ * event, i.e. as long as no event matching is performed, only the event target
++ * category needs to be set.
++ *
++ * Return: Returns zero on success, %-ENOSPC if there have already been
++ * %INT_MAX notifiers for the event ID/type associated with the notifier block
++ * registered, %-ENOMEM if the corresponding event entry could not be
++ * allocated, %-ENODEV if the device is marked as hot-removed. If this is the
++ * first time that a notifier block is registered for the specific associated
++ * event, returns the status of the event-enable EC-command.
++ */
++static inline int ssam_device_notifier_register(struct ssam_device *sdev,
++						struct ssam_event_notifier *n)
++{
++	if (ssam_device_is_hot_removed(sdev))
++		return -ENODEV;
++
++	return ssam_notifier_register(sdev->ctrl, n);
++}
++
++/**
++ * ssam_device_notifier_unregister() - Unregister an event notifier for the
++ * specified client device.
++ * @sdev: The device the notifier has been registered on.
++ * @n:    The event notifier to unregister.
++ *
++ * Unregister an event notifier. Decrement the usage counter of the associated
++ * SAM event if the notifier is not marked as an observer. If the usage counter
++ * reaches zero, the event will be disabled.
++ *
++ * In case the device has been marked as hot-removed, the event will not be
++ * disabled on the EC, as in those cases any attempt at doing so may time out.
++ *
++ * Return: Returns zero on success, %-ENOENT if the given notifier block has
++ * not been registered on the controller. If the given notifier block was the
++ * last one associated with its specific event, returns the status of the
++ * event-disable EC-command.
++ */
++static inline int ssam_device_notifier_unregister(struct ssam_device *sdev,
++						  struct ssam_event_notifier *n)
++{
++	return __ssam_notifier_unregister(sdev->ctrl, n,
++					  !ssam_device_is_hot_removed(sdev));
++}
++
+ #endif /* _LINUX_SURFACE_AGGREGATOR_DEVICE_H */
+-- 
+2.33.1
+
+From c737f87cc26eaa28a6d44637478cf0835d395a94 Mon Sep 17 00:00:00 2001
+From: Maximilian Luz <luzmaximilian@gmail.com>
+Date: Tue, 8 Jun 2021 01:20:49 +0200
+Subject: [PATCH] platform/surface: aggregator_registry: Use client device
+ wrappers for notifier registration
+
+Use newly introduced client device wrapper functions for notifier
+registration and deregistration.
+
+Signed-off-by: Maximilian Luz <luzmaximilian@gmail.com>
+Patchset: surface-sam
+---
+ drivers/platform/surface/surface_aggregator_registry.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/platform/surface/surface_aggregator_registry.c b/drivers/platform/surface/surface_aggregator_registry.c
+index 2e0d3a808d47..64c83b846907 100644
+--- a/drivers/platform/surface/surface_aggregator_registry.c
++++ b/drivers/platform/surface/surface_aggregator_registry.c
+@@ -459,7 +459,7 @@ static int ssam_base_hub_probe(struct ssam_device *sdev)
+ 
+ 	ssam_device_set_drvdata(sdev, hub);
+ 
+-	status = ssam_notifier_register(sdev->ctrl, &hub->notif);
++	status = ssam_device_notifier_register(sdev, &hub->notif);
+ 	if (status)
+ 		return status;
+ 
+@@ -471,7 +471,7 @@ static int ssam_base_hub_probe(struct ssam_device *sdev)
+ 	return 0;
+ 
+ err:
+-	ssam_notifier_unregister(sdev->ctrl, &hub->notif);
++	ssam_device_notifier_unregister(sdev, &hub->notif);
+ 	cancel_delayed_work_sync(&hub->update_work);
+ 	ssam_remove_clients(&sdev->dev);
+ 	return status;
+@@ -483,7 +483,7 @@ static void ssam_base_hub_remove(struct ssam_device *sdev)
+ 
+ 	sysfs_remove_group(&sdev->dev.kobj, &ssam_base_hub_group);
+ 
+-	ssam_notifier_unregister(sdev->ctrl, &hub->notif);
++	ssam_device_notifier_unregister(sdev, &hub->notif);
+ 	cancel_delayed_work_sync(&hub->update_work);
+ 	ssam_remove_clients(&sdev->dev);
+ }
+-- 
+2.33.1
+
+From 8f2340e6b616e25cdf4e9f8a75ec95287172f918 Mon Sep 17 00:00:00 2001
+From: Maximilian Luz <luzmaximilian@gmail.com>
+Date: Tue, 8 Jun 2021 01:08:29 +0200
+Subject: [PATCH] power/supply: surface_charger: Add support for hot-removal
+
+In cases of hot-removal, further communication with the device should be
+avoided as it may fail and time out.
+
+Use the client device wrapper functions to register and unregister the
+notifiers as those check during unregistration if the device has been
+marked as hot-removed and handle this case appropriately.
+
+Signed-off-by: Maximilian Luz <luzmaximilian@gmail.com>
+Patchset: surface-sam
+---
+ drivers/power/supply/surface_charger.c | 16 +++++++++++-----
+ 1 file changed, 11 insertions(+), 5 deletions(-)
+
+diff --git a/drivers/power/supply/surface_charger.c b/drivers/power/supply/surface_charger.c
+index a060c36c7766..9a3525c32aca 100644
+--- a/drivers/power/supply/surface_charger.c
++++ b/drivers/power/supply/surface_charger.c
+@@ -69,6 +69,9 @@ static int spwr_ac_update_unlocked(struct spwr_ac_device *ac)
+ 	__le32 old = ac->state;
+ 	int status;
+ 
++	if (ssam_device_is_hot_removed(ac->sdev))
++		return -ENODEV;
++
+ 	lockdep_assert_held(&ac->lock);
+ 
+ 	status = ssam_retry(ssam_bat_get_psrc, ac->sdev, &ac->state);
+@@ -103,7 +106,6 @@ static int spwr_ac_recheck(struct spwr_ac_device *ac)
+ static u32 spwr_notify_ac(struct ssam_event_notifier *nf, const struct ssam_event *event)
+ {
+ 	struct spwr_ac_device *ac;
+-	int status;
+ 
+ 	ac = container_of(nf, struct spwr_ac_device, notif);
+ 
+@@ -121,8 +123,12 @@ static u32 spwr_notify_ac(struct ssam_event_notifier *nf, const struct ssam_even
+ 
+ 	switch (event->command_id) {
+ 	case SAM_EVENT_CID_BAT_ADP:
+-		status = spwr_ac_recheck(ac);
+-		return ssam_notifier_from_errno(status) | SSAM_NOTIF_HANDLED;
++		/*
++		 * Any errors here should not be critical and logged in the
++		 * corresponding functions, so ignore them.
++		 */
++		spwr_ac_recheck(ac);
++		return SSAM_NOTIF_HANDLED;
+ 
+ 	default:
+ 		return 0;
+@@ -216,7 +222,7 @@ static int spwr_ac_register(struct spwr_ac_device *ac)
+ 	if (IS_ERR(ac->psy))
+ 		return PTR_ERR(ac->psy);
+ 
+-	return ssam_notifier_register(ac->sdev->ctrl, &ac->notif);
++	return ssam_device_notifier_register(ac->sdev, &ac->notif);
+ }
+ 
+ 
+@@ -251,7 +257,7 @@ static void surface_ac_remove(struct ssam_device *sdev)
+ {
+ 	struct spwr_ac_device *ac = ssam_device_get_drvdata(sdev);
+ 
+-	ssam_notifier_unregister(sdev->ctrl, &ac->notif);
++	ssam_device_notifier_unregister(sdev, &ac->notif);
+ }
+ 
+ static const struct spwr_psy_properties spwr_psy_props_adp1 = {
+-- 
+2.33.1
+
+From c7ee552c8c906928968838f8d5798d495bddea35 Mon Sep 17 00:00:00 2001
+From: Maximilian Luz <luzmaximilian@gmail.com>
+Date: Tue, 8 Jun 2021 01:15:34 +0200
+Subject: [PATCH] power/supply: surface_battery: Add support for hot-removal
+
+In cases of hot-removal, further communication with the device should be
+avoided as it may fail and time out.
+
+Use the client device wrapper functions to register and unregister the
+notifiers as those check during unregistration if the device has been
+marked as hot-removed and handle this case appropriately.
+
+Signed-off-by: Maximilian Luz <luzmaximilian@gmail.com>
+Patchset: surface-sam
+---
+ drivers/power/supply/surface_battery.c | 10 ++++++++--
+ 1 file changed, 8 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/power/supply/surface_battery.c b/drivers/power/supply/surface_battery.c
+index 5ec2e6bb2465..ebf1f96e9a89 100644
+--- a/drivers/power/supply/surface_battery.c
++++ b/drivers/power/supply/surface_battery.c
+@@ -156,6 +156,9 @@ static bool spwr_battery_present(struct spwr_battery_device *bat)
+ {
+ 	lockdep_assert_held(&bat->lock);
+ 
++	if (ssam_device_is_hot_removed(bat->sdev))
++		return false;
++
+ 	return le32_to_cpu(bat->sta) & SAM_BATTERY_STA_PRESENT;
+ }
+ 
+@@ -245,6 +248,9 @@ static int spwr_battery_update_bix_unlocked(struct spwr_battery_device *bat)
+ 
+ 	lockdep_assert_held(&bat->lock);
+ 
++	if (ssam_device_is_hot_removed(bat->sdev))
++		return 0;
++
+ 	status = spwr_battery_load_sta(bat);
+ 	if (status)
+ 		return status;
+@@ -802,7 +808,7 @@ static int spwr_battery_register(struct spwr_battery_device *bat)
+ 	if (IS_ERR(bat->psy))
+ 		return PTR_ERR(bat->psy);
+ 
+-	return ssam_notifier_register(bat->sdev->ctrl, &bat->notif);
++	return ssam_device_notifier_register(bat->sdev, &bat->notif);
+ }
+ 
+ 
+@@ -837,7 +843,7 @@ static void surface_battery_remove(struct ssam_device *sdev)
+ {
+ 	struct spwr_battery_device *bat = ssam_device_get_drvdata(sdev);
+ 
+-	ssam_notifier_unregister(sdev->ctrl, &bat->notif);
++	ssam_device_notifier_unregister(sdev, &bat->notif);
+ 	cancel_delayed_work_sync(&bat->update_work);
+ }
+ 
+-- 
+2.33.1
+
+From 585bb3af623931c535785688993097083e273865 Mon Sep 17 00:00:00 2001
+From: Maximilian Luz <luzmaximilian@gmail.com>
+Date: Tue, 8 Jun 2021 01:33:02 +0200
+Subject: [PATCH] HID: surface-hid: Add support for hot-removal
+
+Add support for hot-removal of SSAM HID client devices.
+
+Once a device has been hot-removed, further communication with it should
+be avoided as it may fail and time out. While the device will be removed
+as soon as we detect hot-removal, communication may still occur during
+teardown, especially when unregistering notifiers.
+
+While hot-removal is a surprise event that can happen any time, try to
+avoid communication as much as possible once it has been detected to
+prevent timeouts that can slow down device removal and cause issues,
+e.g. when quickly re-attaching the device.
+
+Signed-off-by: Maximilian Luz <luzmaximilian@gmail.com>
+Patchset: surface-sam
+---
+ drivers/hid/surface-hid/surface_hid_core.c | 38 +++++++++++++++++++++-
+ 1 file changed, 37 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/hid/surface-hid/surface_hid_core.c b/drivers/hid/surface-hid/surface_hid_core.c
+index 5571e74abe91..63a7963ed345 100644
+--- a/drivers/hid/surface-hid/surface_hid_core.c
++++ b/drivers/hid/surface-hid/surface_hid_core.c
+@@ -19,12 +19,30 @@
+ #include "surface_hid_core.h"
+ 
+ 
++/* -- Utility functions. ---------------------------------------------------- */
++
++static bool surface_hid_is_hot_removed(struct surface_hid_device *shid)
++{
++	/*
++	 * Non-ssam client devices, i.e. platform client devices, cannot be
++	 * hot-removed.
++	 */
++	if (!is_ssam_device(shid->dev))
++		return false;
++
++	return ssam_device_is_hot_removed(to_ssam_device(shid->dev));
++}
++
++
+ /* -- Device descriptor access. --------------------------------------------- */
+ 
+ static int surface_hid_load_hid_descriptor(struct surface_hid_device *shid)
+ {
+ 	int status;
+ 
++	if (surface_hid_is_hot_removed(shid))
++		return -ENODEV;
++
+ 	status = shid->ops.get_descriptor(shid, SURFACE_HID_DESC_HID,
+ 			(u8 *)&shid->hid_desc, sizeof(shid->hid_desc));
+ 	if (status)
+@@ -61,6 +79,9 @@ static int surface_hid_load_device_attributes(struct surface_hid_device *shid)
+ {
+ 	int status;
+ 
++	if (surface_hid_is_hot_removed(shid))
++		return -ENODEV;
++
+ 	status = shid->ops.get_descriptor(shid, SURFACE_HID_DESC_ATTRS,
+ 			(u8 *)&shid->attrs, sizeof(shid->attrs));
+ 	if (status)
+@@ -88,9 +109,18 @@ static int surface_hid_start(struct hid_device *hid)
+ static void surface_hid_stop(struct hid_device *hid)
+ {
+ 	struct surface_hid_device *shid = hid->driver_data;
++	bool hot_removed;
++
++	/*
++	 * Communication may fail for devices that have been hot-removed. This
++	 * also includes registration of HID events, so we need to check this
++	 * here. Only if the device has not been marked as hot-removed, we can
++	 * safely disable events.
++	 */
++	hot_removed = surface_hid_is_hot_removed(shid);
+ 
+ 	/* Note: This call will log errors for us, so ignore them here. */
+-	ssam_notifier_unregister(shid->ctrl, &shid->notif);
++	__ssam_notifier_unregister(shid->ctrl, &shid->notif, !hot_removed);
+ }
+ 
+ static int surface_hid_open(struct hid_device *hid)
+@@ -109,6 +139,9 @@ static int surface_hid_parse(struct hid_device *hid)
+ 	u8 *buf;
+ 	int status;
+ 
++	if (surface_hid_is_hot_removed(shid))
++		return -ENODEV;
++
+ 	buf = kzalloc(len, GFP_KERNEL);
+ 	if (!buf)
+ 		return -ENOMEM;
+@@ -126,6 +159,9 @@ static int surface_hid_raw_request(struct hid_device *hid, unsigned char reportn
+ {
+ 	struct surface_hid_device *shid = hid->driver_data;
+ 
++	if (surface_hid_is_hot_removed(shid))
++		return -ENODEV;
++
+ 	if (rtype == HID_OUTPUT_REPORT && reqtype == HID_REQ_SET_REPORT)
+ 		return shid->ops.output_report(shid, reportnum, buf, len);
+ 
+-- 
+2.33.1
+
+From 06fee01ca55ec43027b5bc5fcd3c3f26a63d0c72 Mon Sep 17 00:00:00 2001
+From: Maximilian Luz <luzmaximilian@gmail.com>
+Date: Sun, 10 Oct 2021 23:56:23 +0200
+Subject: [PATCH] wip! platform/surface: aggregator_registry: Add KIP device
+ hub
+
+Signed-off-by: Maximilian Luz <luzmaximilian@gmail.com>
+Patchset: surface-sam
+---
+ .../surface/surface_aggregator_registry.c     | 210 +++++++++++++++++-
+ 1 file changed, 208 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/platform/surface/surface_aggregator_registry.c b/drivers/platform/surface/surface_aggregator_registry.c
+index 64c83b846907..e02fe833fde8 100644
+--- a/drivers/platform/surface/surface_aggregator_registry.c
++++ b/drivers/platform/surface/surface_aggregator_registry.c
+@@ -505,6 +505,200 @@ static struct ssam_device_driver ssam_base_hub_driver = {
+ };
+ 
+ 
++/* -- SSAM KIP-subsystem hub driver. ---------------------------------------- */
++
++/*
++ * Some devices may need a bit of time to be fully usable after being
++ * (re-)connected. This delay has been determined via experimentation.
++ */
++#define SSAM_KIP_UPDATE_CONNECT_DELAY		msecs_to_jiffies(250)
++
++#define SSAM_EVENT_KIP_CID_CONNECTION		0x2c
++
++enum ssam_kip_hub_state {
++	SSAM_KIP_HUB_UNINITIALIZED,
++	SSAM_KIP_HUB_CONNECTED,
++	SSAM_KIP_HUB_DISCONNECTED,
++};
++
++struct ssam_kip_hub {
++	struct ssam_device *sdev;
++
++	enum ssam_kip_hub_state state;
++	struct delayed_work update_work;
++
++	struct ssam_event_notifier notif;
++};
++
++SSAM_DEFINE_SYNC_REQUEST_R(__ssam_kip_get_connection_state, u8, {
++	.target_category = SSAM_SSH_TC_KIP,
++	.target_id       = 0x01,
++	.command_id      = 0x2c,
++	.instance_id     = 0x00,
++});
++
++static int ssam_kip_get_connection_state(struct ssam_kip_hub *hub, enum ssam_kip_hub_state *state)
++{
++	int status;
++	u8 connected;
++
++	status = ssam_retry(__ssam_kip_get_connection_state, hub->sdev->ctrl, &connected);
++	if (status < 0) {
++		dev_err(&hub->sdev->dev, "failed to query KIP connection state: %d\n", status);
++		return status;
++	}
++
++	*state = connected ? SSAM_KIP_HUB_CONNECTED : SSAM_KIP_HUB_DISCONNECTED;
++	return 0;
++}
++
++static ssize_t ssam_kip_hub_state_show(struct device *dev, struct device_attribute *attr, char *buf)
++{
++	struct ssam_kip_hub *hub = dev_get_drvdata(dev);
++	bool connected = hub->state == SSAM_KIP_HUB_CONNECTED;
++
++	return sysfs_emit(buf, "%d\n", connected);
++}
++
++static struct device_attribute ssam_kip_hub_attr_state =
++	__ATTR(state, 0444, ssam_kip_hub_state_show, NULL);
++
++static struct attribute *ssam_kip_hub_attrs[] = {
++	&ssam_kip_hub_attr_state.attr,
++	NULL,
++};
++
++static const struct attribute_group ssam_kip_hub_group = {
++	.attrs = ssam_kip_hub_attrs,
++};
++
++static void ssam_kip_hub_update_workfn(struct work_struct *work)
++{
++	struct ssam_kip_hub *hub = container_of(work, struct ssam_kip_hub, update_work.work);
++	struct fwnode_handle *node = dev_fwnode(&hub->sdev->dev);
++	enum ssam_kip_hub_state state;
++	int status = 0;
++
++	status = ssam_kip_get_connection_state(hub, &state);
++	if (status)
++		return;
++
++	if (hub->state == state)
++		return;
++	hub->state = state;
++
++	if (hub->state == SSAM_KIP_HUB_CONNECTED)
++		status = ssam_hub_register_clients(&hub->sdev->dev, hub->sdev->ctrl, node);
++	else
++		ssam_remove_clients(&hub->sdev->dev);
++
++	if (status)
++		dev_err(&hub->sdev->dev, "failed to update KIP-hub devices: %d\n", status);
++}
++
++static u32 ssam_kip_hub_notif(struct ssam_event_notifier *nf, const struct ssam_event *event)
++{
++	struct ssam_kip_hub *hub = container_of(nf, struct ssam_kip_hub, notif);
++	unsigned long delay;
++
++	if (event->command_id != SSAM_EVENT_KIP_CID_CONNECTION)
++		return 0;	/* Return "unhandled". */
++
++	if (event->length < 1) {
++		dev_err(&hub->sdev->dev, "unexpected payload size: %u\n", event->length);
++		return 0;
++	}
++
++	/*
++	 * Delay update when KIP devices are being connected to give devices/EC
++	 * some time to set up.
++	 */
++	delay = event->data[0] ? SSAM_KIP_UPDATE_CONNECT_DELAY : 0;
++
++	schedule_delayed_work(&hub->update_work, delay);
++
++	return SSAM_NOTIF_HANDLED;
++}
++
++static int __maybe_unused ssam_kip_hub_resume(struct device *dev)
++{
++	struct ssam_kip_hub *hub = dev_get_drvdata(dev);
++
++	schedule_delayed_work(&hub->update_work, 0);
++	return 0;
++}
++static SIMPLE_DEV_PM_OPS(ssam_kip_hub_pm_ops, NULL, ssam_kip_hub_resume);
++
++static int ssam_kip_hub_probe(struct ssam_device *sdev)
++{
++	struct ssam_kip_hub *hub;
++	int status;
++
++	hub = devm_kzalloc(&sdev->dev, sizeof(*hub), GFP_KERNEL);
++	if (!hub)
++		return -ENOMEM;
++
++	hub->sdev = sdev;
++	hub->state = SSAM_KIP_HUB_UNINITIALIZED;
++
++	hub->notif.base.priority = INT_MAX;  /* This notifier should run first. */
++	hub->notif.base.fn = ssam_kip_hub_notif;
++	hub->notif.event.reg = SSAM_EVENT_REGISTRY_SAM;
++	hub->notif.event.id.target_category = SSAM_SSH_TC_KIP,
++	hub->notif.event.id.instance = 0,
++	hub->notif.event.mask = SSAM_EVENT_MASK_TARGET;
++	hub->notif.event.flags = SSAM_EVENT_SEQUENCED;
++
++	INIT_DELAYED_WORK(&hub->update_work, ssam_kip_hub_update_workfn);
++
++	ssam_device_set_drvdata(sdev, hub);
++
++	status = ssam_device_notifier_register(sdev, &hub->notif);
++	if (status)
++		return status;
++
++	status = sysfs_create_group(&sdev->dev.kobj, &ssam_kip_hub_group);
++	if (status)
++		goto err;
++
++	schedule_delayed_work(&hub->update_work, 0);
++	return 0;
++
++err:
++	ssam_device_notifier_unregister(sdev, &hub->notif);
++	cancel_delayed_work_sync(&hub->update_work);
++	ssam_remove_clients(&sdev->dev);
++	return status;
++}
++
++static void ssam_kip_hub_remove(struct ssam_device *sdev)
++{
++	struct ssam_kip_hub *hub = ssam_device_get_drvdata(sdev);
++
++	sysfs_remove_group(&sdev->dev.kobj, &ssam_kip_hub_group);
++
++	ssam_device_notifier_unregister(sdev, &hub->notif);
++	cancel_delayed_work_sync(&hub->update_work);
++	ssam_remove_clients(&sdev->dev);
++}
++
++static const struct ssam_device_id ssam_kip_hub_match[] = {
++	{ SSAM_SDEV(KIP, 0x01, 0x00, 0x00) },
++	{ },
++};
++
++static struct ssam_device_driver ssam_kip_hub_driver = {
++	.probe = ssam_kip_hub_probe,
++	.remove = ssam_kip_hub_remove,
++	.match_table = ssam_kip_hub_match,
++	.driver = {
++		.name = "surface_kip_hub",
++		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
++		.pm = &ssam_kip_hub_pm_ops,
++	},
++};
++
++
+ /* -- SSAM platform/meta-hub driver. ---------------------------------------- */
+ 
+ static const struct acpi_device_id ssam_platform_hub_match[] = {
+@@ -624,18 +818,30 @@ static int __init ssam_device_hub_init(void)
+ 
+ 	status = platform_driver_register(&ssam_platform_hub_driver);
+ 	if (status)
+-		return status;
++		goto err_platform;
+ 
+ 	status = ssam_device_driver_register(&ssam_base_hub_driver);
+ 	if (status)
+-		platform_driver_unregister(&ssam_platform_hub_driver);
++		goto err_base;
++
++	status = ssam_device_driver_register(&ssam_kip_hub_driver);
++	if (status)
++		goto err_kip;
+ 
++	return 0;
++
++err_kip:
++	ssam_device_driver_unregister(&ssam_base_hub_driver);
++err_base:
++	platform_driver_unregister(&ssam_platform_hub_driver);
++err_platform:
+ 	return status;
+ }
+ module_init(ssam_device_hub_init);
+ 
+ static void __exit ssam_device_hub_exit(void)
+ {
++	ssam_device_driver_unregister(&ssam_kip_hub_driver);
+ 	ssam_device_driver_unregister(&ssam_base_hub_driver);
+ 	platform_driver_unregister(&ssam_platform_hub_driver);
+ }
+-- 
+2.33.1
+
+From 275eff5a992506073188eddb09bfa2c0cfa838e5 Mon Sep 17 00:00:00 2001
+From: Maximilian Luz <luzmaximilian@gmail.com>
+Date: Tue, 8 Jun 2021 03:19:20 +0200
+Subject: [PATCH] wip! platform/surface: Add KIP tablet-mode switch
+
+Signed-off-by: Maximilian Luz <luzmaximilian@gmail.com>
+Patchset: surface-sam
+---
+ drivers/platform/surface/Kconfig              |   8 +
+ drivers/platform/surface/Makefile             |   1 +
+ .../surface/surface_kip_tablet_switch.c       | 242 ++++++++++++++++++
+ 3 files changed, 251 insertions(+)
+ create mode 100644 drivers/platform/surface/surface_kip_tablet_switch.c
+
+diff --git a/drivers/platform/surface/Kconfig b/drivers/platform/surface/Kconfig
+index 3105f651614f..133ebb84bd2d 100644
+--- a/drivers/platform/surface/Kconfig
++++ b/drivers/platform/surface/Kconfig
+@@ -152,6 +152,14 @@ config SURFACE_HOTPLUG
+ 	  Select M or Y here, if you want to (fully) support hot-plugging of
+ 	  dGPU devices on the Surface Book 2 and/or 3 during D3cold.
+ 
++config SURFACE_KIP_TABLET_SWITCH
++	tristate "Surface KIP Tablet-Mode Switch Driver"
++	depends on SURFACE_AGGREGATOR
++	depends on SURFACE_AGGREGATOR_BUS
++	depends on INPUT
++	help
++	  TODO
++
+ config SURFACE_PLATFORM_PROFILE
+ 	tristate "Surface Platform Profile Driver"
+ 	depends on SURFACE_AGGREGATOR_REGISTRY
+diff --git a/drivers/platform/surface/Makefile b/drivers/platform/surface/Makefile
+index 32889482de55..6d9291c993c4 100644
+--- a/drivers/platform/surface/Makefile
++++ b/drivers/platform/surface/Makefile
+@@ -14,5 +14,6 @@ obj-$(CONFIG_SURFACE_AGGREGATOR_REGISTRY) += surface_aggregator_registry.o
+ obj-$(CONFIG_SURFACE_DTX)		+= surface_dtx.o
+ obj-$(CONFIG_SURFACE_GPE)		+= surface_gpe.o
+ obj-$(CONFIG_SURFACE_HOTPLUG)		+= surface_hotplug.o
++obj-$(CONFIG_SURFACE_KIP_TABLET_SWITCH)	+= surface_kip_tablet_switch.o
+ obj-$(CONFIG_SURFACE_PLATFORM_PROFILE)	+= surface_platform_profile.o
+ obj-$(CONFIG_SURFACE_PRO3_BUTTON)	+= surfacepro3_button.o
+diff --git a/drivers/platform/surface/surface_kip_tablet_switch.c b/drivers/platform/surface/surface_kip_tablet_switch.c
+new file mode 100644
+index 000000000000..87055f13bf9c
+--- /dev/null
++++ b/drivers/platform/surface/surface_kip_tablet_switch.c
+@@ -0,0 +1,242 @@
++// SPDX-License-Identifier: GPL-2.0+
++/*
++ * Surface System Aggregator Module (SSAM) tablet mode switch via KIP
++ * subsystem.
++ *
++ * Copyright (C) 2021 Maximilian Luz <luzmaximilian@gmail.com>
++ */
++
++#include <linux/input.h>
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/platform_device.h>
++#include <linux/types.h>
++#include <linux/workqueue.h>
++
++#include <linux/surface_aggregator/controller.h>
++#include <linux/surface_aggregator/device.h>
++
++#define SSAM_EVENT_KIP_CID_LID_STATE		0x1d
++
++enum ssam_kip_lid_state {
++	SSAM_KIP_LID_STATE_DISCONNECTED   = 0x01,
++	SSAM_KIP_LID_STATE_CLOSED         = 0x02,
++	SSAM_KIP_LID_STATE_LAPTOP         = 0x03,
++	SSAM_KIP_LID_STATE_FOLDED_CANVAS  = 0x04,
++	SSAM_KIP_LID_STATE_FOLDED_BACK    = 0x05,
++};
++
++struct ssam_kip_sw {
++	struct ssam_device *sdev;
++
++	enum ssam_kip_lid_state state;
++	struct work_struct update_work;
++	struct input_dev *mode_switch;
++
++	struct ssam_event_notifier notif;
++};
++
++SSAM_DEFINE_SYNC_REQUEST_R(__ssam_kip_get_lid_state, u8, {
++	.target_category = SSAM_SSH_TC_KIP,
++	.target_id       = 0x01,
++	.command_id      = 0x1d,
++	.instance_id     = 0x00,
++});
++
++static int ssam_kip_get_lid_state(struct ssam_kip_sw *sw, enum ssam_kip_lid_state *state)
++{
++	int status;
++	u8 raw;
++
++	status = ssam_retry(__ssam_kip_get_lid_state, sw->sdev->ctrl, &raw);
++	if (status < 0) {
++		dev_err(&sw->sdev->dev, "failed to query KIP lid state: %d\n", status);
++		return status;
++	}
++
++	*state = raw;
++	return 0;
++}
++
++static const char* ssam_kip_lid_state_str(enum ssam_kip_lid_state state)
++{
++	switch (state) {
++	case SSAM_KIP_LID_STATE_DISCONNECTED:
++		return "disconnected";
++
++	case SSAM_KIP_LID_STATE_CLOSED:
++		return "closed";
++
++	case SSAM_KIP_LID_STATE_LAPTOP:
++		return "laptop";
++
++	case SSAM_KIP_LID_STATE_FOLDED_CANVAS:
++		return "folded-canvas";
++
++	case SSAM_KIP_LID_STATE_FOLDED_BACK:
++		return "folded-back";
++
++	default:
++		return "<unknown>";
++	}
++}
++
++static ssize_t state_show(struct device *dev, struct device_attribute *attr, char *buf)
++{
++	struct ssam_kip_sw *sw = dev_get_drvdata(dev);
++
++	return sysfs_emit(buf, "%s\n", ssam_kip_lid_state_str(sw->state));
++}
++static DEVICE_ATTR_RO(state);
++
++static struct attribute *ssam_kip_sw_attrs[] = {
++	&dev_attr_state.attr,
++	NULL,
++};
++
++static const struct attribute_group ssam_kip_sw_group = {
++	.attrs = ssam_kip_sw_attrs,
++};
++
++static void ssam_kip_sw_update_workfn(struct work_struct *work)
++{
++	struct ssam_kip_sw *sw = container_of(work, struct ssam_kip_sw, update_work);
++	enum ssam_kip_lid_state state;
++	int tablet, status;
++
++	status = ssam_kip_get_lid_state(sw, &state);
++	if (status)
++		return;
++
++	if (sw->state == state)
++		return;
++
++	sw->state = state;
++
++	/* Send SW_TABLET_MODE event. */
++	tablet = state != SSAM_KIP_LID_STATE_LAPTOP;
++	input_report_switch(sw->mode_switch, SW_TABLET_MODE, tablet);
++	input_sync(sw->mode_switch);
++}
++
++static u32 ssam_kip_sw_notif(struct ssam_event_notifier *nf, const struct ssam_event *event)
++{
++	struct ssam_kip_sw *sw = container_of(nf, struct ssam_kip_sw, notif);
++
++	if (event->command_id != SSAM_EVENT_KIP_CID_LID_STATE)
++		return 0;	/* Return "unhandled". */
++
++	if (event->length < 1) {
++		dev_err(&sw->sdev->dev, "unexpected payload size: %u\n", event->length);
++		return 0;
++	}
++
++	schedule_work(&sw->update_work);
++
++	return SSAM_NOTIF_HANDLED;
++}
++
++static int __maybe_unused ssam_kip_sw_resume(struct device *dev)
++{
++	struct ssam_kip_sw *sw = dev_get_drvdata(dev);
++
++	schedule_work(&sw->update_work);
++	return 0;
++}
++static SIMPLE_DEV_PM_OPS(ssam_kip_sw_pm_ops, NULL, ssam_kip_sw_resume);
++
++static int ssam_kip_sw_probe(struct ssam_device *sdev)
++{
++	struct ssam_kip_sw *sw;
++	int tablet, status;
++
++	sw = devm_kzalloc(&sdev->dev, sizeof(*sw), GFP_KERNEL);
++	if (!sw)
++		return -ENOMEM;
++
++	sw->sdev = sdev;
++	INIT_WORK(&sw->update_work, ssam_kip_sw_update_workfn);
++
++	ssam_device_set_drvdata(sdev, sw);
++
++	/* Get initial state. */
++	status = ssam_kip_get_lid_state(sw, &sw->state);
++	if (status)
++		return status;
++
++	/* Set up tablet mode switch. */
++	sw->mode_switch = devm_input_allocate_device(&sdev->dev);
++	if (!sw->mode_switch)
++		return -ENOMEM;
++
++	sw->mode_switch->name = "Microsoft Surface KIP Tablet Mode Switch";
++	sw->mode_switch->phys = "ssam/01:0e:01:00:01/input0";
++	sw->mode_switch->id.bustype = BUS_HOST;
++	sw->mode_switch->dev.parent = &sdev->dev;
++
++	tablet = sw->state != SSAM_KIP_LID_STATE_LAPTOP;
++	input_set_capability(sw->mode_switch, EV_SW, SW_TABLET_MODE);
++	input_report_switch(sw->mode_switch, SW_TABLET_MODE, tablet);
++
++	status = input_register_device(sw->mode_switch);
++	if (status)
++		return status;
++
++	/* Set up notifier. */
++	sw->notif.base.priority = 0;
++	sw->notif.base.fn = ssam_kip_sw_notif;
++	sw->notif.event.reg = SSAM_EVENT_REGISTRY_SAM;
++	sw->notif.event.id.target_category = SSAM_SSH_TC_KIP,
++	sw->notif.event.id.instance = 0,
++	sw->notif.event.mask = SSAM_EVENT_MASK_TARGET;
++	sw->notif.event.flags = SSAM_EVENT_SEQUENCED;
++
++	status = ssam_device_notifier_register(sdev, &sw->notif);
++	if (status)
++		return status;
++
++	status = sysfs_create_group(&sdev->dev.kobj, &ssam_kip_sw_group);
++	if (status)
++		goto err;
++
++	/* We might have missed events during setup, so check again. */
++	schedule_work(&sw->update_work);
++	return 0;
++
++err:
++	ssam_device_notifier_unregister(sdev, &sw->notif);
++	cancel_work_sync(&sw->update_work);
++	return status;
++}
++
++static void ssam_kip_sw_remove(struct ssam_device *sdev)
++{
++	struct ssam_kip_sw *sw = ssam_device_get_drvdata(sdev);
++
++	sysfs_remove_group(&sdev->dev.kobj, &ssam_kip_sw_group);
++
++	ssam_device_notifier_unregister(sdev, &sw->notif);
++	cancel_work_sync(&sw->update_work);
++}
++
++static const struct ssam_device_id ssam_kip_sw_match[] = {
++	{ SSAM_SDEV(KIP, 0x01, 0x00, 0x01) },
++	{ },
++};
++MODULE_DEVICE_TABLE(ssam, ssam_kip_sw_match);
++
++static struct ssam_device_driver ssam_kip_sw_driver = {
++	.probe = ssam_kip_sw_probe,
++	.remove = ssam_kip_sw_remove,
++	.match_table = ssam_kip_sw_match,
++	.driver = {
++		.name = "surface_kip_tablet_mode_switch",
++		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
++		.pm = &ssam_kip_sw_pm_ops,
++	},
++};
++module_ssam_device_driver(ssam_kip_sw_driver);
++
++MODULE_AUTHOR("Maximilian Luz <luzmaximilian@gmail.com>");
++MODULE_DESCRIPTION("Tablet mode switch driver for Surface devices using KIP subsystem");
++MODULE_LICENSE("GPL");
+-- 
+2.33.1
+
+From b321e78a0435113151c7647986c30b4a2c076ed7 Mon Sep 17 00:00:00 2001
+From: Maximilian Luz <luzmaximilian@gmail.com>
+Date: Wed, 27 Oct 2021 22:33:03 +0200
+Subject: [PATCH] platform/surface: Add support for the Surface Pro 8
+
+Signed-off-by: Maximilian Luz <luzmaximilian@gmail.com>
+Patchset: surface-sam
+---
+ .../surface/surface_aggregator_registry.c     | 53 +++++++++++++++++++
+ 1 file changed, 53 insertions(+)
+
+diff --git a/drivers/platform/surface/surface_aggregator_registry.c b/drivers/platform/surface/surface_aggregator_registry.c
+index e02fe833fde8..c7baa3771420 100644
+--- a/drivers/platform/surface/surface_aggregator_registry.c
++++ b/drivers/platform/surface/surface_aggregator_registry.c
+@@ -47,6 +47,12 @@ static const struct software_node ssam_node_hub_base = {
+ 	.parent = &ssam_node_root,
+ };
+ 
++/* KIP device hub (keyboard cover on Surface Pro 8). */
++static const struct software_node ssam_node_hub_kip = {
++	.name = "ssam:01:0e:01:00:00",
++	.parent = &ssam_node_root,
++};
++
+ /* AC adapter. */
+ static const struct software_node ssam_node_bat_ac = {
+ 	.name = "ssam:01:02:01:01:01",
+@@ -71,6 +77,12 @@ static const struct software_node ssam_node_tmp_pprof = {
+ 	.parent = &ssam_node_root,
+ };
+ 
++/* Tablet mode switch via KIP subsystem. */
++static const struct software_node ssam_node_kip_tablet_switch = {
++	.name = "ssam:01:0e:01:00:01",
++	.parent = &ssam_node_root,
++};
++
+ /* DTX / detachment-system device (Surface Book 3). */
+ static const struct software_node ssam_node_bas_dtx = {
+ 	.name = "ssam:01:11:01:00:00",
+@@ -155,6 +167,30 @@ static const struct software_node ssam_node_hid_base_iid6 = {
+ 	.parent = &ssam_node_hub_base,
+ };
+ 
++/* HID keyboard (KIP hub). */
++static const struct software_node ssam_node_hid_kip_keyboard = {
++	.name = "ssam:01:15:02:01:00",
++	.parent = &ssam_node_hub_kip,
++};
++
++/* HID pen stash (KIP hub; pen taken / stashed away evens). */
++static const struct software_node ssam_node_hid_kip_penstash = {
++	.name = "ssam:01:15:02:02:00",
++	.parent = &ssam_node_hub_kip,
++};
++
++/* HID touchpad (KIP hub). */
++static const struct software_node ssam_node_hid_kip_touchpad = {
++	.name = "ssam:01:15:02:03:00",
++	.parent = &ssam_node_hub_kip,
++};
++
++/* HID device instance 5 (KIP hub, unknown HID device). */
++static const struct software_node ssam_node_hid_kip_iid5 = {
++	.name = "ssam:01:15:02:05:00",
++	.parent = &ssam_node_hub_kip,
++};
++
+ /*
+  * Devices for 5th- and 6th-generations models:
+  * - Surface Book 2,
+@@ -228,6 +264,20 @@ static const struct software_node *ssam_node_group_sp7[] = {
+ 	NULL,
+ };
+ 
++static const struct software_node *ssam_node_group_sp8[] = {
++	&ssam_node_root,
++	&ssam_node_hub_kip,
++	&ssam_node_bat_ac,
++	&ssam_node_bat_main,
++	&ssam_node_tmp_pprof,
++	&ssam_node_kip_tablet_switch,
++	&ssam_node_hid_kip_keyboard,
++	&ssam_node_hid_kip_penstash,
++	&ssam_node_hid_kip_touchpad,
++	&ssam_node_hid_kip_iid5,
++	NULL,
++};
++
+ 
+ /* -- Device registry helper functions. ------------------------------------- */
+ 
+@@ -714,6 +764,9 @@ static const struct acpi_device_id ssam_platform_hub_match[] = {
+ 	/* Surface Pro 7+ */
+ 	{ "MSHW0119", (unsigned long)ssam_node_group_sp7 },
+ 
++	/* Surface Pro 8 */
++	{ "MSHW0263", (unsigned long)ssam_node_group_sp8 },
++
+ 	/* Surface Book 2 */
+ 	{ "MSHW0107", (unsigned long)ssam_node_group_gen5 },
+ 
+-- 
+2.33.1
+

+ 4 - 4
patches/5.14/0006-surface-sam-over-hid.patch

@@ -1,4 +1,4 @@
-From aec014a884605855194d7ddc50d23c6537c13f3c Mon Sep 17 00:00:00 2001
+From bc1127876d58b4d22d85bf8e2d20aadda7acb2c4 Mon Sep 17 00:00:00 2001
 From: Maximilian Luz <luzmaximilian@gmail.com>
 Date: Sat, 25 Jul 2020 17:19:53 +0200
 Subject: [PATCH] i2c: acpi: Implement RawBytes read access
@@ -110,7 +110,7 @@ index 74925621f239..169713964358 100644
 -- 
 2.33.1
 
-From 44fe41f42023aed716403f247947e4c9397dd8b6 Mon Sep 17 00:00:00 2001
+From ad156d5fe3a60a24d14e5c1e0256e0706f374234 Mon Sep 17 00:00:00 2001
 From: Maximilian Luz <luzmaximilian@gmail.com>
 Date: Sat, 13 Feb 2021 16:41:18 +0100
 Subject: [PATCH] platform/surface: Add driver for Surface Book 1 dGPU switch
@@ -133,7 +133,7 @@ Patchset: surface-sam-over-hid
  create mode 100644 drivers/platform/surface/surfacebook1_dgpu_switch.c
 
 diff --git a/drivers/platform/surface/Kconfig b/drivers/platform/surface/Kconfig
-index 3105f651614f..53beaedefdd1 100644
+index 133ebb84bd2d..3fe7f14e00d9 100644
 --- a/drivers/platform/surface/Kconfig
 +++ b/drivers/platform/surface/Kconfig
 @@ -104,6 +104,13 @@ config SURFACE_AGGREGATOR_REGISTRY
@@ -151,7 +151,7 @@ index 3105f651614f..53beaedefdd1 100644
  	tristate "Surface DTX (Detachment System) Driver"
  	depends on SURFACE_AGGREGATOR
 diff --git a/drivers/platform/surface/Makefile b/drivers/platform/surface/Makefile
-index 32889482de55..0cc63440328d 100644
+index 6d9291c993c4..9eb3a7e6382c 100644
 --- a/drivers/platform/surface/Makefile
 +++ b/drivers/platform/surface/Makefile
 @@ -11,6 +11,7 @@ obj-$(CONFIG_SURFACE_ACPI_NOTIFY)	+= surface_acpi_notify.o

+ 2 - 2
patches/5.14/0007-surface-gpe.patch

@@ -1,4 +1,4 @@
-From 9195131f09011fad4734431a6db63c84350b02c2 Mon Sep 17 00:00:00 2001
+From c1a09197036ae5ef0ec93fda371a4aafa34aef1f Mon Sep 17 00:00:00 2001
 From: Maximilian Luz <luzmaximilian@gmail.com>
 Date: Sun, 10 Oct 2021 00:02:44 +0200
 Subject: [PATCH] platform/surface: gpe: Add support for Surface Laptop Studio
@@ -46,7 +46,7 @@ index 86f6991b1215..c1775db29efb 100644
 -- 
 2.33.1
 
-From 1c5316d1b388b300aca9806ad998e54858757140 Mon Sep 17 00:00:00 2001
+From ab6d48c467d64e71b3b468ac7ae97215706fbea2 Mon Sep 17 00:00:00 2001
 From: Maximilian Luz <luzmaximilian@gmail.com>
 Date: Wed, 27 Oct 2021 00:56:11 +0200
 Subject: [PATCH] platform/surface: gpe: Add support for Surface Pro 8

+ 2 - 2
patches/5.14/0008-surface-button.patch

@@ -1,4 +1,4 @@
-From f9bd511dc3469fbda058e1ef2b21494b872a01dd Mon Sep 17 00:00:00 2001
+From 71c683d6e205d59883721b54e4684b00f1de4145 Mon Sep 17 00:00:00 2001
 From: Sachi King <nakato@nakato.io>
 Date: Tue, 5 Oct 2021 00:05:09 +1100
 Subject: [PATCH] Input: soc_button_array - support AMD variant Surface devices
@@ -75,7 +75,7 @@ index cb6ec59a045d..4e8944f59def 100644
 -- 
 2.33.1
 
-From 6a18cab1a230d9afe68ad3c8cb97fbe7e32aa8e5 Mon Sep 17 00:00:00 2001
+From caa43c419877598b00cd65008cde2965ae7a01c8 Mon Sep 17 00:00:00 2001
 From: Sachi King <nakato@nakato.io>
 Date: Tue, 5 Oct 2021 00:22:57 +1100
 Subject: [PATCH] platform/surface: surfacepro3_button: don't load on amd

+ 1 - 1
patches/5.14/0009-surface-typecover.patch

@@ -1,4 +1,4 @@
-From 32ae6b9a94c0bd0f76969c66d5e8df30f630a2df Mon Sep 17 00:00:00 2001
+From fe1d02eee7e1377de3b3e68a3acdf002365ff6ff Mon Sep 17 00:00:00 2001
 From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= <verdre@v0yd.nl>
 Date: Thu, 5 Nov 2020 13:09:45 +0100
 Subject: [PATCH] hid/multitouch: Turn off Type Cover keyboard backlight when

+ 35 - 35
patches/5.14/0010-cameras.patch

@@ -1,4 +1,4 @@
-From 5f9ae359c03aa20563a4b911715b5948d1787d90 Mon Sep 17 00:00:00 2001
+From 4352a215b5d1b131535e20f4edc2eaf0a4a42a98 Mon Sep 17 00:00:00 2001
 From: Daniel Scally <djrscally@gmail.com>
 Date: Mon, 5 Apr 2021 23:56:53 +0100
 Subject: [PATCH] media: ipu3-cio2: Toggle sensor streaming in pm runtime ops
@@ -58,7 +58,7 @@ index 47db0ee0fcbf..7bb86e246ebe 100644
 -- 
 2.33.1
 
-From f3aeecca5092b89384255a9eb48ce82cc8e65021 Mon Sep 17 00:00:00 2001
+From 582f4eab7810c531da2814d13a18533f0efe1e28 Mon Sep 17 00:00:00 2001
 From: Daniel Scally <djrscally@gmail.com>
 Date: Mon, 5 Apr 2021 23:56:54 +0100
 Subject: [PATCH] media: i2c: Add support for ov5693 sensor
@@ -1701,7 +1701,7 @@ index 000000000000..9499ee10f56c
 -- 
 2.33.1
 
-From e8f847b28355a22e8e26c32eff85e292b046bc03 Mon Sep 17 00:00:00 2001
+From 0155b5faba94edf41ea0d671d82800554f9e836e Mon Sep 17 00:00:00 2001
 From: =?UTF-8?q?Fabian=20W=C3=BCthrich?= <me@fabwu.ch>
 Date: Fri, 22 Jan 2021 20:58:13 +0100
 Subject: [PATCH] cio2-bridge: Parse sensor orientation and rotation
@@ -1864,7 +1864,7 @@ index dd0ffcafa489..924d99d20328 100644
 -- 
 2.33.1
 
-From 0f7a8adbb3f750bf47b8004289a366551c56ea52 Mon Sep 17 00:00:00 2001
+From 25757594297e22f586b83c7f8646486b525e0ea7 Mon Sep 17 00:00:00 2001
 From: =?UTF-8?q?Fabian=20W=C3=BCthrich?= <me@fabwu.ch>
 Date: Sun, 24 Jan 2021 11:07:42 +0100
 Subject: [PATCH] cio2-bridge: Use macros and add warnings
@@ -1968,7 +1968,7 @@ index 924d99d20328..e1e388cc9f45 100644
 -- 
 2.33.1
 
-From b284187b06f1f472abb53d58aa48e1037e05f958 Mon Sep 17 00:00:00 2001
+From cc12d2e64386041436fb596336eb0542dd489c14 Mon Sep 17 00:00:00 2001
 From: =?UTF-8?q?Fabian=20W=C3=BCthrich?= <me@fabwu.ch>
 Date: Thu, 6 May 2021 07:52:44 +0200
 Subject: [PATCH] cio2-bridge: Use correct dev_properties size
@@ -1994,7 +1994,7 @@ index e1e388cc9f45..deaf5804f70d 100644
 -- 
 2.33.1
 
-From fcdc54e85381bc02b765c50a729656c3e4c844cb Mon Sep 17 00:00:00 2001
+From 16aeaa92ffa4a2965c3dee9a6817508e95436bc1 Mon Sep 17 00:00:00 2001
 From: Daniel Scally <djrscally@gmail.com>
 Date: Thu, 20 May 2021 23:31:04 +0100
 Subject: [PATCH] media: i2c: Fix vertical flip in ov5693
@@ -2029,7 +2029,7 @@ index 9499ee10f56c..c558f9b48c83 100644
 -- 
 2.33.1
 
-From 58d07597d34f7a026a032e4799ff1744b728c7c8 Mon Sep 17 00:00:00 2001
+From 2071456a45457337277dc0956dd2cfc6061f98f7 Mon Sep 17 00:00:00 2001
 From: Daniel Scally <djrscally@gmail.com>
 Date: Fri, 9 Jul 2021 16:39:18 +0100
 Subject: [PATCH] media: i2c: Add ACPI support to ov8865
@@ -2080,7 +2080,7 @@ index ce50f3ea87b8..7626c8608f8f 100644
 -- 
 2.33.1
 
-From 8074c45d00d0e8fb8689d3d7556cb4091dc28bd9 Mon Sep 17 00:00:00 2001
+From 688d67c5535b79ce22df18d2b4ac26878e67bedb Mon Sep 17 00:00:00 2001
 From: Daniel Scally <djrscally@gmail.com>
 Date: Sat, 10 Jul 2021 21:20:17 +0100
 Subject: [PATCH] media: i2c: Fix incorrect value in comment
@@ -2111,7 +2111,7 @@ index 7626c8608f8f..8e3f8a554452 100644
 -- 
 2.33.1
 
-From 9fa6d8e07c78ad0f3ea2b39eaef40ab92af85bad Mon Sep 17 00:00:00 2001
+From 9968f4ba4dd81c0ad70d43b878dd8d8ae5c533b9 Mon Sep 17 00:00:00 2001
 From: Daniel Scally <djrscally@gmail.com>
 Date: Sat, 10 Jul 2021 22:21:52 +0100
 Subject: [PATCH] media: i2c: Defer probe if not endpoint found
@@ -2148,7 +2148,7 @@ index 8e3f8a554452..9bc8d5d8199b 100644
 -- 
 2.33.1
 
-From e6e0c9c51eeac9c9d6caecf7b5819e6dafb03885 Mon Sep 17 00:00:00 2001
+From cc72b39e219ea6e706f04d40ad07a157eaeebe2d Mon Sep 17 00:00:00 2001
 From: Daniel Scally <djrscally@gmail.com>
 Date: Sat, 10 Jul 2021 22:00:25 +0100
 Subject: [PATCH] media: i2c: Support 19.2MHz input clock in ov8865
@@ -2507,7 +2507,7 @@ index 9bc8d5d8199b..4ddc1b277cc0 100644
 -- 
 2.33.1
 
-From e2475b63ceaab19f1e2b9092c3abefd933b140c9 Mon Sep 17 00:00:00 2001
+From 929fbc89160aed4998382a642ecc1e9811c512b4 Mon Sep 17 00:00:00 2001
 From: Daniel Scally <djrscally@gmail.com>
 Date: Sat, 10 Jul 2021 22:19:10 +0100
 Subject: [PATCH] media: i2c: Add .get_selection() support to ov8865
@@ -2612,7 +2612,7 @@ index 4ddc1b277cc0..0f2776390a8e 100644
 -- 
 2.33.1
 
-From ce8ca98a4c3e81c3952d22a6fd22c01eeb450815 Mon Sep 17 00:00:00 2001
+From 56cb0b0be2353a71d9928614c23256ed2873f973 Mon Sep 17 00:00:00 2001
 From: Daniel Scally <djrscally@gmail.com>
 Date: Sat, 10 Jul 2021 22:34:43 +0100
 Subject: [PATCH] media: i2c: Switch control to V4L2_CID_ANALOGUE_GAIN
@@ -2665,7 +2665,7 @@ index 0f2776390a8e..a832938c33b6 100644
 -- 
 2.33.1
 
-From 09cfff77db6e3f2131acf00be6116b43d4d1eb0d Mon Sep 17 00:00:00 2001
+From 6621e664b96fb62971f6181386e8327c3a9422f7 Mon Sep 17 00:00:00 2001
 From: Daniel Scally <djrscally@gmail.com>
 Date: Mon, 12 Jul 2021 22:54:56 +0100
 Subject: [PATCH] media: i2c: Add vblank control to ov8865
@@ -2775,7 +2775,7 @@ index a832938c33b6..f741c0713ca4 100644
 -- 
 2.33.1
 
-From c073b4c010146a85c44533dac3e8e1dea0fc5ad4 Mon Sep 17 00:00:00 2001
+From b989f9454f9e6f38ad0ab04deb564fdaf1ff7509 Mon Sep 17 00:00:00 2001
 From: Daniel Scally <djrscally@gmail.com>
 Date: Tue, 13 Jul 2021 23:40:33 +0100
 Subject: [PATCH] media: i2c: Add hblank control to ov8865
@@ -2845,7 +2845,7 @@ index f741c0713ca4..4b18cc80f985 100644
 -- 
 2.33.1
 
-From 8e28b45790495280ee24c11e2faa08ba120ed29f Mon Sep 17 00:00:00 2001
+From c9c89f9dd50ef714692278841ebf11a38de527cb Mon Sep 17 00:00:00 2001
 From: Daniel Scally <djrscally@gmail.com>
 Date: Wed, 20 Oct 2021 22:43:54 +0100
 Subject: [PATCH] media: i2c: Update HTS values in ov8865
@@ -3021,7 +3021,7 @@ index 4b18cc80f985..1b8674152750 100644
 -- 
 2.33.1
 
-From 68dddf4d236c636adcf2ae73a9767b6893d1c52f Mon Sep 17 00:00:00 2001
+From 67bdb92ce85b7b83a37882490d0f77b580d396e6 Mon Sep 17 00:00:00 2001
 From: Daniel Scally <djrscally@gmail.com>
 Date: Tue, 13 Jul 2021 23:43:17 +0100
 Subject: [PATCH] media: i2c: cap exposure at height + vblank in ov8865
@@ -3104,7 +3104,7 @@ index 1b8674152750..99548ad15dcd 100644
 -- 
 2.33.1
 
-From bea0858391d47c156b60dd9661231f96d1afec19 Mon Sep 17 00:00:00 2001
+From 37a3e3adbbab2e7d3d7a0670e6595e54f10f0ca4 Mon Sep 17 00:00:00 2001
 From: Daniel Scally <djrscally@gmail.com>
 Date: Fri, 16 Jul 2021 22:56:15 +0100
 Subject: [PATCH] media: i2c: Add controls from fwnode to ov8865
@@ -3149,7 +3149,7 @@ index 99548ad15dcd..dfb5095ef16b 100644
 -- 
 2.33.1
 
-From 209125bbd208e5f07660f3c65e297268682409fa Mon Sep 17 00:00:00 2001
+From 9a955621db26aef7bbab825e4392af7593f91970 Mon Sep 17 00:00:00 2001
 From: Daniel Scally <djrscally@gmail.com>
 Date: Fri, 16 Jul 2021 00:00:54 +0100
 Subject: [PATCH] media: i2c: Switch exposure control unit to lines
@@ -3196,7 +3196,7 @@ index dfb5095ef16b..5f19d82554df 100644
 -- 
 2.33.1
 
-From 566ba771fd2b85070d1a28c16ad0e834d0e7ba20 Mon Sep 17 00:00:00 2001
+From d5dbf718bcf42a16542b3f46d392f04d2e6c2032 Mon Sep 17 00:00:00 2001
 From: Daniel Scally <djrscally@gmail.com>
 Date: Tue, 24 Aug 2021 22:39:02 +0100
 Subject: [PATCH] media: i2c: Re-order runtime pm initialisation
@@ -3232,7 +3232,7 @@ index 5f19d82554df..18b5f1e8e9a7 100644
 -- 
 2.33.1
 
-From e771d413a2892c07b576b2967edcefa820269d9b Mon Sep 17 00:00:00 2001
+From 16eb1b76b4715f8dfb0d8dcd83ea32d164ab5ab7 Mon Sep 17 00:00:00 2001
 From: Daniel Scally <djrscally@gmail.com>
 Date: Tue, 24 Aug 2021 23:17:39 +0100
 Subject: [PATCH] media: i2c: Use dev_err_probe() in ov8865
@@ -3315,7 +3315,7 @@ index 18b5f1e8e9a7..19e6bebf340d 100644
 -- 
 2.33.1
 
-From 862668e9e6feedfcefe5a51a17da42529d847621 Mon Sep 17 00:00:00 2001
+From 8c076d4726ce349959ef761da54826bf92330268 Mon Sep 17 00:00:00 2001
 From: Daniel Scally <djrscally@gmail.com>
 Date: Wed, 14 Jul 2021 00:05:04 +0100
 Subject: [PATCH] media: ipu3-cio2: Add INT347A to cio2-bridge
@@ -3348,7 +3348,7 @@ index 7e582135dfb8..0132f0bd9b41 100644
 -- 
 2.33.1
 
-From d6e8bc9451c581e73f17db5eed00f982353c2723 Mon Sep 17 00:00:00 2001
+From d522a51f9cfe6f13e6275081d99f8598d792cb5f Mon Sep 17 00:00:00 2001
 From: Hans de Goede <hdegoede@redhat.com>
 Date: Thu, 7 Oct 2021 15:34:52 +0200
 Subject: [PATCH] media: i2c: ov8865: Fix lockdep error
@@ -3394,7 +3394,7 @@ index 19e6bebf340d..d5af8aedf5e8 100644
 -- 
 2.33.1
 
-From 9f35a2c4946516acb37212b9b4bdc71c2fa761dc Mon Sep 17 00:00:00 2001
+From 4923e2aa1a3c301ebdd3f0fb33f86840ce87418e Mon Sep 17 00:00:00 2001
 From: Hans de Goede <hdegoede@redhat.com>
 Date: Sun, 10 Oct 2021 20:56:57 +0200
 Subject: [PATCH] ACPI: delay enumeration of devices with a _DEP pointing to an
@@ -3577,7 +3577,7 @@ index 13d93371790e..2da53b7b4965 100644
 -- 
 2.33.1
 
-From 4380dab5d9e986ee0b80412e481315c862f7fa25 Mon Sep 17 00:00:00 2001
+From 98381f25560a7fe3f34f6ed8d1b4689f2418d026 Mon Sep 17 00:00:00 2001
 From: Hans de Goede <hdegoede@redhat.com>
 Date: Sun, 10 Oct 2021 20:56:58 +0200
 Subject: [PATCH] i2c: acpi: Use acpi_dev_ready_for_enumeration() helper
@@ -3629,7 +3629,7 @@ index 169713964358..9f0e719cd2c8 100644
 -- 
 2.33.1
 
-From 97aee8e13cd124b7736f1b53e6e96881ac55f84c Mon Sep 17 00:00:00 2001
+From 8d1d46410ca2e3a311387d8307b9bff8610d7e02 Mon Sep 17 00:00:00 2001
 From: Hans de Goede <hdegoede@redhat.com>
 Date: Sun, 10 Oct 2021 20:56:59 +0200
 Subject: [PATCH] platform_data: Add linux/platform_data/tps68470.h file
@@ -3702,7 +3702,7 @@ index 000000000000..126d082c3f2e
 -- 
 2.33.1
 
-From 313394c42ef2b3e91a4064241c6f58c4bd9776ae Mon Sep 17 00:00:00 2001
+From c41dafea89e4f00f99cf0b1fcf1b4cd43f0879d7 Mon Sep 17 00:00:00 2001
 From: Hans de Goede <hdegoede@redhat.com>
 Date: Sun, 10 Oct 2021 20:57:00 +0200
 Subject: [PATCH] regulator: Introduce tps68470-regulator driver
@@ -3964,7 +3964,7 @@ index 000000000000..3129fa13a122
 -- 
 2.33.1
 
-From 181225a6450777154be1b438d703195721f50aae Mon Sep 17 00:00:00 2001
+From 83625fe7c08bfdd63c688d2300e7e9ea47710639 Mon Sep 17 00:00:00 2001
 From: Hans de Goede <hdegoede@redhat.com>
 Date: Sun, 10 Oct 2021 20:57:01 +0200
 Subject: [PATCH] clk: Introduce clk-tps68470 driver
@@ -4309,7 +4309,7 @@ index ffe81127d91c..7807fa329db0 100644
 -- 
 2.33.1
 
-From ec50764e4b37f60008115a72663d2363cd983d0b Mon Sep 17 00:00:00 2001
+From 71e9c4b05e790f94f3bad8e6b6f737235a8185a4 Mon Sep 17 00:00:00 2001
 From: Daniel Scally <djrscally@gmail.com>
 Date: Sun, 10 Oct 2021 20:57:02 +0200
 Subject: [PATCH] platform/x86: int3472: Enable I2c daisy chain
@@ -4346,7 +4346,7 @@ index c05b4cf502fe..42e688f4cad4 100644
 -- 
 2.33.1
 
-From eb388fbf65f46e896f04075b223c6a07a1cd00b7 Mon Sep 17 00:00:00 2001
+From ac71d936ec0f5c42dc17a84d050dc28bcdca6f1c Mon Sep 17 00:00:00 2001
 From: Hans de Goede <hdegoede@redhat.com>
 Date: Sun, 10 Oct 2021 20:57:03 +0200
 Subject: [PATCH] platform/x86: int3472: Split into 2 drivers
@@ -4605,7 +4605,7 @@ index 42e688f4cad4..b94cf66ab61f 100644
 -- 
 2.33.1
 
-From d821fc0e552317e1adc05035a95b2c7ad646f1b6 Mon Sep 17 00:00:00 2001
+From 3ce790f76e65049a3bd360de9c5e16e9258ecdac Mon Sep 17 00:00:00 2001
 From: Hans de Goede <hdegoede@redhat.com>
 Date: Sun, 10 Oct 2021 20:57:04 +0200
 Subject: [PATCH] platform/x86: int3472: Add get_sensor_adev_and_name() helper
@@ -4718,7 +4718,7 @@ index 856602a2f6bb..22a4894f1cc7 100644
 -- 
 2.33.1
 
-From 918b0938a49bc4bbda3908f71025aa7864dda093 Mon Sep 17 00:00:00 2001
+From 97ffec7782c6412b62b12ad1dfa624597000db85 Mon Sep 17 00:00:00 2001
 From: Hans de Goede <hdegoede@redhat.com>
 Date: Sun, 10 Oct 2021 20:57:05 +0200
 Subject: [PATCH] platform/x86: int3472: Pass tps68470_clk_platform_data to the
@@ -4806,7 +4806,7 @@ index b94cf66ab61f..78e34e7b6969 100644
 -- 
 2.33.1
 
-From fbb8fa4c4878ecf198146c36461105c0ab408edf Mon Sep 17 00:00:00 2001
+From 953280a290178f264e99d8c1fe94ebd681c5beb6 Mon Sep 17 00:00:00 2001
 From: Hans de Goede <hdegoede@redhat.com>
 Date: Sun, 10 Oct 2021 20:57:06 +0200
 Subject: [PATCH] platform/x86: int3472: Pass tps68470_regulator_platform_data
@@ -5100,7 +5100,7 @@ index 000000000000..96954a789bb8
 -- 
 2.33.1
 
-From 9bc7fde514ecc4713e35e2538db6a85abe699442 Mon Sep 17 00:00:00 2001
+From a64bb2d82c2bd1f4d7b150d5a7acd9ed1dbf7a8c Mon Sep 17 00:00:00 2001
 From: Hans de Goede <hdegoede@redhat.com>
 Date: Sun, 10 Oct 2021 20:57:07 +0200
 Subject: [PATCH] platform/x86: int3472: Deal with probe ordering issues
@@ -5184,7 +5184,7 @@ index aae24d228770..21c6c1a6edfc 100644
 -- 
 2.33.1
 
-From b67efc1ae2f98b5876a2e34764de631a8092ddf8 Mon Sep 17 00:00:00 2001
+From 0f54cfac84528f20cbb57b6c0b4340e65566fc4d Mon Sep 17 00:00:00 2001
 From: Daniel Scally <djrscally@gmail.com>
 Date: Thu, 22 Jul 2021 00:20:46 +0100
 Subject: [PATCH] Revert "media: device property: Call
@@ -5226,7 +5226,7 @@ index d0874f6c29bb..4d7ff55df95d 100644
 -- 
 2.33.1
 
-From 60ea601e05c037321c99cbbeb06a4afb8d3cd76a Mon Sep 17 00:00:00 2001
+From 951f102ad80ca5dfe0d3cfdd3936e1104b4aecbc Mon Sep 17 00:00:00 2001
 From: Daniel Scally <djrscally@gmail.com>
 Date: Sun, 18 Jul 2021 23:52:42 +0100
 Subject: [PATCH] device property: Check fwnode->secondary in

+ 5 - 5
patches/5.14/0011-amd-gpio.patch

@@ -1,4 +1,4 @@
-From 154f225730fa656f3c9a8b730daa794dda0e4f1c Mon Sep 17 00:00:00 2001
+From db59de04463e7daf9db5d6a94ecade027c386bf5 Mon Sep 17 00:00:00 2001
 From: Sachi King <nakato@nakato.io>
 Date: Sat, 29 May 2021 17:47:38 +1000
 Subject: [PATCH] ACPI: Add quirk for Surface Laptop 4 AMD missing irq 7
@@ -65,7 +65,7 @@ index e55e0c1fad8c..46dfad41b401 100644
 -- 
 2.33.1
 
-From 9f98d74f40145b77432ecb5d60d71543e76fdf95 Mon Sep 17 00:00:00 2001
+From f36c217ee9cf09a3eeb0c4c869823fe4abe53c87 Mon Sep 17 00:00:00 2001
 From: Maximilian Luz <luzmaximilian@gmail.com>
 Date: Thu, 3 Jun 2021 14:04:26 +0200
 Subject: [PATCH] ACPI: Add AMD 13" Surface Laptop 4 model to irq 7 override
@@ -107,7 +107,7 @@ index 46dfad41b401..78bf6a097dc5 100644
 -- 
 2.33.1
 
-From 21d29f6145b07abe2349c21743e86224c9b02f6a Mon Sep 17 00:00:00 2001
+From fa0275eafbc5171767f6bc3fd9ca2dba2940ccc6 Mon Sep 17 00:00:00 2001
 From: Basavaraj Natikar <Basavaraj.Natikar@amd.com>
 Date: Tue, 31 Aug 2021 17:36:12 +0530
 Subject: [PATCH] pinctrl: amd: Add irq field data
@@ -173,7 +173,7 @@ index 95e763424042..1d4317073654 100644
 -- 
 2.33.1
 
-From bf963c61e066577dcc919412213d567dbefc0ce6 Mon Sep 17 00:00:00 2001
+From d1b2d9b220465e1f8abb62f07f461b1c2374d66b Mon Sep 17 00:00:00 2001
 From: Basavaraj Natikar <Basavaraj.Natikar@amd.com>
 Date: Tue, 31 Aug 2021 17:36:13 +0530
 Subject: [PATCH] pinctrl: amd: Handle wake-up interrupt
@@ -220,7 +220,7 @@ index 79b8b7f91996..d19974aceb2e 100644
 -- 
 2.33.1
 
-From 008e9417adc0d715401c8c070a7904a169d908d9 Mon Sep 17 00:00:00 2001
+From f429b5104b297a4b817df233dc77665c48c31184 Mon Sep 17 00:00:00 2001
 From: Sachi King <nakato@nakato.io>
 Date: Fri, 1 Oct 2021 21:19:09 +1000
 Subject: [PATCH] pinctrl: amd: disable and mask interrupts on probe

+ 8 - 8
pkg/arch/kernel/PKGBUILD

@@ -46,19 +46,19 @@ validpgpkeys=(
 )
 sha256sums=('SKIP'
             'f98065a286a6d2dbb0e226867a6417e344aaa44ef6eac967707e1f09671be445'
-            '252c7a78ffb1efe9751aabc93cc79031ef69dbc95baa7970cbaabcd5474fe7d8'
+            '63e0aa01e590c789a2a312f48cdc467b29734465cdf87e206b7a7e0f82e22bc4'
             'b30cd71018df7e98101ba0cf37054169006b096d2870a9f8467dd96378b02b98'
             '3fa38ff5b5f74b717fb1112b3822ef7c34335ca39d544fd9827708013a13841f'
             '332d8f16ebf01e297bba2353a952cbf759f766e8fb285eba05591798475bc7c7'
             '77364719c3ae38d628c07a1f73fe43288d8d08f205f687179e3b32d5cf09b23e'
             'c14028323060e022ec262c3578c14d6befdfd9a7150f0c8fc913f95f88424a2e'
-            'ff59e1b9702989070def6b668a9c84d5243c48c0a2694be7cf3be865546577ec'
-            'ae538e9bdc19179b42c581ed97bab2066bb0934c25da67cd5ec370d3a1e140c2'
-            '9ea20c45e0b3674160b497dd005595eb4d2c49add087cceca9bf2047a535d0c4'
-            'fd89e81b1eef50e0cea4429f0e943c426c77376b3c7e72f21794f1b39b5c8bbc'
-            'c8a01e8942ed5041bb9c188e26e7ea53aad0f08944ef427574be89aa23e23593'
-            '65bbf6d95979784cb7b43953f178ddeea91accb0f0b458f75348b55df89eba88'
-            '30e796de836f6fac7a87806ece5808f72e3b7d56ecefa58541e30e0537c7741c')
+            '82d26d00a1425fb4f9da8ca0e489eed87399329b7bdac9d571ab27fc4c80fb09'
+            '4327c9d55bdcc2a70d096916f879f67373ad1145b466523392e39b256f803cb1'
+            '73676de16536f1bdb07049e500775ec16cf6983db0b8f82f9671d7a170791109'
+            '83789baef33e36e3e67516ddc7880e568e01d306db261ae16b56aabb18640406'
+            'ef9866fd7f9119b9722e598b0c57c3361ff648e1163a5ce987b5b89a2c7e7ef6'
+            '2fca60f3dba19b8c135d12699f59e52845511b6aa902c7edc3df73504abe4732'
+            '55eadb276875103d22f86bdf969949be8c6a429d7a07c5efea4a4d901e060335')
 
 
 export KBUILD_BUILD_HOST=archlinux