]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
HID: intel-thc-hid: Intel-quickspi: Improve power management for touch devices
authorEven Xu <even.xu@intel.com>
Wed, 18 Mar 2026 03:25:47 +0000 (11:25 +0800)
committerJiri Kosina <jkosina@suse.com>
Fri, 27 Mar 2026 12:30:40 +0000 (13:30 +0100)
Enhance power management with two key improvements:
1. Hibernate support: Send POWER_OFF command when entering hibernate
   mode.
2. Conditional sleep commands: Only send POWER_SLEEP/POWER_ON commands
   during system suspend/resume when the touch device is not configured
   as a wake source, preserving Wake-on-Touch (WoT) functionality. This
   ensures proper power states while maintaining expected wake behavior.

Signed-off-by: Even Xu <even.xu@intel.com>
Tested-by: Rui Zhang <rui1.zhang@intel.com>
Signed-off-by: Jiri Kosina <jkosina@suse.com>
drivers/hid/intel-thc-hid/intel-quickspi/pci-quickspi.c

index ad6bd59963b28874058e6d9ad94d39642824fb6b..4c64994e4215f452da3dbffcaec3edfc352ca63d 100644 (file)
@@ -749,9 +749,11 @@ static int quickspi_suspend(struct device *device)
        if (!qsdev)
                return -ENODEV;
 
-       ret = quickspi_set_power(qsdev, HIDSPI_SLEEP);
-       if (ret)
-               return ret;
+       if (!device_may_wakeup(qsdev->dev)) {
+               ret = quickspi_set_power(qsdev, HIDSPI_SLEEP);
+               if (ret)
+                       return ret;
+       }
 
        ret = thc_interrupt_quiesce(qsdev->thc_hw, true);
        if (ret)
@@ -790,9 +792,8 @@ static int quickspi_resume(struct device *device)
        if (ret)
                return ret;
 
-       ret = quickspi_set_power(qsdev, HIDSPI_ON);
-       if (ret)
-               return ret;
+       if (!device_may_wakeup(qsdev->dev))
+               return quickspi_set_power(qsdev, HIDSPI_ON);
 
        return 0;
 }
@@ -851,6 +852,9 @@ static int quickspi_poweroff(struct device *device)
        if (!qsdev)
                return -ENODEV;
 
+       /* Ignore the return value as platform will be poweroff soon */
+       quickspi_set_power(qsdev, HIDSPI_OFF);
+
        ret = thc_interrupt_quiesce(qsdev->thc_hw, true);
        if (ret)
                return ret;