Skip to content

Commit 786aa1b

Browse files
basuamdJiri Kosina
authored andcommitted
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: Basavaraj Natikar <[email protected]> Signed-off-by: Jiri Kosina <[email protected]>
1 parent c092e27 commit 786aa1b

File tree

7 files changed

+42
-25
lines changed

7 files changed

+42
-25
lines changed

drivers/hid/amd-sfh-hid/amd_sfh_client.c

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ static void amd_sfh_work(struct work_struct *work)
7070
struct amd_input_data *in_data = cli_data->in_data;
7171
struct request_list *req_node;
7272
u8 current_index, sensor_index;
73+
struct amd_mp2_ops *mp2_ops;
74+
struct amd_mp2_dev *mp2;
7375
u8 report_id, node_type;
7476
u8 report_size = 0;
7577

@@ -81,9 +83,11 @@ static void amd_sfh_work(struct work_struct *work)
8183
node_type = req_node->report_type;
8284
kfree(req_node);
8385

86+
mp2 = container_of(in_data, struct amd_mp2_dev, in_data);
87+
mp2_ops = mp2->mp2_ops;
8488
if (node_type == HID_FEATURE_REPORT) {
85-
report_size = get_feature_report(sensor_index, report_id,
86-
cli_data->feature_report[current_index]);
89+
report_size = mp2_ops->get_feat_rep(sensor_index, report_id,
90+
cli_data->feature_report[current_index]);
8791
if (report_size)
8892
hid_input_report(cli_data->hid_sensor_hubs[current_index],
8993
cli_data->report_type[current_index],
@@ -92,7 +96,7 @@ static void amd_sfh_work(struct work_struct *work)
9296
pr_err("AMDSFH: Invalid report size\n");
9397

9498
} else if (node_type == HID_INPUT_REPORT) {
95-
report_size = get_input_report(current_index, sensor_index, report_id, in_data);
99+
report_size = mp2_ops->get_in_rep(current_index, sensor_index, report_id, in_data);
96100
if (report_size)
97101
hid_input_report(cli_data->hid_sensor_hubs[current_index],
98102
cli_data->report_type[current_index],
@@ -109,13 +113,15 @@ static void amd_sfh_work_buffer(struct work_struct *work)
109113
{
110114
struct amdtp_cl_data *cli_data = container_of(work, struct amdtp_cl_data, work_buffer.work);
111115
struct amd_input_data *in_data = cli_data->in_data;
116+
struct amd_mp2_dev *mp2;
112117
u8 report_size;
113118
int i;
114119

115120
for (i = 0; i < cli_data->num_hid_devices; i++) {
116121
if (cli_data->sensor_sts[i] == SENSOR_ENABLED) {
117-
report_size = get_input_report
118-
(i, cli_data->sensor_idx[i], cli_data->report_id[i], in_data);
122+
mp2 = container_of(in_data, struct amd_mp2_dev, in_data);
123+
report_size = mp2->mp2_ops->get_in_rep(i, cli_data->sensor_idx[i],
124+
cli_data->report_id[i], in_data);
119125
hid_input_report(cli_data->hid_sensor_hubs[i], HID_INPUT_REPORT,
120126
in_data->input_report[i], report_size, 0);
121127
}
@@ -153,6 +159,7 @@ int amd_sfh_hid_client_init(struct amd_mp2_dev *privdata)
153159
{
154160
struct amd_input_data *in_data = &privdata->in_data;
155161
struct amdtp_cl_data *cl_data = privdata->cl_data;
162+
struct amd_mp2_ops *mp2_ops = privdata->mp2_ops;
156163
struct amd_mp2_sensor_info info;
157164
struct request_list *req_list;
158165
struct device *dev;
@@ -163,6 +170,7 @@ int amd_sfh_hid_client_init(struct amd_mp2_dev *privdata)
163170

164171
req_list = &cl_data->req_list;
165172
dev = &privdata->pdev->dev;
173+
amd_sfh_set_desc_ops(mp2_ops);
166174

167175
cl_data->num_hid_devices = amd_mp2_get_sensor_num(privdata, &cl_data->sensor_idx[0]);
168176

@@ -179,17 +187,17 @@ int amd_sfh_hid_client_init(struct amd_mp2_dev *privdata)
179187
cl_data->sensor_requested_cnt[i] = 0;
180188
cl_data->cur_hid_dev = i;
181189
cl_idx = cl_data->sensor_idx[i];
182-
cl_data->report_descr_sz[i] = get_descr_sz(cl_idx, descr_size);
190+
cl_data->report_descr_sz[i] = mp2_ops->get_desc_sz(cl_idx, descr_size);
183191
if (!cl_data->report_descr_sz[i]) {
184192
rc = -EINVAL;
185193
goto cleanup;
186194
}
187-
feature_report_size = get_descr_sz(cl_idx, feature_size);
195+
feature_report_size = mp2_ops->get_desc_sz(cl_idx, feature_size);
188196
if (!feature_report_size) {
189197
rc = -EINVAL;
190198
goto cleanup;
191199
}
192-
input_report_size = get_descr_sz(cl_idx, input_size);
200+
input_report_size = mp2_ops->get_desc_sz(cl_idx, input_size);
193201
if (!input_report_size) {
194202
rc = -EINVAL;
195203
goto cleanup;
@@ -214,17 +222,17 @@ int amd_sfh_hid_client_init(struct amd_mp2_dev *privdata)
214222
rc = -ENOMEM;
215223
goto cleanup;
216224
}
217-
rc = get_report_descriptor(cl_idx, cl_data->report_descr[i]);
225+
rc = mp2_ops->get_rep_desc(cl_idx, cl_data->report_descr[i]);
218226
if (rc)
219227
return rc;
220-
privdata->mp2_ops->start(privdata, info);
228+
mp2_ops->start(privdata, info);
221229
status = amd_sfh_wait_for_response
222230
(privdata, cl_data->sensor_idx[i], SENSOR_ENABLED);
223231
if (status == SENSOR_ENABLED) {
224232
cl_data->sensor_sts[i] = SENSOR_ENABLED;
225233
rc = amdtp_hid_probe(cl_data->cur_hid_dev, cl_data);
226234
if (rc) {
227-
privdata->mp2_ops->stop(privdata, cl_data->sensor_idx[i]);
235+
mp2_ops->stop(privdata, cl_data->sensor_idx[i]);
228236
status = amd_sfh_wait_for_response
229237
(privdata, cl_data->sensor_idx[i], SENSOR_DISABLED);
230238
if (status != SENSOR_ENABLED)
@@ -240,8 +248,7 @@ int amd_sfh_hid_client_init(struct amd_mp2_dev *privdata)
240248
cl_data->sensor_idx[i], get_sensor_name(cl_data->sensor_idx[i]),
241249
cl_data->sensor_sts[i]);
242250
}
243-
if (privdata->mp2_ops->discovery_status &&
244-
privdata->mp2_ops->discovery_status(privdata) == 0) {
251+
if (mp2_ops->discovery_status && mp2_ops->discovery_status(privdata) == 0) {
245252
amd_sfh_hid_client_deinit(privdata);
246253
for (i = 0; i < cl_data->num_hid_devices; i++) {
247254
devm_kfree(dev, cl_data->feature_report[i]);

drivers/hid/amd-sfh-hid/amd_sfh_common.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ struct amd_mp2_dev {
4040
struct pci_dev *pdev;
4141
struct amdtp_cl_data *cl_data;
4242
void __iomem *mmio;
43-
const struct amd_mp2_ops *mp2_ops;
43+
struct amd_mp2_ops *mp2_ops;
4444
struct amd_input_data in_data;
4545
/* mp2 active control status */
4646
u32 mp2_acs;
@@ -54,6 +54,11 @@ struct amd_mp2_ops {
5454
void (*clear_intr)(struct amd_mp2_dev *privdata);
5555
int (*init_intr)(struct amd_mp2_dev *privdata);
5656
int (*discovery_status)(struct amd_mp2_dev *privdata);
57+
int (*get_rep_desc)(int sensor_idx, u8 rep_desc[]);
58+
u32 (*get_desc_sz)(int sensor_idx, int descriptor_name);
59+
u8 (*get_feat_rep)(int sensor_idx, int report_id, u8 *feature_report);
60+
u8 (*get_in_rep)(u8 current_index, int sensor_idx, int report_id,
61+
struct amd_input_data *in_data);
5762
};
5863

5964
#endif

drivers/hid/amd-sfh-hid/amd_sfh_hid.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,4 @@ void amdtp_hid_remove(struct amdtp_cl_data *cli_data);
7979
int amd_sfh_get_report(struct hid_device *hid, int report_id, int report_type);
8080
void amd_sfh_set_report(struct hid_device *hid, int report_id, int report_type);
8181
void amdtp_hid_wakeup(struct hid_device *hid);
82-
u8 get_input_report(u8 current_index, int sensor_idx, int report_id,
83-
struct amd_input_data *in_data);
8482
#endif

drivers/hid/amd-sfh-hid/amd_sfh_pcie.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ static void amd_mp2_pci_remove(void *privdata)
244244
amd_sfh_clear_intr(mp2);
245245
}
246246

247-
static const struct amd_mp2_ops amd_sfh_ops_v2 = {
247+
static struct amd_mp2_ops amd_sfh_ops_v2 = {
248248
.start = amd_start_sensor_v2,
249249
.stop = amd_stop_sensor_v2,
250250
.stop_all = amd_stop_all_sensor_v2,
@@ -254,7 +254,7 @@ static const struct amd_mp2_ops amd_sfh_ops_v2 = {
254254
.discovery_status = amd_sfh_dis_sts_v2,
255255
};
256256

257-
static const struct amd_mp2_ops amd_sfh_ops = {
257+
static struct amd_mp2_ops amd_sfh_ops = {
258258
.start = amd_start_sensor,
259259
.stop = amd_stop_sensor,
260260
.stop_all = amd_stop_all_sensors,

drivers/hid/amd-sfh-hid/amd_sfh_pcie.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,5 +108,6 @@ u32 amd_sfh_wait_for_response(struct amd_mp2_dev *mp2, u8 sid, u32 sensor_sts);
108108
void amd_mp2_suspend(struct amd_mp2_dev *mp2);
109109
void amd_mp2_resume(struct amd_mp2_dev *mp2);
110110
const char *get_sensor_name(int idx);
111+
void amd_sfh_set_desc_ops(struct amd_mp2_ops *mp2_ops);
111112

112113
#endif

drivers/hid/amd-sfh-hid/hid_descriptor/amd_sfh_hid_desc.c

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
#define HID_USAGE_SENSOR_EVENT_DATA_UPDATED_ENUM 0x04
3030
#define ILLUMINANCE_MASK GENMASK(14, 0)
3131

32-
int get_report_descriptor(int sensor_idx, u8 *rep_desc)
32+
static int get_report_descriptor(int sensor_idx, u8 *rep_desc)
3333
{
3434
switch (sensor_idx) {
3535
case accel_idx: /* accel */
@@ -63,7 +63,7 @@ int get_report_descriptor(int sensor_idx, u8 *rep_desc)
6363
return 0;
6464
}
6565

66-
u32 get_descr_sz(int sensor_idx, int descriptor_name)
66+
static u32 get_descr_sz(int sensor_idx, int descriptor_name)
6767
{
6868
switch (sensor_idx) {
6969
case accel_idx:
@@ -133,7 +133,7 @@ static void get_common_features(struct common_feature_property *common, int repo
133133
common->report_interval = HID_DEFAULT_REPORT_INTERVAL;
134134
}
135135

136-
u8 get_feature_report(int sensor_idx, int report_id, u8 *feature_report)
136+
static u8 get_feature_report(int sensor_idx, int report_id, u8 *feature_report)
137137
{
138138
struct accel3_feature_report acc_feature;
139139
struct gyro_feature_report gyro_feature;
@@ -200,7 +200,8 @@ static void get_common_inputs(struct common_input_property *common, int report_i
200200
common->event_type = HID_USAGE_SENSOR_EVENT_DATA_UPDATED_ENUM;
201201
}
202202

203-
u8 get_input_report(u8 current_index, int sensor_idx, int report_id, struct amd_input_data *in_data)
203+
static u8 get_input_report(u8 current_index, int sensor_idx, int report_id,
204+
struct amd_input_data *in_data)
204205
{
205206
struct amd_mp2_dev *privdata = container_of(in_data, struct amd_mp2_dev, in_data);
206207
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_
267268
}
268269
return report_size;
269270
}
271+
272+
void amd_sfh_set_desc_ops(struct amd_mp2_ops *mp2_ops)
273+
{
274+
mp2_ops->get_rep_desc = get_report_descriptor;
275+
mp2_ops->get_feat_rep = get_feature_report;
276+
mp2_ops->get_in_rep = get_input_report;
277+
mp2_ops->get_desc_sz = get_descr_sz;
278+
}

drivers/hid/amd-sfh-hid/hid_descriptor/amd_sfh_hid_desc.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,4 @@ struct hpd_input_report {
111111
u8 human_presence;
112112
} __packed;
113113

114-
int get_report_descriptor(int sensor_idx, u8 rep_desc[]);
115-
u32 get_descr_sz(int sensor_idx, int descriptor_name);
116-
u8 get_feature_report(int sensor_idx, int report_id, u8 *feature_report);
117114
#endif

0 commit comments

Comments
 (0)