blob: 7541449278130fb59915680802288969334b6549 [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 */
Jongrak Kwon9ed2a932012-06-19 23:38:02 -0700108#define DELTA_X_THRESH_REG (ts->finger_dsc.control_base+2) /* Delta-X Thresh */
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700109#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
Jongrak Kwon9ed2a932012-06-19 23:38:02 -0700244//printk("[S:%x,M:%x", ts->ts_data.interrupt_status_reg, ts->interrupt_mask.abs);
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700245 /* Finger */
246 if (likely(ts->ts_data.interrupt_status_reg & ts->interrupt_mask.abs)) {
247 if (unlikely(touch_i2c_read(client, FINGER_STATE_REG,
248 sizeof(ts->ts_data.finger.finger_status_reg),
249 ts->ts_data.finger.finger_status_reg) < 0)) {
250 TOUCH_ERR_MSG("FINGER_STATE_REG read fail\n");
251 goto err_synaptics_getdata;
252 }
253
254 touch_finger_bit_mask = GET_BIT_MASK(ts->ts_data.finger.finger_status_reg);
Jongrak Kwon9ed2a932012-06-19 23:38:02 -0700255//printk("F:%x", touch_finger_bit_mask);
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700256 if (unlikely(touch_debug_mask & DEBUG_GET_DATA)) {
257 TOUCH_INFO_MSG("Finger_status : 0x%x, 0x%x, 0x%x\n",
258 ts->ts_data.finger.finger_status_reg[0],
259 ts->ts_data.finger.finger_status_reg[1],
260 ts->ts_data.finger.finger_status_reg[2]);
261 TOUCH_INFO_MSG("Touch_bit_mask: 0x%x\n", touch_finger_bit_mask);
262 }
263
264 while (touch_finger_bit_mask) {
265 GET_INDEX_FROM_MASK(finger_index, touch_finger_bit_mask,
266 MAX_NUM_OF_FINGERS);
267 if (unlikely(touch_i2c_read(ts->client,
268 FINGER_DATA_REG_START + (NUM_OF_EACH_FINGER_DATA_REG * finger_index),
269 NUM_OF_EACH_FINGER_DATA_REG,
270 ts->ts_data.finger.finger_reg[index]) < 0)) {
271 TOUCH_ERR_MSG("FINGER_DATA_REG read fail\n");
272 goto err_synaptics_getdata;
273 }
274
275 data[index].id = finger_index;
276 data[index].x_position = TS_SNTS_GET_X_POSITION(
277 ts->ts_data.finger.finger_reg[index][REG_X_POSITION],
278 ts->ts_data.finger.finger_reg[index][REG_YX_POSITION]);
279 data[index].y_position = TS_SNTS_GET_Y_POSITION(
280 ts->ts_data.finger.finger_reg[index][REG_Y_POSITION],
281 ts->ts_data.finger.finger_reg[index][REG_YX_POSITION]);
282 data[index].width_major = TS_SNTS_GET_WIDTH_MAJOR(
283 ts->ts_data.finger.finger_reg[index][REG_WY_WX]);
284 data[index].width_minor = TS_SNTS_GET_WIDTH_MINOR(
285 ts->ts_data.finger.finger_reg[index][REG_WY_WX]);
286 data[index].width_orientation = TS_SNTS_GET_ORIENTATION(
287 ts->ts_data.finger.finger_reg[index][REG_WY_WX]);
288 data[index].pressure = TS_SNTS_GET_PRESSURE(
289 ts->ts_data.finger.finger_reg[index][REG_Z]);
290
291 if (unlikely(touch_debug_mask & DEBUG_GET_DATA))
292 TOUCH_INFO_MSG("[%d] pos(%4d,%4d) w_m[%2d] "
293 "w_n[%2d] w_o[%2d] p[%2d]\n",
294 finger_index,
295 data[index].x_position,
296 data[index].y_position,
297 data[index].width_major,
298 data[index].width_minor,
299 data[index].width_orientation,
300 data[index].pressure);
301
302 index++;
303 }
304 *total_num = index;
Jongrak Kwon9ed2a932012-06-19 23:38:02 -0700305//printk(" -> %d]", index);
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700306 if (unlikely(touch_debug_mask & DEBUG_GET_DATA))
307 TOUCH_INFO_MSG("Total_num: %d\n", *total_num);
308 }
309
Jongrak Kwon9ed2a932012-06-19 23:38:02 -0700310//printk("button_id = %d\n", ts->button_dsc.id);
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700311 /* Button */
312 if (unlikely(ts->button_dsc.id != 0)) {
313 if (likely(ts->ts_data.interrupt_status_reg &
314 ts->interrupt_mask.button)) {
315
316#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
317 if (unlikely(touch_i2c_write_byte(client,
318 PAGE_SELECT_REG, 0x02) < 0)) {
319 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
320 return -EIO;
321 }
322
323 if (unlikely(touch_i2c_read(client, BUTTON_DATA_REG,
324 sizeof(ts->ts_data.button_data_reg),
325 &ts->ts_data.button_data_reg) < 0)) {
326 TOUCH_ERR_MSG("BUTTON_DATA_REG read fail\n");
327 goto err_synaptics_getdata;
328 }
329
330 if (unlikely(touch_i2c_write_byte(client,
331 PAGE_SELECT_REG, 0x00) < 0)) {
332 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
333 return -EIO;
334 }
335#else
336 if (unlikely(touch_i2c_read(client, BUTTON_DATA_REG,
337 sizeof(ts->ts_data.button_data_reg),
338 &ts->ts_data.button_data_reg) < 0)) {
339 TOUCH_ERR_MSG("BUTTON_DATA_REG read fail\n");
340 goto err_synaptics_getdata;
341 }
342#endif
343 if (unlikely(touch_debug_mask & DEBUG_BUTTON))
344 TOUCH_DEBUG_MSG("Button register: 0x%x\n",
345 ts->ts_data.button_data_reg);
346
347 if (ts->ts_data.button_data_reg) {
348 /* pressed - find first one */
349 for (cnt = 0; cnt < ts->pdata->caps->number_of_button; cnt++) {
350#if defined(CONFIG_TOUCH_REG_MAP_TM2000)
351 if (((ts->ic_panel_type == IC7020_GFF ||
352 ts->ic_panel_type == IC7020_G2 ||
353 ts->ic_panel_type == IC7020_G2_H_PTN) &&
354 ((ts->ts_data.button_data_reg >> cnt)
355 & 0x1)) ||
356 ((ts->ic_panel_type == IC3203_G2) &&
357 ((ts->ts_data.button_data_reg >>
358 (cnt << 1)) & 0x3))) {
359#elif defined(CONFIG_TOUCH_REG_MAP_TM2372)
360 if ((ts->ts_data.button_data_reg >> cnt) & 0x1) {
361#else
362 if ((ts->ts_data.button_data_reg >> cnt) & 0x1) {
363#endif
364 ts->ts_data.button.key_code =
365 ts->pdata->caps->button_name[cnt];
366 button->key_code =
367 ts->ts_data.button.key_code;
368 button->state = 1;
369 break;
370 }
371 }
372 } else {
373 /* release */
374 button->key_code = ts->ts_data.button.key_code;
375 button->state = 0;
376 }
377 }
378 }
379
380 return 0;
381
382err_synaptics_device_damage:
383err_synaptics_getdata:
384 return -EIO;
385}
386
387static int read_page_description_table(struct i2c_client* client)
388{
389 struct synaptics_ts_data* ts =
390 (struct synaptics_ts_data*)get_touch_handle(client);
391 struct ts_function_descriptor buffer;
392 unsigned short u_address;
393
394 if (touch_debug_mask & DEBUG_TRACE)
395 TOUCH_DEBUG_MSG("\n");
396
397 memset(&buffer, 0x0, sizeof(struct ts_function_descriptor));
398
399 ts->common_dsc.id = 0;
400 ts->finger_dsc.id = 0;
401 ts->button_dsc.id = 0;
402 ts->flash_dsc.id = 0;
403#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
404 ts->analog_dsc.id = 0;
405#endif
406
407 for (u_address = DESCRIPTION_TABLE_START; u_address > 10;
408 u_address -= sizeof(struct ts_function_descriptor)) {
409 if (unlikely(touch_i2c_read(client, u_address, sizeof(buffer),
410 (unsigned char *)&buffer) < 0)) {
411 TOUCH_ERR_MSG("RMI4 Function Descriptor read fail\n");
412 return -EIO;
413 }
414
415 if (buffer.id == 0)
416 break;
417
418 switch (buffer.id) {
419 case RMI_DEVICE_CONTROL:
420 ts->common_dsc = buffer;
421 break;
422 case TOUCHPAD_SENSORS:
423 ts->finger_dsc = buffer;
424 break;
425 case FLASH_MEMORY_MANAGEMENT:
426 ts->flash_dsc = buffer;
427 }
428 }
429
430#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
431 if (unlikely(touch_i2c_write_byte(client, PAGE_SELECT_REG, 0x01) < 0)) {
432 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
433 return -EIO;
434 }
435
436 u_address = DESCRIPTION_TABLE_START;
437
438 if (unlikely(touch_i2c_read(client, u_address, sizeof(buffer),
439 (unsigned char *)&buffer) < 0)) {
440 TOUCH_ERR_MSG("RMI4 Function Descriptor read fail\n");
441 return -EIO;
442 }
443
444 switch (buffer.id) {
445 case ANALOG_CONTROL:
446 ts->analog_dsc = buffer;
447 break;
448 }
449
450 if (unlikely(touch_i2c_write_byte(client, PAGE_SELECT_REG, 0x02) < 0)) {
451 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
452 return -EIO;
453 }
454
455 u_address -= sizeof(struct ts_function_descriptor);
456
457 if (unlikely(touch_i2c_read(ts->client, u_address, sizeof(buffer),
458 (unsigned char *)&buffer))) {
459 TOUCH_ERR_MSG("Button ts_function_descriptor read fail\n");
460 return -EIO;
461 }
462
463 switch (buffer.id) {
464 case CAPACITIVE_BUTTON_SENSORS:
465 ts->button_dsc = buffer;
466 break;
467 }
468
469 if (unlikely(touch_i2c_write_byte(client, PAGE_SELECT_REG, 0x00) < 0)) {
470 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
471 return -EIO;
472 }
473#endif
474
475 /* set interrupt mask */
476 ts->interrupt_mask.flash = 0x1;
477 ts->interrupt_mask.status = 0x2;
478
479 if (ts->button_dsc.id == 0) {
480 ts->interrupt_mask.abs = 0x4;
481 } else {
482 if (ts->finger_dsc.data_base > ts->button_dsc.data_base) {
483#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
484 ts->interrupt_mask.abs = 0x4;
485 ts->interrupt_mask.button = 0x20;
486#else
487 ts->interrupt_mask.abs = 0x8;
488 ts->interrupt_mask.button = 0x4;
489#endif
490 } else {
491 ts->interrupt_mask.abs = 0x4;
492 ts->interrupt_mask.button = 0x8;
493 }
494 }
495
496 if (ts->common_dsc.id == 0 || ts->finger_dsc.id == 0 ||
497 ts->flash_dsc.id == 0) {
498 TOUCH_ERR_MSG("common_dsc/finger_dsc/flash_dsc are not initiailized\n");
499 return -EPERM;
500 }
501
502 if (touch_debug_mask & DEBUG_BASE_INFO)
503 TOUCH_INFO_MSG("common[%d] finger[%d] flash[%d] button[%d]\n",
504 ts->common_dsc.id, ts->finger_dsc.id,
505 ts->flash_dsc.id, ts->button_dsc.id);
506
507 return 0;
508}
509
510int get_ic_info(struct synaptics_ts_data* ts, struct touch_fw_info* fw_info)
511{
512#if defined(ARRAYED_TOUCH_FW_BIN)
513 int cnt;
514#endif
515 u8 device_status = 0;
516 u8 flash_control = 0;
517
518 read_page_description_table(ts->client);
519
520 memset(fw_info, 0, sizeof(fw_info));
521
522 if (unlikely(touch_i2c_read(ts->client, FW_REVISION_REG,
523 sizeof(fw_info->fw_rev), &fw_info->fw_rev) < 0)) {
524 TOUCH_ERR_MSG("FW_REVISION_REG read fail\n");
525 return -EIO;
526 }
527
528 if (unlikely(touch_i2c_read(ts->client, MANUFACTURER_ID_REG,
529 sizeof(fw_info->manufacturer_id),
530 &fw_info->manufacturer_id) < 0)) {
531 TOUCH_ERR_MSG("MANUFACTURER_ID_REG read fail\n");
532 return -EIO;
533 }
534
535 if (unlikely(touch_i2c_read(ts->client, PRODUCT_ID_REG,
536 sizeof(fw_info->product_id) - 1,
537 fw_info->product_id) < 0)) {
538 TOUCH_ERR_MSG("PRODUCT_ID_REG read fail\n");
539 return -EIO;
540 }
541
542 if (unlikely(touch_i2c_read(ts->client, FW_VERSION,
543 sizeof(fw_info->fw_version) - 1,
544 fw_info->fw_version) < 0)) {
545 TOUCH_ERR_MSG("FW_VERSION read fail\n");
546 return -EIO;
547 }
548
549#if defined(CONFIG_TOUCH_REG_MAP_TM2000)
550 if ((strncmp(fw_info->fw_version, "0000", 4) == 0) ||
551 (strncmp(fw_info->fw_version, "S001", 4) == 0)) {
552 ts->ic_panel_type = IC7020_GFF;
553 TOUCH_INFO_MSG("IC is 7020, panel is GFF.");
554 } else {
555 if (fw_info->fw_version[0] == 'E' &&
556 (int)simple_strtol(&fw_info->fw_version[1], NULL, 10) < 14) {
557 ts->ic_panel_type = IC7020_G2;
558 TOUCH_INFO_MSG("IC is 7020, panel is G2.");
559 } else if ((fw_info->fw_version[0] == 'E'
560 && (int)simple_strtol(&fw_info->fw_version[1], NULL, 10) >= 14
561 && (int)simple_strtol(&fw_info->fw_version[1], NULL, 10) < 27)
562 || fw_info->fw_version[0] == 'T') {
563 ts->ic_panel_type = IC3203_G2;
564 TOUCH_INFO_MSG("IC is 3203, panel is G2.");
565 } else {
566 ts->ic_panel_type = IC7020_G2_H_PTN;
567 TOUCH_INFO_MSG("IC is 7020, H pattern, panel is G2.");
568
569 if ((fw_info->fw_version[0] == 'E')
570 && ((int)simple_strtol(&fw_info->fw_version[1],
571 NULL, 10) >= 40)) {
572 ts->interrupt_mask.button = 0x10;
573 }
574 }
575 }
576#elif defined(CONFIG_TOUCH_REG_MAP_TM2372)
577 ts->ic_panel_type = IC7020_GFF_H_PTN;
578 TOUCH_INFO_MSG("IC is 7020, H pattern, panel is GFF.");
579#endif
580
581#if defined(ARRAYED_TOUCH_FW_BIN)
582 for (cnt = 0; cnt < sizeof(SynaFirmware)/sizeof(SynaFirmware[0]); cnt++) {
583 strncpy(fw_info->fw_image_product_id,
584 &SynaFirmware[cnt][16], 10);
585 if (!(strncmp(fw_info->product_id,
586 fw_info->fw_image_product_id, 10)))
587 break;
588 }
589 fw_info->fw_start = (unsigned char *)&SynaFirmware[cnt][0];
590 fw_info->fw_size = sizeof(SynaFirmware[0]);
591#else
592 strncpy(fw_info->fw_image_product_id, &SynaFirmware[16], 10);
593#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
594 strncpy(fw_info->fw_image_version, &SynaFirmware[0xb100],4);
595#endif
596 fw_info->fw_start = (unsigned char *)&SynaFirmware[0];
597 fw_info->fw_size = sizeof(SynaFirmware);
598#endif
599
600 fw_info->fw_image_rev = fw_info->fw_start[31];
601
602 if (unlikely(touch_i2c_read(ts->client, FLASH_CONTROL_REG,
603 sizeof(flash_control), &flash_control) < 0)) {
604 TOUCH_ERR_MSG("FLASH_CONTROL_REG read fail\n");
605 return -EIO;
606 }
607
608 if (unlikely(touch_i2c_read(ts->client, DEVICE_STATUS_REG,
609 sizeof(device_status), &device_status) < 0)) {
610 TOUCH_ERR_MSG("DEVICE_STATUS_REG read fail\n");
611 return -EIO;
612 }
613
614 /* Firmware has a problem, so we should firmware-upgrade */
615 if (device_status & DEVICE_STATUS_FLASH_PROG
616 || (device_status & DEVICE_CRC_ERROR_MASK) != 0
617 || (flash_control & FLASH_STATUS_MASK) != 0) {
618 TOUCH_ERR_MSG("Firmware has a unknown-problem, "
619 "so it needs firmware-upgrade.\n");
620 TOUCH_ERR_MSG("FLASH_CONTROL[%x] DEVICE_STATUS_REG[%x]\n",
621 (u32)flash_control, (u32)device_status);
622
623 fw_info->fw_rev = 0;
624#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
625 fw_info->fw_force_rework = true;
626#endif
627 }
628
629 ts->fw_info = fw_info;
630
631 return 0;
632}
633
634int synaptics_ts_init(struct i2c_client* client, struct touch_fw_info* fw_info)
635{
636 struct synaptics_ts_data* ts =
637 (struct synaptics_ts_data*)get_touch_handle(client);
Jongrak Kwon9ed2a932012-06-19 23:38:02 -0700638 struct lge_touch_data *lg_ts =
639 (struct lge_touch_data *) i2c_get_clientdata(client);
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700640 u8 buf;
641
642 if (touch_debug_mask & DEBUG_TRACE)
643 TOUCH_DEBUG_MSG("\n");
644
645 if (!ts->is_probed)
646 if (unlikely(get_ic_info(ts, fw_info) < 0))
647 return -EIO;
648
649 if (unlikely(touch_i2c_write_byte(client, DEVICE_CONTROL_REG,
650 DEVICE_CONTROL_NOSLEEP | DEVICE_CONTROL_CONFIGURED) < 0)) {
651 TOUCH_ERR_MSG("DEVICE_CONTROL_REG write fail\n");
652 return -EIO;
653 }
654
655 if (unlikely(touch_i2c_read(client, INTERRUPT_ENABLE_REG,
656 1, &buf) < 0)) {
657 TOUCH_ERR_MSG("INTERRUPT_ENABLE_REG read fail\n");
658 return -EIO;
659 }
Jongrak Kwon9ed2a932012-06-19 23:38:02 -0700660
661 if (!lg_ts->pdata->caps->button_support) {
662 buf &= ~ts->interrupt_mask.button;
663 ts->interrupt_mask.button = 0;
664 }
665
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700666 if (unlikely(touch_i2c_write_byte(client, INTERRUPT_ENABLE_REG,
667 buf | ts->interrupt_mask.abs | ts->interrupt_mask.button) < 0)) {
668 TOUCH_ERR_MSG("INTERRUPT_ENABLE_REG write fail\n");
669 return -EIO;
670 }
671
672#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
673 /* do nothing */
Jongrak Kwon9ed2a932012-06-19 23:38:02 -0700674
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700675#else
676 if (unlikely(touch_i2c_write_byte(client,
677 GESTURE_ENABLE_1_REG, 0x00) < 0)) {
678 TOUCH_ERR_MSG("GESTURE_ENABLE_1_REG write fail\n");
679 return -EIO;
680 }
681 if (unlikely(touch_i2c_write_byte(client, GESTURE_ENABLE_2_REG, 0x00) < 0)) {
682 TOUCH_ERR_MSG("GESTURE_ENABLE_2_REG write fail\n");
683 return -EIO;
684 }
685
686 if (ts->pdata->role->report_mode == CONTINUOUS_REPORT_MODE) {
687 if (unlikely(touch_i2c_write_byte(client, TWO_D_REPORTING_MODE,
688 REPORT_MODE_CONTINUOUS) < 0)) {
689 TOUCH_ERR_MSG("TWO_D_REPORTING_MODE write fail\n");
690 return -EIO;
691 }
692 } else { /* REDUCED_REPORT_MODE */
693 if (unlikely(touch_i2c_write_byte(client, TWO_D_REPORTING_MODE,
694 REPORT_MODE_REDUCED) < 0)) {
695 TOUCH_ERR_MSG("TWO_D_REPORTING_MODE write fail\n");
696 return -EIO;
697 }
698
699 if (unlikely(touch_i2c_write_byte(client, DELTA_X_THRESH_REG,
700 ts->pdata->role->delta_pos_threshold) < 0)) {
701 TOUCH_ERR_MSG("DELTA_X_THRESH_REG write fail\n");
702 return -EIO;
703 }
704 if (unlikely(touch_i2c_write_byte(client, DELTA_Y_THRESH_REG,
705 ts->pdata->role->delta_pos_threshold) < 0)) {
706 TOUCH_ERR_MSG("DELTA_Y_THRESH_REG write fail\n");
707 return -EIO;
708 }
709 }
710#endif
711
712 if (unlikely(touch_i2c_read(client, INTERRUPT_STATUS_REG, 1, &buf) < 0)) {
713 TOUCH_ERR_MSG("INTERRUPT_STATUS_REG read fail\n");
714 return -EIO; /* it is critical problem because interrupt will not occur. */
715 }
716
717 if (unlikely(touch_i2c_read(client, FINGER_STATE_REG,
718 sizeof(ts->ts_data.finger.finger_status_reg),
719 ts->ts_data.finger.finger_status_reg) < 0)) {
720 TOUCH_ERR_MSG("FINGER_STATE_REG read fail\n");
721 /* it is critical problem because interrupt will not occur on some FW. */
722 return -EIO;
723 }
724
725 ts->is_probed = 1;
726
727 return 0;
728}
729
730int synaptics_ts_power(struct i2c_client* client, int power_ctrl)
731{
732 struct synaptics_ts_data* ts =
733 (struct synaptics_ts_data*)get_touch_handle(client);
734
735 if (touch_debug_mask & DEBUG_TRACE)
736 TOUCH_DEBUG_MSG("\n");
737
738 switch (power_ctrl) {
739 case POWER_OFF:
740 if (ts->pdata->pwr->use_regulator) {
741 regulator_disable(ts->regulator_vio);
742 regulator_disable(ts->regulator_vdd);
743 }
744 else
745 ts->pdata->pwr->power(0);
746
747 break;
748 case POWER_ON:
749 if (ts->pdata->pwr->use_regulator) {
750 regulator_enable(ts->regulator_vdd);
751 regulator_enable(ts->regulator_vio);
752 }
753 else
754 ts->pdata->pwr->power(1);
755
756 /* P2 H/W bug fix */
757 if (ts->pdata->reset_pin > 0) {
758 msleep(10);
759 gpio_set_value(ts->pdata->reset_pin, 0);
760 msleep(ts->pdata->role->reset_delay);
761 gpio_set_value(ts->pdata->reset_pin, 1);
762 }
763 break;
764 case POWER_SLEEP:
765 if (unlikely(touch_i2c_write_byte(client, DEVICE_CONTROL_REG,
766 DEVICE_CONTROL_SLEEP |
767 DEVICE_CONTROL_CONFIGURED) < 0)) {
768 TOUCH_ERR_MSG("DEVICE_CONTROL_REG write fail\n");
769 return -EIO;
770 }
771 break;
772 case POWER_WAKE:
773 if (unlikely(touch_i2c_write_byte(client, DEVICE_CONTROL_REG,
774 DEVICE_CONTROL_SPECIFIC |
775 DEVICE_CONTROL_CONFIGURED) < 0)) {
776 TOUCH_ERR_MSG("DEVICE_CONTROL_REG write fail\n");
777 return -EIO;
778 }
779 break;
780 default:
781 return -EIO;
782 break;
783 }
784
785 return 0;
786}
787
788int synaptics_ts_probe(struct i2c_client* client)
789{
790 struct synaptics_ts_data* ts;
791 int ret = 0;
792
793 if (touch_debug_mask & DEBUG_TRACE)
794 TOUCH_DEBUG_MSG("\n");
795
796 ts = kzalloc(sizeof(struct synaptics_ts_data), GFP_KERNEL);
797 if (!ts) {
798 TOUCH_ERR_MSG("Can not allocate memory\n");
799 ret = -ENOMEM;
800 goto err_alloc_data_failed;
801 }
802
803 set_touch_handle(client, ts);
804
805 ts->client = client;
806 ts->pdata = client->dev.platform_data;
807#if defined(CONFIG_TOUCH_REG_MAP_TM2000)
808 ts->ic_panel_type = IC7020_G2_H_PTN;
809#elif defined(CONFIG_TOUCH_REG_MAP_TM2372)
810 ts->ic_panel_type = IC7020_GFF_H_PTN;
811#endif
812
813 if (ts->pdata->pwr->use_regulator) {
814 ts->regulator_vdd =
815 regulator_get_exclusive(NULL, ts->pdata->pwr->vdd);
816 if (IS_ERR(ts->regulator_vdd)) {
817 TOUCH_ERR_MSG("FAIL: regulator_get_vdd - %s\n",
818 ts->pdata->pwr->vdd);
819 ret = -EPERM;
820 goto err_get_vdd_failed;
821 }
822
823 ts->regulator_vio = regulator_get_exclusive(NULL,
824 ts->pdata->pwr->vio);
825 if (IS_ERR(ts->regulator_vio)) {
826 TOUCH_ERR_MSG("FAIL: regulator_get_vio - %s\n",
827 ts->pdata->pwr->vio);
828 ret = -EPERM;
829 goto err_get_vio_failed;
830 }
831
832 if (ts->pdata->pwr->vdd_voltage > 0) {
833 ret = regulator_set_voltage(ts->regulator_vdd,
834 ts->pdata->pwr->vdd_voltage,
835 ts->pdata->pwr->vdd_voltage);
836 if (ret < 0)
837 TOUCH_ERR_MSG("FAIL: VDD voltage setting"
838 " - (%duV)\n",
839 ts->pdata->pwr->vdd_voltage);
840 }
841
842 if (ts->pdata->pwr->vio_voltage > 0) {
843 ret = regulator_set_voltage(ts->regulator_vio,
844 ts->pdata->pwr->vio_voltage,
845 ts->pdata->pwr->vio_voltage);
846 if (ret < 0)
847 TOUCH_ERR_MSG("FAIL: VIO voltage setting"
848 " - (%duV)\n",
849 ts->pdata->pwr->vio_voltage);
850 }
851 }
852
853 return ret;
854
855err_get_vio_failed:
856 if (ts->pdata->pwr->use_regulator) {
857 regulator_put(ts->regulator_vdd);
858 }
859err_get_vdd_failed:
860err_alloc_data_failed:
861 kfree(ts);
862 return ret;
863}
864
865void synaptics_ts_remove(struct i2c_client* client)
866{
867 struct synaptics_ts_data* ts =
868 (struct synaptics_ts_data*)get_touch_handle(client);
869
870 if (touch_debug_mask & DEBUG_TRACE)
871 TOUCH_DEBUG_MSG("\n");
872
873 if (ts->pdata->pwr->use_regulator) {
874 regulator_put(ts->regulator_vio);
875 regulator_put(ts->regulator_vdd);
876 }
877
878 kfree(ts);
879}
880
881int synaptics_ts_fw_upgrade(struct i2c_client* client, const char* fw_path)
882{
883 struct synaptics_ts_data* ts =
884 (struct synaptics_ts_data*)get_touch_handle(client);
885 int ret = 0;
886
887 ts->is_probed = 0;
888
889 ret = FirmwareUpgrade(ts, fw_path);
890
891 /* update IC info */
892 get_ic_info(ts, ts->fw_info);
893
894 return ret;
895}
896
897int synaptics_ts_ic_ctrl(struct i2c_client *client, u8 code, u16 value)
898{
899 struct synaptics_ts_data* ts =
900 (struct synaptics_ts_data*)get_touch_handle(client);
901 u8 buf = 0;
902
903 switch (code) {
904 case IC_CTRL_BASELINE:
905 switch (value) {
906 case BASELINE_OPEN:
907#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
908 if (unlikely(touch_i2c_write_byte(client,
909 PAGE_SELECT_REG, 0x01) < 0)) {
910 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
911 return -EIO;
912 }
913
914 if (unlikely(touch_i2c_write_byte(client,
915 ANALOG_CONTROL_REG,
916 FORCE_FAST_RELAXATION) < 0)) {
917 TOUCH_ERR_MSG("ANALOG_CONTROL_REG write fail\n");
918 return -EIO;
919 }
920
921 msleep(10);
922
923 if (unlikely(touch_i2c_write_byte(client,
924 ANALOG_COMMAND_REG,
925 FORCE_UPDATE) < 0)) {
926 TOUCH_ERR_MSG("force fast relaxation command write fail\n");
927 return -EIO;
928 }
929
930 if (unlikely(touch_i2c_write_byte(client,
931 PAGE_SELECT_REG, 0x00) < 0)) {
932 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
933 return -EIO;
934 }
935
936 if (unlikely(touch_debug_mask & DEBUG_GHOST))
937 TOUCH_INFO_MSG("BASELINE_OPEN ~~~~~~~~\n");
938#else
939 if (unlikely(touch_i2c_write_byte(client,
940 MELT_CONTROL_REG,
941 MELT_CONTROL_MELT) < 0)) {
942 TOUCH_ERR_MSG("MELT_CONTROL_REG write fail\n");
943 return -EIO;
944 }
945#endif
946 break;
947 case BASELINE_FIX:
948#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
949 if (unlikely(touch_i2c_write_byte(client,
950 PAGE_SELECT_REG, 0x01) < 0)) {
951 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
952 return -EIO;
953 }
954
955 if (unlikely(touch_i2c_write_byte(client,
956 ANALOG_CONTROL_REG, 0x0) < 0)) {
957 TOUCH_ERR_MSG("ANALOG_CONTROL_REG write fail\n");
958 return -EIO;
959 }
960
961 msleep(10);
962
963 if (unlikely(touch_i2c_write_byte(client,
964 ANALOG_COMMAND_REG,
965 FORCE_UPDATE) < 0)) {
966 TOUCH_ERR_MSG("force fast relaxation command write fail\n");
967 return -EIO;
968 }
969
970 if (unlikely(touch_i2c_write_byte(client,
971 PAGE_SELECT_REG, 0x00) < 0)) {
972 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
973 return -EIO;
974 }
975
976 if (unlikely(touch_debug_mask & DEBUG_GHOST))
977 TOUCH_INFO_MSG("BASELINE_FIX ~~~~~~~~\n");
978#else
979 if (unlikely(touch_i2c_write_byte(client,
980 MELT_CONTROL_REG,
981 MELT_CONTROL_NO_MELT) < 0)) {
982 TOUCH_ERR_MSG("MELT_CONTROL_REG write fail\n");
983 return -EIO;
984 }
985#endif
986 break;
987 case BASELINE_REBASE:
988 /* rebase base line */
989 if (likely(ts->finger_dsc.id != 0)) {
990 if (unlikely(touch_i2c_write_byte(client,
991 FINGER_COMMAND_REG, 0x1) < 0)) {
992 TOUCH_ERR_MSG("finger baseline reset "
993 "command write fail\n");
994 return -EIO;
995 }
996 }
997
998#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
999/* do nothing */
1000#else
1001 if (unlikely(ts->button_dsc.id != 0)) {
1002 if (unlikely(touch_i2c_write_byte(client,
1003 BUTTON_COMMAND_REG, 0x1) < 0)) {
1004 TOUCH_ERR_MSG("finger baseline reset "
1005 "command write fail\n");
1006 return -EIO;
1007 }
1008 }
1009#endif
1010 break;
1011 default:
1012 break;
1013 }
1014 break;
1015 case IC_CTRL_READ:
Jongrak Kwon9ed2a932012-06-19 23:38:02 -07001016#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
1017 if (unlikely(touch_i2c_write_byte(client,
1018 PAGE_SELECT_REG, ((value & 0xFF00) >> 8)) < 0)) {
1019 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
1020 return -EIO;
1021 }
1022
1023 if (touch_i2c_read(client, (value & 0xFF), 1, &buf) < 0) {
1024 TOUCH_ERR_MSG("IC register read fail\n");
1025 return -EIO;
1026 }
1027
1028 if (unlikely(touch_i2c_write_byte(client,
1029 PAGE_SELECT_REG, 0x00) < 0)) {
1030 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
1031 return -EIO;
1032 }
1033#else
Jongrak Kwonae680ab2012-06-15 22:06:54 -07001034 if (touch_i2c_read(client, value, 1, &buf) < 0) {
1035 TOUCH_ERR_MSG("IC register read fail\n");
1036 return -EIO;
1037 }
Jongrak Kwon9ed2a932012-06-19 23:38:02 -07001038#endif
Jongrak Kwonae680ab2012-06-15 22:06:54 -07001039 break;
1040 case IC_CTRL_WRITE:
Jongrak Kwon9ed2a932012-06-19 23:38:02 -07001041#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
1042 if (unlikely(touch_i2c_write_byte(client,
1043 PAGE_SELECT_REG, ((value & 0xFF0000) >> 16)) < 0)) {
1044 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
1045 return -EIO;
1046 }
1047
Jongrak Kwonae680ab2012-06-15 22:06:54 -07001048 if (touch_i2c_write_byte(client,
1049 ((value & 0xFF00) >> 8), (value & 0xFF)) < 0) {
1050 TOUCH_ERR_MSG("IC register write fail\n");
1051 return -EIO;
1052 }
Jongrak Kwon9ed2a932012-06-19 23:38:02 -07001053
1054 if (unlikely(touch_i2c_write_byte(client,
1055 PAGE_SELECT_REG, 0x00) < 0)) {
1056 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
1057 return -EIO;
1058 }
1059#else
1060 if (touch_i2c_write_byte(client,
1061 ((value & 0xFF00) >> 8), (value & 0xFF)) < 0) {
1062 TOUCH_ERR_MSG("IC register write fail\n");
1063 return -EIO;
1064 }
1065#endif
Jongrak Kwonae680ab2012-06-15 22:06:54 -07001066 break;
1067 case IC_CTRL_RESET_CMD:
1068 if (unlikely(touch_i2c_write_byte(client,
1069 DEVICE_COMMAND_REG, 0x1) < 0)) {
1070 TOUCH_ERR_MSG("IC Reset command write fail\n");
1071 return -EIO;
1072 }
1073 break;
1074 default:
1075 break;
1076 }
1077
1078 return buf;
1079}
1080
1081int synaptics_ts_fw_upgrade_check(struct lge_touch_data *ts)
1082{
1083#if defined(CONFIG_TOUCH_REG_MAP_TM2000)
1084 if (ts->fw_info.fw_force_rework) {
1085 TOUCH_INFO_MSG("FW-upgrade Force Rework.\n");
1086 } else {
1087 /* do not update 7020 gff, 7020 g2, 3203 g2 */
1088 if (((ts->fw_info.fw_version[0] == '0' &&
1089 (int)simple_strtoul(&ts->fw_info.fw_version[1], NULL, 10) == 0) ||
1090 (ts->fw_info.fw_version[0] == 'S' &&
1091 (int)simple_strtoul(&ts->fw_info.fw_version[1], NULL, 10) == 1) ||
1092 (ts->fw_info.fw_version[0] == 'E' &&
1093 (int)simple_strtoul(&ts->fw_info.fw_version[1], NULL, 10) < 27) ||
1094 (ts->fw_info.fw_version[0] == 'T'))) {
1095 TOUCH_INFO_MSG("DO NOT UPDATE 7020 gff, 7020 g2, 3203 " "g2 FW-upgrade is not executed\n");
1096 return -1;
1097 }
1098
1099 if ((ts->fw_info.fw_version[0] == 'E' &&
1100 (int)simple_strtoul(&ts->fw_info.fw_version[1], NULL, 10) >= 27) && !ts->fw_upgrade.fw_force_upgrade) { /* 7020 g2 h pattern */
1101
1102 if (((int)simple_strtoul(&ts->fw_info.fw_version[1], NULL, 10) >= (int)simple_strtoul(&ts->fw_info.fw_image_version[1], NULL, 10))) {
1103 TOUCH_INFO_MSG("DO NOT UPDATE 7020 G2 H " "pattern FW-upgrade is not executed\n");
1104 return -1;
1105 } else {
1106 TOUCH_INFO_MSG("7020 G2 H pattern FW-upgrade " "is executed\n");
1107 }
1108 } else {
1109 if (!ts->fw_upgrade.fw_force_upgrade) {
1110 TOUCH_INFO_MSG("UNKNOWN PANEL. FW-upgrade is" " not executed\n");
1111 return -1;
1112 }
1113 }
1114 }
1115#elif defined(CONFIG_TOUCH_REG_MAP_TM2372)
1116 if (ts->fw_info.fw_force_rework) {
1117 TOUCH_INFO_MSG("FW-upgrade Force Rework.\n");
1118 } else {
1119 if ((ts->fw_info.fw_version[0] == 'E' &&
1120 (int)simple_strtoul(&ts->fw_info.fw_version[1], NULL, 10) >= 1) &&
1121 !ts->fw_upgrade.fw_force_upgrade) {
1122
1123 if (((int)simple_strtoul(&ts->fw_info.fw_version[1], NULL, 10) >=
1124 (int)simple_strtoul(&ts->fw_info.fw_image_version[1],
1125 NULL, 10))) {
1126 TOUCH_INFO_MSG("DO NOT UPDATE 7020 GFF H " "pattern FW-upgrade is not executed\n");
1127 return -1;
1128 } else {
1129 TOUCH_INFO_MSG("7020 GFF H pattern FW-upgrade " "is executed\n");
1130 }
1131 } else {
1132 if (!ts->fw_upgrade.fw_force_upgrade) {
1133 TOUCH_INFO_MSG("UNKNOWN PANEL. FW-upgrade is not executed\n");
1134 return -1;
1135 }
1136 }
1137 }
1138#else
Jongrak Kwon9ed2a932012-06-19 23:38:02 -07001139#error NOT SUPPORTED TYPE
Jongrak Kwonae680ab2012-06-15 22:06:54 -07001140#endif
1141
1142 return 0;
1143}
1144
1145struct touch_device_driver synaptics_ts_driver = {
1146 .probe = synaptics_ts_probe,
1147 .remove = synaptics_ts_remove,
1148 .init = synaptics_ts_init,
1149 .data = synaptics_ts_get_data,
1150 .power = synaptics_ts_power,
1151 .fw_upgrade = synaptics_ts_fw_upgrade,
1152 .ic_ctrl = synaptics_ts_ic_ctrl,
1153 .fw_upgrade_check = synaptics_ts_fw_upgrade_check,
1154};
1155
1156static int __devinit touch_init(void)
1157{
1158 if (touch_debug_mask & DEBUG_TRACE)
1159 TOUCH_DEBUG_MSG("\n");
1160
1161 return touch_driver_register(&synaptics_ts_driver);
1162}
1163
1164static void __exit touch_exit(void)
1165{
1166 if (touch_debug_mask & DEBUG_TRACE)
1167 TOUCH_DEBUG_MSG("\n");
1168
1169 touch_driver_unregister();
1170}
1171
1172module_init(touch_init);
1173module_exit(touch_exit);
1174
1175MODULE_AUTHOR("yehan.ahn@lge.com, hyesung.shin@lge.com");
1176MODULE_DESCRIPTION("LGE Touch Driver");
1177MODULE_LICENSE("GPL");
1178