blob: 7198a528fe37ac243ccf52d5295e1c921b987113 [file] [log] [blame]
#ifndef _LINUX_WACOM_H_
#define _LINUX_WACOM_H_
#include <linux/wakelock.h>
#include <linux/sec_sysfs.h>
#include "wacom_i2c.h"
/* wacom features */
#define USE_OPEN_CLOSE
#define WACOM_USE_SURVEY_MODE /* SURVEY MODE is LPM mode : Only detect grage(pdct) & aop */
#define WACOM_USE_SOFTKEY_BLOCK
#define WACOM_I2C_MODE_NORMAL false
#define WACOM_I2C_MODE_BOOT true
#define PDCT_NOSIGNAL true
#define PDCT_DETECT_PEN false
/* wacom command */
#define COM_QUERY 0x2A
#define COM_SURVEYSCAN 0x2B
#define COM_SURVEYEXIT 0x2D
#define COM_SURVEYREQUESTDATA 0x2E
#define COM_SAMPLERATE_STOP 0x30
#define COM_SAMPLERATE_133 0x31
#define COM_SAMPLERATE_80 0x32
#define COM_SAMPLERATE_40 0x33
#define COM_SAMPLERATE_START COM_SAMPLERATE_133
#define COM_SURVEY_TARGET_GARAGE_AOP 0x3A
#define COM_SURVEY_TARGET_GARAGEONLY 0x3B
#define COM_CHECKSUM 0x63
#define COM_NORMAL_COMPENSATION 0x80
#define COM_SPECIAL_COMPENSATION 0x81
#define COM_OPEN_CHECK_START 0xC9
#define COM_OPEN_CHECK_STATUS 0xD8
#define COM_NORMAL_SENSE_MODE 0xDB
#define COM_LOW_SENSE_MODE 0xDC
#define COM_REQUEST_SENSE_MODE 0xDD
#define COM_REQUESTGARAGEDATA 0XE5
#define COM_REQUESTSCANMODE 0xE6
#define COM_LOW_SENSE_MODE2 0xE7
#define COM_FLASH 0xFF
/* wacom data offset */
#define COM_COORD_NUM 13
#define COM_RESERVED_NUM 1
#define COM_QUERY_NUM 15
#define COM_QUERY_POS (COM_COORD_NUM+COM_RESERVED_NUM)
#define COM_QUERY_BUFFER (COM_QUERY_POS+COM_QUERY_NUM)
/* wacom query data format */
#define EPEN_REG_HEADER 0x00
#define EPEN_REG_X1 0x01
#define EPEN_REG_X2 0x02
#define EPEN_REG_Y1 0x03
#define EPEN_REG_Y2 0x04
#define EPEN_REG_PRESSURE1 0x05
#define EPEN_REG_PRESSURE2 0x06
#define EPEN_REG_FWVER1 0x07
#define EPEN_REG_FWVER2 0x08
#define EPEN_REG_MPUVER 0x09
#define EPEN_REG_BLVER 0x0A
#define EPEN_REG_TILT_X 0x0B
#define EPEN_REG_TILT_Y 0x0C
#define EPEN_REG_HEIGHT 0x0D
/* wacom status magic nuber */
#define WACOM_NOISE_HIGH 0x11
#define WACOM_NOISE_LOW 0x22
#define AOP_BUTTON_HOVER 0xBB
#define AOP_DOUBLE_TAB 0xDD
/* skip event for keyboard cover */
#define KEYBOARD_COVER_BOUNDARY 10400
enum epen_virtual_event_mode {
EPEN_POS_NONE = 0,
EPEN_POS_VIEW = 1,
EPEN_POS_COVER = 2,
};
/*--------------------------------------------------
* event
* wac_i2c->function_result
* 7. ~ 4. reserved || 3. Garage | 2. Power Save | 1. AOP | 0. Pen In/Out |
*
* 0. Pen In/Out ( pen_insert )
* ( 0: IN / 1: OUT )
*--------------------------------------------------
*/
#define EPEN_EVENT_PEN_OUT (0x1<<0)
#define EPEN_EVENT_GARAGE (0x1<<1)
#define EPEN_EVENT_AOP (0x1<<2)
#define EPEN_EVENT_SURVEY (EPEN_EVENT_GARAGE | EPEN_EVENT_AOP)
/*--------------------------------------------------
* function setting by user or default
* wac_i2c->function_set
* 7~3. reserved | 2. AOT | 1. ScreenOffMemo | 0. AOD |
*
* 2. AOT - aot_enable sysfs
* 1. ScreenOffMemo - screen_off_memo_enable sysfs
* 0. AOD - aod_enable sysfs
*--------------------------------------------------
*/
#define EPEN_SETMODE_AOP_OPTION_AOD (0x1<<0)
#define EPEN_SETMODE_AOP_OPTION_SCREENOFFMEMO (0x1<<1)
#define EPEN_SETMODE_AOP_OPTION_AOT (0x1<<2)
#define EPEN_SETMODE_AOP (EPEN_SETMODE_AOP_OPTION_AOD | EPEN_SETMODE_AOP_OPTION_SCREENOFFMEMO | \
EPEN_SETMODE_AOP_OPTION_AOT)
#define EPEN_SURVEY_MODE_NONE 0x0
#define EPEN_SURVEY_MODE_GARAGE_ONLY EPEN_EVENT_GARAGE
#define EPEN_SURVEY_MODE_GARAGE_AOP EPEN_EVENT_AOP
/* DeX mode : param of dex_enable command */
#define DEX_MODE_STYLUS (0 << 0) /* absolute coordinate */
#define DEX_MODE_MOUSE (1 << 0) /* relative coordinate */
#define DEX_MODE_EDGE_CROP (1 << 1) /* crop 10% each of both edge side*/
#define DEX_MODE_IRIS (1 << 2) /* Iris mode : only use an half of bottom side of screen */
#define DEX_MODE_ALL (DEX_MODE_MOUSE | DEX_MODE_EDGE_CROP | DEX_MODE_IRIS)
#ifdef WACOM_USE_SURVEY_MODE
#define EPEN_RESUME_DELAY 20
#else
#define EPEN_RESUME_DELAY 180
#endif
#define EPEN_OFF_TIME_LIMIT 10000 // usec
#ifdef WACOM_USE_SOFTKEY_BLOCK
#define SOFTKEY_BLOCK_DURATION (HZ / 10)
#endif
/* LCD freq sync */
#ifdef CONFIG_WACOM_LCD_FREQ_COMPENSATE
/* NOISE from LDI. read Vsync at wacom firmware. */
#define LCD_FREQ_SYNC
#endif
#ifdef LCD_FREQ_SYNC
#define LCD_FREQ_BOTTOM 60100
#define LCD_FREQ_TOP 60500
#endif
#define HSYNC_COUNTER_UMAGIC 0x96
#define HSYNC_COUNTER_LMAGIC 0xCA
#define TABLE_SWAP_DATA 0x05
/*--------------------------------------------------
* Set/Get S-Pen mode for TSP
* 1 byte input/output parameter
* byte[0]: S-pen mode
* - 0: global scan mode
* - 1: local scan mode
* - 2: high noise mode
* - others: Reserved for future use
*--------------------------------------------------
*/
#define EPEN_GLOBAL_SCAN_MODE 0x00
#define EPEN_LOCAL_SCAN_MODE 0x01
#define EPEN_HIGH_NOISE_MODE 0x02
#define FW_UPDATE_RUNNING 1
#define FW_UPDATE_PASS 2
#define FW_UPDATE_FAIL -1
/* Parameters for wacom own features */
struct wacom_features {
char comstat;
unsigned int fw_version;
int update_status;
};
enum {
FW_NONE = 0,
FW_BUILT_IN,
FW_HEADER,
FW_IN_SDCARD,
FW_EX_SDCARD,
#ifdef CONFIG_SEC_FACTORY
FW_FACTORY_PROC,
#endif
};
/* header ver 1 */
struct fw_image {
u8 hdr_ver;
u8 hdr_len;
u16 fw_ver1;
u16 fw_ver2;
u16 fw_ver3;
u32 fw_len;
u8 checksum[5];
u8 alignment_dummy[3];
u8 data[0];
} __attribute__ ((packed));
enum {
EPEN_POS_ID_SCREEN_OF_MEMO = 1,
};
/*
* struct epen_pos - for using to send coordinate in survey mode
* @id: for extension of function
* 0 -> not use
* 1 -> for Screen off Memo
* 2 -> for oter app or function
* @x: x coordinate
* @y: y coordinate
*/
struct epen_pos {
u8 id;
int x;
int y;
};
struct wacom_i2c {
struct i2c_client *client;
struct i2c_client *client_boot;
struct input_dev *input_dev;
struct input_dev *input_dev_pad;
struct input_dev *input_dev_pen;
struct input_dev *input_dev_virtual;
struct mutex lock;
struct mutex update_lock;
struct mutex irq_lock;
struct wake_lock fw_wakelock;
struct device *dev;
struct notifier_block typec_nb;
struct delayed_work typec_nb_reg_work;
struct delayed_work usb_typec_work;
u8 dp_connect_state;
u8 dp_connect_cmd;
int irq;
int irq_pdct;
int pen_pdct;
int pen_prox;
int pen_pressed;
int side_pressed;
bool fullscan_mode;
int tsp_noise_mode;
int wacom_noise_state;
int tool;
int soft_key_pressed[2];
struct delayed_work pen_insert_dwork;
bool checksum_result;
struct wacom_features *wac_feature;
struct wacom_g5_platform_data *pdata;
struct delayed_work resume_work;
struct delayed_work fullscan_check_work;
bool connection_check;
int fail_channel;
int min_adc_val;
bool battery_saving_mode;
bool screen_on;
bool power_enable;
struct completion resume_done;
struct wake_lock wakelock;
bool pm_suspend;
u8 survey_mode;
bool epen_blocked;
u8 function_set;
u8 function_result;
volatile bool reset_flag;
struct epen_pos survey_pos;
bool query_status;
int wcharging_mode;
u32 i2c_fail_count;
u32 abnormal_reset_count;
#ifdef LCD_FREQ_SYNC
int lcd_freq;
bool lcd_freq_wait;
bool use_lcd_freq_sync;
struct work_struct lcd_freq_work;
struct delayed_work lcd_freq_done_work;
struct mutex freq_write_lock;
#endif
#ifdef WACOM_USE_SOFTKEY_BLOCK
bool block_softkey;
struct delayed_work softkey_block_work;
#endif
struct work_struct update_work;
const struct firmware *firm_data;
struct fw_image *fw_img;
u8 *fw_data;
u32 fw_ver_file;
char fw_chksum[5];
u8 fw_update_way;
bool do_crc_check;
bool keyboard_cover_mode;
bool keyboard_area;
int virtual_tracking;
u8 dex_mode;
u32 mcount;
#ifdef CONFIG_SEC_FACTORY
volatile bool fac_garage_mode;
u32 garage_gain0;
u32 garage_gain1;
u32 garage_freq0;
u32 garage_freq1;
#endif
};
int wacom_power(struct wacom_i2c *, bool on);
void wacom_reset_hw(struct wacom_i2c *);
void wacom_compulsory_flash_mode(struct wacom_i2c *, bool enable);
int wacom_get_irq_state(struct wacom_i2c *);
void wacom_wakeup_sequence(struct wacom_i2c *);
void wacom_sleep_sequence(struct wacom_i2c *);
int wacom_fw_update(struct wacom_i2c *, u8 fw_update_way, bool bforced);
int wacom_i2c_flash(struct wacom_i2c *);
void wacom_enable_irq(struct wacom_i2c *, bool enable);
void wacom_enable_pdct_irq(struct wacom_i2c *, bool enable);
int wacom_i2c_send(struct wacom_i2c *, const char *buf, int count, bool mode);
int wacom_i2c_recv(struct wacom_i2c *, char *buf, int count, bool mode);
int wacom_i2c_query(struct wacom_i2c *);
int wacom_checksum(struct wacom_i2c *);
int wacom_i2c_set_sense_mode(struct wacom_i2c *);
void forced_release(struct wacom_i2c *);
void forced_release_key(struct wacom_i2c *);
void wacom_select_survey_mode(struct wacom_i2c *, bool enable);
void wacom_i2c_set_survey_mode(struct wacom_i2c *, int mode);
int wacom_open_test(struct wacom_i2c *wac_i2c);
int wacom_sec_init(struct wacom_i2c *);
void wacom_sec_remove(struct wacom_i2c *);
#endif /* _LINUX_WACOM_H_ */