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 #include <linux/module.h> 24 25 #define SENSOR_ON 1 26 #define SENSOR_OFF 0 27 #define SENSOR_UNKNOW_DATA -1 28 29 #define GPIO_HIGH 1 30 #define GPIO_LOW 0 31 32 enum sensor_id { 33 ID_INVALID = 0, 34 35 ANGLE_ID_ALL, 36 ANGLE_ID_KXTIK, 37 ANGLE_ID_LIS3DH, 38 39 ACCEL_ID_ALL, 40 ACCEL_ID_LIS331, 41 ACCEL_ID_LSM303DLX, 42 ACCEL_ID_LIS3DH, 43 ACCEL_ID_KXSD9, 44 ACCEL_ID_KXTF9, 45 ACCEL_ID_KXTIK, 46 ACCEL_ID_KXTJ9, 47 ACCEL_ID_BMA150, 48 ACCEL_ID_BMA222, 49 ACCEL_ID_BMA250, 50 ACCEL_ID_ADXL34X, 51 ACCEL_ID_MMA8450, 52 ACCEL_ID_MMA845X, 53 ACCEL_ID_MMA7660, 54 ACCEL_ID_SC7660, 55 ACCEL_ID_SC7A20, 56 ACCEL_ID_SC7A30, 57 ACCEL_ID_MPU6050, 58 ACCEL_ID_MXC6225, 59 ACCEL_ID_MXC6655XA, 60 ACCEL_ID_DMARD10, 61 ACCEL_ID_LSM303D, 62 ACCEL_ID_MC3230, 63 ACCEL_ID_MPU6880, 64 ACCEL_ID_MPU6500, 65 ACCEL_ID_LSM330, 66 ACCEL_ID_BMA2XX, 67 ACCEL_ID_STK8BAXX, 68 ACCEL_ID_MIR3DA, 69 ACCEL_ID_ICM2060X, 70 ACCEL_ID_DA215S, 71 ACCEL_ID_DA228E, 72 ACCEL_ID_IAM20680, 73 COMPASS_ID_ALL, 74 COMPASS_ID_AK8975, 75 COMPASS_ID_AK8963, 76 COMPASS_ID_AK09911, 77 COMPASS_ID_AK8972, 78 COMPASS_ID_AMI30X, 79 COMPASS_ID_AMI306, 80 COMPASS_ID_YAS529, 81 COMPASS_ID_YAS530, 82 COMPASS_ID_HMC5883, 83 COMPASS_ID_LSM303DLH, 84 COMPASS_ID_LSM303DLM, 85 COMPASS_ID_MMC314X, 86 COMPASS_ID_HSCDTD002B, 87 COMPASS_ID_HSCDTD004A, 88 COMPASS_ID_AK09918, 89 90 GYRO_ID_ALL, 91 GYRO_ID_L3G4200D, 92 GYRO_ID_L3G20D, 93 GYRO_ID_EWTSA, 94 GYRO_ID_K3G, 95 GYRO_ID_MPU6500, 96 GYRO_ID_MPU6880, 97 GYRO_ID_LSM330, 98 GYRO_ID_ICM2060X, 99 GYRO_ID_IAM20680, 100 LIGHT_ID_ALL, 101 LIGHT_ID_CM3217, 102 LIGHT_ID_CM3218, 103 LIGHT_ID_CM3232, 104 LIGHT_ID_AL3006, 105 LIGHT_ID_STK3171, 106 LIGHT_ID_ISL29023, 107 LIGHT_ID_AP321XX, 108 LIGHT_ID_PHOTORESISTOR, 109 LIGHT_ID_US5152, 110 LIGHT_ID_STK3332, 111 LIGHT_ID_STK3410, 112 LIGHT_ID_EM3071X, 113 LIGHT_ID_UCS14620, 114 115 PROXIMITY_ID_ALL, 116 PROXIMITY_ID_AL3006, 117 PROXIMITY_ID_STK3171, 118 PROXIMITY_ID_AP321XX, 119 PROXIMITY_ID_STK3332, 120 PROXIMITY_ID_STK3410, 121 PROXIMITY_ID_EM3071X, 122 PROXIMITY_ID_UCS14620, 123 124 TEMPERATURE_ID_ALL, 125 TEMPERATURE_ID_MS5607, 126 127 PRESSURE_ID_ALL, 128 PRESSURE_ID_BMA085, 129 PRESSURE_ID_MS5607, 130 131 HALL_ID_ALL, 132 HALL_ID_OCH165T, 133 134 SENSOR_NUM_ID, 135 }; 136 137 struct sensor_axis { 138 int x; 139 int y; 140 int z; 141 }; 142 143 struct sensor_flag { 144 atomic_t a_flag; 145 atomic_t m_flag; 146 atomic_t mv_flag; 147 atomic_t open_flag; 148 atomic_t debug_flag; 149 long long delay; 150 wait_queue_head_t open_wq; 151 }; 152 153 154 struct sensor_operate { 155 char *name; 156 int type; 157 int id_i2c; 158 int range[2]; 159 int brightness[2]; 160 int read_reg; 161 int read_len; 162 int id_reg; 163 int id_data; 164 int precision; 165 int ctrl_reg; 166 int ctrl_data; 167 int int_ctrl_reg; 168 int int_status_reg; 169 int trig; 170 int (*active)(struct i2c_client *client, int enable, int rate); 171 int (*init)(struct i2c_client *client); 172 int (*report)(struct i2c_client *client); 173 int (*suspend)(struct i2c_client *client); 174 int (*resume)(struct i2c_client *client); 175 struct miscdevice *misc_dev; 176 }; 177 178 /* Platform data for the sensor */ 179 struct sensor_private_data { 180 int type; 181 struct i2c_client *client; 182 struct input_dev *input_dev; 183 int stop_work; 184 struct delayed_work delaywork; 185 struct sensor_axis axis; 186 char sensor_data[40]; 187 atomic_t is_factory; 188 wait_queue_head_t is_factory_ok; 189 struct mutex data_mutex; 190 struct mutex operation_mutex; 191 struct mutex sensor_mutex; 192 struct mutex i2c_mutex; 193 int status_cur; 194 int start_count; 195 int devid; 196 struct sensor_flag flags; 197 struct i2c_device_id *i2c_id; 198 struct sensor_platform_data *pdata; 199 struct sensor_operate *ops; 200 struct file_operations fops; 201 struct miscdevice miscdev; 202 #ifdef CONFIG_HAS_EARLYSUSPEND 203 struct early_suspend early_suspend; 204 #endif 205 }; 206 207 struct sensor_platform_data { 208 int type; 209 int irq; 210 int irq_pin; 211 int power_pin; 212 int reset_pin; 213 int standby_pin; 214 int irq_enable; 215 int poll_delay_ms; 216 int x_min; 217 int y_min; 218 int z_min; 219 int factory; 220 int layout; 221 unsigned char address; 222 unsigned long irq_flags; 223 signed char orientation[9]; 224 short m_layout[4][3][3]; 225 int *project_name; 226 int power_off_in_suspend; 227 }; 228 229 struct gsensor_platform_data { 230 u16 model; 231 u16 swap_xy; 232 u16 swap_xyz; 233 signed char orientation[9]; 234 int (*get_pendown_state)(void); 235 int (*init_platform_hw)(void); 236 int (*gsensor_platform_sleep)(void); 237 int (*gsensor_platform_wakeup)(void); 238 void (*exit_platform_hw)(void); 239 }; 240 241 struct akm8975_platform_data { 242 short m_layout[4][3][3]; 243 char project_name[64]; 244 int gpio_DRDY; 245 }; 246 247 struct akm_platform_data { 248 short m_layout[4][3][3]; 249 char project_name[64]; 250 char layout; 251 char outbit; 252 int gpio_DRDY; 253 int gpio_RST; 254 }; 255 256 extern int sensor_register_device(struct i2c_client *client, 257 struct sensor_platform_data *slave_pdata, 258 const struct i2c_device_id *devid, 259 struct sensor_operate *ops); 260 261 262 extern int sensor_unregister_device(struct i2c_client *client, 263 struct sensor_platform_data *slave_pdata, 264 struct sensor_operate *ops); 265 266 extern void sensor_shutdown(struct i2c_client *client); 267 extern const struct dev_pm_ops sensor_pm_ops; 268 269 #define DBG(x...) 270 271 #define GSENSOR_IOCTL_MAGIC 'a' 272 #define GBUFF_SIZE 12 /* Rx buffer size */ 273 274 /* IOCTLs for MMA8452 library */ 275 #define GSENSOR_IOCTL_INIT _IO(GSENSOR_IOCTL_MAGIC, 0x01) 276 #define GSENSOR_IOCTL_RESET _IO(GSENSOR_IOCTL_MAGIC, 0x04) 277 #define GSENSOR_IOCTL_CLOSE _IO(GSENSOR_IOCTL_MAGIC, 0x02) 278 #define GSENSOR_IOCTL_START _IO(GSENSOR_IOCTL_MAGIC, 0x03) 279 #define GSENSOR_IOCTL_GETDATA _IOR(GSENSOR_IOCTL_MAGIC, 0x08, char[GBUFF_SIZE+1]) 280 #define GSENSOR_IOCTL_APP_SET_RATE _IOW(GSENSOR_IOCTL_MAGIC, 0x10, short) 281 #define GSENSOR_IOCTL_GET_CALIBRATION _IOR(GSENSOR_IOCTL_MAGIC, 0x11, int[3]) 282 283 284 #define COMPASS_IOCTL_MAGIC 'c' 285 /* IOCTLs for APPs */ 286 #define ECS_IOCTL_APP_SET_MODE _IOW(COMPASS_IOCTL_MAGIC, 0x10, short) 287 #define ECS_IOCTL_APP_SET_MFLAG _IOW(COMPASS_IOCTL_MAGIC, 0x11, short) 288 #define ECS_IOCTL_APP_GET_MFLAG _IOW(COMPASS_IOCTL_MAGIC, 0x12, short) 289 #define ECS_IOCTL_APP_SET_AFLAG _IOW(COMPASS_IOCTL_MAGIC, 0x13, short) 290 #define ECS_IOCTL_APP_GET_AFLAG _IOR(COMPASS_IOCTL_MAGIC, 0x14, short) 291 #define ECS_IOCTL_APP_SET_TFLAG _IOR(COMPASS_IOCTL_MAGIC, 0x15, short)/* NOT use */ 292 #define ECS_IOCTL_APP_GET_TFLAG _IOR(COMPASS_IOCTL_MAGIC, 0x16, short)/* NOT use */ 293 #define ECS_IOCTL_APP_RESET_PEDOMETER _IOW(COMPASS_IOCTL_MAGIC, 0x17) /* NOT use */ 294 #define ECS_IOCTL_APP_SET_DELAY _IOW(COMPASS_IOCTL_MAGIC, 0x18, short) 295 #define ECS_IOCTL_APP_SET_MVFLAG _IOW(COMPASS_IOCTL_MAGIC, 0x19, short) 296 #define ECS_IOCTL_APP_GET_MVFLAG _IOR(COMPASS_IOCTL_MAGIC, 0x1A, short) 297 #define ECS_IOCTL_APP_GET_DELAY _IOR(COMPASS_IOCTL_MAGIC, 0x1B, short) 298 299 #ifdef CONFIG_COMPAT 300 #define COMPAT_ECS_IOCTL_APP_SET_MODE _IOW(COMPASS_IOCTL_MAGIC, 0x10, compat_short_t) 301 #define COMPAT_ECS_IOCTL_APP_SET_MFLAG _IOW(COMPASS_IOCTL_MAGIC, 0x11, compat_short_t) 302 #define COMPAT_ECS_IOCTL_APP_GET_MFLAG _IOW(COMPASS_IOCTL_MAGIC, 0x12, compat_short_t) 303 #define COMPAT_ECS_IOCTL_APP_SET_AFLAG _IOW(COMPASS_IOCTL_MAGIC, 0x13, compat_short_t) 304 #define COMPAT_ECS_IOCTL_APP_GET_AFLAG _IOR(COMPASS_IOCTL_MAGIC, 0x14, compat_short_t) 305 #define COMPAT_ECS_IOCTL_APP_SET_TFLAG _IOR(COMPASS_IOCTL_MAGIC, 0x15, compat_short_t)/* NOT use */ 306 #define COMPAT_ECS_IOCTL_APP_GET_TFLAG _IOR(COMPASS_IOCTL_MAGIC, 0x16, compat_short_t)/* NOT use */ 307 #define COMPAT_ECS_IOCTL_APP_RESET_PEDOMETER _IOW(COMPASS_IOCTL_MAGIC, 0x17) /* NOT use */ 308 #define COMPAT_ECS_IOCTL_APP_SET_DELAY _IOW(COMPASS_IOCTL_MAGIC, 0x18, compat_short_t) 309 #define COMPAT_ECS_IOCTL_APP_SET_MVFLAG _IOW(COMPASS_IOCTL_MAGIC, 0x19, compat_short_t) 310 #define COMPAT_ECS_IOCTL_APP_GET_MVFLAG _IOR(COMPASS_IOCTL_MAGIC, 0x1A, compat_short_t) 311 #define COMPAT_ECS_IOCTL_APP_GET_DELAY _IOR(COMPASS_IOCTL_MAGIC, 0x1B, compat_short_t) 312 #endif 313 314 #define LIGHTSENSOR_IOCTL_MAGIC 'l' 315 #define LIGHTSENSOR_IOCTL_GET_ENABLED _IOR(LIGHTSENSOR_IOCTL_MAGIC, 1, int *) 316 #define LIGHTSENSOR_IOCTL_ENABLE _IOW(LIGHTSENSOR_IOCTL_MAGIC, 2, int *) 317 #define LIGHTSENSOR_IOCTL_SET_RATE _IOW(LIGHTSENSOR_IOCTL_MAGIC, 3, short) 318 319 #ifdef CONFIG_COMPAT 320 #define COMPAT_LIGHTSENSOR_IOCTL_GET_ENABLED _IOR(LIGHTSENSOR_IOCTL_MAGIC, 1, compat_uptr_t) 321 #define COMPAT_LIGHTSENSOR_IOCTL_ENABLE _IOW(LIGHTSENSOR_IOCTL_MAGIC, 2, compat_uptr_t) 322 #define COMPAT_LIGHTSENSOR_IOCTL_SET_RATE _IOW(LIGHTSENSOR_IOCTL_MAGIC, 3, compat_short_t) 323 #endif 324 325 #define PSENSOR_IOCTL_MAGIC 'p' 326 #define PSENSOR_IOCTL_GET_ENABLED _IOR(PSENSOR_IOCTL_MAGIC, 1, int *) 327 #define PSENSOR_IOCTL_ENABLE _IOW(PSENSOR_IOCTL_MAGIC, 2, int *) 328 #define PSENSOR_IOCTL_DISABLE _IOW(PSENSOR_IOCTL_MAGIC, 3, int *) 329 330 #ifdef CONFIG_COMPAT 331 #define COMPAT_PSENSOR_IOCTL_GET_ENABLED _IOR(PSENSOR_IOCTL_MAGIC, 1, compat_uptr_t) 332 #define COMPAT_PSENSOR_IOCTL_ENABLE _IOW(PSENSOR_IOCTL_MAGIC, 2, compat_uptr_t) 333 #define COMPAT_PSENSOR_IOCTL_DISABLE _IOW(PSENSOR_IOCTL_MAGIC, 3, compat_uptr_t) 334 #endif 335 336 #define PRESSURE_IOCTL_MAGIC 'r' 337 #define PRESSURE_IOCTL_GET_ENABLED _IOR(PRESSURE_IOCTL_MAGIC, 1, int *) 338 #define PRESSURE_IOCTL_ENABLE _IOW(PRESSURE_IOCTL_MAGIC, 2, int *) 339 #define PRESSURE_IOCTL_DISABLE _IOW(PRESSURE_IOCTL_MAGIC, 3, int *) 340 #define PRESSURE_IOCTL_SET_DELAY _IOW(PRESSURE_IOCTL_MAGIC, 4, int *) 341 342 343 #define TEMPERATURE_IOCTL_MAGIC 't' 344 #define TEMPERATURE_IOCTL_GET_ENABLED _IOR(TEMPERATURE_IOCTL_MAGIC, 1, int *) 345 #define TEMPERATURE_IOCTL_ENABLE _IOW(TEMPERATURE_IOCTL_MAGIC, 2, int *) 346 #define TEMPERATURE_IOCTL_DISABLE _IOW(TEMPERATURE_IOCTL_MAGIC, 3, int *) 347 #define TEMPERATURE_IOCTL_SET_DELAY _IOW(TEMPERATURE_IOCTL_MAGIC, 4, int *) 348 349 350 extern int sensor_rx_data(struct i2c_client *client, char *rxData, int length); 351 extern int sensor_tx_data(struct i2c_client *client, char *txData, int length); 352 extern int sensor_write_reg(struct i2c_client *client, int addr, int value); 353 extern int sensor_read_reg(struct i2c_client *client, int addr); 354 extern int sensor_tx_data_normal(struct i2c_client *client, char *buf, int num); 355 extern int sensor_rx_data_normal(struct i2c_client *client, char *buf, int num); 356 extern int sensor_write_reg_normal(struct i2c_client *client, char value); 357 extern int sensor_read_reg_normal(struct i2c_client *client); 358 359