1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3 * ChromeOS EC sensor hub
4 *
5 * Copyright (C) 2016 Google, Inc
6 */
7
8 #ifndef __CROS_EC_SENSORS_CORE_H
9 #define __CROS_EC_SENSORS_CORE_H
10
11 #include <linux/iio/iio.h>
12 #include <linux/irqreturn.h>
13 #include <linux/platform_data/cros_ec_commands.h>
14 #include <linux/platform_data/cros_ec_proto.h>
15
16 enum {
17 CROS_EC_SENSOR_X,
18 CROS_EC_SENSOR_Y,
19 CROS_EC_SENSOR_Z,
20 CROS_EC_SENSOR_MAX_AXIS,
21 };
22
23 /* EC returns sensor values using signed 16 bit registers */
24 #define CROS_EC_SENSOR_BITS 16
25
26 /*
27 * 4 16 bit channels are allowed.
28 * Good enough for current sensors, they use up to 3 16 bit vectors.
29 */
30 #define CROS_EC_SAMPLE_SIZE (sizeof(s64) * 2)
31
32 /* Minimum sampling period to use when device is suspending */
33 #define CROS_EC_MIN_SUSPEND_SAMPLING_FREQUENCY 1000 /* 1 second */
34
35 /**
36 * struct cros_ec_sensors_core_state - state data for EC sensors IIO driver
37 * @ec: cros EC device structure
38 * @cmd_lock: lock used to prevent simultaneous access to the
39 * commands.
40 * @msg: cros EC command structure
41 * @param: motion sensor parameters structure
42 * @resp: motion sensor response structure
43 * @type: type of motion sensor
44 * @loc: location where the motion sensor is placed
45 * @calib: calibration parameters. Note that trigger
46 * captured data will always provide the calibrated
47 * data
48 * @samples: static array to hold data from a single capture.
49 * For each channel we need 2 bytes, except for
50 * the timestamp. The timestamp is always last and
51 * is always 8-byte aligned.
52 * @read_ec_sensors_data: function used for accessing sensors values
53 * @cuur_sampl_freq: current sampling period
54 */
55 struct cros_ec_sensors_core_state {
56 struct cros_ec_device *ec;
57 struct mutex cmd_lock;
58
59 struct cros_ec_command *msg;
60 struct ec_params_motion_sense param;
61 struct ec_response_motion_sense *resp;
62
63 enum motionsensor_type type;
64 enum motionsensor_location loc;
65
66 struct calib_data {
67 s16 offset;
68 u16 scale;
69 } calib[CROS_EC_SENSOR_MAX_AXIS];
70 s8 sign[CROS_EC_SENSOR_MAX_AXIS];
71 u8 samples[CROS_EC_SAMPLE_SIZE];
72
73 int (*read_ec_sensors_data)(struct iio_dev *indio_dev,
74 unsigned long scan_mask, s16 *data);
75
76 int curr_sampl_freq;
77
78 /* Table of known available frequencies : 0, Min and Max in mHz */
79 int frequencies[3];
80 };
81
82 /**
83 * cros_ec_sensors_read_lpc() - retrieve data from EC shared memory
84 * @indio_dev: pointer to IIO device
85 * @scan_mask: bitmap of the sensor indices to scan
86 * @data: location to store data
87 *
88 * This is the safe function for reading the EC data. It guarantees that the
89 * data sampled was not modified by the EC while being read.
90 *
91 * Return: 0 on success, -errno on failure.
92 */
93 int cros_ec_sensors_read_lpc(struct iio_dev *indio_dev, unsigned long scan_mask,
94 s16 *data);
95
96 /**
97 * cros_ec_sensors_read_cmd() - retrieve data using the EC command protocol
98 * @indio_dev: pointer to IIO device
99 * @scan_mask: bitmap of the sensor indices to scan
100 * @data: location to store data
101 *
102 * Return: 0 on success, -errno on failure.
103 */
104 int cros_ec_sensors_read_cmd(struct iio_dev *indio_dev, unsigned long scan_mask,
105 s16 *data);
106
107 struct platform_device;
108 /**
109 * cros_ec_sensors_core_init() - basic initialization of the core structure
110 * @pdev: platform device created for the sensors
111 * @indio_dev: iio device structure of the device
112 * @physical_device: true if the device refers to a physical device
113 *
114 * Return: 0 on success, -errno on failure.
115 */
116 int cros_ec_sensors_core_init(struct platform_device *pdev,
117 struct iio_dev *indio_dev, bool physical_device);
118
119 /**
120 * cros_ec_sensors_capture() - the trigger handler function
121 * @irq: the interrupt number.
122 * @p: a pointer to the poll function.
123 *
124 * On a trigger event occurring, if the pollfunc is attached then this
125 * handler is called as a threaded interrupt (and hence may sleep). It
126 * is responsible for grabbing data from the device and pushing it into
127 * the associated buffer.
128 *
129 * Return: IRQ_HANDLED
130 */
131 irqreturn_t cros_ec_sensors_capture(int irq, void *p);
132
133 /**
134 * cros_ec_motion_send_host_cmd() - send motion sense host command
135 * @st: pointer to state information for device
136 * @opt_length: optional length to reduce the response size, useful on the data
137 * path. Otherwise, the maximal allowed response size is used
138 *
139 * When called, the sub-command is assumed to be set in param->cmd.
140 *
141 * Return: 0 on success, -errno on failure.
142 */
143 int cros_ec_motion_send_host_cmd(struct cros_ec_sensors_core_state *st,
144 u16 opt_length);
145
146 /**
147 * cros_ec_sensors_core_read() - function to request a value from the sensor
148 * @st: pointer to state information for device
149 * @chan: channel specification structure table
150 * @val: will contain one element making up the returned value
151 * @val2: will contain another element making up the returned value
152 * @mask: specifies which values to be requested
153 *
154 * Return: the type of value returned by the device
155 */
156 int cros_ec_sensors_core_read(struct cros_ec_sensors_core_state *st,
157 struct iio_chan_spec const *chan,
158 int *val, int *val2, long mask);
159
160 /**
161 * cros_ec_sensors_core_read_avail() - get available values
162 * @indio_dev: pointer to state information for device
163 * @chan: channel specification structure table
164 * @vals: list of available values
165 * @type: type of data returned
166 * @length: number of data returned in the array
167 * @mask: specifies which values to be requested
168 *
169 * Return: an error code, IIO_AVAIL_RANGE or IIO_AVAIL_LIST
170 */
171 int cros_ec_sensors_core_read_avail(struct iio_dev *indio_dev,
172 struct iio_chan_spec const *chan,
173 const int **vals,
174 int *type,
175 int *length,
176 long mask);
177
178 /**
179 * cros_ec_sensors_core_write() - function to write a value to the sensor
180 * @st: pointer to state information for device
181 * @chan: channel specification structure table
182 * @val: first part of value to write
183 * @val2: second part of value to write
184 * @mask: specifies which values to write
185 *
186 * Return: the type of value returned by the device
187 */
188 int cros_ec_sensors_core_write(struct cros_ec_sensors_core_state *st,
189 struct iio_chan_spec const *chan,
190 int val, int val2, long mask);
191
192 extern const struct dev_pm_ops cros_ec_sensors_pm_ops;
193
194 /* List of extended channel specification for all sensors */
195 extern const struct iio_chan_spec_ext_info cros_ec_sensors_ext_info[];
196
197 #endif /* __CROS_EC_SENSORS_CORE_H */