From a8f5ab67b5d449a2624e2de7ddfb264da778ea6c Mon Sep 17 00:00:00 2001 From: svek1 <188786687+svek1@users.noreply.github.com> Date: Wed, 11 Dec 2024 20:46:22 +0100 Subject: [PATCH] fix: allow kscan-composite to wake up device. (#2682) * include kscan.yaml so we can set kscan-composite as a wakeup source * modify enable and disable callback to check for wakeup capabilities of composite and children * disable children wakeup source The disable function is only called when the composite is not an enabled wakeup source. In that case the children should also not be an enabled wakeup source, so they can get suspended --- app/dts/bindings/zmk,kscan-composite.yaml | 2 ++ app/module/drivers/kscan/kscan_composite.c | 15 +++++++++++++++ docs/docs/config/kscan.md | 11 ++++++----- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/app/dts/bindings/zmk,kscan-composite.yaml b/app/dts/bindings/zmk,kscan-composite.yaml index ea6cc41619e..2600eab7be6 100644 --- a/app/dts/bindings/zmk,kscan-composite.yaml +++ b/app/dts/bindings/zmk,kscan-composite.yaml @@ -3,6 +3,8 @@ description: | compatible: "zmk,kscan-composite" +include: kscan.yaml + properties: label: type: string diff --git a/app/module/drivers/kscan/kscan_composite.c b/app/module/drivers/kscan/kscan_composite.c index 5b809d17211..18d957ec341 100644 --- a/app/module/drivers/kscan/kscan_composite.c +++ b/app/module/drivers/kscan/kscan_composite.c @@ -44,6 +44,13 @@ static int kscan_composite_enable_callback(const struct device *dev) { for (int i = 0; i < cfg->children_len; i++) { const struct kscan_composite_child_config *child_cfg = &cfg->children[i]; +#if IS_ENABLED(CONFIG_PM_DEVICE_RUNTIME) || IS_ENABLED(CONFIG_PM_DEVICE) + if (pm_device_wakeup_is_enabled(dev) && pm_device_wakeup_is_capable(child_cfg->child) && + !pm_device_wakeup_enable(child_cfg->child, true)) { + LOG_ERR("Failed to enable wakeup for %s", child_cfg->child->name); + } +#endif // IS_ENABLED(CONFIG_PM_DEVICE_RUNTIME) || IS_ENABLED(CONFIG_PM_DEVICE) + #if IS_ENABLED(CONFIG_PM_DEVICE_RUNTIME) if (!pm_device_runtime_is_enabled(dev) && pm_device_runtime_is_enabled(child_cfg->child)) { pm_device_runtime_get(child_cfg->child); @@ -62,6 +69,14 @@ static int kscan_composite_disable_callback(const struct device *dev) { for (int i = 0; i < cfg->children_len; i++) { const struct kscan_composite_child_config *child_cfg = &cfg->children[i]; +#if IS_ENABLED(CONFIG_PM_DEVICE_RUNTIME) || IS_ENABLED(CONFIG_PM_DEVICE) + if (pm_device_wakeup_is_capable(child_cfg->child) && + pm_device_wakeup_is_enabled(child_cfg->child) && + !pm_device_wakeup_enable(child_cfg->child, false)) { + LOG_ERR("Failed to disable wakeup for %s", child_cfg->child->name); + } +#endif // IS_ENABLED(CONFIG_PM_DEVICE_RUNTIME) || IS_ENABLED(CONFIG_PM_DEVICE) + kscan_disable_callback(child_cfg->child); #if IS_ENABLED(CONFIG_PM_DEVICE_RUNTIME) diff --git a/docs/docs/config/kscan.md b/docs/docs/config/kscan.md index 6e9aab02abe..70488e03c5c 100644 --- a/docs/docs/config/kscan.md +++ b/docs/docs/config/kscan.md @@ -223,11 +223,12 @@ Definition file: [zmk/app/dts/bindings/zmk,kscan-composite.yaml](https://github. The `zmk,kscan-composite` node should have one child node per keyboard scan driver that should be composited. Each child node can have the following properties: -| Property | Type | Description | Default | -| ------------ | ------- | ------------------------------------------------------------------------------ | ------- | -| `kscan` | phandle | Label of the kscan driver to include | | -| `row-offset` | int | Shifts row 0 of the included driver to a new row in the composite matrix | 0 | -| `col-offset` | int | Shifts column 0 of the included driver to a new column in the composite matrix | 0 | +| Property | Type | Description | Default | +| --------------- | ------- | ------------------------------------------------------------------------------ | ------- | +| `kscan` | phandle | Label of the kscan driver to include | | +| `row-offset` | int | Shifts row 0 of the included driver to a new row in the composite matrix | 0 | +| `col-offset` | int | Shifts column 0 of the included driver to a new column in the composite matrix | 0 | +| `wakeup-source` | bool | Mark this kscan instance as able to wake the keyboard | n | ### Example Configuration