HID: i2c-hid: Make suspend and resume into helper functions
authorDouglas Anderson <dianders@chromium.org>
Thu, 27 Jul 2023 17:16:34 +0000 (10:16 -0700)
committerDouglas Anderson <dianders@chromium.org>
Tue, 1 Aug 2023 14:40:19 +0000 (07:40 -0700)
In a future patch we'd like to be able to call the current i2c-hid
suspend and resume functions from times other than system
suspend. Move the functions higher up in the file and have them take a
"struct i2c_hid" to make this simpler. We'll then add tiny wrappers of
the functions for use with system suspend.

This change is expected to have no functional effect.

Reviewed-by: Maxime Ripard <mripard@kernel.org>
Reviewed-by: Benjamin Tissoires <bentiss@kernel.org>
Acked-by: Benjamin Tissoires <bentiss@kernel.org>
Signed-off-by: Douglas Anderson <dianders@chromium.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20230727101636.v4.7.I5c9894789b8b02f029bf266ae9b4f43c7907a173@changeid
drivers/hid/i2c-hid/i2c-hid-core.c

index d29e642..fa8a1ca 100644 (file)
@@ -941,6 +941,57 @@ static void i2c_hid_core_shutdown_tail(struct i2c_hid *ihid)
        ihid->ops->shutdown_tail(ihid->ops);
 }
 
+static int i2c_hid_core_suspend(struct i2c_hid *ihid)
+{
+       struct i2c_client *client = ihid->client;
+       struct hid_device *hid = ihid->hid;
+       int ret;
+
+       ret = hid_driver_suspend(hid, PMSG_SUSPEND);
+       if (ret < 0)
+               return ret;
+
+       /* Save some power */
+       i2c_hid_set_power(ihid, I2C_HID_PWR_SLEEP);
+
+       disable_irq(client->irq);
+
+       if (!device_may_wakeup(&client->dev))
+               i2c_hid_core_power_down(ihid);
+
+       return 0;
+}
+
+static int i2c_hid_core_resume(struct i2c_hid *ihid)
+{
+       struct i2c_client *client = ihid->client;
+       struct hid_device *hid = ihid->hid;
+       int ret;
+
+       if (!device_may_wakeup(&client->dev))
+               i2c_hid_core_power_up(ihid);
+
+       enable_irq(client->irq);
+
+       /* Instead of resetting device, simply powers the device on. This
+        * solves "incomplete reports" on Raydium devices 2386:3118 and
+        * 2386:4B33 and fixes various SIS touchscreens no longer sending
+        * data after a suspend/resume.
+        *
+        * However some ALPS touchpads generate IRQ storm without reset, so
+        * let's still reset them here.
+        */
+       if (ihid->quirks & I2C_HID_QUIRK_RESET_ON_RESUME)
+               ret = i2c_hid_hwreset(ihid);
+       else
+               ret = i2c_hid_set_power(ihid, I2C_HID_PWR_ON);
+
+       if (ret)
+               return ret;
+
+       return hid_driver_reset_resume(hid);
+}
+
 /**
  * i2c_hid_core_initial_power_up() - First time power up of the i2c-hid device.
  * @ihid: The ihid object created during probe.
@@ -1115,61 +1166,24 @@ void i2c_hid_core_shutdown(struct i2c_client *client)
 }
 EXPORT_SYMBOL_GPL(i2c_hid_core_shutdown);
 
-static int i2c_hid_core_suspend(struct device *dev)
+static int i2c_hid_core_pm_suspend(struct device *dev)
 {
        struct i2c_client *client = to_i2c_client(dev);
        struct i2c_hid *ihid = i2c_get_clientdata(client);
-       struct hid_device *hid = ihid->hid;
-       int ret;
-
-       ret = hid_driver_suspend(hid, PMSG_SUSPEND);
-       if (ret < 0)
-               return ret;
 
-       /* Save some power */
-       i2c_hid_set_power(ihid, I2C_HID_PWR_SLEEP);
-
-       disable_irq(client->irq);
-
-       if (!device_may_wakeup(&client->dev))
-               i2c_hid_core_power_down(ihid);
-
-       return 0;
+       return i2c_hid_core_suspend(ihid);
 }
 
-static int i2c_hid_core_resume(struct device *dev)
+static int i2c_hid_core_pm_resume(struct device *dev)
 {
-       int ret;
        struct i2c_client *client = to_i2c_client(dev);
        struct i2c_hid *ihid = i2c_get_clientdata(client);
-       struct hid_device *hid = ihid->hid;
 
-       if (!device_may_wakeup(&client->dev))
-               i2c_hid_core_power_up(ihid);
-
-       enable_irq(client->irq);
-
-       /* Instead of resetting device, simply powers the device on. This
-        * solves "incomplete reports" on Raydium devices 2386:3118 and
-        * 2386:4B33 and fixes various SIS touchscreens no longer sending
-        * data after a suspend/resume.
-        *
-        * However some ALPS touchpads generate IRQ storm without reset, so
-        * let's still reset them here.
-        */
-       if (ihid->quirks & I2C_HID_QUIRK_RESET_ON_RESUME)
-               ret = i2c_hid_hwreset(ihid);
-       else
-               ret = i2c_hid_set_power(ihid, I2C_HID_PWR_ON);
-
-       if (ret)
-               return ret;
-
-       return hid_driver_reset_resume(hid);
+       return i2c_hid_core_resume(ihid);
 }
 
 const struct dev_pm_ops i2c_hid_core_pm = {
-       SYSTEM_SLEEP_PM_OPS(i2c_hid_core_suspend, i2c_hid_core_resume)
+       SYSTEM_SLEEP_PM_OPS(i2c_hid_core_pm_suspend, i2c_hid_core_pm_resume)
 };
 EXPORT_SYMBOL_GPL(i2c_hid_core_pm);