|
@@ -239,14 +239,6 @@ struct mxt_message {
|
|
|
u8 message[7];
|
|
|
};
|
|
|
|
|
|
-struct mxt_finger {
|
|
|
- int status;
|
|
|
- int x;
|
|
|
- int y;
|
|
|
- int area;
|
|
|
- int pressure;
|
|
|
-};
|
|
|
-
|
|
|
/* Each client has this additional data */
|
|
|
struct mxt_data {
|
|
|
struct i2c_client *client;
|
|
@@ -255,7 +247,6 @@ struct mxt_data {
|
|
|
const struct mxt_platform_data *pdata;
|
|
|
struct mxt_object *object_table;
|
|
|
struct mxt_info info;
|
|
|
- struct mxt_finger finger[MXT_MAX_FINGER];
|
|
|
unsigned int irq;
|
|
|
unsigned int max_x;
|
|
|
unsigned int max_y;
|
|
@@ -519,75 +510,17 @@ static int mxt_write_object(struct mxt_data *data,
|
|
|
return mxt_write_reg(data->client, reg + offset, val);
|
|
|
}
|
|
|
|
|
|
-static void mxt_input_report(struct mxt_data *data, int single_id)
|
|
|
-{
|
|
|
- struct mxt_finger *finger = data->finger;
|
|
|
- struct input_dev *input_dev = data->input_dev;
|
|
|
- int status = finger[single_id].status;
|
|
|
- int finger_num = 0;
|
|
|
- int id;
|
|
|
-
|
|
|
- for (id = 0; id < MXT_MAX_FINGER; id++) {
|
|
|
- if (!finger[id].status)
|
|
|
- continue;
|
|
|
-
|
|
|
- input_mt_slot(input_dev, id);
|
|
|
- input_mt_report_slot_state(input_dev, MT_TOOL_FINGER,
|
|
|
- finger[id].status != MXT_RELEASE);
|
|
|
-
|
|
|
- if (finger[id].status != MXT_RELEASE) {
|
|
|
- finger_num++;
|
|
|
- input_report_abs(input_dev, ABS_MT_TOUCH_MAJOR,
|
|
|
- finger[id].area);
|
|
|
- input_report_abs(input_dev, ABS_MT_POSITION_X,
|
|
|
- finger[id].x);
|
|
|
- input_report_abs(input_dev, ABS_MT_POSITION_Y,
|
|
|
- finger[id].y);
|
|
|
- input_report_abs(input_dev, ABS_MT_PRESSURE,
|
|
|
- finger[id].pressure);
|
|
|
- } else {
|
|
|
- finger[id].status = 0;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- input_report_key(input_dev, BTN_TOUCH, finger_num > 0);
|
|
|
-
|
|
|
- if (status != MXT_RELEASE) {
|
|
|
- input_report_abs(input_dev, ABS_X, finger[single_id].x);
|
|
|
- input_report_abs(input_dev, ABS_Y, finger[single_id].y);
|
|
|
- input_report_abs(input_dev,
|
|
|
- ABS_PRESSURE, finger[single_id].pressure);
|
|
|
- }
|
|
|
-
|
|
|
- input_sync(input_dev);
|
|
|
-}
|
|
|
-
|
|
|
static void mxt_input_touchevent(struct mxt_data *data,
|
|
|
struct mxt_message *message, int id)
|
|
|
{
|
|
|
- struct mxt_finger *finger = data->finger;
|
|
|
struct device *dev = &data->client->dev;
|
|
|
u8 status = message->message[0];
|
|
|
+ struct input_dev *input_dev = data->input_dev;
|
|
|
int x;
|
|
|
int y;
|
|
|
int area;
|
|
|
int pressure;
|
|
|
|
|
|
- /* Check the touch is present on the screen */
|
|
|
- if (!(status & MXT_DETECT)) {
|
|
|
- if (status & MXT_RELEASE) {
|
|
|
- dev_dbg(dev, "[%d] released\n", id);
|
|
|
-
|
|
|
- finger[id].status = MXT_RELEASE;
|
|
|
- mxt_input_report(data, id);
|
|
|
- }
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- /* Check only AMP detection */
|
|
|
- if (!(status & (MXT_PRESS | MXT_MOVE)))
|
|
|
- return;
|
|
|
-
|
|
|
x = (message->message[1] << 4) | ((message->message[3] >> 4) & 0xf);
|
|
|
y = (message->message[2] << 4) | ((message->message[3] & 0xf));
|
|
|
if (data->max_x < 1024)
|
|
@@ -601,15 +534,19 @@ static void mxt_input_touchevent(struct mxt_data *data,
|
|
|
dev_dbg(dev, "[%d] %s x: %d, y: %d, area: %d\n", id,
|
|
|
status & MXT_MOVE ? "moved" : "pressed",
|
|
|
x, y, area);
|
|
|
+ input_mt_slot(input_dev, id);
|
|
|
+ input_mt_report_slot_state(input_dev, MT_TOOL_FINGER,
|
|
|
+ status & MXT_DETECT);
|
|
|
+
|
|
|
+ if (status & MXT_DETECT) {
|
|
|
+ input_report_abs(input_dev, ABS_MT_POSITION_X, x);
|
|
|
+ input_report_abs(input_dev, ABS_MT_POSITION_Y, y);
|
|
|
+ input_report_abs(input_dev, ABS_MT_PRESSURE, pressure);
|
|
|
+ input_report_abs(input_dev, ABS_MT_TOUCH_MAJOR, area);
|
|
|
+ }
|
|
|
|
|
|
- finger[id].status = status & MXT_MOVE ?
|
|
|
- MXT_MOVE : MXT_PRESS;
|
|
|
- finger[id].x = x;
|
|
|
- finger[id].y = y;
|
|
|
- finger[id].area = area;
|
|
|
- finger[id].pressure = pressure;
|
|
|
-
|
|
|
- mxt_input_report(data, id);
|
|
|
+ input_mt_report_pointer_emulation(input_dev, false);
|
|
|
+ input_sync(input_dev);
|
|
|
}
|
|
|
|
|
|
static irqreturn_t mxt_interrupt(int irq, void *dev_id)
|