blob: 78a3656450670ab3ecfd0d4c6c8f7d1f6bcb8a26 [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 */
ks.kwon22c5f0b2012-08-07 13:50:18 +090071#define DEVICE_CONTROL_SLEEP 0x01 /* sleep mode : go to sleep */
Jongrak Kwonae680ab2012-06-15 22:06:54 -070072#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
Jongrak Kwon8c0f1692012-07-16 19:01:35 -0700133#define FW_OFFSET_PRODUCT_ID 0x40
134#define FW_OFFSET_IMAGE_VERSION 0xB100
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700135
136/* Get user-finger-data from register.
137 */
138#define TS_SNTS_GET_X_POSITION(_high_reg, _low_reg) \
139 (((u16)(((_high_reg) << 4) & 0x0FF0) | (u16)((_low_reg) & 0x0F)))
140#define TS_SNTS_GET_Y_POSITION(_high_reg, _low_reg) \
141 (((u16)(((_high_reg) << 4) & 0x0FF0) | (u16)(((_low_reg) >> 4) & 0x0F)))
142#define TS_SNTS_GET_WIDTH_MAJOR(_width) \
143 ((((((_width) & 0xF0) >> 4) - ((_width) & 0x0F)) > 0) ? \
144 ((_width) & 0xF0) >> 4 : (_width) & 0x0F)
145#define TS_SNTS_GET_WIDTH_MINOR(_width) \
146 ((((((_width) & 0xF0) >> 4) - ((_width) & 0x0F)) > 0) ? \
147 (_width) & 0x0F : ((_width) & 0xF0) >> 4)
148#define TS_SNTS_GET_ORIENTATION(_width) \
Jongrak Kwonef6ce3c2012-08-28 00:01:59 -0700149 ((((((_width) & 0xF0) >> 4) - ((_width) & 0x0F)) >= 0) ? 0 : 1)
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700150#define TS_SNTS_GET_PRESSURE(_pressure) (_pressure)
151
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700152#define FINGER_STATE_NO_PRESENT 0
153#define FINGER_STATE_PRESENT_VALID 1
154#define FINGER_STATE_PRESENT_NOVALID 2
155#define FINGER_STATE_REVSERVED 3
156
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700157int synaptics_ts_get_data(struct i2c_client *client, struct t_data* data,
158 struct b_data* button, u8* total_num)
159{
160 struct synaptics_ts_data* ts =
161 (struct synaptics_ts_data*)get_touch_handle(client);
162
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700163 u32 finger_status=0;
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700164 u8 id=0;
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700165 u8 cnt;
166
167 if (unlikely(touch_debug_mask & DEBUG_TRACE))
168 TOUCH_DEBUG_MSG("\n");
169
170 if (unlikely(touch_i2c_read(client, DEVICE_STATUS_REG,
Jongrak Kwon5297b722012-06-22 11:18:36 -0700171 sizeof(ts->ts_data.device_status_reg),
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700172 &ts->ts_data.device_status_reg) < 0)) {
173 TOUCH_ERR_MSG("DEVICE_STATUS_REG read fail\n");
174 goto err_synaptics_getdata;
175 }
176
177 /* ESD damage check */
178 if ((ts->ts_data.device_status_reg & DEVICE_FAILURE_MASK) ==
179 DEVICE_FAILURE_MASK) {
180 TOUCH_ERR_MSG("ESD damage occured. Reset Touch IC\n");
181 goto err_synaptics_device_damage;
182 }
183
184 /* Internal reset check */
185 if (((ts->ts_data.device_status_reg & DEVICE_STATUS_UNCONFIGURED) >> 7) == 1) {
186 TOUCH_ERR_MSG("Touch IC resetted internally. "
187 "Reconfigure register setting\n");
188 goto err_synaptics_device_damage;
189 }
190
191 if (unlikely(touch_i2c_read(client, INTERRUPT_STATUS_REG,
192 sizeof(ts->ts_data.interrupt_status_reg),
193 &ts->ts_data.interrupt_status_reg) < 0)) {
194 TOUCH_ERR_MSG("INTERRUPT_STATUS_REG read fail\n");
195 goto err_synaptics_getdata;
196 }
197
198 if (unlikely(touch_debug_mask & DEBUG_GET_DATA))
199 TOUCH_INFO_MSG("Interrupt_status : 0x%x\n",
200 ts->ts_data.interrupt_status_reg);
201
202 /* IC bug Exception handling - Interrupt status reg is 0 when interrupt occur */
203 if (ts->ts_data.interrupt_status_reg == 0) {
204 TOUCH_ERR_MSG("Interrupt_status reg is 0. "
205 "Something is wrong in IC\n");
206 goto err_synaptics_device_damage;
207 }
208
209 /* Because of ESD damage... */
210 if (unlikely(ts->ts_data.interrupt_status_reg & ts->interrupt_mask.flash)) {
211 TOUCH_ERR_MSG("Impossible Interrupt\n");
212 goto err_synaptics_device_damage;
213 }
214
215 /* Finger */
216 if (likely(ts->ts_data.interrupt_status_reg & ts->interrupt_mask.abs)) {
217 if (unlikely(touch_i2c_read(client, FINGER_STATE_REG,
218 sizeof(ts->ts_data.finger.finger_status_reg),
219 ts->ts_data.finger.finger_status_reg) < 0)) {
220 TOUCH_ERR_MSG("FINGER_STATE_REG read fail\n");
221 goto err_synaptics_getdata;
222 }
223
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700224 finger_status = ts->ts_data.finger.finger_status_reg[0] |
225 ts->ts_data.finger.finger_status_reg[1] << 8 |
226 (ts->ts_data.finger.finger_status_reg[2] & 0xF) << 16;
227
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700228 if (unlikely(touch_debug_mask & DEBUG_GET_DATA)) {
229 TOUCH_INFO_MSG("Finger_status : 0x%x, 0x%x, 0x%x\n",
230 ts->ts_data.finger.finger_status_reg[0],
231 ts->ts_data.finger.finger_status_reg[1],
232 ts->ts_data.finger.finger_status_reg[2]);
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700233 TOUCH_INFO_MSG("Touch_bit_mask: 0x%x\n", finger_status);
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700234 }
235
Jongrak Kwon8c0f1692012-07-16 19:01:35 -0700236 for (id = 0; id < ts->pdata->caps->max_id; id++) {
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700237 switch (((finger_status >> (id*2)) & 0x3)) {
238 case FINGER_STATE_PRESENT_VALID:
239 touch_i2c_read(ts->client,
240 FINGER_DATA_REG_START + NUM_OF_EACH_FINGER_DATA_REG * id,
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700241 NUM_OF_EACH_FINGER_DATA_REG,
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700242 ts->ts_data.finger.finger_reg[id]);
243 data[id].state = ABS_PRESS;
244 data[id].x_position = TS_SNTS_GET_X_POSITION(
245 ts->ts_data.finger.finger_reg[id][REG_X_POSITION],
246 ts->ts_data.finger.finger_reg[id][REG_YX_POSITION]);
247 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]);
248 data[id].width_major = TS_SNTS_GET_WIDTH_MAJOR(ts->ts_data.finger.finger_reg[id][REG_WY_WX]);
249 data[id].width_minor = TS_SNTS_GET_WIDTH_MINOR(ts->ts_data.finger.finger_reg[id][REG_WY_WX]);
Jongrak Kwon4ea40bb2012-08-23 17:59:06 -0700250 data[id].tool_type = MT_TOOL_FINGER;
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700251 data[id].width_orientation = TS_SNTS_GET_ORIENTATION(ts->ts_data.finger.finger_reg[id][REG_WY_WX]);
252 data[id].pressure = TS_SNTS_GET_PRESSURE(ts->ts_data.finger.finger_reg[id][REG_Z]);
253
254 if (unlikely(touch_debug_mask & DEBUG_GET_DATA))
255 TOUCH_INFO_MSG("[%d] pos(%4d,%4d) w_m[%2d] w_n[%2d] w_o[%2d] p[%2d]\n",
Jongrak Kwon4ea40bb2012-08-23 17:59:06 -0700256 id,
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700257 data[id].x_position,
258 data[id].y_position,
259 data[id].width_major,
260 data[id].width_minor,
261 data[id].width_orientation,
262 data[id].pressure);
263 (*total_num)++;
264 break;
265
266 case FINGER_STATE_NO_PRESENT:
267 if (data[id].state == ABS_PRESS)
268 data[id].state = ABS_RELEASE;
269 break;
270
271 default:
272 /* Do nothing including inacurate data */
273 break;
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700274 }
275
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700276 }
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700277 if (unlikely(touch_debug_mask & DEBUG_GET_DATA))
278 TOUCH_INFO_MSG("Total_num: %d\n", *total_num);
279 }
280
281 /* Button */
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700282 if ((ts->button_dsc.id != 0) && (ts->ts_data.interrupt_status_reg &
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700283 ts->interrupt_mask.button)) {
284
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700285 if (unlikely(touch_i2c_write_byte(client,
286 PAGE_SELECT_REG, 0x02) < 0)) {
287 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
288 return -EIO;
289 }
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700290
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700291 if (unlikely(touch_i2c_read(client, BUTTON_DATA_REG,
292 sizeof(ts->ts_data.button_data_reg),
293 &ts->ts_data.button_data_reg) < 0)) {
294 TOUCH_ERR_MSG("BUTTON_DATA_REG read fail\n");
295 goto err_synaptics_getdata;
296 }
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700297
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700298 if (unlikely(touch_i2c_write_byte(client,
299 PAGE_SELECT_REG, 0x00) < 0)) {
300 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
301 return -EIO;
302 }
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700303
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700304 if (unlikely(touch_debug_mask & DEBUG_BUTTON))
305 TOUCH_DEBUG_MSG("Button register: 0x%x\n",
306 ts->ts_data.button_data_reg);
307
308 if (ts->ts_data.button_data_reg) {
309 /* pressed - find first one */
310 for (cnt = 0; cnt < ts->pdata->caps->number_of_button; cnt++) {
311 if ((ts->ts_data.button_data_reg >> cnt) & 1)
312 {
313 ts->ts_data.button.key_code =
314 ts->pdata->caps->button_name[cnt];
315 button->key_code =
316 ts->ts_data.button.key_code;
317 button->state = 1;
318 break;
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700319 }
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700320 }
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700321 } else {
322 /* release */
323 button->key_code = ts->ts_data.button.key_code;
324 button->state = 0;
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700325 }
326 }
327
328 return 0;
329
330err_synaptics_device_damage:
331err_synaptics_getdata:
332 return -EIO;
333}
334
335static int read_page_description_table(struct i2c_client* client)
336{
337 struct synaptics_ts_data* ts =
338 (struct synaptics_ts_data*)get_touch_handle(client);
339 struct ts_function_descriptor buffer;
340 unsigned short u_address;
341
342 if (touch_debug_mask & DEBUG_TRACE)
343 TOUCH_DEBUG_MSG("\n");
344
345 memset(&buffer, 0x0, sizeof(struct ts_function_descriptor));
346
347 ts->common_dsc.id = 0;
348 ts->finger_dsc.id = 0;
349 ts->button_dsc.id = 0;
350 ts->flash_dsc.id = 0;
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700351 ts->analog_dsc.id = 0;
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700352
353 for (u_address = DESCRIPTION_TABLE_START; u_address > 10;
354 u_address -= sizeof(struct ts_function_descriptor)) {
355 if (unlikely(touch_i2c_read(client, u_address, sizeof(buffer),
356 (unsigned char *)&buffer) < 0)) {
357 TOUCH_ERR_MSG("RMI4 Function Descriptor read fail\n");
358 return -EIO;
359 }
360
361 if (buffer.id == 0)
362 break;
363
364 switch (buffer.id) {
365 case RMI_DEVICE_CONTROL:
366 ts->common_dsc = buffer;
367 break;
368 case TOUCHPAD_SENSORS:
369 ts->finger_dsc = buffer;
370 break;
371 case FLASH_MEMORY_MANAGEMENT:
372 ts->flash_dsc = buffer;
Jongrak Kwon420825a2012-06-26 16:33:25 -0700373 break;
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700374 }
375 }
376
377#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
378 if (unlikely(touch_i2c_write_byte(client, PAGE_SELECT_REG, 0x01) < 0)) {
379 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
380 return -EIO;
381 }
382
Jongrak Kwon420825a2012-06-26 16:33:25 -0700383 if (unlikely(touch_i2c_read(client, ANALOG_TABLE_START, sizeof(buffer), (unsigned char *)&buffer) < 0)) {
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700384 TOUCH_ERR_MSG("RMI4 Function Descriptor read fail\n");
385 return -EIO;
386 }
387
Jongrak Kwon420825a2012-06-26 16:33:25 -0700388 if (buffer.id == ANALOG_CONTROL) {
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700389 ts->analog_dsc = buffer;
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700390 }
391
392 if (unlikely(touch_i2c_write_byte(client, PAGE_SELECT_REG, 0x02) < 0)) {
393 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
394 return -EIO;
395 }
396
Jongrak Kwon420825a2012-06-26 16:33:25 -0700397 if (unlikely(touch_i2c_read(ts->client, BUTTON_TABLE_START, sizeof(buffer), (unsigned char *)&buffer))) {
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700398 TOUCH_ERR_MSG("Button ts_function_descriptor read fail\n");
399 return -EIO;
400 }
401
Jongrak Kwon420825a2012-06-26 16:33:25 -0700402 if (buffer.id == CAPACITIVE_BUTTON_SENSORS)
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700403 ts->button_dsc = buffer;
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700404
405 if (unlikely(touch_i2c_write_byte(client, PAGE_SELECT_REG, 0x00) < 0)) {
406 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
407 return -EIO;
408 }
409#endif
410
411 /* set interrupt mask */
412 ts->interrupt_mask.flash = 0x1;
413 ts->interrupt_mask.status = 0x2;
414
415 if (ts->button_dsc.id == 0) {
416 ts->interrupt_mask.abs = 0x4;
417 } else {
418 if (ts->finger_dsc.data_base > ts->button_dsc.data_base) {
419#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
420 ts->interrupt_mask.abs = 0x4;
421 ts->interrupt_mask.button = 0x20;
422#else
423 ts->interrupt_mask.abs = 0x8;
424 ts->interrupt_mask.button = 0x4;
425#endif
426 } else {
427 ts->interrupt_mask.abs = 0x4;
428 ts->interrupt_mask.button = 0x8;
429 }
430 }
431
432 if (ts->common_dsc.id == 0 || ts->finger_dsc.id == 0 ||
433 ts->flash_dsc.id == 0) {
434 TOUCH_ERR_MSG("common_dsc/finger_dsc/flash_dsc are not initiailized\n");
435 return -EPERM;
436 }
437
438 if (touch_debug_mask & DEBUG_BASE_INFO)
439 TOUCH_INFO_MSG("common[%d] finger[%d] flash[%d] button[%d]\n",
440 ts->common_dsc.id, ts->finger_dsc.id,
441 ts->flash_dsc.id, ts->button_dsc.id);
442
443 return 0;
444}
445
446int get_ic_info(struct synaptics_ts_data* ts, struct touch_fw_info* fw_info)
447{
448#if defined(ARRAYED_TOUCH_FW_BIN)
449 int cnt;
450#endif
451 u8 device_status = 0;
452 u8 flash_control = 0;
453
454 read_page_description_table(ts->client);
455
456 memset(fw_info, 0, sizeof(fw_info));
457
458 if (unlikely(touch_i2c_read(ts->client, FW_REVISION_REG,
459 sizeof(fw_info->fw_rev), &fw_info->fw_rev) < 0)) {
460 TOUCH_ERR_MSG("FW_REVISION_REG read fail\n");
461 return -EIO;
462 }
463
464 if (unlikely(touch_i2c_read(ts->client, MANUFACTURER_ID_REG,
465 sizeof(fw_info->manufacturer_id),
466 &fw_info->manufacturer_id) < 0)) {
467 TOUCH_ERR_MSG("MANUFACTURER_ID_REG read fail\n");
468 return -EIO;
469 }
470
471 if (unlikely(touch_i2c_read(ts->client, PRODUCT_ID_REG,
472 sizeof(fw_info->product_id) - 1,
473 fw_info->product_id) < 0)) {
474 TOUCH_ERR_MSG("PRODUCT_ID_REG read fail\n");
475 return -EIO;
476 }
477
478 if (unlikely(touch_i2c_read(ts->client, FW_VERSION,
479 sizeof(fw_info->fw_version) - 1,
480 fw_info->fw_version) < 0)) {
481 TOUCH_ERR_MSG("FW_VERSION read fail\n");
482 return -EIO;
483 }
484
Jongrak Kwon8c0f1692012-07-16 19:01:35 -0700485 ts->ic_panel_type = IC7020_G2_H_PTN;
486 TOUCH_INFO_MSG("IC is 7020, H pattern, panel is G2.");
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700487
488#if defined(ARRAYED_TOUCH_FW_BIN)
489 for (cnt = 0; cnt < sizeof(SynaFirmware)/sizeof(SynaFirmware[0]); cnt++) {
490 strncpy(fw_info->fw_image_product_id,
Jongrak Kwon8c0f1692012-07-16 19:01:35 -0700491 &SynaFirmware[cnt][FW_OFFSET_PRODUCT_ID], 10);
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700492 if (!(strncmp(fw_info->product_id,
493 fw_info->fw_image_product_id, 10)))
494 break;
495 }
496 fw_info->fw_start = (unsigned char *)&SynaFirmware[cnt][0];
497 fw_info->fw_size = sizeof(SynaFirmware[0]);
498#else
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700499 fw_info->fw_start = (unsigned char *)&SynaFirmware[0];
500 fw_info->fw_size = sizeof(SynaFirmware);
501#endif
502
Jongrak Kwon8c0f1692012-07-16 19:01:35 -0700503 strncpy(fw_info->fw_image_product_id,
504 &fw_info->fw_start[FW_OFFSET_PRODUCT_ID], 10);
505 strncpy(fw_info->fw_image_version,
506 &fw_info->fw_start[FW_OFFSET_IMAGE_VERSION],4);
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700507
508 if (unlikely(touch_i2c_read(ts->client, FLASH_CONTROL_REG,
509 sizeof(flash_control), &flash_control) < 0)) {
510 TOUCH_ERR_MSG("FLASH_CONTROL_REG read fail\n");
511 return -EIO;
512 }
513
514 if (unlikely(touch_i2c_read(ts->client, DEVICE_STATUS_REG,
515 sizeof(device_status), &device_status) < 0)) {
516 TOUCH_ERR_MSG("DEVICE_STATUS_REG read fail\n");
517 return -EIO;
518 }
519
520 /* Firmware has a problem, so we should firmware-upgrade */
521 if (device_status & DEVICE_STATUS_FLASH_PROG
522 || (device_status & DEVICE_CRC_ERROR_MASK) != 0
523 || (flash_control & FLASH_STATUS_MASK) != 0) {
524 TOUCH_ERR_MSG("Firmware has a unknown-problem, "
525 "so it needs firmware-upgrade.\n");
526 TOUCH_ERR_MSG("FLASH_CONTROL[%x] DEVICE_STATUS_REG[%x]\n",
527 (u32)flash_control, (u32)device_status);
528
529 fw_info->fw_rev = 0;
530#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
531 fw_info->fw_force_rework = true;
532#endif
533 }
534
535 ts->fw_info = fw_info;
536
537 return 0;
538}
539
540int synaptics_ts_init(struct i2c_client* client, struct touch_fw_info* fw_info)
541{
542 struct synaptics_ts_data* ts =
543 (struct synaptics_ts_data*)get_touch_handle(client);
Jongrak Kwon9ed2a932012-06-19 23:38:02 -0700544 struct lge_touch_data *lg_ts =
545 (struct lge_touch_data *) i2c_get_clientdata(client);
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700546 u8 buf;
547
548 if (touch_debug_mask & DEBUG_TRACE)
549 TOUCH_DEBUG_MSG("\n");
550
551 if (!ts->is_probed)
552 if (unlikely(get_ic_info(ts, fw_info) < 0))
553 return -EIO;
554
555 if (unlikely(touch_i2c_write_byte(client, DEVICE_CONTROL_REG,
556 DEVICE_CONTROL_NOSLEEP | DEVICE_CONTROL_CONFIGURED) < 0)) {
557 TOUCH_ERR_MSG("DEVICE_CONTROL_REG write fail\n");
558 return -EIO;
559 }
560
561 if (unlikely(touch_i2c_read(client, INTERRUPT_ENABLE_REG,
562 1, &buf) < 0)) {
563 TOUCH_ERR_MSG("INTERRUPT_ENABLE_REG read fail\n");
564 return -EIO;
565 }
Jongrak Kwon9ed2a932012-06-19 23:38:02 -0700566
567 if (!lg_ts->pdata->caps->button_support) {
568 buf &= ~ts->interrupt_mask.button;
569 ts->interrupt_mask.button = 0;
570 }
571
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700572 if (unlikely(touch_i2c_write_byte(client, INTERRUPT_ENABLE_REG,
573 buf | ts->interrupt_mask.abs | ts->interrupt_mask.button) < 0)) {
574 TOUCH_ERR_MSG("INTERRUPT_ENABLE_REG write fail\n");
575 return -EIO;
576 }
577
578#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
Jongrak Kwonef6ce3c2012-08-28 00:01:59 -0700579 if (unlikely(touch_i2c_read(client, TWO_D_REPORTING_MODE, 1, &buf) < 0)) {
580 TOUCH_ERR_MSG("TWO_D_REPORTING_MODE read fail\n");
581 return -EIO;
582 }
583
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700584 if (ts->pdata->role->report_mode == CONTINUOUS_REPORT_MODE) {
585 if (unlikely(touch_i2c_write_byte(client, TWO_D_REPORTING_MODE,
Jongrak Kwonef6ce3c2012-08-28 00:01:59 -0700586 (buf & ~7) | REPORT_MODE_CONTINUOUS) < 0)) {
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700587 TOUCH_ERR_MSG("TWO_D_REPORTING_MODE write fail\n");
588 return -EIO;
589 }
590 } else { /* REDUCED_REPORT_MODE */
591 if (unlikely(touch_i2c_write_byte(client, TWO_D_REPORTING_MODE,
Jongrak Kwonef6ce3c2012-08-28 00:01:59 -0700592 (buf & ~7) | REPORT_MODE_REDUCED) < 0)) {
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700593 TOUCH_ERR_MSG("TWO_D_REPORTING_MODE write fail\n");
594 return -EIO;
595 }
Jongrak Kwon9ed2a932012-06-19 23:38:02 -0700596
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700597 if (unlikely(touch_i2c_write_byte(client, DELTA_X_THRESH_REG,
598 ts->pdata->role->delta_pos_threshold) < 0)) {
599 TOUCH_ERR_MSG("DELTA_X_THRESH_REG write fail\n");
600 return -EIO;
601 }
602 if (unlikely(touch_i2c_write_byte(client, DELTA_Y_THRESH_REG,
603 ts->pdata->role->delta_pos_threshold) < 0)) {
604 TOUCH_ERR_MSG("DELTA_Y_THRESH_REG write fail\n");
605 return -EIO;
606 }
607 }
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700608#else
609 if (unlikely(touch_i2c_write_byte(client,
610 GESTURE_ENABLE_1_REG, 0x00) < 0)) {
611 TOUCH_ERR_MSG("GESTURE_ENABLE_1_REG write fail\n");
612 return -EIO;
613 }
614 if (unlikely(touch_i2c_write_byte(client, GESTURE_ENABLE_2_REG, 0x00) < 0)) {
615 TOUCH_ERR_MSG("GESTURE_ENABLE_2_REG write fail\n");
616 return -EIO;
617 }
618
Jongrak Kwonef6ce3c2012-08-28 00:01:59 -0700619 if (unlikely(touch_i2c_read(client, TWO_D_REPORTING_MODE, 1, &buf) < 0)) {
620 TOUCH_ERR_MSG("TWO_D_REPORTING_MODE read fail\n");
621 return -EIO;
622 }
623
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700624 if (ts->pdata->role->report_mode == CONTINUOUS_REPORT_MODE) {
625 if (unlikely(touch_i2c_write_byte(client, TWO_D_REPORTING_MODE,
Jongrak Kwonef6ce3c2012-08-28 00:01:59 -0700626 (buf & ~7) | REPORT_MODE_CONTINUOUS) < 0)) {
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700627 TOUCH_ERR_MSG("TWO_D_REPORTING_MODE write fail\n");
628 return -EIO;
629 }
630 } else { /* REDUCED_REPORT_MODE */
631 if (unlikely(touch_i2c_write_byte(client, TWO_D_REPORTING_MODE,
Jongrak Kwonef6ce3c2012-08-28 00:01:59 -0700632 (buf & ~7) | REPORT_MODE_REDUCED) < 0)) {
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700633 TOUCH_ERR_MSG("TWO_D_REPORTING_MODE write fail\n");
634 return -EIO;
635 }
636
637 if (unlikely(touch_i2c_write_byte(client, DELTA_X_THRESH_REG,
638 ts->pdata->role->delta_pos_threshold) < 0)) {
639 TOUCH_ERR_MSG("DELTA_X_THRESH_REG write fail\n");
640 return -EIO;
641 }
642 if (unlikely(touch_i2c_write_byte(client, DELTA_Y_THRESH_REG,
643 ts->pdata->role->delta_pos_threshold) < 0)) {
644 TOUCH_ERR_MSG("DELTA_Y_THRESH_REG write fail\n");
645 return -EIO;
646 }
647 }
648#endif
649
650 if (unlikely(touch_i2c_read(client, INTERRUPT_STATUS_REG, 1, &buf) < 0)) {
651 TOUCH_ERR_MSG("INTERRUPT_STATUS_REG read fail\n");
652 return -EIO; /* it is critical problem because interrupt will not occur. */
653 }
654
655 if (unlikely(touch_i2c_read(client, FINGER_STATE_REG,
656 sizeof(ts->ts_data.finger.finger_status_reg),
657 ts->ts_data.finger.finger_status_reg) < 0)) {
658 TOUCH_ERR_MSG("FINGER_STATE_REG read fail\n");
659 /* it is critical problem because interrupt will not occur on some FW. */
660 return -EIO;
661 }
662
663 ts->is_probed = 1;
664
665 return 0;
666}
667
668int synaptics_ts_power(struct i2c_client* client, int power_ctrl)
669{
670 struct synaptics_ts_data* ts =
671 (struct synaptics_ts_data*)get_touch_handle(client);
672
673 if (touch_debug_mask & DEBUG_TRACE)
674 TOUCH_DEBUG_MSG("\n");
675
676 switch (power_ctrl) {
677 case POWER_OFF:
ks.kwon22c5f0b2012-08-07 13:50:18 +0900678 if (ts->pdata->reset_pin > 0)
679 gpio_set_value(ts->pdata->reset_pin, 0);
680
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700681 if (ts->pdata->pwr->use_regulator) {
682 regulator_disable(ts->regulator_vio);
683 regulator_disable(ts->regulator_vdd);
684 }
685 else
686 ts->pdata->pwr->power(0);
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700687 break;
688 case POWER_ON:
689 if (ts->pdata->pwr->use_regulator) {
690 regulator_enable(ts->regulator_vdd);
691 regulator_enable(ts->regulator_vio);
692 }
693 else
694 ts->pdata->pwr->power(1);
695
ks.kwon22c5f0b2012-08-07 13:50:18 +0900696 if (ts->pdata->reset_pin > 0)
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700697 gpio_set_value(ts->pdata->reset_pin, 1);
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700698 break;
699 case POWER_SLEEP:
700 if (unlikely(touch_i2c_write_byte(client, DEVICE_CONTROL_REG,
701 DEVICE_CONTROL_SLEEP |
702 DEVICE_CONTROL_CONFIGURED) < 0)) {
703 TOUCH_ERR_MSG("DEVICE_CONTROL_REG write fail\n");
704 return -EIO;
705 }
706 break;
707 case POWER_WAKE:
708 if (unlikely(touch_i2c_write_byte(client, DEVICE_CONTROL_REG,
709 DEVICE_CONTROL_SPECIFIC |
710 DEVICE_CONTROL_CONFIGURED) < 0)) {
711 TOUCH_ERR_MSG("DEVICE_CONTROL_REG write fail\n");
712 return -EIO;
713 }
714 break;
715 default:
716 return -EIO;
717 break;
718 }
719
720 return 0;
721}
722
723int synaptics_ts_probe(struct i2c_client* client)
724{
725 struct synaptics_ts_data* ts;
726 int ret = 0;
727
728 if (touch_debug_mask & DEBUG_TRACE)
729 TOUCH_DEBUG_MSG("\n");
730
731 ts = kzalloc(sizeof(struct synaptics_ts_data), GFP_KERNEL);
732 if (!ts) {
733 TOUCH_ERR_MSG("Can not allocate memory\n");
734 ret = -ENOMEM;
735 goto err_alloc_data_failed;
736 }
737
738 set_touch_handle(client, ts);
739
740 ts->client = client;
741 ts->pdata = client->dev.platform_data;
742#if defined(CONFIG_TOUCH_REG_MAP_TM2000)
743 ts->ic_panel_type = IC7020_G2_H_PTN;
744#elif defined(CONFIG_TOUCH_REG_MAP_TM2372)
745 ts->ic_panel_type = IC7020_GFF_H_PTN;
746#endif
747
748 if (ts->pdata->pwr->use_regulator) {
749 ts->regulator_vdd =
750 regulator_get_exclusive(NULL, ts->pdata->pwr->vdd);
751 if (IS_ERR(ts->regulator_vdd)) {
752 TOUCH_ERR_MSG("FAIL: regulator_get_vdd - %s\n",
753 ts->pdata->pwr->vdd);
754 ret = -EPERM;
755 goto err_get_vdd_failed;
756 }
757
758 ts->regulator_vio = regulator_get_exclusive(NULL,
759 ts->pdata->pwr->vio);
760 if (IS_ERR(ts->regulator_vio)) {
761 TOUCH_ERR_MSG("FAIL: regulator_get_vio - %s\n",
762 ts->pdata->pwr->vio);
763 ret = -EPERM;
764 goto err_get_vio_failed;
765 }
766
767 if (ts->pdata->pwr->vdd_voltage > 0) {
768 ret = regulator_set_voltage(ts->regulator_vdd,
769 ts->pdata->pwr->vdd_voltage,
770 ts->pdata->pwr->vdd_voltage);
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700771 if (ret < 0) {
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700772 TOUCH_ERR_MSG("FAIL: VDD voltage setting"
773 " - (%duV)\n",
774 ts->pdata->pwr->vdd_voltage);
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700775 ret = -EPERM;
776 goto err_set_voltage;
777 }
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700778 }
779
780 if (ts->pdata->pwr->vio_voltage > 0) {
781 ret = regulator_set_voltage(ts->regulator_vio,
782 ts->pdata->pwr->vio_voltage,
783 ts->pdata->pwr->vio_voltage);
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700784 if (ret < 0) {
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700785 TOUCH_ERR_MSG("FAIL: VIO voltage setting"
786 " - (%duV)\n",
787 ts->pdata->pwr->vio_voltage);
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700788 ret = -EPERM;
789 goto err_set_voltage;
790 }
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700791 }
792 }
793
794 return ret;
795
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700796err_set_voltage:
797 if (ts->pdata->pwr->use_regulator) {
798 regulator_put(ts->regulator_vio);
799 }
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700800err_get_vio_failed:
801 if (ts->pdata->pwr->use_regulator) {
802 regulator_put(ts->regulator_vdd);
803 }
804err_get_vdd_failed:
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700805 kfree(ts);
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700806err_alloc_data_failed:
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700807 return ret;
808}
809
810void synaptics_ts_remove(struct i2c_client* client)
811{
812 struct synaptics_ts_data* ts =
813 (struct synaptics_ts_data*)get_touch_handle(client);
814
815 if (touch_debug_mask & DEBUG_TRACE)
816 TOUCH_DEBUG_MSG("\n");
817
818 if (ts->pdata->pwr->use_regulator) {
819 regulator_put(ts->regulator_vio);
820 regulator_put(ts->regulator_vdd);
821 }
822
823 kfree(ts);
824}
825
826int synaptics_ts_fw_upgrade(struct i2c_client* client, const char* fw_path)
827{
828 struct synaptics_ts_data* ts =
829 (struct synaptics_ts_data*)get_touch_handle(client);
830 int ret = 0;
831
832 ts->is_probed = 0;
833
834 ret = FirmwareUpgrade(ts, fw_path);
835
836 /* update IC info */
837 get_ic_info(ts, ts->fw_info);
838
839 return ret;
840}
841
842int synaptics_ts_ic_ctrl(struct i2c_client *client, u8 code, u16 value)
843{
844 struct synaptics_ts_data* ts =
845 (struct synaptics_ts_data*)get_touch_handle(client);
846 u8 buf = 0;
847
848 switch (code) {
849 case IC_CTRL_BASELINE:
850 switch (value) {
851 case BASELINE_OPEN:
Jongrak Kwon420825a2012-06-26 16:33:25 -0700852 if (!ts->analog_dsc.id) /* If not supported, ignore */
853 break;
854
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700855#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
856 if (unlikely(touch_i2c_write_byte(client,
857 PAGE_SELECT_REG, 0x01) < 0)) {
858 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
859 return -EIO;
860 }
861
862 if (unlikely(touch_i2c_write_byte(client,
863 ANALOG_CONTROL_REG,
864 FORCE_FAST_RELAXATION) < 0)) {
865 TOUCH_ERR_MSG("ANALOG_CONTROL_REG write fail\n");
866 return -EIO;
867 }
868
869 msleep(10);
870
871 if (unlikely(touch_i2c_write_byte(client,
872 ANALOG_COMMAND_REG,
873 FORCE_UPDATE) < 0)) {
874 TOUCH_ERR_MSG("force fast relaxation command write fail\n");
875 return -EIO;
876 }
877
878 if (unlikely(touch_i2c_write_byte(client,
879 PAGE_SELECT_REG, 0x00) < 0)) {
880 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
881 return -EIO;
882 }
883
884 if (unlikely(touch_debug_mask & DEBUG_GHOST))
885 TOUCH_INFO_MSG("BASELINE_OPEN ~~~~~~~~\n");
886#else
887 if (unlikely(touch_i2c_write_byte(client,
888 MELT_CONTROL_REG,
889 MELT_CONTROL_MELT) < 0)) {
890 TOUCH_ERR_MSG("MELT_CONTROL_REG write fail\n");
891 return -EIO;
892 }
893#endif
894 break;
895 case BASELINE_FIX:
Jongrak Kwon420825a2012-06-26 16:33:25 -0700896 if (!ts->analog_dsc.id) /* If not supported, ignore */
897 break;
898
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700899#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
900 if (unlikely(touch_i2c_write_byte(client,
901 PAGE_SELECT_REG, 0x01) < 0)) {
902 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
903 return -EIO;
904 }
905
906 if (unlikely(touch_i2c_write_byte(client,
907 ANALOG_CONTROL_REG, 0x0) < 0)) {
908 TOUCH_ERR_MSG("ANALOG_CONTROL_REG write fail\n");
909 return -EIO;
910 }
911
912 msleep(10);
913
914 if (unlikely(touch_i2c_write_byte(client,
915 ANALOG_COMMAND_REG,
916 FORCE_UPDATE) < 0)) {
917 TOUCH_ERR_MSG("force fast relaxation command write fail\n");
918 return -EIO;
919 }
920
921 if (unlikely(touch_i2c_write_byte(client,
922 PAGE_SELECT_REG, 0x00) < 0)) {
923 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
924 return -EIO;
925 }
926
927 if (unlikely(touch_debug_mask & DEBUG_GHOST))
928 TOUCH_INFO_MSG("BASELINE_FIX ~~~~~~~~\n");
929#else
930 if (unlikely(touch_i2c_write_byte(client,
931 MELT_CONTROL_REG,
932 MELT_CONTROL_NO_MELT) < 0)) {
933 TOUCH_ERR_MSG("MELT_CONTROL_REG write fail\n");
934 return -EIO;
935 }
936#endif
937 break;
938 case BASELINE_REBASE:
939 /* rebase base line */
940 if (likely(ts->finger_dsc.id != 0)) {
941 if (unlikely(touch_i2c_write_byte(client,
942 FINGER_COMMAND_REG, 0x1) < 0)) {
943 TOUCH_ERR_MSG("finger baseline reset "
944 "command write fail\n");
945 return -EIO;
946 }
947 }
948
949#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
950/* do nothing */
951#else
952 if (unlikely(ts->button_dsc.id != 0)) {
953 if (unlikely(touch_i2c_write_byte(client,
954 BUTTON_COMMAND_REG, 0x1) < 0)) {
955 TOUCH_ERR_MSG("finger baseline reset "
956 "command write fail\n");
957 return -EIO;
958 }
959 }
960#endif
961 break;
962 default:
963 break;
964 }
965 break;
966 case IC_CTRL_READ:
Jongrak Kwon9ed2a932012-06-19 23:38:02 -0700967#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
968 if (unlikely(touch_i2c_write_byte(client,
969 PAGE_SELECT_REG, ((value & 0xFF00) >> 8)) < 0)) {
970 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
971 return -EIO;
972 }
973
974 if (touch_i2c_read(client, (value & 0xFF), 1, &buf) < 0) {
975 TOUCH_ERR_MSG("IC register read fail\n");
976 return -EIO;
977 }
978
979 if (unlikely(touch_i2c_write_byte(client,
980 PAGE_SELECT_REG, 0x00) < 0)) {
981 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
982 return -EIO;
983 }
984#else
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700985 if (touch_i2c_read(client, value, 1, &buf) < 0) {
986 TOUCH_ERR_MSG("IC register read fail\n");
987 return -EIO;
988 }
Jongrak Kwon9ed2a932012-06-19 23:38:02 -0700989#endif
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700990 break;
991 case IC_CTRL_WRITE:
Jongrak Kwon9ed2a932012-06-19 23:38:02 -0700992#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
993 if (unlikely(touch_i2c_write_byte(client,
994 PAGE_SELECT_REG, ((value & 0xFF0000) >> 16)) < 0)) {
995 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
996 return -EIO;
997 }
998
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700999 if (touch_i2c_write_byte(client,
1000 ((value & 0xFF00) >> 8), (value & 0xFF)) < 0) {
1001 TOUCH_ERR_MSG("IC register write fail\n");
1002 return -EIO;
1003 }
Jongrak Kwon9ed2a932012-06-19 23:38:02 -07001004
1005 if (unlikely(touch_i2c_write_byte(client,
1006 PAGE_SELECT_REG, 0x00) < 0)) {
1007 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
1008 return -EIO;
1009 }
1010#else
1011 if (touch_i2c_write_byte(client,
1012 ((value & 0xFF00) >> 8), (value & 0xFF)) < 0) {
1013 TOUCH_ERR_MSG("IC register write fail\n");
1014 return -EIO;
1015 }
1016#endif
Jongrak Kwonae680ab2012-06-15 22:06:54 -07001017 break;
1018 case IC_CTRL_RESET_CMD:
1019 if (unlikely(touch_i2c_write_byte(client,
1020 DEVICE_COMMAND_REG, 0x1) < 0)) {
1021 TOUCH_ERR_MSG("IC Reset command write fail\n");
1022 return -EIO;
1023 }
1024 break;
1025 default:
1026 break;
1027 }
1028
1029 return buf;
1030}
1031
1032int synaptics_ts_fw_upgrade_check(struct lge_touch_data *ts)
1033{
Jongrak Kwon8c0f1692012-07-16 19:01:35 -07001034 if (ts->fw_info.fw_force_rework || ts->fw_upgrade.fw_force_upgrade) {
Jongrak Kwonae680ab2012-06-15 22:06:54 -07001035 TOUCH_INFO_MSG("FW-upgrade Force Rework.\n");
1036 } else {
Jongrak Kwon8c0f1692012-07-16 19:01:35 -07001037 if (((int)simple_strtoul(&ts->fw_info.fw_version[1], NULL, 10) >= (int)simple_strtoul(&ts->fw_info.fw_image_version[1], NULL, 10))) {
1038 TOUCH_INFO_MSG("DO NOT UPDATE 7020 G2 H " "pattern FW-upgrade is not executed\n");
Jongrak Kwonae680ab2012-06-15 22:06:54 -07001039 return -1;
Jongrak Kwonae680ab2012-06-15 22:06:54 -07001040 } else {
Jongrak Kwon8c0f1692012-07-16 19:01:35 -07001041 TOUCH_INFO_MSG("7020 G2 H pattern FW-upgrade " "is executed\n");
Jongrak Kwonae680ab2012-06-15 22:06:54 -07001042 }
1043 }
Jongrak Kwonae680ab2012-06-15 22:06:54 -07001044
1045 return 0;
1046}
1047
1048struct touch_device_driver synaptics_ts_driver = {
1049 .probe = synaptics_ts_probe,
1050 .remove = synaptics_ts_remove,
1051 .init = synaptics_ts_init,
1052 .data = synaptics_ts_get_data,
1053 .power = synaptics_ts_power,
1054 .fw_upgrade = synaptics_ts_fw_upgrade,
1055 .ic_ctrl = synaptics_ts_ic_ctrl,
1056 .fw_upgrade_check = synaptics_ts_fw_upgrade_check,
1057};
1058
1059static int __devinit touch_init(void)
1060{
1061 if (touch_debug_mask & DEBUG_TRACE)
1062 TOUCH_DEBUG_MSG("\n");
1063
1064 return touch_driver_register(&synaptics_ts_driver);
1065}
1066
1067static void __exit touch_exit(void)
1068{
1069 if (touch_debug_mask & DEBUG_TRACE)
1070 TOUCH_DEBUG_MSG("\n");
1071
1072 touch_driver_unregister();
1073}
1074
1075module_init(touch_init);
1076module_exit(touch_exit);
1077
1078MODULE_AUTHOR("yehan.ahn@lge.com, hyesung.shin@lge.com");
1079MODULE_DESCRIPTION("LGE Touch Driver");
1080MODULE_LICENSE("GPL");
1081