94b34458403f64998ed2cfe8870ac7380fa0dae3
[linux-3.10.git] / include / linux / nvs.h
1 /* Copyright (c) 2014-2015, NVIDIA CORPORATION.  All rights reserved.
2  *
3  * This software is licensed under the terms of the GNU General Public
4  * License version 2, as published by the Free Software Foundation, and
5  * may be copied, distributed, and modified under those terms.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  */
12
13
14 #ifndef _NVS_H_
15 #define _NVS_H_
16
17 #include <linux/device.h>
18 #include <linux/regulator/consumer.h>
19
20 #define NVS_STS_SHUTDOWN                (1 << 0)
21 #define NVS_STS_SUSPEND                 (1 << 1)
22 #define NVS_STS_SYS_N                   (2)
23
24 #define NVS_STS_SPEW_MSG                (1 << (NVS_STS_SYS_N + 0))
25 #define NVS_STS_SPEW_DATA               (1 << (NVS_STS_SYS_N + 1))
26 #define NVS_STS_SPEW_BUF                (1 << (NVS_STS_SYS_N + 2))
27 #define NVS_STS_SPEW_IRQ                (1 << (NVS_STS_SYS_N + 3))
28 #define NVS_STS_SPEW_COMMON             (NVS_STS_SPEW_MSG | \
29                                         NVS_STS_SPEW_DATA | \
30                                         NVS_STS_SPEW_BUF | \
31                                         NVS_STS_SPEW_IRQ)
32 #define NVS_STS_DBG_N                   (NVS_STS_SYS_N + 4)
33 #define NVS_STS_EXT_N                   (NVS_STS_DBG_N)
34
35 #define NVS_CHANNEL_N_MAX               (5)
36 #define NVS_FLOAT_SIGNIFICANCE_MICRO    (1000000) /* IIO_VAL_INT_PLUS_MICRO */
37 #define NVS_FLOAT_SIGNIFICANCE_NANO     (1000000000) /* IIO_VAL_INT_PLUS_NANO */
38
39 /* from AOS sensors.h */
40 #define SENSOR_TYPE_ACCELEROMETER               (1)
41 #define SENSOR_TYPE_MAGNETIC_FIELD              (2)
42 #define SENSOR_TYPE_ORIENTATION                 (3)
43 #define SENSOR_TYPE_GYROSCOPE                   (4)
44 #define SENSOR_TYPE_LIGHT                       (5)
45 #define SENSOR_TYPE_PRESSURE                    (6)
46 #define SENSOR_TYPE_TEMPERATURE                 (7)
47 #define SENSOR_TYPE_PROXIMITY                   (8)
48 #define SENSOR_TYPE_GRAVITY                     (9)
49 #define SENSOR_TYPE_LINEAR_ACCELERATION         (10)
50 #define SENSOR_TYPE_ROTATION_VECTOR             (11)
51 #define SENSOR_TYPE_RELATIVE_HUMIDITY           (12)
52 #define SENSOR_TYPE_AMBIENT_TEMPERATURE         (13)
53 #define SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED (14)
54 #define SENSOR_TYPE_GAME_ROTATION_VECTOR        (15)
55 #define SENSOR_TYPE_GYROSCOPE_UNCALIBRATED      (16)
56 #define SENSOR_TYPE_SIGNIFICANT_MOTION          (17)
57 #define SENSOR_TYPE_STEP_DETECTOR               (18)
58 #define SENSOR_TYPE_STEP_COUNTER                (19)
59 #define SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR (20)
60 #define SENSOR_TYPE_HEART_RATE                  (21)
61 #define SENSOR_TYPE_TILT_DETECTOR               (22)
62 #define SENSOR_TYPE_WAKE_GESTURE                (23)
63 #define SENSOR_TYPE_GLANCE_GESTURE              (24)
64 #define SENSOR_TYPE_PICK_UP_GESTURE             (25)
65 /* from AOS sensors.h */
66 #define SENSOR_FLAG_WAKE_UP                     (0x1)
67 #define SENSOR_FLAG_ON_CHANGE_MODE              (0x2)
68 #define SENSOR_FLAG_ONE_SHOT_MODE               (0x4)
69 #define SENSOR_FLAG_SPECIAL_REPORTING_MODE      (0x6)
70 /* end AOS sensors.h */
71 #define SENSOR_FLAG_READONLY_MASK       (0xE) /* unconfigurable flags */
72
73 enum nvs_float_significance {
74         NVS_FLOAT_MICRO                 = 0, /* IIO_VAL_INT_PLUS_MICRO */
75         NVS_FLOAT_NANO,                 /* IIO_VAL_INT_PLUS_NANO */
76         NVS_FLOAT_N_MAX,
77 };
78
79 struct nvs_float {
80         int ival;
81         int fval;
82 };
83
84 struct sensor_cfg {
85         const char *name;               /* sensor name */
86         int snsr_id;                    /* sensor ID */
87         int kbuf_sz;                    /* kernel buffer size (n bytes) */
88         int timestamp_sz;               /* hub: timestamp size (n bytes) */
89         int snsr_data_n;                /* hub: number of data bytes */
90         unsigned int ch_n;              /* number of channels */
91         int ch_sz;                      /* channel size (n bytes) */
92         void *ch_inf;                   /* if hub then NULL */
93         /* the following is for android struct sensor_t */
94         const char *part;
95         const char *vendor;
96         int version;
97         struct nvs_float max_range;
98         struct nvs_float resolution;
99         struct nvs_float milliamp;
100         int delay_us_min;
101         int delay_us_max;
102         unsigned int fifo_rsrv_evnt_cnt;
103         unsigned int fifo_max_evnt_cnt;
104         unsigned int flags;
105         /* end of android struct sensor_t data */
106         signed char matrix[9];          /* device orientation on platform */
107         /* interpolation calibration */
108         int uncal_lo;
109         int uncal_hi;
110         int cal_lo;
111         int cal_hi;
112         /* thresholds */
113         int thresh_lo;
114         int thresh_hi;
115         int report_n;                   /* report count for on-change sensor */
116         enum nvs_float_significance float_significance;
117         /* global scale/offset allows for a 1st order polynomial on the data
118          * e.g. data * scale + offset
119          */
120         struct nvs_float scale;
121         struct nvs_float offset;
122         unsigned int ch_n_max;          /* NVS_CHANNEL_N_MAX */
123         /* channel scale/offset allows for a 1st order polynomial per channel
124          * e.g. channel_data * channel_scale + channel_offset
125          */
126         struct nvs_float scales[NVS_CHANNEL_N_MAX];
127         struct nvs_float offsets[NVS_CHANNEL_N_MAX];
128 };
129
130 struct nvs_fn_dev {
131 /**
132  * enable - enable/disable the device
133  * @client: clients private data
134  * @snsr_id: sensor ID
135  * @enable: 0 = off
136  *          1 = on
137  *          -1 = query status
138  *
139  * Returns device enable state or a negative error code.
140  *
141  * Note that the enable value may be a bitmap of the enabled
142  * channel.
143  */
144         int (*enable)(void *client, int snsr_id, int enable);
145 /**
146  * batch - see Android definition of batch
147  * http://source.android.com/devices/sensors/batching.html
148  * @client: clients private data
149  * @snsr_id: sensor ID
150  * @flags: see Android definition of flags (currently obsolete)
151  * @period: period timeout in microseconds
152  * @timeout: batch timeout in microseconds
153  *
154  * Returns 0 on success or a negative error code.
155  *
156  * Note that period should be implemented for setting delay if
157  * batching is not supported.
158  */
159         int (*batch)(void *client, int snsr_id, int flags,
160                      unsigned int period, unsigned int timeout);
161 /**
162  * flush - see Android definition of flush
163  * http://source.android.com/devices/sensors/batching.html
164  * @client: clients private data
165  * @snsr_id: sensor ID
166  *
167  * Returns 0 on success or a negative error code.
168  *
169  * Note that if not implemented at the device level, it is
170  * implemented in the NVS layer.  In other words, if the device
171  * does not support batching, leave this NULL.
172  */
173         int (*flush)(void *client, int snsr_id);
174 /**
175  * resolution - set device resolution
176  * @client: clients private data
177  * @snsr_id: sensor ID
178  * @resolution: resolution value
179  *
180  * Returns 0 on success or a negative error code.
181  * If a value > 0 is returned then sensor_cfg->resolution is
182  * updated as described in the below note.  This allows drivers
183  * with multiple sensors to only have to implement the device
184  * specific function for certain sensors and allow the NVS
185  * layer to handle the others.
186  *
187  * Note that if not implemented, resolution changes will change
188  * sensor_cfg->resolution.  If implemented, it is expected
189  * that the resolution value will be device-specific. In other
190  * words, only the device layer will understand the value which
191  * will typically be used to change the mode.
192  */
193         int (*resolution)(void *client, int snsr_id, int resolution);
194 /**
195  * max_range - set device max_range
196  * @client: clients private data
197  * @snsr_id: sensor ID
198  * @max_range: max_range value
199  *
200  * Returns 0 on success or a negative error code.
201  * If a value > 0 is returned then sensor_cfg->max_range is
202  * updated as described in the below note.  This allows drivers
203  * with multiple sensors to only have to implement the device
204  * specific function for certain sensors and allow the NVS
205  * layer to handle the others.
206  *
207  * Note that if not implemented, max_range changes will change
208  * sensor_cfg->max_range.  If implemented, it is expected
209  * that the max_range value will be device-specific. In other
210  * words, only the device layer will understand the value which
211  * will typically be used to change the mode.
212  */
213         int (*max_range)(void *client, int snsr_id, int max_range);
214 /**
215  * scale - set device scale
216  * @client: clients private data
217  * @snsr_id: sensor ID
218  * @channel: channel index
219  * @scale: scale value
220  *
221  * Returns 0 on success or a negative error code.
222  * If a value > 0 is returned then sensor_cfg->scale is updated
223  * as described in the below note.  This allows drivers with
224  * multiple sensors to only have to implement the device
225  * specific function for certain sensors and allow the NVS
226  * layer to handle the others.
227  *
228  * Note that if not implemented, scale changes will change
229  * sensor_cfg->scale.  If implemented, it is expected
230  * that the scale value will be device-specific. In other words,
231  * only the device layer will understand the value which will
232  * typically be used to change the mode.
233  */
234         int (*scale)(void *client, int snsr_id, int channel, int scale);
235 /**
236  * offset - set device offset
237  * @client: clients private data
238  * @snsr_id: sensor ID
239  * @channel: channel index
240  * @offset: offset value
241  *
242  * Returns 0 on success or a negative error code.
243  * If a value > 0 is returned then sensor_cfg->offset is updated
244  * as described in the below note.  This allows drivers with
245  * multiple sensors to only have to implement the device
246  * specific function for certain sensors and allow the NVS
247  * layer to handle the others.
248  *
249  * Note that if not implemented, offset changes will change
250  * sensor_cfg->offset.  If implemented, it is expected
251  * that the offset value will be device-specific. In other
252  * words, only the device layer will understand the value which
253  * will typically be used to set calibration.
254  */
255         int (*offset)(void *client, int snsr_id, int channel, int offset);
256 /**
257  * thresh_lo - set device low threshold
258  * @client: clients private data
259  * @snsr_id: sensor ID
260  * @thresh_lo: low threshold value
261  *
262  * Returns 0 on success or a negative error code.
263  * If a value > 0 is returned then sensor_cfg->thresh_lo is
264  * updated as described in the below note.  This allows drivers
265  * with multiple sensors to only have to implement the device
266  * specific function for certain sensors and allow the NVS
267  * layer to handle the others.
268  *
269  * Note that if not implemented, thresh_lo changes will change
270  * sensor_cfg->thresh_lo.  If implemented, it is expected
271  * that the thresh_lo value will be device-specific. In other
272  * words, only the device layer will understand the value.
273  */
274         int (*thresh_lo)(void *client, int snsr_id, int thresh_lo);
275 /**
276  * thresh_hi - set device high threshold
277  * @client: clients private data
278  * @snsr_id: sensor ID
279  * @thresh_hi: high threshold value
280  *
281  * Returns 0 on success or a negative error code.
282  * If a value > 0 is returned then sensor_cfg->thresh_hi is
283  * updated as described in the below note.  This allows drivers
284  * with multiple sensors to only have to implement the device
285  * specific function for certain sensors and allow the NVS
286  * layer to handle the others.
287  *
288  * Note that if not implemented, thresh_hi changes will change
289  * sensor_cfg->thresh_hi.  If implemented, it is expected
290  * that the thresh_hi value will be device-specific. In other
291  * words, only the device layer will understand the value.
292  */
293         int (*thresh_hi)(void *client, int snsr_id, int thresh_hi);
294 /**
295  * reset - device reset
296  * @client: clients private data
297  * @snsr_id: sensor ID
298  *
299  * Returns 0 on success or a negative error code.
300  *
301  * Note a < 0 value for snsr_id is another reset option,
302  * e.g. global device reset such as on a sensor hub.
303  * Note mutex is locked for this function.
304  */
305         int (*reset)(void *client, int snsr_id);
306 /**
307  * self_test - device self-test
308  * @client: clients private data
309  * @snsr_id: sensor ID
310  * @buf: character buffer to write to
311  *
312  * Returns 0 on success or a negative error code if buf == NULL.
313  * if buf != NULL, return number of characters.
314  * Note mutex is locked for this function.
315  */
316         int (*self_test)(void *client, int snsr_id, char *buf);
317 /**
318  * regs - device register dump
319  * @client: clients private data
320  * @snsr_id: sensor ID
321  * @buf: character buffer to write to
322  *
323  * Returns buf count or a negative error code.
324  */
325         int (*regs)(void *client, int snsr_id, char *buf);
326 /**
327  * nvs_write - nvs attribute write extension
328  * @client: clients private data
329  * @snsr_id: sensor ID
330  * @nvs: value written to nvs attribute
331  *
332  * Returns 0 on success or a negative error code.
333  *
334  * Used to extend the functionality of the nvs attribute.
335  */
336         int (*nvs_write)(void *client, int snsr_id, unsigned int nvs);
337 /**
338  * nvs_read - nvs attribute read extension
339  * @client: clients private data
340  * @snsr_id: sensor ID
341  * @buf: character buffer to write to
342  *
343  * Returns buf count or a negative error code.
344  *
345  * Used to extend the functionality of the nvs attribute.
346  */
347         int (*nvs_read)(void *client, int snsr_id, char *buf);
348 /**
349  * sts - status flags
350  * used by both device and NVS layers
351  * See NVS_STS_ defines
352  */
353         unsigned int *sts;
354 /**
355  * errs - error counter
356  * used by both device and NVS layers
357  */
358         unsigned int *errs;
359 };
360
361 struct nvs_fn_if {
362         int (*probe)(void **handle, void *dev_client, struct device *dev,
363                      struct nvs_fn_dev *fn_dev, struct sensor_cfg *snsr_cfg);
364         int (*remove)(void *handle);
365         void (*shutdown)(void *handle);
366         void (*nvs_mutex_lock)(void *handle);
367         void (*nvs_mutex_unlock)(void *handle);
368         int (*suspend)(void *handle);
369         int (*resume)(void *handle);
370         int (*handler)(void *handle, void *buffer, s64 ts);
371 };
372
373 extern const char * const nvs_float_significances[];
374
375 struct nvs_fn_if *nvs_iio(void);
376 int nvs_of_dt(const struct device_node *np, struct sensor_cfg *cfg,
377               const char *dev_name);
378 int nvs_vreg_dis(struct device *dev, struct regulator_bulk_data *vreg);
379 int nvs_vregs_disable(struct device *dev, struct regulator_bulk_data *vregs,
380                       unsigned int vregs_n);
381 int nvs_vreg_en(struct device *dev, struct regulator_bulk_data *vreg);
382 int nvs_vregs_enable(struct device *dev, struct regulator_bulk_data *vregs,
383                      unsigned int vregs_n);
384 void nvs_vregs_exit(struct device *dev, struct regulator_bulk_data *vregs,
385                    unsigned int vregs_n);
386 int nvs_vregs_init(struct device *dev, struct regulator_bulk_data *vregs,
387                    unsigned int vregs_n, char **vregs_name);
388 int nvs_vregs_sts(struct regulator_bulk_data *vregs, unsigned int vregs_n);
389
390 #endif /* _NVS_H_ */