mako: touch driver merge
- lge touch common driver
- synaptics touch driver integration with lge common driver
Change-Id: I72e53f8d16610155ab1a31a366e33910a41643be
diff --git a/include/linux/input/lge_touch_core.h b/include/linux/input/lge_touch_core.h
new file mode 100644
index 0000000..776c3ce
--- /dev/null
+++ b/include/linux/input/lge_touch_core.h
@@ -0,0 +1,403 @@
+/* include/linux/lge_touch_core.h
+ *
+ * Copyright (C) 2011 LGE.
+ *
+ * Author: yehan.ahn@lge.com, hyesung.shin@lge.com
+ *
+ * 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.
+ *
+ */
+
+#ifndef LGE_TOUCH_CORE_H
+#define LGE_TOUCH_CORE_H
+
+//#define LGE_TOUCH_TIME_DEBUG
+
+#define MAX_FINGER 10
+#define MAX_BUTTON 4
+
+struct touch_device_caps {
+ u8 button_support;
+ u16 y_button_boundary;
+ u32 button_margin;
+ u8 number_of_button;
+ u32 button_name[MAX_BUTTON];
+ u8 is_width_supported;
+ u8 is_pressure_supported;
+ u8 is_id_supported;
+ u32 max_width;
+ u32 max_pressure;
+ u32 max_id;
+ u32 x_max;
+ u32 y_max;
+ u32 lcd_x;
+ u32 lcd_y;
+};
+
+struct touch_operation_role {
+ u8 operation_mode; /* interrupt = 1 , polling = 0; */
+ u8 key_type; /* none = 0, hard_touch_key = 1, virtual_key = 2 */
+ u8 report_mode;
+ u8 delta_pos_threshold;
+ u8 orientation; /* 0' = 0, 90' = 1, 180' = 2, 270' = 3 */
+ u32 report_period; /* ns */
+ u32 booting_delay; /* ms */
+ u32 reset_delay; /* ms */
+ u8 suspend_pwr;
+ u8 resume_pwr;
+ int jitter_filter_enable; /* enable = 1, disable = 0 */
+ int jitter_curr_ratio;
+ int accuracy_filter_enable; /* enable = 1, disable = 0 */
+ unsigned long irqflags;
+#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
+ int show_touches;
+ int pointer_location;
+#endif
+};
+
+struct touch_power_module {
+ u8 use_regulator;
+ char vdd[30];
+ int vdd_voltage;
+ char vio[30];
+ int vio_voltage;
+ int (*power)(int on);
+};
+
+struct touch_platform_data {
+ u32 int_pin;
+ u32 reset_pin;
+ char maker[30];
+ struct touch_device_caps *caps;
+ struct touch_operation_role *role;
+ struct touch_power_module *pwr;
+};
+
+struct t_data {
+ u16 id;
+ u16 x_position;
+ u16 y_position;
+ u16 width_major;
+ u16 width_minor;
+ u16 width_orientation;
+ u16 pressure;
+};
+
+struct b_data {
+ u16 key_code;
+ u16 state;
+};
+
+struct touch_data {
+ u8 total_num;
+ u8 prev_total_num;
+ u8 state;
+ struct t_data curr_data[MAX_FINGER];
+ struct t_data prev_data[MAX_FINGER];
+ struct b_data curr_button;
+ struct b_data prev_button;
+};
+
+struct touch_fw_info {
+ u8 fw_rev;
+ u8 fw_image_rev;
+ u8 manufacturer_id;
+ u8 product_id[11];
+ u8 fw_image_product_id[11];
+#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
+ u8 fw_version[5];
+ u8 fw_image_version[5];
+ bool fw_force_rework;
+#endif
+ unsigned char *fw_start;
+ unsigned long fw_size;
+};
+
+struct fw_upgrade_info {
+ char fw_path[256];
+ u8 fw_force_upgrade;
+ volatile u8 is_downloading;
+};
+
+struct rect {
+ u16 left;
+ u16 right;
+ u16 top;
+ u16 bottom;
+};
+
+struct section_info
+{
+ struct rect panel;
+ struct rect button[MAX_BUTTON];
+ struct rect button_cancel[MAX_BUTTON];
+ u16 b_inner_width;
+ u16 b_width;
+ u16 b_margin;
+ u16 b_height;
+ u16 b_num;
+ u16 b_name[MAX_BUTTON];
+};
+
+struct ghost_finger_ctrl {
+ volatile u8 stage;
+ int count;
+ int min_count;
+ int max_count;
+ int ghost_check_count;
+};
+
+struct jitter_history_data {
+ u16 x;
+ u16 y;
+ u16 pressure;
+ int delta_x;
+ int delta_y;
+};
+
+struct jitter_filter_info {
+ int id_mask;
+ int adjust_margin;
+ struct jitter_history_data his_data[10];
+};
+
+struct accuracy_history_data {
+ u16 x;
+ u16 y;
+ u16 pressure;
+ int count;
+ int mod_x;
+ int mod_y;
+ int axis_x;
+ int axis_y;
+ int prev_total_num;
+};
+
+struct accuracy_filter_info {
+ int ignore_pressure_gap;
+ int touch_max_count;
+ int delta_max;
+ int max_pressure;
+ int direction_count;
+ int time_to_max_pressure;
+ u16 finish_filter;
+ struct accuracy_history_data his_data;
+};
+
+struct lge_touch_data {
+ void* h_touch;
+ atomic_t next_work;
+ atomic_t device_init;
+ u8 work_sync_err_cnt;
+ u8 ic_init_err_cnt;
+ volatile int curr_pwr_state;
+ struct i2c_client *client;
+ struct input_dev *input_dev;
+ struct hrtimer timer;
+ struct work_struct work;
+ struct delayed_work work_init;
+ struct delayed_work work_touch_lock;
+ struct work_struct work_fw_upgrade;
+ struct early_suspend early_suspend;
+ struct touch_platform_data *pdata;
+ struct touch_data ts_data;
+ struct touch_fw_info fw_info;
+ struct fw_upgrade_info fw_upgrade;
+ struct section_info st_info;
+ struct kobject lge_touch_kobj;
+ struct ghost_finger_ctrl gf_ctrl;
+ struct jitter_filter_info jitter_filter;
+ struct accuracy_filter_info accuracy_filter;
+};
+
+struct touch_device_driver {
+ int (*probe) (struct i2c_client *client);
+ void (*remove) (struct i2c_client *client);
+ int (*init) (struct i2c_client *client, struct touch_fw_info* info);
+ int (*data) (struct i2c_client *client, struct t_data* data,
+ struct b_data* button, u8* total_num);
+ int (*power) (struct i2c_client *client, int power_ctrl);
+ int (*ic_ctrl) (struct i2c_client *client, u8 code, u16 value);
+ int (*fw_upgrade) (struct i2c_client *client, const char* fw_path);
+ int (*fw_upgrade_check) (struct lge_touch_data *ts);
+};
+
+enum {
+ POLLING_MODE = 0,
+ INTERRUPT_MODE,
+ HYBRIDE_MODE
+};
+
+enum {
+ POWER_OFF = 0,
+ POWER_ON,
+ POWER_SLEEP,
+ POWER_WAKE
+};
+
+enum {
+ KEY_NONE = 0,
+ TOUCH_HARD_KEY,
+ TOUCH_SOFT_KEY,
+ VIRTUAL_KEY,
+};
+
+enum {
+ CONTINUOUS_REPORT_MODE = 0,
+ REDUCED_REPORT_MODE,
+};
+
+enum {
+ RESET_NONE = 0,
+ SOFT_RESET,
+ PIN_RESET,
+ VDD_RESET,
+};
+
+enum {
+ DOWNLOAD_COMPLETE = 0,
+ UNDER_DOWNLOADING,
+};
+
+enum {
+ OP_NULL = 0,
+ OP_RELEASE,
+ OP_SINGLE,
+ OP_MULTI,
+ OP_LOCK,
+};
+
+enum {
+ KEY_NULL=0,
+ KEY_PANEL,
+ KEY_BOUNDARY
+};
+
+enum {
+ DO_NOT_ANYTHING = 0,
+ ABS_PRESS,
+ ABS_RELEASE,
+ BUTTON_PRESS,
+ BUTTON_RELEASE,
+ BUTTON_CANCEL,
+ TOUCH_BUTTON_LOCK,
+ TOUCH_ABS_LOCK
+};
+
+enum {
+ BUTTON_RELEASED = 0,
+ BUTTON_PRESSED = 1,
+ BUTTON_CANCLED = 0xff,
+};
+
+enum {
+ KEYGUARD_RESERVED,
+ KEYGUARD_ENABLE,
+};
+
+enum {
+ GHOST_STAGE_CLEAR = 0,
+ GHOST_STAGE_1 = 1,
+ GHOST_STAGE_2 = 2,
+ GHOST_STAGE_3 = 4,
+};
+
+enum {
+ BASELINE_OPEN = 0,
+ BASELINE_FIX,
+ BASELINE_REBASE,
+};
+
+enum {
+ IC_CTRL_CODE_NONE = 0,
+ IC_CTRL_BASELINE,
+ IC_CTRL_READ,
+ IC_CTRL_WRITE,
+ IC_CTRL_RESET_CMD,
+};
+
+enum {
+ DEBUG_NONE = 0,
+ DEBUG_BASE_INFO = (1U << 0), // 1
+ DEBUG_TRACE = (1U << 1), // 2
+ DEBUG_GET_DATA = (1U << 2), // 4
+ DEBUG_ABS = (1U << 3), // 8
+ DEBUG_BUTTON = (1U << 4), // 16
+ DEBUG_FW_UPGRADE = (1U << 5), // 32
+ DEBUG_GHOST = (1U << 6), // 64
+ DEBUG_IRQ_HANDLE = (1U << 7), // 128
+ DEBUG_POWER = (1U << 8), // 256
+ DEBUG_JITTER = (1U << 9), // 512
+ DEBUG_ACCURACY = (1U << 10), // 1024
+};
+
+#ifdef LGE_TOUCH_TIME_DEBUG
+enum {
+ TIME_ISR_START = 0,
+ TIME_INT_INTERVAL,
+ TIME_THREAD_ISR_START,
+ TIME_WORKQUEUE_START,
+ TIME_WORKQUEUE_END,
+ TIME_FW_UPGRADE_START,
+ TIME_FW_UPGRADE_END,
+ TIME_PROFILE_MAX,
+};
+
+enum {
+ DEBUG_TIME_PROFILE_NONE = 0,
+ DEBUG_TIME_INT_INTERVAL = (1U << 0), // 1
+ DEBUG_TIME_INT_IRQ_DELAY = (1U << 1), // 2
+ DEBUG_TIME_INT_THREAD_IRQ_DELAY = (1U << 2), // 4
+ DEBUG_TIME_DATA_HANDLE = (1U << 3), // 8
+ DEBUG_TIME_FW_UPGRADE = (1U << 4), // 16
+ DEBUG_TIME_PROFILE_ALL = (1U << 5), // 32
+};
+#endif
+
+#define LGE_TOUCH_NAME "lge_touch"
+
+/* Debug Mask setting */
+#define TOUCH_DEBUG_PRINT (1)
+#define TOUCH_ERROR_PRINT (1)
+#define TOUCH_INFO_PRINT (1)
+
+#if defined(TOUCH_INFO_PRINT)
+#define TOUCH_INFO_MSG(fmt, args...) printk(KERN_INFO "[Touch] " fmt, ##args)
+#else
+#define TOUCH_INFO_MSG(fmt, args...)
+#endif
+
+#if defined(TOUCH_ERROR_PRINT)
+#define TOUCH_ERR_MSG(fmt, args...) printk(KERN_ERR "[Touch E] [%s %d] " fmt, \
+ __FUNCTION__, __LINE__, ##args)
+#else
+#define TOUCH_ERR_MSG(fmt, args...)
+#endif
+
+#if defined(TOUCH_DEBUG_PRINT)
+#define TOUCH_DEBUG_MSG(fmt, args...) printk(KERN_INFO "[Touch D] [%s %d] " fmt, \
+ __FUNCTION__, __LINE__, ##args);
+#else
+#define TOUCH_DEBUG_MSG(fmt, args...)
+#endif
+
+int touch_driver_register(struct touch_device_driver* driver);
+void touch_driver_unregister(void);
+
+void set_touch_handle(struct i2c_client *client, void* h_touch);
+void* get_touch_handle(struct i2c_client *client);
+int touch_i2c_read(struct i2c_client *client, u8 reg, int len, u8 *buf);
+int touch_i2c_write(struct i2c_client *client, u8 reg, int len, u8 *buf);
+int touch_i2c_write_byte(struct i2c_client *client, u8 reg, u8 data);
+
+extern u32 touch_debug_mask;
+extern u32 touch_time_debug_mask;
+
+#endif
diff --git a/include/linux/input/touch_synaptics.h b/include/linux/input/touch_synaptics.h
new file mode 100644
index 0000000..396d6b5
--- /dev/null
+++ b/include/linux/input/touch_synaptics.h
@@ -0,0 +1,92 @@
+/* include/linux/lge_touch_core.h
+ *
+ * Copyright (C) 2011 LGE.
+ *
+ * Writer: yehan.ahn@lge.com, hyesung.shin@lge.com
+ *
+ * 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.
+ *
+ */
+
+#ifndef LGE_TOUCH_SYNAPTICS_H
+#define LGE_TOUCH_SYNAPTICS_H
+
+#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
+//do nothing
+#else
+#define ARRAYED_TOUCH_FW_BIN
+#endif
+#define NUM_OF_EACH_FINGER_DATA_REG 5
+#define MAX_NUM_OF_FINGERS 10
+
+#define DESCRIPTION_TABLE_START 0xe9
+
+struct ts_function_descriptor {
+ u8 query_base;
+ u8 command_base;
+ u8 control_base;
+ u8 data_base;
+ u8 int_source_count;
+ u8 id;
+};
+
+struct finger_data {
+ u8 finger_status_reg[3];
+ u8 finger_reg[MAX_NUM_OF_FINGERS][NUM_OF_EACH_FINGER_DATA_REG];
+};
+
+struct button_data {
+ u16 key_code;
+};
+
+struct cur_touch_data {
+ u8 device_status_reg; /* DEVICE_STATUS_REG */
+ u8 interrupt_status_reg;
+ u8 button_data_reg;
+ struct finger_data finger;
+ struct button_data button;
+};
+
+struct interrupt_bit_mask {
+ u8 flash;
+ u8 status;
+ u8 abs;
+ u8 button;
+};
+
+struct synaptics_ts_data {
+ u8 is_probed;
+ struct regulator *regulator_vdd;
+ struct regulator *regulator_vio;
+ struct i2c_client *client;
+ struct touch_platform_data *pdata;
+ struct ts_function_descriptor common_dsc;
+ struct ts_function_descriptor finger_dsc;
+ struct ts_function_descriptor button_dsc;
+ struct ts_function_descriptor flash_dsc;
+ struct cur_touch_data ts_data;
+ struct touch_fw_info *fw_info;
+ struct interrupt_bit_mask interrupt_mask;
+#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
+ struct ts_function_descriptor analog_dsc;
+#endif
+
+#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
+ u8 ic_panel_type;
+#endif
+};
+
+#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
+enum {IC7020_GFF, IC7020_G2, IC3203_G2, IC7020_GFF_H_PTN, IC7020_G2_H_PTN};
+#endif
+
+/* extern function */
+extern int FirmwareUpgrade(struct synaptics_ts_data *ts, const char* fw_path);
+#endif