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