blob: 96d8701d71dd978165426fa72f8c0a4788229844 [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>
Jongrak Kwonb5e69d82012-06-29 18:03:36 -070027#include <linux/input/mt.h>
Jongrak Kwonae680ab2012-06-15 22:06:54 -070028#include <linux/input/lge_touch_core.h>
29#include <linux/input/touch_synaptics.h>
30
Jongrak Kwonae680ab2012-06-15 22:06:54 -070031#include "SynaImage.h"
Jongrak Kwonae680ab2012-06-15 22:06:54 -070032#include <linux/regulator/machine.h>
33
34/* RMI4 spec from (RMI4 spec)511-000136-01_revD
35 * Function Purpose See page
36 * $01 RMI Device Control 29
37 * $08 BIST(Built-in Self Test) 38
38 * $09 BIST(Built-in Self Test) 42
39 * $11 2-D TouchPad sensors 46
40 * $19 0-D capacitive button sensors 69
41 * $30 GPIO/LEDs (includes mechanical buttons) 76
42 * $32 Timer 89
43 * $34 Flash Memory Management 93
44 */
45#define RMI_DEVICE_CONTROL 0x01
46#define TOUCHPAD_SENSORS 0x11
47#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
48#define CAPACITIVE_BUTTON_SENSORS 0x1A
49#define GPIO_LEDS 0x31
50#define ANALOG_CONTROL 0x54
51#else
52#define CAPACITIVE_BUTTON_SENSORS 0x19
53#define GPIO_LEDS 0x30
54#endif
55#define TIMER 0x32
56#define FLASH_MEMORY_MANAGEMENT 0x34
57
58/* Register Map & Register bit mask
59 * - Please check "One time" this map before using this device driver
60 */
61
62#define MANUFACTURER_ID_REG (ts->common_dsc.query_base) /* Manufacturer ID */
63#define FW_REVISION_REG (ts->common_dsc.query_base+3) /* FW revision */
64#define PRODUCT_ID_REG (ts->common_dsc.query_base+11) /* Product ID */
65#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
66#define FW_VERSION (ts->flash_dsc.control_base)
67#endif
68
69#define DEVICE_CONTROL_REG (ts->common_dsc.control_base) /* Device Control */
70#define DEVICE_CONTROL_NORMAL_OP 0x00 /* sleep mode : go to doze mode after 500 ms */
71#define DEVICE_CONTROL_SLEEP 0x01 /* sleep mode : go to sleep */
72#define DEVICE_CONTROL_SPECIFIC 0x02 /* sleep mode : go to doze mode after 5 sec */
73#define DEVICE_CONTROL_NOSLEEP 0x04
74#define DEVICE_CONTROL_CONFIGURED 0x80
75
76#define INTERRUPT_ENABLE_REG (ts->common_dsc.control_base+1) /* Interrupt Enable 0 */
77
78#define DEVICE_STATUS_REG (ts->common_dsc.data_base) /* Device Status */
79#define DEVICE_FAILURE_MASK 0x03
80#define DEVICE_CRC_ERROR_MASK 0x04
81#define DEVICE_STATUS_FLASH_PROG 0x40
82#define DEVICE_STATUS_UNCONFIGURED 0x80
83
84#define INTERRUPT_STATUS_REG (ts->common_dsc.data_base+1) /* Interrupt Status */
85#define BUTTON_DATA_REG (ts->button_dsc.data_base) /* Button Data */
86#define MAX_NUM_OF_BUTTON 4
87
88#define FINGER_STATE_REG (ts->finger_dsc.data_base) /* Finger State */
89#define FINGER_DATA_REG_START (ts->finger_dsc.data_base+3) /* Finger Data Register */
90#define FINGER_STATE_MASK 0x03
91#define REG_X_POSITION 0
92#define REG_Y_POSITION 1
93#define REG_YX_POSITION 2
94#define REG_WY_WX 3
95#define REG_Z 4
96
97#define TWO_D_REPORTING_MODE (ts->finger_dsc.control_base+0) /* 2D Reporting Mode */
98#define REPORT_MODE_CONTINUOUS 0x00
99#define REPORT_MODE_REDUCED 0x01
100#define ABS_FILTER 0x08
101#define PALM_DETECT_REG (ts->finger_dsc.control_base+1) /* Palm Detect */
Jongrak Kwon9ed2a932012-06-19 23:38:02 -0700102#define DELTA_X_THRESH_REG (ts->finger_dsc.control_base+2) /* Delta-X Thresh */
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700103#define DELTA_Y_THRESH_REG (ts->finger_dsc.control_base+3) /* Delta-Y Thresh */
104#define SENSOR_MAX_X_POS (ts->finger_dsc.control_base+6) /* SensorMaxXPos */
105#define SENSOR_MAX_Y_POS (ts->finger_dsc.control_base+8) /* SensorMaxYPos */
106#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
107/*do nothing*/
108#else
109#define GESTURE_ENABLE_1_REG (ts->finger_dsc.control_base+10) /* Gesture Enables 1 */
110#define GESTURE_ENABLE_2_REG (ts->finger_dsc.control_base+11) /* Gesture Enables 2 */
111#endif
112
113#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
114#define PAGE_SELECT_REG 0xFF /* Button exists Page 02 */
115#define ANALOG_CONTROL_REG (ts->analog_dsc.control_base)
116#define ANALOG_COMMAND_REG (ts->analog_dsc.command_base)
117#define FAST_RELAXATION_RATE (ts->analog_dsc.control_base+16)
118#define FORCE_FAST_RELAXATION 0x04
119#define FORCE_UPDATE 0x04
120#else
121#define MELT_CONTROL_REG 0xF0
122#define MELT_CONTROL_NO_MELT 0x00
123#define MELT_CONTROL_MELT 0x01
124#define MELT_CONTROL_NUKE_MELT 0x80
125#endif
126
127#define DEVICE_COMMAND_REG (ts->common_dsc.command_base)
128#define FINGER_COMMAND_REG (ts->finger_dsc.command_base)
129#define BUTTON_COMMAND_REG (ts->button_dsc.command_base)
130
131#define FLASH_CONTROL_REG (ts->flash_dsc.data_base+18) /* Flash Control */
132#define FLASH_STATUS_MASK 0xF0
133
134/* Get user-finger-data from register.
135 */
136#define TS_SNTS_GET_X_POSITION(_high_reg, _low_reg) \
137 (((u16)(((_high_reg) << 4) & 0x0FF0) | (u16)((_low_reg) & 0x0F)))
138#define TS_SNTS_GET_Y_POSITION(_high_reg, _low_reg) \
139 (((u16)(((_high_reg) << 4) & 0x0FF0) | (u16)(((_low_reg) >> 4) & 0x0F)))
140#define TS_SNTS_GET_WIDTH_MAJOR(_width) \
141 ((((((_width) & 0xF0) >> 4) - ((_width) & 0x0F)) > 0) ? \
142 ((_width) & 0xF0) >> 4 : (_width) & 0x0F)
143#define TS_SNTS_GET_WIDTH_MINOR(_width) \
144 ((((((_width) & 0xF0) >> 4) - ((_width) & 0x0F)) > 0) ? \
145 (_width) & 0x0F : ((_width) & 0xF0) >> 4)
146#define TS_SNTS_GET_ORIENTATION(_width) \
147 ((((((_width) & 0xF0) >> 4) - ((_width) & 0x0F)) > 0) ? 0 : 1)
148#define TS_SNTS_GET_PRESSURE(_pressure) (_pressure)
149
150
151/* GET_BIT_MASK & GET_INDEX_FROM_MASK
152 *
153 * For easily checking the user input.
154 * Usually, User use only one or two fingers.
155 * However, we should always check all finger-status-register
156 * because we can't know the total number of fingers.
157 * These Macro will prevent it.
158 */
159#define GET_BIT_MASK(_finger_status_reg) \
160 ((_finger_status_reg[2] & 0x04) << 7 | \
161 (_finger_status_reg[2] & 0x01) << 8 | \
162 (_finger_status_reg[1] & 0x40) << 1 | \
163 (_finger_status_reg[1] & 0x10) << 2 | \
164 (_finger_status_reg[1] & 0x04) << 3 | \
165 (_finger_status_reg[1] & 0x01) << 4 | \
166 (_finger_status_reg[0] & 0x40) >> 3 | \
167 (_finger_status_reg[0] & 0x10) >> 2 | \
168 (_finger_status_reg[0] & 0x04) >> 1 | \
169 (_finger_status_reg[0] & 0x01))
170
171#define GET_INDEX_FROM_MASK(_index, _bit_mask, _max_finger) \
172 do { \
173 for (; !((_bit_mask>>_index)&0x01) \
174 && _index <= _max_finger; _index++); \
175 if (_index <= _max_finger) \
176 _bit_mask &= ~(_bit_mask & (1<<(_index))); \
177 } while (0)
178
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700179
180#define FINGER_STATE_NO_PRESENT 0
181#define FINGER_STATE_PRESENT_VALID 1
182#define FINGER_STATE_PRESENT_NOVALID 2
183#define FINGER_STATE_REVSERVED 3
184
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700185int 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
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700191 u32 finger_status=0;
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700192 u8 finger_index=0;
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700193 u8 id=0;
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700194 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,
Jongrak Kwon5297b722012-06-22 11:18:36 -0700200 sizeof(ts->ts_data.device_status_reg),
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700201 &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
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700253 finger_status = ts->ts_data.finger.finger_status_reg[0] |
254 ts->ts_data.finger.finger_status_reg[1] << 8 |
255 (ts->ts_data.finger.finger_status_reg[2] & 0xF) << 16;
256
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700257 if (unlikely(touch_debug_mask & DEBUG_GET_DATA)) {
258 TOUCH_INFO_MSG("Finger_status : 0x%x, 0x%x, 0x%x\n",
259 ts->ts_data.finger.finger_status_reg[0],
260 ts->ts_data.finger.finger_status_reg[1],
261 ts->ts_data.finger.finger_status_reg[2]);
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700262 TOUCH_INFO_MSG("Touch_bit_mask: 0x%x\n", finger_status);
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700263 }
264
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700265 for (id = 0; id < MAX_FINGER; id++) {
266 switch (((finger_status >> (id*2)) & 0x3)) {
267 case FINGER_STATE_PRESENT_VALID:
268 touch_i2c_read(ts->client,
269 FINGER_DATA_REG_START + NUM_OF_EACH_FINGER_DATA_REG * id,
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700270 NUM_OF_EACH_FINGER_DATA_REG,
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700271 ts->ts_data.finger.finger_reg[id]);
272 data[id].state = ABS_PRESS;
273 data[id].x_position = TS_SNTS_GET_X_POSITION(
274 ts->ts_data.finger.finger_reg[id][REG_X_POSITION],
275 ts->ts_data.finger.finger_reg[id][REG_YX_POSITION]);
276 data[id].y_position = TS_SNTS_GET_Y_POSITION(ts->ts_data.finger.finger_reg[id][REG_Y_POSITION], ts->ts_data.finger.finger_reg[id][REG_YX_POSITION]);
277 data[id].width_major = TS_SNTS_GET_WIDTH_MAJOR(ts->ts_data.finger.finger_reg[id][REG_WY_WX]);
278 data[id].width_minor = TS_SNTS_GET_WIDTH_MINOR(ts->ts_data.finger.finger_reg[id][REG_WY_WX]);
Jongrak Kwonb5e69d82012-06-29 18:03:36 -0700279 data[id].tool_type = (data[id].width_major == 0 && data[id].width_minor == 0) ? MT_TOOL_PEN : MT_TOOL_FINGER;
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700280 data[id].width_orientation = TS_SNTS_GET_ORIENTATION(ts->ts_data.finger.finger_reg[id][REG_WY_WX]);
281 data[id].pressure = TS_SNTS_GET_PRESSURE(ts->ts_data.finger.finger_reg[id][REG_Z]);
282
283 if (unlikely(touch_debug_mask & DEBUG_GET_DATA))
284 TOUCH_INFO_MSG("[%d] pos(%4d,%4d) w_m[%2d] w_n[%2d] w_o[%2d] p[%2d]\n",
285 finger_index,
286 data[id].x_position,
287 data[id].y_position,
288 data[id].width_major,
289 data[id].width_minor,
290 data[id].width_orientation,
291 data[id].pressure);
292 (*total_num)++;
293 break;
294
295 case FINGER_STATE_NO_PRESENT:
296 if (data[id].state == ABS_PRESS)
297 data[id].state = ABS_RELEASE;
298 break;
299
300 default:
301 /* Do nothing including inacurate data */
302 break;
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700303 }
304
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700305 }
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
310 /* Button */
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700311 if ((ts->button_dsc.id != 0) && (ts->ts_data.interrupt_status_reg &
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700312 ts->interrupt_mask.button)) {
313
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700314 if (unlikely(touch_i2c_write_byte(client,
315 PAGE_SELECT_REG, 0x02) < 0)) {
316 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
317 return -EIO;
318 }
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700319
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700320 if (unlikely(touch_i2c_read(client, BUTTON_DATA_REG,
321 sizeof(ts->ts_data.button_data_reg),
322 &ts->ts_data.button_data_reg) < 0)) {
323 TOUCH_ERR_MSG("BUTTON_DATA_REG read fail\n");
324 goto err_synaptics_getdata;
325 }
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700326
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700327 if (unlikely(touch_i2c_write_byte(client,
328 PAGE_SELECT_REG, 0x00) < 0)) {
329 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
330 return -EIO;
331 }
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700332
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700333 if (unlikely(touch_debug_mask & DEBUG_BUTTON))
334 TOUCH_DEBUG_MSG("Button register: 0x%x\n",
335 ts->ts_data.button_data_reg);
336
337 if (ts->ts_data.button_data_reg) {
338 /* pressed - find first one */
339 for (cnt = 0; cnt < ts->pdata->caps->number_of_button; cnt++) {
340 if ((ts->ts_data.button_data_reg >> cnt) & 1)
341 {
342 ts->ts_data.button.key_code =
343 ts->pdata->caps->button_name[cnt];
344 button->key_code =
345 ts->ts_data.button.key_code;
346 button->state = 1;
347 break;
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700348 }
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700349 }
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700350 } else {
351 /* release */
352 button->key_code = ts->ts_data.button.key_code;
353 button->state = 0;
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700354 }
355 }
356
357 return 0;
358
359err_synaptics_device_damage:
360err_synaptics_getdata:
361 return -EIO;
362}
363
364static int read_page_description_table(struct i2c_client* client)
365{
366 struct synaptics_ts_data* ts =
367 (struct synaptics_ts_data*)get_touch_handle(client);
368 struct ts_function_descriptor buffer;
369 unsigned short u_address;
370
371 if (touch_debug_mask & DEBUG_TRACE)
372 TOUCH_DEBUG_MSG("\n");
373
374 memset(&buffer, 0x0, sizeof(struct ts_function_descriptor));
375
376 ts->common_dsc.id = 0;
377 ts->finger_dsc.id = 0;
378 ts->button_dsc.id = 0;
379 ts->flash_dsc.id = 0;
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700380 ts->analog_dsc.id = 0;
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700381
382 for (u_address = DESCRIPTION_TABLE_START; u_address > 10;
383 u_address -= sizeof(struct ts_function_descriptor)) {
384 if (unlikely(touch_i2c_read(client, u_address, sizeof(buffer),
385 (unsigned char *)&buffer) < 0)) {
386 TOUCH_ERR_MSG("RMI4 Function Descriptor read fail\n");
387 return -EIO;
388 }
389
390 if (buffer.id == 0)
391 break;
392
393 switch (buffer.id) {
394 case RMI_DEVICE_CONTROL:
395 ts->common_dsc = buffer;
396 break;
397 case TOUCHPAD_SENSORS:
398 ts->finger_dsc = buffer;
399 break;
400 case FLASH_MEMORY_MANAGEMENT:
401 ts->flash_dsc = buffer;
Jongrak Kwon420825a2012-06-26 16:33:25 -0700402 break;
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700403 }
404 }
405
406#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
407 if (unlikely(touch_i2c_write_byte(client, PAGE_SELECT_REG, 0x01) < 0)) {
408 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
409 return -EIO;
410 }
411
Jongrak Kwon420825a2012-06-26 16:33:25 -0700412 if (unlikely(touch_i2c_read(client, ANALOG_TABLE_START, sizeof(buffer), (unsigned char *)&buffer) < 0)) {
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700413 TOUCH_ERR_MSG("RMI4 Function Descriptor read fail\n");
414 return -EIO;
415 }
416
Jongrak Kwon420825a2012-06-26 16:33:25 -0700417 if (buffer.id == ANALOG_CONTROL) {
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700418 ts->analog_dsc = buffer;
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700419 }
420
421 if (unlikely(touch_i2c_write_byte(client, PAGE_SELECT_REG, 0x02) < 0)) {
422 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
423 return -EIO;
424 }
425
Jongrak Kwon420825a2012-06-26 16:33:25 -0700426 if (unlikely(touch_i2c_read(ts->client, BUTTON_TABLE_START, sizeof(buffer), (unsigned char *)&buffer))) {
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700427 TOUCH_ERR_MSG("Button ts_function_descriptor read fail\n");
428 return -EIO;
429 }
430
Jongrak Kwon420825a2012-06-26 16:33:25 -0700431 if (buffer.id == CAPACITIVE_BUTTON_SENSORS)
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700432 ts->button_dsc = buffer;
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700433
434 if (unlikely(touch_i2c_write_byte(client, PAGE_SELECT_REG, 0x00) < 0)) {
435 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
436 return -EIO;
437 }
438#endif
439
440 /* set interrupt mask */
441 ts->interrupt_mask.flash = 0x1;
442 ts->interrupt_mask.status = 0x2;
443
444 if (ts->button_dsc.id == 0) {
445 ts->interrupt_mask.abs = 0x4;
446 } else {
447 if (ts->finger_dsc.data_base > ts->button_dsc.data_base) {
448#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
449 ts->interrupt_mask.abs = 0x4;
450 ts->interrupt_mask.button = 0x20;
451#else
452 ts->interrupt_mask.abs = 0x8;
453 ts->interrupt_mask.button = 0x4;
454#endif
455 } else {
456 ts->interrupt_mask.abs = 0x4;
457 ts->interrupt_mask.button = 0x8;
458 }
459 }
460
461 if (ts->common_dsc.id == 0 || ts->finger_dsc.id == 0 ||
462 ts->flash_dsc.id == 0) {
463 TOUCH_ERR_MSG("common_dsc/finger_dsc/flash_dsc are not initiailized\n");
464 return -EPERM;
465 }
466
467 if (touch_debug_mask & DEBUG_BASE_INFO)
468 TOUCH_INFO_MSG("common[%d] finger[%d] flash[%d] button[%d]\n",
469 ts->common_dsc.id, ts->finger_dsc.id,
470 ts->flash_dsc.id, ts->button_dsc.id);
471
472 return 0;
473}
474
475int get_ic_info(struct synaptics_ts_data* ts, struct touch_fw_info* fw_info)
476{
477#if defined(ARRAYED_TOUCH_FW_BIN)
478 int cnt;
479#endif
480 u8 device_status = 0;
481 u8 flash_control = 0;
482
483 read_page_description_table(ts->client);
484
485 memset(fw_info, 0, sizeof(fw_info));
486
487 if (unlikely(touch_i2c_read(ts->client, FW_REVISION_REG,
488 sizeof(fw_info->fw_rev), &fw_info->fw_rev) < 0)) {
489 TOUCH_ERR_MSG("FW_REVISION_REG read fail\n");
490 return -EIO;
491 }
492
493 if (unlikely(touch_i2c_read(ts->client, MANUFACTURER_ID_REG,
494 sizeof(fw_info->manufacturer_id),
495 &fw_info->manufacturer_id) < 0)) {
496 TOUCH_ERR_MSG("MANUFACTURER_ID_REG read fail\n");
497 return -EIO;
498 }
499
500 if (unlikely(touch_i2c_read(ts->client, PRODUCT_ID_REG,
501 sizeof(fw_info->product_id) - 1,
502 fw_info->product_id) < 0)) {
503 TOUCH_ERR_MSG("PRODUCT_ID_REG read fail\n");
504 return -EIO;
505 }
506
507 if (unlikely(touch_i2c_read(ts->client, FW_VERSION,
508 sizeof(fw_info->fw_version) - 1,
509 fw_info->fw_version) < 0)) {
510 TOUCH_ERR_MSG("FW_VERSION read fail\n");
511 return -EIO;
512 }
513
514#if defined(CONFIG_TOUCH_REG_MAP_TM2000)
515 if ((strncmp(fw_info->fw_version, "0000", 4) == 0) ||
516 (strncmp(fw_info->fw_version, "S001", 4) == 0)) {
517 ts->ic_panel_type = IC7020_GFF;
518 TOUCH_INFO_MSG("IC is 7020, panel is GFF.");
519 } else {
520 if (fw_info->fw_version[0] == 'E' &&
521 (int)simple_strtol(&fw_info->fw_version[1], NULL, 10) < 14) {
522 ts->ic_panel_type = IC7020_G2;
523 TOUCH_INFO_MSG("IC is 7020, panel is G2.");
524 } else if ((fw_info->fw_version[0] == 'E'
525 && (int)simple_strtol(&fw_info->fw_version[1], NULL, 10) >= 14
526 && (int)simple_strtol(&fw_info->fw_version[1], NULL, 10) < 27)
527 || fw_info->fw_version[0] == 'T') {
528 ts->ic_panel_type = IC3203_G2;
529 TOUCH_INFO_MSG("IC is 3203, panel is G2.");
530 } else {
531 ts->ic_panel_type = IC7020_G2_H_PTN;
532 TOUCH_INFO_MSG("IC is 7020, H pattern, panel is G2.");
533
534 if ((fw_info->fw_version[0] == 'E')
535 && ((int)simple_strtol(&fw_info->fw_version[1],
536 NULL, 10) >= 40)) {
537 ts->interrupt_mask.button = 0x10;
538 }
539 }
540 }
541#elif defined(CONFIG_TOUCH_REG_MAP_TM2372)
542 ts->ic_panel_type = IC7020_GFF_H_PTN;
543 TOUCH_INFO_MSG("IC is 7020, H pattern, panel is GFF.");
544#endif
545
546#if defined(ARRAYED_TOUCH_FW_BIN)
547 for (cnt = 0; cnt < sizeof(SynaFirmware)/sizeof(SynaFirmware[0]); cnt++) {
548 strncpy(fw_info->fw_image_product_id,
549 &SynaFirmware[cnt][16], 10);
550 if (!(strncmp(fw_info->product_id,
551 fw_info->fw_image_product_id, 10)))
552 break;
553 }
554 fw_info->fw_start = (unsigned char *)&SynaFirmware[cnt][0];
555 fw_info->fw_size = sizeof(SynaFirmware[0]);
556#else
557 strncpy(fw_info->fw_image_product_id, &SynaFirmware[16], 10);
558#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
559 strncpy(fw_info->fw_image_version, &SynaFirmware[0xb100],4);
560#endif
561 fw_info->fw_start = (unsigned char *)&SynaFirmware[0];
562 fw_info->fw_size = sizeof(SynaFirmware);
563#endif
564
565 fw_info->fw_image_rev = fw_info->fw_start[31];
566
567 if (unlikely(touch_i2c_read(ts->client, FLASH_CONTROL_REG,
568 sizeof(flash_control), &flash_control) < 0)) {
569 TOUCH_ERR_MSG("FLASH_CONTROL_REG read fail\n");
570 return -EIO;
571 }
572
573 if (unlikely(touch_i2c_read(ts->client, DEVICE_STATUS_REG,
574 sizeof(device_status), &device_status) < 0)) {
575 TOUCH_ERR_MSG("DEVICE_STATUS_REG read fail\n");
576 return -EIO;
577 }
578
579 /* Firmware has a problem, so we should firmware-upgrade */
580 if (device_status & DEVICE_STATUS_FLASH_PROG
581 || (device_status & DEVICE_CRC_ERROR_MASK) != 0
582 || (flash_control & FLASH_STATUS_MASK) != 0) {
583 TOUCH_ERR_MSG("Firmware has a unknown-problem, "
584 "so it needs firmware-upgrade.\n");
585 TOUCH_ERR_MSG("FLASH_CONTROL[%x] DEVICE_STATUS_REG[%x]\n",
586 (u32)flash_control, (u32)device_status);
587
588 fw_info->fw_rev = 0;
589#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
590 fw_info->fw_force_rework = true;
591#endif
592 }
593
594 ts->fw_info = fw_info;
595
596 return 0;
597}
598
599int synaptics_ts_init(struct i2c_client* client, struct touch_fw_info* fw_info)
600{
601 struct synaptics_ts_data* ts =
602 (struct synaptics_ts_data*)get_touch_handle(client);
Jongrak Kwon9ed2a932012-06-19 23:38:02 -0700603 struct lge_touch_data *lg_ts =
604 (struct lge_touch_data *) i2c_get_clientdata(client);
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700605 u8 buf;
606
607 if (touch_debug_mask & DEBUG_TRACE)
608 TOUCH_DEBUG_MSG("\n");
609
610 if (!ts->is_probed)
611 if (unlikely(get_ic_info(ts, fw_info) < 0))
612 return -EIO;
613
614 if (unlikely(touch_i2c_write_byte(client, DEVICE_CONTROL_REG,
615 DEVICE_CONTROL_NOSLEEP | DEVICE_CONTROL_CONFIGURED) < 0)) {
616 TOUCH_ERR_MSG("DEVICE_CONTROL_REG write fail\n");
617 return -EIO;
618 }
619
620 if (unlikely(touch_i2c_read(client, INTERRUPT_ENABLE_REG,
621 1, &buf) < 0)) {
622 TOUCH_ERR_MSG("INTERRUPT_ENABLE_REG read fail\n");
623 return -EIO;
624 }
Jongrak Kwon9ed2a932012-06-19 23:38:02 -0700625
626 if (!lg_ts->pdata->caps->button_support) {
627 buf &= ~ts->interrupt_mask.button;
628 ts->interrupt_mask.button = 0;
629 }
630
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700631 if (unlikely(touch_i2c_write_byte(client, INTERRUPT_ENABLE_REG,
632 buf | ts->interrupt_mask.abs | ts->interrupt_mask.button) < 0)) {
633 TOUCH_ERR_MSG("INTERRUPT_ENABLE_REG write fail\n");
634 return -EIO;
635 }
636
637#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700638 if (ts->pdata->role->report_mode == CONTINUOUS_REPORT_MODE) {
639 if (unlikely(touch_i2c_write_byte(client, TWO_D_REPORTING_MODE,
640 REPORT_MODE_CONTINUOUS) < 0)) {
641 TOUCH_ERR_MSG("TWO_D_REPORTING_MODE write fail\n");
642 return -EIO;
643 }
644 } else { /* REDUCED_REPORT_MODE */
645 if (unlikely(touch_i2c_write_byte(client, TWO_D_REPORTING_MODE,
646 REPORT_MODE_REDUCED) < 0)) {
647 TOUCH_ERR_MSG("TWO_D_REPORTING_MODE write fail\n");
648 return -EIO;
649 }
Jongrak Kwon9ed2a932012-06-19 23:38:02 -0700650
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700651 if (unlikely(touch_i2c_write_byte(client, DELTA_X_THRESH_REG,
652 ts->pdata->role->delta_pos_threshold) < 0)) {
653 TOUCH_ERR_MSG("DELTA_X_THRESH_REG write fail\n");
654 return -EIO;
655 }
656 if (unlikely(touch_i2c_write_byte(client, DELTA_Y_THRESH_REG,
657 ts->pdata->role->delta_pos_threshold) < 0)) {
658 TOUCH_ERR_MSG("DELTA_Y_THRESH_REG write fail\n");
659 return -EIO;
660 }
661 }
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700662#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);
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700823 if (ret < 0) {
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700824 TOUCH_ERR_MSG("FAIL: VDD voltage setting"
825 " - (%duV)\n",
826 ts->pdata->pwr->vdd_voltage);
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700827 ret = -EPERM;
828 goto err_set_voltage;
829 }
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700830 }
831
832 if (ts->pdata->pwr->vio_voltage > 0) {
833 ret = regulator_set_voltage(ts->regulator_vio,
834 ts->pdata->pwr->vio_voltage,
835 ts->pdata->pwr->vio_voltage);
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700836 if (ret < 0) {
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700837 TOUCH_ERR_MSG("FAIL: VIO voltage setting"
838 " - (%duV)\n",
839 ts->pdata->pwr->vio_voltage);
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700840 ret = -EPERM;
841 goto err_set_voltage;
842 }
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700843 }
844 }
845
846 return ret;
847
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700848err_set_voltage:
849 if (ts->pdata->pwr->use_regulator) {
850 regulator_put(ts->regulator_vio);
851 }
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700852err_get_vio_failed:
853 if (ts->pdata->pwr->use_regulator) {
854 regulator_put(ts->regulator_vdd);
855 }
856err_get_vdd_failed:
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700857 kfree(ts);
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700858err_alloc_data_failed:
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700859 return ret;
860}
861
862void synaptics_ts_remove(struct i2c_client* client)
863{
864 struct synaptics_ts_data* ts =
865 (struct synaptics_ts_data*)get_touch_handle(client);
866
867 if (touch_debug_mask & DEBUG_TRACE)
868 TOUCH_DEBUG_MSG("\n");
869
870 if (ts->pdata->pwr->use_regulator) {
871 regulator_put(ts->regulator_vio);
872 regulator_put(ts->regulator_vdd);
873 }
874
875 kfree(ts);
876}
877
878int synaptics_ts_fw_upgrade(struct i2c_client* client, const char* fw_path)
879{
880 struct synaptics_ts_data* ts =
881 (struct synaptics_ts_data*)get_touch_handle(client);
882 int ret = 0;
883
884 ts->is_probed = 0;
885
886 ret = FirmwareUpgrade(ts, fw_path);
887
888 /* update IC info */
889 get_ic_info(ts, ts->fw_info);
890
891 return ret;
892}
893
894int synaptics_ts_ic_ctrl(struct i2c_client *client, u8 code, u16 value)
895{
896 struct synaptics_ts_data* ts =
897 (struct synaptics_ts_data*)get_touch_handle(client);
898 u8 buf = 0;
899
900 switch (code) {
901 case IC_CTRL_BASELINE:
902 switch (value) {
903 case BASELINE_OPEN:
Jongrak Kwon420825a2012-06-26 16:33:25 -0700904 if (!ts->analog_dsc.id) /* If not supported, ignore */
905 break;
906
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700907#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:
Jongrak Kwon420825a2012-06-26 16:33:25 -0700948 if (!ts->analog_dsc.id) /* If not supported, ignore */
949 break;
950
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700951#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
952 if (unlikely(touch_i2c_write_byte(client,
953 PAGE_SELECT_REG, 0x01) < 0)) {
954 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
955 return -EIO;
956 }
957
958 if (unlikely(touch_i2c_write_byte(client,
959 ANALOG_CONTROL_REG, 0x0) < 0)) {
960 TOUCH_ERR_MSG("ANALOG_CONTROL_REG write fail\n");
961 return -EIO;
962 }
963
964 msleep(10);
965
966 if (unlikely(touch_i2c_write_byte(client,
967 ANALOG_COMMAND_REG,
968 FORCE_UPDATE) < 0)) {
969 TOUCH_ERR_MSG("force fast relaxation command write fail\n");
970 return -EIO;
971 }
972
973 if (unlikely(touch_i2c_write_byte(client,
974 PAGE_SELECT_REG, 0x00) < 0)) {
975 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
976 return -EIO;
977 }
978
979 if (unlikely(touch_debug_mask & DEBUG_GHOST))
980 TOUCH_INFO_MSG("BASELINE_FIX ~~~~~~~~\n");
981#else
982 if (unlikely(touch_i2c_write_byte(client,
983 MELT_CONTROL_REG,
984 MELT_CONTROL_NO_MELT) < 0)) {
985 TOUCH_ERR_MSG("MELT_CONTROL_REG write fail\n");
986 return -EIO;
987 }
988#endif
989 break;
990 case BASELINE_REBASE:
991 /* rebase base line */
992 if (likely(ts->finger_dsc.id != 0)) {
993 if (unlikely(touch_i2c_write_byte(client,
994 FINGER_COMMAND_REG, 0x1) < 0)) {
995 TOUCH_ERR_MSG("finger baseline reset "
996 "command write fail\n");
997 return -EIO;
998 }
999 }
1000
1001#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
1002/* do nothing */
1003#else
1004 if (unlikely(ts->button_dsc.id != 0)) {
1005 if (unlikely(touch_i2c_write_byte(client,
1006 BUTTON_COMMAND_REG, 0x1) < 0)) {
1007 TOUCH_ERR_MSG("finger baseline reset "
1008 "command write fail\n");
1009 return -EIO;
1010 }
1011 }
1012#endif
1013 break;
1014 default:
1015 break;
1016 }
1017 break;
1018 case IC_CTRL_READ:
Jongrak Kwon9ed2a932012-06-19 23:38:02 -07001019#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
1020 if (unlikely(touch_i2c_write_byte(client,
1021 PAGE_SELECT_REG, ((value & 0xFF00) >> 8)) < 0)) {
1022 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
1023 return -EIO;
1024 }
1025
1026 if (touch_i2c_read(client, (value & 0xFF), 1, &buf) < 0) {
1027 TOUCH_ERR_MSG("IC register read fail\n");
1028 return -EIO;
1029 }
1030
1031 if (unlikely(touch_i2c_write_byte(client,
1032 PAGE_SELECT_REG, 0x00) < 0)) {
1033 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
1034 return -EIO;
1035 }
1036#else
Jongrak Kwonae680ab2012-06-15 22:06:54 -07001037 if (touch_i2c_read(client, value, 1, &buf) < 0) {
1038 TOUCH_ERR_MSG("IC register read fail\n");
1039 return -EIO;
1040 }
Jongrak Kwon9ed2a932012-06-19 23:38:02 -07001041#endif
Jongrak Kwonae680ab2012-06-15 22:06:54 -07001042 break;
1043 case IC_CTRL_WRITE:
Jongrak Kwon9ed2a932012-06-19 23:38:02 -07001044#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
1045 if (unlikely(touch_i2c_write_byte(client,
1046 PAGE_SELECT_REG, ((value & 0xFF0000) >> 16)) < 0)) {
1047 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
1048 return -EIO;
1049 }
1050
Jongrak Kwonae680ab2012-06-15 22:06:54 -07001051 if (touch_i2c_write_byte(client,
1052 ((value & 0xFF00) >> 8), (value & 0xFF)) < 0) {
1053 TOUCH_ERR_MSG("IC register write fail\n");
1054 return -EIO;
1055 }
Jongrak Kwon9ed2a932012-06-19 23:38:02 -07001056
1057 if (unlikely(touch_i2c_write_byte(client,
1058 PAGE_SELECT_REG, 0x00) < 0)) {
1059 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
1060 return -EIO;
1061 }
1062#else
1063 if (touch_i2c_write_byte(client,
1064 ((value & 0xFF00) >> 8), (value & 0xFF)) < 0) {
1065 TOUCH_ERR_MSG("IC register write fail\n");
1066 return -EIO;
1067 }
1068#endif
Jongrak Kwonae680ab2012-06-15 22:06:54 -07001069 break;
1070 case IC_CTRL_RESET_CMD:
1071 if (unlikely(touch_i2c_write_byte(client,
1072 DEVICE_COMMAND_REG, 0x1) < 0)) {
1073 TOUCH_ERR_MSG("IC Reset command write fail\n");
1074 return -EIO;
1075 }
1076 break;
1077 default:
1078 break;
1079 }
1080
1081 return buf;
1082}
1083
1084int synaptics_ts_fw_upgrade_check(struct lge_touch_data *ts)
1085{
1086#if defined(CONFIG_TOUCH_REG_MAP_TM2000)
1087 if (ts->fw_info.fw_force_rework) {
1088 TOUCH_INFO_MSG("FW-upgrade Force Rework.\n");
1089 } else {
1090 /* do not update 7020 gff, 7020 g2, 3203 g2 */
1091 if (((ts->fw_info.fw_version[0] == '0' &&
1092 (int)simple_strtoul(&ts->fw_info.fw_version[1], NULL, 10) == 0) ||
1093 (ts->fw_info.fw_version[0] == 'S' &&
1094 (int)simple_strtoul(&ts->fw_info.fw_version[1], NULL, 10) == 1) ||
1095 (ts->fw_info.fw_version[0] == 'E' &&
1096 (int)simple_strtoul(&ts->fw_info.fw_version[1], NULL, 10) < 27) ||
1097 (ts->fw_info.fw_version[0] == 'T'))) {
1098 TOUCH_INFO_MSG("DO NOT UPDATE 7020 gff, 7020 g2, 3203 " "g2 FW-upgrade is not executed\n");
1099 return -1;
1100 }
1101
1102 if ((ts->fw_info.fw_version[0] == 'E' &&
1103 (int)simple_strtoul(&ts->fw_info.fw_version[1], NULL, 10) >= 27) && !ts->fw_upgrade.fw_force_upgrade) { /* 7020 g2 h pattern */
1104
1105 if (((int)simple_strtoul(&ts->fw_info.fw_version[1], NULL, 10) >= (int)simple_strtoul(&ts->fw_info.fw_image_version[1], NULL, 10))) {
1106 TOUCH_INFO_MSG("DO NOT UPDATE 7020 G2 H " "pattern FW-upgrade is not executed\n");
1107 return -1;
1108 } else {
1109 TOUCH_INFO_MSG("7020 G2 H pattern FW-upgrade " "is executed\n");
1110 }
1111 } else {
1112 if (!ts->fw_upgrade.fw_force_upgrade) {
1113 TOUCH_INFO_MSG("UNKNOWN PANEL. FW-upgrade is" " not executed\n");
1114 return -1;
1115 }
1116 }
1117 }
1118#elif defined(CONFIG_TOUCH_REG_MAP_TM2372)
1119 if (ts->fw_info.fw_force_rework) {
1120 TOUCH_INFO_MSG("FW-upgrade Force Rework.\n");
1121 } else {
1122 if ((ts->fw_info.fw_version[0] == 'E' &&
1123 (int)simple_strtoul(&ts->fw_info.fw_version[1], NULL, 10) >= 1) &&
1124 !ts->fw_upgrade.fw_force_upgrade) {
1125
1126 if (((int)simple_strtoul(&ts->fw_info.fw_version[1], NULL, 10) >=
1127 (int)simple_strtoul(&ts->fw_info.fw_image_version[1],
1128 NULL, 10))) {
1129 TOUCH_INFO_MSG("DO NOT UPDATE 7020 GFF H " "pattern FW-upgrade is not executed\n");
1130 return -1;
1131 } else {
1132 TOUCH_INFO_MSG("7020 GFF H pattern FW-upgrade " "is executed\n");
1133 }
1134 } else {
1135 if (!ts->fw_upgrade.fw_force_upgrade) {
1136 TOUCH_INFO_MSG("UNKNOWN PANEL. FW-upgrade is not executed\n");
1137 return -1;
1138 }
1139 }
1140 }
1141#else
Jongrak Kwon9ed2a932012-06-19 23:38:02 -07001142#error NOT SUPPORTED TYPE
Jongrak Kwonae680ab2012-06-15 22:06:54 -07001143#endif
1144
1145 return 0;
1146}
1147
1148struct touch_device_driver synaptics_ts_driver = {
1149 .probe = synaptics_ts_probe,
1150 .remove = synaptics_ts_remove,
1151 .init = synaptics_ts_init,
1152 .data = synaptics_ts_get_data,
1153 .power = synaptics_ts_power,
1154 .fw_upgrade = synaptics_ts_fw_upgrade,
1155 .ic_ctrl = synaptics_ts_ic_ctrl,
1156 .fw_upgrade_check = synaptics_ts_fw_upgrade_check,
1157};
1158
1159static int __devinit touch_init(void)
1160{
1161 if (touch_debug_mask & DEBUG_TRACE)
1162 TOUCH_DEBUG_MSG("\n");
1163
1164 return touch_driver_register(&synaptics_ts_driver);
1165}
1166
1167static void __exit touch_exit(void)
1168{
1169 if (touch_debug_mask & DEBUG_TRACE)
1170 TOUCH_DEBUG_MSG("\n");
1171
1172 touch_driver_unregister();
1173}
1174
1175module_init(touch_init);
1176module_exit(touch_exit);
1177
1178MODULE_AUTHOR("yehan.ahn@lge.com, hyesung.shin@lge.com");
1179MODULE_DESCRIPTION("LGE Touch Driver");
1180MODULE_LICENSE("GPL");
1181