1 /* SPDX-License-Identifier: GPL-2.0 */
2 /* Copyright 2024 Intel Corporation */
3 
4 #ifndef _HID_OVER_SPI_H_
5 #define _HID_OVER_SPI_H_
6 
7 #include <linux/bits.h>
8 #include <linux/types.h>
9 
10 /* Input report type definition in HIDSPI protocol */
11 enum input_report_type {
12 	INVALID_INPUT_REPORT_TYPE_0	= 0,
13 	DATA				= 1,
14 	INVALID_TYPE_2			= 2,
15 	RESET_RESPONSE			= 3,
16 	COMMAND_RESPONSE		= 4,
17 	GET_FEATURE_RESPONSE		= 5,
18 	INVALID_TYPE_6			= 6,
19 	DEVICE_DESCRIPTOR_RESPONSE	= 7,
20 	REPORT_DESCRIPTOR_RESPONSE	= 8,
21 	SET_FEATURE_RESPONSE		= 9,
22 	OUTPUT_REPORT_RESPONSE		= 10,
23 	GET_INPUT_REPORT_RESPONSE	= 11,
24 	INVALID_INPUT_REPORT_TYPE	= 0xF,
25 };
26 
27 /* Output report type definition in HIDSPI protocol */
28 enum output_report_type {
29 	INVALID_OUTPUT_REPORT_TYPE_0	= 0,
30 	DEVICE_DESCRIPTOR		= 1,
31 	REPORT_DESCRIPTOR		= 2,
32 	SET_FEATURE			= 3,
33 	GET_FEATURE			= 4,
34 	OUTPUT_REPORT			= 5,
35 	GET_INPUT_REPORT		= 6,
36 	COMMAND_CONTENT			= 7,
37 };
38 
39 /* Set power command ID for output report */
40 #define HIDSPI_SET_POWER_CMD_ID  1
41 
42 /* Power state definition in HIDSPI protocol */
43 enum hidspi_power_state {
44 	HIDSPI_ON	= 1,
45 	HIDSPI_SLEEP	= 2,
46 	HIDSPI_OFF	= 3,
47 };
48 
49 /**
50  * Input report header definition in HIDSPI protocol
51  * Report header size is 32bits, it includes:
52  * protocol_ver:     [0:3] Current supported HIDSPI protocol version, must be 0x3
53  * reserved0:        [4:7] Reserved bits
54  * input_report_len: [8:21] Input report length in number bytes divided by 4
55  * last_frag_flag:   [22]Indicate if this packet is last fragment.
56  *                       1 - indicates last fragment
57  *                       0 - indicates additional fragments
58  * reserved1:        [23] Reserved bits
59  * @sync_const:      [24:31] Used to validate input report header, must be 0x5A
60  */
61 #define HIDSPI_INPUT_HEADER_SIZE		sizeof(u32)
62 #define HIDSPI_INPUT_HEADER_VER			GENMASK(3, 0)
63 #define HIDSPI_INPUT_HEADER_REPORT_LEN		GENMASK(21, 8)
64 #define HIDSPI_INPUT_HEADER_LAST_FLAG		BIT(22)
65 #define HIDSPI_INPUT_HEADER_SYNC		GENMASK(31, 24)
66 
67 /**
68  * struct input_report_body_header - Input report body header definition in HIDSPI protocol
69  * @input_report_type: indicate input report type, reference to enum input_report_type
70  * @content_len: this input report body packet length
71  * @content_id: indicate this input report's report id
72  */
73 struct input_report_body_header {
74 	u8 input_report_type;
75 	__le16 content_len;
76 	u8 content_id;
77 } __packed;
78 
79 #define HIDSPI_INPUT_BODY_HEADER_SIZE	sizeof(struct input_report_body_header)
80 
81 /**
82  * struct input_report_body - Input report body definition in HIDSPI protocol
83  * @body_hdr: input report body header
84  * @content: input report body content
85  */
86 struct input_report_body {
87 	struct input_report_body_header body_hdr;
88 	u8 content[];
89 } __packed;
90 
91 #define HIDSPI_INPUT_BODY_SIZE(content_len)	((content_len) + HIDSPI_INPUT_BODY_HEADER_SIZE)
92 
93 /**
94  * struct output_report_header - Output report header definition in HIDSPI protocol
95  * @report_type: output report type, reference to enum output_report_type
96  * @content_len: length of content
97  * @content_id: 0x00 - descriptors
98  *              report id - Set/Feature feature or Input/Output Reports
99  *              command opcode - for commands
100  */
101 struct output_report_header {
102 	u8 report_type;
103 	__le16 content_len;
104 	u8 content_id;
105 } __packed;
106 
107 #define HIDSPI_OUTPUT_REPORT_HEADER_SIZE	sizeof(struct output_report_header)
108 
109 /**
110  * struct output_report - Output report definition in HIDSPI protocol
111  * @output_hdr: output report header
112  * @content: output report content
113  */
114 struct output_report {
115 	struct output_report_header output_hdr;
116 	u8 content[];
117 } __packed;
118 
119 #define HIDSPI_OUTPUT_REPORT_SIZE(content_len)	((content_len) + HIDSPI_OUTPUT_REPORT_HEADER_SIZE)
120 
121 /**
122  * struct hidspi_dev_descriptor - HIDSPI device descriptor definition
123  * @dev_desc_len: The length of the complete device descriptor, fixed to 0x18 (24).
124  * @bcd_ver: The version number of the HIDSPI protocol supported.
125  *           In binary coded decimal (BCD) format. Must be fixed to 0x0300.
126  * @rep_desc_len: The length of the report descriptor
127  * @max_input_len: The length of the largest possible HID input (or feature) report
128  * @max_output_len: The length of the largest output (or feature) report
129  * @max_frag_len: The length of the largest fragment, where a fragment represents
130  *                the body of an input report.
131  * @vendor_id: Device manufacturers vendor ID
132  * @product_id: Device unique model/product ID
133  * @version_id: Device’s unique version
134  * @flags: Specify flags for the device’s operation
135  * @reserved: Reserved and should be 0
136  */
137 struct hidspi_dev_descriptor {
138 	__le16 dev_desc_len;
139 	__le16 bcd_ver;
140 	__le16 rep_desc_len;
141 	__le16 max_input_len;
142 	__le16 max_output_len;
143 	__le16 max_frag_len;
144 	__le16 vendor_id;
145 	__le16 product_id;
146 	__le16 version_id;
147 	__le16 flags;
148 	__le32 reserved;
149 };
150 
151 #define HIDSPI_DEVICE_DESCRIPTOR_SIZE		sizeof(struct hidspi_dev_descriptor)
152 #define HIDSPI_INPUT_DEVICE_DESCRIPTOR_SIZE	\
153 	(HIDSPI_INPUT_BODY_HEADER_SIZE + HIDSPI_DEVICE_DESCRIPTOR_SIZE)
154 
155 #endif /* _HID_OVER_SPI_H_ */
156