From 1027645b8a52ecbb1eb7517c8e3610b3e9bac45f Mon Sep 17 00:00:00 2001 From: Maximilian Luz Date: Wed, 27 Oct 2021 22:49:00 +0200 Subject: [PATCH] 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 --- configs/surface-5.14.config | 1 + patches/5.14/0005-surface-sam.patch | 1667 +++++++++++++++++- patches/5.14/0006-surface-sam-over-hid.patch | 8 +- patches/5.14/0007-surface-gpe.patch | 4 +- patches/5.14/0008-surface-button.patch | 4 +- patches/5.14/0009-surface-typecover.patch | 2 +- patches/5.14/0010-cameras.patch | 70 +- patches/5.14/0011-amd-gpio.patch | 10 +- pkg/arch/kernel/PKGBUILD | 16 +- 9 files changed, 1724 insertions(+), 58 deletions(-) diff --git a/configs/surface-5.14.config b/configs/surface-5.14.config index 00c2915f5..cdf71cce4 100644 --- a/configs/surface-5.14.config +++ b/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 diff --git a/patches/5.14/0005-surface-sam.patch b/patches/5.14/0005-surface-sam.patch index 36d31470d..769f608ba 100644 --- a/patches/5.14/0005-surface-sam.patch +++ b/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 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 +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 +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 + + #include ++#include + + #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 +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 +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 +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 +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 +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 +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 +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 +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 ` + +@@ -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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +Date: Tue, 8 Jun 2021 03:19:20 +0200 +Subject: [PATCH] wip! platform/surface: Add KIP tablet-mode switch + +Signed-off-by: Maximilian Luz +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 ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++#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 ""; ++ } ++} ++ ++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 "); ++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 +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 +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 + diff --git a/patches/5.14/0006-surface-sam-over-hid.patch b/patches/5.14/0006-surface-sam-over-hid.patch index 16cb702d7..a777fb636 100644 --- a/patches/5.14/0006-surface-sam-over-hid.patch +++ b/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 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 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 diff --git a/patches/5.14/0007-surface-gpe.patch b/patches/5.14/0007-surface-gpe.patch index 2a2b0ab18..20e7eacd0 100644 --- a/patches/5.14/0007-surface-gpe.patch +++ b/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 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 Date: Wed, 27 Oct 2021 00:56:11 +0200 Subject: [PATCH] platform/surface: gpe: Add support for Surface Pro 8 diff --git a/patches/5.14/0008-surface-button.patch b/patches/5.14/0008-surface-button.patch index 7c94e83b7..6b1333b72 100644 --- a/patches/5.14/0008-surface-button.patch +++ b/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 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 Date: Tue, 5 Oct 2021 00:22:57 +1100 Subject: [PATCH] platform/surface: surfacepro3_button: don't load on amd diff --git a/patches/5.14/0009-surface-typecover.patch b/patches/5.14/0009-surface-typecover.patch index 7e3f45966..62e11103f 100644 --- a/patches/5.14/0009-surface-typecover.patch +++ b/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?= Date: Thu, 5 Nov 2020 13:09:45 +0100 Subject: [PATCH] hid/multitouch: Turn off Type Cover keyboard backlight when diff --git a/patches/5.14/0010-cameras.patch b/patches/5.14/0010-cameras.patch index 067d7cbc5..e0d2f49d3 100644 --- a/patches/5.14/0010-cameras.patch +++ b/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 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 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?= 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?= 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?= 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 Date: Sun, 18 Jul 2021 23:52:42 +0100 Subject: [PATCH] device property: Check fwnode->secondary in diff --git a/patches/5.14/0011-amd-gpio.patch b/patches/5.14/0011-amd-gpio.patch index 960e10e24..5f13dbbe0 100644 --- a/patches/5.14/0011-amd-gpio.patch +++ b/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 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 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 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 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 Date: Fri, 1 Oct 2021 21:19:09 +1000 Subject: [PATCH] pinctrl: amd: disable and mask interrupts on probe diff --git a/pkg/arch/kernel/PKGBUILD b/pkg/arch/kernel/PKGBUILD index bcca388a4..3e183908c 100644 --- a/pkg/arch/kernel/PKGBUILD +++ b/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