1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * ELAN HID-I2C TouchScreen driver. 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 2014 Elan Microelectronics Corporation. 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * Author: Chuming Zhang <chuming.zhang@elanic.com.cn> 8*4882a593Smuzhiyun */ 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #ifndef _LINUX_ELAN_TS_H 11*4882a593Smuzhiyun #define _LINUX_ELAN_TS_H 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun #include <linux/i2c.h> 14*4882a593Smuzhiyun #include <linux/miscdevice.h> 15*4882a593Smuzhiyun #include <linux/regulator/consumer.h> 16*4882a593Smuzhiyun #include <linux/uaccess.h> 17*4882a593Smuzhiyun #include <linux/fs.h> 18*4882a593Smuzhiyun #include <linux/delay.h> 19*4882a593Smuzhiyun #include <linux/kernel.h> 20*4882a593Smuzhiyun #include <linux/errno.h> 21*4882a593Smuzhiyun #include <linux/slab.h> 22*4882a593Smuzhiyun #include <linux/firmware.h> 23*4882a593Smuzhiyun #ifdef CONFIG_HAS_EARLYSUSPEND 24*4882a593Smuzhiyun #include <linux/pm.h> 25*4882a593Smuzhiyun #include <linux/earlysuspend.h> 26*4882a593Smuzhiyun #endif 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun #if defined(CONFIG_FB) 29*4882a593Smuzhiyun #include <linux/notifier.h> 30*4882a593Smuzhiyun #include <linux/fb.h> 31*4882a593Smuzhiyun #endif 32*4882a593Smuzhiyun #include <linux/poll.h> 33*4882a593Smuzhiyun #include <linux/wait.h> 34*4882a593Smuzhiyun /*fw upgrade fuction switch*/ 35*4882a593Smuzhiyun //#define IAP_PORTION 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun /*define elan device name*/ 38*4882a593Smuzhiyun #define ELAN_TS_NAME "elan_ts" 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun #define MIN(x,y) ((((x) - (y)) < 0) ? (x) : (y)) 41*4882a593Smuzhiyun #define FLASH_PAGE_PER_TIMES (30) 42*4882a593Smuzhiyun #define FW_PAGE_SIZE (132) 43*4882a593Smuzhiyun #define IAP_CMD_HEADER_LEN (9) 44*4882a593Smuzhiyun #define IAP_FLASH_SIZE (FLASH_PAGE_PER_TIMES * FW_PAGE_SIZE) 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun #define ELAN_VTG_MIN_UV 3300000//2850000 47*4882a593Smuzhiyun #define ELAN_VTG_MAX_UV 3300000//2850000 48*4882a593Smuzhiyun #define ELAN_I2C_VTG_MIN_UV 1800000 49*4882a593Smuzhiyun #define ELAN_I2C_VTG_MAX_UV 1800000 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun #define HID_REPORT_MAX_LEN (67*2) 52*4882a593Smuzhiyun #define NORMAL_REPORT_MAX_LEN (55) 53*4882a593Smuzhiyun #define HID_CMD_LEN (37) 54*4882a593Smuzhiyun #define HID_RECV_LEN (67) 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun #define RETRY_TIMES (3) 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun #define FINGERS_NUM 10 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun struct ts_chip_hw_info { 62*4882a593Smuzhiyun int intr_gpio; 63*4882a593Smuzhiyun int rst_gpio; 64*4882a593Smuzhiyun int irq_num; 65*4882a593Smuzhiyun uint16_t screen_x; 66*4882a593Smuzhiyun uint16_t screen_y; 67*4882a593Smuzhiyun }; 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun struct elan_fw_info { 70*4882a593Smuzhiyun int fw_ver; 71*4882a593Smuzhiyun int fw_id; 72*4882a593Smuzhiyun int fw_bcv; 73*4882a593Smuzhiyun int fw_bcl; 74*4882a593Smuzhiyun int tx; /*tp module y<->tx*/ 75*4882a593Smuzhiyun int rx; /*tp module x<->rx*/ 76*4882a593Smuzhiyun int finger_xres; 77*4882a593Smuzhiyun int finger_yres; 78*4882a593Smuzhiyun int pen_xres; 79*4882a593Smuzhiyun int pen_yres; 80*4882a593Smuzhiyun int finger_osr; 81*4882a593Smuzhiyun int testsolversion; 82*4882a593Smuzhiyun int testversion; 83*4882a593Smuzhiyun int solutionversion; 84*4882a593Smuzhiyun int whck_ver; 85*4882a593Smuzhiyun }; 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun struct elan_update_fw_info { 88*4882a593Smuzhiyun char *FwName; 89*4882a593Smuzhiyun char fw_local_path[50]; 90*4882a593Smuzhiyun const u8 *FwData; 91*4882a593Smuzhiyun const struct firmware *p_fw_entry; 92*4882a593Smuzhiyun int PageNum; 93*4882a593Smuzhiyun int FwSize; 94*4882a593Smuzhiyun int PageSize; 95*4882a593Smuzhiyun u16 remark_id; 96*4882a593Smuzhiyun }; 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun struct elan_i2c_operation{ 99*4882a593Smuzhiyun int (*send)(const uint8_t *, int len); 100*4882a593Smuzhiyun int (*recv)(uint8_t *, int len); 101*4882a593Smuzhiyun int (*poll)(void); 102*4882a593Smuzhiyun }; 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun struct elan_packet_struct { 105*4882a593Smuzhiyun int finger_num; 106*4882a593Smuzhiyun int finger_id; 107*4882a593Smuzhiyun int pen_id; 108*4882a593Smuzhiyun int vaild_size; 109*4882a593Smuzhiyun }; 110*4882a593Smuzhiyun 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun struct elan_finger_struct { 113*4882a593Smuzhiyun int fid; /*finger identify*/ 114*4882a593Smuzhiyun int fsupport_num; /*support finger num*/ 115*4882a593Smuzhiyun int fbuf_valid_size; /*hid: 67/67*2, normal:8/18/35/55*/ 116*4882a593Smuzhiyun int fvalid_num; /*current buf support finger num*/ 117*4882a593Smuzhiyun int fbits; /*current finger is contact or not*/ 118*4882a593Smuzhiyun int fbutton_value; /*mutual button*/ 119*4882a593Smuzhiyun int freport_idx; /*parse coordinate start byte*/ 120*4882a593Smuzhiyun int fshift_byte; /*parse shift byte*/ 121*4882a593Smuzhiyun }; 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun struct elan_stylus_struct { 124*4882a593Smuzhiyun int pid; /*stylus identify*/ 125*4882a593Smuzhiyun int pbuf_valid_size; /*stylus buf size*/ 126*4882a593Smuzhiyun int pbutton_value; /*mutual button,may not use*/ 127*4882a593Smuzhiyun int preport_idx; /*parse coordinate start byte*/ 128*4882a593Smuzhiyun int shitf_byte; /*may not use*/ 129*4882a593Smuzhiyun // int tip_status; /**/ 130*4882a593Smuzhiyun int tip_status; /*contact status*/ 131*4882a593Smuzhiyun int inrange_status; /*hover status*/ 132*4882a593Smuzhiyun int key; /*key status*/ 133*4882a593Smuzhiyun int eraser; /*eraser*/ 134*4882a593Smuzhiyun int inver; /*inver*/ 135*4882a593Smuzhiyun int barrel; /*barrel*/ 136*4882a593Smuzhiyun int barrel_tip; /*barrel+tip*/ 137*4882a593Smuzhiyun }; 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun struct elan_report_struct { 140*4882a593Smuzhiyun struct elan_finger_struct finger; 141*4882a593Smuzhiyun struct elan_stylus_struct stylus; 142*4882a593Smuzhiyun // uint8_t *buf; /*elan report recv buf*/ 143*4882a593Smuzhiyun // int finger_id; /*finger identify*/ 144*4882a593Smuzhiyun // int pen_id; /*stylu identify*/ 145*4882a593Smuzhiyun // int buf_valid_size; /*hid: 67/67*2, normal:8/18/35/55*/ 146*4882a593Smuzhiyun // int finger_num; /*support finger num*/ 147*4882a593Smuzhiyun // int valid_finger_num; /*current buf support finger num*/ 148*4882a593Smuzhiyun // int button_byte; /*muxtual button*/ 149*4882a593Smuzhiyun // int report_idx; /*coordinate calculate start index*/ 150*4882a593Smuzhiyun // int shift_byte; /*calculate shift*/ 151*4882a593Smuzhiyun // int fbits; /*current finger/pen index is valid or not*/ 152*4882a593Smuzhiyun int tool_type; /**/ 153*4882a593Smuzhiyun }; 154*4882a593Smuzhiyun 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun struct elan_ts_data { 157*4882a593Smuzhiyun struct ts_chip_hw_info hw_info; /*elan touch need gpio*/ 158*4882a593Smuzhiyun struct i2c_client *client; 159*4882a593Smuzhiyun struct elan_fw_info fw_info; 160*4882a593Smuzhiyun struct elan_update_fw_info update_info; 161*4882a593Smuzhiyun struct elan_i2c_operation *ops; 162*4882a593Smuzhiyun struct elan_report_struct report; 163*4882a593Smuzhiyun #ifdef CONFIG_HAS_EARLYSUSPEND 164*4882a593Smuzhiyun struct early_suspend early_suspend; /*for early suspend*/ 165*4882a593Smuzhiyun #endif 166*4882a593Smuzhiyun 167*4882a593Smuzhiyun struct regulator *vdd; /*tp vdd*/ 168*4882a593Smuzhiyun struct regulator *vcc_i2c; /*tp vio*/ 169*4882a593Smuzhiyun bool power_enabled; /*power setting flag*/ 170*4882a593Smuzhiyun 171*4882a593Smuzhiyun int power_lock; /*for i2ctransfer on power off flage*/ 172*4882a593Smuzhiyun int recover; /*fw incomplete flag*/ 173*4882a593Smuzhiyun struct miscdevice firmware; /*for misc dev*/ 174*4882a593Smuzhiyun struct proc_dir_entry *p; /*creat proc dev*/ 175*4882a593Smuzhiyun 176*4882a593Smuzhiyun struct input_dev *finger_idev; /*for register finger input device*/ 177*4882a593Smuzhiyun struct input_dev *pen_idev; /*for register pen inpur device*/ 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun #if defined(CONFIG_FB) 180*4882a593Smuzhiyun struct notifier_block fb_notif; /*FB callback*/ 181*4882a593Smuzhiyun #endif 182*4882a593Smuzhiyun 183*4882a593Smuzhiyun int chip_type; /*chip protocol */ 184*4882a593Smuzhiyun int report_type; /*report protocol*/ 185*4882a593Smuzhiyun int fw_store_type; /*fw stroe*/ 186*4882a593Smuzhiyun 187*4882a593Smuzhiyun 188*4882a593Smuzhiyun struct workqueue_struct *init_elan_ic_wq; /*for ic initial*/ 189*4882a593Smuzhiyun struct delayed_work init_work; 190*4882a593Smuzhiyun 191*4882a593Smuzhiyun struct workqueue_struct *elan_wq; /*for irq handler*/ 192*4882a593Smuzhiyun struct work_struct ts_work; 193*4882a593Smuzhiyun uint8_t level; 194*4882a593Smuzhiyun 195*4882a593Smuzhiyun int int_val; /*for user space*/ 196*4882a593Smuzhiyun int user_handle_irq; /*for switch user or kernel handle irq*/ 197*4882a593Smuzhiyun wait_queue_head_t elan_userqueue; /*wait queue for user space read data*/ 198*4882a593Smuzhiyun int irq_lock_flag; /*irq enable/disable flage, 1=>irq has been disable, 0=>has been enable*/ 199*4882a593Smuzhiyun struct mutex irq_mutex; /* Guards against concurrent access to the irq_lock_flag*/ 200*4882a593Smuzhiyun }; 201*4882a593Smuzhiyun 202*4882a593Smuzhiyun 203*4882a593Smuzhiyun struct vendor_map 204*4882a593Smuzhiyun { 205*4882a593Smuzhiyun int vendor_id; //lcm ID 206*4882a593Smuzhiyun char vendor_name[30]; //lcm vendor name 207*4882a593Smuzhiyun uint8_t* fw_array; // lcm_vendor_fw 208*4882a593Smuzhiyun int fw_size; 209*4882a593Smuzhiyun int fw_id; 210*4882a593Smuzhiyun }; 211*4882a593Smuzhiyun 212*4882a593Smuzhiyun 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun enum elan_get_vendor_fw_type { 215*4882a593Smuzhiyun FROM_SYS_ETC_FIRMWARE, 216*4882a593Smuzhiyun FROM_SDCARD_FIRMWARE, 217*4882a593Smuzhiyun FROM_DRIVER_FIRMWARE, 218*4882a593Smuzhiyun }; 219*4882a593Smuzhiyun 220*4882a593Smuzhiyun enum elan_report_protocol_type { 221*4882a593Smuzhiyun PROTOCOL_TYPE_A = 0x00, 222*4882a593Smuzhiyun PROTOCOL_TYPE_B = 0x01, 223*4882a593Smuzhiyun }; 224*4882a593Smuzhiyun 225*4882a593Smuzhiyun enum elan_chip_protocol_type { 226*4882a593Smuzhiyun HID_TYPE_PROTOCOL = 0x01, 227*4882a593Smuzhiyun NORMAL_TYPE_PROTOCOL = 0x00, 228*4882a593Smuzhiyun }; 229*4882a593Smuzhiyun 230*4882a593Smuzhiyun enum elan_fw_status { 231*4882a593Smuzhiyun HID_FW_NORMAL_MODE = 0x20, 232*4882a593Smuzhiyun HID_FW_RECOVERY_MODE = 0x56, 233*4882a593Smuzhiyun NORMAL_FW_NORMAL_MODE = 0x55, 234*4882a593Smuzhiyun NORMAL_FW_RECOVERY_MODE = 0x80, 235*4882a593Smuzhiyun }; 236*4882a593Smuzhiyun 237*4882a593Smuzhiyun enum fw_update_type { 238*4882a593Smuzhiyun FORCED_UPGRADE = 0x01, 239*4882a593Smuzhiyun COMPARE_UPGRADE = 0x02, 240*4882a593Smuzhiyun UNKNOW_TYPE = -1, 241*4882a593Smuzhiyun }; 242*4882a593Smuzhiyun 243*4882a593Smuzhiyun enum packet_head_type { 244*4882a593Smuzhiyun CMD_S_PKT = 0x52, 245*4882a593Smuzhiyun CMD_R_PKT = 0x53, 246*4882a593Smuzhiyun CMD_W_PKT = 0x54, 247*4882a593Smuzhiyun REG_R_PKT = 0x5B, 248*4882a593Smuzhiyun REG_S_PKT = 0x9B, 249*4882a593Smuzhiyun }; 250*4882a593Smuzhiyun 251*4882a593Smuzhiyun 252*4882a593Smuzhiyun enum report_packet_size { 253*4882a593Smuzhiyun NOR2_SIZE = 8, 254*4882a593Smuzhiyun NOR5_SIZE = 18, 255*4882a593Smuzhiyun NOR10_SIZE = 35, 256*4882a593Smuzhiyun HID5_SIZE = 67, 257*4882a593Smuzhiyun HID10_SIZE = 67*2, 258*4882a593Smuzhiyun }; 259*4882a593Smuzhiyun 260*4882a593Smuzhiyun enum report_packet_id { 261*4882a593Smuzhiyun NOR2_FID = 0x5A, 262*4882a593Smuzhiyun NOR5_FID = 0x5D, 263*4882a593Smuzhiyun NOR10_FID = 0x62, 264*4882a593Smuzhiyun HID_FID = 0x01, 265*4882a593Smuzhiyun HID_PID = 0x07, 266*4882a593Smuzhiyun }; 267*4882a593Smuzhiyun 268*4882a593Smuzhiyun enum report_tool_type { 269*4882a593Smuzhiyun ELAN_FINGER = 0x01, 270*4882a593Smuzhiyun ELAN_PEN = 0x02, 271*4882a593Smuzhiyun }; 272*4882a593Smuzhiyun 273*4882a593Smuzhiyun enum elan_power_status { 274*4882a593Smuzhiyun PWR_STATE_DEEP_SLEEP = 0x00, 275*4882a593Smuzhiyun PWR_STATE_NORMAL = 0x01, 276*4882a593Smuzhiyun }; 277*4882a593Smuzhiyun 278*4882a593Smuzhiyun 279*4882a593Smuzhiyun 280*4882a593Smuzhiyun 281*4882a593Smuzhiyun 282*4882a593Smuzhiyun /*************************dev file macro switch********************/ 283*4882a593Smuzhiyun #define ELAN_IAP_DEV 284*4882a593Smuzhiyun 285*4882a593Smuzhiyun #ifdef ELAN_IAP_DEV 286*4882a593Smuzhiyun #define ELAN_IOCTLID 0xD0 287*4882a593Smuzhiyun #define IOCTL_I2C_SLAVE _IOW(ELAN_IOCTLID, 1, int) 288*4882a593Smuzhiyun #define IOCTL_MAJOR_FW_VER _IOR(ELAN_IOCTLID, 2, int) 289*4882a593Smuzhiyun #define IOCTL_MINOR_FW_VER _IOR(ELAN_IOCTLID, 3, int) 290*4882a593Smuzhiyun #define IOCTL_RESET _IOR(ELAN_IOCTLID, 4, int) 291*4882a593Smuzhiyun #define IOCTL_IAP_MODE_LOCK _IOR(ELAN_IOCTLID, 5, int) 292*4882a593Smuzhiyun #define IOCTL_CHECK_RECOVERY_MODE _IOR(ELAN_IOCTLID, 6, int) 293*4882a593Smuzhiyun #define IOCTL_FW_VER _IOR(ELAN_IOCTLID, 7, int) 294*4882a593Smuzhiyun #define IOCTL_X_RESOLUTION _IOR(ELAN_IOCTLID, 8, int) 295*4882a593Smuzhiyun #define IOCTL_Y_RESOLUTION _IOR(ELAN_IOCTLID, 9, int) 296*4882a593Smuzhiyun #define IOCTL_FW_ID _IOR(ELAN_IOCTLID, 10, int) 297*4882a593Smuzhiyun #define IOCTL_ROUGH_CALIBRATE _IOR(ELAN_IOCTLID, 11, int) 298*4882a593Smuzhiyun #define IOCTL_IAP_MODE_UNLOCK _IOR(ELAN_IOCTLID, 12, int) 299*4882a593Smuzhiyun #define IOCTL_I2C_INT _IOR(ELAN_IOCTLID, 13, int) 300*4882a593Smuzhiyun #define IOCTL_RESUME _IOR(ELAN_IOCTLID, 14, int) 301*4882a593Smuzhiyun #define IOCTL_POWER_LOCK _IOR(ELAN_IOCTLID, 15, int) 302*4882a593Smuzhiyun #define IOCTL_POWER_UNLOCK _IOR(ELAN_IOCTLID, 16, int) 303*4882a593Smuzhiyun #define IOCTL_FW_UPDATE _IOR(ELAN_IOCTLID, 17, int) 304*4882a593Smuzhiyun #define IOCTL_BC_VER _IOR(ELAN_IOCTLID, 18, int) 305*4882a593Smuzhiyun #define IOCTL_2WIREICE _IOR(ELAN_IOCTLID, 19, int) 306*4882a593Smuzhiyun #define IOCTL_VIAROM _IOR(ELAN_IOCTLID, 20, int) 307*4882a593Smuzhiyun #define IOCTL_VIAROM_CHECKSUM _IOW(ELAN_IOCTLID, 21, unsigned long) 308*4882a593Smuzhiyun #define IOCTL_GET_UPDATE_PROGREE _IOR(CUSTOMER_IOCTLID, 2, int) 309*4882a593Smuzhiyun #define IOCTL_USER_HANDLE_IRQ _IOR(ELAN_IOCTLID, 22, int) 310*4882a593Smuzhiyun #define IOCTL_KERN_HANDLE_IRQ _IOR(ELAN_IOCTLID, 23, int) 311*4882a593Smuzhiyun #endif 312*4882a593Smuzhiyun 313*4882a593Smuzhiyun 314*4882a593Smuzhiyun //define print log 315*4882a593Smuzhiyun //#define LOG_TAG(tag) "[tag]: %s() line: %d " 316*4882a593Smuzhiyun #define TP_DEBUG 0//"dbg" 317*4882a593Smuzhiyun #define TP_WARNING 1 318*4882a593Smuzhiyun #define TP_INFO 2//"info" 319*4882a593Smuzhiyun #define TP_ERR 4//"err" 320*4882a593Smuzhiyun 321*4882a593Smuzhiyun #define print_log(level, fmt, args...) \ 322*4882a593Smuzhiyun do { \ 323*4882a593Smuzhiyun if (level > TP_WARNING) \ 324*4882a593Smuzhiyun printk("[elan]:"fmt"\n",##args);\ 325*4882a593Smuzhiyun } while(0) 326*4882a593Smuzhiyun 327*4882a593Smuzhiyun 328*4882a593Smuzhiyun //extern function 329*4882a593Smuzhiyun extern void elan_check_update_flage(struct elan_ts_data *ts); 330*4882a593Smuzhiyun extern int elan__fw_packet_handler(struct i2c_client *client); 331*4882a593Smuzhiyun extern int elan__hello_packet_handler(struct i2c_client *client, int chip_type); 332*4882a593Smuzhiyun extern void elan_ts_hw_reset(struct ts_chip_hw_info *hw_info); 333*4882a593Smuzhiyun extern void elan_switch_irq(struct elan_ts_data *ts, int on); 334*4882a593Smuzhiyun extern int elan_ts_calibrate(struct i2c_client *client); 335*4882a593Smuzhiyun extern int elan_FW_Update(struct i2c_client *client); 336*4882a593Smuzhiyun extern int elan_ic_status(struct i2c_client *client); 337*4882a593Smuzhiyun extern int elan_ts_check_calibrate(struct i2c_client *client); 338*4882a593Smuzhiyun extern int elan_sysfs_attri_file(struct elan_ts_data *ts); 339*4882a593Smuzhiyun extern void elan_sysfs_attri_file_remove(struct elan_ts_data *ts); 340*4882a593Smuzhiyun extern int elan_get_vendor_fw(struct elan_ts_data *ts, int type); 341*4882a593Smuzhiyun extern int elan_tp_module_test(struct elan_ts_data *ts); 342*4882a593Smuzhiyun #endif /* _LINUX_ELAN_KTF_H */ 343