summaryrefslogtreecommitdiff
path: root/recipes/linux/linux-sgh-i900/wm97xx-ts-fix.patch
diff options
context:
space:
mode:
Diffstat (limited to 'recipes/linux/linux-sgh-i900/wm97xx-ts-fix.patch')
-rw-r--r--recipes/linux/linux-sgh-i900/wm97xx-ts-fix.patch130
1 files changed, 130 insertions, 0 deletions
diff --git a/recipes/linux/linux-sgh-i900/wm97xx-ts-fix.patch b/recipes/linux/linux-sgh-i900/wm97xx-ts-fix.patch
new file mode 100644
index 0000000000..1a36c337c5
--- /dev/null
+++ b/recipes/linux/linux-sgh-i900/wm97xx-ts-fix.patch
@@ -0,0 +1,130 @@
+diff -ru git/drivers/input/touchscreen/wm97xx-core.c and/wm97xx-core.c
+--- git/drivers/input/touchscreen/wm97xx-core.c 2009-11-14 20:38:03.000000000 +0200
++++ git/drivers/input/touchscreen/wm97xx-core.c 2009-11-16 13:21:13.949140354 +0200
+@@ -70,13 +70,11 @@
+ * Documentation/input/input-programming.txt for more details.
+ */
+
+-
+-static int abs_x[3] = {350, 3900, 5};
++static int abs_x[3] = {350, 3900, 5};
+ module_param_array(abs_x, int, NULL, 0);
+ MODULE_PARM_DESC(abs_x, "Touchscreen absolute X min, max, fuzz");
+
+-
+-static int abs_y[3] = {320, 3950, 5}; // Zylonite: 320, 3950
++static int abs_y[3] = {320, 3750, 40};
+ module_param_array(abs_y, int, NULL, 0);
+ MODULE_PARM_DESC(abs_y, "Touchscreen absolute Y min, max, fuzz");
+
+@@ -411,7 +409,6 @@
+ wm->pen_is_down = 0;
+ dev_dbg(wm->dev, "pen up\n");
+ input_report_abs(wm->input_dev, ABS_PRESSURE, 0);
+- input_report_key(wm->input_dev, BTN_TOUCH, 0);
+ input_sync(wm->input_dev);
+ } else if (!(rc & RC_AGAIN)) {
+ /* We need high frequency updates only while
+@@ -429,22 +426,13 @@
+ }
+
+ } else if (rc & RC_VALID) {
+- int absy, absx;
+ dev_dbg(wm->dev,
+ "pen down: x=%x:%d, y=%x:%d, pressure=%x:%d\n",
+ data.x >> 12, data.x & 0xfff, data.y >> 12,
+ data.y & 0xfff, data.p >> 12, data.p & 0xfff);
+- absx = data.x & 0xfff;
+- if (machine_is_sgh_i780())
+- absx = (wm->input_dev->absmax[ABS_X] - absx) + wm->input_dev->absmin[ABS_X];
+- input_report_abs(wm->input_dev, ABS_X, absx);
+- //invert y coordinate
+- absy = data.y & 0xfff;
+- if (machine_is_sgh_i900())
+- absy = (wm->input_dev->absmax[ABS_Y] - absy) + wm->input_dev->absmin[ABS_Y];
+- input_report_abs(wm->input_dev, ABS_Y, absy);
++ input_report_abs(wm->input_dev, ABS_X, data.x & 0xfff);
++ input_report_abs(wm->input_dev, ABS_Y, data.y & 0xfff);
+ input_report_abs(wm->input_dev, ABS_PRESSURE, data.p & 0xfff);
+- input_report_key(wm->input_dev, BTN_TOUCH, 1);
+ input_sync(wm->input_dev);
+ wm->pen_is_down = 1;
+ wm->ts_reader_interval = wm->ts_reader_min_interval;
+@@ -641,23 +629,12 @@
+ wm->input_dev->open = wm97xx_ts_input_open;
+ wm->input_dev->close = wm97xx_ts_input_close;
+ set_bit(EV_ABS, wm->input_dev->evbit);
+- set_bit(EV_KEY, wm->input_dev->evbit);
+ set_bit(ABS_X, wm->input_dev->absbit);
+ set_bit(ABS_Y, wm->input_dev->absbit);
+ set_bit(ABS_PRESSURE, wm->input_dev->absbit);
+- set_bit(BTN_TOUCH, wm->input_dev->keybit);
+-
+- if(machine_is_sgh_i780()){
+- input_set_abs_params(wm->input_dev, ABS_X, 350, 3900, 5, 0);
+- } else if(machine_is_sgh_i900()){
+- input_set_abs_params(wm->input_dev, ABS_X, 0, 39181660, 5, 0);
+- } else input_set_abs_params(wm->input_dev, ABS_X, abs_x[0], abs_x[1],
++ input_set_abs_params(wm->input_dev, ABS_X, abs_x[0], abs_x[1],
+ abs_x[2], 0);
+- if(machine_is_sgh_i780()){
+- input_set_abs_params(wm->input_dev, ABS_Y, 290, 3900, 5, 0);
+- } else if(machine_is_sgh_i900()){
+- input_set_abs_params(wm->input_dev, ABS_Y, 0, 65412060, 5, 0);
+- } else input_set_abs_params(wm->input_dev, ABS_Y, abs_y[0], abs_y[1],
++ input_set_abs_params(wm->input_dev, ABS_Y, abs_y[0], abs_y[1],
+ abs_y[2], 0);
+ input_set_abs_params(wm->input_dev, ABS_PRESSURE, abs_p[0], abs_p[1],
+ abs_p[2], 0);
+diff -ru git/drivers/input/touchscreen/zylonite-wm97xx.c and/zylonite-wm97xx.c
+--- git/drivers/input/touchscreen/zylonite-wm97xx.c 2009-11-14 20:38:03.000000000 +0200
++++ git/drivers/input/touchscreen/zylonite-wm97xx.c 2009-11-16 13:17:21.292645713 +0200
+@@ -76,9 +76,6 @@
+ module_param(ac97_touch_slot, int, 0);
+ MODULE_PARM_DESC(ac97_touch_slot, "Touch screen data slot AC97 number");
+
+-static int calibration[7] = {11877, 137, -4688902, 231, -17973, 69206765, 163940}; //omnia calibration parameters
+-
+-
+ /* flush AC97 slot 5 FIFO machines */
+ static void wm97xx_acc_pen_up(struct wm97xx *wm)
+ {
+@@ -101,7 +98,6 @@
+ {
+ u16 x, y, p = 0x100 | WM97XX_ADCSEL_PRES;
+ int reads = 0;
+- int absx, absy;
+ static u16 last, tries;
+ static int skip_one;
+
+@@ -149,27 +145,9 @@
+
+ /* coordinate is good */
+ tries = 0;
+- if(machine_is_sgh_i900()){
+- x &= 0xfff;
+- y &= 0xfff;
+- absx = (calibration[0] * x + calibration[1] * y +
+- calibration[2]);// / calibration[6];
+- absy = (calibration[3] * x + calibration[4] * y +
+- calibration[5]);// / calibration[6];
+- if(absx<0) absx = 0;
+- if(absy<0) absy = 0;
+- } else {
+- absx = x & 0xfff;
+- if (machine_is_sgh_i780())
+- absx = (wm->input_dev->absmax[ABS_X] - absx) + wm->input_dev->absmin[ABS_X];
+-
+- absy = y & 0xfff;
+- }
+-
+- input_report_abs(wm->input_dev, ABS_X, absx);
+- input_report_abs(wm->input_dev, ABS_Y, absy);
+- p &= 0xfff;
+- input_report_abs(wm->input_dev, ABS_PRESSURE, p);
++ input_report_abs(wm->input_dev, ABS_X, x & 0xfff);
++ input_report_abs(wm->input_dev, ABS_Y, y & 0xfff);
++ input_report_abs(wm->input_dev, ABS_PRESSURE, p & 0xfff);
+ input_report_key(wm->input_dev, BTN_TOUCH, (p != 0));
+ input_sync(wm->input_dev);
+ reads++;