HID: amd_sfh: Add PM operations in amd_mp2_ops
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>
This commit is contained in:
parent
786aa1b961
commit
9acadc7256
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user