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