Lines Matching +full:- +full:i

1 // SPDX-License-Identifier: GPL-2.0-or-later
4 * Copyright 2020-2021 Advanced Micro Devices, Inc.
5 * Authors: Nehal Bakulchandra Shah <Nehal-Bakulchandra.Shah@amd.com>
10 #include <linux/dma-mapping.h>
24 struct amdtp_hid_data *hid_data = hid->driver_data; in amd_sfh_set_report()
25 struct amdtp_cl_data *cli_data = hid_data->cli_data; in amd_sfh_set_report()
26 int i; in amd_sfh_set_report() local
28 for (i = 0; i < cli_data->num_hid_devices; i++) { in amd_sfh_set_report()
29 if (cli_data->hid_sensor_hubs[i] == hid) { in amd_sfh_set_report()
30 cli_data->cur_hid_dev = i; in amd_sfh_set_report()
39 struct amdtp_hid_data *hid_data = hid->driver_data; in amd_sfh_get_report()
40 struct amdtp_cl_data *cli_data = hid_data->cli_data; in amd_sfh_get_report()
41 struct request_list *req_list = &cli_data->req_list; in amd_sfh_get_report()
42 int i; in amd_sfh_get_report() local
44 for (i = 0; i < cli_data->num_hid_devices; i++) { in amd_sfh_get_report()
45 if (cli_data->hid_sensor_hubs[i] == hid) { in amd_sfh_get_report()
49 return -ENOMEM; in amd_sfh_get_report()
51 new->current_index = i; in amd_sfh_get_report()
52 new->sensor_idx = cli_data->sensor_idx[i]; in amd_sfh_get_report()
53 new->hid = hid; in amd_sfh_get_report()
54 new->report_type = report_type; in amd_sfh_get_report()
55 new->report_id = report_id; in amd_sfh_get_report()
56 cli_data->report_id[i] = report_id; in amd_sfh_get_report()
57 cli_data->request_done[i] = false; in amd_sfh_get_report()
58 list_add(&new->list, &req_list->list); in amd_sfh_get_report()
62 schedule_delayed_work(&cli_data->work, 0); in amd_sfh_get_report()
69 struct request_list *req_list = &cli_data->req_list; in amd_sfh_work()
70 struct amd_input_data *in_data = cli_data->in_data; in amd_sfh_work()
78 req_node = list_last_entry(&req_list->list, struct request_list, list); in amd_sfh_work()
79 list_del(&req_node->list); in amd_sfh_work()
80 current_index = req_node->current_index; in amd_sfh_work()
81 sensor_index = req_node->sensor_idx; in amd_sfh_work()
82 report_id = req_node->report_id; in amd_sfh_work()
83 node_type = req_node->report_type; in amd_sfh_work()
87 mp2_ops = mp2->mp2_ops; in amd_sfh_work()
89 report_size = mp2_ops->get_feat_rep(sensor_index, report_id, in amd_sfh_work()
90 cli_data->feature_report[current_index]); in amd_sfh_work()
92 hid_input_report(cli_data->hid_sensor_hubs[current_index], in amd_sfh_work()
93 cli_data->report_type[current_index], in amd_sfh_work()
94 cli_data->feature_report[current_index], report_size, 0); in amd_sfh_work()
99 report_size = mp2_ops->get_in_rep(current_index, sensor_index, report_id, in_data); in amd_sfh_work()
101 hid_input_report(cli_data->hid_sensor_hubs[current_index], in amd_sfh_work()
102 cli_data->report_type[current_index], in amd_sfh_work()
103 in_data->input_report[current_index], report_size, 0); in amd_sfh_work()
107 cli_data->cur_hid_dev = current_index; in amd_sfh_work()
108 cli_data->sensor_requested_cnt[current_index] = 0; in amd_sfh_work()
109 amdtp_hid_wakeup(cli_data->hid_sensor_hubs[current_index]); in amd_sfh_work()
115 struct amd_input_data *in_data = cli_data->in_data; in amd_sfh_work_buffer()
118 int i; in amd_sfh_work_buffer() local
120 for (i = 0; i < cli_data->num_hid_devices; i++) { in amd_sfh_work_buffer()
121 if (cli_data->sensor_sts[i] == SENSOR_ENABLED) { in amd_sfh_work_buffer()
123 report_size = mp2->mp2_ops->get_in_rep(i, cli_data->sensor_idx[i], in amd_sfh_work_buffer()
124 cli_data->report_id[i], in_data); in amd_sfh_work_buffer()
125 hid_input_report(cli_data->hid_sensor_hubs[i], HID_INPUT_REPORT, in amd_sfh_work_buffer()
126 in_data->input_report[i], report_size, 0); in amd_sfh_work_buffer()
129 schedule_delayed_work(&cli_data->work_buffer, msecs_to_jiffies(AMD_SFH_IDLE_LOOP)); in amd_sfh_work_buffer()
134 if (mp2->mp2_ops->response) in amd_sfh_wait_for_response()
135 sensor_sts = mp2->mp2_ops->response(mp2, sid, sensor_sts); in amd_sfh_wait_for_response()
161 struct amdtp_cl_data *cl_data = mp2->cl_data; in amd_sfh_resume()
163 int i, status; in amd_sfh_resume() local
165 for (i = 0; i < cl_data->num_hid_devices; i++) { in amd_sfh_resume()
166 if (cl_data->sensor_sts[i] == SENSOR_DISABLED) { in amd_sfh_resume()
168 info.sensor_idx = cl_data->sensor_idx[i]; in amd_sfh_resume()
169 info.dma_address = cl_data->sensor_dma_addr[i]; in amd_sfh_resume()
170 mp2->mp2_ops->start(mp2, info); in amd_sfh_resume()
172 (mp2, cl_data->sensor_idx[i], SENSOR_ENABLED); in amd_sfh_resume()
174 cl_data->sensor_sts[i] = SENSOR_ENABLED; in amd_sfh_resume()
175 dev_dbg(&mp2->pdev->dev, "resume sid 0x%x (%s) status 0x%x\n", in amd_sfh_resume()
176 cl_data->sensor_idx[i], get_sensor_name(cl_data->sensor_idx[i]), in amd_sfh_resume()
177 cl_data->sensor_sts[i]); in amd_sfh_resume()
181 schedule_delayed_work(&cl_data->work_buffer, msecs_to_jiffies(AMD_SFH_IDLE_LOOP)); in amd_sfh_resume()
187 struct amdtp_cl_data *cl_data = mp2->cl_data; in amd_sfh_suspend()
188 int i, status; in amd_sfh_suspend() local
190 for (i = 0; i < cl_data->num_hid_devices; i++) { in amd_sfh_suspend()
191 if (cl_data->sensor_idx[i] != HPD_IDX && in amd_sfh_suspend()
192 cl_data->sensor_sts[i] == SENSOR_ENABLED) { in amd_sfh_suspend()
193 mp2->mp2_ops->stop(mp2, cl_data->sensor_idx[i]); in amd_sfh_suspend()
195 (mp2, cl_data->sensor_idx[i], SENSOR_DISABLED); in amd_sfh_suspend()
197 cl_data->sensor_sts[i] = SENSOR_DISABLED; in amd_sfh_suspend()
198 dev_dbg(&mp2->pdev->dev, "suspend sid 0x%x (%s) status 0x%x\n", in amd_sfh_suspend()
199 cl_data->sensor_idx[i], get_sensor_name(cl_data->sensor_idx[i]), in amd_sfh_suspend()
200 cl_data->sensor_sts[i]); in amd_sfh_suspend()
204 cancel_delayed_work_sync(&cl_data->work_buffer); in amd_sfh_suspend()
210 struct amd_input_data *in_data = &privdata->in_data; in amd_sfh_hid_client_init()
211 struct amdtp_cl_data *cl_data = privdata->cl_data; in amd_sfh_hid_client_init()
212 struct amd_mp2_ops *mp2_ops = privdata->mp2_ops; in amd_sfh_hid_client_init()
218 int rc, i; in amd_sfh_hid_client_init() local
221 req_list = &cl_data->req_list; in amd_sfh_hid_client_init()
222 dev = &privdata->pdev->dev; in amd_sfh_hid_client_init()
225 mp2_ops->suspend = amd_sfh_suspend; in amd_sfh_hid_client_init()
226 mp2_ops->resume = amd_sfh_resume; in amd_sfh_hid_client_init()
228 cl_data->num_hid_devices = amd_mp2_get_sensor_num(privdata, &cl_data->sensor_idx[0]); in amd_sfh_hid_client_init()
229 if (cl_data->num_hid_devices == 0) in amd_sfh_hid_client_init()
230 return -ENODEV; in amd_sfh_hid_client_init()
231 cl_data->is_any_sensor_enabled = false; in amd_sfh_hid_client_init()
233 INIT_DELAYED_WORK(&cl_data->work, amd_sfh_work); in amd_sfh_hid_client_init()
234 INIT_DELAYED_WORK(&cl_data->work_buffer, amd_sfh_work_buffer); in amd_sfh_hid_client_init()
235 INIT_LIST_HEAD(&req_list->list); in amd_sfh_hid_client_init()
236 cl_data->in_data = in_data; in amd_sfh_hid_client_init()
238 for (i = 0; i < cl_data->num_hid_devices; i++) { in amd_sfh_hid_client_init()
239 in_data->sensor_virt_addr[i] = dma_alloc_coherent(dev, sizeof(int) * 8, in amd_sfh_hid_client_init()
240 &cl_data->sensor_dma_addr[i], in amd_sfh_hid_client_init()
242 if (!in_data->sensor_virt_addr[i]) { in amd_sfh_hid_client_init()
243 rc = -ENOMEM; in amd_sfh_hid_client_init()
246 cl_data->sensor_sts[i] = SENSOR_DISABLED; in amd_sfh_hid_client_init()
247 cl_data->sensor_requested_cnt[i] = 0; in amd_sfh_hid_client_init()
248 cl_data->cur_hid_dev = i; in amd_sfh_hid_client_init()
249 cl_idx = cl_data->sensor_idx[i]; in amd_sfh_hid_client_init()
250 cl_data->report_descr_sz[i] = mp2_ops->get_desc_sz(cl_idx, descr_size); in amd_sfh_hid_client_init()
251 if (!cl_data->report_descr_sz[i]) { in amd_sfh_hid_client_init()
252 rc = -EINVAL; in amd_sfh_hid_client_init()
255 feature_report_size = mp2_ops->get_desc_sz(cl_idx, feature_size); in amd_sfh_hid_client_init()
257 rc = -EINVAL; in amd_sfh_hid_client_init()
260 input_report_size = mp2_ops->get_desc_sz(cl_idx, input_size); in amd_sfh_hid_client_init()
262 rc = -EINVAL; in amd_sfh_hid_client_init()
265 cl_data->feature_report[i] = devm_kzalloc(dev, feature_report_size, GFP_KERNEL); in amd_sfh_hid_client_init()
266 if (!cl_data->feature_report[i]) { in amd_sfh_hid_client_init()
267 rc = -ENOMEM; in amd_sfh_hid_client_init()
270 in_data->input_report[i] = devm_kzalloc(dev, input_report_size, GFP_KERNEL); in amd_sfh_hid_client_init()
271 if (!in_data->input_report[i]) { in amd_sfh_hid_client_init()
272 rc = -ENOMEM; in amd_sfh_hid_client_init()
277 info.dma_address = cl_data->sensor_dma_addr[i]; in amd_sfh_hid_client_init()
279 cl_data->report_descr[i] = in amd_sfh_hid_client_init()
280 devm_kzalloc(dev, cl_data->report_descr_sz[i], GFP_KERNEL); in amd_sfh_hid_client_init()
281 if (!cl_data->report_descr[i]) { in amd_sfh_hid_client_init()
282 rc = -ENOMEM; in amd_sfh_hid_client_init()
285 rc = mp2_ops->get_rep_desc(cl_idx, cl_data->report_descr[i]); in amd_sfh_hid_client_init()
288 mp2_ops->start(privdata, info); in amd_sfh_hid_client_init()
289 cl_data->sensor_sts[i] = amd_sfh_wait_for_response in amd_sfh_hid_client_init()
290 (privdata, cl_data->sensor_idx[i], SENSOR_ENABLED); in amd_sfh_hid_client_init()
293 for (i = 0; i < cl_data->num_hid_devices; i++) { in amd_sfh_hid_client_init()
294 cl_data->cur_hid_dev = i; in amd_sfh_hid_client_init()
295 if (cl_data->sensor_sts[i] == SENSOR_ENABLED) { in amd_sfh_hid_client_init()
296 cl_data->is_any_sensor_enabled = true; in amd_sfh_hid_client_init()
297 rc = amdtp_hid_probe(i, cl_data); in amd_sfh_hid_client_init()
301 cl_data->sensor_sts[i] = SENSOR_DISABLED; in amd_sfh_hid_client_init()
304 cl_data->sensor_idx[i], get_sensor_name(cl_data->sensor_idx[i]), in amd_sfh_hid_client_init()
305 cl_data->sensor_sts[i]); in amd_sfh_hid_client_init()
308 if (!cl_data->is_any_sensor_enabled || in amd_sfh_hid_client_init()
309 (mp2_ops->discovery_status && mp2_ops->discovery_status(privdata) == 0)) { in amd_sfh_hid_client_init()
310 dev_warn(dev, "Failed to discover, sensors not enabled is %d\n", cl_data->is_any_sensor_enabled); in amd_sfh_hid_client_init()
311 rc = -EOPNOTSUPP; in amd_sfh_hid_client_init()
314 schedule_delayed_work(&cl_data->work_buffer, msecs_to_jiffies(AMD_SFH_IDLE_LOOP)); in amd_sfh_hid_client_init()
319 for (i = 0; i < cl_data->num_hid_devices; i++) { in amd_sfh_hid_client_init()
320 devm_kfree(dev, cl_data->feature_report[i]); in amd_sfh_hid_client_init()
321 devm_kfree(dev, in_data->input_report[i]); in amd_sfh_hid_client_init()
322 devm_kfree(dev, cl_data->report_descr[i]); in amd_sfh_hid_client_init()
329 struct amdtp_cl_data *cl_data = privdata->cl_data; in amd_sfh_hid_client_deinit()
330 struct amd_input_data *in_data = cl_data->in_data; in amd_sfh_hid_client_deinit()
331 int i, status; in amd_sfh_hid_client_deinit() local
333 for (i = 0; i < cl_data->num_hid_devices; i++) { in amd_sfh_hid_client_deinit()
334 if (cl_data->sensor_sts[i] == SENSOR_ENABLED) { in amd_sfh_hid_client_deinit()
335 privdata->mp2_ops->stop(privdata, cl_data->sensor_idx[i]); in amd_sfh_hid_client_deinit()
337 (privdata, cl_data->sensor_idx[i], SENSOR_DISABLED); in amd_sfh_hid_client_deinit()
339 cl_data->sensor_sts[i] = SENSOR_DISABLED; in amd_sfh_hid_client_deinit()
340 dev_dbg(&privdata->pdev->dev, "stopping sid 0x%x (%s) status 0x%x\n", in amd_sfh_hid_client_deinit()
341 cl_data->sensor_idx[i], get_sensor_name(cl_data->sensor_idx[i]), in amd_sfh_hid_client_deinit()
342 cl_data->sensor_sts[i]); in amd_sfh_hid_client_deinit()
346 cancel_delayed_work_sync(&cl_data->work); in amd_sfh_hid_client_deinit()
347 cancel_delayed_work_sync(&cl_data->work_buffer); in amd_sfh_hid_client_deinit()
350 for (i = 0; i < cl_data->num_hid_devices; i++) { in amd_sfh_hid_client_deinit()
351 if (in_data->sensor_virt_addr[i]) { in amd_sfh_hid_client_deinit()
352 dma_free_coherent(&privdata->pdev->dev, 8 * sizeof(int), in amd_sfh_hid_client_deinit()
353 in_data->sensor_virt_addr[i], in amd_sfh_hid_client_deinit()
354 cl_data->sensor_dma_addr[i]); in amd_sfh_hid_client_deinit()