blob: e70814631c3f68cece5b69c5ea7fdbce6b296d87 [file] [log] [blame]
Jongrak Kwonae680ab2012-06-15 22:06:54 -07001/* Touch_synaptics.c
2 *
3 * Copyright (C) 2011 LGE.
4 *
5 * Author: yehan.ahn@lge.com, hyesung.shin@lge.com
6 *
7 * This software is licensed under the terms of the GNU General Public
8 * License version 2, as published by the Free Software Foundation, and
9 * may be copied, distributed, and modified under those terms.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 */
17
18#include <linux/err.h>
19#include <linux/module.h>
20#include <linux/delay.h>
21#include <linux/i2c.h>
22#include <linux/slab.h>
23
24#include <linux/gpio.h>
25
26#include <linux/earlysuspend.h>
27#include <linux/input/lge_touch_core.h>
28#include <linux/input/touch_synaptics.h>
29
30#if defined(CONFIG_TOUCH_REG_MAP_TM2000)
31#include "SynaImage.h"
32#elif defined(CONFIG_TOUCH_REG_MAP_TM2372)
33#include "SynaImage_Jp.h"
34#else
35#include "SynaImage.h"
36#endif
37
38#include <linux/regulator/machine.h>
39
40/* RMI4 spec from (RMI4 spec)511-000136-01_revD
41 * Function Purpose See page
42 * $01 RMI Device Control 29
43 * $08 BIST(Built-in Self Test) 38
44 * $09 BIST(Built-in Self Test) 42
45 * $11 2-D TouchPad sensors 46
46 * $19 0-D capacitive button sensors 69
47 * $30 GPIO/LEDs (includes mechanical buttons) 76
48 * $32 Timer 89
49 * $34 Flash Memory Management 93
50 */
51#define RMI_DEVICE_CONTROL 0x01
52#define TOUCHPAD_SENSORS 0x11
53#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
54#define CAPACITIVE_BUTTON_SENSORS 0x1A
55#define GPIO_LEDS 0x31
56#define ANALOG_CONTROL 0x54
57#else
58#define CAPACITIVE_BUTTON_SENSORS 0x19
59#define GPIO_LEDS 0x30
60#endif
61#define TIMER 0x32
62#define FLASH_MEMORY_MANAGEMENT 0x34
63
64/* Register Map & Register bit mask
65 * - Please check "One time" this map before using this device driver
66 */
67
68#define MANUFACTURER_ID_REG (ts->common_dsc.query_base) /* Manufacturer ID */
69#define FW_REVISION_REG (ts->common_dsc.query_base+3) /* FW revision */
70#define PRODUCT_ID_REG (ts->common_dsc.query_base+11) /* Product ID */
71#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
72#define FW_VERSION (ts->flash_dsc.control_base)
73#endif
74
75#define DEVICE_CONTROL_REG (ts->common_dsc.control_base) /* Device Control */
76#define DEVICE_CONTROL_NORMAL_OP 0x00 /* sleep mode : go to doze mode after 500 ms */
77#define DEVICE_CONTROL_SLEEP 0x01 /* sleep mode : go to sleep */
78#define DEVICE_CONTROL_SPECIFIC 0x02 /* sleep mode : go to doze mode after 5 sec */
79#define DEVICE_CONTROL_NOSLEEP 0x04
80#define DEVICE_CONTROL_CONFIGURED 0x80
81
82#define INTERRUPT_ENABLE_REG (ts->common_dsc.control_base+1) /* Interrupt Enable 0 */
83
84#define DEVICE_STATUS_REG (ts->common_dsc.data_base) /* Device Status */
85#define DEVICE_FAILURE_MASK 0x03
86#define DEVICE_CRC_ERROR_MASK 0x04
87#define DEVICE_STATUS_FLASH_PROG 0x40
88#define DEVICE_STATUS_UNCONFIGURED 0x80
89
90#define INTERRUPT_STATUS_REG (ts->common_dsc.data_base+1) /* Interrupt Status */
91#define BUTTON_DATA_REG (ts->button_dsc.data_base) /* Button Data */
92#define MAX_NUM_OF_BUTTON 4
93
94#define FINGER_STATE_REG (ts->finger_dsc.data_base) /* Finger State */
95#define FINGER_DATA_REG_START (ts->finger_dsc.data_base+3) /* Finger Data Register */
96#define FINGER_STATE_MASK 0x03
97#define REG_X_POSITION 0
98#define REG_Y_POSITION 1
99#define REG_YX_POSITION 2
100#define REG_WY_WX 3
101#define REG_Z 4
102
103#define TWO_D_REPORTING_MODE (ts->finger_dsc.control_base+0) /* 2D Reporting Mode */
104#define REPORT_MODE_CONTINUOUS 0x00
105#define REPORT_MODE_REDUCED 0x01
106#define ABS_FILTER 0x08
107#define PALM_DETECT_REG (ts->finger_dsc.control_base+1) /* Palm Detect */
108#define DELTA_X_THRESH_REGi (ts->finger_dsc.control_base+2) /* Delta-X Thresh */
109#define DELTA_Y_THRESH_REG (ts->finger_dsc.control_base+3) /* Delta-Y Thresh */
110#define SENSOR_MAX_X_POS (ts->finger_dsc.control_base+6) /* SensorMaxXPos */
111#define SENSOR_MAX_Y_POS (ts->finger_dsc.control_base+8) /* SensorMaxYPos */
112#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
113/*do nothing*/
114#else
115#define GESTURE_ENABLE_1_REG (ts->finger_dsc.control_base+10) /* Gesture Enables 1 */
116#define GESTURE_ENABLE_2_REG (ts->finger_dsc.control_base+11) /* Gesture Enables 2 */
117#endif
118
119#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
120#define PAGE_SELECT_REG 0xFF /* Button exists Page 02 */
121#define ANALOG_CONTROL_REG (ts->analog_dsc.control_base)
122#define ANALOG_COMMAND_REG (ts->analog_dsc.command_base)
123#define FAST_RELAXATION_RATE (ts->analog_dsc.control_base+16)
124#define FORCE_FAST_RELAXATION 0x04
125#define FORCE_UPDATE 0x04
126#else
127#define MELT_CONTROL_REG 0xF0
128#define MELT_CONTROL_NO_MELT 0x00
129#define MELT_CONTROL_MELT 0x01
130#define MELT_CONTROL_NUKE_MELT 0x80
131#endif
132
133#define DEVICE_COMMAND_REG (ts->common_dsc.command_base)
134#define FINGER_COMMAND_REG (ts->finger_dsc.command_base)
135#define BUTTON_COMMAND_REG (ts->button_dsc.command_base)
136
137#define FLASH_CONTROL_REG (ts->flash_dsc.data_base+18) /* Flash Control */
138#define FLASH_STATUS_MASK 0xF0
139
140/* Get user-finger-data from register.
141 */
142#define TS_SNTS_GET_X_POSITION(_high_reg, _low_reg) \
143 (((u16)(((_high_reg) << 4) & 0x0FF0) | (u16)((_low_reg) & 0x0F)))
144#define TS_SNTS_GET_Y_POSITION(_high_reg, _low_reg) \
145 (((u16)(((_high_reg) << 4) & 0x0FF0) | (u16)(((_low_reg) >> 4) & 0x0F)))
146#define TS_SNTS_GET_WIDTH_MAJOR(_width) \
147 ((((((_width) & 0xF0) >> 4) - ((_width) & 0x0F)) > 0) ? \
148 ((_width) & 0xF0) >> 4 : (_width) & 0x0F)
149#define TS_SNTS_GET_WIDTH_MINOR(_width) \
150 ((((((_width) & 0xF0) >> 4) - ((_width) & 0x0F)) > 0) ? \
151 (_width) & 0x0F : ((_width) & 0xF0) >> 4)
152#define TS_SNTS_GET_ORIENTATION(_width) \
153 ((((((_width) & 0xF0) >> 4) - ((_width) & 0x0F)) > 0) ? 0 : 1)
154#define TS_SNTS_GET_PRESSURE(_pressure) (_pressure)
155
156
157/* GET_BIT_MASK & GET_INDEX_FROM_MASK
158 *
159 * For easily checking the user input.
160 * Usually, User use only one or two fingers.
161 * However, we should always check all finger-status-register
162 * because we can't know the total number of fingers.
163 * These Macro will prevent it.
164 */
165#define GET_BIT_MASK(_finger_status_reg) \
166 ((_finger_status_reg[2] & 0x04) << 7 | \
167 (_finger_status_reg[2] & 0x01) << 8 | \
168 (_finger_status_reg[1] & 0x40) << 1 | \
169 (_finger_status_reg[1] & 0x10) << 2 | \
170 (_finger_status_reg[1] & 0x04) << 3 | \
171 (_finger_status_reg[1] & 0x01) << 4 | \
172 (_finger_status_reg[0] & 0x40) >> 3 | \
173 (_finger_status_reg[0] & 0x10) >> 2 | \
174 (_finger_status_reg[0] & 0x04) >> 1 | \
175 (_finger_status_reg[0] & 0x01))
176
177#define GET_INDEX_FROM_MASK(_index, _bit_mask, _max_finger) \
178 do { \
179 for (; !((_bit_mask>>_index)&0x01) \
180 && _index <= _max_finger; _index++); \
181 if (_index <= _max_finger) \
182 _bit_mask &= ~(_bit_mask & (1<<(_index))); \
183 } while (0)
184
185int synaptics_ts_get_data(struct i2c_client *client, struct t_data* data,
186 struct b_data* button, u8* total_num)
187{
188 struct synaptics_ts_data* ts =
189 (struct synaptics_ts_data*)get_touch_handle(client);
190
191 u16 touch_finger_bit_mask=0;
192 u8 finger_index=0;
193 u8 index=0;
194 u8 cnt;
195
196 if (unlikely(touch_debug_mask & DEBUG_TRACE))
197 TOUCH_DEBUG_MSG("\n");
198
199 if (unlikely(touch_i2c_read(client, DEVICE_STATUS_REG,
200 sizeof(ts->ts_data.interrupt_status_reg),
201 &ts->ts_data.device_status_reg) < 0)) {
202 TOUCH_ERR_MSG("DEVICE_STATUS_REG read fail\n");
203 goto err_synaptics_getdata;
204 }
205
206 /* ESD damage check */
207 if ((ts->ts_data.device_status_reg & DEVICE_FAILURE_MASK) ==
208 DEVICE_FAILURE_MASK) {
209 TOUCH_ERR_MSG("ESD damage occured. Reset Touch IC\n");
210 goto err_synaptics_device_damage;
211 }
212
213 /* Internal reset check */
214 if (((ts->ts_data.device_status_reg & DEVICE_STATUS_UNCONFIGURED) >> 7) == 1) {
215 TOUCH_ERR_MSG("Touch IC resetted internally. "
216 "Reconfigure register setting\n");
217 goto err_synaptics_device_damage;
218 }
219
220 if (unlikely(touch_i2c_read(client, INTERRUPT_STATUS_REG,
221 sizeof(ts->ts_data.interrupt_status_reg),
222 &ts->ts_data.interrupt_status_reg) < 0)) {
223 TOUCH_ERR_MSG("INTERRUPT_STATUS_REG read fail\n");
224 goto err_synaptics_getdata;
225 }
226
227 if (unlikely(touch_debug_mask & DEBUG_GET_DATA))
228 TOUCH_INFO_MSG("Interrupt_status : 0x%x\n",
229 ts->ts_data.interrupt_status_reg);
230
231 /* IC bug Exception handling - Interrupt status reg is 0 when interrupt occur */
232 if (ts->ts_data.interrupt_status_reg == 0) {
233 TOUCH_ERR_MSG("Interrupt_status reg is 0. "
234 "Something is wrong in IC\n");
235 goto err_synaptics_device_damage;
236 }
237
238 /* Because of ESD damage... */
239 if (unlikely(ts->ts_data.interrupt_status_reg & ts->interrupt_mask.flash)) {
240 TOUCH_ERR_MSG("Impossible Interrupt\n");
241 goto err_synaptics_device_damage;
242 }
243
244 /* Finger */
245 if (likely(ts->ts_data.interrupt_status_reg & ts->interrupt_mask.abs)) {
246 if (unlikely(touch_i2c_read(client, FINGER_STATE_REG,
247 sizeof(ts->ts_data.finger.finger_status_reg),
248 ts->ts_data.finger.finger_status_reg) < 0)) {
249 TOUCH_ERR_MSG("FINGER_STATE_REG read fail\n");
250 goto err_synaptics_getdata;
251 }
252
253 touch_finger_bit_mask = GET_BIT_MASK(ts->ts_data.finger.finger_status_reg);
254 if (unlikely(touch_debug_mask & DEBUG_GET_DATA)) {
255 TOUCH_INFO_MSG("Finger_status : 0x%x, 0x%x, 0x%x\n",
256 ts->ts_data.finger.finger_status_reg[0],
257 ts->ts_data.finger.finger_status_reg[1],
258 ts->ts_data.finger.finger_status_reg[2]);
259 TOUCH_INFO_MSG("Touch_bit_mask: 0x%x\n", touch_finger_bit_mask);
260 }
261
262 while (touch_finger_bit_mask) {
263 GET_INDEX_FROM_MASK(finger_index, touch_finger_bit_mask,
264 MAX_NUM_OF_FINGERS);
265 if (unlikely(touch_i2c_read(ts->client,
266 FINGER_DATA_REG_START + (NUM_OF_EACH_FINGER_DATA_REG * finger_index),
267 NUM_OF_EACH_FINGER_DATA_REG,
268 ts->ts_data.finger.finger_reg[index]) < 0)) {
269 TOUCH_ERR_MSG("FINGER_DATA_REG read fail\n");
270 goto err_synaptics_getdata;
271 }
272
273 data[index].id = finger_index;
274 data[index].x_position = TS_SNTS_GET_X_POSITION(
275 ts->ts_data.finger.finger_reg[index][REG_X_POSITION],
276 ts->ts_data.finger.finger_reg[index][REG_YX_POSITION]);
277 data[index].y_position = TS_SNTS_GET_Y_POSITION(
278 ts->ts_data.finger.finger_reg[index][REG_Y_POSITION],
279 ts->ts_data.finger.finger_reg[index][REG_YX_POSITION]);
280 data[index].width_major = TS_SNTS_GET_WIDTH_MAJOR(
281 ts->ts_data.finger.finger_reg[index][REG_WY_WX]);
282 data[index].width_minor = TS_SNTS_GET_WIDTH_MINOR(
283 ts->ts_data.finger.finger_reg[index][REG_WY_WX]);
284 data[index].width_orientation = TS_SNTS_GET_ORIENTATION(
285 ts->ts_data.finger.finger_reg[index][REG_WY_WX]);
286 data[index].pressure = TS_SNTS_GET_PRESSURE(
287 ts->ts_data.finger.finger_reg[index][REG_Z]);
288
289 if (unlikely(touch_debug_mask & DEBUG_GET_DATA))
290 TOUCH_INFO_MSG("[%d] pos(%4d,%4d) w_m[%2d] "
291 "w_n[%2d] w_o[%2d] p[%2d]\n",
292 finger_index,
293 data[index].x_position,
294 data[index].y_position,
295 data[index].width_major,
296 data[index].width_minor,
297 data[index].width_orientation,
298 data[index].pressure);
299
300 index++;
301 }
302 *total_num = index;
303 if (unlikely(touch_debug_mask & DEBUG_GET_DATA))
304 TOUCH_INFO_MSG("Total_num: %d\n", *total_num);
305 }
306
307 /* Button */
308 if (unlikely(ts->button_dsc.id != 0)) {
309 if (likely(ts->ts_data.interrupt_status_reg &
310 ts->interrupt_mask.button)) {
311
312#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
313 if (unlikely(touch_i2c_write_byte(client,
314 PAGE_SELECT_REG, 0x02) < 0)) {
315 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
316 return -EIO;
317 }
318
319 if (unlikely(touch_i2c_read(client, BUTTON_DATA_REG,
320 sizeof(ts->ts_data.button_data_reg),
321 &ts->ts_data.button_data_reg) < 0)) {
322 TOUCH_ERR_MSG("BUTTON_DATA_REG read fail\n");
323 goto err_synaptics_getdata;
324 }
325
326 if (unlikely(touch_i2c_write_byte(client,
327 PAGE_SELECT_REG, 0x00) < 0)) {
328 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
329 return -EIO;
330 }
331#else
332 if (unlikely(touch_i2c_read(client, BUTTON_DATA_REG,
333 sizeof(ts->ts_data.button_data_reg),
334 &ts->ts_data.button_data_reg) < 0)) {
335 TOUCH_ERR_MSG("BUTTON_DATA_REG read fail\n");
336 goto err_synaptics_getdata;
337 }
338#endif
339 if (unlikely(touch_debug_mask & DEBUG_BUTTON))
340 TOUCH_DEBUG_MSG("Button register: 0x%x\n",
341 ts->ts_data.button_data_reg);
342
343 if (ts->ts_data.button_data_reg) {
344 /* pressed - find first one */
345 for (cnt = 0; cnt < ts->pdata->caps->number_of_button; cnt++) {
346#if defined(CONFIG_TOUCH_REG_MAP_TM2000)
347 if (((ts->ic_panel_type == IC7020_GFF ||
348 ts->ic_panel_type == IC7020_G2 ||
349 ts->ic_panel_type == IC7020_G2_H_PTN) &&
350 ((ts->ts_data.button_data_reg >> cnt)
351 & 0x1)) ||
352 ((ts->ic_panel_type == IC3203_G2) &&
353 ((ts->ts_data.button_data_reg >>
354 (cnt << 1)) & 0x3))) {
355#elif defined(CONFIG_TOUCH_REG_MAP_TM2372)
356 if ((ts->ts_data.button_data_reg >> cnt) & 0x1) {
357#else
358 if ((ts->ts_data.button_data_reg >> cnt) & 0x1) {
359#endif
360 ts->ts_data.button.key_code =
361 ts->pdata->caps->button_name[cnt];
362 button->key_code =
363 ts->ts_data.button.key_code;
364 button->state = 1;
365 break;
366 }
367 }
368 } else {
369 /* release */
370 button->key_code = ts->ts_data.button.key_code;
371 button->state = 0;
372 }
373 }
374 }
375
376 return 0;
377
378err_synaptics_device_damage:
379err_synaptics_getdata:
380 return -EIO;
381}
382
383static int read_page_description_table(struct i2c_client* client)
384{
385 struct synaptics_ts_data* ts =
386 (struct synaptics_ts_data*)get_touch_handle(client);
387 struct ts_function_descriptor buffer;
388 unsigned short u_address;
389
390 if (touch_debug_mask & DEBUG_TRACE)
391 TOUCH_DEBUG_MSG("\n");
392
393 memset(&buffer, 0x0, sizeof(struct ts_function_descriptor));
394
395 ts->common_dsc.id = 0;
396 ts->finger_dsc.id = 0;
397 ts->button_dsc.id = 0;
398 ts->flash_dsc.id = 0;
399#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
400 ts->analog_dsc.id = 0;
401#endif
402
403 for (u_address = DESCRIPTION_TABLE_START; u_address > 10;
404 u_address -= sizeof(struct ts_function_descriptor)) {
405 if (unlikely(touch_i2c_read(client, u_address, sizeof(buffer),
406 (unsigned char *)&buffer) < 0)) {
407 TOUCH_ERR_MSG("RMI4 Function Descriptor read fail\n");
408 return -EIO;
409 }
410
411 if (buffer.id == 0)
412 break;
413
414 switch (buffer.id) {
415 case RMI_DEVICE_CONTROL:
416 ts->common_dsc = buffer;
417 break;
418 case TOUCHPAD_SENSORS:
419 ts->finger_dsc = buffer;
420 break;
421 case FLASH_MEMORY_MANAGEMENT:
422 ts->flash_dsc = buffer;
423 }
424 }
425
426#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
427 if (unlikely(touch_i2c_write_byte(client, PAGE_SELECT_REG, 0x01) < 0)) {
428 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
429 return -EIO;
430 }
431
432 u_address = DESCRIPTION_TABLE_START;
433
434 if (unlikely(touch_i2c_read(client, u_address, sizeof(buffer),
435 (unsigned char *)&buffer) < 0)) {
436 TOUCH_ERR_MSG("RMI4 Function Descriptor read fail\n");
437 return -EIO;
438 }
439
440 switch (buffer.id) {
441 case ANALOG_CONTROL:
442 ts->analog_dsc = buffer;
443 break;
444 }
445
446 if (unlikely(touch_i2c_write_byte(client, PAGE_SELECT_REG, 0x02) < 0)) {
447 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
448 return -EIO;
449 }
450
451 u_address -= sizeof(struct ts_function_descriptor);
452
453 if (unlikely(touch_i2c_read(ts->client, u_address, sizeof(buffer),
454 (unsigned char *)&buffer))) {
455 TOUCH_ERR_MSG("Button ts_function_descriptor read fail\n");
456 return -EIO;
457 }
458
459 switch (buffer.id) {
460 case CAPACITIVE_BUTTON_SENSORS:
461 ts->button_dsc = buffer;
462 break;
463 }
464
465 if (unlikely(touch_i2c_write_byte(client, PAGE_SELECT_REG, 0x00) < 0)) {
466 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
467 return -EIO;
468 }
469#endif
470
471 /* set interrupt mask */
472 ts->interrupt_mask.flash = 0x1;
473 ts->interrupt_mask.status = 0x2;
474
475 if (ts->button_dsc.id == 0) {
476 ts->interrupt_mask.abs = 0x4;
477 } else {
478 if (ts->finger_dsc.data_base > ts->button_dsc.data_base) {
479#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
480 ts->interrupt_mask.abs = 0x4;
481 ts->interrupt_mask.button = 0x20;
482#else
483 ts->interrupt_mask.abs = 0x8;
484 ts->interrupt_mask.button = 0x4;
485#endif
486 } else {
487 ts->interrupt_mask.abs = 0x4;
488 ts->interrupt_mask.button = 0x8;
489 }
490 }
491
492 if (ts->common_dsc.id == 0 || ts->finger_dsc.id == 0 ||
493 ts->flash_dsc.id == 0) {
494 TOUCH_ERR_MSG("common_dsc/finger_dsc/flash_dsc are not initiailized\n");
495 return -EPERM;
496 }
497
498 if (touch_debug_mask & DEBUG_BASE_INFO)
499 TOUCH_INFO_MSG("common[%d] finger[%d] flash[%d] button[%d]\n",
500 ts->common_dsc.id, ts->finger_dsc.id,
501 ts->flash_dsc.id, ts->button_dsc.id);
502
503 return 0;
504}
505
506int get_ic_info(struct synaptics_ts_data* ts, struct touch_fw_info* fw_info)
507{
508#if defined(ARRAYED_TOUCH_FW_BIN)
509 int cnt;
510#endif
511 u8 device_status = 0;
512 u8 flash_control = 0;
513
514 read_page_description_table(ts->client);
515
516 memset(fw_info, 0, sizeof(fw_info));
517
518 if (unlikely(touch_i2c_read(ts->client, FW_REVISION_REG,
519 sizeof(fw_info->fw_rev), &fw_info->fw_rev) < 0)) {
520 TOUCH_ERR_MSG("FW_REVISION_REG read fail\n");
521 return -EIO;
522 }
523
524 if (unlikely(touch_i2c_read(ts->client, MANUFACTURER_ID_REG,
525 sizeof(fw_info->manufacturer_id),
526 &fw_info->manufacturer_id) < 0)) {
527 TOUCH_ERR_MSG("MANUFACTURER_ID_REG read fail\n");
528 return -EIO;
529 }
530
531 if (unlikely(touch_i2c_read(ts->client, PRODUCT_ID_REG,
532 sizeof(fw_info->product_id) - 1,
533 fw_info->product_id) < 0)) {
534 TOUCH_ERR_MSG("PRODUCT_ID_REG read fail\n");
535 return -EIO;
536 }
537
538 if (unlikely(touch_i2c_read(ts->client, FW_VERSION,
539 sizeof(fw_info->fw_version) - 1,
540 fw_info->fw_version) < 0)) {
541 TOUCH_ERR_MSG("FW_VERSION read fail\n");
542 return -EIO;
543 }
544
545#if defined(CONFIG_TOUCH_REG_MAP_TM2000)
546 if ((strncmp(fw_info->fw_version, "0000", 4) == 0) ||
547 (strncmp(fw_info->fw_version, "S001", 4) == 0)) {
548 ts->ic_panel_type = IC7020_GFF;
549 TOUCH_INFO_MSG("IC is 7020, panel is GFF.");
550 } else {
551 if (fw_info->fw_version[0] == 'E' &&
552 (int)simple_strtol(&fw_info->fw_version[1], NULL, 10) < 14) {
553 ts->ic_panel_type = IC7020_G2;
554 TOUCH_INFO_MSG("IC is 7020, panel is G2.");
555 } else if ((fw_info->fw_version[0] == 'E'
556 && (int)simple_strtol(&fw_info->fw_version[1], NULL, 10) >= 14
557 && (int)simple_strtol(&fw_info->fw_version[1], NULL, 10) < 27)
558 || fw_info->fw_version[0] == 'T') {
559 ts->ic_panel_type = IC3203_G2;
560 TOUCH_INFO_MSG("IC is 3203, panel is G2.");
561 } else {
562 ts->ic_panel_type = IC7020_G2_H_PTN;
563 TOUCH_INFO_MSG("IC is 7020, H pattern, panel is G2.");
564
565 if ((fw_info->fw_version[0] == 'E')
566 && ((int)simple_strtol(&fw_info->fw_version[1],
567 NULL, 10) >= 40)) {
568 ts->interrupt_mask.button = 0x10;
569 }
570 }
571 }
572#elif defined(CONFIG_TOUCH_REG_MAP_TM2372)
573 ts->ic_panel_type = IC7020_GFF_H_PTN;
574 TOUCH_INFO_MSG("IC is 7020, H pattern, panel is GFF.");
575#endif
576
577#if defined(ARRAYED_TOUCH_FW_BIN)
578 for (cnt = 0; cnt < sizeof(SynaFirmware)/sizeof(SynaFirmware[0]); cnt++) {
579 strncpy(fw_info->fw_image_product_id,
580 &SynaFirmware[cnt][16], 10);
581 if (!(strncmp(fw_info->product_id,
582 fw_info->fw_image_product_id, 10)))
583 break;
584 }
585 fw_info->fw_start = (unsigned char *)&SynaFirmware[cnt][0];
586 fw_info->fw_size = sizeof(SynaFirmware[0]);
587#else
588 strncpy(fw_info->fw_image_product_id, &SynaFirmware[16], 10);
589#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
590 strncpy(fw_info->fw_image_version, &SynaFirmware[0xb100],4);
591#endif
592 fw_info->fw_start = (unsigned char *)&SynaFirmware[0];
593 fw_info->fw_size = sizeof(SynaFirmware);
594#endif
595
596 fw_info->fw_image_rev = fw_info->fw_start[31];
597
598 if (unlikely(touch_i2c_read(ts->client, FLASH_CONTROL_REG,
599 sizeof(flash_control), &flash_control) < 0)) {
600 TOUCH_ERR_MSG("FLASH_CONTROL_REG read fail\n");
601 return -EIO;
602 }
603
604 if (unlikely(touch_i2c_read(ts->client, DEVICE_STATUS_REG,
605 sizeof(device_status), &device_status) < 0)) {
606 TOUCH_ERR_MSG("DEVICE_STATUS_REG read fail\n");
607 return -EIO;
608 }
609
610 /* Firmware has a problem, so we should firmware-upgrade */
611 if (device_status & DEVICE_STATUS_FLASH_PROG
612 || (device_status & DEVICE_CRC_ERROR_MASK) != 0
613 || (flash_control & FLASH_STATUS_MASK) != 0) {
614 TOUCH_ERR_MSG("Firmware has a unknown-problem, "
615 "so it needs firmware-upgrade.\n");
616 TOUCH_ERR_MSG("FLASH_CONTROL[%x] DEVICE_STATUS_REG[%x]\n",
617 (u32)flash_control, (u32)device_status);
618
619 fw_info->fw_rev = 0;
620#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
621 fw_info->fw_force_rework = true;
622#endif
623 }
624
625 ts->fw_info = fw_info;
626
627 return 0;
628}
629
630int synaptics_ts_init(struct i2c_client* client, struct touch_fw_info* fw_info)
631{
632 struct synaptics_ts_data* ts =
633 (struct synaptics_ts_data*)get_touch_handle(client);
634 u8 buf;
635
636 if (touch_debug_mask & DEBUG_TRACE)
637 TOUCH_DEBUG_MSG("\n");
638
639 if (!ts->is_probed)
640 if (unlikely(get_ic_info(ts, fw_info) < 0))
641 return -EIO;
642
643 if (unlikely(touch_i2c_write_byte(client, DEVICE_CONTROL_REG,
644 DEVICE_CONTROL_NOSLEEP | DEVICE_CONTROL_CONFIGURED) < 0)) {
645 TOUCH_ERR_MSG("DEVICE_CONTROL_REG write fail\n");
646 return -EIO;
647 }
648
649 if (unlikely(touch_i2c_read(client, INTERRUPT_ENABLE_REG,
650 1, &buf) < 0)) {
651 TOUCH_ERR_MSG("INTERRUPT_ENABLE_REG read fail\n");
652 return -EIO;
653 }
654 if (unlikely(touch_i2c_write_byte(client, INTERRUPT_ENABLE_REG,
655 buf | ts->interrupt_mask.abs | ts->interrupt_mask.button) < 0)) {
656 TOUCH_ERR_MSG("INTERRUPT_ENABLE_REG write fail\n");
657 return -EIO;
658 }
659
660#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
661 /* do nothing */
662#else
663 if (unlikely(touch_i2c_write_byte(client,
664 GESTURE_ENABLE_1_REG, 0x00) < 0)) {
665 TOUCH_ERR_MSG("GESTURE_ENABLE_1_REG write fail\n");
666 return -EIO;
667 }
668 if (unlikely(touch_i2c_write_byte(client, GESTURE_ENABLE_2_REG, 0x00) < 0)) {
669 TOUCH_ERR_MSG("GESTURE_ENABLE_2_REG write fail\n");
670 return -EIO;
671 }
672
673 if (ts->pdata->role->report_mode == CONTINUOUS_REPORT_MODE) {
674 if (unlikely(touch_i2c_write_byte(client, TWO_D_REPORTING_MODE,
675 REPORT_MODE_CONTINUOUS) < 0)) {
676 TOUCH_ERR_MSG("TWO_D_REPORTING_MODE write fail\n");
677 return -EIO;
678 }
679 } else { /* REDUCED_REPORT_MODE */
680 if (unlikely(touch_i2c_write_byte(client, TWO_D_REPORTING_MODE,
681 REPORT_MODE_REDUCED) < 0)) {
682 TOUCH_ERR_MSG("TWO_D_REPORTING_MODE write fail\n");
683 return -EIO;
684 }
685
686 if (unlikely(touch_i2c_write_byte(client, DELTA_X_THRESH_REG,
687 ts->pdata->role->delta_pos_threshold) < 0)) {
688 TOUCH_ERR_MSG("DELTA_X_THRESH_REG write fail\n");
689 return -EIO;
690 }
691 if (unlikely(touch_i2c_write_byte(client, DELTA_Y_THRESH_REG,
692 ts->pdata->role->delta_pos_threshold) < 0)) {
693 TOUCH_ERR_MSG("DELTA_Y_THRESH_REG write fail\n");
694 return -EIO;
695 }
696 }
697#endif
698
699 if (unlikely(touch_i2c_read(client, INTERRUPT_STATUS_REG, 1, &buf) < 0)) {
700 TOUCH_ERR_MSG("INTERRUPT_STATUS_REG read fail\n");
701 return -EIO; /* it is critical problem because interrupt will not occur. */
702 }
703
704 if (unlikely(touch_i2c_read(client, FINGER_STATE_REG,
705 sizeof(ts->ts_data.finger.finger_status_reg),
706 ts->ts_data.finger.finger_status_reg) < 0)) {
707 TOUCH_ERR_MSG("FINGER_STATE_REG read fail\n");
708 /* it is critical problem because interrupt will not occur on some FW. */
709 return -EIO;
710 }
711
712 ts->is_probed = 1;
713
714 return 0;
715}
716
717int synaptics_ts_power(struct i2c_client* client, int power_ctrl)
718{
719 struct synaptics_ts_data* ts =
720 (struct synaptics_ts_data*)get_touch_handle(client);
721
722 if (touch_debug_mask & DEBUG_TRACE)
723 TOUCH_DEBUG_MSG("\n");
724
725 switch (power_ctrl) {
726 case POWER_OFF:
727 if (ts->pdata->pwr->use_regulator) {
728 regulator_disable(ts->regulator_vio);
729 regulator_disable(ts->regulator_vdd);
730 }
731 else
732 ts->pdata->pwr->power(0);
733
734 break;
735 case POWER_ON:
736 if (ts->pdata->pwr->use_regulator) {
737 regulator_enable(ts->regulator_vdd);
738 regulator_enable(ts->regulator_vio);
739 }
740 else
741 ts->pdata->pwr->power(1);
742
743 /* P2 H/W bug fix */
744 if (ts->pdata->reset_pin > 0) {
745 msleep(10);
746 gpio_set_value(ts->pdata->reset_pin, 0);
747 msleep(ts->pdata->role->reset_delay);
748 gpio_set_value(ts->pdata->reset_pin, 1);
749 }
750 break;
751 case POWER_SLEEP:
752 if (unlikely(touch_i2c_write_byte(client, DEVICE_CONTROL_REG,
753 DEVICE_CONTROL_SLEEP |
754 DEVICE_CONTROL_CONFIGURED) < 0)) {
755 TOUCH_ERR_MSG("DEVICE_CONTROL_REG write fail\n");
756 return -EIO;
757 }
758 break;
759 case POWER_WAKE:
760 if (unlikely(touch_i2c_write_byte(client, DEVICE_CONTROL_REG,
761 DEVICE_CONTROL_SPECIFIC |
762 DEVICE_CONTROL_CONFIGURED) < 0)) {
763 TOUCH_ERR_MSG("DEVICE_CONTROL_REG write fail\n");
764 return -EIO;
765 }
766 break;
767 default:
768 return -EIO;
769 break;
770 }
771
772 return 0;
773}
774
775int synaptics_ts_probe(struct i2c_client* client)
776{
777 struct synaptics_ts_data* ts;
778 int ret = 0;
779
780 if (touch_debug_mask & DEBUG_TRACE)
781 TOUCH_DEBUG_MSG("\n");
782
783 ts = kzalloc(sizeof(struct synaptics_ts_data), GFP_KERNEL);
784 if (!ts) {
785 TOUCH_ERR_MSG("Can not allocate memory\n");
786 ret = -ENOMEM;
787 goto err_alloc_data_failed;
788 }
789
790 set_touch_handle(client, ts);
791
792 ts->client = client;
793 ts->pdata = client->dev.platform_data;
794#if defined(CONFIG_TOUCH_REG_MAP_TM2000)
795 ts->ic_panel_type = IC7020_G2_H_PTN;
796#elif defined(CONFIG_TOUCH_REG_MAP_TM2372)
797 ts->ic_panel_type = IC7020_GFF_H_PTN;
798#endif
799
800 if (ts->pdata->pwr->use_regulator) {
801 ts->regulator_vdd =
802 regulator_get_exclusive(NULL, ts->pdata->pwr->vdd);
803 if (IS_ERR(ts->regulator_vdd)) {
804 TOUCH_ERR_MSG("FAIL: regulator_get_vdd - %s\n",
805 ts->pdata->pwr->vdd);
806 ret = -EPERM;
807 goto err_get_vdd_failed;
808 }
809
810 ts->regulator_vio = regulator_get_exclusive(NULL,
811 ts->pdata->pwr->vio);
812 if (IS_ERR(ts->regulator_vio)) {
813 TOUCH_ERR_MSG("FAIL: regulator_get_vio - %s\n",
814 ts->pdata->pwr->vio);
815 ret = -EPERM;
816 goto err_get_vio_failed;
817 }
818
819 if (ts->pdata->pwr->vdd_voltage > 0) {
820 ret = regulator_set_voltage(ts->regulator_vdd,
821 ts->pdata->pwr->vdd_voltage,
822 ts->pdata->pwr->vdd_voltage);
823 if (ret < 0)
824 TOUCH_ERR_MSG("FAIL: VDD voltage setting"
825 " - (%duV)\n",
826 ts->pdata->pwr->vdd_voltage);
827 }
828
829 if (ts->pdata->pwr->vio_voltage > 0) {
830 ret = regulator_set_voltage(ts->regulator_vio,
831 ts->pdata->pwr->vio_voltage,
832 ts->pdata->pwr->vio_voltage);
833 if (ret < 0)
834 TOUCH_ERR_MSG("FAIL: VIO voltage setting"
835 " - (%duV)\n",
836 ts->pdata->pwr->vio_voltage);
837 }
838 }
839
840 return ret;
841
842err_get_vio_failed:
843 if (ts->pdata->pwr->use_regulator) {
844 regulator_put(ts->regulator_vdd);
845 }
846err_get_vdd_failed:
847err_alloc_data_failed:
848 kfree(ts);
849 return ret;
850}
851
852void synaptics_ts_remove(struct i2c_client* client)
853{
854 struct synaptics_ts_data* ts =
855 (struct synaptics_ts_data*)get_touch_handle(client);
856
857 if (touch_debug_mask & DEBUG_TRACE)
858 TOUCH_DEBUG_MSG("\n");
859
860 if (ts->pdata->pwr->use_regulator) {
861 regulator_put(ts->regulator_vio);
862 regulator_put(ts->regulator_vdd);
863 }
864
865 kfree(ts);
866}
867
868int synaptics_ts_fw_upgrade(struct i2c_client* client, const char* fw_path)
869{
870 struct synaptics_ts_data* ts =
871 (struct synaptics_ts_data*)get_touch_handle(client);
872 int ret = 0;
873
874 ts->is_probed = 0;
875
876 ret = FirmwareUpgrade(ts, fw_path);
877
878 /* update IC info */
879 get_ic_info(ts, ts->fw_info);
880
881 return ret;
882}
883
884int synaptics_ts_ic_ctrl(struct i2c_client *client, u8 code, u16 value)
885{
886 struct synaptics_ts_data* ts =
887 (struct synaptics_ts_data*)get_touch_handle(client);
888 u8 buf = 0;
889
890 switch (code) {
891 case IC_CTRL_BASELINE:
892 switch (value) {
893 case BASELINE_OPEN:
894#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
895 if (unlikely(touch_i2c_write_byte(client,
896 PAGE_SELECT_REG, 0x01) < 0)) {
897 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
898 return -EIO;
899 }
900
901 if (unlikely(touch_i2c_write_byte(client,
902 ANALOG_CONTROL_REG,
903 FORCE_FAST_RELAXATION) < 0)) {
904 TOUCH_ERR_MSG("ANALOG_CONTROL_REG write fail\n");
905 return -EIO;
906 }
907
908 msleep(10);
909
910 if (unlikely(touch_i2c_write_byte(client,
911 ANALOG_COMMAND_REG,
912 FORCE_UPDATE) < 0)) {
913 TOUCH_ERR_MSG("force fast relaxation command write fail\n");
914 return -EIO;
915 }
916
917 if (unlikely(touch_i2c_write_byte(client,
918 PAGE_SELECT_REG, 0x00) < 0)) {
919 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
920 return -EIO;
921 }
922
923 if (unlikely(touch_debug_mask & DEBUG_GHOST))
924 TOUCH_INFO_MSG("BASELINE_OPEN ~~~~~~~~\n");
925#else
926 if (unlikely(touch_i2c_write_byte(client,
927 MELT_CONTROL_REG,
928 MELT_CONTROL_MELT) < 0)) {
929 TOUCH_ERR_MSG("MELT_CONTROL_REG write fail\n");
930 return -EIO;
931 }
932#endif
933 break;
934 case BASELINE_FIX:
935#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
936 if (unlikely(touch_i2c_write_byte(client,
937 PAGE_SELECT_REG, 0x01) < 0)) {
938 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
939 return -EIO;
940 }
941
942 if (unlikely(touch_i2c_write_byte(client,
943 ANALOG_CONTROL_REG, 0x0) < 0)) {
944 TOUCH_ERR_MSG("ANALOG_CONTROL_REG write fail\n");
945 return -EIO;
946 }
947
948 msleep(10);
949
950 if (unlikely(touch_i2c_write_byte(client,
951 ANALOG_COMMAND_REG,
952 FORCE_UPDATE) < 0)) {
953 TOUCH_ERR_MSG("force fast relaxation command write fail\n");
954 return -EIO;
955 }
956
957 if (unlikely(touch_i2c_write_byte(client,
958 PAGE_SELECT_REG, 0x00) < 0)) {
959 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
960 return -EIO;
961 }
962
963 if (unlikely(touch_debug_mask & DEBUG_GHOST))
964 TOUCH_INFO_MSG("BASELINE_FIX ~~~~~~~~\n");
965#else
966 if (unlikely(touch_i2c_write_byte(client,
967 MELT_CONTROL_REG,
968 MELT_CONTROL_NO_MELT) < 0)) {
969 TOUCH_ERR_MSG("MELT_CONTROL_REG write fail\n");
970 return -EIO;
971 }
972#endif
973 break;
974 case BASELINE_REBASE:
975 /* rebase base line */
976 if (likely(ts->finger_dsc.id != 0)) {
977 if (unlikely(touch_i2c_write_byte(client,
978 FINGER_COMMAND_REG, 0x1) < 0)) {
979 TOUCH_ERR_MSG("finger baseline reset "
980 "command write fail\n");
981 return -EIO;
982 }
983 }
984
985#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
986/* do nothing */
987#else
988 if (unlikely(ts->button_dsc.id != 0)) {
989 if (unlikely(touch_i2c_write_byte(client,
990 BUTTON_COMMAND_REG, 0x1) < 0)) {
991 TOUCH_ERR_MSG("finger baseline reset "
992 "command write fail\n");
993 return -EIO;
994 }
995 }
996#endif
997 break;
998 default:
999 break;
1000 }
1001 break;
1002 case IC_CTRL_READ:
1003 if (touch_i2c_read(client, value, 1, &buf) < 0) {
1004 TOUCH_ERR_MSG("IC register read fail\n");
1005 return -EIO;
1006 }
1007 break;
1008 case IC_CTRL_WRITE:
1009 if (touch_i2c_write_byte(client,
1010 ((value & 0xFF00) >> 8), (value & 0xFF)) < 0) {
1011 TOUCH_ERR_MSG("IC register write fail\n");
1012 return -EIO;
1013 }
1014 break;
1015 case IC_CTRL_RESET_CMD:
1016 if (unlikely(touch_i2c_write_byte(client,
1017 DEVICE_COMMAND_REG, 0x1) < 0)) {
1018 TOUCH_ERR_MSG("IC Reset command write fail\n");
1019 return -EIO;
1020 }
1021 break;
1022 default:
1023 break;
1024 }
1025
1026 return buf;
1027}
1028
1029int synaptics_ts_fw_upgrade_check(struct lge_touch_data *ts)
1030{
1031#if defined(CONFIG_TOUCH_REG_MAP_TM2000)
1032 if (ts->fw_info.fw_force_rework) {
1033 TOUCH_INFO_MSG("FW-upgrade Force Rework.\n");
1034 } else {
1035 /* do not update 7020 gff, 7020 g2, 3203 g2 */
1036 if (((ts->fw_info.fw_version[0] == '0' &&
1037 (int)simple_strtoul(&ts->fw_info.fw_version[1], NULL, 10) == 0) ||
1038 (ts->fw_info.fw_version[0] == 'S' &&
1039 (int)simple_strtoul(&ts->fw_info.fw_version[1], NULL, 10) == 1) ||
1040 (ts->fw_info.fw_version[0] == 'E' &&
1041 (int)simple_strtoul(&ts->fw_info.fw_version[1], NULL, 10) < 27) ||
1042 (ts->fw_info.fw_version[0] == 'T'))) {
1043 TOUCH_INFO_MSG("DO NOT UPDATE 7020 gff, 7020 g2, 3203 " "g2 FW-upgrade is not executed\n");
1044 return -1;
1045 }
1046
1047 if ((ts->fw_info.fw_version[0] == 'E' &&
1048 (int)simple_strtoul(&ts->fw_info.fw_version[1], NULL, 10) >= 27) && !ts->fw_upgrade.fw_force_upgrade) { /* 7020 g2 h pattern */
1049
1050 if (((int)simple_strtoul(&ts->fw_info.fw_version[1], NULL, 10) >= (int)simple_strtoul(&ts->fw_info.fw_image_version[1], NULL, 10))) {
1051 TOUCH_INFO_MSG("DO NOT UPDATE 7020 G2 H " "pattern FW-upgrade is not executed\n");
1052 return -1;
1053 } else {
1054 TOUCH_INFO_MSG("7020 G2 H pattern FW-upgrade " "is executed\n");
1055 }
1056 } else {
1057 if (!ts->fw_upgrade.fw_force_upgrade) {
1058 TOUCH_INFO_MSG("UNKNOWN PANEL. FW-upgrade is" " not executed\n");
1059 return -1;
1060 }
1061 }
1062 }
1063#elif defined(CONFIG_TOUCH_REG_MAP_TM2372)
1064 if (ts->fw_info.fw_force_rework) {
1065 TOUCH_INFO_MSG("FW-upgrade Force Rework.\n");
1066 } else {
1067 if ((ts->fw_info.fw_version[0] == 'E' &&
1068 (int)simple_strtoul(&ts->fw_info.fw_version[1], NULL, 10) >= 1) &&
1069 !ts->fw_upgrade.fw_force_upgrade) {
1070
1071 if (((int)simple_strtoul(&ts->fw_info.fw_version[1], NULL, 10) >=
1072 (int)simple_strtoul(&ts->fw_info.fw_image_version[1],
1073 NULL, 10))) {
1074 TOUCH_INFO_MSG("DO NOT UPDATE 7020 GFF H " "pattern FW-upgrade is not executed\n");
1075 return -1;
1076 } else {
1077 TOUCH_INFO_MSG("7020 GFF H pattern FW-upgrade " "is executed\n");
1078 }
1079 } else {
1080 if (!ts->fw_upgrade.fw_force_upgrade) {
1081 TOUCH_INFO_MSG("UNKNOWN PANEL. FW-upgrade is not executed\n");
1082 return -1;
1083 }
1084 }
1085 }
1086#else
1087 /* test revision should be over 100 */
1088 if (((ts->fw_info.fw_rev >= ts->fw_info.fw_image_rev &&
1089 ts->fw_info.fw_rev < 100) ||
1090 strncmp(ts->fw_info.product_id ,
1091 ts->fw_info.fw_image_product_id, 10)) &&
1092 !ts->fw_upgrade.fw_force_upgrade) {
1093 TOUCH_INFO_MSG("FW-upgrade is not executed\n");
1094 return -1;
1095 }
1096#endif
1097
1098 return 0;
1099}
1100
1101struct touch_device_driver synaptics_ts_driver = {
1102 .probe = synaptics_ts_probe,
1103 .remove = synaptics_ts_remove,
1104 .init = synaptics_ts_init,
1105 .data = synaptics_ts_get_data,
1106 .power = synaptics_ts_power,
1107 .fw_upgrade = synaptics_ts_fw_upgrade,
1108 .ic_ctrl = synaptics_ts_ic_ctrl,
1109 .fw_upgrade_check = synaptics_ts_fw_upgrade_check,
1110};
1111
1112static int __devinit touch_init(void)
1113{
1114 if (touch_debug_mask & DEBUG_TRACE)
1115 TOUCH_DEBUG_MSG("\n");
1116
1117 return touch_driver_register(&synaptics_ts_driver);
1118}
1119
1120static void __exit touch_exit(void)
1121{
1122 if (touch_debug_mask & DEBUG_TRACE)
1123 TOUCH_DEBUG_MSG("\n");
1124
1125 touch_driver_unregister();
1126}
1127
1128module_init(touch_init);
1129module_exit(touch_exit);
1130
1131MODULE_AUTHOR("yehan.ahn@lge.com, hyesung.shin@lge.com");
1132MODULE_DESCRIPTION("LGE Touch Driver");
1133MODULE_LICENSE("GPL");
1134