On Tue, Jul 28, 2009 at 4:14 AM, Pavel Machek<pavel@xxxxxx> wrote: > Hi! > >> >> Don't see canceling timer nor shutting off WQ here. Also, maybe >> >> implement open() and close() so we don't reschedule WQ while polling?_ >> > ) >> >> Unless you changed something there should be no failure path after >> starting the timer or enabling the interrupt. >> >> synaptics_ts_remove is missing a flush_work call though. > > Can you submit patch to fix that? > When fix it, sure. This code is unreachable in the configurations we use though so I never noticed it before. >> > 2) it uses non-standard multitouch support. Either multitouch needs to >> > be disabled for merge, or it needs to switch to standard config. >> >> I have a patch that adds support for the new protocol, but it does not >> yet remove the old hack. > > Yes, such patch would be welcome. I guess we could wrap old, hacky > protocol in ifdef, and then remove it when moving to drivers/input. I included the patch below. It is not against your cleaned up version of the driver, but it could use a review in its current form since I'm unclear on how up events should be handled. Another touchscreen only sends events for the finger that moved, so the absence of a finger report is not a good indication that it was released. -- Arve Hjønnevåg --- >From edc71cab6a21fd0415b626bf2cbe737af29e3491 Mon Sep 17 00:00:00 2001 From: =?utf-8?q?Arve=20Hj=C3=B8nnev=C3=A5g?= <arve@xxxxxxxxxxx> Date: Mon, 20 Jul 2009 20:11:31 -0700 Subject: [PATCH] Input: synaptics_i2c_rmi: Send new multi touch events MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Send both fingers using the new multitouch protocol in addition to the old single finger event and second finger ABS_HAT* hack. The new protocol does not specify how to report up events. To make sure the user-space frameworks can generate up events, we send at least one event where ABS_MT_TOUCH_MAJOR is zero before we stop sending events for a finger. Signed-off-by: Arve Hjønnevåg <arve@xxxxxxxxxxx> --- drivers/input/touchscreen/synaptics_i2c_rmi.c | 25 +++++++++++++++++++++++++ 1 files changed, 25 insertions(+), 0 deletions(-) diff --git a/drivers/input/touchscreen/synaptics_i2c_rmi.c b/drivers/input/touchscreen/synaptics_i2c_rmi.c index 56cf371..e003e42 100644 --- a/drivers/input/touchscreen/synaptics_i2c_rmi.c +++ b/drivers/input/touchscreen/synaptics_i2c_rmi.c @@ -43,6 +43,7 @@ struct synaptics_ts_data { int snap_down[2]; int snap_up[2]; uint32_t flags; + int reported_finger_count; int8_t sensitivity_adjust; int (*power)(int on); struct early_suspend early_suspend; @@ -204,6 +205,26 @@ static void synaptics_ts_work_func(struct work_struct *work) input_report_abs(ts->input_dev, ABS_HAT0X, pos[1][0]); input_report_abs(ts->input_dev, ABS_HAT0Y, pos[1][1]); } + + if (!finger) + z = 0; + input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, z); + input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR, w); + input_report_abs(ts->input_dev, ABS_MT_POSITION_X, pos[0][0]); + input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, pos[0][1]); + input_mt_sync(ts->input_dev); + if (finger2_pressed) { + input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, z); + input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR, w); + input_report_abs(ts->input_dev, ABS_MT_POSITION_X, pos[1][0]); + input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, pos[1][1]); + input_mt_sync(ts->input_dev); + } else if (ts->reported_finger_count > 1) { + input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0); + input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR, 0); + input_mt_sync(ts->input_dev); + } + ts->reported_finger_count = finger; input_sync(ts->input_dev); } } @@ -480,6 +501,10 @@ static int synaptics_ts_probe( input_set_abs_params(ts->input_dev, ABS_TOOL_WIDTH, 0, 15, fuzz_w, 0); input_set_abs_params(ts->input_dev, ABS_HAT0X, -inactive_area_left, max_x + inactive_area_right, fuzz_x, 0); input_set_abs_params(ts->input_dev, ABS_HAT0Y, -inactive_area_top, max_y + inactive_area_bottom, fuzz_y, 0);+ input_set_abs_params(ts->input_dev, ABS_MT_POSITION_X, -inactive_area_left, max_x + inactive_area_right, fuzz_x, 0); + input_set_abs_params(ts->input_dev, ABS_MT_POSITION_Y, -inactive_area_top, max_y + inactive_area_bottom, fuzz_y, 0); + input_set_abs_params(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0, 255, fuzz_p, 0); + input_set_abs_params(ts->input_dev, ABS_MT_WIDTH_MAJOR, 0, 15, fuzz_w, 0); /* ts->input_dev->name = ts->keypad_info->name; */ ret = input_register_device(ts->input_dev); if (ret) { -- 1.6.1 -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html