/
atmel_mxt1386_diff
88 lines (81 loc) · 2.23 KB
/
atmel_mxt1386_diff
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
*** drivers/input/touchscreen/atmel_mxt1386.c
--- drivers/input/touchscreen/atmel_mxt1386.c
***************
*** 22,27 ****
--- 22,29 ----
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
+ #define FIX_CHIP_HANG
+
#define DEBUG_INFO 1
#define DEBUG_VERBOSE 2
#define DEBUG_MESSAGES 5
***************
*** 2539,2544 ****
--- 2541,2550 ----
/* Initialization of driver */
/******************************************************************************/
+ #ifdef FIX_CHIP_HANG
+ extern int mxt_do_firmware_load(struct mxt_data *mxt, const char *fn);
+ #endif
+
static int __devinit mxt_identify(struct i2c_client *client,
struct mxt_data *mxt)
{
***************
*** 2559,2564 ****
--- 2565,2585 ----
msleep(30);
goto retry_i2c;
}
+ #ifdef FIX_CHIP_HANG
+ /* If we tried twice and no response, maybe it's in firmware
+ * load mode. Try to upload firmware.
+ */
+ if (mxt->read_fail_counter == 2) {
+ printk(KERN_DEBUG "Trying firmware reload.");
+ mxt->last_read_addr = -1;
+
+ mxt_do_firmware_load(mxt, MXT1386_FIRMWARE);
+
+ reset_chip(mxt, RESET_TO_NORMAL);
+ msleep(300);
+ goto retry_i2c;
+ }
+ #endif
dev_err(&client->dev, "Failure accessing maXTouch device\n");
return -EIO;
}
diff -c drivers/input/touchscreen/orig/atmel_mxt1386_cfg.c drivers/input/touchscreen/atmel_mxt1386_cfg.c
*** drivers/input/touchscreen/orig/atmel_mxt1386_cfg.c 2012-10-10 08:12:43.773952501 -0400
--- drivers/input/touchscreen/atmel_mxt1386_cfg.c 2012-10-10 08:36:55.704576439 -0400
***************
*** 408,417 ****
return 0;
}
- int mxt_load_firmware(struct device *dev, const char *fn)
- {
- struct mxt_data *mxt = dev_get_drvdata(dev);
unsigned int frame_size;
unsigned int pos = 0;
unsigned int retry;
--- 408,416 ----
return 0;
}
+ int mxt_do_firmware_load(struct mxt_data *mxt, const char *fn)
+ {
unsigned int frame_size;
unsigned int pos = 0;
unsigned int retry;
***************
*** 518,520 ****
--- 517,526 ----
return ret;
}
+ int mxt_load_firmware(struct device *dev, const char *fn)
+ {
+ struct mxt_data *mxt = dev_get_drvdata(dev);
+
+ return mxt_do_firmware_load(mxt, fn);
+ }
+