c5616f6d90ae2b6d7963edf99b27b318e89f5eb0
[firefly-linux-kernel-4.4.55.git] / include / linux / sensor-dev.h
1 /* include/linux/sensor-dev.h - sensor header file
2  *
3  * Copyright (C) 2012-2015 ROCKCHIP.
4  * Author: luowei <lw@rock-chips.com>
5  *
6  * This software is licensed under the terms of the GNU General Public
7  * License version 2, as published by the Free Software Foundation, and
8  * may be copied, distributed, and modified under those terms.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  */
16
17 #include <linux/miscdevice.h>
18 #ifdef CONFIG_HAS_EARLYSUSPEND
19 #include <linux/earlysuspend.h>
20 #endif
21
22 #include <dt-bindings/sensor-dev.h>
23
24 #define SENSOR_ON               1
25 #define SENSOR_OFF              0
26 #define SENSOR_UNKNOW_DATA      -1
27
28 #define GPIO_HIGH 1
29 #define GPIO_LOW 0
30
31 enum sensor_id {
32         ID_INVALID = 0,
33
34         ANGLE_ID_ALL,
35         ANGLE_ID_KXTIK,
36         ANGLE_ID_LIS3DH,
37
38         ACCEL_ID_ALL,
39         ACCEL_ID_LIS331,
40         ACCEL_ID_LSM303DLX,
41         ACCEL_ID_LIS3DH,
42         ACCEL_ID_KXSD9,
43         ACCEL_ID_KXTF9,
44         ACCEL_ID_KXTIK,
45         ACCEL_ID_KXTJ9,
46         ACCEL_ID_BMA150,
47         ACCEL_ID_BMA222,
48         ACCEL_ID_BMA250,
49         ACCEL_ID_ADXL34X,
50         ACCEL_ID_MMA8450,
51         ACCEL_ID_MMA845X,
52         ACCEL_ID_MMA7660,
53         ACCEL_ID_MPU6050,
54         ACCEL_ID_MXC6225,
55         ACCEL_ID_DMARD10,
56         ACCEL_ID_LSM303D,
57         ACCEL_ID_MC3230,
58         ACCEL_ID_MPU6880,
59         ACCEL_ID_MPU6500,
60         ACCEL_ID_LSM330,
61         COMPASS_ID_ALL,
62         COMPASS_ID_AK8975,
63         COMPASS_ID_AK8963,
64         COMPASS_ID_AK09911,
65         COMPASS_ID_AK8972,
66         COMPASS_ID_AMI30X,
67         COMPASS_ID_AMI306,
68         COMPASS_ID_YAS529,
69         COMPASS_ID_YAS530,
70         COMPASS_ID_HMC5883,
71         COMPASS_ID_LSM303DLH,
72         COMPASS_ID_LSM303DLM,
73         COMPASS_ID_MMC314X,
74         COMPASS_ID_HSCDTD002B,
75         COMPASS_ID_HSCDTD004A,
76
77         GYRO_ID_ALL,
78         GYRO_ID_L3G4200D,
79     GYRO_ID_L3G20D,
80         GYRO_ID_EWTSA,
81         GYRO_ID_K3G,
82         GYRO_ID_MPU6880,
83         GYRO_ID_LSM330,
84         LIGHT_ID_ALL,
85         LIGHT_ID_CM3217,
86         LIGHT_ID_CM3218,
87         LIGHT_ID_CM3232,
88         LIGHT_ID_AL3006,
89         LIGHT_ID_STK3171,
90         LIGHT_ID_ISL29023,
91         LIGHT_ID_AP321XX,
92         LIGHT_ID_PHOTORESISTOR,
93         LIGHT_ID_US5152,
94
95         PROXIMITY_ID_ALL,
96         PROXIMITY_ID_AL3006,
97         PROXIMITY_ID_STK3171,
98         PROXIMITY_ID_AP321XX,
99
100         TEMPERATURE_ID_ALL,
101         TEMPERATURE_ID_MS5607,
102
103         PRESSURE_ID_ALL,
104         PRESSURE_ID_BMA085,
105         PRESSURE_ID_MS5607,
106
107         HALL_ID_ALL,
108         HALL_ID_OCH165T,
109
110         SENSOR_NUM_ID,
111 };
112
113
114 struct sensor_axis {
115         int x;
116         int y;
117         int z;
118 };
119
120 struct sensor_flag {
121         atomic_t a_flag;
122         atomic_t m_flag;
123         atomic_t mv_flag;
124         atomic_t open_flag;
125         atomic_t debug_flag;
126         long long delay;
127         wait_queue_head_t open_wq;
128 };
129
130
131 struct sensor_operate {
132         char *name;
133         int type;
134         int     id_i2c;
135         int     range[2];
136         int     brightness[2];//backlight min_brightness max_brightness
137         int read_reg;
138         int read_len;
139         int id_reg;
140         int id_data;
141         int precision;
142         int ctrl_reg;
143         int ctrl_data;
144         int int_ctrl_reg;
145         int     int_status_reg;
146         int trig;       //intterupt trigger
147         int (*active)(struct i2c_client *client, int enable, int rate);
148         int (*init)(struct i2c_client *client);
149         int (*report)(struct i2c_client *client);
150         int (*suspend)(struct i2c_client *client);
151         int (*resume)(struct i2c_client *client);
152         struct miscdevice *misc_dev;
153
154 };
155
156
157 /* Platform data for the sensor */
158 struct sensor_private_data {
159         int type;
160         struct i2c_client *client;
161         struct input_dev *input_dev;
162         struct work_struct work;
163         struct delayed_work delaywork;  /*report second event*/
164         struct sensor_axis axis;
165         char sensor_data[40];           //max support40 bytes data
166         atomic_t data_ready;
167         wait_queue_head_t data_ready_wq;
168         struct mutex data_mutex;
169         struct mutex operation_mutex;
170         struct mutex sensor_mutex;
171         struct mutex i2c_mutex;
172         int status_cur;
173         int start_count;
174         int devid;
175         struct sensor_flag flags;
176         struct i2c_device_id *i2c_id;
177         struct sensor_platform_data *pdata;
178         struct sensor_operate *ops;
179         struct file_operations fops;
180         struct miscdevice miscdev;
181 #ifdef CONFIG_HAS_EARLYSUSPEND
182         struct  early_suspend early_suspend;
183 #endif
184 };
185
186 struct sensor_platform_data {
187         int type;
188         int irq;
189         int irq_pin;
190         int power_pin;
191         int reset_pin;
192         int standby_pin;
193         int irq_enable;         //if irq_enable=1 then use irq else use polling
194         int poll_delay_ms;      //polling
195         int x_min;              //filter
196         int y_min;
197         int z_min;
198         int factory;
199         int layout;
200         unsigned char address;
201         unsigned long irq_flags;
202         signed char orientation[9];
203         short m_layout[4][3][3];
204         int* project_name;
205         int power_off_in_suspend;
206 };
207
208  struct gsensor_platform_data {
209          u16 model;
210          u16 swap_xy;
211          u16 swap_xyz;
212          signed char orientation[9];
213          int (*get_pendown_state)(void);
214          int (*init_platform_hw)(void);
215          int (*gsensor_platform_sleep)(void);
216          int (*gsensor_platform_wakeup)(void);
217          void (*exit_platform_hw)(void);
218  };
219
220  struct akm8975_platform_data {
221          short m_layout[4][3][3];
222          char project_name[64];
223          int gpio_DRDY;
224  };
225
226  struct akm_platform_data {
227         short m_layout[4][3][3];
228         char project_name[64];
229         char layout;
230         char outbit;
231         int gpio_DRDY;
232         int gpio_RST;
233  };
234
235 extern int sensor_register_slave(int type,struct i2c_client *client,
236                         struct sensor_platform_data *slave_pdata,
237                         struct sensor_operate *(*get_sensor_ops)(void));
238
239
240 extern int sensor_unregister_slave(int type,struct i2c_client *client,
241                         struct sensor_platform_data *slave_pdata,
242                         struct sensor_operate *(*get_sensor_ops)(void));
243
244 #if 0
245 #define DBG(x...) if((atomic_read(&sensor->flags.debug_flag) == sensor->pdata->type) || (atomic_read(&sensor->flags.debug_flag) == SENSOR_NUM_TYPES))printk(x)
246 #else
247 #define DBG(x...)
248 #endif
249
250 #define GSENSOR_IOCTL_MAGIC                     'a'
251 #define GBUFF_SIZE                              12      /* Rx buffer size */
252
253 /* IOCTLs for MMA8452 library */
254 #define GSENSOR_IOCTL_INIT                      _IO(GSENSOR_IOCTL_MAGIC, 0x01)
255 #define GSENSOR_IOCTL_RESET                     _IO(GSENSOR_IOCTL_MAGIC, 0x04)
256 #define GSENSOR_IOCTL_CLOSE                     _IO(GSENSOR_IOCTL_MAGIC, 0x02)
257 #define GSENSOR_IOCTL_START                     _IO(GSENSOR_IOCTL_MAGIC, 0x03)
258 #define GSENSOR_IOCTL_GETDATA                   _IOR(GSENSOR_IOCTL_MAGIC, 0x08, char[GBUFF_SIZE+1])
259 /* IOCTLs for APPs */
260 #define GSENSOR_IOCTL_APP_SET_RATE              _IOW(GSENSOR_IOCTL_MAGIC, 0x10, char)
261
262
263 #define COMPASS_IOCTL_MAGIC                   'c'
264 /* IOCTLs for APPs */
265 #define ECS_IOCTL_APP_SET_MODE          _IOW(COMPASS_IOCTL_MAGIC, 0x10, short)
266 #define ECS_IOCTL_APP_SET_MFLAG         _IOW(COMPASS_IOCTL_MAGIC, 0x11, short)
267 #define ECS_IOCTL_APP_GET_MFLAG         _IOW(COMPASS_IOCTL_MAGIC, 0x12, short)
268 #define ECS_IOCTL_APP_SET_AFLAG         _IOW(COMPASS_IOCTL_MAGIC, 0x13, short)
269 #define ECS_IOCTL_APP_GET_AFLAG         _IOR(COMPASS_IOCTL_MAGIC, 0x14, short)
270 #define ECS_IOCTL_APP_SET_TFLAG         _IOR(COMPASS_IOCTL_MAGIC, 0x15, short)/* NOT use */
271 #define ECS_IOCTL_APP_GET_TFLAG         _IOR(COMPASS_IOCTL_MAGIC, 0x16, short)/* NOT use */
272 #define ECS_IOCTL_APP_RESET_PEDOMETER   _IOW(COMPASS_IOCTL_MAGIC, 0x17) /* NOT use */
273 #define ECS_IOCTL_APP_SET_DELAY         _IOW(COMPASS_IOCTL_MAGIC, 0x18, short)
274 #define ECS_IOCTL_APP_SET_MVFLAG        _IOW(COMPASS_IOCTL_MAGIC, 0x19, short)
275 #define ECS_IOCTL_APP_GET_MVFLAG        _IOR(COMPASS_IOCTL_MAGIC, 0x1A, short)
276 #define ECS_IOCTL_APP_GET_DELAY         _IOR(COMPASS_IOCTL_MAGIC, 0x1B, short)
277
278 #ifdef CONFIG_COMPAT
279 #define COMPAT_ECS_IOCTL_APP_SET_MODE          _IOW(COMPASS_IOCTL_MAGIC, 0x10, compat_short_t)
280 #define COMPAT_ECS_IOCTL_APP_SET_MFLAG         _IOW(COMPASS_IOCTL_MAGIC, 0x11, compat_short_t)
281 #define COMPAT_ECS_IOCTL_APP_GET_MFLAG         _IOW(COMPASS_IOCTL_MAGIC, 0x12, compat_short_t)
282 #define COMPAT_ECS_IOCTL_APP_SET_AFLAG         _IOW(COMPASS_IOCTL_MAGIC, 0x13, compat_short_t)
283 #define COMPAT_ECS_IOCTL_APP_GET_AFLAG         _IOR(COMPASS_IOCTL_MAGIC, 0x14, compat_short_t)
284 #define COMPAT_ECS_IOCTL_APP_SET_TFLAG         _IOR(COMPASS_IOCTL_MAGIC, 0x15, compat_short_t)/* NOT use */
285 #define COMPAT_ECS_IOCTL_APP_GET_TFLAG         _IOR(COMPASS_IOCTL_MAGIC, 0x16, compat_short_t)/* NOT use */
286 #define COMPAT_ECS_IOCTL_APP_RESET_PEDOMETER   _IOW(COMPASS_IOCTL_MAGIC, 0x17) /* NOT use */
287 #define COMPAT_ECS_IOCTL_APP_SET_DELAY         _IOW(COMPASS_IOCTL_MAGIC, 0x18, compat_short_t)
288 #define COMPAT_ECS_IOCTL_APP_SET_MVFLAG        _IOW(COMPASS_IOCTL_MAGIC, 0x19, compat_short_t)
289 #define COMPAT_ECS_IOCTL_APP_GET_MVFLAG        _IOR(COMPASS_IOCTL_MAGIC, 0x1A, compat_short_t)
290 #define COMPAT_ECS_IOCTL_APP_GET_DELAY         _IOR(COMPASS_IOCTL_MAGIC, 0x1B, compat_short_t)
291 #endif
292
293 #define LIGHTSENSOR_IOCTL_MAGIC 'l'
294 #define LIGHTSENSOR_IOCTL_GET_ENABLED           _IOR(LIGHTSENSOR_IOCTL_MAGIC, 1, int *)
295 #define LIGHTSENSOR_IOCTL_ENABLE                _IOW(LIGHTSENSOR_IOCTL_MAGIC, 2, int *)
296 #define LIGHTSENSOR_IOCTL_DISABLE               _IOW(LIGHTSENSOR_IOCTL_MAGIC, 3, int *)
297
298 #ifdef CONFIG_COMPAT
299 #define COMPAT_LIGHTSENSOR_IOCTL_GET_ENABLED    _IOR(LIGHTSENSOR_IOCTL_MAGIC, 1, compat_uptr_t)
300 #define COMPAT_LIGHTSENSOR_IOCTL_ENABLE         _IOW(LIGHTSENSOR_IOCTL_MAGIC, 2, compat_uptr_t)
301 #define COMPAT_LIGHTSENSOR_IOCTL_DISABLE        _IOW(LIGHTSENSOR_IOCTL_MAGIC, 3, compat_uptr_t)
302 #endif
303
304 #define PSENSOR_IOCTL_MAGIC 'p'
305 #define PSENSOR_IOCTL_GET_ENABLED               _IOR(PSENSOR_IOCTL_MAGIC, 1, int *)
306 #define PSENSOR_IOCTL_ENABLE                    _IOW(PSENSOR_IOCTL_MAGIC, 2, int *)
307 #define PSENSOR_IOCTL_DISABLE                   _IOW(PSENSOR_IOCTL_MAGIC, 3, int *)
308
309 #ifdef CONFIG_COMPAT
310 #define COMPAT_PSENSOR_IOCTL_GET_ENABLED        _IOR(PSENSOR_IOCTL_MAGIC, 1, compat_uptr_t)
311 #define COMPAT_PSENSOR_IOCTL_ENABLE             _IOW(PSENSOR_IOCTL_MAGIC, 2, compat_uptr_t)
312 #define COMPAT_PSENSOR_IOCTL_DISABLE            _IOW(PSENSOR_IOCTL_MAGIC, 3, compat_uptr_t)
313 #endif
314
315 #define PRESSURE_IOCTL_MAGIC 'r'
316 #define PRESSURE_IOCTL_GET_ENABLED              _IOR(PRESSURE_IOCTL_MAGIC, 1, int *)
317 #define PRESSURE_IOCTL_ENABLE                   _IOW(PRESSURE_IOCTL_MAGIC, 2, int *)
318 #define PRESSURE_IOCTL_DISABLE                  _IOW(PRESSURE_IOCTL_MAGIC, 3, int *)
319 #define PRESSURE_IOCTL_SET_DELAY                _IOW(PRESSURE_IOCTL_MAGIC, 4, int *)
320
321
322 #define TEMPERATURE_IOCTL_MAGIC 't'
323 #define TEMPERATURE_IOCTL_GET_ENABLED           _IOR(TEMPERATURE_IOCTL_MAGIC, 1, int *)
324 #define TEMPERATURE_IOCTL_ENABLE                _IOW(TEMPERATURE_IOCTL_MAGIC, 2, int *)
325 #define TEMPERATURE_IOCTL_DISABLE               _IOW(TEMPERATURE_IOCTL_MAGIC, 3, int *)
326 #define TEMPERATURE_IOCTL_SET_DELAY             _IOW(TEMPERATURE_IOCTL_MAGIC, 4, int *)
327
328
329 extern int sensor_rx_data(struct i2c_client *client, char *rxData, int length);
330 extern int sensor_tx_data(struct i2c_client *client, char *txData, int length);
331 extern int sensor_write_reg(struct i2c_client *client, int addr, int value);
332 extern int sensor_read_reg(struct i2c_client *client, int addr);
333 extern int sensor_tx_data_normal(struct i2c_client *client, char *buf, int num);
334 extern int sensor_rx_data_normal(struct i2c_client *client, char *buf, int num);
335 extern int sensor_write_reg_normal(struct i2c_client *client, char value);
336 extern int sensor_read_reg_normal(struct i2c_client *client);
337