diff options
Diffstat (limited to 'drivers/input/touchscreen/zt7554_ts.h')
| -rwxr-xr-x | drivers/input/touchscreen/zt7554_ts.h | 516 |
1 files changed, 516 insertions, 0 deletions
diff --git a/drivers/input/touchscreen/zt7554_ts.h b/drivers/input/touchscreen/zt7554_ts.h new file mode 100755 index 00000000..398fb135 --- /dev/null +++ b/drivers/input/touchscreen/zt7554_ts.h @@ -0,0 +1,516 @@ +/* + * + * Zinitix zt7554 touch driver + * + * Copyright (C) 2013 Samsung Electronics Co.Ltd + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * 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. + * + */ + +#include <linux/module.h> +#include <linux/input.h> +#include <linux/i2c.h> +#include <linux/miscdevice.h> +#include <linux/interrupt.h> +#ifdef CONFIG_HAS_EARLYSUSPEND +#include <linux/earlysuspend.h> +#endif +#if defined(CONFIG_PM_RUNTIME) +#include <linux/pm_runtime.h> +#endif +#include <linux/semaphore.h> +#include <linux/timer.h> +#include <linux/workqueue.h> +#include <linux/slab.h> +#include <linux/delay.h> +#include <linux/gpio.h> +#include <linux/uaccess.h> +#include <linux/regulator/consumer.h> +#include <linux/input/mt.h> +#include <linux/of_gpio.h> +#include <soc/sprd/i2c-sprd.h> +#include <linux/power_supply.h> +#include <linux/input/zt7554_platform_data.h> + +#define TOUCH_BOOSTER 0 + +#if TOUCH_BOOSTER +#include <linux/cpufreq.h> +#include <linux/cpufreq_limit.h> +extern int _store_cpu_num_min_limit(unsigned int input); +struct cpufreq_limit_handle *min_handle = NULL; +static const unsigned long touch_cpufreq_lock = 1200000; +#endif + + +#define SEC_FACTORY_TEST +#define SUPPORTED_TOUCH_KEY + +#define TS_DRVIER_VERSION "1.0.18_1" +#define ZT7554_TS_DEVICE "zt7554_ts" + +#define TOUCH_POINT_MODE 0 +#define ZINITIX_MISC_DEBUG 0 +#define CHECK_HWID 0 +#define ZINITIX_DEBUG 0 +#define ZINITIX_I2C_CHECKSUM 1 +#define TSP_INIT_TEST_RATIO 100 +#define MAX_SUPPORTED_FINGER_NUM 5 /* max 10 */ + +#ifdef SUPPORTED_TOUCH_KEY +#ifdef NOT_SUPPORTED_TOUCH_DUMMY_KEY +#define MAX_SUPPORTED_BUTTON_NUM 2 /* max 8 */ +#define SUPPORTED_BUTTON_NUM 2 +#else +#define MAX_SUPPORTED_BUTTON_NUM 6 /* max 8 */ +#define SUPPORTED_BUTTON_NUM 4 +#endif +#endif + +/* Upgrade Method*/ +#define TOUCH_ONESHOT_UPGRADE 1 +/* resolution offset */ +#define ABS_PT_OFFSET (-1) +#define TOUCH_FORCE_UPGRADE 1 +#define USE_CHECKSUM 1 +#define CHIP_OFF_DELAY 50 /*ms*/ +#define CHIP_ON_DELAY 100 /*ms*/ +#define FIRMWARE_ON_DELAY 150 /*ms*/ +#define DELAY_FOR_SIGNAL_DELAY 30 /*us*/ +#define DELAY_FOR_TRANSCATION 50 +#define DELAY_FOR_POST_TRANSCATION 10 +#define RAWDATA_DELAY_FOR_HOST 100 + +/* PMIC Regulator based supply to TSP */ +#define TSP_REGULATOR_SUPPLY 1 +/* gpio controlled LDO based supply to TSP */ +#define TSP_LDO_SUPPLY 0 + +/* ESD Protection */ +/*second : if 0, no use. if you have to use, 3 is recommended*/ +#define ESD_TIMER_INTERVAL 1 +#define SCAN_RATE_HZ 100 +#define CHECK_ESD_TIMER 3 + +/*Test Mode (Monitoring Raw Data) */ +#ifdef SUPPORTED_DND_SHIFT_VALUE +#define SEC_DND_SHIFT_VALUE 3 +#endif + +//SDND +#define SEC_SDND_N_COUNT 20 +#define SEC_SDND_U_COUNT 1 +#define SEC_SDND_FREQUENCY 77 /* 307khz */ + +//PDND +#define SEC_PDND_N_COUNT 16 +#define SEC_PDND_U_COUNT 14 +#define SEC_PDND_FREQUENCY 79 + +#define MAX_RAW_DATA_SZ 32*22 +#define MAX_TRAW_DATA_SZ \ + (MAX_RAW_DATA_SZ + 4*MAX_SUPPORTED_FINGER_NUM + 2) + + +#define TOUCH_SEC_MODE 48 +#define TOUCH_REF_MODE 10 +#define TOUCH_NORMAL_MODE 5 +#define TOUCH_DELTA_MODE 3 +#define TOUCH_DND_MODE 6 +#define TOUCH_PDND_MODE 11 + +#define PALM_REPORT_WIDTH 200 +#define PALM_REJECT_WIDTH 255 + +#define TOUCH_V_FLIP 0x01 +#define TOUCH_H_FLIP 0x02 +#define TOUCH_XY_SWAP 0x04 + +#define TSP_NORMAL_EVENT_MSG 1 +#define I2C_RETRY_TIMES 8 + +/* Other Things */ +#define INIT_RETRY_CNT 1 +#define I2C_SUCCESS 0 +#define I2C_FAIL 1 + +#define TOUCH_IOCTL_BASE 0xbc +#define TOUCH_IOCTL_GET_DEBUGMSG_STATE _IOW(TOUCH_IOCTL_BASE, 0, int) +#define TOUCH_IOCTL_SET_DEBUGMSG_STATE _IOW(TOUCH_IOCTL_BASE, 1, int) +#define TOUCH_IOCTL_GET_CHIP_REVISION _IOW(TOUCH_IOCTL_BASE, 2, int) +#define TOUCH_IOCTL_GET_FW_VERSION _IOW(TOUCH_IOCTL_BASE, 3, int) +#define TOUCH_IOCTL_GET_REG_DATA_VERSION _IOW(TOUCH_IOCTL_BASE, 4, int) +#define TOUCH_IOCTL_VARIFY_UPGRADE_SIZE _IOW(TOUCH_IOCTL_BASE, 5, int) +#define TOUCH_IOCTL_VARIFY_UPGRADE_DATA _IOW(TOUCH_IOCTL_BASE, 6, int) +#define TOUCH_IOCTL_START_UPGRADE _IOW(TOUCH_IOCTL_BASE, 7, int) +#define TOUCH_IOCTL_GET_X_NODE_NUM _IOW(TOUCH_IOCTL_BASE, 8, int) +#define TOUCH_IOCTL_GET_Y_NODE_NUM _IOW(TOUCH_IOCTL_BASE, 9, int) +#define TOUCH_IOCTL_GET_TOTAL_NODE_NUM _IOW(TOUCH_IOCTL_BASE, 10, int) +#define TOUCH_IOCTL_SET_RAW_DATA_MODE _IOW(TOUCH_IOCTL_BASE, 11, int) +#define TOUCH_IOCTL_GET_RAW_DATA _IOW(TOUCH_IOCTL_BASE, 12, int) +#define TOUCH_IOCTL_GET_X_RESOLUTION _IOW(TOUCH_IOCTL_BASE, 13, int) +#define TOUCH_IOCTL_GET_Y_RESOLUTION _IOW(TOUCH_IOCTL_BASE, 14, int) +#define TOUCH_IOCTL_HW_CALIBRAION _IOW(TOUCH_IOCTL_BASE, 15, int) +#define TOUCH_IOCTL_GET_REG _IOW(TOUCH_IOCTL_BASE, 16, int) +#define TOUCH_IOCTL_SET_REG _IOW(TOUCH_IOCTL_BASE, 17, int) +#define TOUCH_IOCTL_SEND_SAVE_STATUS _IOW(TOUCH_IOCTL_BASE, 18, int) +#define TOUCH_IOCTL_DONOT_TOUCH_EVENT _IOW(TOUCH_IOCTL_BASE, 19, int) + +/* Register Map*/ +#define ZT7554_SWRESET_CMD 0x0000 +#define ZT7554_WAKEUP_CMD 0x0001 +#define ZT7554_IDLE_CMD 0x0004 +#define ZT7554_SLEEP_CMD 0x0005 +#define ZT7554_CLEAR_INT_STATUS_CMD 0x0003 +#define ZT7554_CALIBRATE_CMD 0x0006 +#define ZT7554_SAVE_STATUS_CMD 0x0007 +#define ZT7554_SAVE_CALIBRATION_CMD 0x0008 +#define ZT7554_RECALL_FACTORY_CMD 0x000f +#define ZT7554_THRESHOLD 0x0020 +#define ZT7554_DEBUG_REG 0x0115 /* 0~7 */ +#define ZT7554_TOUCH_MODE 0x0010 +#define ZT7554_CHIP_REVISION 0x0011 +#define ZT7554_FIRMWARE_VERSION 0x0012 +#define ZT7554_MINOR_FW_VERSION 0x0121 +#define ZT7554_VENDOR_ID 0x001C +#define ZT7554_HW_ID 0x0014 +#define ZT7554_DATA_VERSION_REG 0x0013 +#define ZT7554_SUPPORTED_FINGER_NUM 0x0015 +#define ZT7554_EEPROM_INFO 0x0018 +#define ZT7554_INITIAL_TOUCH_MODE 0x0019 +#define ZT7554_TOTAL_NUMBER_OF_X 0x0060 +#define ZT7554_TOTAL_NUMBER_OF_Y 0x0061 +#define ZT7554_DELAY_RAW_FOR_HOST 0x007f +#define ZT7554_BUTTON_SUPPORTED_NUM 0x00B0 +#define ZT7554_BUTTON_SENSITIVITY 0x00B2 +#define ZT7554_DUMMY_BUTTON_SENSITIVITY 0X00C8 +#define ZT7554_X_RESOLUTION 0x00C0 +#define ZT7554_Y_RESOLUTION 0x00C1 +#define ZT7554_POINT_STATUS_REG 0x0080 +#define ZT7554_ICON_STATUS_REG 0x00AA +#ifdef SUPPORTED_DND_SHIFT_VALUE +#define ZT7554_DND_SHIFT_VALUE 0x012B +#endif +#define ZT7554_AFE_FREQUENCY 0x0100 +#define ZT7554_DND_N_COUNT 0x0122 +#define ZT7554_DND_U_COUNT 0x0135 +#define ZT7554_RAWDATA_REG 0x0200 +#define ZT7554_EEPROM_INFO_REG 0x0018 +#define ZT7554_INT_ENABLE_FLAG 0x00f0 +#define ZT7554_PERIODICAL_INTERRUPT_INTERVAL 0x00f1 +#define ZT7554_BTN_WIDTH 0x016d +#define ZT7554_CHECKSUM_RESULT 0x012c +#define ZT7554_INIT_FLASH 0x01d0 +#define ZT7554_WRITE_FLASH 0x01d1 +#define ZT7554_READ_FLASH 0x01d2 +#define ZINITIX_INTERNAL_FLAG_02 0x011e +#define ZT7554_OPTIONAL_SETTING 0x0116 + +/* Interrupt & status register flag bit +------------------------------------------------- +*/ +#define BIT_PT_CNT_CHANGE 0 +#define BIT_DOWN 1 +#define BIT_MOVE 2 +#define BIT_UP 3 +#define BIT_PALM 4 +#define BIT_PALM_REJECT 5 +#define RESERVED_0 6 +#define RESERVED_1 7 +#define BIT_WEIGHT_CHANGE 8 +#define BIT_PT_NO_CHANGE 9 +#define BIT_REJECT 10 +#define BIT_PT_EXIST 11 +#define RESERVED_2 12 +#define BIT_MUST_ZERO 13 +#define BIT_DEBUG 14 +#define BIT_ICON_EVENT 15 + +/* button */ +#define BIT_O_ICON0_DOWN 0 +#define BIT_O_ICON1_DOWN 1 +#define BIT_O_ICON2_DOWN 2 +#define BIT_O_ICON3_DOWN 3 +#define BIT_O_ICON4_DOWN 4 +#define BIT_O_ICON5_DOWN 5 +#define BIT_O_ICON6_DOWN 6 +#define BIT_O_ICON7_DOWN 7 + +#define BIT_O_ICON0_UP 8 +#define BIT_O_ICON1_UP 9 +#define BIT_O_ICON2_UP 10 +#define BIT_O_ICON3_UP 11 +#define BIT_O_ICON4_UP 12 +#define BIT_O_ICON5_UP 13 +#define BIT_O_ICON6_UP 14 +#define BIT_O_ICON7_UP 15 + +#define SUB_BIT_EXIST 0 +#define SUB_BIT_DOWN 1 +#define SUB_BIT_MOVE 2 +#define SUB_BIT_UP 3 +#define SUB_BIT_UPDATE 4 +#define SUB_BIT_WAIT 5 + +#define zinitix_bit_set(val, n) ((val) &= ~(1<<(n)), (val) |= (1<<(n))) +#define zinitix_bit_clr(val, n) ((val) &= ~(1<<(n))) +#define zinitix_bit_test(val, n) ((val) & (1<<(n))) +#define zinitix_swap_v(a, b, t) ((t) = (a), (a) = (b), (b) = (t)) +#define zinitix_swap_16(s) (((((s) & 0xff) << 8) | (((s) >> 8) & 0xff))) + +#ifdef SEC_FACTORY_TEST +/* Touch Screen */ +#define TSP_CMD_STR_LEN 32 +#define TSP_CMD_RESULT_STR_LEN 512 +#define TSP_CMD_PARAM_NUM 8 +#define TSP_CMD_Y_NUM 22 +#define TSP_CMD_X_NUM 32 +#define TSP_CMD_NODE_NUM (TSP_CMD_Y_NUM * TSP_CMD_X_NUM) + +enum { + WAITING = 0, + RUNNING, + OK, + FAIL, + NOT_APPLICABLE, +}; +#endif + +enum power_control { + POWER_OFF, + POWER_ON, + POWER_ON_SEQUENCE, +}; + +enum key_event { + ICON_BUTTON_UNCHANGE, + ICON_BUTTON_DOWN, + ICON_BUTTON_UP, +}; + +enum work_state { + NOTHING = 0, + NORMAL, + ESD_TIMER, + EALRY_SUSPEND, + SUSPEND, + RESUME, + LATE_RESUME, + UPGRADE, + REMOVE, + SET_MODE, + HW_CALIBRAION, + RAW_DATA, + PROBE, +}; + +enum { + BUILT_IN = 0, + UMS, + REQ_FW, +}; + +struct raw_ioctl { + u32 sz; + u32 buf; +}; + +struct reg_ioctl { + u32 addr; + u32 *val; +}; + +struct coord { + u16 x; + u16 y; + u8 width; + u8 sub_status; +}; + +struct point_info { + u16 status; + u8 finger_cnt; + u8 time_stamp; + struct coord coord[MAX_SUPPORTED_FINGER_NUM]; +}; + +struct capa_info { + u16 vendor_id; + u16 ic_revision; + u16 fw_version; + u16 fw_minor_version; + u16 reg_data_version; + u16 threshold; + u16 key_threshold; + u16 dummy_threshold; + u32 ic_fw_size; + u32 MaxX; + u32 MaxY; + u32 MinX; + u32 MinY; + u8 gesture_support; + u16 multi_fingers; + u16 button_num; + u16 ic_int_mask; + u16 x_node_num; + u16 y_node_num; + u16 total_node_num; + u16 hw_id; + u16 afe_frequency; +#ifdef SUPPORTED_DND_SHIFT_VALUE + u16 shift_value; +#endif + u16 N_cnt; + u16 u_cnt; + u16 i2s_checksum; +}; +//struct zt7554_ts_info; + +struct zt7554_ts_info { + struct i2c_client *client; + struct input_dev *input_dev; + struct zt7554_ts_platform_data *pdata; + char phys[32]; + struct capa_info cap_info; + struct point_info touch_info; + struct point_info reported_touch_info; + u16 icon_event_reg; + u16 prev_icon_event; + int irq; + u8 button[MAX_SUPPORTED_BUTTON_NUM]; + u8 work_state; + struct semaphore work_lock; +#if ESD_TIMER_INTERVAL + struct work_struct tmr_work; + struct timer_list esd_timeout_tmr; + struct timer_list *p_esd_timeout_tmr; + spinlock_t lock; +#endif +#ifdef CONFIG_HAS_EARLYSUSPEND + struct early_suspend early_suspend; +#endif + struct semaphore raw_data_lock; + u16 touch_mode; + s16 cur_data[MAX_TRAW_DATA_SZ]; + u8 update; +#ifdef SEC_FACTORY_TEST + struct tsp_factory_info *factory_info; + struct tsp_raw_data *raw_data; +#endif + u16 dnd_data[MAX_RAW_DATA_SZ]; + s16 ref_data[MAX_RAW_DATA_SZ]; + + s16 ref_scale_factor; + s16 ref_btn_option; + s16 hdiff_max_x; + s16 hdiff_max_y; + s16 hdiff_max_val; + s16 hdiff_min_x; + s16 hdiff_min_y; + s16 hdiff_min_val; + + s16 vdiff_max_x; + s16 vdiff_max_y; + s16 vdiff_max_val; + s16 vdiff_min_x; + s16 vdiff_min_y; + s16 vdiff_min_val; +#if TOUCH_BOOSTER + u8 finger_cnt; +#endif +}; + +#ifdef SEC_FACTORY_TEST +struct tsp_factory_info { + struct list_head cmd_list_head; + char cmd[TSP_CMD_STR_LEN]; + char cmd_param[TSP_CMD_PARAM_NUM]; + char cmd_result[TSP_CMD_RESULT_STR_LEN]; + char cmd_buff[TSP_CMD_RESULT_STR_LEN]; + struct mutex cmd_lock; + bool cmd_is_running; + u8 cmd_state; +}; + +struct tsp_raw_data { + u16 ref_data[TSP_CMD_NODE_NUM]; + u16 pref_data[TSP_CMD_NODE_NUM]; + s16 delta_data[TSP_CMD_NODE_NUM]; +}; + +struct tsp_cmd { + struct list_head list; + const char *cmd_name; + void (*cmd_func)(void *device_data); +}; +#endif /* SEC_FACTORY_TEST */ + +struct zt7554_ts_info *misc_info; +//static int m_ts_debug_mode = ZINITIX_DEBUG; +#if ESD_TIMER_INTERVAL +static struct workqueue_struct *esd_tmr_workqueue; +#endif +extern void (*tsp_charger_status_cb)(int); +static bool ta_connected; +#if ZINITIX_MISC_DEBUG +static struct miscdevice touch_misc_device; +#endif +static u16 m_optional_mode; +static u16 m_prev_optional_mode; + +extern struct class *sec_class; + + +#ifdef CONFIG_HAS_EARLYSUSPEND +static void zt7554_ts_early_suspend(struct early_suspend *h); +static void zt7554_ts_late_resume(struct early_suspend *h); +#endif +static bool zt7554_power_control(struct zt7554_ts_info *info, u8 ctl); +static int zt7554_power(struct i2c_client *client, int on, int gpio_ctrl_pin); +static bool init_touch(struct zt7554_ts_info *info); +static bool mini_init_touch(struct zt7554_ts_info *info); +static void clear_report_data(struct zt7554_ts_info *info); +#if ESD_TIMER_INTERVAL +static void esd_timer_start(u16 sec, struct zt7554_ts_info *info); +static void esd_timer_stop(struct zt7554_ts_info *info); +static void esd_timer_init(struct zt7554_ts_info *info); +static void esd_timeout_handler(unsigned long data); +#endif +//long ts_misc_fops_ioctl(struct file *filp, unsigned int cmd, unsigned long arg); +//int ts_misc_fops_open(struct inode *inode, struct file *filp); +//int ts_misc_fops_close(struct inode *inode, struct file *filp); + +#ifdef SEC_FACTORY_TEST +static void fw_update(void *device_data); +static void get_fw_ver_bin(void *device_data); +static void get_fw_ver_ic(void *device_data); +static void get_threshold(void *device_data); +static void get_chip_vendor(void *device_data); +static void get_chip_name(void *device_data); +static void get_x_num(void *device_data); +static void get_y_num(void *device_data); +static void not_support_cmd(void *device_data); +/* Vendor dependant command */ +static void run_reference_read(void *device_data); +static void run_reference_PDiff(void *device_data); +static void get_reference(void *device_data); +static void run_preference_read(void *device_data); +static void get_preference(void *device_data); +static void run_delta_read(void *device_data); +static void get_delta(void *device_data); +#endif + +int ts_upgrade_sequence(const u8 *firmware_data); +bool ts_hw_calibration(struct zt7554_ts_info *info); +s32 write_reg(struct i2c_client *client, u16 reg, u16 value); +s32 write_cmd(struct i2c_client *client, u16 reg); +bool ts_set_touchmode(u16 value); +s32 read_data(struct i2c_client *client, u16 reg, u8 *values, u16 length); |
