Merge remote-tracking branch 'origin/upstream/linux-linaro-lsk-v3.10-android+android...
[firefly-linux-kernel-4.4.55.git] / include / linux / sensor-dev.h
1 /* include/linux/sensor-dev.h - sensor header file\r
2  *\r
3  * Copyright (C) 2012-2015 ROCKCHIP.\r
4  * Author: luowei <lw@rock-chips.com>\r
5  *\r
6  * This software is licensed under the terms of the GNU General Public\r
7  * License version 2, as published by the Free Software Foundation, and\r
8  * may be copied, distributed, and modified under those terms.\r
9  *\r
10  * This program is distributed in the hope that it will be useful,\r
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13  * GNU General Public License for more details.\r
14  *\r
15  */\r
16 \r
17 #include <linux/miscdevice.h>\r
18 #ifdef CONFIG_HAS_EARLYSUSPEND\r
19 #include <linux/earlysuspend.h>\r
20 #endif\r
21 \r
22 \r
23 #define SENSOR_ON               1\r
24 #define SENSOR_OFF              0\r
25 #define SENSOR_UNKNOW_DATA      -1\r
26 \r
27 enum sensor_type {\r
28         SENSOR_TYPE_NULL,               \r
29         SENSOR_TYPE_ANGLE,\r
30         SENSOR_TYPE_ACCEL,\r
31         SENSOR_TYPE_COMPASS,    \r
32         SENSOR_TYPE_GYROSCOPE,  \r
33         SENSOR_TYPE_LIGHT,      \r
34         SENSOR_TYPE_PROXIMITY,\r
35         SENSOR_TYPE_TEMPERATURE,        \r
36         SENSOR_TYPE_PRESSURE,\r
37         SENSOR_NUM_TYPES\r
38 };\r
39 \r
40 enum sensor_id {\r
41         ID_INVALID = 0,\r
42 \r
43         ANGLE_ID_ALL,\r
44         ANGLE_ID_KXTIK,\r
45         ANGLE_ID_LIS3DH,\r
46         \r
47         ACCEL_ID_ALL,\r
48         ACCEL_ID_LIS331,\r
49         ACCEL_ID_LSM303DLX,\r
50         ACCEL_ID_LIS3DH,\r
51         ACCEL_ID_KXSD9,\r
52         ACCEL_ID_KXTF9,\r
53         ACCEL_ID_KXTIK,\r
54         ACCEL_ID_KXTJ9,\r
55         ACCEL_ID_BMA150,\r
56         ACCEL_ID_BMA222,\r
57         ACCEL_ID_BMA250,\r
58         ACCEL_ID_ADXL34X,\r
59         ACCEL_ID_MMA8450,\r
60         ACCEL_ID_MMA845X,\r
61         ACCEL_ID_MMA7660,\r
62         ACCEL_ID_MPU6050,\r
63         ACCEL_ID_MXC6225,\r
64         ACCEL_ID_DMARD10,\r
65         ACCEL_ID_LSM303D,\r
66 \r
67         COMPASS_ID_ALL,\r
68         COMPASS_ID_AK8975,\r
69         COMPASS_ID_AK8963,\r
70         COMPASS_ID_AK09911,\r
71         COMPASS_ID_AK8972,\r
72         COMPASS_ID_AMI30X,\r
73         COMPASS_ID_AMI306,\r
74         COMPASS_ID_YAS529,\r
75         COMPASS_ID_YAS530,\r
76         COMPASS_ID_HMC5883,\r
77         COMPASS_ID_LSM303DLH,\r
78         COMPASS_ID_LSM303DLM,\r
79         COMPASS_ID_MMC314X,\r
80         COMPASS_ID_HSCDTD002B,\r
81         COMPASS_ID_HSCDTD004A,\r
82 \r
83         GYRO_ID_ALL,\r
84         GYRO_ID_L3G4200D,\r
85     GYRO_ID_L3G20D,\r
86         GYRO_ID_EWTSA,\r
87         GYRO_ID_K3G,\r
88 \r
89         LIGHT_ID_ALL,\r
90         LIGHT_ID_CM3217,\r
91         LIGHT_ID_CM3232,\r
92         LIGHT_ID_AL3006,\r
93         LIGHT_ID_STK3171,\r
94         LIGHT_ID_ISL29023,\r
95         LIGHT_ID_AP321XX,\r
96         LIGHT_ID_PHOTORESISTOR, \r
97         LIGHT_ID_US5152,\r
98 \r
99         PROXIMITY_ID_ALL,\r
100         PROXIMITY_ID_AL3006,\r
101         PROXIMITY_ID_STK3171,\r
102         PROXIMITY_ID_AP321XX,\r
103         \r
104         TEMPERATURE_ID_ALL,     \r
105         TEMPERATURE_ID_MS5607,\r
106 \r
107         PRESSURE_ID_ALL,\r
108         PRESSURE_ID_BMA085,\r
109         PRESSURE_ID_MS5607,\r
110         SENSOR_NUM_ID,\r
111 };\r
112 \r
113 \r
114 struct sensor_axis {\r
115         int x;\r
116         int y;\r
117         int z;\r
118 };\r
119 \r
120 struct sensor_flag {\r
121         atomic_t a_flag;        \r
122         atomic_t m_flag;        \r
123         atomic_t mv_flag;       \r
124         atomic_t open_flag;\r
125         atomic_t debug_flag;\r
126         long long delay;        \r
127         wait_queue_head_t open_wq;\r
128 };\r
129 \r
130 \r
131 struct sensor_operate {\r
132         char *name;\r
133         int type;\r
134         int     id_i2c;\r
135         int     range[2];\r
136         int     brightness[2];//backlight min_brightness max_brightness \r
137         int read_reg;\r
138         int read_len;\r
139         int id_reg;\r
140         int id_data;\r
141         int precision;\r
142         int ctrl_reg;\r
143         int ctrl_data;\r
144         int int_ctrl_reg;\r
145         int     int_status_reg;\r
146         int trig;       //intterupt trigger\r
147         int (*active)(struct i2c_client *client, int enable, int rate); \r
148         int (*init)(struct i2c_client *client); \r
149         int (*report)(struct i2c_client *client);\r
150         int (*suspend)(struct i2c_client *client);\r
151         int (*resume)(struct i2c_client *client);\r
152         struct miscdevice *misc_dev;\r
153 \r
154 };\r
155 \r
156 \r
157 /* Platform data for the sensor */\r
158 struct sensor_private_data {\r
159         int type;\r
160         struct i2c_client *client;      \r
161         struct input_dev *input_dev;\r
162         struct work_struct work;\r
163         struct delayed_work delaywork;  /*report second event*/\r
164         struct sensor_axis axis;\r
165         char sensor_data[40];           //max support40 bytes data\r
166         atomic_t data_ready;\r
167         wait_queue_head_t data_ready_wq;                \r
168         struct mutex data_mutex;\r
169         struct mutex operation_mutex;   \r
170         struct mutex sensor_mutex;\r
171         struct mutex i2c_mutex;\r
172         int status_cur;\r
173         int start_count;\r
174         int devid;\r
175         struct sensor_flag flags;\r
176         struct i2c_device_id *i2c_id;\r
177         struct sensor_platform_data *pdata;\r
178         struct sensor_operate *ops; \r
179         struct file_operations fops;\r
180         struct miscdevice miscdev;\r
181 #ifdef CONFIG_HAS_EARLYSUSPEND\r
182         struct  early_suspend early_suspend;\r
183 #endif\r
184 };\r
185 \r
186 \r
187 extern int sensor_register_slave(int type,struct i2c_client *client,\r
188                         struct sensor_platform_data *slave_pdata,\r
189                         struct sensor_operate *(*get_sensor_ops)(void));\r
190 \r
191 \r
192 extern int sensor_unregister_slave(int type,struct i2c_client *client,\r
193                         struct sensor_platform_data *slave_pdata,\r
194                         struct sensor_operate *(*get_sensor_ops)(void));\r
195 \r
196 #if 1\r
197 #define DBG(x...) if((atomic_read(&sensor->flags.debug_flag) == sensor->pdata->type) || (atomic_read(&sensor->flags.debug_flag) == SENSOR_NUM_TYPES))printk(x)\r
198 #else\r
199 #define DBG(x...)\r
200 #endif\r
201 \r
202 #define GSENSOR_IOCTL_MAGIC                     'a'\r
203 #define GBUFF_SIZE                              12      /* Rx buffer size */\r
204 \r
205 /* IOCTLs for MMA8452 library */\r
206 #define GSENSOR_IOCTL_INIT                      _IO(GSENSOR_IOCTL_MAGIC, 0x01)\r
207 #define GSENSOR_IOCTL_RESET                     _IO(GSENSOR_IOCTL_MAGIC, 0x04)\r
208 #define GSENSOR_IOCTL_CLOSE                     _IO(GSENSOR_IOCTL_MAGIC, 0x02)\r
209 #define GSENSOR_IOCTL_START                     _IO(GSENSOR_IOCTL_MAGIC, 0x03)\r
210 #define GSENSOR_IOCTL_GETDATA                   _IOR(GSENSOR_IOCTL_MAGIC, 0x08, char[GBUFF_SIZE+1])\r
211 /* IOCTLs for APPs */\r
212 #define GSENSOR_IOCTL_APP_SET_RATE              _IOW(GSENSOR_IOCTL_MAGIC, 0x10, char)\r
213 \r
214 \r
215 #define COMPASS_IOCTL_MAGIC                   'c'\r
216 /* IOCTLs for APPs */\r
217 #define ECS_IOCTL_APP_SET_MODE          _IOW(COMPASS_IOCTL_MAGIC, 0x10, short)\r
218 #define ECS_IOCTL_APP_SET_MFLAG         _IOW(COMPASS_IOCTL_MAGIC, 0x11, short)\r
219 #define ECS_IOCTL_APP_GET_MFLAG         _IOW(COMPASS_IOCTL_MAGIC, 0x12, short)\r
220 #define ECS_IOCTL_APP_SET_AFLAG         _IOW(COMPASS_IOCTL_MAGIC, 0x13, short)\r
221 #define ECS_IOCTL_APP_GET_AFLAG         _IOR(COMPASS_IOCTL_MAGIC, 0x14, short)\r
222 #define ECS_IOCTL_APP_SET_TFLAG         _IOR(COMPASS_IOCTL_MAGIC, 0x15, short)/* NOT use */\r
223 #define ECS_IOCTL_APP_GET_TFLAG         _IOR(COMPASS_IOCTL_MAGIC, 0x16, short)/* NOT use */\r
224 #define ECS_IOCTL_APP_RESET_PEDOMETER   _IOW(COMPASS_IOCTL_MAGIC, 0x17) /* NOT use */\r
225 #define ECS_IOCTL_APP_SET_DELAY         _IOW(COMPASS_IOCTL_MAGIC, 0x18, short)\r
226 #define ECS_IOCTL_APP_SET_MVFLAG        _IOW(COMPASS_IOCTL_MAGIC, 0x19, short)\r
227 #define ECS_IOCTL_APP_GET_MVFLAG        _IOR(COMPASS_IOCTL_MAGIC, 0x1A, short)\r
228 #define ECS_IOCTL_APP_GET_DELAY         _IOR(COMPASS_IOCTL_MAGIC, 0x1B, short)\r
229 \r
230 \r
231 \r
232 \r
233 #define LIGHTSENSOR_IOCTL_MAGIC 'l'\r
234 #define LIGHTSENSOR_IOCTL_GET_ENABLED           _IOR(LIGHTSENSOR_IOCTL_MAGIC, 1, int *) \r
235 #define LIGHTSENSOR_IOCTL_ENABLE                _IOW(LIGHTSENSOR_IOCTL_MAGIC, 2, int *) \r
236 #define LIGHTSENSOR_IOCTL_DISABLE               _IOW(LIGHTSENSOR_IOCTL_MAGIC, 3, int *)\r
237 \r
238 #define PSENSOR_IOCTL_MAGIC 'p'\r
239 #define PSENSOR_IOCTL_GET_ENABLED               _IOR(PSENSOR_IOCTL_MAGIC, 1, int *)\r
240 #define PSENSOR_IOCTL_ENABLE                    _IOW(PSENSOR_IOCTL_MAGIC, 2, int *)\r
241 #define PSENSOR_IOCTL_DISABLE                   _IOW(PSENSOR_IOCTL_MAGIC, 3, int *)\r
242 \r
243 \r
244 #define PRESSURE_IOCTL_MAGIC 'r'\r
245 #define PRESSURE_IOCTL_GET_ENABLED              _IOR(PRESSURE_IOCTL_MAGIC, 1, int *)\r
246 #define PRESSURE_IOCTL_ENABLE                   _IOW(PRESSURE_IOCTL_MAGIC, 2, int *)\r
247 #define PRESSURE_IOCTL_DISABLE                  _IOW(PRESSURE_IOCTL_MAGIC, 3, int *)\r
248 #define PRESSURE_IOCTL_SET_DELAY                _IOW(PRESSURE_IOCTL_MAGIC, 4, int *)\r
249 \r
250 \r
251 #define TEMPERATURE_IOCTL_MAGIC 't'\r
252 #define TEMPERATURE_IOCTL_GET_ENABLED           _IOR(TEMPERATURE_IOCTL_MAGIC, 1, int *)\r
253 #define TEMPERATURE_IOCTL_ENABLE                _IOW(TEMPERATURE_IOCTL_MAGIC, 2, int *)\r
254 #define TEMPERATURE_IOCTL_DISABLE               _IOW(TEMPERATURE_IOCTL_MAGIC, 3, int *)\r
255 #define TEMPERATURE_IOCTL_SET_DELAY             _IOW(TEMPERATURE_IOCTL_MAGIC, 4, int *)\r
256 \r
257 \r
258 extern int sensor_rx_data(struct i2c_client *client, char *rxData, int length);\r
259 extern int sensor_tx_data(struct i2c_client *client, char *txData, int length);\r
260 extern int sensor_write_reg(struct i2c_client *client, int addr, int value);\r
261 extern int sensor_read_reg(struct i2c_client *client, int addr);\r
262 extern int sensor_tx_data_normal(struct i2c_client *client, char *buf, int num);\r
263 extern int sensor_rx_data_normal(struct i2c_client *client, char *buf, int num);\r
264 extern int sensor_write_reg_normal(struct i2c_client *client, char value);\r
265 extern int sensor_read_reg_normal(struct i2c_client *client);\r
266 \r