Files
kernel_xiaomi_sm8250/drivers/input/touchscreen/fts_521/fts.h
UP5468-GE-ES44AC 9b1bd6fa6a input: touchscreen: fts_spi: Report fp_state to sysfs
Change-Id: If5a7ab3adfdbbf44ea9940450fa388c4d03fa2ad
2025-08-22 20:54:21 +02:00

446 lines
12 KiB
C

/*
* fts.c
*
* FTS Capacitive touch screen controller (FingerTipS)
*
* Copyright (C) 2017, STMicroelectronics
* Authors: AMG(Analog Mems Group)
*
* marco.cali@st.com
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* THE PRESENT SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES
* OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, FOR THE SOLE
* PURPOSE TO SUPPORT YOUR APPLICATION DEVELOPMENT.
* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
* CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*
* THIS SOFTWARE IS SPECIFICALLY DESIGNED FOR EXCLUSIVE USE WITH ST PARTS.
*/
/*!
* \file fts.h
* \brief Contains all the definitions and structs used generally by the driver
*/
#ifndef _LINUX_FTS_I2C_H_
#define _LINUX_FTS_I2C_H_
#include <linux/workqueue.h>
#include <linux/sysfs.h>
#include <linux/notifier.h>
#include <linux/mutex.h>
#include "fts_lib/ftsSoftware.h"
#include "fts_lib/ftsHardware.h"
#include <linux/completion.h>
#include "../xiaomi/xiaomi_touch.h"
/****************** CONFIGURATION SECTION ******************/
/** @defgroup conf_section Driver Configuration Section
* Settings of the driver code in order to suit the HW set up and the application behavior
* @{
*/
/**** CODE CONFIGURATION ****/
#define FTS_TS_DRV_NAME "fts" /*driver name*/
#define FTS_TS_DRV_VERSION "5.2.4.1" /*driver version string format*/
#define FTS_TS_DRV_VER 0x05020401 /*driver version u32 format*/
#define PINCTRL_STATE_ACTIVE "pmx_ts_active"
#define PINCTRL_STATE_SUSPEND "pmx_ts_suspend"
#define PINCTRL_STATE_RELEASE "pmx_ts_release"
#define DRIVER_TEST
#define PRE_SAVED_METHOD
/*#define FW_H_FILE*/
#define FW_UPDATE_ON_PROBE
#ifdef FW_H_FILE
#define FW_SIZE_NAME myArray_size
#define FW_ARRAY_NAME myArray
#endif
/*#define LIMITS_H_FILE*/
#ifdef LIMITS_H_FILE
#define LIMITS_SIZE_NAME myArray2_size
#define LIMITS_ARRAY_NAME myArray2
#endif
/*#define USE_ONE_FILE_NODE*/
#ifndef FW_UPDATE_ON_PROBE
#define EXP_FN_WORK_DELAY_MS 1000
#endif
/**** END ****/
/**** FEATURES USED IN THE IC ****/
/*#define PHONE_KEY*/
#define GESTURE_MODE
#ifdef GESTURE_MODE
#define USE_GESTURE_MASK
#endif
#define CHARGER_MODE
#define GLOVE_MODE
#define COVER_MODE
#define STYLUS_MODE
/**** END ****/
/**** PANEL SPECIFICATION ****/
#define X_AXIS_MAX 1080
#define X_AXIS_MIN 0
#define Y_AXIS_MAX 2340
#define Y_AXIS_MIN 0
#define PRESSURE_MIN 0
#ifdef CONFIG_INPUT_PRESS_NDT
#define PRESSURE_MAX 2048
#else
#define PRESSURE_MAX 127
#endif
#define DISTANCE_MIN 0
#define DISTANCE_MAX 127
#define TOUCH_ID_MAX 10
#define AREA_MIN PRESSURE_MIN
#define AREA_MAX PRESSURE_MAX
#define TXNODE_MAX 40
#define RXNODE_MAX 40
/**** END ****/
/**@}*/
/*********************************************************/
/*
* Configuration mode
*
* bitmask which can assume the value defined as features in ftsSoftware.h or the following values
*/
/** @defgroup mode_section IC Status Mode
* Bitmask which keeps track of the features and working mode enabled in the IC.
* The meaning of the the LSB of the bitmask must be interpreted considering that the value defined in @link feat_opt Feature Selection Option @endlink correspond to the position of the corresponding bit in the mask
* @{
*/
#define MODE_NOTHING 0x00000000
#define MODE_ACTIVE(_mask, _sett) \
do { \
_mask |= (SCAN_MODE_ACTIVE << 24) | (_sett << 16); \
} while (0)
#define MODE_LOW_POWER(_mask, _sett) \
do { \
_mask |= (SCAN_MODE_LOW_POWER << 24) | (_sett << 16); \
} while (0)
/** @}*/
#define CMD_STR_LEN 32
#define TSP_BUF_SIZE PAGE_SIZE
/**
* Struct which contains information about the HW platform and set up
*/
#define FTS_LOCKDOWN_SIZE 8
#define FTS_RESULT_INVALID 0
#define FTS_RESULT_PASS 2
#define FTS_RESULT_FAIL 1
#define FTS_SELFTEST_FORCE_CAL
#define GRIP_MODE_DEBUG
#define GRIP_RECT_NUM 12
#define GRIP_PARAMETER_NUM 8
#define GRIP_TYPE 3
#define GRIP_POS 4
enum charge_status {
NOT_CHARGING,
WIRED_CHARGING,
WIRELESS_CHARGING,
};
enum NON_UI_MODE {
NORMAL_MODE = 0,
POCKET_MODE,
POWEROFF_MODE,
};
struct fts_config_info {
u8 tp_vendor;
u8 tp_color;
u8 tp_hw_version;
u8 tp_module;
const char *fts_cfg_name;
const char *fts_limit_name;
};
struct fts_hw_platform_data {
int (*power)(bool on);
int irq_gpio;
int reset_gpio;
unsigned long irq_flags;
unsigned int x_max;
unsigned int y_max;
const char *vdd_reg_name;
const char *avdd_reg_name;
const char *default_fw_name;
size_t config_array_size;
struct fts_config_info *config_array;
int current_index;
#ifdef PHONE_KEY
size_t nbuttons;
int *key_code;
#endif
unsigned long keystates;
bool swap_x;
bool swap_y;
unsigned int fod_lx;
unsigned int fod_ly;
unsigned int fod_x_size;
unsigned int fod_y_size;
#ifdef CONFIG_TOUCHSCREEN_XIAOMI_TOUCHFEATURE
u32 touch_up_threshold_min;
u32 touch_up_threshold_max;
u32 touch_up_threshold_def;
u32 touch_tolerance_min;
u32 touch_tolerance_max;
u32 touch_tolerance_def;
u32 touch_idletime_min;
u32 touch_idletime_max;
u32 touch_idletime_def;
u32 cornerfilter_area_step1;
u32 cornerfilter_area_step2;
u32 cornerfilter_area_step3;
u32 deadzone_filter_ver[4 * GRIP_PARAMETER_NUM];
u32 deadzone_filter_hor[4 * GRIP_PARAMETER_NUM];
u32 edgezone_filter_ver[4 * GRIP_PARAMETER_NUM];
u32 edgezone_filter_hor[4 * GRIP_PARAMETER_NUM];
u32 cornerzone_filter_ver[4 * GRIP_PARAMETER_NUM];
u32 cornerzone_filter_hor1[4 * GRIP_PARAMETER_NUM];
u32 cornerzone_filter_hor2[4 * GRIP_PARAMETER_NUM];
#endif
bool support_fod;
/*support dynamic scan-freq switch*/
bool support_dsf;
bool support_gameidle;
};
/*
* Forward declaration
*/
struct fts_ts_info;
extern char tag[8];
/*
* Dispatch event handler
*/
typedef void (*event_dispatch_handler_t)(struct fts_ts_info *info,
unsigned char *data);
#ifdef CONFIG_SECURE_TOUCH
struct fts_secure_delay {
bool palm_pending;
int palm_value;
};
struct fts_secure_info {
bool secure_inited;
atomic_t st_1st_complete;
atomic_t st_enabled;
atomic_t st_pending_irqs;
struct completion st_irq_processed;
struct completion st_powerdown;
struct fts_secure_delay scr_delay;
struct mutex palm_lock;
void *fts_info;
};
#endif
#ifdef CONFIG_I2C_BY_DMA
struct fts_dma_buf {
struct mutex dmaBufLock;
u8 *rdBuf;
u8 *wrBuf;
};
#endif
/**
* FTS capacitive touch screen device information
* - dev Pointer to the structure device \n
* - client client structure \n
* - input_dev Input device structure \n
* - work Work thread \n
* - event_wq Event queue for work thread \n
* - event_dispatch_table Event dispatch table handlers \n
* - attrs SysFS attributes \n
* - mode Device operating mode (bitmask) \n
* - touch_id Bitmask for touch id (mapped to input slots) \n
* - stylus_id Bitmask for tracking the stylus touches (mapped using the touchId) \n
* - timer Timer when operating in polling mode \n
* - power Power on/off routine \n
* - board HW info retrieved from device tree \n
* - vdd_reg DVDD power regulator \n
* - avdd_reg AVDD power regulator \n
* - resume_bit Indicate if screen off/on \n
* - fwupdate_stat Store the result of a fw update triggered by the host \n
* - notifier Used for be notified from a suspend/resume event \n
* - sensor_sleep true suspend was called, false resume was called \n
* - wakelock Wake Lock struct \n
* - input_report_mutex mutex for handling the pressure of keys \n
* - series_of_switches to store the enabling status of a particular feature from the host \n
*/
struct fts_ts_info {
struct device *dev;
#ifdef I2C_INTERFACE
struct i2c_client *client;
#else
struct spi_device *client;
#endif
struct input_dev *input_dev;
struct work_struct work;
struct work_struct suspend_work;
struct work_struct resume_work;
struct work_struct cmd_update_work;
struct work_struct sleep_work;
struct workqueue_struct *event_wq;
struct workqueue_struct *irq_wq;
struct workqueue_struct *touch_feature_wq;
#ifndef FW_UPDATE_ON_PROBE
struct delayed_work fwu_work;
struct workqueue_struct *fwu_workqueue;
#endif
event_dispatch_handler_t *event_dispatch_table;
struct attribute_group attrs;
unsigned int mode;
unsigned long touch_id;
unsigned long sleep_finger;
unsigned long touch_skip;
#ifdef STYLUS_MODE
unsigned long stylus_id;
#endif
struct fts_hw_platform_data *board;
struct regulator *vdd_reg;
struct regulator *avdd_reg;
int resume_bit;
int fwupdate_stat;
struct notifier_block notifier;
struct notifier_block bl_notifier;
bool sensor_sleep;
bool sensor_scan;
struct pinctrl *ts_pinctrl;
struct pinctrl_state *pinctrl_state_active;
struct pinctrl_state *pinctrl_state_suspend;
u8 lockdown_info[FTS_LOCKDOWN_SIZE];
int result_type;
struct proc_dir_entry *tp_selftest_proc;
struct proc_dir_entry *tp_data_dump_proc;
struct proc_dir_entry *tp_fw_version_proc;
struct proc_dir_entry *tp_lockdown_info_proc;
/* input lock */
struct mutex input_report_mutex;
int gesture_enabled;
int glove_enabled;
int charger_enabled;
int stylus_enabled;
int cover_enabled;
unsigned int grip_enabled;
unsigned int grip_pixel;
unsigned int doze_time;
unsigned int grip_pixel_def;
unsigned int doze_time_def;
#ifdef CONFIG_TOUCHSCREEN_ST_DEBUG_FS
struct dentry *debugfs;
#endif
struct class *fts_tp_class;
struct device *fts_touch_dev;
#ifdef CONFIG_SECURE_TOUCH
struct fts_secure_info *secure_info;
#endif
#ifdef CONFIG_I2C_BY_DMA
struct fts_dma_buf *dma_buf;
#endif
bool lockdown_is_ok;
bool irq_status;
wait_queue_head_t wait_queue;
struct completion tp_reset_completion;
atomic_t system_is_resetting;
int fod_status;
unsigned int fod_overlap;
unsigned long fod_id;
unsigned long fod_x;
unsigned long fod_y;
unsigned long fod_pressed_x;
unsigned long fod_pressed_y;
struct mutex fod_mutex;
struct mutex cmd_update_mutex;
bool fod_coordinate_update;
bool fod_pressed;
bool p_sensor_changed;
bool p_sensor_switch;
bool palm_sensor_changed;
bool palm_sensor_switch;
char *data_dump_buf;
int aod_status;
bool tp_pm_suspend;
struct completion pm_resume_completion;
bool gamemode_enable;
int width_major;
int width_minor;
int orientation;
struct work_struct switch_mode_work;
struct work_struct grip_mode_work;
struct delayed_work grip_mode_delay_work;
struct delayed_work cmd_update_delay_work;
bool big_area_fod;
struct delayed_work power_supply_work;
int charging_status;
struct notifier_block power_supply_notifier;
bool probe_ok;
struct mutex charge_lock;
int fod_icon_status;
int nonui_status;
bool non_ui_poweroff;
#ifdef CONFIG_TOUCHSCREEN_FOD
/*Flag: finger press fod area during unlock*/
bool fod_down;
#endif
};
int fts_chip_powercycle(struct fts_ts_info *info);
extern int input_register_notifier_client(struct notifier_block *nb);
extern int input_unregister_notifier_client(struct notifier_block *nb);
extern int fts_proc_init(void);
extern int fts_proc_remove(void);
#ifdef CONFIG_TOUCHSCREEN_FOD
#define CENTER_X 540
#define CENTER_Y 1910
bool fts_is_infod(void);
#endif
void fts_restore_regvalues(void);
const char *fts_get_limit(struct fts_ts_info *info);
#ifdef CONFIG_TOUCHSCREEN_XIAOMI_TOUCHFEATURE
int fts_palm_sensor_cmd(int input);
int fts_p_sensor_cmd(int input);
bool fts_touchmode_edgefilter(unsigned int touch_id, int x, int y);
#endif
#endif