Commit 786aa1b9 authored by Basavaraj Natikar's avatar Basavaraj Natikar Committed by Jiri Kosina

HID: amd_sfh: Add descriptor operations in amd_mp2_ops

Add dynamic descriptor operations as part of amd_mp2_ops structure to
support all AMD SOCs and use wherever applicable.
Signed-off-by: default avatarBasavaraj Natikar <Basavaraj.Natikar@amd.com>
Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
parent c092e274
...@@ -70,6 +70,8 @@ static void amd_sfh_work(struct work_struct *work) ...@@ -70,6 +70,8 @@ static void amd_sfh_work(struct work_struct *work)
struct amd_input_data *in_data = cli_data->in_data; struct amd_input_data *in_data = cli_data->in_data;
struct request_list *req_node; struct request_list *req_node;
u8 current_index, sensor_index; u8 current_index, sensor_index;
struct amd_mp2_ops *mp2_ops;
struct amd_mp2_dev *mp2;
u8 report_id, node_type; u8 report_id, node_type;
u8 report_size = 0; u8 report_size = 0;
...@@ -81,9 +83,11 @@ static void amd_sfh_work(struct work_struct *work) ...@@ -81,9 +83,11 @@ static void amd_sfh_work(struct work_struct *work)
node_type = req_node->report_type; node_type = req_node->report_type;
kfree(req_node); kfree(req_node);
mp2 = container_of(in_data, struct amd_mp2_dev, in_data);
mp2_ops = mp2->mp2_ops;
if (node_type == HID_FEATURE_REPORT) { if (node_type == HID_FEATURE_REPORT) {
report_size = get_feature_report(sensor_index, report_id, report_size = mp2_ops->get_feat_rep(sensor_index, report_id,
cli_data->feature_report[current_index]); cli_data->feature_report[current_index]);
if (report_size) if (report_size)
hid_input_report(cli_data->hid_sensor_hubs[current_index], hid_input_report(cli_data->hid_sensor_hubs[current_index],
cli_data->report_type[current_index], cli_data->report_type[current_index],
...@@ -92,7 +96,7 @@ static void amd_sfh_work(struct work_struct *work) ...@@ -92,7 +96,7 @@ static void amd_sfh_work(struct work_struct *work)
pr_err("AMDSFH: Invalid report size\n"); pr_err("AMDSFH: Invalid report size\n");
} else if (node_type == HID_INPUT_REPORT) { } else if (node_type == HID_INPUT_REPORT) {
report_size = get_input_report(current_index, sensor_index, report_id, in_data); report_size = mp2_ops->get_in_rep(current_index, sensor_index, report_id, in_data);
if (report_size) if (report_size)
hid_input_report(cli_data->hid_sensor_hubs[current_index], hid_input_report(cli_data->hid_sensor_hubs[current_index],
cli_data->report_type[current_index], cli_data->report_type[current_index],
...@@ -109,13 +113,15 @@ static void amd_sfh_work_buffer(struct work_struct *work) ...@@ -109,13 +113,15 @@ static void amd_sfh_work_buffer(struct work_struct *work)
{ {
struct amdtp_cl_data *cli_data = container_of(work, struct amdtp_cl_data, work_buffer.work); struct amdtp_cl_data *cli_data = container_of(work, struct amdtp_cl_data, work_buffer.work);
struct amd_input_data *in_data = cli_data->in_data; struct amd_input_data *in_data = cli_data->in_data;
struct amd_mp2_dev *mp2;
u8 report_size; u8 report_size;
int i; int i;
for (i = 0; i < cli_data->num_hid_devices; i++) { for (i = 0; i < cli_data->num_hid_devices; i++) {
if (cli_data->sensor_sts[i] == SENSOR_ENABLED) { if (cli_data->sensor_sts[i] == SENSOR_ENABLED) {
report_size = get_input_report mp2 = container_of(in_data, struct amd_mp2_dev, in_data);
(i, cli_data->sensor_idx[i], cli_data->report_id[i], in_data); report_size = mp2->mp2_ops->get_in_rep(i, cli_data->sensor_idx[i],
cli_data->report_id[i], in_data);
hid_input_report(cli_data->hid_sensor_hubs[i], HID_INPUT_REPORT, hid_input_report(cli_data->hid_sensor_hubs[i], HID_INPUT_REPORT,
in_data->input_report[i], report_size, 0); in_data->input_report[i], report_size, 0);
} }
...@@ -153,6 +159,7 @@ int amd_sfh_hid_client_init(struct amd_mp2_dev *privdata) ...@@ -153,6 +159,7 @@ int amd_sfh_hid_client_init(struct amd_mp2_dev *privdata)
{ {
struct amd_input_data *in_data = &privdata->in_data; struct amd_input_data *in_data = &privdata->in_data;
struct amdtp_cl_data *cl_data = privdata->cl_data; struct amdtp_cl_data *cl_data = privdata->cl_data;
struct amd_mp2_ops *mp2_ops = privdata->mp2_ops;
struct amd_mp2_sensor_info info; struct amd_mp2_sensor_info info;
struct request_list *req_list; struct request_list *req_list;
struct device *dev; struct device *dev;
...@@ -163,6 +170,7 @@ int amd_sfh_hid_client_init(struct amd_mp2_dev *privdata) ...@@ -163,6 +170,7 @@ int amd_sfh_hid_client_init(struct amd_mp2_dev *privdata)
req_list = &cl_data->req_list; req_list = &cl_data->req_list;
dev = &privdata->pdev->dev; dev = &privdata->pdev->dev;
amd_sfh_set_desc_ops(mp2_ops);
cl_data->num_hid_devices = amd_mp2_get_sensor_num(privdata, &cl_data->sensor_idx[0]); cl_data->num_hid_devices = amd_mp2_get_sensor_num(privdata, &cl_data->sensor_idx[0]);
...@@ -179,17 +187,17 @@ int amd_sfh_hid_client_init(struct amd_mp2_dev *privdata) ...@@ -179,17 +187,17 @@ int amd_sfh_hid_client_init(struct amd_mp2_dev *privdata)
cl_data->sensor_requested_cnt[i] = 0; cl_data->sensor_requested_cnt[i] = 0;
cl_data->cur_hid_dev = i; cl_data->cur_hid_dev = i;
cl_idx = cl_data->sensor_idx[i]; cl_idx = cl_data->sensor_idx[i];
cl_data->report_descr_sz[i] = get_descr_sz(cl_idx, descr_size); cl_data->report_descr_sz[i] = mp2_ops->get_desc_sz(cl_idx, descr_size);
if (!cl_data->report_descr_sz[i]) { if (!cl_data->report_descr_sz[i]) {
rc = -EINVAL; rc = -EINVAL;
goto cleanup; goto cleanup;
} }
feature_report_size = get_descr_sz(cl_idx, feature_size); feature_report_size = mp2_ops->get_desc_sz(cl_idx, feature_size);
if (!feature_report_size) { if (!feature_report_size) {
rc = -EINVAL; rc = -EINVAL;
goto cleanup; goto cleanup;
} }
input_report_size = get_descr_sz(cl_idx, input_size); input_report_size = mp2_ops->get_desc_sz(cl_idx, input_size);
if (!input_report_size) { if (!input_report_size) {
rc = -EINVAL; rc = -EINVAL;
goto cleanup; goto cleanup;
...@@ -214,17 +222,17 @@ int amd_sfh_hid_client_init(struct amd_mp2_dev *privdata) ...@@ -214,17 +222,17 @@ int amd_sfh_hid_client_init(struct amd_mp2_dev *privdata)
rc = -ENOMEM; rc = -ENOMEM;
goto cleanup; goto cleanup;
} }
rc = get_report_descriptor(cl_idx, cl_data->report_descr[i]); rc = mp2_ops->get_rep_desc(cl_idx, cl_data->report_descr[i]);
if (rc) if (rc)
return rc; return rc;
privdata->mp2_ops->start(privdata, info); mp2_ops->start(privdata, info);
status = amd_sfh_wait_for_response status = amd_sfh_wait_for_response
(privdata, cl_data->sensor_idx[i], SENSOR_ENABLED); (privdata, cl_data->sensor_idx[i], SENSOR_ENABLED);
if (status == SENSOR_ENABLED) { if (status == SENSOR_ENABLED) {
cl_data->sensor_sts[i] = SENSOR_ENABLED; cl_data->sensor_sts[i] = SENSOR_ENABLED;
rc = amdtp_hid_probe(cl_data->cur_hid_dev, cl_data); rc = amdtp_hid_probe(cl_data->cur_hid_dev, cl_data);
if (rc) { if (rc) {
privdata->mp2_ops->stop(privdata, cl_data->sensor_idx[i]); mp2_ops->stop(privdata, cl_data->sensor_idx[i]);
status = amd_sfh_wait_for_response status = amd_sfh_wait_for_response
(privdata, cl_data->sensor_idx[i], SENSOR_DISABLED); (privdata, cl_data->sensor_idx[i], SENSOR_DISABLED);
if (status != SENSOR_ENABLED) if (status != SENSOR_ENABLED)
...@@ -240,8 +248,7 @@ int amd_sfh_hid_client_init(struct amd_mp2_dev *privdata) ...@@ -240,8 +248,7 @@ int amd_sfh_hid_client_init(struct amd_mp2_dev *privdata)
cl_data->sensor_idx[i], get_sensor_name(cl_data->sensor_idx[i]), cl_data->sensor_idx[i], get_sensor_name(cl_data->sensor_idx[i]),
cl_data->sensor_sts[i]); cl_data->sensor_sts[i]);
} }
if (privdata->mp2_ops->discovery_status && if (mp2_ops->discovery_status && mp2_ops->discovery_status(privdata) == 0) {
privdata->mp2_ops->discovery_status(privdata) == 0) {
amd_sfh_hid_client_deinit(privdata); amd_sfh_hid_client_deinit(privdata);
for (i = 0; i < cl_data->num_hid_devices; i++) { for (i = 0; i < cl_data->num_hid_devices; i++) {
devm_kfree(dev, cl_data->feature_report[i]); devm_kfree(dev, cl_data->feature_report[i]);
......
...@@ -40,7 +40,7 @@ struct amd_mp2_dev { ...@@ -40,7 +40,7 @@ struct amd_mp2_dev {
struct pci_dev *pdev; struct pci_dev *pdev;
struct amdtp_cl_data *cl_data; struct amdtp_cl_data *cl_data;
void __iomem *mmio; void __iomem *mmio;
const struct amd_mp2_ops *mp2_ops; struct amd_mp2_ops *mp2_ops;
struct amd_input_data in_data; struct amd_input_data in_data;
/* mp2 active control status */ /* mp2 active control status */
u32 mp2_acs; u32 mp2_acs;
...@@ -54,6 +54,11 @@ struct amd_mp2_ops { ...@@ -54,6 +54,11 @@ struct amd_mp2_ops {
void (*clear_intr)(struct amd_mp2_dev *privdata); void (*clear_intr)(struct amd_mp2_dev *privdata);
int (*init_intr)(struct amd_mp2_dev *privdata); int (*init_intr)(struct amd_mp2_dev *privdata);
int (*discovery_status)(struct amd_mp2_dev *privdata); int (*discovery_status)(struct amd_mp2_dev *privdata);
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);
u8 (*get_in_rep)(u8 current_index, int sensor_idx, int report_id,
struct amd_input_data *in_data);
}; };
#endif #endif
...@@ -79,6 +79,4 @@ void amdtp_hid_remove(struct amdtp_cl_data *cli_data); ...@@ -79,6 +79,4 @@ void amdtp_hid_remove(struct amdtp_cl_data *cli_data);
int amd_sfh_get_report(struct hid_device *hid, int report_id, int report_type); int amd_sfh_get_report(struct hid_device *hid, int report_id, int report_type);
void amd_sfh_set_report(struct hid_device *hid, int report_id, int report_type); void amd_sfh_set_report(struct hid_device *hid, int report_id, int report_type);
void amdtp_hid_wakeup(struct hid_device *hid); void amdtp_hid_wakeup(struct hid_device *hid);
u8 get_input_report(u8 current_index, int sensor_idx, int report_id,
struct amd_input_data *in_data);
#endif #endif
...@@ -244,7 +244,7 @@ static void amd_mp2_pci_remove(void *privdata) ...@@ -244,7 +244,7 @@ static void amd_mp2_pci_remove(void *privdata)
amd_sfh_clear_intr(mp2); amd_sfh_clear_intr(mp2);
} }
static const struct amd_mp2_ops amd_sfh_ops_v2 = { static struct amd_mp2_ops amd_sfh_ops_v2 = {
.start = amd_start_sensor_v2, .start = amd_start_sensor_v2,
.stop = amd_stop_sensor_v2, .stop = amd_stop_sensor_v2,
.stop_all = amd_stop_all_sensor_v2, .stop_all = amd_stop_all_sensor_v2,
...@@ -254,7 +254,7 @@ static const struct amd_mp2_ops amd_sfh_ops_v2 = { ...@@ -254,7 +254,7 @@ static const struct amd_mp2_ops amd_sfh_ops_v2 = {
.discovery_status = amd_sfh_dis_sts_v2, .discovery_status = amd_sfh_dis_sts_v2,
}; };
static const struct amd_mp2_ops amd_sfh_ops = { static struct amd_mp2_ops amd_sfh_ops = {
.start = amd_start_sensor, .start = amd_start_sensor,
.stop = amd_stop_sensor, .stop = amd_stop_sensor,
.stop_all = amd_stop_all_sensors, .stop_all = amd_stop_all_sensors,
......
...@@ -108,5 +108,6 @@ u32 amd_sfh_wait_for_response(struct amd_mp2_dev *mp2, u8 sid, u32 sensor_sts); ...@@ -108,5 +108,6 @@ u32 amd_sfh_wait_for_response(struct amd_mp2_dev *mp2, u8 sid, u32 sensor_sts);
void amd_mp2_suspend(struct amd_mp2_dev *mp2); void amd_mp2_suspend(struct amd_mp2_dev *mp2);
void amd_mp2_resume(struct amd_mp2_dev *mp2); void amd_mp2_resume(struct amd_mp2_dev *mp2);
const char *get_sensor_name(int idx); const char *get_sensor_name(int idx);
void amd_sfh_set_desc_ops(struct amd_mp2_ops *mp2_ops);
#endif #endif
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
#define HID_USAGE_SENSOR_EVENT_DATA_UPDATED_ENUM 0x04 #define HID_USAGE_SENSOR_EVENT_DATA_UPDATED_ENUM 0x04
#define ILLUMINANCE_MASK GENMASK(14, 0) #define ILLUMINANCE_MASK GENMASK(14, 0)
int get_report_descriptor(int sensor_idx, u8 *rep_desc) static int get_report_descriptor(int sensor_idx, u8 *rep_desc)
{ {
switch (sensor_idx) { switch (sensor_idx) {
case accel_idx: /* accel */ case accel_idx: /* accel */
...@@ -63,7 +63,7 @@ int get_report_descriptor(int sensor_idx, u8 *rep_desc) ...@@ -63,7 +63,7 @@ int get_report_descriptor(int sensor_idx, u8 *rep_desc)
return 0; return 0;
} }
u32 get_descr_sz(int sensor_idx, int descriptor_name) static u32 get_descr_sz(int sensor_idx, int descriptor_name)
{ {
switch (sensor_idx) { switch (sensor_idx) {
case accel_idx: case accel_idx:
...@@ -133,7 +133,7 @@ static void get_common_features(struct common_feature_property *common, int repo ...@@ -133,7 +133,7 @@ static void get_common_features(struct common_feature_property *common, int repo
common->report_interval = HID_DEFAULT_REPORT_INTERVAL; common->report_interval = HID_DEFAULT_REPORT_INTERVAL;
} }
u8 get_feature_report(int sensor_idx, int report_id, u8 *feature_report) static u8 get_feature_report(int sensor_idx, int report_id, u8 *feature_report)
{ {
struct accel3_feature_report acc_feature; struct accel3_feature_report acc_feature;
struct gyro_feature_report gyro_feature; struct gyro_feature_report gyro_feature;
...@@ -200,7 +200,8 @@ static void get_common_inputs(struct common_input_property *common, int report_i ...@@ -200,7 +200,8 @@ static void get_common_inputs(struct common_input_property *common, int report_i
common->event_type = HID_USAGE_SENSOR_EVENT_DATA_UPDATED_ENUM; common->event_type = HID_USAGE_SENSOR_EVENT_DATA_UPDATED_ENUM;
} }
u8 get_input_report(u8 current_index, int sensor_idx, int report_id, struct amd_input_data *in_data) static u8 get_input_report(u8 current_index, int sensor_idx, int report_id,
struct amd_input_data *in_data)
{ {
struct amd_mp2_dev *privdata = container_of(in_data, struct amd_mp2_dev, in_data); struct amd_mp2_dev *privdata = container_of(in_data, struct amd_mp2_dev, in_data);
u32 *sensor_virt_addr = in_data->sensor_virt_addr[current_index]; u32 *sensor_virt_addr = in_data->sensor_virt_addr[current_index];
...@@ -267,3 +268,11 @@ u8 get_input_report(u8 current_index, int sensor_idx, int report_id, struct amd_ ...@@ -267,3 +268,11 @@ u8 get_input_report(u8 current_index, int sensor_idx, int report_id, struct amd_
} }
return report_size; return report_size;
} }
void amd_sfh_set_desc_ops(struct amd_mp2_ops *mp2_ops)
{
mp2_ops->get_rep_desc = get_report_descriptor;
mp2_ops->get_feat_rep = get_feature_report;
mp2_ops->get_in_rep = get_input_report;
mp2_ops->get_desc_sz = get_descr_sz;
}
...@@ -111,7 +111,4 @@ struct hpd_input_report { ...@@ -111,7 +111,4 @@ struct hpd_input_report {
u8 human_presence; u8 human_presence;
} __packed; } __packed;
int get_report_descriptor(int sensor_idx, u8 rep_desc[]);
u32 get_descr_sz(int sensor_idx, int descriptor_name);
u8 get_feature_report(int sensor_idx, int report_id, u8 *feature_report);
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment