android_kernel_samsung_hero.../drivers/input/wacom/wacom_i2c.h
2016-08-17 16:41:52 +08:00

315 lines
7.6 KiB
C

#ifndef _LINUX_WACOM_I2C_H
#define _LINUX_WACOM_I2C_H
#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/input.h>
#include <linux/i2c.h>
#include <linux/interrupt.h>
#include <linux/slab.h>
#include <linux/hrtimer.h>
#include <linux/gpio.h>
#include <linux/irq.h>
#include <linux/delay.h>
#include <linux/wakelock.h>
#include <linux/uaccess.h>
#include <linux/of_gpio.h>
#ifdef CONFIG_HAS_EARLYSUSPEND
#include <linux/earlysuspend.h>
#endif
#ifdef CONFIG_INPUT_BOOSTER
#include <linux/input/input_booster.h>
#endif
#include <linux/regulator/consumer.h>
/*
* Wacom Interrupt Name
*/
#define WACOM_DEVICE_NAME "wacom_i2c"
#define WACOM_INTERRUPT_NAME "wacom_irq"
#define WACOM_PDCT_NAME "wacom_pdct"
#define WACOM_PEN_INSERT_NAME "wacom_pen_insert"
/*
* Support feature for THIS Module
*/
#define WACOM_PDCT_WORK_AROUND
#define WACOM_HAVE_FWE_PIN
#define WACOM_USE_SOFTKEY
#define COOR_WORK_AROUND
#define WACOM_UMS_UPDATE
#define WACOM_USE_GAIN
#define BATTERY_SAVING_MODE
#define WACOM_CONNECTION_CHECK
/*#define WACOM_PEN_DETECT*/
/*#define WACOM_MAINSCREEN_DISABLE*/
/*
#ifdef BATTERY_SAVING_MODE
#ifndef WACOM_PEN_DETECT
#define WACOM_PEN_DETECT
#endif
#endif
*/
/* wacom region : touch region, touchkey region,
* HW team request : block touchkey event between touch release ~ 100msec.
*/
#define USE_WACOM_BLOCK_KEYEVENT
#ifdef CONFIG_WACOM_LCD_FREQ_COMPENSATE
/* NOISE from LDI. read Vsync at wacom firmware. */
#define USE_WACOM_LCD_WORKAROUND
#endif
/* Report Tilt X, Tilt Y for calculate degree and orientation
* Report Hover Height for using SPEN SDK
*/
#define USE_WACOM_TILT_HEIGH
/* for reduce query waiting time.
* before : send QUERY command, delay 100 msec, receive QUERY data(14 byte).
* after : receive 24 or 26 byte data, upper 12~14 data is garbage or coordinate data,
* lower 14 byte is QUERY data.
*/
#undef USE_REDUCE_QUERY_TIME
/* Wacom Firmware Update Path, Firmware name */
#define WACOM_MAX_FW_PATH 64
#define WACOM_FW_NAME_NONE NULL
#define WACOM_UMS_FW_PATH "/sdcard/firmware/wacom_firm.bin"
/* { 0x1F, 0xAA, 0xBB, 0xCC, 0xDD} : 0x1F is fixed value. */
#ifdef CONFIG_SEC_TRLTE_PROJECT
#if defined(CONFIG_MACH_TRLTE_ATT) || defined(CONFIG_MACH_TRLTE_TMO)
#define WACOM_FW_NAME_W9012 "epen/W9012_tr.bin"
#define WACOM_FW_CHECKSUM { 0x1F, 0xEE, 0x3C, 0x80, 0x41, } /* ver 0x0237 */
#else
#define WACOM_FW_NAME_W9012 "epen/W9012_tr_239.bin"
#define WACOM_FW_CHECKSUM { 0x1F, 0x76, 0x4E, 0x9B, 0x88, } /* ver 0x0239 */
#endif
#undef USE_REDUCE_QUERY_TIME
#else // CONFIG_SEC_TBLTE_PROJECT
#define WACOM_FW_NAME_W9012 "epen/W9012_tb.bin"
#define WACOM_FW_CHECKSUM { 0x1F, 0x0C, 0xF6, 0x6C, 0x4A, } /* ver 0x024B */
#undef USE_REDUCE_QUERY_TIME
#endif
/* Wacom Command */
#define COM_READ_ALL_DATA_LENGTH 28
#define NUM_OF_UNNECESSARY_DATA 14
#define COM_COORD_NUM 12
#define COM_QUERY_NUM 14
#define COM_SAMPLERATE_STOP 0x30
#define COM_SAMPLERATE_40 0x33
#define COM_SAMPLERATE_80 0x32
#define COM_SAMPLERATE_133 0x31
#define COM_SURVEYSCAN 0x2B
#define COM_QUERY 0x2A
#define COM_FLASH 0xff
#define COM_CHECKSUM 0x63
/* Wacom coord information size in device tree */
#define WACOM_COORDS_ARR_SIZE 9
/* Wacom I2C address for digitizer and its boot loader */
#define WACOM_I2C_ADDR 0x56
#define WACOM_I2C_BOOT 0x09
#define WACOM_I2C_9001_BOOT 0x57
#define WACOM_I2C_STOP 0x30
#define WACOM_I2C_START 0x31
#define WACOM_I2C_GRID_CHECK 0xC9
#define WACOM_STATUS 0xD8
/* Wacom PDCT Signal */
#define PDCT_NOSIGNAL 1
#define PDCT_DETECT_PEN 0
/* Wacom origin offset : This will be removed. Firmware supported */
#define EPEN_B660_ORG_X 456
#define EPEN_B660_ORG_Y 504
#define EPEN_B713_ORG_X 676
#define EPEN_B713_ORG_Y 724
/*HWID to distinguish Detect Switch*/
#define WACOM_DETECT_SWITCH_HWID 0xFFFF
/*HWID to distinguish FWE1*/
#define WACOM_FWE1_HWID 0xFFFF
/*HWID to distinguish B911 Digitizer*/
#define WACOM_DTYPE_B911_HWID 1
/* Sampling Rate / Report rate */
#define SAMPLING_RATE_120HZ 0x31
#define SAMPLING_RATE_80HZ 0x32
#define SAMPLING_RATE_40HZ 0x33
#define SAMPLING_RATE_NOT_DEFINED 0
/* Wacom data read from QUERY */
struct wacom_query_data {
int x_max;
int y_max;
int pressure_max;
char comstat;
u8 data[COM_COORD_NUM];
unsigned int fw_version_ic;
unsigned int fw_version_bin;
int firm_update_status;
int tiltx_max;
int tilty_max;
int height_max;
unsigned char mpu_type;
unsigned char bootloader_ver;
};
/* Wacom data read from DEVICETREE */
struct wacom_devicetree_data {
/* using dts feature */
const char *basic_model;
bool i2c_pull_up;
int gpio_int;
u32 irq_gpio_flags;
int gpio_sda;
u32 sda_gpio_flags;
int gpio_scl;
u32 scl_gpio_flags;
int vdd_en;
int gpio_pen_reset_n;
u32 pen_reset_n_gpio_flags;
int gpio_pen_fwe1;
u32 pen_fwe1_gpio_flags;
int gpio_pen_pdct;
u32 pen_pdct_gpio_flags;
int x_invert;
int y_invert;
int xy_switch;
int min_x;
int max_x;
int min_y;
int max_y;
int max_pressure;
int min_pressure;
int gpio_pendct;
u32 ic_mpu_ver;
u32 irq_flags;
u32 wacom_firmup_flag;
/* using dts feature */
int gpio_pen_insert;
};
/*Parameters for i2c driver*/
struct wacom_i2c {
struct i2c_client *client;
struct i2c_client *client_boot;
struct input_dev *input_dev;
#ifdef CONFIG_HAS_EARLYSUSPEND
struct early_suspend early_suspend;
#endif
struct mutex lock;
struct mutex irq_lock;
#ifdef WACOM_BOOSTER
struct input_booster *wacom_booster;
#endif
unsigned char * fw_data;
bool ums_binary;
struct device *dev;
int irq;
#ifdef WACOM_PDCT_WORK_AROUND
int irq_pdct;
#endif
int pen_pdct;
int gpio;
int irq_flag;
int pen_prox;
int pen_pressed;
int side_pressed;
int tool;
s16 last_x;
s16 last_y;
unsigned char sampling_rate;
#ifdef WACOM_PEN_DETECT
int irq_pen_insert;
struct delayed_work pen_insert_dwork;
bool pen_insert;
int gpio_pen_insert;
#endif
int invert_pen_insert;
#ifdef WACOM_HAVE_FWE_PIN
int gpio_fwe;
bool have_fwe_pin;
#endif
bool checksum_result;
struct wacom_query_data *wac_query_data;
struct wacom_devicetree_data *wac_dt_data;
int (*power)(int on);
struct delayed_work resume_work;
#ifdef BATTERY_SAVING_MODE
bool battery_saving_mode;
#endif
bool power_enable;
bool boot_mode;
bool query_status;
int ic_mpu_ver;
int boot_ver;
bool init_fail;
#ifdef USE_WACOM_LCD_WORKAROUND
unsigned int vsync;
struct delayed_work read_vsync_work;
struct delayed_work boot_done_work;
bool wait_done;
bool boot_done;
unsigned int delay_time;
#endif
#ifdef USE_WACOM_BLOCK_KEYEVENT
struct delayed_work touch_pressed_work;
unsigned int key_delay_time;
bool touchkey_skipped;
bool touch_pressed;
#endif
bool enabled;
#ifdef WACOM_HAVE_FWE_PIN
void (*compulsory_flash_mode)(struct wacom_i2c *, bool);
#endif
int (*reset_platform_hw)(struct wacom_i2c *);
int (*wacom_start)(struct wacom_i2c *);
int (*wacom_stop)(struct wacom_i2c *);
int (*wacom_i2c_send)(struct wacom_i2c *,
const char *, int , bool);
int (*wacom_i2c_recv)(struct wacom_i2c *,
char *, int, bool);
int (*wacom_i2c_query)(struct wacom_i2c *);
void (*wacom_i2c_disable)(struct wacom_i2c *);
void (*wacom_i2c_enable)(struct wacom_i2c *);
void (*wacom_enable_irq)(struct wacom_i2c *, bool);
struct wake_lock wakelock_pen_insert;
struct wake_lock wakelock;
};
extern struct class *sec_class;
/*extern unsigned int system_rev;*/
extern int boot_mode_recovery;
#ifdef CONFIG_SAMSUNG_LPM_MODE
extern int poweroff_charging;
#endif
#ifdef USE_WACOM_LCD_WORKAROUND
extern int ldi_fps(unsigned int input_fps);
#endif
extern int wacom_factory_probe(struct device *dev);
extern void wacom_factory_release(struct device *dev);
extern int get_lcd_attached(void);
extern int wacom_i2c_modecheck(struct wacom_i2c *wac_i2c);
#endif /* _LINUX_WACOM_I2C_H */