blob: 53961f44be8bef177f9a6b49ecd85bf2533caa83 [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 Kwon5b6082d2012-09-01 03:50:16 -0700157#define CHARGER_CONNECTED 0x20
158
Jongrak Kwon7d8e1a22012-09-11 22:56:51 -0700159static inline int get_highest_id(u32 fs)
160{
161 int id = 10;
162 int tmp = 0x000C0000;
163 while(!(fs & tmp)) {
164 id--;
165 tmp >>= 2;
166 }
167 return id;
168}
169
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700170int synaptics_ts_get_data(struct i2c_client *client, struct t_data* data,
171 struct b_data* button, u8* total_num)
172{
173 struct synaptics_ts_data* ts =
174 (struct synaptics_ts_data*)get_touch_handle(client);
175
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700176 u32 finger_status=0;
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700177 u8 id=0;
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700178 u8 cnt;
179
180 if (unlikely(touch_debug_mask & DEBUG_TRACE))
181 TOUCH_DEBUG_MSG("\n");
182
183 if (unlikely(touch_i2c_read(client, DEVICE_STATUS_REG,
Jongrak Kwon5297b722012-06-22 11:18:36 -0700184 sizeof(ts->ts_data.device_status_reg),
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700185 &ts->ts_data.device_status_reg) < 0)) {
186 TOUCH_ERR_MSG("DEVICE_STATUS_REG read fail\n");
187 goto err_synaptics_getdata;
188 }
189
190 /* ESD damage check */
191 if ((ts->ts_data.device_status_reg & DEVICE_FAILURE_MASK) ==
192 DEVICE_FAILURE_MASK) {
193 TOUCH_ERR_MSG("ESD damage occured. Reset Touch IC\n");
194 goto err_synaptics_device_damage;
195 }
196
197 /* Internal reset check */
198 if (((ts->ts_data.device_status_reg & DEVICE_STATUS_UNCONFIGURED) >> 7) == 1) {
199 TOUCH_ERR_MSG("Touch IC resetted internally. "
200 "Reconfigure register setting\n");
201 goto err_synaptics_device_damage;
202 }
203
204 if (unlikely(touch_i2c_read(client, INTERRUPT_STATUS_REG,
205 sizeof(ts->ts_data.interrupt_status_reg),
206 &ts->ts_data.interrupt_status_reg) < 0)) {
207 TOUCH_ERR_MSG("INTERRUPT_STATUS_REG read fail\n");
208 goto err_synaptics_getdata;
209 }
210
211 if (unlikely(touch_debug_mask & DEBUG_GET_DATA))
212 TOUCH_INFO_MSG("Interrupt_status : 0x%x\n",
213 ts->ts_data.interrupt_status_reg);
214
215 /* IC bug Exception handling - Interrupt status reg is 0 when interrupt occur */
216 if (ts->ts_data.interrupt_status_reg == 0) {
Jongrak Kwonecef32b2012-08-29 13:58:51 -0700217 TOUCH_ERR_MSG("Interrupt_status reg is 0. -> ignore\n");
218 goto err_synaptics_ignore;
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700219 }
220
221 /* Because of ESD damage... */
222 if (unlikely(ts->ts_data.interrupt_status_reg & ts->interrupt_mask.flash)) {
223 TOUCH_ERR_MSG("Impossible Interrupt\n");
224 goto err_synaptics_device_damage;
225 }
226
227 /* Finger */
228 if (likely(ts->ts_data.interrupt_status_reg & ts->interrupt_mask.abs)) {
229 if (unlikely(touch_i2c_read(client, FINGER_STATE_REG,
230 sizeof(ts->ts_data.finger.finger_status_reg),
231 ts->ts_data.finger.finger_status_reg) < 0)) {
232 TOUCH_ERR_MSG("FINGER_STATE_REG read fail\n");
233 goto err_synaptics_getdata;
234 }
235
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700236 finger_status = ts->ts_data.finger.finger_status_reg[0] |
237 ts->ts_data.finger.finger_status_reg[1] << 8 |
238 (ts->ts_data.finger.finger_status_reg[2] & 0xF) << 16;
239
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700240 if (unlikely(touch_debug_mask & DEBUG_GET_DATA)) {
241 TOUCH_INFO_MSG("Finger_status : 0x%x, 0x%x, 0x%x\n",
242 ts->ts_data.finger.finger_status_reg[0],
243 ts->ts_data.finger.finger_status_reg[1],
244 ts->ts_data.finger.finger_status_reg[2]);
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700245 TOUCH_INFO_MSG("Touch_bit_mask: 0x%x\n", finger_status);
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700246 }
247
Jongrak Kwon7d8e1a22012-09-11 22:56:51 -0700248 if (finger_status) {
249 int max_id = get_highest_id(finger_status);
250 if (unlikely(touch_i2c_read(ts->client,
251 FINGER_DATA_REG_START,
252 NUM_OF_EACH_FINGER_DATA_REG * max_id,
253 ts->ts_data.finger.finger_reg[0]) < 0)) {
254 TOUCH_ERR_MSG("FINGER_STATE_REG read fail\n");
255 goto err_synaptics_getdata;
256 }
257 }
258
Jongrak Kwon8c0f1692012-07-16 19:01:35 -0700259 for (id = 0; id < ts->pdata->caps->max_id; id++) {
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700260 switch (((finger_status >> (id*2)) & 0x3)) {
261 case FINGER_STATE_PRESENT_VALID:
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700262 data[id].state = ABS_PRESS;
263 data[id].x_position = TS_SNTS_GET_X_POSITION(
264 ts->ts_data.finger.finger_reg[id][REG_X_POSITION],
265 ts->ts_data.finger.finger_reg[id][REG_YX_POSITION]);
266 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]);
267 data[id].width_major = TS_SNTS_GET_WIDTH_MAJOR(ts->ts_data.finger.finger_reg[id][REG_WY_WX]);
268 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 -0700269 data[id].tool_type = MT_TOOL_FINGER;
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700270 data[id].width_orientation = TS_SNTS_GET_ORIENTATION(ts->ts_data.finger.finger_reg[id][REG_WY_WX]);
271 data[id].pressure = TS_SNTS_GET_PRESSURE(ts->ts_data.finger.finger_reg[id][REG_Z]);
272
273 if (unlikely(touch_debug_mask & DEBUG_GET_DATA))
274 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 -0700275 id,
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700276 data[id].x_position,
277 data[id].y_position,
278 data[id].width_major,
279 data[id].width_minor,
280 data[id].width_orientation,
281 data[id].pressure);
282 (*total_num)++;
283 break;
284
285 case FINGER_STATE_NO_PRESENT:
286 if (data[id].state == ABS_PRESS)
287 data[id].state = ABS_RELEASE;
288 break;
289
290 default:
291 /* Do nothing including inacurate data */
292 break;
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700293 }
294
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700295 }
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700296 if (unlikely(touch_debug_mask & DEBUG_GET_DATA))
297 TOUCH_INFO_MSG("Total_num: %d\n", *total_num);
298 }
299
300 /* Button */
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700301 if ((ts->button_dsc.id != 0) && (ts->ts_data.interrupt_status_reg &
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700302 ts->interrupt_mask.button)) {
303
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700304 if (unlikely(touch_i2c_write_byte(client,
305 PAGE_SELECT_REG, 0x02) < 0)) {
306 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
307 return -EIO;
308 }
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700309
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700310 if (unlikely(touch_i2c_read(client, BUTTON_DATA_REG,
311 sizeof(ts->ts_data.button_data_reg),
312 &ts->ts_data.button_data_reg) < 0)) {
313 TOUCH_ERR_MSG("BUTTON_DATA_REG read fail\n");
314 goto err_synaptics_getdata;
315 }
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700316
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700317 if (unlikely(touch_i2c_write_byte(client,
318 PAGE_SELECT_REG, 0x00) < 0)) {
319 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
320 return -EIO;
321 }
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700322
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700323 if (unlikely(touch_debug_mask & DEBUG_BUTTON))
324 TOUCH_DEBUG_MSG("Button register: 0x%x\n",
325 ts->ts_data.button_data_reg);
326
327 if (ts->ts_data.button_data_reg) {
328 /* pressed - find first one */
329 for (cnt = 0; cnt < ts->pdata->caps->number_of_button; cnt++) {
330 if ((ts->ts_data.button_data_reg >> cnt) & 1)
331 {
332 ts->ts_data.button.key_code =
333 ts->pdata->caps->button_name[cnt];
334 button->key_code =
335 ts->ts_data.button.key_code;
336 button->state = 1;
337 break;
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700338 }
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700339 }
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700340 } else {
341 /* release */
342 button->key_code = ts->ts_data.button.key_code;
343 button->state = 0;
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700344 }
345 }
346
347 return 0;
348
349err_synaptics_device_damage:
350err_synaptics_getdata:
351 return -EIO;
Jongrak Kwonecef32b2012-08-29 13:58:51 -0700352err_synaptics_ignore:
353 return -EINVAL;
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700354}
355
356static int read_page_description_table(struct i2c_client* client)
357{
358 struct synaptics_ts_data* ts =
359 (struct synaptics_ts_data*)get_touch_handle(client);
360 struct ts_function_descriptor buffer;
361 unsigned short u_address;
362
363 if (touch_debug_mask & DEBUG_TRACE)
364 TOUCH_DEBUG_MSG("\n");
365
366 memset(&buffer, 0x0, sizeof(struct ts_function_descriptor));
367
368 ts->common_dsc.id = 0;
369 ts->finger_dsc.id = 0;
370 ts->button_dsc.id = 0;
371 ts->flash_dsc.id = 0;
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700372 ts->analog_dsc.id = 0;
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700373
374 for (u_address = DESCRIPTION_TABLE_START; u_address > 10;
375 u_address -= sizeof(struct ts_function_descriptor)) {
376 if (unlikely(touch_i2c_read(client, u_address, sizeof(buffer),
377 (unsigned char *)&buffer) < 0)) {
378 TOUCH_ERR_MSG("RMI4 Function Descriptor read fail\n");
379 return -EIO;
380 }
381
382 if (buffer.id == 0)
383 break;
384
385 switch (buffer.id) {
386 case RMI_DEVICE_CONTROL:
387 ts->common_dsc = buffer;
388 break;
389 case TOUCHPAD_SENSORS:
390 ts->finger_dsc = buffer;
391 break;
392 case FLASH_MEMORY_MANAGEMENT:
393 ts->flash_dsc = buffer;
Jongrak Kwon420825a2012-06-26 16:33:25 -0700394 break;
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700395 }
396 }
397
398#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
399 if (unlikely(touch_i2c_write_byte(client, PAGE_SELECT_REG, 0x01) < 0)) {
400 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
401 return -EIO;
402 }
403
Jongrak Kwon420825a2012-06-26 16:33:25 -0700404 if (unlikely(touch_i2c_read(client, ANALOG_TABLE_START, sizeof(buffer), (unsigned char *)&buffer) < 0)) {
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700405 TOUCH_ERR_MSG("RMI4 Function Descriptor read fail\n");
406 return -EIO;
407 }
408
Jongrak Kwon420825a2012-06-26 16:33:25 -0700409 if (buffer.id == ANALOG_CONTROL) {
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700410 ts->analog_dsc = buffer;
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700411 }
412
413 if (unlikely(touch_i2c_write_byte(client, PAGE_SELECT_REG, 0x02) < 0)) {
414 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
415 return -EIO;
416 }
417
Jongrak Kwon420825a2012-06-26 16:33:25 -0700418 if (unlikely(touch_i2c_read(ts->client, BUTTON_TABLE_START, sizeof(buffer), (unsigned char *)&buffer))) {
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700419 TOUCH_ERR_MSG("Button ts_function_descriptor read fail\n");
420 return -EIO;
421 }
422
Jongrak Kwon420825a2012-06-26 16:33:25 -0700423 if (buffer.id == CAPACITIVE_BUTTON_SENSORS)
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700424 ts->button_dsc = buffer;
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700425
426 if (unlikely(touch_i2c_write_byte(client, PAGE_SELECT_REG, 0x00) < 0)) {
427 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
428 return -EIO;
429 }
430#endif
431
432 /* set interrupt mask */
433 ts->interrupt_mask.flash = 0x1;
434 ts->interrupt_mask.status = 0x2;
435
436 if (ts->button_dsc.id == 0) {
437 ts->interrupt_mask.abs = 0x4;
438 } else {
439 if (ts->finger_dsc.data_base > ts->button_dsc.data_base) {
440#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
441 ts->interrupt_mask.abs = 0x4;
442 ts->interrupt_mask.button = 0x20;
443#else
444 ts->interrupt_mask.abs = 0x8;
445 ts->interrupt_mask.button = 0x4;
446#endif
447 } else {
448 ts->interrupt_mask.abs = 0x4;
449 ts->interrupt_mask.button = 0x8;
450 }
451 }
452
453 if (ts->common_dsc.id == 0 || ts->finger_dsc.id == 0 ||
454 ts->flash_dsc.id == 0) {
455 TOUCH_ERR_MSG("common_dsc/finger_dsc/flash_dsc are not initiailized\n");
456 return -EPERM;
457 }
458
459 if (touch_debug_mask & DEBUG_BASE_INFO)
460 TOUCH_INFO_MSG("common[%d] finger[%d] flash[%d] button[%d]\n",
461 ts->common_dsc.id, ts->finger_dsc.id,
462 ts->flash_dsc.id, ts->button_dsc.id);
463
464 return 0;
465}
466
467int get_ic_info(struct synaptics_ts_data* ts, struct touch_fw_info* fw_info)
468{
469#if defined(ARRAYED_TOUCH_FW_BIN)
470 int cnt;
471#endif
472 u8 device_status = 0;
473 u8 flash_control = 0;
474
475 read_page_description_table(ts->client);
476
477 memset(fw_info, 0, sizeof(fw_info));
478
479 if (unlikely(touch_i2c_read(ts->client, FW_REVISION_REG,
480 sizeof(fw_info->fw_rev), &fw_info->fw_rev) < 0)) {
481 TOUCH_ERR_MSG("FW_REVISION_REG read fail\n");
482 return -EIO;
483 }
484
485 if (unlikely(touch_i2c_read(ts->client, MANUFACTURER_ID_REG,
486 sizeof(fw_info->manufacturer_id),
487 &fw_info->manufacturer_id) < 0)) {
488 TOUCH_ERR_MSG("MANUFACTURER_ID_REG read fail\n");
489 return -EIO;
490 }
491
492 if (unlikely(touch_i2c_read(ts->client, PRODUCT_ID_REG,
493 sizeof(fw_info->product_id) - 1,
494 fw_info->product_id) < 0)) {
495 TOUCH_ERR_MSG("PRODUCT_ID_REG read fail\n");
496 return -EIO;
497 }
498
499 if (unlikely(touch_i2c_read(ts->client, FW_VERSION,
500 sizeof(fw_info->fw_version) - 1,
501 fw_info->fw_version) < 0)) {
502 TOUCH_ERR_MSG("FW_VERSION read fail\n");
503 return -EIO;
504 }
505
Jongrak Kwon8c0f1692012-07-16 19:01:35 -0700506 ts->ic_panel_type = IC7020_G2_H_PTN;
Jongrak Kwonecef32b2012-08-29 13:58:51 -0700507 TOUCH_INFO_MSG("IC is 7020, H pattern, panel is G2, Firmware: %s.", fw_info->fw_version);
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700508
509#if defined(ARRAYED_TOUCH_FW_BIN)
510 for (cnt = 0; cnt < sizeof(SynaFirmware)/sizeof(SynaFirmware[0]); cnt++) {
511 strncpy(fw_info->fw_image_product_id,
Jongrak Kwon8c0f1692012-07-16 19:01:35 -0700512 &SynaFirmware[cnt][FW_OFFSET_PRODUCT_ID], 10);
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700513 if (!(strncmp(fw_info->product_id,
514 fw_info->fw_image_product_id, 10)))
515 break;
516 }
517 fw_info->fw_start = (unsigned char *)&SynaFirmware[cnt][0];
518 fw_info->fw_size = sizeof(SynaFirmware[0]);
519#else
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700520 fw_info->fw_start = (unsigned char *)&SynaFirmware[0];
521 fw_info->fw_size = sizeof(SynaFirmware);
522#endif
523
Jongrak Kwon8c0f1692012-07-16 19:01:35 -0700524 strncpy(fw_info->fw_image_product_id,
525 &fw_info->fw_start[FW_OFFSET_PRODUCT_ID], 10);
526 strncpy(fw_info->fw_image_version,
527 &fw_info->fw_start[FW_OFFSET_IMAGE_VERSION],4);
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700528
529 if (unlikely(touch_i2c_read(ts->client, FLASH_CONTROL_REG,
530 sizeof(flash_control), &flash_control) < 0)) {
531 TOUCH_ERR_MSG("FLASH_CONTROL_REG read fail\n");
532 return -EIO;
533 }
534
535 if (unlikely(touch_i2c_read(ts->client, DEVICE_STATUS_REG,
536 sizeof(device_status), &device_status) < 0)) {
537 TOUCH_ERR_MSG("DEVICE_STATUS_REG read fail\n");
538 return -EIO;
539 }
540
541 /* Firmware has a problem, so we should firmware-upgrade */
542 if (device_status & DEVICE_STATUS_FLASH_PROG
543 || (device_status & DEVICE_CRC_ERROR_MASK) != 0
544 || (flash_control & FLASH_STATUS_MASK) != 0) {
545 TOUCH_ERR_MSG("Firmware has a unknown-problem, "
546 "so it needs firmware-upgrade.\n");
547 TOUCH_ERR_MSG("FLASH_CONTROL[%x] DEVICE_STATUS_REG[%x]\n",
548 (u32)flash_control, (u32)device_status);
549
550 fw_info->fw_rev = 0;
551#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
552 fw_info->fw_force_rework = true;
553#endif
554 }
555
556 ts->fw_info = fw_info;
557
558 return 0;
559}
560
561int synaptics_ts_init(struct i2c_client* client, struct touch_fw_info* fw_info)
562{
563 struct synaptics_ts_data* ts =
564 (struct synaptics_ts_data*)get_touch_handle(client);
Jongrak Kwon9ed2a932012-06-19 23:38:02 -0700565 struct lge_touch_data *lg_ts =
566 (struct lge_touch_data *) i2c_get_clientdata(client);
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700567 u8 buf;
568
569 if (touch_debug_mask & DEBUG_TRACE)
570 TOUCH_DEBUG_MSG("\n");
571
572 if (!ts->is_probed)
573 if (unlikely(get_ic_info(ts, fw_info) < 0))
574 return -EIO;
575
576 if (unlikely(touch_i2c_write_byte(client, DEVICE_CONTROL_REG,
Jongrak Kwon5b6082d2012-09-01 03:50:16 -0700577 DEVICE_CONTROL_NOSLEEP | DEVICE_CONTROL_CONFIGURED |
578 (lg_ts->charger_type ? CHARGER_CONNECTED : 0)) < 0)) {
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700579 TOUCH_ERR_MSG("DEVICE_CONTROL_REG write fail\n");
580 return -EIO;
581 }
582
583 if (unlikely(touch_i2c_read(client, INTERRUPT_ENABLE_REG,
584 1, &buf) < 0)) {
585 TOUCH_ERR_MSG("INTERRUPT_ENABLE_REG read fail\n");
586 return -EIO;
587 }
Jongrak Kwon9ed2a932012-06-19 23:38:02 -0700588
589 if (!lg_ts->pdata->caps->button_support) {
590 buf &= ~ts->interrupt_mask.button;
591 ts->interrupt_mask.button = 0;
592 }
593
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700594 if (unlikely(touch_i2c_write_byte(client, INTERRUPT_ENABLE_REG,
595 buf | ts->interrupt_mask.abs | ts->interrupt_mask.button) < 0)) {
596 TOUCH_ERR_MSG("INTERRUPT_ENABLE_REG write fail\n");
597 return -EIO;
598 }
599
600#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
Jongrak Kwonef6ce3c2012-08-28 00:01:59 -0700601 if (unlikely(touch_i2c_read(client, TWO_D_REPORTING_MODE, 1, &buf) < 0)) {
602 TOUCH_ERR_MSG("TWO_D_REPORTING_MODE read fail\n");
603 return -EIO;
604 }
605
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700606 if (ts->pdata->role->report_mode == CONTINUOUS_REPORT_MODE) {
607 if (unlikely(touch_i2c_write_byte(client, TWO_D_REPORTING_MODE,
Jongrak Kwonef6ce3c2012-08-28 00:01:59 -0700608 (buf & ~7) | REPORT_MODE_CONTINUOUS) < 0)) {
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700609 TOUCH_ERR_MSG("TWO_D_REPORTING_MODE write fail\n");
610 return -EIO;
611 }
612 } else { /* REDUCED_REPORT_MODE */
613 if (unlikely(touch_i2c_write_byte(client, TWO_D_REPORTING_MODE,
Jongrak Kwonef6ce3c2012-08-28 00:01:59 -0700614 (buf & ~7) | REPORT_MODE_REDUCED) < 0)) {
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700615 TOUCH_ERR_MSG("TWO_D_REPORTING_MODE write fail\n");
616 return -EIO;
617 }
Jongrak Kwon9ed2a932012-06-19 23:38:02 -0700618
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700619 if (unlikely(touch_i2c_write_byte(client, DELTA_X_THRESH_REG,
620 ts->pdata->role->delta_pos_threshold) < 0)) {
621 TOUCH_ERR_MSG("DELTA_X_THRESH_REG write fail\n");
622 return -EIO;
623 }
624 if (unlikely(touch_i2c_write_byte(client, DELTA_Y_THRESH_REG,
625 ts->pdata->role->delta_pos_threshold) < 0)) {
626 TOUCH_ERR_MSG("DELTA_Y_THRESH_REG write fail\n");
627 return -EIO;
628 }
629 }
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700630#else
631 if (unlikely(touch_i2c_write_byte(client,
632 GESTURE_ENABLE_1_REG, 0x00) < 0)) {
633 TOUCH_ERR_MSG("GESTURE_ENABLE_1_REG write fail\n");
634 return -EIO;
635 }
636 if (unlikely(touch_i2c_write_byte(client, GESTURE_ENABLE_2_REG, 0x00) < 0)) {
637 TOUCH_ERR_MSG("GESTURE_ENABLE_2_REG write fail\n");
638 return -EIO;
639 }
640
Jongrak Kwonef6ce3c2012-08-28 00:01:59 -0700641 if (unlikely(touch_i2c_read(client, TWO_D_REPORTING_MODE, 1, &buf) < 0)) {
642 TOUCH_ERR_MSG("TWO_D_REPORTING_MODE read fail\n");
643 return -EIO;
644 }
645
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700646 if (ts->pdata->role->report_mode == CONTINUOUS_REPORT_MODE) {
647 if (unlikely(touch_i2c_write_byte(client, TWO_D_REPORTING_MODE,
Jongrak Kwonef6ce3c2012-08-28 00:01:59 -0700648 (buf & ~7) | REPORT_MODE_CONTINUOUS) < 0)) {
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700649 TOUCH_ERR_MSG("TWO_D_REPORTING_MODE write fail\n");
650 return -EIO;
651 }
652 } else { /* REDUCED_REPORT_MODE */
653 if (unlikely(touch_i2c_write_byte(client, TWO_D_REPORTING_MODE,
Jongrak Kwonef6ce3c2012-08-28 00:01:59 -0700654 (buf & ~7) | REPORT_MODE_REDUCED) < 0)) {
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700655 TOUCH_ERR_MSG("TWO_D_REPORTING_MODE write fail\n");
656 return -EIO;
657 }
658
659 if (unlikely(touch_i2c_write_byte(client, DELTA_X_THRESH_REG,
660 ts->pdata->role->delta_pos_threshold) < 0)) {
661 TOUCH_ERR_MSG("DELTA_X_THRESH_REG write fail\n");
662 return -EIO;
663 }
664 if (unlikely(touch_i2c_write_byte(client, DELTA_Y_THRESH_REG,
665 ts->pdata->role->delta_pos_threshold) < 0)) {
666 TOUCH_ERR_MSG("DELTA_Y_THRESH_REG write fail\n");
667 return -EIO;
668 }
669 }
670#endif
671
672 if (unlikely(touch_i2c_read(client, INTERRUPT_STATUS_REG, 1, &buf) < 0)) {
673 TOUCH_ERR_MSG("INTERRUPT_STATUS_REG read fail\n");
674 return -EIO; /* it is critical problem because interrupt will not occur. */
675 }
676
677 if (unlikely(touch_i2c_read(client, FINGER_STATE_REG,
678 sizeof(ts->ts_data.finger.finger_status_reg),
679 ts->ts_data.finger.finger_status_reg) < 0)) {
680 TOUCH_ERR_MSG("FINGER_STATE_REG read fail\n");
681 /* it is critical problem because interrupt will not occur on some FW. */
682 return -EIO;
683 }
684
685 ts->is_probed = 1;
686
687 return 0;
688}
689
690int synaptics_ts_power(struct i2c_client* client, int power_ctrl)
691{
692 struct synaptics_ts_data* ts =
693 (struct synaptics_ts_data*)get_touch_handle(client);
Jongrak Kwon5b6082d2012-09-01 03:50:16 -0700694 struct lge_touch_data *lg_ts =
695 (struct lge_touch_data *) i2c_get_clientdata(client);
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700696
697 if (touch_debug_mask & DEBUG_TRACE)
698 TOUCH_DEBUG_MSG("\n");
699
700 switch (power_ctrl) {
701 case POWER_OFF:
ks.kwon22c5f0b2012-08-07 13:50:18 +0900702 if (ts->pdata->reset_pin > 0)
703 gpio_set_value(ts->pdata->reset_pin, 0);
704
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700705 if (ts->pdata->pwr->use_regulator) {
706 regulator_disable(ts->regulator_vio);
707 regulator_disable(ts->regulator_vdd);
708 }
709 else
710 ts->pdata->pwr->power(0);
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700711 break;
712 case POWER_ON:
713 if (ts->pdata->pwr->use_regulator) {
714 regulator_enable(ts->regulator_vdd);
715 regulator_enable(ts->regulator_vio);
716 }
717 else
718 ts->pdata->pwr->power(1);
719
ks.kwon22c5f0b2012-08-07 13:50:18 +0900720 if (ts->pdata->reset_pin > 0)
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700721 gpio_set_value(ts->pdata->reset_pin, 1);
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700722 break;
723 case POWER_SLEEP:
724 if (unlikely(touch_i2c_write_byte(client, DEVICE_CONTROL_REG,
Jongrak Kwon5b6082d2012-09-01 03:50:16 -0700725 DEVICE_CONTROL_SLEEP |
726 (lg_ts->charger_type ? CHARGER_CONNECTED : 0) |
727 DEVICE_CONTROL_CONFIGURED) < 0)) {
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700728 TOUCH_ERR_MSG("DEVICE_CONTROL_REG write fail\n");
729 return -EIO;
730 }
731 break;
732 case POWER_WAKE:
733 if (unlikely(touch_i2c_write_byte(client, DEVICE_CONTROL_REG,
Jongrak Kwon5b6082d2012-09-01 03:50:16 -0700734 DEVICE_CONTROL_SPECIFIC |
735 (lg_ts->charger_type ? CHARGER_CONNECTED : 0) |
736 DEVICE_CONTROL_CONFIGURED) < 0)) {
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700737 TOUCH_ERR_MSG("DEVICE_CONTROL_REG write fail\n");
738 return -EIO;
739 }
740 break;
741 default:
742 return -EIO;
743 break;
744 }
745
746 return 0;
747}
748
749int synaptics_ts_probe(struct i2c_client* client)
750{
751 struct synaptics_ts_data* ts;
752 int ret = 0;
753
754 if (touch_debug_mask & DEBUG_TRACE)
755 TOUCH_DEBUG_MSG("\n");
756
757 ts = kzalloc(sizeof(struct synaptics_ts_data), GFP_KERNEL);
758 if (!ts) {
759 TOUCH_ERR_MSG("Can not allocate memory\n");
760 ret = -ENOMEM;
761 goto err_alloc_data_failed;
762 }
763
764 set_touch_handle(client, ts);
765
766 ts->client = client;
767 ts->pdata = client->dev.platform_data;
768#if defined(CONFIG_TOUCH_REG_MAP_TM2000)
769 ts->ic_panel_type = IC7020_G2_H_PTN;
770#elif defined(CONFIG_TOUCH_REG_MAP_TM2372)
771 ts->ic_panel_type = IC7020_GFF_H_PTN;
772#endif
773
774 if (ts->pdata->pwr->use_regulator) {
775 ts->regulator_vdd =
776 regulator_get_exclusive(NULL, ts->pdata->pwr->vdd);
777 if (IS_ERR(ts->regulator_vdd)) {
778 TOUCH_ERR_MSG("FAIL: regulator_get_vdd - %s\n",
779 ts->pdata->pwr->vdd);
780 ret = -EPERM;
781 goto err_get_vdd_failed;
782 }
783
784 ts->regulator_vio = regulator_get_exclusive(NULL,
785 ts->pdata->pwr->vio);
786 if (IS_ERR(ts->regulator_vio)) {
787 TOUCH_ERR_MSG("FAIL: regulator_get_vio - %s\n",
788 ts->pdata->pwr->vio);
789 ret = -EPERM;
790 goto err_get_vio_failed;
791 }
792
793 if (ts->pdata->pwr->vdd_voltage > 0) {
794 ret = regulator_set_voltage(ts->regulator_vdd,
795 ts->pdata->pwr->vdd_voltage,
796 ts->pdata->pwr->vdd_voltage);
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700797 if (ret < 0) {
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700798 TOUCH_ERR_MSG("FAIL: VDD voltage setting"
799 " - (%duV)\n",
800 ts->pdata->pwr->vdd_voltage);
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700801 ret = -EPERM;
802 goto err_set_voltage;
803 }
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700804 }
805
806 if (ts->pdata->pwr->vio_voltage > 0) {
807 ret = regulator_set_voltage(ts->regulator_vio,
808 ts->pdata->pwr->vio_voltage,
809 ts->pdata->pwr->vio_voltage);
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700810 if (ret < 0) {
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700811 TOUCH_ERR_MSG("FAIL: VIO voltage setting"
812 " - (%duV)\n",
813 ts->pdata->pwr->vio_voltage);
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700814 ret = -EPERM;
815 goto err_set_voltage;
816 }
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700817 }
818 }
819
820 return ret;
821
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700822err_set_voltage:
823 if (ts->pdata->pwr->use_regulator) {
824 regulator_put(ts->regulator_vio);
825 }
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700826err_get_vio_failed:
827 if (ts->pdata->pwr->use_regulator) {
828 regulator_put(ts->regulator_vdd);
829 }
830err_get_vdd_failed:
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700831 kfree(ts);
Jongrak Kwon098aa9d2012-06-26 11:53:27 -0700832err_alloc_data_failed:
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700833 return ret;
834}
835
836void synaptics_ts_remove(struct i2c_client* client)
837{
838 struct synaptics_ts_data* ts =
839 (struct synaptics_ts_data*)get_touch_handle(client);
840
841 if (touch_debug_mask & DEBUG_TRACE)
842 TOUCH_DEBUG_MSG("\n");
843
844 if (ts->pdata->pwr->use_regulator) {
845 regulator_put(ts->regulator_vio);
846 regulator_put(ts->regulator_vdd);
847 }
848
849 kfree(ts);
850}
851
852int synaptics_ts_fw_upgrade(struct i2c_client* client, const char* fw_path)
853{
854 struct synaptics_ts_data* ts =
855 (struct synaptics_ts_data*)get_touch_handle(client);
856 int ret = 0;
857
858 ts->is_probed = 0;
859
860 ret = FirmwareUpgrade(ts, fw_path);
861
862 /* update IC info */
863 get_ic_info(ts, ts->fw_info);
864
865 return ret;
866}
867
868int synaptics_ts_ic_ctrl(struct i2c_client *client, u8 code, u16 value)
869{
870 struct synaptics_ts_data* ts =
871 (struct synaptics_ts_data*)get_touch_handle(client);
872 u8 buf = 0;
Jongrak Kwon5b6082d2012-09-01 03:50:16 -0700873 u8 new;
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700874
875 switch (code) {
876 case IC_CTRL_BASELINE:
877 switch (value) {
878 case BASELINE_OPEN:
Jongrak Kwon420825a2012-06-26 16:33:25 -0700879 if (!ts->analog_dsc.id) /* If not supported, ignore */
880 break;
881
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700882#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
883 if (unlikely(touch_i2c_write_byte(client,
884 PAGE_SELECT_REG, 0x01) < 0)) {
885 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
886 return -EIO;
887 }
888
889 if (unlikely(touch_i2c_write_byte(client,
890 ANALOG_CONTROL_REG,
891 FORCE_FAST_RELAXATION) < 0)) {
892 TOUCH_ERR_MSG("ANALOG_CONTROL_REG write fail\n");
893 return -EIO;
894 }
895
896 msleep(10);
897
898 if (unlikely(touch_i2c_write_byte(client,
899 ANALOG_COMMAND_REG,
900 FORCE_UPDATE) < 0)) {
901 TOUCH_ERR_MSG("force fast relaxation command write fail\n");
902 return -EIO;
903 }
904
905 if (unlikely(touch_i2c_write_byte(client,
906 PAGE_SELECT_REG, 0x00) < 0)) {
907 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
908 return -EIO;
909 }
910
911 if (unlikely(touch_debug_mask & DEBUG_GHOST))
912 TOUCH_INFO_MSG("BASELINE_OPEN ~~~~~~~~\n");
913#else
914 if (unlikely(touch_i2c_write_byte(client,
915 MELT_CONTROL_REG,
916 MELT_CONTROL_MELT) < 0)) {
917 TOUCH_ERR_MSG("MELT_CONTROL_REG write fail\n");
918 return -EIO;
919 }
920#endif
921 break;
922 case BASELINE_FIX:
Jongrak Kwon420825a2012-06-26 16:33:25 -0700923 if (!ts->analog_dsc.id) /* If not supported, ignore */
924 break;
925
Jongrak Kwonae680ab2012-06-15 22:06:54 -0700926#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
927 if (unlikely(touch_i2c_write_byte(client,
928 PAGE_SELECT_REG, 0x01) < 0)) {
929 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
930 return -EIO;
931 }
932
933 if (unlikely(touch_i2c_write_byte(client,
934 ANALOG_CONTROL_REG, 0x0) < 0)) {
935 TOUCH_ERR_MSG("ANALOG_CONTROL_REG write fail\n");
936 return -EIO;
937 }
938
939 msleep(10);
940
941 if (unlikely(touch_i2c_write_byte(client,
942 ANALOG_COMMAND_REG,
943 FORCE_UPDATE) < 0)) {
944 TOUCH_ERR_MSG("force fast relaxation command write fail\n");
945 return -EIO;
946 }
947
948 if (unlikely(touch_i2c_write_byte(client,
949 PAGE_SELECT_REG, 0x00) < 0)) {
950 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
951 return -EIO;
952 }
953
954 if (unlikely(touch_debug_mask & DEBUG_GHOST))
955 TOUCH_INFO_MSG("BASELINE_FIX ~~~~~~~~\n");
956#else
957 if (unlikely(touch_i2c_write_byte(client,
958 MELT_CONTROL_REG,
959 MELT_CONTROL_NO_MELT) < 0)) {
960 TOUCH_ERR_MSG("MELT_CONTROL_REG write fail\n");
961 return -EIO;
962 }
963#endif
964 break;
965 case BASELINE_REBASE:
966 /* rebase base line */
967 if (likely(ts->finger_dsc.id != 0)) {
968 if (unlikely(touch_i2c_write_byte(client,
969 FINGER_COMMAND_REG, 0x1) < 0)) {
970 TOUCH_ERR_MSG("finger baseline reset "
971 "command write fail\n");
972 return -EIO;
973 }
974 }
975
976#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
977/* do nothing */
978#else
979 if (unlikely(ts->button_dsc.id != 0)) {
980 if (unlikely(touch_i2c_write_byte(client,
981 BUTTON_COMMAND_REG, 0x1) < 0)) {
982 TOUCH_ERR_MSG("finger baseline reset "
983 "command write fail\n");
984 return -EIO;
985 }
986 }
987#endif
988 break;
989 default:
990 break;
991 }
992 break;
993 case IC_CTRL_READ:
Jongrak Kwon9ed2a932012-06-19 23:38:02 -0700994#if defined(CONFIG_TOUCH_REG_MAP_TM2000) || defined(CONFIG_TOUCH_REG_MAP_TM2372)
995 if (unlikely(touch_i2c_write_byte(client,
996 PAGE_SELECT_REG, ((value & 0xFF00) >> 8)) < 0)) {
997 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
998 return -EIO;
999 }
1000
1001 if (touch_i2c_read(client, (value & 0xFF), 1, &buf) < 0) {
1002 TOUCH_ERR_MSG("IC register read fail\n");
1003 return -EIO;
1004 }
1005
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
Jongrak Kwonae680ab2012-06-15 22:06:54 -07001012 if (touch_i2c_read(client, value, 1, &buf) < 0) {
1013 TOUCH_ERR_MSG("IC register read fail\n");
1014 return -EIO;
1015 }
Jongrak Kwon9ed2a932012-06-19 23:38:02 -07001016#endif
Jongrak Kwonae680ab2012-06-15 22:06:54 -07001017 break;
1018 case IC_CTRL_WRITE:
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 & 0xFF0000) >> 16)) < 0)) {
1022 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
1023 return -EIO;
1024 }
1025
Jongrak Kwonae680ab2012-06-15 22:06:54 -07001026 if (touch_i2c_write_byte(client,
1027 ((value & 0xFF00) >> 8), (value & 0xFF)) < 0) {
1028 TOUCH_ERR_MSG("IC register write fail\n");
1029 return -EIO;
1030 }
Jongrak Kwon9ed2a932012-06-19 23:38:02 -07001031
1032 if (unlikely(touch_i2c_write_byte(client,
1033 PAGE_SELECT_REG, 0x00) < 0)) {
1034 TOUCH_ERR_MSG("PAGE_SELECT_REG write fail\n");
1035 return -EIO;
1036 }
1037#else
1038 if (touch_i2c_write_byte(client,
1039 ((value & 0xFF00) >> 8), (value & 0xFF)) < 0) {
1040 TOUCH_ERR_MSG("IC register write fail\n");
1041 return -EIO;
1042 }
1043#endif
Jongrak Kwonae680ab2012-06-15 22:06:54 -07001044 break;
1045 case IC_CTRL_RESET_CMD:
1046 if (unlikely(touch_i2c_write_byte(client,
1047 DEVICE_COMMAND_REG, 0x1) < 0)) {
1048 TOUCH_ERR_MSG("IC Reset command write fail\n");
1049 return -EIO;
1050 }
1051 break;
Jongrak Kwon5b6082d2012-09-01 03:50:16 -07001052 case IC_CTRL_CHARGER:
1053 if (touch_i2c_read(client, DEVICE_CONTROL_REG, 1, &buf) < 0) {
1054 TOUCH_ERR_MSG("IC register read fail\n");
1055 return -EIO;
1056 }
1057
1058 new = buf & ~CHARGER_CONNECTED;
1059 new |= value ? CHARGER_CONNECTED : 0;
1060
1061 if (new != buf) {
1062 if (unlikely(touch_i2c_write_byte(client,
1063 DEVICE_CONTROL_REG, new) < 0)) {
1064 TOUCH_ERR_MSG("IC Reset command write fail\n");
1065 return -EIO;
1066 }
1067 TOUCH_INFO_MSG("CHARGER = %d\n", !!value);
1068 }
1069
1070 break;
Jongrak Kwonae680ab2012-06-15 22:06:54 -07001071 default:
1072 break;
1073 }
1074
1075 return buf;
1076}
1077
1078int synaptics_ts_fw_upgrade_check(struct lge_touch_data *ts)
1079{
Jongrak Kwon8c0f1692012-07-16 19:01:35 -07001080 if (ts->fw_info.fw_force_rework || ts->fw_upgrade.fw_force_upgrade) {
Jongrak Kwonae680ab2012-06-15 22:06:54 -07001081 TOUCH_INFO_MSG("FW-upgrade Force Rework.\n");
1082 } else {
Jongrak Kwon8c0f1692012-07-16 19:01:35 -07001083 if (((int)simple_strtoul(&ts->fw_info.fw_version[1], NULL, 10) >= (int)simple_strtoul(&ts->fw_info.fw_image_version[1], NULL, 10))) {
1084 TOUCH_INFO_MSG("DO NOT UPDATE 7020 G2 H " "pattern FW-upgrade is not executed\n");
Jongrak Kwonae680ab2012-06-15 22:06:54 -07001085 return -1;
Jongrak Kwonae680ab2012-06-15 22:06:54 -07001086 } else {
Jongrak Kwon8c0f1692012-07-16 19:01:35 -07001087 TOUCH_INFO_MSG("7020 G2 H pattern FW-upgrade " "is executed\n");
Jongrak Kwonae680ab2012-06-15 22:06:54 -07001088 }
1089 }
Jongrak Kwonae680ab2012-06-15 22:06:54 -07001090
1091 return 0;
1092}
1093
1094struct touch_device_driver synaptics_ts_driver = {
1095 .probe = synaptics_ts_probe,
1096 .remove = synaptics_ts_remove,
1097 .init = synaptics_ts_init,
1098 .data = synaptics_ts_get_data,
1099 .power = synaptics_ts_power,
1100 .fw_upgrade = synaptics_ts_fw_upgrade,
1101 .ic_ctrl = synaptics_ts_ic_ctrl,
1102 .fw_upgrade_check = synaptics_ts_fw_upgrade_check,
1103};
1104
1105static int __devinit touch_init(void)
1106{
1107 if (touch_debug_mask & DEBUG_TRACE)
1108 TOUCH_DEBUG_MSG("\n");
1109
1110 return touch_driver_register(&synaptics_ts_driver);
1111}
1112
1113static void __exit touch_exit(void)
1114{
1115 if (touch_debug_mask & DEBUG_TRACE)
1116 TOUCH_DEBUG_MSG("\n");
1117
1118 touch_driver_unregister();
1119}
1120
1121module_init(touch_init);
1122module_exit(touch_exit);
1123
1124MODULE_AUTHOR("yehan.ahn@lge.com, hyesung.shin@lge.com");
1125MODULE_DESCRIPTION("LGE Touch Driver");
1126MODULE_LICENSE("GPL");
1127