xref: /linux/drivers/hid/intel-ish-hid/ishtp-hid.h (revision 762f99f4f3cb41a775b5157dd761217beba65873)
12025cf9eSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
20b28cb4bSSrinivas Pandruvada /*
30b28cb4bSSrinivas Pandruvada  * ISHTP-HID glue driver's definitions.
40b28cb4bSSrinivas Pandruvada  *
50b28cb4bSSrinivas Pandruvada  * Copyright (c) 2014-2016, Intel Corporation.
60b28cb4bSSrinivas Pandruvada  */
70b28cb4bSSrinivas Pandruvada #ifndef ISHTP_HID__H
80b28cb4bSSrinivas Pandruvada #define	ISHTP_HID__H
90b28cb4bSSrinivas Pandruvada 
100b28cb4bSSrinivas Pandruvada /* The fixed ISH product and vendor id */
110b28cb4bSSrinivas Pandruvada #define	ISH_HID_VENDOR	0x8086
120b28cb4bSSrinivas Pandruvada #define	ISH_HID_PRODUCT	0x22D8
130b28cb4bSSrinivas Pandruvada #define	ISH_HID_VERSION	0x0200
140b28cb4bSSrinivas Pandruvada 
150b28cb4bSSrinivas Pandruvada #define	CMD_MASK	0x7F
160b28cb4bSSrinivas Pandruvada #define	IS_RESPONSE	0x80
170b28cb4bSSrinivas Pandruvada 
180b28cb4bSSrinivas Pandruvada /* Used to dump to Linux trace buffer, if enabled */
19c57179c7SLee Jones extern ishtp_print_log ishtp_hid_print_trace;
200b28cb4bSSrinivas Pandruvada #define hid_ishtp_trace(client, ...) \
21c57179c7SLee Jones 	(ishtp_hid_print_trace)(NULL, __VA_ARGS__)
220b28cb4bSSrinivas Pandruvada 
230b28cb4bSSrinivas Pandruvada /* ISH HID message structure */
240b28cb4bSSrinivas Pandruvada struct hostif_msg_hdr {
250b28cb4bSSrinivas Pandruvada 	uint8_t	command; /* Bit 7: is_response */
260b28cb4bSSrinivas Pandruvada 	uint8_t	device_id;
270b28cb4bSSrinivas Pandruvada 	uint8_t	status;
280b28cb4bSSrinivas Pandruvada 	uint8_t	flags;
290b28cb4bSSrinivas Pandruvada 	uint16_t size;
300b28cb4bSSrinivas Pandruvada } __packed;
310b28cb4bSSrinivas Pandruvada 
320b28cb4bSSrinivas Pandruvada struct hostif_msg {
330b28cb4bSSrinivas Pandruvada 	struct hostif_msg_hdr	hdr;
340b28cb4bSSrinivas Pandruvada } __packed;
350b28cb4bSSrinivas Pandruvada 
360b28cb4bSSrinivas Pandruvada struct hostif_msg_to_sensor {
370b28cb4bSSrinivas Pandruvada 	struct hostif_msg_hdr	hdr;
380b28cb4bSSrinivas Pandruvada 	uint8_t	report_id;
390b28cb4bSSrinivas Pandruvada } __packed;
400b28cb4bSSrinivas Pandruvada 
410b28cb4bSSrinivas Pandruvada struct device_info {
420b28cb4bSSrinivas Pandruvada 	uint32_t dev_id;
430b28cb4bSSrinivas Pandruvada 	uint8_t dev_class;
440b28cb4bSSrinivas Pandruvada 	uint16_t pid;
450b28cb4bSSrinivas Pandruvada 	uint16_t vid;
460b28cb4bSSrinivas Pandruvada } __packed;
470b28cb4bSSrinivas Pandruvada 
480b28cb4bSSrinivas Pandruvada struct ishtp_version {
490b28cb4bSSrinivas Pandruvada 	uint8_t	major;
500b28cb4bSSrinivas Pandruvada 	uint8_t	minor;
510b28cb4bSSrinivas Pandruvada 	uint8_t	hotfix;
520b28cb4bSSrinivas Pandruvada 	uint16_t build;
530b28cb4bSSrinivas Pandruvada } __packed;
540b28cb4bSSrinivas Pandruvada 
550b28cb4bSSrinivas Pandruvada /* struct for ISHTP aggregated input data */
560b28cb4bSSrinivas Pandruvada struct report_list {
570b28cb4bSSrinivas Pandruvada 	uint16_t total_size;
580b28cb4bSSrinivas Pandruvada 	uint8_t	num_of_reports;
590b28cb4bSSrinivas Pandruvada 	uint8_t	flags;
600b28cb4bSSrinivas Pandruvada 	struct {
610b28cb4bSSrinivas Pandruvada 		uint16_t	size_of_report;
620b28cb4bSSrinivas Pandruvada 		uint8_t report[1];
630b28cb4bSSrinivas Pandruvada 	} __packed reports[1];
640b28cb4bSSrinivas Pandruvada } __packed;
650b28cb4bSSrinivas Pandruvada 
660b28cb4bSSrinivas Pandruvada /* HOSTIF commands */
670b28cb4bSSrinivas Pandruvada #define	HOSTIF_HID_COMMAND_BASE			0
680b28cb4bSSrinivas Pandruvada #define	HOSTIF_GET_HID_DESCRIPTOR		0
690b28cb4bSSrinivas Pandruvada #define	HOSTIF_GET_REPORT_DESCRIPTOR		1
700b28cb4bSSrinivas Pandruvada #define HOSTIF_GET_FEATURE_REPORT		2
710b28cb4bSSrinivas Pandruvada #define	HOSTIF_SET_FEATURE_REPORT		3
720b28cb4bSSrinivas Pandruvada #define	HOSTIF_GET_INPUT_REPORT			4
730b28cb4bSSrinivas Pandruvada #define	HOSTIF_PUBLISH_INPUT_REPORT		5
740b28cb4bSSrinivas Pandruvada #define	HOSTIF_PUBLISH_INPUT_REPORT_LIST	6
750b28cb4bSSrinivas Pandruvada #define	HOSTIF_DM_COMMAND_BASE			32
760b28cb4bSSrinivas Pandruvada #define	HOSTIF_DM_ENUM_DEVICES			33
770b28cb4bSSrinivas Pandruvada #define	HOSTIF_DM_ADD_DEVICE			34
780b28cb4bSSrinivas Pandruvada 
790b28cb4bSSrinivas Pandruvada #define	MAX_HID_DEVICES				32
800b28cb4bSSrinivas Pandruvada 
810b28cb4bSSrinivas Pandruvada /**
820b28cb4bSSrinivas Pandruvada  * struct ishtp_cl_data - Encapsulate per ISH TP HID Client
830b28cb4bSSrinivas Pandruvada  * @enum_device_done:	Enum devices response complete flag
840b28cb4bSSrinivas Pandruvada  * @hid_descr_done:	HID descriptor complete flag
850b28cb4bSSrinivas Pandruvada  * @report_descr_done:	Get report descriptor complete flag
860b28cb4bSSrinivas Pandruvada  * @init_done:		Init process completed successfully
870b28cb4bSSrinivas Pandruvada  * @suspended:		System is under suspend state or in progress
880b28cb4bSSrinivas Pandruvada  * @num_hid_devices:	Number of HID devices enumerated in this client
890b28cb4bSSrinivas Pandruvada  * @cur_hid_dev:	This keeps track of the device index for which
900b28cb4bSSrinivas Pandruvada  *			initialization and registration with HID core
910b28cb4bSSrinivas Pandruvada  *			in progress.
920b28cb4bSSrinivas Pandruvada  * @hid_devices:	Store vid/pid/devid for each enumerated HID device
930b28cb4bSSrinivas Pandruvada  * @report_descr:	Stores the raw report descriptors for each HID device
940b28cb4bSSrinivas Pandruvada  * @report_descr_size:	Report description of size of above repo_descr[]
950b28cb4bSSrinivas Pandruvada  * @hid_sensor_hubs:	Pointer to hid_device for all HID device, so that
960b28cb4bSSrinivas Pandruvada  *			when clients are removed, they can be freed
970b28cb4bSSrinivas Pandruvada  * @hid_descr:		Pointer to hid descriptor for each enumerated hid
980b28cb4bSSrinivas Pandruvada  *			device
990b28cb4bSSrinivas Pandruvada  * @hid_descr_size:	Size of each above report descriptor
1000b28cb4bSSrinivas Pandruvada  * @init_wait:		Wait queue to wait during initialization, where the
1010b28cb4bSSrinivas Pandruvada  *			client send message to ISH FW and wait for response
1020b28cb4bSSrinivas Pandruvada  * @ishtp_hid_wait:	The wait for get report during wait callback from hid
1030b28cb4bSSrinivas Pandruvada  *			core
1040b28cb4bSSrinivas Pandruvada  * @bad_recv_cnt:	Running count of packets received with error
1050b28cb4bSSrinivas Pandruvada  * @multi_packet_cnt:	Count of fragmented packet count
1060b28cb4bSSrinivas Pandruvada  *
1070b28cb4bSSrinivas Pandruvada  * This structure is used to store completion flags and per client data like
1080b28cb4bSSrinivas Pandruvada  * like report description, number of HID devices etc.
1090b28cb4bSSrinivas Pandruvada  */
1100b28cb4bSSrinivas Pandruvada struct ishtp_cl_data {
1110b28cb4bSSrinivas Pandruvada 	/* completion flags */
1120b28cb4bSSrinivas Pandruvada 	bool enum_devices_done;
1130b28cb4bSSrinivas Pandruvada 	bool hid_descr_done;
1140b28cb4bSSrinivas Pandruvada 	bool report_descr_done;
1150b28cb4bSSrinivas Pandruvada 	bool init_done;
1160b28cb4bSSrinivas Pandruvada 	bool suspended;
1170b28cb4bSSrinivas Pandruvada 
1180b28cb4bSSrinivas Pandruvada 	unsigned int num_hid_devices;
1190b28cb4bSSrinivas Pandruvada 	unsigned int cur_hid_dev;
1200b28cb4bSSrinivas Pandruvada 	unsigned int hid_dev_count;
1210b28cb4bSSrinivas Pandruvada 
1220b28cb4bSSrinivas Pandruvada 	struct device_info *hid_devices;
1230b28cb4bSSrinivas Pandruvada 	unsigned char *report_descr[MAX_HID_DEVICES];
1240b28cb4bSSrinivas Pandruvada 	int report_descr_size[MAX_HID_DEVICES];
1250b28cb4bSSrinivas Pandruvada 	struct hid_device *hid_sensor_hubs[MAX_HID_DEVICES];
1260b28cb4bSSrinivas Pandruvada 	unsigned char *hid_descr[MAX_HID_DEVICES];
1270b28cb4bSSrinivas Pandruvada 	int hid_descr_size[MAX_HID_DEVICES];
1280b28cb4bSSrinivas Pandruvada 
1290b28cb4bSSrinivas Pandruvada 	wait_queue_head_t init_wait;
1300b28cb4bSSrinivas Pandruvada 	wait_queue_head_t ishtp_resume_wait;
1310b28cb4bSSrinivas Pandruvada 	struct ishtp_cl *hid_ishtp_cl;
1320b28cb4bSSrinivas Pandruvada 
1330b28cb4bSSrinivas Pandruvada 	/* Statistics */
1340b28cb4bSSrinivas Pandruvada 	unsigned int bad_recv_cnt;
1350b28cb4bSSrinivas Pandruvada 	int multi_packet_cnt;
1360b28cb4bSSrinivas Pandruvada 
1370b28cb4bSSrinivas Pandruvada 	struct work_struct work;
138*e48bf29cSYe Xiang 	struct work_struct resume_work;
1390b28cb4bSSrinivas Pandruvada 	struct ishtp_cl_device *cl_device;
1400b28cb4bSSrinivas Pandruvada };
1410b28cb4bSSrinivas Pandruvada 
1420b28cb4bSSrinivas Pandruvada /**
1430b28cb4bSSrinivas Pandruvada  * struct ishtp_hid_data - Per instance HID data
1440b28cb4bSSrinivas Pandruvada  * @index:		Device index in the order of enumeration
1450b28cb4bSSrinivas Pandruvada  * @request_done:	Get Feature/Input report complete flag
1460b28cb4bSSrinivas Pandruvada  *			used during get/set request from hid core
1470b28cb4bSSrinivas Pandruvada  * @client_data:	Link to the client instance
1480b28cb4bSSrinivas Pandruvada  * @hid_wait:		Completion waitq
1490b28cb4bSSrinivas Pandruvada  *
150e19595fcSHyungwoo Yang  * @raw_get_req:	Flag indicating raw get request ongoing
151e19595fcSHyungwoo Yang  * @raw_buf:		raw request buffer filled on receiving get report
152e19595fcSHyungwoo Yang  * @raw_buf_size:	raw request buffer size
1530b28cb4bSSrinivas Pandruvada  * Used to tie hid hid->driver data to driver client instance
1540b28cb4bSSrinivas Pandruvada  */
1550b28cb4bSSrinivas Pandruvada struct ishtp_hid_data {
1560b28cb4bSSrinivas Pandruvada 	int index;
1570b28cb4bSSrinivas Pandruvada 	bool request_done;
1580b28cb4bSSrinivas Pandruvada 	struct ishtp_cl_data *client_data;
1590b28cb4bSSrinivas Pandruvada 	wait_queue_head_t hid_wait;
160e19595fcSHyungwoo Yang 
161e19595fcSHyungwoo Yang 	/* raw request */
162e19595fcSHyungwoo Yang 	bool raw_get_req;
163e19595fcSHyungwoo Yang 	u8 *raw_buf;
164e19595fcSHyungwoo Yang 	size_t raw_buf_size;
1650b28cb4bSSrinivas Pandruvada };
1660b28cb4bSSrinivas Pandruvada 
1670b28cb4bSSrinivas Pandruvada /* Interface functions between HID LL driver and ISH TP client */
1680b28cb4bSSrinivas Pandruvada void hid_ishtp_set_feature(struct hid_device *hid, char *buf, unsigned int len,
1690b28cb4bSSrinivas Pandruvada 			   int report_id);
1700b28cb4bSSrinivas Pandruvada void hid_ishtp_get_report(struct hid_device *hid, int report_id,
1710b28cb4bSSrinivas Pandruvada 			  int report_type);
1720b28cb4bSSrinivas Pandruvada int ishtp_hid_probe(unsigned int cur_hid_dev,
1730b28cb4bSSrinivas Pandruvada 		    struct ishtp_cl_data *client_data);
1740b28cb4bSSrinivas Pandruvada void ishtp_hid_remove(struct ishtp_cl_data *client_data);
1750b28cb4bSSrinivas Pandruvada int ishtp_hid_link_ready_wait(struct ishtp_cl_data *client_data);
1760b28cb4bSSrinivas Pandruvada void ishtp_hid_wakeup(struct hid_device *hid);
1770b28cb4bSSrinivas Pandruvada 
1780b28cb4bSSrinivas Pandruvada #endif	/* ISHTP_HID__H */
179