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