xref: /OK3568_Linux_fs/kernel/include/linux/hid-sensor-hub.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * HID Sensors Driver
4*4882a593Smuzhiyun  * Copyright (c) 2012, Intel Corporation.
5*4882a593Smuzhiyun  */
6*4882a593Smuzhiyun #ifndef _HID_SENSORS_HUB_H
7*4882a593Smuzhiyun #define _HID_SENSORS_HUB_H
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #include <linux/hid.h>
10*4882a593Smuzhiyun #include <linux/hid-sensor-ids.h>
11*4882a593Smuzhiyun #include <linux/iio/iio.h>
12*4882a593Smuzhiyun #include <linux/iio/trigger.h>
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun /**
15*4882a593Smuzhiyun  * struct hid_sensor_hub_attribute_info - Attribute info
16*4882a593Smuzhiyun  * @usage_id:		Parent usage id of a physical device.
17*4882a593Smuzhiyun  * @attrib_id:		Attribute id for this attribute.
18*4882a593Smuzhiyun  * @report_id:		Report id in which this information resides.
19*4882a593Smuzhiyun  * @index:		Field index in the report.
20*4882a593Smuzhiyun  * @units:		Measurment unit for this attribute.
21*4882a593Smuzhiyun  * @unit_expo:		Exponent used in the data.
22*4882a593Smuzhiyun  * @size:		Size in bytes for data size.
23*4882a593Smuzhiyun  * @logical_minimum:	Logical minimum value for this attribute.
24*4882a593Smuzhiyun  * @logical_maximum:	Logical maximum value for this attribute.
25*4882a593Smuzhiyun  */
26*4882a593Smuzhiyun struct hid_sensor_hub_attribute_info {
27*4882a593Smuzhiyun 	u32 usage_id;
28*4882a593Smuzhiyun 	u32 attrib_id;
29*4882a593Smuzhiyun 	s32 report_id;
30*4882a593Smuzhiyun 	s32 index;
31*4882a593Smuzhiyun 	s32 units;
32*4882a593Smuzhiyun 	s32 unit_expo;
33*4882a593Smuzhiyun 	s32 size;
34*4882a593Smuzhiyun 	s32 logical_minimum;
35*4882a593Smuzhiyun 	s32 logical_maximum;
36*4882a593Smuzhiyun };
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun /**
39*4882a593Smuzhiyun  * struct sensor_hub_pending - Synchronous read pending information
40*4882a593Smuzhiyun  * @status:		Pending status true/false.
41*4882a593Smuzhiyun  * @ready:		Completion synchronization data.
42*4882a593Smuzhiyun  * @usage_id:		Usage id for physical device, E.g. Gyro usage id.
43*4882a593Smuzhiyun  * @attr_usage_id:	Usage Id of a field, E.g. X-AXIS for a gyro.
44*4882a593Smuzhiyun  * @raw_size:		Response size for a read request.
45*4882a593Smuzhiyun  * @raw_data:		Place holder for received response.
46*4882a593Smuzhiyun  */
47*4882a593Smuzhiyun struct sensor_hub_pending {
48*4882a593Smuzhiyun 	bool status;
49*4882a593Smuzhiyun 	struct completion ready;
50*4882a593Smuzhiyun 	u32 usage_id;
51*4882a593Smuzhiyun 	u32 attr_usage_id;
52*4882a593Smuzhiyun 	int raw_size;
53*4882a593Smuzhiyun 	u8  *raw_data;
54*4882a593Smuzhiyun };
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun /**
57*4882a593Smuzhiyun  * struct hid_sensor_hub_device - Stores the hub instance data
58*4882a593Smuzhiyun  * @hdev:		Stores the hid instance.
59*4882a593Smuzhiyun  * @vendor_id:		Vendor id of hub device.
60*4882a593Smuzhiyun  * @product_id:		Product id of hub device.
61*4882a593Smuzhiyun  * @usage:		Usage id for this hub device instance.
62*4882a593Smuzhiyun  * @start_collection_index: Starting index for a phy type collection
63*4882a593Smuzhiyun  * @end_collection_index: Last index for a phy type collection
64*4882a593Smuzhiyun  * @mutex_ptr:		synchronizing mutex pointer.
65*4882a593Smuzhiyun  * @pending:		Holds information of pending sync read request.
66*4882a593Smuzhiyun  */
67*4882a593Smuzhiyun struct hid_sensor_hub_device {
68*4882a593Smuzhiyun 	struct hid_device *hdev;
69*4882a593Smuzhiyun 	u32 vendor_id;
70*4882a593Smuzhiyun 	u32 product_id;
71*4882a593Smuzhiyun 	u32 usage;
72*4882a593Smuzhiyun 	int start_collection_index;
73*4882a593Smuzhiyun 	int end_collection_index;
74*4882a593Smuzhiyun 	struct mutex *mutex_ptr;
75*4882a593Smuzhiyun 	struct sensor_hub_pending pending;
76*4882a593Smuzhiyun };
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun /**
79*4882a593Smuzhiyun  * struct hid_sensor_hub_callbacks - Client callback functions
80*4882a593Smuzhiyun  * @pdev:		Platform device instance of the client driver.
81*4882a593Smuzhiyun  * @suspend:		Suspend callback.
82*4882a593Smuzhiyun  * @resume:		Resume callback.
83*4882a593Smuzhiyun  * @capture_sample:	Callback to get a sample.
84*4882a593Smuzhiyun  * @send_event:		Send notification to indicate all samples are
85*4882a593Smuzhiyun  *			captured, process and send event
86*4882a593Smuzhiyun  */
87*4882a593Smuzhiyun struct hid_sensor_hub_callbacks {
88*4882a593Smuzhiyun 	struct platform_device *pdev;
89*4882a593Smuzhiyun 	int (*suspend)(struct hid_sensor_hub_device *hsdev, void *priv);
90*4882a593Smuzhiyun 	int (*resume)(struct hid_sensor_hub_device *hsdev, void *priv);
91*4882a593Smuzhiyun 	int (*capture_sample)(struct hid_sensor_hub_device *hsdev,
92*4882a593Smuzhiyun 			u32 usage_id, size_t raw_len, char *raw_data,
93*4882a593Smuzhiyun 			void *priv);
94*4882a593Smuzhiyun 	int (*send_event)(struct hid_sensor_hub_device *hsdev, u32 usage_id,
95*4882a593Smuzhiyun 			 void *priv);
96*4882a593Smuzhiyun };
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun /**
99*4882a593Smuzhiyun * sensor_hub_device_open() - Open hub device
100*4882a593Smuzhiyun * @hsdev:	Hub device instance.
101*4882a593Smuzhiyun *
102*4882a593Smuzhiyun * Used to open hid device for sensor hub.
103*4882a593Smuzhiyun */
104*4882a593Smuzhiyun int sensor_hub_device_open(struct hid_sensor_hub_device *hsdev);
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun /**
107*4882a593Smuzhiyun * sensor_hub_device_clode() - Close hub device
108*4882a593Smuzhiyun * @hsdev:	Hub device instance.
109*4882a593Smuzhiyun *
110*4882a593Smuzhiyun * Used to clode hid device for sensor hub.
111*4882a593Smuzhiyun */
112*4882a593Smuzhiyun void sensor_hub_device_close(struct hid_sensor_hub_device *hsdev);
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun /* Registration functions */
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun /**
117*4882a593Smuzhiyun * sensor_hub_register_callback() - Register client callbacks
118*4882a593Smuzhiyun * @hsdev:	Hub device instance.
119*4882a593Smuzhiyun * @usage_id:	Usage id of the client (E.g. 0x200076 for Gyro).
120*4882a593Smuzhiyun * @usage_callback: Callback function storage
121*4882a593Smuzhiyun *
122*4882a593Smuzhiyun * Used to register callbacks by client processing drivers. Sensor
123*4882a593Smuzhiyun * hub core driver will call these callbacks to offload processing
124*4882a593Smuzhiyun * of data streams and notifications.
125*4882a593Smuzhiyun */
126*4882a593Smuzhiyun int sensor_hub_register_callback(struct hid_sensor_hub_device *hsdev,
127*4882a593Smuzhiyun 			u32 usage_id,
128*4882a593Smuzhiyun 			struct hid_sensor_hub_callbacks *usage_callback);
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun /**
131*4882a593Smuzhiyun * sensor_hub_remove_callback() - Remove client callbacks
132*4882a593Smuzhiyun * @hsdev:	Hub device instance.
133*4882a593Smuzhiyun * @usage_id:	Usage id of the client (E.g. 0x200076 for Gyro).
134*4882a593Smuzhiyun *
135*4882a593Smuzhiyun * If there is a callback registred, this call will remove that
136*4882a593Smuzhiyun * callbacks, so that it will stop data and event notifications.
137*4882a593Smuzhiyun */
138*4882a593Smuzhiyun int sensor_hub_remove_callback(struct hid_sensor_hub_device *hsdev,
139*4882a593Smuzhiyun 			u32 usage_id);
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun /* Hid sensor hub core interfaces */
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun /**
145*4882a593Smuzhiyun * sensor_hub_input_get_attribute_info() - Get an attribute information
146*4882a593Smuzhiyun * @hsdev:	Hub device instance.
147*4882a593Smuzhiyun * @type:	Type of this attribute, input/output/feature
148*4882a593Smuzhiyun * @usage_id:	Attribute usage id of parent physical device as per spec
149*4882a593Smuzhiyun * @attr_usage_id:	Attribute usage id as per spec
150*4882a593Smuzhiyun * @info:	return information about attribute after parsing report
151*4882a593Smuzhiyun *
152*4882a593Smuzhiyun * Parses report and returns the attribute information such as report id,
153*4882a593Smuzhiyun * field index, units and exponet etc.
154*4882a593Smuzhiyun */
155*4882a593Smuzhiyun int sensor_hub_input_get_attribute_info(struct hid_sensor_hub_device *hsdev,
156*4882a593Smuzhiyun 			u8 type,
157*4882a593Smuzhiyun 			u32 usage_id, u32 attr_usage_id,
158*4882a593Smuzhiyun 			struct hid_sensor_hub_attribute_info *info);
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun /**
161*4882a593Smuzhiyun * sensor_hub_input_attr_get_raw_value() - Synchronous read request
162*4882a593Smuzhiyun * @hsdev:	Hub device instance.
163*4882a593Smuzhiyun * @usage_id:	Attribute usage id of parent physical device as per spec
164*4882a593Smuzhiyun * @attr_usage_id:	Attribute usage id as per spec
165*4882a593Smuzhiyun * @report_id:	Report id to look for
166*4882a593Smuzhiyun * @flag:      Synchronous or asynchronous read
167*4882a593Smuzhiyun * @is_signed:   If true then fields < 32 bits will be sign-extended
168*4882a593Smuzhiyun *
169*4882a593Smuzhiyun * Issues a synchronous or asynchronous read request for an input attribute.
170*4882a593Smuzhiyun * Returns data upto 32 bits.
171*4882a593Smuzhiyun */
172*4882a593Smuzhiyun 
173*4882a593Smuzhiyun enum sensor_hub_read_flags {
174*4882a593Smuzhiyun 	SENSOR_HUB_SYNC,
175*4882a593Smuzhiyun 	SENSOR_HUB_ASYNC,
176*4882a593Smuzhiyun };
177*4882a593Smuzhiyun 
178*4882a593Smuzhiyun int sensor_hub_input_attr_get_raw_value(struct hid_sensor_hub_device *hsdev,
179*4882a593Smuzhiyun  					u32 usage_id,
180*4882a593Smuzhiyun  					u32 attr_usage_id, u32 report_id,
181*4882a593Smuzhiyun 					enum sensor_hub_read_flags flag,
182*4882a593Smuzhiyun 					bool is_signed
183*4882a593Smuzhiyun );
184*4882a593Smuzhiyun 
185*4882a593Smuzhiyun /**
186*4882a593Smuzhiyun * sensor_hub_set_feature() - Feature set request
187*4882a593Smuzhiyun * @hsdev:	Hub device instance.
188*4882a593Smuzhiyun * @report_id:	Report id to look for
189*4882a593Smuzhiyun * @field_index:	Field index inside a report
190*4882a593Smuzhiyun * @buffer_size: size of the buffer
191*4882a593Smuzhiyun * @buffer:	buffer to use in the feature set
192*4882a593Smuzhiyun *
193*4882a593Smuzhiyun * Used to set a field in feature report. For example this can set polling
194*4882a593Smuzhiyun * interval, sensitivity, activate/deactivate state.
195*4882a593Smuzhiyun */
196*4882a593Smuzhiyun int sensor_hub_set_feature(struct hid_sensor_hub_device *hsdev, u32 report_id,
197*4882a593Smuzhiyun 			   u32 field_index, int buffer_size, void *buffer);
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun /**
200*4882a593Smuzhiyun * sensor_hub_get_feature() - Feature get request
201*4882a593Smuzhiyun * @hsdev:	Hub device instance.
202*4882a593Smuzhiyun * @report_id:	Report id to look for
203*4882a593Smuzhiyun * @field_index:	Field index inside a report
204*4882a593Smuzhiyun * @buffer_size:	size of the buffer
205*4882a593Smuzhiyun * @buffer:	buffer to copy output
206*4882a593Smuzhiyun *
207*4882a593Smuzhiyun * Used to get a field in feature report. For example this can get polling
208*4882a593Smuzhiyun * interval, sensitivity, activate/deactivate state. On success it returns
209*4882a593Smuzhiyun * number of bytes copied to buffer. On failure, it returns value < 0.
210*4882a593Smuzhiyun */
211*4882a593Smuzhiyun int sensor_hub_get_feature(struct hid_sensor_hub_device *hsdev, u32 report_id,
212*4882a593Smuzhiyun 			   u32 field_index, int buffer_size, void *buffer);
213*4882a593Smuzhiyun 
214*4882a593Smuzhiyun /* hid-sensor-attributes */
215*4882a593Smuzhiyun 
216*4882a593Smuzhiyun /* Common hid sensor iio structure */
217*4882a593Smuzhiyun struct hid_sensor_common {
218*4882a593Smuzhiyun 	struct hid_sensor_hub_device *hsdev;
219*4882a593Smuzhiyun 	struct platform_device *pdev;
220*4882a593Smuzhiyun 	unsigned usage_id;
221*4882a593Smuzhiyun 	atomic_t data_ready;
222*4882a593Smuzhiyun 	atomic_t user_requested_state;
223*4882a593Smuzhiyun 	atomic_t runtime_pm_enable;
224*4882a593Smuzhiyun 	int poll_interval;
225*4882a593Smuzhiyun 	int raw_hystersis;
226*4882a593Smuzhiyun 	int latency_ms;
227*4882a593Smuzhiyun 	struct iio_trigger *trigger;
228*4882a593Smuzhiyun 	int timestamp_ns_scale;
229*4882a593Smuzhiyun 	struct hid_sensor_hub_attribute_info poll;
230*4882a593Smuzhiyun 	struct hid_sensor_hub_attribute_info report_state;
231*4882a593Smuzhiyun 	struct hid_sensor_hub_attribute_info power_state;
232*4882a593Smuzhiyun 	struct hid_sensor_hub_attribute_info sensitivity;
233*4882a593Smuzhiyun 	struct hid_sensor_hub_attribute_info report_latency;
234*4882a593Smuzhiyun 	struct work_struct work;
235*4882a593Smuzhiyun };
236*4882a593Smuzhiyun 
237*4882a593Smuzhiyun /* Convert from hid unit expo to regular exponent */
hid_sensor_convert_exponent(int unit_expo)238*4882a593Smuzhiyun static inline int hid_sensor_convert_exponent(int unit_expo)
239*4882a593Smuzhiyun {
240*4882a593Smuzhiyun 	if (unit_expo < 0x08)
241*4882a593Smuzhiyun 		return unit_expo;
242*4882a593Smuzhiyun 	else if (unit_expo <= 0x0f)
243*4882a593Smuzhiyun 		return -(0x0f-unit_expo+1);
244*4882a593Smuzhiyun 	else
245*4882a593Smuzhiyun 		return 0;
246*4882a593Smuzhiyun }
247*4882a593Smuzhiyun 
248*4882a593Smuzhiyun int hid_sensor_parse_common_attributes(struct hid_sensor_hub_device *hsdev,
249*4882a593Smuzhiyun 					u32 usage_id,
250*4882a593Smuzhiyun 					struct hid_sensor_common *st);
251*4882a593Smuzhiyun int hid_sensor_write_raw_hyst_value(struct hid_sensor_common *st,
252*4882a593Smuzhiyun 					int val1, int val2);
253*4882a593Smuzhiyun int hid_sensor_read_raw_hyst_value(struct hid_sensor_common *st,
254*4882a593Smuzhiyun 					int *val1, int *val2);
255*4882a593Smuzhiyun int hid_sensor_write_samp_freq_value(struct hid_sensor_common *st,
256*4882a593Smuzhiyun 					int val1, int val2);
257*4882a593Smuzhiyun int hid_sensor_read_samp_freq_value(struct hid_sensor_common *st,
258*4882a593Smuzhiyun 					int *val1, int *val2);
259*4882a593Smuzhiyun 
260*4882a593Smuzhiyun int hid_sensor_get_usage_index(struct hid_sensor_hub_device *hsdev,
261*4882a593Smuzhiyun 				u32 report_id, int field_index, u32 usage_id);
262*4882a593Smuzhiyun 
263*4882a593Smuzhiyun int hid_sensor_format_scale(u32 usage_id,
264*4882a593Smuzhiyun 			    struct hid_sensor_hub_attribute_info *attr_info,
265*4882a593Smuzhiyun 			    int *val0, int *val1);
266*4882a593Smuzhiyun 
267*4882a593Smuzhiyun s32 hid_sensor_read_poll_value(struct hid_sensor_common *st);
268*4882a593Smuzhiyun 
269*4882a593Smuzhiyun int64_t hid_sensor_convert_timestamp(struct hid_sensor_common *st,
270*4882a593Smuzhiyun 				     int64_t raw_value);
271*4882a593Smuzhiyun bool hid_sensor_batch_mode_supported(struct hid_sensor_common *st);
272*4882a593Smuzhiyun int hid_sensor_set_report_latency(struct hid_sensor_common *st, int latency);
273*4882a593Smuzhiyun int hid_sensor_get_report_latency(struct hid_sensor_common *st);
274*4882a593Smuzhiyun 
275*4882a593Smuzhiyun #endif
276