aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input/touchscreen/synaptics_s7301.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/input/touchscreen/synaptics_s7301.c')
-rw-r--r--drivers/input/touchscreen/synaptics_s7301.c482
1 files changed, 449 insertions, 33 deletions
diff --git a/drivers/input/touchscreen/synaptics_s7301.c b/drivers/input/touchscreen/synaptics_s7301.c
index bd2bf8f..34d42e7 100644
--- a/drivers/input/touchscreen/synaptics_s7301.c
+++ b/drivers/input/touchscreen/synaptics_s7301.c
@@ -15,6 +15,14 @@
#include <linux/synaptics_s7301.h>
+#define REPORT_MT_NOZ(x, y, w_max, w_min) \
+do { \
+ input_report_abs(data->input, ABS_MT_POSITION_X, x); \
+ input_report_abs(data->input, ABS_MT_POSITION_Y, y); \
+ input_report_abs(data->input, ABS_MT_TOUCH_MAJOR, w_max); \
+ input_report_abs(data->input, ABS_MT_TOUCH_MINOR, w_min); \
+} while (0)
+
#define REPORT_MT(x, y, z, w_max, w_min) \
do { \
input_report_abs(data->input, ABS_MT_POSITION_X, x); \
@@ -185,6 +193,29 @@ void set_dvfs_lock(struct synaptics_drv_data *data, bool en)
}
#endif /* CONFIG_SEC_TOUCHSCREEN_DVFS_LOCK */
+#if defined(CONFIG_TOUCHSCREEN_SYNAPTICS_S7301_KEYS)
+static void forced_release_buttons(struct synaptics_drv_data *data)
+{
+ int i;
+#if !defined(CONFIG_SAMSUNG_PRODUCT_SHIP)
+ printk(KERN_DEBUG "[TSP] %s\n", __func__);
+#endif
+ if (data->pdata->support_extend_button) {
+ for (i = 0; i < data->pdata->extend_button_map->nbuttons; i++) {
+ input_report_key(data->input,
+ data->pdata->extend_button_map->map[i],
+ 0);
+ }
+ } else {
+ for (i = 0; i < data->pdata->button_map->nbuttons; i++) {
+ input_report_key(data->input,
+ data->pdata->button_map->map[i], 0);
+ }
+ }
+ input_sync(data->input);
+}
+#endif
+
static void forced_release_fingers(struct synaptics_drv_data *data)
{
int i;
@@ -200,6 +231,9 @@ static void forced_release_fingers(struct synaptics_drv_data *data)
data->finger[i].z = 0;
}
input_sync(data->input);
+#if defined(CONFIG_TOUCHSCREEN_SYNAPTICS_S7301_KEYS)
+ forced_release_buttons(data);
+#endif
set_dvfs_lock(data, false);
return ;
}
@@ -212,9 +246,9 @@ static int synaptics_ts_set_func_info(struct synaptics_drv_data *data)
u16 base_addr = FUNC_ADDR_FIRST;
u16 last_addr = FUNC_ADDR_LAST;
- for (i = 0; i <= PAGE_MAX; i += PAGE_MAX) {
- base_addr += i;
- last_addr += i;
+ for (i = 0; i <= PAGE_MAX; i += NEXT_PAGE) {
+ base_addr = i + FUNC_ADDR_FIRST;
+ last_addr = i + FUNC_ADDR_LAST;
for (addr = base_addr; addr >= last_addr;
addr -= FUNC_ADDR_SIZE) {
synaptics_ts_read_block(data,
@@ -245,6 +279,12 @@ static int synaptics_ts_set_func_info(struct synaptics_drv_data *data)
SET_FUNC_ADDR(11, i);
break;
+#if defined (CONFIG_TOUCHSCREEN_SYNAPTICS_S7301_KEYS)
+ case 0x1a:
+ SET_FUNC_ADDR(1a, i);
+ break;
+#endif
+
case 0x34:
SET_FUNC_ADDR(34, i);
break;
@@ -253,12 +293,26 @@ static int synaptics_ts_set_func_info(struct synaptics_drv_data *data)
SET_FUNC_ADDR(54, i);
break;
+#if defined(CONFIG_SEC_TOUCHSCREEN_SURFACE_TOUCH)
+ case 0x51:
+ SET_FUNC_ADDR(51, i);
+ break;
+#endif
+
default:
break;
}
}
}
- return cnt;
+#if defined(CONFIG_SEC_TOUCHSCREEN_SURFACE_TOUCH)
+ cnt--;
+#endif
+
+#if defined (CONFIG_TOUCHSCREEN_SYNAPTICS_S7301_KEYS)
+ return (5 != cnt);
+#else
+ return (4 != cnt);
+#endif
}
static int synaptics_ts_read_dummy(struct synaptics_drv_data *data)
@@ -314,17 +368,43 @@ static void inform_charger_connection(struct charger_callbacks *cb, int mode)
struct synaptics_drv_data, callbacks);
data->charger_connection = !!mode;
- if (data->ready)
+ if (data->ready) {
+#if !defined(CONFIG_MACH_KONA)
set_charger_connection_bit(data);
+#endif
+ }
}
+#if defined(CONFIG_SEC_TOUCHSCREEN_SURFACE_TOUCH)
+static void set_palm_threshold(struct synaptics_drv_data *data)
+{
+ u8 threshold = data->pdata->palm_threshold;
+
+ synaptics_ts_write_data(data,
+ data->f11.control_base_addr + 17, threshold);
+}
+#endif
+
static int synaptics_ts_set_func(struct synaptics_drv_data *data)
{
int i = 0;
-
+ int retry_count = 10;
+ int ret = 0;
+
printk(KERN_DEBUG "[TSP] %s\n", __func__);
-
- if (synaptics_ts_set_func_info(data) != 4) {
+
+ while(retry_count--) {
+ ret = synaptics_ts_set_func_info(data);
+
+ if (ret) {
+ pr_err("[TSP] failed to get function info retry_count = %d \n",retry_count);
+ continue;
+ } else {
+ break;
+ }
+ }
+
+ if (ret) {
pr_err("[TSP] failed to get function info.\n");
forced_fw_update(data);
synaptics_ts_set_func_info(data);
@@ -340,40 +420,159 @@ static int synaptics_ts_set_func(struct synaptics_drv_data *data)
return synaptics_ts_read_dummy(data);
}
+#if defined(CONFIG_TOUCHSCREEN_SYNAPTICS_S7301_KEYS)
+static void synaptics_ts_check_buttons(struct synaptics_drv_data *data)
+{
+ int ret = 0, i, pos_button = 1;
+ u16 touch_key_addr = data->f1a.data_base_addr;
+ u8 touch_key_data;
+ u8 check_mask_data;
+
+ ret = synaptics_ts_read_block(data,
+ touch_key_addr, &touch_key_data, 1);
+
+ if (ret < 0) {
+ pr_err("[TSP] failed to read button data\n");
+ return ;
+ }
+
+#if !defined(CONFIG_SAMSUNG_PRODUCT_SHIP)
+ printk(KERN_DEBUG "[TSP] button [0x%x]\n", touch_key_data);
+#endif
+
+ if (data->pdata->support_extend_button) {
+ if (data->pdata->enable_extend_button_event) {
+ for (i = 0; i < data->pdata->extend_button_map->nbuttons; i++) {
+ if ((touch_key_data & (pos_button<<i)) != 0) {
+ input_report_key(data->input,
+ data->pdata->extend_button_map->map[i],
+ 1);
+ } else {
+ input_report_key(data->input,
+ data->pdata->extend_button_map->map[i],
+ 0);
+ }
+ input_sync(data->input);
+ }
+ } else {
+ /* check mask data and return */
+ check_mask_data = touch_key_data &
+ data->pdata->extend_button_map->button_mask;
+
+ if (check_mask_data != 0) {
+ printk(KERN_DEBUG "[TSP] igb\n");
+ return;
+ }
+
+ for (i = 0; i < data->pdata->extend_button_map->nbuttons; i++) {
+ if ((data->pdata->extend_button_map->button_mask & (pos_button<<i)) !=0)
+ continue;
+
+ if ((touch_key_data & (pos_button<<i)) != 0) {
+ input_report_key(data->input,
+ data->pdata->extend_button_map->map[i],
+ 1);
+ printk(KERN_DEBUG "[TSP] b[%d][%c]\n", i, 'p');
+ } else {
+ input_report_key(data->input,
+ data->pdata->extend_button_map->map[i],
+ 0);
+ printk(KERN_DEBUG "[TSP] b[%d][%c]\n", i, 'r');
+ }
+ input_sync(data->input);
+ }
+ }
+ } else {
+ for (i = 0; i < data->pdata->button_map->nbuttons; i++) {
+ if ((touch_key_data & (pos_button<<i)) != 0)
+ input_report_key(data->input,
+ data->pdata->button_map->map[i], 1);
+ else
+ input_report_key(data->input,
+ data->pdata->button_map->map[i], 0);
+ input_sync(data->input);
+ }
+ }
+}
+#endif
+
static int check_interrupt_status(struct synaptics_drv_data *data,
u32 *finger_status)
{
int ret = 0;
u8 buf[3];
+ u8 tmp;
u16 addr = 0;
+ int analog_int = 0;
/* read the interrupt status */
addr = data->f01.data_base_addr + 1;
ret = synaptics_ts_read_data(data,
- addr, buf);
+ addr, &tmp);
if (ret < 0) {
pr_err("[TSP] failed to read i2c data(%d)\n", __LINE__);
return -EIO;
}
- /* read the finger states */
- addr = data->f11.data_base_addr;
- ret = synaptics_ts_read_block(data,
- addr, buf, 3);
- if (ret < 0) {
- pr_err("[TSP] failed to read i2c data(%d)\n", __LINE__);
- return -EIO;
+#if defined(CONFIG_TOUCHSCREEN_SYNAPTICS_S7301_KEYS)
+ /* check button */
+ if ((tmp & 0x10) != 0) {
+ synaptics_ts_check_buttons(data);
}
+#endif
- *finger_status = (u32) (buf[0] | (buf[1] << 8) |
- ((buf[2] & 0xf) << 16));
+ /* check analog interrupt */
+ if (tmp & 0x4)
+ analog_int = 1;
- if (data->debug)
- printk(KERN_DEBUG
- "[TSP] finger_status : 0x%x\n",
- *finger_status);
+#if defined(CONFIG_MACH_KONA)
+ /* check interrupt status register */
+ if ((tmp & 0x0F) == 0x2) {
+ addr = data->f01.data_base_addr;
+ /* check esd status register */
+ ret = synaptics_ts_read_data(data,
+ addr, &tmp);
+ if (ret < 0) {
+ pr_err("[TSP] failed to read i2c data(%d)\n", __LINE__);
+ return -EIO;
+ } else if ((tmp & 0x3) == 0x3) {
+ pr_err("[TSP] esd detect\n");
+ forced_release_fingers(data);
+ data->pdata->hw_reset();
+ return 0;
+ }
+ }
+#else
+ /* esd detect */
+ if ((tmp & 0x0F) == 0x03) {
+ pr_err("[TSP] esd detect\n");
+ data->pdata->hw_reset();
+ return 0;
+ }
+#endif
- return 0;
+ if (analog_int) {
+ /* read the finger states */
+ addr = data->f11.data_base_addr;
+ ret = synaptics_ts_read_block(data,
+ addr, buf, 3);
+ if (ret < 0) {
+ pr_err("[TSP] failed to read i2c data(%d)\n", __LINE__);
+ return -EIO;
+ }
+
+ *finger_status = (u32) (buf[0] | (buf[1] << 8) |
+ ((buf[2] & 0xf) << 16));
+
+ if (data->debug)
+ printk(KERN_DEBUG
+ "[TSP] finger_status : [%d] 0x%x\n", analog_int,
+ *finger_status);
+ }
+ if (analog_int == 1)
+ return 1;
+ else
+ return 0;
}
static void synaptics_ts_read_points(struct synaptics_drv_data *data,
@@ -383,10 +582,33 @@ static void synaptics_ts_read_points(struct synaptics_drv_data *data,
bool finger_pressed = false;
int ret = 0;
int id = 0;
+#if defined(CONFIG_SEC_TOUCHSCREEN_SURFACE_TOUCH)
+ u8 palm;
+ u8 surface_data[4];
+ u16 palm_addr = data->f11.data_base_addr + 53;
+ u16 surface_addr = data->f51.data_base_addr;
+ int angle = 0;
+#endif
u16 addr = data->f11.data_base_addr + 3;
+ u16 x = 0, y = 0;
+
+#if defined(CONFIG_SEC_TOUCHSCREEN_SURFACE_TOUCH)
+ ret = synaptics_ts_read_block(data,
+ palm_addr, &palm, 1);
+ if (ret < 0) {
+ pr_err("[TSP] failed to read palm data\n");
+ return ;
+ }
+
+ palm = (palm & 0x02) ? 1 : 0;
+#endif
for (id = 0; id < MAX_TOUCH_NUM; id++,
addr += sizeof(struct finger_data)) {
+#if defined(CONFIG_TOUCHSCREEN_SYNAPTICS_S7301_WORKAROUND)
+ if ((finger_status & (0x3 << (id * 2))) == 0x3)
+ continue;
+#endif
if (finger_status & (0x3 << (id * 2))) {
ret = synaptics_ts_read_block(data,
addr, (u8 *) &buf, 5);
@@ -394,6 +616,15 @@ static void synaptics_ts_read_points(struct synaptics_drv_data *data,
pr_err("[TSP] failed to read finger[%u]\n", id);
return ;
}
+#if defined(CONFIG_SEC_TOUCHSCREEN_SURFACE_TOUCH)
+ ret = synaptics_ts_read_block(data,
+ surface_addr + (id * 4),
+ surface_data, 4);
+ if (ret < 0) {
+ pr_err("[TSP] failed to read surface data\n");
+ return ;
+ }
+#endif
#if !defined(CONFIG_SAMSUNG_PRODUCT_SHIP)
if (data->debug)
@@ -405,13 +636,47 @@ static void synaptics_ts_read_points(struct synaptics_drv_data *data,
buf.z);
#endif
- data->finger[id].x =
- (buf.x_msb << 4) +
- (buf.xy_lsb & 0x0F);
- data->finger[id].y =
- (buf.y_msb << 4) +
- (buf.xy_lsb >> 4);
+ x = (buf.x_msb << 4) + (buf.xy_lsb & 0x0F);
+ y = (buf.y_msb << 4) + (buf.xy_lsb >> 4);
+
+ if (data->pdata->swap_xy)
+ swap(x, y);
+ if (data->pdata->invert_x)
+ x = data->pdata->max_x - x;
+
+ if (data->pdata->invert_y)
+ y = data->pdata->max_y - y;
+
+ data->finger[id].x = x;
+ data->finger[id].y = y;
+
+#if defined(CONFIG_SEC_TOUCHSCREEN_SURFACE_TOUCH)
+ data->finger[id].w_max = surface_data[2];
+ data->finger[id].w_min = surface_data[3];
+ if (data->pdata->support_extend_button) {
+ if (surface_data[1] >= 90 && surface_data[1] <= 180)
+ angle = surface_data[1] - 90;
+ else if (surface_data[1] < 90)
+ angle = -(90 - surface_data[1]);
+ else
+ printk(KERN_DEBUG "[TSP] wrong TSP angle data [%d][%d]\n", id,
+ surface_data[1]);
+ } else {
+ if (surface_data[1] <= 90)
+ angle = surface_data[1];
+ else if (surface_data[1] > 168 && surface_data[1] < 256)
+ angle = -(256 - surface_data[1]);
+ else
+ printk(KERN_DEBUG "[TSP] wrong TSP angle data [%d][%d]\n", id,
+ surface_data[1]);
+ }
+
+ if (data->finger[id].w_max <
+ data->finger[id].w_min)
+ swap(data->finger[id].w_max,
+ data->finger[id].w_min);
+#else
if ((buf.w >> 4) >
(buf.w & 0x0F)) {
data->finger[id].w_max =
@@ -424,7 +689,12 @@ static void synaptics_ts_read_points(struct synaptics_drv_data *data,
data->finger[id].w_max =
(buf.w & 0x0F);
}
-
+#endif
+#if defined(CONFIG_SEC_TOUCHSCREEN_SURFACE_TOUCH)
+ data->finger[id].angle = angle;
+ data->finger[id].width = surface_data[0];
+#endif
+
data->finger[id].z = buf.z;
if (data->finger[id].z) {
if (MT_STATUS_INACTIVE ==
@@ -438,19 +708,35 @@ static void synaptics_ts_read_points(struct synaptics_drv_data *data,
data->finger[id].x,
data->finger[id].y,
data->finger[id].z);
+#if defined(CONFIG_SEC_TOUCHSCREEN_SURFACE_TOUCH)
+ printk(KERN_DEBUG
+ "[TSP] palm %d, surface_data %d, %d\n",
+ palm,
+ surface_data[0],
+ surface_data[1]);
+#endif
#else
printk(KERN_DEBUG
"s7301 %d P\n", id);
#endif
}
#if !defined(CONFIG_SAMSUNG_PRODUCT_SHIP)
- else if (data->debug)
+ else if (data->debug) {
printk(KERN_DEBUG
"[TSP] ID: %d, x: %d, y: %d, z: %d\n",
id,
data->finger[id].x,
data->finger[id].y,
data->finger[id].z);
+#if defined(CONFIG_SEC_TOUCHSCREEN_SURFACE_TOUCH)
+ printk(KERN_DEBUG
+ "[TSP] palm %d, surface_data %d, %d, %d\n",
+ palm,
+ surface_data[0],
+ surface_data[1],
+ angle);
+#endif
+ }
#endif
}
} else if (MT_STATUS_PRESS == data->finger[id].status) {
@@ -464,7 +750,29 @@ static void synaptics_ts_read_points(struct synaptics_drv_data *data,
}
}
+#if defined(CONFIG_SEC_TOUCHSCREEN_SURFACE_TOUCH)
+ if (palm) {
+ if (data->palm_flag == 3)
+ data->palm_flag = 1;
+ else {
+ data->palm_flag = 3;
+ palm = 3;
+ }
+ } else {
+ if (data->palm_flag == 2)
+ data->palm_flag = 0;
+ else {
+ data->palm_flag = 2;
+ palm = 2;
+ }
+ }
+#endif
+
for (id = 0; id < MAX_TOUCH_NUM; ++id) {
+#if defined(CONFIG_TOUCHSCREEN_SYNAPTICS_S7301_WORKAROUND)
+ if ((finger_status & (0x3 << (id * 2))) == 0x3)
+ continue;
+#endif
if (MT_STATUS_INACTIVE == data->finger[id].status)
continue;
@@ -477,12 +785,30 @@ static void synaptics_ts_read_points(struct synaptics_drv_data *data,
case MT_STATUS_PRESS:
case MT_STATUS_MOVE:
finger_pressed = true;
+#if defined(CONFIG_TOUCHSCREEN_SYNAPTICS_S7301_WORKAROUND)
+ if (0 == !!data->finger[id].z)
+ break;
+
+ REPORT_MT_NOZ(
+ data->finger[id].x,
+ data->finger[id].y,
+ data->finger[id].w_max,
+ data->finger[id].w_min);
+#else
REPORT_MT(
data->finger[id].x,
data->finger[id].y,
data->finger[id].z,
data->finger[id].w_max,
data->finger[id].w_min);
+#endif
+#if defined(CONFIG_SEC_TOUCHSCREEN_SURFACE_TOUCH)
+ input_report_abs(data->input, ABS_MT_WIDTH_MAJOR,
+ data->finger[id].width);
+ input_report_abs(data->input, ABS_MT_ANGLE,
+ data->finger[id].angle);
+ input_report_abs(data->input, ABS_MT_PALM, palm);
+#endif
break;
case MT_STATUS_RELEASE:
@@ -496,11 +822,17 @@ static void synaptics_ts_read_points(struct synaptics_drv_data *data,
set_dvfs_lock(data, finger_pressed);
}
+#if 0
+#if defined(CONFIG_TOUCHSCREEN_SYNAPTICS_S7301_KEYS)
+ synaptics_ts_check_buttons(data);
+#endif
+#endif
+
static irqreturn_t synaptics_ts_irq_handler(int irq, void *_data)
{
struct synaptics_drv_data *data = (struct synaptics_drv_data *)_data;
u32 finger_status = 0;
- if (!check_interrupt_status(data, &finger_status))
+ if (check_interrupt_status(data, &finger_status) == 1)
synaptics_ts_read_points(data, finger_status);
return IRQ_HANDLED;
}
@@ -510,6 +842,13 @@ static void synaptics_ts_early_suspend(struct early_suspend *h)
{
struct synaptics_drv_data *data =
container_of(h, struct synaptics_drv_data, early_suspend);
+#if defined(CONFIG_MACH_KONA)
+ disable_irq(data->client->irq);
+ forced_release_fingers(data);
+ if (!wake_lock_active(&data->wakelock)) {
+ data->pdata->set_power(0);
+ }
+#else
printk(KERN_DEBUG "[TSP] %s\n", __func__);
cancel_delayed_work_sync(&data->resume_dwork);
mutex_lock(&data->mutex);
@@ -522,6 +861,7 @@ static void synaptics_ts_early_suspend(struct early_suspend *h)
}
}
mutex_unlock(&data->mutex);
+#endif
}
static void synaptics_ts_late_resume(struct early_suspend *h)
@@ -531,11 +871,20 @@ static void synaptics_ts_late_resume(struct early_suspend *h)
printk(KERN_DEBUG "[TSP] %s\n", __func__);
+#if defined(CONFIG_MACH_KONA)
+ /* turned on tsp power */
+ data->pdata->set_power(1);
+
+ mdelay(200);
+ enable_irq(data->client->irq);
+#else
if (data->suspend) {
if (data->pdata->set_power(1))
data->pdata->hw_reset();
}
+
schedule_delayed_work(&data->resume_dwork, HZ / 10);
+#endif
}
#endif
@@ -572,7 +921,12 @@ static void init_function_data_dwork(struct work_struct *work)
#endif
data->ready = true;
+#if !defined(CONFIG_MACH_KONA)
set_charger_connection_bit(data);
+#endif
+#if defined(CONFIG_SEC_TOUCHSCREEN_SURFACE_TOUCH)
+ set_palm_threshold(data);
+#endif
if (data->client->irq) {
ret = request_threaded_irq(data->client->irq, NULL,
@@ -602,8 +956,10 @@ static void synaptics_ts_resume_dwork(struct work_struct *work)
mutex_lock(&data->mutex);
if (data->suspend) {
data->suspend = false;
+#if !defined(CONFIG_MACH_KONA)
set_charger_connection_bit(data);
synaptics_ts_drawing_mode(data);
+#endif
synaptics_ts_read_dummy(data);
enable_irq(data->client->irq);
}
@@ -619,6 +975,19 @@ static void synaptics_ts_noti_dwork(struct work_struct *work)
set_charger_connection_bit(data);
}
+#if defined(CONFIG_TOUCHSCREEN_SYNAPTICS_S7301_WORKAROUND)
+static void synaptics_reset_ts_dwork(struct work_struct *work)
+{
+ struct synaptics_drv_data *data =
+ container_of(work, struct synaptics_drv_data,
+ reset_dwork.work);
+
+ if (data->firmware_update_check != true) {
+ data->pdata->hw_reset();
+ }
+}
+#endif
+
static int synaptics_ts_open(struct input_dev *dev)
{
struct synaptics_drv_data *data =
@@ -671,6 +1040,11 @@ static int __init synaptics_ts_probe(struct i2c_client *client,
ddata->gpio = pdata->gpio_attn;
ddata->x_line = pdata->x_line;
ddata->y_line = pdata->y_line;
+#if defined(CONFIG_SEC_TOUCHSCREEN_SURFACE_TOUCH)
+ ddata->palm_flag = 0;
+#endif
+ if (pdata->swap_xy)
+ swap(pdata->x_line, pdata->y_line);
/* Register callbacks */
/* To inform tsp , charger connection status*/
@@ -703,17 +1077,51 @@ static int __init synaptics_ts_probe(struct i2c_client *client,
__set_bit(MT_TOOL_FINGER, input->keybit);
__set_bit(INPUT_PROP_DIRECT, input->propbit);
+ atomic_set(&ddata->keypad_enable, 1);
+
+#if defined(CONFIG_TOUCHSCREEN_SYNAPTICS_S7301_KEYLED)
+ if (pdata->led_event && atomic_read(&ddata->keypad_enable)) {
+ __set_bit(EV_LED, input->evbit);
+ __set_bit(LED_MISC, input->ledbit);
+ }
+#endif
+
input_mt_init_slots(input, MAX_TOUCH_NUM);
input_set_abs_params(input, ABS_MT_POSITION_X, 0,
pdata->max_x, 0, 0);
input_set_abs_params(input, ABS_MT_POSITION_Y, 0,
pdata->max_y, 0, 0);
+#if !defined(CONFIG_TOUCHSCREEN_SYNAPTICS_S7301_WORKAROUND)
input_set_abs_params(input, ABS_MT_PRESSURE, 0,
- pdata->max_pressure, 0, 0);
+ pdata->max_pressure, 0, 0);
+#endif
input_set_abs_params(input, ABS_MT_TOUCH_MAJOR, 0,
pdata->max_width, 0, 0);
input_set_abs_params(input, ABS_MT_TOUCH_MINOR, 0,
pdata->max_width, 0, 0);
+#if defined(CONFIG_SEC_TOUCHSCREEN_SURFACE_TOUCH)
+ input_set_abs_params(input, ABS_MT_WIDTH_MAJOR, 0,
+ pdata->x_line * pdata->y_line, 0, 0);
+ input_set_abs_params(input, ABS_MT_ANGLE,
+ MIN_ANGLE, MAX_ANGLE, 0, 0);
+ input_set_abs_params(input, ABS_MT_PALM,
+ 0, 1, 0, 0);
+#endif
+#if defined (CONFIG_TOUCHSCREEN_SYNAPTICS_S7301_KEYS)
+ if(atomic_read(&ddata->keypad_enable)){
+ if (pdata->support_extend_button) {
+ for (ret = 0; ret < pdata->extend_button_map->nbuttons; ret++) {
+ if (pdata->extend_button_map->map[ret] != KEY_RESERVED)
+ input_set_capability(input, EV_KEY,
+ pdata->extend_button_map->map[ret]);
+ }
+ } else {
+ for (ret = 0; ret < pdata->button_map->nbuttons; ret++)
+ input_set_capability(input, EV_KEY,
+ pdata->button_map->map[ret]);
+ }
+ }
+#endif
ret = input_register_device(input);
if (ret) {
@@ -727,8 +1135,16 @@ static int __init synaptics_ts_probe(struct i2c_client *client,
INIT_DELAYED_WORK(&ddata->init_dwork, init_function_data_dwork);
INIT_DELAYED_WORK(&ddata->resume_dwork, synaptics_ts_resume_dwork);
+#if !defined(CONFIG_MACH_KONA)
INIT_DELAYED_WORK(&ddata->noti_dwork, synaptics_ts_noti_dwork);
+#endif
schedule_delayed_work(&ddata->init_dwork, HZ);
+
+#if defined(CONFIG_TOUCHSCREEN_SYNAPTICS_S7301_WORKAROUND)
+ pdata->hw_reset();
+// INIT_DELAYED_WORK(&ddata->reset_dwork, synaptics_reset_ts_dwork);
+// schedule_delayed_work(&ddata->reset_dwork, HZ*10);
+#endif
ret = set_tsp_sysfs(ddata);
if (ret) {