blob: 20332835e81f3acdec2c58a489b3da4517f17f82 [file] [log] [blame]
/*
* Copyright (C) 2015, Samsung Electronics Co. Ltd. All Rights Reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
#ifndef __SSP_H__
#define __SSP_H__
#include <linux/kernel.h>
#include <linux/miscdevice.h>
#include <linux/iio/iio.h>
#include <linux/wakelock.h>
#include <linux/rtc.h>
#include "ssp_type_define.h"
#include "ssp_platform.h"
#include "factory/ssp_factory.h"
#define ssp_dbg(fmt, ...) do { \
pr_debug("[SSP] " fmt "\n", ##__VA_ARGS__); \
} while (0)
#define ssp_info(fmt, ...) do { \
pr_info("[SSP] " fmt "\n", ##__VA_ARGS__); \
} while (0)
#define ssp_err(fmt, ...) do { \
pr_err("[SSP] " fmt "\n", ##__VA_ARGS__); \
} while (0)
#define ssp_dbgf(fmt, ...) do { \
pr_debug("[SSP] %20s(%4d): " fmt "\n", __func__, __LINE__, ##__VA_ARGS__); \
} while (0)
#define ssp_infof(fmt, ...) do { \
pr_info("[SSP] %20s(%4d): " fmt "\n", __func__, __LINE__, ##__VA_ARGS__); \
} while (0)
#define ssp_errf(fmt, ...) do { \
pr_err("[SSP] %20s(%4d): " fmt "\n", __func__, __LINE__, ##__VA_ARGS__); \
} while (0)
#define MAKE_WORD(H,L) ((((u16)H) << 8 ) & 0xff00 ) | ((((u16)L)) & 0x00ff )
#define WORD_TO_LOW(w) ((u8)((w) & 0xff ))
#define WORD_TO_HIGH(w) ((u8)(((w) >>8 ) & 0xff))
#define SUCCESS 0
#define FAIL -2
#define ERROR -1
#define DEFAULT_POLLING_DELAY (200)
#ifdef CONFIG_SENSORS_SSP_PROXIMITY_STK3X3X
#define CONFIG_SENSROS_SSP_PROXIMITY_THRESH_CAL
#endif
#ifdef CONFIG_SENSORS_SSP_PROXIMITY_GP2AP110S
#define CONFIG_SENSORS_SSP_PROXIMITY_MODIFY_SETTINGS
#endif
#define SENSOR_NAME_MAX_LEN 35
struct sensor_info {
char name[SENSOR_NAME_MAX_LEN];
bool enable;
int get_data_len;
int report_data_len;
};
enum {
RESET_TYPE_KERNEL_NO_EVENT = 0,
RESET_TYPE_KERNEL_COM_FAIL,
RESET_TYPE_KERNEL_SYSFS,
RESET_TYPE_HUB_NO_EVENT,
RESET_TYPE_HUB_CRASHED,
RESET_TYPE_MAX,
};
enum {
SSP_ST_SHUTDOWN = 0,
SSP_ST_FW_DL_DONE,
SSP_ST_RUN,
SSP_ST_RQ_RESET,
SSP_ST_ERROR,
SSP_ST_MAX,
};
struct sensor_value {
union {
struct { /* accel, gyro, mag */
s16 x;
s16 y;
s16 z;
u32 gyro_dps;
} __attribute__((__packed__));
struct { /*calibrated mag, gyro*/
s16 cal_x;
s16 cal_y;
s16 cal_z;
u8 accuracy;
} __attribute__((__packed__));
struct { /*uncalibrated mag, gyro*/
s16 uncal_x;
s16 uncal_y;
s16 uncal_z;
s16 offset_x;
s16 offset_y;
s16 offset_z;
} __attribute__((__packed__));
struct { /* rotation vector */
s32 quat_a;
s32 quat_b;
s32 quat_c;
s32 quat_d;
u8 acc_rot;
} __attribute__((__packed__));
struct { /* light */
u32 lux;
s32 cct;
u32 raw_lux;
u16 r;
u16 g;
u16 b;
u16 w;
u16 a_time;
u16 a_gain;
u32 brightness;
} __attribute__((__packed__));
struct { /* pressure */
s32 pressure;
s16 temperature;
s32 pressure_cal;
s32 pressure_sealevel;
} __attribute__((__packed__));
struct { /* step detector */
u8 step_det;
};
struct { /* step counter */
u32 step_diff;
u64 step_total;
} __attribute__((__packed__));
struct { /* proximity */
u8 prox;
u16 prox_ex;
} __attribute__((__packed__));
struct { /* proximity raw */
u16 prox_raw[4];
};
struct { /* proximity cal */
u16 prox_cal[2];
};
struct { /* significant motion */
u8 sig_motion;
};
struct { /* tilt detector */
u8 tilt_detector;
};
struct { /* pickup gesture */
u8 pickup_gesture;
};
struct { /* light auto brightness */
s32 ab_lux;
u8 ab_min_flag;
u32 ab_brightness;
} __attribute__((__packed__));
struct meta_data_event { /* meta data */
s32 what;
s32 sensor;
} __attribute__((__packed__)) meta_data;
u8 data[20];
};
u64 timestamp;
} __attribute__((__packed__));
struct sensor_delay {
int sampling_period; /* delay (ms)*/
int max_report_latency; /* batch_max_latency*/
};
struct calibraion_data {
s16 x;
s16 y;
s16 z;
};
#ifdef CONFIG_SENSORS_SSP_MAGNETIC_MMC5603
struct magnetic_calibration_data {
s32 offset_x;
s32 offset_y;
s32 offset_z;
s32 radius;
};
#else
struct magnetic_calibration_data {
u8 accuracy;
s16 offset_x;
s16 offset_y;
s16 offset_z;
s16 flucv_x;
s16 flucv_y;
s16 flucv_z;
};
#endif
struct sensor_info;
struct time_info {
struct rtc_time tm;
u64 timestamp;
};
struct sensor_en_info {
bool enabled;
struct time_info regi_time;
struct time_info unregi_time;
};
struct ssp_waitevent {
wait_queue_head_t waitqueue;
atomic_t state;
};
struct sensor_spec_t {
uint8_t uid;
uint8_t name[15];
uint8_t vendor;
uint32_t version;
uint8_t is_wake_up;
int32_t min_delay;
uint32_t max_delay;
uint16_t max_fifo;
uint16_t reserved_fifo;
float resolution;
float max_range;
float power;
} __attribute__((__packed__));
struct ssp_data {
bool is_probe_done;
struct wake_lock ssp_wake_lock;
struct delayed_work work_refresh;
struct work_struct work_reset;
struct ssp_waitevent reset_lock;
int cnt_reset;
unsigned int cnt_ssp_reset[RESET_TYPE_MAX + 1]; /* index RESET_TYPE_MAX : total reset count */
int check_noevent_reset_cnt;
struct timer_list ts_sync_timer;
struct workqueue_struct *ts_sync_wq;
struct work_struct work_ts_sync;
char fw_name[50];
int fw_type;
unsigned int curr_fw_rev;
/* platform */
void *platform_data;
struct device *dev;
char *sensor_spec;
unsigned int sensor_spec_size;
/* comm */
struct mutex comm_mutex;
struct mutex pending_mutex;
struct list_head pending_list;
unsigned int cnt_timeout;
unsigned int cnt_com_fail;
/* debug */
char sensor_state[BIG_DATA_SENSOR_TYPE_MAX + 1];
struct timer_list debug_timer;
struct workqueue_struct *debug_wq;
struct work_struct work_debug;
bool debug_enable;
char last_ap_status;
char last_resume_status;
int reset_type;
char *sensor_dump[SENSOR_TYPE_MAX];
#ifdef CONFIG_SSP_ENG_DEBUG
char register_value[5];
#endif
/* sensor */
struct mutex enable_mutex;
uint64_t sensor_probe_state; /* uSensorState */
atomic64_t sensor_en_state; /* aSensorEnable */
u64 latest_timestamp[SENSOR_TYPE_MAX];
struct sensor_value buf[SENSOR_TYPE_MAX];
struct sensor_delay delay[SENSOR_TYPE_MAX];
struct sensor_info info[SENSOR_TYPE_MAX];
struct sensor_en_info en_info[SS_SENSOR_TYPE_MAX];
u64 regi_timestamp[SENSOR_TYPE_MAX];
u64 unregi_timestamp[SENSOR_TYPE_MAX];
uint64_t ss_sensor_probe_state[2];
/* device */
struct device *mcu_device;
struct miscdevice batch_io_device;
struct iio_dev *indio_devs[SENSOR_TYPE_MAX];
struct iio_chan_spec indio_channels[SENSOR_TYPE_MAX];
struct device *devices[SENSOR_TYPE_MAX];
struct miscdevice scontext_device;
struct miscdevice injection_device;
/* ops */
int fw_dl_state;
bool is_accel_alert;
bool is_barcode_enabled;
#ifdef CONFIG_SENSORS_SSP_ACCELOMETER
struct accelometer_sensor_operations *accel_ops;
int accel_position;
struct calibraion_data accelcal;
u8 orientation_mode;
#endif
#ifdef CONFIG_SENSORS_SSP_GYROSCOPE
struct gyroscope_sensor_operations *gyro_ops;
struct calibraion_data gyrocal;
int gyro_position;
#endif
#ifdef CONFIG_SENSORS_SSP_MAGNETIC
struct magnetic_sensor_operations *magnetic_ops;
int mag_position;
unsigned char pdc_matrix[PDC_SIZE];
unsigned char uFuseRomData[3];
unsigned char geomag_cntl_regdata;
bool is_geomag_raw_enabled;
struct magnetic_calibration_data magcal;
#endif
#ifdef CONFIG_SENSORS_SSP_PROXIMITY
struct proximity_sensor_operations *proximity_ops;
unsigned int prox_raw_avg[4];
bool is_proxraw_enabled;
#ifdef CONFIG_SENSORS_SSP_PROXIMITY_MODIFY_SETTINGS
int prox_setting_mode;
u16 prox_setting_thresh[2]; /* high, low*/
u16 prox_mode_thresh[PROX_THRESH_SIZE]; /* high, low*/
#endif
#if defined(CONFIG_SENSORS_SSP_PROXIMITY_AUTO_CAL_TMD3725)
u8 prox_thresh[PROX_THRESH_SIZE]; /* high, low, detect_hight, detect_low*/
#else
u16 prox_thresh[PROX_THRESH_SIZE]; /* high, low*/
#endif
#if defined(CONFIG_SENSROS_SSP_PROXIMITY_THRESH_CAL)
#ifdef CONFIG_SENSORS_SSP_PROXIMITY_STK3X3X
u16 prox_thresh_addval[PROX_THRESH_SIZE + 1];
#else
u16 prox_thresh_addval[PROX_THRESH_SIZE];
#endif
#endif
int prox_trim;
#endif
#ifdef CONFIG_SENSORS_SSP_LIGHT
struct light_sensor_operations *light_ops;
int light_coef[LIGHT_COEF_SIZE];
int light_log_cnt;
int light_cct_log_cnt;
int light_ab_log_cnt;
u32 light_position[6];
int brightness;
int last_brightness_level;
int brightness_array_len;
u32 *brightness_array;
bool camera_lux_en;
int camera_lux;
int camera_lux_hysteresis[2];
int camera_br_hysteresis[2];
#ifdef CONFIG_SENSORS_SSP_CAMERALIGHT_FOR_TAB
int low_lux_mode; // 0 : NONE, 1: low lux(no or high cam lux), 2: real dark
int report_ab_lux;
#endif
#endif
#ifdef CONFIG_SENSORS_SSP_BAROMETER
struct barometer_sensor_operations *barometer_ops;
#endif
};
#endif /* __SSP_H__ */