]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
HID: Intel-thc-hid: Intel-quicki2c: Add power management for touch device
authorEven Xu <even.xu@intel.com>
Mon, 22 Dec 2025 01:41:34 +0000 (09:41 +0800)
committerJiri Kosina <jkosina@suse.com>
Wed, 7 Jan 2026 21:04:37 +0000 (22:04 +0100)
Send POWER_SLEEP command to touch device when system enters into sleep
mode or hibernate mode to save more power; and send POWER_ON command to
take device back when system exits sleep mode.

Signed-off-by: Even Xu <even.xu@intel.com>
Signed-off-by: Jiri Kosina <jkosina@suse.com>
drivers/hid/intel-thc-hid/intel-quicki2c/pci-quicki2c.c

index cfda66ee4895fc1a3b72947a177073c841a2da9c..f178017352ba7251b532f1b34803e3b2cf715135 100644 (file)
@@ -807,6 +807,12 @@ static int quicki2c_suspend(struct device *device)
        if (!qcdev)
                return -ENODEV;
 
+       if (!device_may_wakeup(qcdev->dev)) {
+               ret = quicki2c_set_power(qcdev, HIDI2C_SLEEP);
+               if (ret)
+                       return ret;
+       }
+
        /*
         * As I2C is THC subsystem, no register auto save/restore support,
         * need driver to do that explicitly for every D3 case.
@@ -856,6 +862,9 @@ static int quicki2c_resume(struct device *device)
        if (ret)
                return ret;
 
+       if (!device_may_wakeup(qcdev->dev))
+               return quicki2c_set_power(qcdev, HIDI2C_ON);
+
        return 0;
 }
 
@@ -913,6 +922,9 @@ static int quicki2c_poweroff(struct device *device)
        if (!qcdev)
                return -ENODEV;
 
+       /* Ignore the return value as platform will be poweroff soon */
+       quicki2c_set_power(qcdev, HIDI2C_SLEEP);
+
        ret = thc_interrupt_quiesce(qcdev->thc_hw, true);
        if (ret)
                return ret;
@@ -966,7 +978,7 @@ static int quicki2c_restore(struct device *device)
 
        thc_change_ltr_mode(qcdev->thc_hw, THC_LTR_MODE_ACTIVE);
 
-       return 0;
+       return quicki2c_set_power(qcdev, HIDI2C_ON);
 }
 
 static int quicki2c_runtime_suspend(struct device *device)