162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * AMD MP2 Sensors transport driver
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright 2020-2021 Advanced Micro Devices, Inc.
662306a36Sopenharmony_ci * Authors: Nehal Bakulchandra Shah <Nehal-bakulchandra.shah@amd.com>
762306a36Sopenharmony_ci *	    Sandeep Singh <sandeep.singh@amd.com>
862306a36Sopenharmony_ci *	    Basavaraj Natikar <Basavaraj.Natikar@amd.com>
962306a36Sopenharmony_ci */
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#ifndef AMDSFH_HID_H
1262306a36Sopenharmony_ci#define AMDSFH_HID_H
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#define MAX_HID_DEVICES		6
1562306a36Sopenharmony_ci#define AMD_SFH_HID_VENDOR	0x1022
1662306a36Sopenharmony_ci#define AMD_SFH_HID_PRODUCT	0x0001
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_cistruct request_list {
1962306a36Sopenharmony_ci	struct hid_device *hid;
2062306a36Sopenharmony_ci	struct list_head list;
2162306a36Sopenharmony_ci	u8 report_id;
2262306a36Sopenharmony_ci	u8 sensor_idx;
2362306a36Sopenharmony_ci	u8 report_type;
2462306a36Sopenharmony_ci	u8 current_index;
2562306a36Sopenharmony_ci};
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_cistruct amd_input_data {
2862306a36Sopenharmony_ci	u32 *sensor_virt_addr[MAX_HID_DEVICES];
2962306a36Sopenharmony_ci	u8 *input_report[MAX_HID_DEVICES];
3062306a36Sopenharmony_ci};
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_cistruct amdtp_cl_data {
3362306a36Sopenharmony_ci	u8 init_done;
3462306a36Sopenharmony_ci	u32 cur_hid_dev;
3562306a36Sopenharmony_ci	bool is_any_sensor_enabled;
3662306a36Sopenharmony_ci	u32 hid_dev_count;
3762306a36Sopenharmony_ci	u32 num_hid_devices;
3862306a36Sopenharmony_ci	struct device_info *hid_devices;
3962306a36Sopenharmony_ci	u8  *report_descr[MAX_HID_DEVICES];
4062306a36Sopenharmony_ci	int report_descr_sz[MAX_HID_DEVICES];
4162306a36Sopenharmony_ci	struct hid_device *hid_sensor_hubs[MAX_HID_DEVICES];
4262306a36Sopenharmony_ci	u8 *hid_descr[MAX_HID_DEVICES];
4362306a36Sopenharmony_ci	int hid_descr_size[MAX_HID_DEVICES];
4462306a36Sopenharmony_ci	phys_addr_t phys_addr_base;
4562306a36Sopenharmony_ci	dma_addr_t sensor_dma_addr[MAX_HID_DEVICES];
4662306a36Sopenharmony_ci	u32 sensor_sts[MAX_HID_DEVICES];
4762306a36Sopenharmony_ci	u32 sensor_requested_cnt[MAX_HID_DEVICES];
4862306a36Sopenharmony_ci	u8 report_type[MAX_HID_DEVICES];
4962306a36Sopenharmony_ci	u8 report_id[MAX_HID_DEVICES];
5062306a36Sopenharmony_ci	u8 sensor_idx[MAX_HID_DEVICES];
5162306a36Sopenharmony_ci	u8 *feature_report[MAX_HID_DEVICES];
5262306a36Sopenharmony_ci	u8 request_done[MAX_HID_DEVICES];
5362306a36Sopenharmony_ci	struct amd_input_data *in_data;
5462306a36Sopenharmony_ci	struct delayed_work work;
5562306a36Sopenharmony_ci	struct delayed_work work_buffer;
5662306a36Sopenharmony_ci	struct request_list req_list;
5762306a36Sopenharmony_ci};
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci/**
6062306a36Sopenharmony_ci * struct amdtp_hid_data - Per instance HID data
6162306a36Sopenharmony_ci * @index:		Device index in the order of enumeration
6262306a36Sopenharmony_ci * @request_done:	Get Feature/Input report complete flag
6362306a36Sopenharmony_ci *			used during get/set request from hid core
6462306a36Sopenharmony_ci * @cli_data:		Link to the client instance
6562306a36Sopenharmony_ci * @hid_wait:		Completion waitq
6662306a36Sopenharmony_ci *
6762306a36Sopenharmony_ci * Used to tie hid->driver data to driver client instance
6862306a36Sopenharmony_ci */
6962306a36Sopenharmony_cistruct amdtp_hid_data {
7062306a36Sopenharmony_ci	int index;
7162306a36Sopenharmony_ci	struct amdtp_cl_data *cli_data;
7262306a36Sopenharmony_ci	wait_queue_head_t hid_wait;
7362306a36Sopenharmony_ci};
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci/* Interface functions between HID LL driver and AMD SFH client */
7662306a36Sopenharmony_civoid hid_amdtp_set_feature(struct hid_device *hid, char *buf, u32 len, int report_id);
7762306a36Sopenharmony_civoid hid_amdtp_get_report(struct hid_device *hid, int report_id, int report_type);
7862306a36Sopenharmony_ciint amdtp_hid_probe(u32 cur_hid_dev, struct amdtp_cl_data *cli_data);
7962306a36Sopenharmony_civoid amdtp_hid_remove(struct amdtp_cl_data *cli_data);
8062306a36Sopenharmony_ciint amd_sfh_get_report(struct hid_device *hid, int report_id, int report_type);
8162306a36Sopenharmony_civoid amd_sfh_set_report(struct hid_device *hid, int report_id, int report_type);
8262306a36Sopenharmony_civoid amdtp_hid_wakeup(struct hid_device *hid);
8362306a36Sopenharmony_ci#endif
84