HID: amd_sfh: Add PM operations in amd_mp2_ops
authorBasavaraj Natikar <Basavaraj.Natikar@amd.com>
Tue, 12 Jul 2022 18:18:31 +0000 (23:48 +0530)
committerJiri Kosina <jkosina@suse.cz>
Thu, 21 Jul 2022 11:43:58 +0000 (13:43 +0200)
Add PM operations as part of amd_mp2_ops structure to support all
AMD SOCs and use wherever applicable.

Signed-off-by: Basavaraj Natikar <Basavaraj.Natikar@amd.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
drivers/hid/amd-sfh-hid/amd_sfh_client.c
drivers/hid/amd-sfh-hid/amd_sfh_common.h
drivers/hid/amd-sfh-hid/amd_sfh_pcie.c

index e9ccdad..b198b56 100644 (file)
@@ -155,6 +155,57 @@ const char *get_sensor_name(int idx)
        }
 }
 
+static void amd_sfh_resume(struct amd_mp2_dev *mp2)
+{
+       struct amdtp_cl_data *cl_data = mp2->cl_data;
+       struct amd_mp2_sensor_info info;
+       int i, status;
+
+       for (i = 0; i < cl_data->num_hid_devices; i++) {
+               if (cl_data->sensor_sts[i] == SENSOR_DISABLED) {
+                       info.period = AMD_SFH_IDLE_LOOP;
+                       info.sensor_idx = cl_data->sensor_idx[i];
+                       info.dma_address = cl_data->sensor_dma_addr[i];
+                       mp2->mp2_ops->start(mp2, info);
+                       status = amd_sfh_wait_for_response
+                                       (mp2, cl_data->sensor_idx[i], SENSOR_ENABLED);
+                       if (status == SENSOR_ENABLED)
+                               cl_data->sensor_sts[i] = SENSOR_ENABLED;
+                       dev_dbg(&mp2->pdev->dev, "resume sid 0x%x (%s) status 0x%x\n",
+                               cl_data->sensor_idx[i], get_sensor_name(cl_data->sensor_idx[i]),
+                               cl_data->sensor_sts[i]);
+               }
+       }
+
+       schedule_delayed_work(&cl_data->work_buffer, msecs_to_jiffies(AMD_SFH_IDLE_LOOP));
+       if (mp2->mp2_ops->clear_intr)
+               mp2->mp2_ops->clear_intr(mp2);
+}
+
+static void amd_sfh_suspend(struct amd_mp2_dev *mp2)
+{
+       struct amdtp_cl_data *cl_data = mp2->cl_data;
+       int i, status;
+
+       for (i = 0; i < cl_data->num_hid_devices; i++) {
+               if (cl_data->sensor_idx[i] != HPD_IDX &&
+                   cl_data->sensor_sts[i] == SENSOR_ENABLED) {
+                       mp2->mp2_ops->stop(mp2, cl_data->sensor_idx[i]);
+                       status = amd_sfh_wait_for_response
+                                       (mp2, cl_data->sensor_idx[i], SENSOR_DISABLED);
+                       if (status != SENSOR_ENABLED)
+                               cl_data->sensor_sts[i] = SENSOR_DISABLED;
+                       dev_dbg(&mp2->pdev->dev, "suspend sid 0x%x (%s) status 0x%x\n",
+                               cl_data->sensor_idx[i], get_sensor_name(cl_data->sensor_idx[i]),
+                               cl_data->sensor_sts[i]);
+               }
+       }
+
+       cancel_delayed_work_sync(&cl_data->work_buffer);
+       if (mp2->mp2_ops->clear_intr)
+               mp2->mp2_ops->clear_intr(mp2);
+}
+
 int amd_sfh_hid_client_init(struct amd_mp2_dev *privdata)
 {
        struct amd_input_data *in_data = &privdata->in_data;
@@ -172,6 +223,9 @@ int amd_sfh_hid_client_init(struct amd_mp2_dev *privdata)
        dev = &privdata->pdev->dev;
        amd_sfh_set_desc_ops(mp2_ops);
 
+       mp2_ops->suspend = amd_sfh_suspend;
+       mp2_ops->resume = amd_sfh_resume;
+
        cl_data->num_hid_devices = amd_mp2_get_sensor_num(privdata, &cl_data->sensor_idx[0]);
 
        INIT_DELAYED_WORK(&cl_data->work, amd_sfh_work);
index d2a72ab..2b45d50 100644 (file)
@@ -54,6 +54,8 @@ struct amd_mp2_ops {
        void (*clear_intr)(struct amd_mp2_dev *privdata);
        int (*init_intr)(struct amd_mp2_dev *privdata);
        int (*discovery_status)(struct amd_mp2_dev *privdata);
+       void (*suspend)(struct amd_mp2_dev *mp2);
+       void (*resume)(struct amd_mp2_dev *mp2);
        int (*get_rep_desc)(int sensor_idx, u8 rep_desc[]);
        u32 (*get_desc_sz)(int sensor_idx, int descriptor_name);
        u8 (*get_feat_rep)(int sensor_idx, int report_id, u8 *feature_report);
index f169b44..be9ac37 100644 (file)
@@ -339,28 +339,8 @@ static int amd_mp2_pci_probe(struct pci_dev *pdev, const struct pci_device_id *i
 static int __maybe_unused amd_mp2_pci_resume(struct device *dev)
 {
        struct amd_mp2_dev *mp2 = dev_get_drvdata(dev);
-       struct amdtp_cl_data *cl_data = mp2->cl_data;
-       struct amd_mp2_sensor_info info;
-       int i, status;
-
-       for (i = 0; i < cl_data->num_hid_devices; i++) {
-               if (cl_data->sensor_sts[i] == SENSOR_DISABLED) {
-                       info.period = AMD_SFH_IDLE_LOOP;
-                       info.sensor_idx = cl_data->sensor_idx[i];
-                       info.dma_address = cl_data->sensor_dma_addr[i];
-                       mp2->mp2_ops->start(mp2, info);
-                       status = amd_sfh_wait_for_response
-                                       (mp2, cl_data->sensor_idx[i], SENSOR_ENABLED);
-                       if (status == SENSOR_ENABLED)
-                               cl_data->sensor_sts[i] = SENSOR_ENABLED;
-                       dev_dbg(dev, "suspend sid 0x%x (%s) status 0x%x\n",
-                               cl_data->sensor_idx[i], get_sensor_name(cl_data->sensor_idx[i]),
-                               cl_data->sensor_sts[i]);
-               }
-       }
 
-       schedule_delayed_work(&cl_data->work_buffer, msecs_to_jiffies(AMD_SFH_IDLE_LOOP));
-       amd_sfh_clear_intr(mp2);
+       mp2->mp2_ops->resume(mp2);
 
        return 0;
 }
@@ -368,25 +348,8 @@ static int __maybe_unused amd_mp2_pci_resume(struct device *dev)
 static int __maybe_unused amd_mp2_pci_suspend(struct device *dev)
 {
        struct amd_mp2_dev *mp2 = dev_get_drvdata(dev);
-       struct amdtp_cl_data *cl_data = mp2->cl_data;
-       int i, status;
-
-       for (i = 0; i < cl_data->num_hid_devices; i++) {
-               if (cl_data->sensor_idx[i] != HPD_IDX &&
-                   cl_data->sensor_sts[i] == SENSOR_ENABLED) {
-                       mp2->mp2_ops->stop(mp2, cl_data->sensor_idx[i]);
-                       status = amd_sfh_wait_for_response
-                                       (mp2, cl_data->sensor_idx[i], SENSOR_DISABLED);
-                       if (status != SENSOR_ENABLED)
-                               cl_data->sensor_sts[i] = SENSOR_DISABLED;
-                       dev_dbg(dev, "suspend sid 0x%x (%s) status 0x%x\n",
-                               cl_data->sensor_idx[i], get_sensor_name(cl_data->sensor_idx[i]),
-                               cl_data->sensor_sts[i]);
-               }
-       }
 
-       cancel_delayed_work_sync(&cl_data->work_buffer);
-       amd_sfh_clear_intr(mp2);
+       mp2->mp2_ops->suspend(mp2);
 
        return 0;
 }