blob: b27ac1bd40c0a0afccb782599aba70a3c46530a0 [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) {
Jongrak Kwonecef32b2012-08-29 13:58:51 -0700204 TOUCH_ERR_MSG("Interrupt_status reg is 0. -> ignore\n");
205 goto err_synaptics_ignore;
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700206 }
207
208 /* Because of ESD damage... */
209 if (unlikely(ts->ts_data.interrupt_status_reg & ts->interrupt_mask.flash)) {
210 TOUCH_ERR_MSG("Impossible Interrupt\n");
211 goto err_synaptics_device_damage;
212 }
213
214 /* Finger */
215 if (likely(ts->ts_data.interrupt_status_reg & ts->interrupt_mask.abs)) {
216 if (unlikely(touch_i2c_read(client, FINGER_STATE_REG,
217 sizeof(ts->ts_data.finger.finger_status_reg),
218 ts->ts_data.finger.finger_status_reg) < 0)) {
219 TOUCH_ERR_MSG("FINGER_STATE_REG read fail\n");
220 goto err_synaptics_getdata;
221 }
222
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700223 finger_status = ts->ts_data.finger.finger_status_reg[0] |
224 ts->ts_data.finger.finger_status_reg[1] << 8 |
225 (ts->ts_data.finger.finger_status_reg[2] & 0xF) << 16;
226
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700227 if (unlikely(touch_debug_mask & DEBUG_GET_DATA)) {
228 TOUCH_INFO_MSG("Finger_status : 0x%x, 0x%x, 0x%x\n",
229 ts->ts_data.finger.finger_status_reg[0],
230 ts->ts_data.finger.finger_status_reg[1],
231 ts->ts_data.finger.finger_status_reg[2]);
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700232 TOUCH_INFO_MSG("Touch_bit_mask: 0x%x\n", finger_status);
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700233 }
234
Jongrak Kwon8c0f1692012-07-16 19:01:35 -0700235 for (id = 0; id < ts->pdata->caps->max_id; id++) {
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700236 switch (((finger_status >> (id*2)) & 0x3)) {
237 case FINGER_STATE_PRESENT_VALID:
238 touch_i2c_read(ts->client,
239 FINGER_DATA_REG_START + NUM_OF_EACH_FINGER_DATA_REG * id,
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700240 NUM_OF_EACH_FINGER_DATA_REG,
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700241 ts->ts_data.finger.finger_reg[id]);
242 data[id].state = ABS_PRESS;
243 data[id].x_position = TS_SNTS_GET_X_POSITION(
244 ts->ts_data.finger.finger_reg[id][REG_X_POSITION],
245 ts->ts_data.finger.finger_reg[id][REG_YX_POSITION]);
246 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]);
247 data[id].width_major = TS_SNTS_GET_WIDTH_MAJOR(ts->ts_data.finger.finger_reg[id][REG_WY_WX]);
248 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 -0700249 data[id].tool_type = MT_TOOL_FINGER;
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700250 data[id].width_orientation = TS_SNTS_GET_ORIENTATION(ts->ts_data.finger.finger_reg[id][REG_WY_WX]);
251 data[id].pressure = TS_SNTS_GET_PRESSURE(ts->ts_data.finger.finger_reg[id][REG_Z]);
252
253 if (unlikely(touch_debug_mask & DEBUG_GET_DATA))
254 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 -0700255 id,
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700256 data[id].x_position,
257 data[id].y_position,
258 data[id].width_major,
259 data[id].width_minor,
260 data[id].width_orientation,
261 data[id].pressure);
262 (*total_num)++;
263 break;
264
265 case FINGER_STATE_NO_PRESENT:
266 if (data[id].state == ABS_PRESS)
267 data[id].state = ABS_RELEASE;
268 break;
269
270 default:
271 /* Do nothing including inacurate data */
272 break;
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700273 }
274
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700275 }
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700276 if (unlikely(touch_debug_mask & DEBUG_GET_DATA))
277 TOUCH_INFO_MSG("Total_num: %d\n", *total_num);
278 }
279
280 /* Button */
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700281 if ((ts->button_dsc.id != 0) && (ts->ts_data.interrupt_status_reg &
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700282 ts->interrupt_mask.button)) {
283
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700284 if (unlikely(touch_i2c_write_byte(client,
285 PAGE_SELECT_REG, 0x02) < 0)) {
286 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
287 return -EIO;
288 }
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700289
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700290 if (unlikely(touch_i2c_read(client, BUTTON_DATA_REG,
291 sizeof(ts->ts_data.button_data_reg),
292 &ts->ts_data.button_data_reg) < 0)) {
293 TOUCH_ERR_MSG("BUTTON_DATA_REG read fail\n");
294 goto err_synaptics_getdata;
295 }
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700296
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700297 if (unlikely(touch_i2c_write_byte(client,
298 PAGE_SELECT_REG, 0x00) < 0)) {
299 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
300 return -EIO;
301 }
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700302
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700303 if (unlikely(touch_debug_mask & DEBUG_BUTTON))
304 TOUCH_DEBUG_MSG("Button register: 0x%x\n",
305 ts->ts_data.button_data_reg);
306
307 if (ts->ts_data.button_data_reg) {
308 /* pressed - find first one */
309 for (cnt = 0; cnt < ts->pdata->caps->number_of_button; cnt++) {
310 if ((ts->ts_data.button_data_reg >> cnt) & 1)
311 {
312 ts->ts_data.button.key_code =
313 ts->pdata->caps->button_name[cnt];
314 button->key_code =
315 ts->ts_data.button.key_code;
316 button->state = 1;
317 break;
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700318 }
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700319 }
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700320 } else {
321 /* release */
322 button->key_code = ts->ts_data.button.key_code;
323 button->state = 0;
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700324 }
325 }
326
327 return 0;
328
329err_synaptics_device_damage:
330err_synaptics_getdata:
331 return -EIO;
Jongrak Kwonecef32b2012-08-29 13:58:51 -0700332err_synaptics_ignore:
333 return -EINVAL;
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700334}
335
336static int read_page_description_table(struct i2c_client* client)
337{
338 struct synaptics_ts_data* ts =
339 (struct synaptics_ts_data*)get_touch_handle(client);
340 struct ts_function_descriptor buffer;
341 unsigned short u_address;
342
343 if (touch_debug_mask & DEBUG_TRACE)
344 TOUCH_DEBUG_MSG("\n");
345
346 memset(&buffer, 0x0, sizeof(struct ts_function_descriptor));
347
348 ts->common_dsc.id = 0;
349 ts->finger_dsc.id = 0;
350 ts->button_dsc.id = 0;
351 ts->flash_dsc.id = 0;
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700352 ts->analog_dsc.id = 0;
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700353
354 for (u_address = DESCRIPTION_TABLE_START; u_address > 10;
355 u_address -= sizeof(struct ts_function_descriptor)) {
356 if (unlikely(touch_i2c_read(client, u_address, sizeof(buffer),
357 (unsigned char *)&buffer) < 0)) {
358 TOUCH_ERR_MSG("RMI4 Function Descriptor read fail\n");
359 return -EIO;
360 }
361
362 if (buffer.id == 0)
363 break;
364
365 switch (buffer.id) {
366 case RMI_DEVICE_CONTROL:
367 ts->common_dsc = buffer;
368 break;
369 case TOUCHPAD_SENSORS:
370 ts->finger_dsc = buffer;
371 break;
372 case FLASH_MEMORY_MANAGEMENT:
373 ts->flash_dsc = buffer;
Jongrak Kwon420825a2012-06-26 16:33:25 -0700374 break;
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700375 }
376 }
377
378#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
379 if (unlikely(touch_i2c_write_byte(client, PAGE_SELECT_REG, 0x01) < 0)) {
380 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
381 return -EIO;
382 }
383
Jongrak Kwon420825a2012-06-26 16:33:25 -0700384 if (unlikely(touch_i2c_read(client, ANALOG_TABLE_START, sizeof(buffer), (unsigned char *)&buffer) < 0)) {
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700385 TOUCH_ERR_MSG("RMI4 Function Descriptor read fail\n");
386 return -EIO;
387 }
388
Jongrak Kwon420825a2012-06-26 16:33:25 -0700389 if (buffer.id == ANALOG_CONTROL) {
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700390 ts->analog_dsc = buffer;
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700391 }
392
393 if (unlikely(touch_i2c_write_byte(client, PAGE_SELECT_REG, 0x02) < 0)) {
394 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
395 return -EIO;
396 }
397
Jongrak Kwon420825a2012-06-26 16:33:25 -0700398 if (unlikely(touch_i2c_read(ts->client, BUTTON_TABLE_START, sizeof(buffer), (unsigned char *)&buffer))) {
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700399 TOUCH_ERR_MSG("Button ts_function_descriptor read fail\n");
400 return -EIO;
401 }
402
Jongrak Kwon420825a2012-06-26 16:33:25 -0700403 if (buffer.id == CAPACITIVE_BUTTON_SENSORS)
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700404 ts->button_dsc = buffer;
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700405
406 if (unlikely(touch_i2c_write_byte(client, PAGE_SELECT_REG, 0x00) < 0)) {
407 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
408 return -EIO;
409 }
410#endif
411
412 /* set interrupt mask */
413 ts->interrupt_mask.flash = 0x1;
414 ts->interrupt_mask.status = 0x2;
415
416 if (ts->button_dsc.id == 0) {
417 ts->interrupt_mask.abs = 0x4;
418 } else {
419 if (ts->finger_dsc.data_base > ts->button_dsc.data_base) {
420#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
421 ts->interrupt_mask.abs = 0x4;
422 ts->interrupt_mask.button = 0x20;
423#else
424 ts->interrupt_mask.abs = 0x8;
425 ts->interrupt_mask.button = 0x4;
426#endif
427 } else {
428 ts->interrupt_mask.abs = 0x4;
429 ts->interrupt_mask.button = 0x8;
430 }
431 }
432
433 if (ts->common_dsc.id == 0 || ts->finger_dsc.id == 0 ||
434 ts->flash_dsc.id == 0) {
435 TOUCH_ERR_MSG("common_dsc/finger_dsc/flash_dsc are not initiailized\n");
436 return -EPERM;
437 }
438
439 if (touch_debug_mask & DEBUG_BASE_INFO)
440 TOUCH_INFO_MSG("common[%d] finger[%d] flash[%d] button[%d]\n",
441 ts->common_dsc.id, ts->finger_dsc.id,
442 ts->flash_dsc.id, ts->button_dsc.id);
443
444 return 0;
445}
446
447int get_ic_info(struct synaptics_ts_data* ts, struct touch_fw_info* fw_info)
448{
449#if defined(ARRAYED_TOUCH_FW_BIN)
450 int cnt;
451#endif
452 u8 device_status = 0;
453 u8 flash_control = 0;
454
455 read_page_description_table(ts->client);
456
457 memset(fw_info, 0, sizeof(fw_info));
458
459 if (unlikely(touch_i2c_read(ts->client, FW_REVISION_REG,
460 sizeof(fw_info->fw_rev), &fw_info->fw_rev) < 0)) {
461 TOUCH_ERR_MSG("FW_REVISION_REG read fail\n");
462 return -EIO;
463 }
464
465 if (unlikely(touch_i2c_read(ts->client, MANUFACTURER_ID_REG,
466 sizeof(fw_info->manufacturer_id),
467 &fw_info->manufacturer_id) < 0)) {
468 TOUCH_ERR_MSG("MANUFACTURER_ID_REG read fail\n");
469 return -EIO;
470 }
471
472 if (unlikely(touch_i2c_read(ts->client, PRODUCT_ID_REG,
473 sizeof(fw_info->product_id) - 1,
474 fw_info->product_id) < 0)) {
475 TOUCH_ERR_MSG("PRODUCT_ID_REG read fail\n");
476 return -EIO;
477 }
478
479 if (unlikely(touch_i2c_read(ts->client, FW_VERSION,
480 sizeof(fw_info->fw_version) - 1,
481 fw_info->fw_version) < 0)) {
482 TOUCH_ERR_MSG("FW_VERSION read fail\n");
483 return -EIO;
484 }
485
Jongrak Kwon8c0f1692012-07-16 19:01:35 -0700486 ts->ic_panel_type = IC7020_G2_H_PTN;
Jongrak Kwonecef32b2012-08-29 13:58:51 -0700487 TOUCH_INFO_MSG("IC is 7020, H pattern, panel is G2, Firmware: %s.", fw_info->fw_version);
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700488
489#if defined(ARRAYED_TOUCH_FW_BIN)
490 for (cnt = 0; cnt < sizeof(SynaFirmware)/sizeof(SynaFirmware[0]); cnt++) {
491 strncpy(fw_info->fw_image_product_id,
Jongrak Kwon8c0f1692012-07-16 19:01:35 -0700492 &SynaFirmware[cnt][FW_OFFSET_PRODUCT_ID], 10);
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700493 if (!(strncmp(fw_info->product_id,
494 fw_info->fw_image_product_id, 10)))
495 break;
496 }
497 fw_info->fw_start = (unsigned char *)&SynaFirmware[cnt][0];
498 fw_info->fw_size = sizeof(SynaFirmware[0]);
499#else
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700500 fw_info->fw_start = (unsigned char *)&SynaFirmware[0];
501 fw_info->fw_size = sizeof(SynaFirmware);
502#endif
503
Jongrak Kwon8c0f1692012-07-16 19:01:35 -0700504 strncpy(fw_info->fw_image_product_id,
505 &fw_info->fw_start[FW_OFFSET_PRODUCT_ID], 10);
506 strncpy(fw_info->fw_image_version,
507 &fw_info->fw_start[FW_OFFSET_IMAGE_VERSION],4);
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700508
509 if (unlikely(touch_i2c_read(ts->client, FLASH_CONTROL_REG,
510 sizeof(flash_control), &flash_control) < 0)) {
511 TOUCH_ERR_MSG("FLASH_CONTROL_REG read fail\n");
512 return -EIO;
513 }
514
515 if (unlikely(touch_i2c_read(ts->client, DEVICE_STATUS_REG,
516 sizeof(device_status), &device_status) < 0)) {
517 TOUCH_ERR_MSG("DEVICE_STATUS_REG read fail\n");
518 return -EIO;
519 }
520
521 /* Firmware has a problem, so we should firmware-upgrade */
522 if (device_status & DEVICE_STATUS_FLASH_PROG
523 || (device_status & DEVICE_CRC_ERROR_MASK) != 0
524 || (flash_control & FLASH_STATUS_MASK) != 0) {
525 TOUCH_ERR_MSG("Firmware has a unknown-problem, "
526 "so it needs firmware-upgrade.\n");
527 TOUCH_ERR_MSG("FLASH_CONTROL[%x] DEVICE_STATUS_REG[%x]\n",
528 (u32)flash_control, (u32)device_status);
529
530 fw_info->fw_rev = 0;
531#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
532 fw_info->fw_force_rework = true;
533#endif
534 }
535
536 ts->fw_info = fw_info;
537
538 return 0;
539}
540
541int synaptics_ts_init(struct i2c_client* client, struct touch_fw_info* fw_info)
542{
543 struct synaptics_ts_data* ts =
544 (struct synaptics_ts_data*)get_touch_handle(client);
Jongrak Kwon9ed2a932012-06-19 23:38:02 -0700545 struct lge_touch_data *lg_ts =
546 (struct lge_touch_data *) i2c_get_clientdata(client);
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700547 u8 buf;
548
549 if (touch_debug_mask & DEBUG_TRACE)
550 TOUCH_DEBUG_MSG("\n");
551
552 if (!ts->is_probed)
553 if (unlikely(get_ic_info(ts, fw_info) < 0))
554 return -EIO;
555
556 if (unlikely(touch_i2c_write_byte(client, DEVICE_CONTROL_REG,
557 DEVICE_CONTROL_NOSLEEP | DEVICE_CONTROL_CONFIGURED) < 0)) {
558 TOUCH_ERR_MSG("DEVICE_CONTROL_REG write fail\n");
559 return -EIO;
560 }
561
562 if (unlikely(touch_i2c_read(client, INTERRUPT_ENABLE_REG,
563 1, &buf) < 0)) {
564 TOUCH_ERR_MSG("INTERRUPT_ENABLE_REG read fail\n");
565 return -EIO;
566 }
Jongrak Kwon9ed2a932012-06-19 23:38:02 -0700567
568 if (!lg_ts->pdata->caps->button_support) {
569 buf &= ~ts->interrupt_mask.button;
570 ts->interrupt_mask.button = 0;
571 }
572
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700573 if (unlikely(touch_i2c_write_byte(client, INTERRUPT_ENABLE_REG,
574 buf | ts->interrupt_mask.abs | ts->interrupt_mask.button) < 0)) {
575 TOUCH_ERR_MSG("INTERRUPT_ENABLE_REG write fail\n");
576 return -EIO;
577 }
578
579#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
Jongrak Kwonef6ce3c2012-08-28 00:01:59 -0700580 if (unlikely(touch_i2c_read(client, TWO_D_REPORTING_MODE, 1, &buf) < 0)) {
581 TOUCH_ERR_MSG("TWO_D_REPORTING_MODE read fail\n");
582 return -EIO;
583 }
584
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700585 if (ts->pdata->role->report_mode == CONTINUOUS_REPORT_MODE) {
586 if (unlikely(touch_i2c_write_byte(client, TWO_D_REPORTING_MODE,
Jongrak Kwonef6ce3c2012-08-28 00:01:59 -0700587 (buf & ~7) | REPORT_MODE_CONTINUOUS) < 0)) {
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700588 TOUCH_ERR_MSG("TWO_D_REPORTING_MODE write fail\n");
589 return -EIO;
590 }
591 } else { /* REDUCED_REPORT_MODE */
592 if (unlikely(touch_i2c_write_byte(client, TWO_D_REPORTING_MODE,
Jongrak Kwonef6ce3c2012-08-28 00:01:59 -0700593 (buf & ~7) | REPORT_MODE_REDUCED) < 0)) {
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700594 TOUCH_ERR_MSG("TWO_D_REPORTING_MODE write fail\n");
595 return -EIO;
596 }
Jongrak Kwon9ed2a932012-06-19 23:38:02 -0700597
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700598 if (unlikely(touch_i2c_write_byte(client, DELTA_X_THRESH_REG,
599 ts->pdata->role->delta_pos_threshold) < 0)) {
600 TOUCH_ERR_MSG("DELTA_X_THRESH_REG write fail\n");
601 return -EIO;
602 }
603 if (unlikely(touch_i2c_write_byte(client, DELTA_Y_THRESH_REG,
604 ts->pdata->role->delta_pos_threshold) < 0)) {
605 TOUCH_ERR_MSG("DELTA_Y_THRESH_REG write fail\n");
606 return -EIO;
607 }
608 }
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700609#else
610 if (unlikely(touch_i2c_write_byte(client,
611 GESTURE_ENABLE_1_REG, 0x00) < 0)) {
612 TOUCH_ERR_MSG("GESTURE_ENABLE_1_REG write fail\n");
613 return -EIO;
614 }
615 if (unlikely(touch_i2c_write_byte(client, GESTURE_ENABLE_2_REG, 0x00) < 0)) {
616 TOUCH_ERR_MSG("GESTURE_ENABLE_2_REG write fail\n");
617 return -EIO;
618 }
619
Jongrak Kwonef6ce3c2012-08-28 00:01:59 -0700620 if (unlikely(touch_i2c_read(client, TWO_D_REPORTING_MODE, 1, &buf) < 0)) {
621 TOUCH_ERR_MSG("TWO_D_REPORTING_MODE read fail\n");
622 return -EIO;
623 }
624
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700625 if (ts->pdata->role->report_mode == CONTINUOUS_REPORT_MODE) {
626 if (unlikely(touch_i2c_write_byte(client, TWO_D_REPORTING_MODE,
Jongrak Kwonef6ce3c2012-08-28 00:01:59 -0700627 (buf & ~7) | REPORT_MODE_CONTINUOUS) < 0)) {
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700628 TOUCH_ERR_MSG("TWO_D_REPORTING_MODE write fail\n");
629 return -EIO;
630 }
631 } else { /* REDUCED_REPORT_MODE */
632 if (unlikely(touch_i2c_write_byte(client, TWO_D_REPORTING_MODE,
Jongrak Kwonef6ce3c2012-08-28 00:01:59 -0700633 (buf & ~7) | REPORT_MODE_REDUCED) < 0)) {
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700634 TOUCH_ERR_MSG("TWO_D_REPORTING_MODE write fail\n");
635 return -EIO;
636 }
637
638 if (unlikely(touch_i2c_write_byte(client, DELTA_X_THRESH_REG,
639 ts->pdata->role->delta_pos_threshold) < 0)) {
640 TOUCH_ERR_MSG("DELTA_X_THRESH_REG write fail\n");
641 return -EIO;
642 }
643 if (unlikely(touch_i2c_write_byte(client, DELTA_Y_THRESH_REG,
644 ts->pdata->role->delta_pos_threshold) < 0)) {
645 TOUCH_ERR_MSG("DELTA_Y_THRESH_REG write fail\n");
646 return -EIO;
647 }
648 }
649#endif
650
651 if (unlikely(touch_i2c_read(client, INTERRUPT_STATUS_REG, 1, &buf) < 0)) {
652 TOUCH_ERR_MSG("INTERRUPT_STATUS_REG read fail\n");
653 return -EIO; /* it is critical problem because interrupt will not occur. */
654 }
655
656 if (unlikely(touch_i2c_read(client, FINGER_STATE_REG,
657 sizeof(ts->ts_data.finger.finger_status_reg),
658 ts->ts_data.finger.finger_status_reg) < 0)) {
659 TOUCH_ERR_MSG("FINGER_STATE_REG read fail\n");
660 /* it is critical problem because interrupt will not occur on some FW. */
661 return -EIO;
662 }
663
664 ts->is_probed = 1;
665
666 return 0;
667}
668
669int synaptics_ts_power(struct i2c_client* client, int power_ctrl)
670{
671 struct synaptics_ts_data* ts =
672 (struct synaptics_ts_data*)get_touch_handle(client);
673
674 if (touch_debug_mask & DEBUG_TRACE)
675 TOUCH_DEBUG_MSG("\n");
676
677 switch (power_ctrl) {
678 case POWER_OFF:
ks.kwon22c5f0b2012-08-07 13:50:18 +0900679 if (ts->pdata->reset_pin > 0)
680 gpio_set_value(ts->pdata->reset_pin, 0);
681
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700682 if (ts->pdata->pwr->use_regulator) {
683 regulator_disable(ts->regulator_vio);
684 regulator_disable(ts->regulator_vdd);
685 }
686 else
687 ts->pdata->pwr->power(0);
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700688 break;
689 case POWER_ON:
690 if (ts->pdata->pwr->use_regulator) {
691 regulator_enable(ts->regulator_vdd);
692 regulator_enable(ts->regulator_vio);
693 }
694 else
695 ts->pdata->pwr->power(1);
696
ks.kwon22c5f0b2012-08-07 13:50:18 +0900697 if (ts->pdata->reset_pin > 0)
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700698 gpio_set_value(ts->pdata->reset_pin, 1);
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700699 break;
700 case POWER_SLEEP:
701 if (unlikely(touch_i2c_write_byte(client, DEVICE_CONTROL_REG,
702 DEVICE_CONTROL_SLEEP |
703 DEVICE_CONTROL_CONFIGURED) < 0)) {
704 TOUCH_ERR_MSG("DEVICE_CONTROL_REG write fail\n");
705 return -EIO;
706 }
707 break;
708 case POWER_WAKE:
709 if (unlikely(touch_i2c_write_byte(client, DEVICE_CONTROL_REG,
710 DEVICE_CONTROL_SPECIFIC |
711 DEVICE_CONTROL_CONFIGURED) < 0)) {
712 TOUCH_ERR_MSG("DEVICE_CONTROL_REG write fail\n");
713 return -EIO;
714 }
715 break;
716 default:
717 return -EIO;
718 break;
719 }
720
721 return 0;
722}
723
724int synaptics_ts_probe(struct i2c_client* client)
725{
726 struct synaptics_ts_data* ts;
727 int ret = 0;
728
729 if (touch_debug_mask & DEBUG_TRACE)
730 TOUCH_DEBUG_MSG("\n");
731
732 ts = kzalloc(sizeof(struct synaptics_ts_data), GFP_KERNEL);
733 if (!ts) {
734 TOUCH_ERR_MSG("Can not allocate memory\n");
735 ret = -ENOMEM;
736 goto err_alloc_data_failed;
737 }
738
739 set_touch_handle(client, ts);
740
741 ts->client = client;
742 ts->pdata = client->dev.platform_data;
743#if defined(CONFIG_TOUCH_REG_MAP_TM2000)
744 ts->ic_panel_type = IC7020_G2_H_PTN;
745#elif defined(CONFIG_TOUCH_REG_MAP_TM2372)
746 ts->ic_panel_type = IC7020_GFF_H_PTN;
747#endif
748
749 if (ts->pdata->pwr->use_regulator) {
750 ts->regulator_vdd =
751 regulator_get_exclusive(NULL, ts->pdata->pwr->vdd);
752 if (IS_ERR(ts->regulator_vdd)) {
753 TOUCH_ERR_MSG("FAIL: regulator_get_vdd - %s\n",
754 ts->pdata->pwr->vdd);
755 ret = -EPERM;
756 goto err_get_vdd_failed;
757 }
758
759 ts->regulator_vio = regulator_get_exclusive(NULL,
760 ts->pdata->pwr->vio);
761 if (IS_ERR(ts->regulator_vio)) {
762 TOUCH_ERR_MSG("FAIL: regulator_get_vio - %s\n",
763 ts->pdata->pwr->vio);
764 ret = -EPERM;
765 goto err_get_vio_failed;
766 }
767
768 if (ts->pdata->pwr->vdd_voltage > 0) {
769 ret = regulator_set_voltage(ts->regulator_vdd,
770 ts->pdata->pwr->vdd_voltage,
771 ts->pdata->pwr->vdd_voltage);
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700772 if (ret < 0) {
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700773 TOUCH_ERR_MSG("FAIL: VDD voltage setting"
774 " - (%duV)\n",
775 ts->pdata->pwr->vdd_voltage);
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700776 ret = -EPERM;
777 goto err_set_voltage;
778 }
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700779 }
780
781 if (ts->pdata->pwr->vio_voltage > 0) {
782 ret = regulator_set_voltage(ts->regulator_vio,
783 ts->pdata->pwr->vio_voltage,
784 ts->pdata->pwr->vio_voltage);
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700785 if (ret < 0) {
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700786 TOUCH_ERR_MSG("FAIL: VIO voltage setting"
787 " - (%duV)\n",
788 ts->pdata->pwr->vio_voltage);
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700789 ret = -EPERM;
790 goto err_set_voltage;
791 }
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700792 }
793 }
794
795 return ret;
796
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700797err_set_voltage:
798 if (ts->pdata->pwr->use_regulator) {
799 regulator_put(ts->regulator_vio);
800 }
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700801err_get_vio_failed:
802 if (ts->pdata->pwr->use_regulator) {
803 regulator_put(ts->regulator_vdd);
804 }
805err_get_vdd_failed:
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700806 kfree(ts);
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700807err_alloc_data_failed:
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700808 return ret;
809}
810
811void synaptics_ts_remove(struct i2c_client* client)
812{
813 struct synaptics_ts_data* ts =
814 (struct synaptics_ts_data*)get_touch_handle(client);
815
816 if (touch_debug_mask & DEBUG_TRACE)
817 TOUCH_DEBUG_MSG("\n");
818
819 if (ts->pdata->pwr->use_regulator) {
820 regulator_put(ts->regulator_vio);
821 regulator_put(ts->regulator_vdd);
822 }
823
824 kfree(ts);
825}
826
827int synaptics_ts_fw_upgrade(struct i2c_client* client, const char* fw_path)
828{
829 struct synaptics_ts_data* ts =
830 (struct synaptics_ts_data*)get_touch_handle(client);
831 int ret = 0;
832
833 ts->is_probed = 0;
834
835 ret = FirmwareUpgrade(ts, fw_path);
836
837 /* update IC info */
838 get_ic_info(ts, ts->fw_info);
839
840 return ret;
841}
842
843int synaptics_ts_ic_ctrl(struct i2c_client *client, u8 code, u16 value)
844{
845 struct synaptics_ts_data* ts =
846 (struct synaptics_ts_data*)get_touch_handle(client);
847 u8 buf = 0;
848
849 switch (code) {
850 case IC_CTRL_BASELINE:
851 switch (value) {
852 case BASELINE_OPEN:
Jongrak Kwon420825a2012-06-26 16:33:25 -0700853 if (!ts->analog_dsc.id) /* If not supported, ignore */
854 break;
855
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700856#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
857 if (unlikely(touch_i2c_write_byte(client,
858 PAGE_SELECT_REG, 0x01) < 0)) {
859 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
860 return -EIO;
861 }
862
863 if (unlikely(touch_i2c_write_byte(client,
864 ANALOG_CONTROL_REG,
865 FORCE_FAST_RELAXATION) < 0)) {
866 TOUCH_ERR_MSG("ANALOG_CONTROL_REG write fail\n");
867 return -EIO;
868 }
869
870 msleep(10);
871
872 if (unlikely(touch_i2c_write_byte(client,
873 ANALOG_COMMAND_REG,
874 FORCE_UPDATE) < 0)) {
875 TOUCH_ERR_MSG("force fast relaxation command write fail\n");
876 return -EIO;
877 }
878
879 if (unlikely(touch_i2c_write_byte(client,
880 PAGE_SELECT_REG, 0x00) < 0)) {
881 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
882 return -EIO;
883 }
884
885 if (unlikely(touch_debug_mask & DEBUG_GHOST))
886 TOUCH_INFO_MSG("BASELINE_OPEN ~~~~~~~~\n");
887#else
888 if (unlikely(touch_i2c_write_byte(client,
889 MELT_CONTROL_REG,
890 MELT_CONTROL_MELT) < 0)) {
891 TOUCH_ERR_MSG("MELT_CONTROL_REG write fail\n");
892 return -EIO;
893 }
894#endif
895 break;
896 case BASELINE_FIX:
Jongrak Kwon420825a2012-06-26 16:33:25 -0700897 if (!ts->analog_dsc.id) /* If not supported, ignore */
898 break;
899
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700900#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, 0x0) < 0)) {
909 TOUCH_ERR_MSG("ANALOG_CONTROL_REG write fail\n");
910 return -EIO;
911 }
912
913 msleep(10);
914
915 if (unlikely(touch_i2c_write_byte(client,
916 ANALOG_COMMAND_REG,
917 FORCE_UPDATE) < 0)) {
918 TOUCH_ERR_MSG("force fast relaxation command write fail\n");
919 return -EIO;
920 }
921
922 if (unlikely(touch_i2c_write_byte(client,
923 PAGE_SELECT_REG, 0x00) < 0)) {
924 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
925 return -EIO;
926 }
927
928 if (unlikely(touch_debug_mask & DEBUG_GHOST))
929 TOUCH_INFO_MSG("BASELINE_FIX ~~~~~~~~\n");
930#else
931 if (unlikely(touch_i2c_write_byte(client,
932 MELT_CONTROL_REG,
933 MELT_CONTROL_NO_MELT) < 0)) {
934 TOUCH_ERR_MSG("MELT_CONTROL_REG write fail\n");
935 return -EIO;
936 }
937#endif
938 break;
939 case BASELINE_REBASE:
940 /* rebase base line */
941 if (likely(ts->finger_dsc.id != 0)) {
942 if (unlikely(touch_i2c_write_byte(client,
943 FINGER_COMMAND_REG, 0x1) < 0)) {
944 TOUCH_ERR_MSG("finger baseline reset "
945 "command write fail\n");
946 return -EIO;
947 }
948 }
949
950#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
951/* do nothing */
952#else
953 if (unlikely(ts->button_dsc.id != 0)) {
954 if (unlikely(touch_i2c_write_byte(client,
955 BUTTON_COMMAND_REG, 0x1) < 0)) {
956 TOUCH_ERR_MSG("finger baseline reset "
957 "command write fail\n");
958 return -EIO;
959 }
960 }
961#endif
962 break;
963 default:
964 break;
965 }
966 break;
967 case IC_CTRL_READ:
Jongrak Kwon9ed2a932012-06-19 23:38:02 -0700968#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
969 if (unlikely(touch_i2c_write_byte(client,
970 PAGE_SELECT_REG, ((value & 0xFF00) >> 8)) < 0)) {
971 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
972 return -EIO;
973 }
974
975 if (touch_i2c_read(client, (value & 0xFF), 1, &buf) < 0) {
976 TOUCH_ERR_MSG("IC register read fail\n");
977 return -EIO;
978 }
979
980 if (unlikely(touch_i2c_write_byte(client,
981 PAGE_SELECT_REG, 0x00) < 0)) {
982 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
983 return -EIO;
984 }
985#else
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700986 if (touch_i2c_read(client, value, 1, &buf) < 0) {
987 TOUCH_ERR_MSG("IC register read fail\n");
988 return -EIO;
989 }
Jongrak Kwon9ed2a932012-06-19 23:38:02 -0700990#endif
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700991 break;
992 case IC_CTRL_WRITE:
Jongrak Kwon9ed2a932012-06-19 23:38:02 -0700993#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
994 if (unlikely(touch_i2c_write_byte(client,
995 PAGE_SELECT_REG, ((value & 0xFF0000) >> 16)) < 0)) {
996 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
997 return -EIO;
998 }
999
Jongrak Kwonae680ab2012-06-15 22:06:54 -07001000 if (touch_i2c_write_byte(client,
1001 ((value & 0xFF00) >> 8), (value & 0xFF)) < 0) {
1002 TOUCH_ERR_MSG("IC register write fail\n");
1003 return -EIO;
1004 }
Jongrak Kwon9ed2a932012-06-19 23:38:02 -07001005
1006 if (unlikely(touch_i2c_write_byte(client,
1007 PAGE_SELECT_REG, 0x00) < 0)) {
1008 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
1009 return -EIO;
1010 }
1011#else
1012 if (touch_i2c_write_byte(client,
1013 ((value & 0xFF00) >> 8), (value & 0xFF)) < 0) {
1014 TOUCH_ERR_MSG("IC register write fail\n");
1015 return -EIO;
1016 }
1017#endif
Jongrak Kwonae680ab2012-06-15 22:06:54 -07001018 break;
1019 case IC_CTRL_RESET_CMD:
1020 if (unlikely(touch_i2c_write_byte(client,
1021 DEVICE_COMMAND_REG, 0x1) < 0)) {
1022 TOUCH_ERR_MSG("IC Reset command write fail\n");
1023 return -EIO;
1024 }
1025 break;
1026 default:
1027 break;
1028 }
1029
1030 return buf;
1031}
1032
1033int synaptics_ts_fw_upgrade_check(struct lge_touch_data *ts)
1034{
Jongrak Kwon8c0f1692012-07-16 19:01:35 -07001035 if (ts->fw_info.fw_force_rework || ts->fw_upgrade.fw_force_upgrade) {
Jongrak Kwonae680ab2012-06-15 22:06:54 -07001036 TOUCH_INFO_MSG("FW-upgrade Force Rework.\n");
1037 } else {
Jongrak Kwon8c0f1692012-07-16 19:01:35 -07001038 if (((int)simple_strtoul(&ts->fw_info.fw_version[1], NULL, 10) >= (int)simple_strtoul(&ts->fw_info.fw_image_version[1], NULL, 10))) {
1039 TOUCH_INFO_MSG("DO NOT UPDATE 7020 G2 H " "pattern FW-upgrade is not executed\n");
Jongrak Kwonae680ab2012-06-15 22:06:54 -07001040 return -1;
Jongrak Kwonae680ab2012-06-15 22:06:54 -07001041 } else {
Jongrak Kwon8c0f1692012-07-16 19:01:35 -07001042 TOUCH_INFO_MSG("7020 G2 H pattern FW-upgrade " "is executed\n");
Jongrak Kwonae680ab2012-06-15 22:06:54 -07001043 }
1044 }
Jongrak Kwonae680ab2012-06-15 22:06:54 -07001045
1046 return 0;
1047}
1048
1049struct touch_device_driver synaptics_ts_driver = {
1050 .probe = synaptics_ts_probe,
1051 .remove = synaptics_ts_remove,
1052 .init = synaptics_ts_init,
1053 .data = synaptics_ts_get_data,
1054 .power = synaptics_ts_power,
1055 .fw_upgrade = synaptics_ts_fw_upgrade,
1056 .ic_ctrl = synaptics_ts_ic_ctrl,
1057 .fw_upgrade_check = synaptics_ts_fw_upgrade_check,
1058};
1059
1060static int __devinit touch_init(void)
1061{
1062 if (touch_debug_mask & DEBUG_TRACE)
1063 TOUCH_DEBUG_MSG("\n");
1064
1065 return touch_driver_register(&synaptics_ts_driver);
1066}
1067
1068static void __exit touch_exit(void)
1069{
1070 if (touch_debug_mask & DEBUG_TRACE)
1071 TOUCH_DEBUG_MSG("\n");
1072
1073 touch_driver_unregister();
1074}
1075
1076module_init(touch_init);
1077module_exit(touch_exit);
1078
1079MODULE_AUTHOR("yehan.ahn@lge.com, hyesung.shin@lge.com");
1080MODULE_DESCRIPTION("LGE Touch Driver");
1081MODULE_LICENSE("GPL");
1082