| /* |
| * 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__ */ |