/* * * 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 #include #include #include #include #ifdef CONFIG_HAS_EARLYSUSPEND #include #endif #if defined(CONFIG_PM_RUNTIME) #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #define TOUCH_BOOSTER 0 #if TOUCH_BOOSTER #include #include 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);