1 /* include/linux/sensor-dev.h - sensor header file
3 * Copyright (C) 2012-2015 ROCKCHIP.
4 * Author: luowei <lw@rock-chips.com>
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.
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.
17 #include <linux/miscdevice.h>
18 #ifdef CONFIG_HAS_EARLYSUSPEND
19 #include <linux/earlysuspend.h>
22 #include <dt-bindings/sensor-dev.h>
26 #define SENSOR_UNKNOW_DATA -1
74 COMPASS_ID_HSCDTD002B,
75 COMPASS_ID_HSCDTD004A,
92 LIGHT_ID_PHOTORESISTOR,
101 TEMPERATURE_ID_MS5607,
127 wait_queue_head_t open_wq;
131 struct sensor_operate {
136 int brightness[2];//backlight min_brightness max_brightness
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;
157 /* Platform data for the sensor */
158 struct sensor_private_data {
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
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;
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;
186 struct sensor_platform_data {
193 int irq_enable; //if irq_enable=1 then use irq else use polling
194 int poll_delay_ms; //polling
200 unsigned char address;
201 unsigned long irq_flags;
202 signed char orientation[9];
203 short m_layout[4][3][3];
205 int power_off_in_suspend;
208 struct gsensor_platform_data {
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);
220 struct akm8975_platform_data {
221 short m_layout[4][3][3];
222 char project_name[64];
226 struct akm_platform_data {
227 short m_layout[4][3][3];
228 char project_name[64];
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));
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));
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)
250 #define GSENSOR_IOCTL_MAGIC 'a'
251 #define GBUFF_SIZE 12 /* Rx buffer size */
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)
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)
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)
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 *)
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)
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 *)
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)
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 *)
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 *)
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);