@@ -1489,7 +1489,7 @@ static u8 mxt_max_msg_read_count(struct mxt_data *data, u8 max_T5_msg_count)
return min(T5_msg_count_limit, max_T5_msg_count);
}
-static irqreturn_t mxt_process_messages_t44(struct mxt_data *data)
+static int mxt_process_messages_t44(struct mxt_data *data)
{
struct device *dev = &data->client->dev;
int ret;
@@ -1502,7 +1502,7 @@ static irqreturn_t mxt_process_messages_t44(struct mxt_data *data)
data->T5_msg_size + 1, data->msg_buf);
if (ret) {
dev_err(dev, "Failed to read T44 and T5 (%d)\n", ret);
- return IRQ_NONE;
+ return ret;
}
T5_msg_count = data->msg_buf[0];
@@ -1512,7 +1512,7 @@ static irqreturn_t mxt_process_messages_t44(struct mxt_data *data)
* Mode 0. It results in unnecessary I2C operations but it is benign.
*/
if (!T5_msg_count)
- return IRQ_NONE;
+ return processed_valid;
if (T5_msg_count > data->max_reportid) {
dev_warn(dev, "T44 count %d exceeded max report id\n",
@@ -1524,12 +1524,14 @@ static irqreturn_t mxt_process_messages_t44(struct mxt_data *data)
ret = mxt_proc_message(data, data->msg_buf + 1);
if (ret < 0) {
dev_warn(dev, "Unexpected invalid message\n");
- return IRQ_NONE;
+ return ret;
}
total_pending = T5_msg_count - 1;
- if (!total_pending)
+ if (!total_pending) {
+ processed_valid = 1;
goto end;
+ }
/* Process remaining messages if necessary */
T5_msg_count = mxt_max_msg_read_count(data, total_pending);
@@ -1553,7 +1555,7 @@ static irqreturn_t mxt_process_messages_t44(struct mxt_data *data)
data->update_input = false;
}
- return IRQ_HANDLED;
+ return processed_valid;
}
static int mxt_process_messages_until_invalid(struct mxt_data *data)
@@ -1583,7 +1585,7 @@ static int mxt_process_messages_until_invalid(struct mxt_data *data)
return -EBUSY;
}
-static irqreturn_t mxt_process_messages(struct mxt_data *data)
+static int mxt_process_messages(struct mxt_data *data)
{
int total_handled, num_handled;
u8 count = data->last_message_count;
@@ -1594,7 +1596,7 @@ static irqreturn_t mxt_process_messages(struct mxt_data *data)
/* include final invalid message */
total_handled = mxt_read_and_process_messages(data, count + 1);
if (total_handled < 0)
- return IRQ_NONE;
+ return total_handled;
/* if there were invalid messages, then we are done */
else if (total_handled <= count)
goto update_count;
@@ -1603,7 +1605,7 @@ static irqreturn_t mxt_process_messages(struct mxt_data *data)
do {
num_handled = mxt_read_and_process_messages(data, 2);
if (num_handled < 0)
- return IRQ_NONE;
+ return num_handled;
total_handled += num_handled;
@@ -1619,12 +1621,13 @@ static irqreturn_t mxt_process_messages(struct mxt_data *data)
data->update_input = false;
}
- return IRQ_HANDLED;
+ return total_handled;
}
static irqreturn_t mxt_interrupt(int irq, void *dev_id)
{
struct mxt_data *data = dev_id;
+ int ret;
if (data->in_bootloader) {
complete(&data->chg_completion);
@@ -1632,17 +1635,22 @@ static irqreturn_t mxt_interrupt(int irq, void *dev_id)
if (data->flash)
cancel_delayed_work_sync(&data->flash->work);
- return IRQ_RETVAL(mxt_check_bootloader(data));
+ ret = mxt_check_bootloader(data);
+ return IRQ_RETVAL(ret);
}
if (!data->object_table)
return IRQ_HANDLED;
- if (data->T44_address) {
- return mxt_process_messages_t44(data);
- } else {
- return mxt_process_messages(data);
- }
+ if (data->T44_address)
+ ret = mxt_process_messages_t44(data);
+ else
+ ret = mxt_process_messages(data);
+
+ if (ret <= 0)
+ return IRQ_NONE;
+ else
+ return IRQ_HANDLED;
}
static int mxt_t6_command(struct mxt_data *data, u16 cmd_offset,
@@ -1777,8 +1785,11 @@ static int mxt_acquire_irq(struct mxt_data *data)
}
if (data->object_table && data->use_retrigen_workaround) {
- error = mxt_process_messages_until_invalid(data);
- if (error)
+ if (data->T44_address)
+ error = mxt_process_messages_t44(data);
+ else
+ error = mxt_process_messages_until_invalid(data);
+ if (error < 0)
return error;
}
@@ -4032,8 +4043,12 @@ static int mxt_start(struct mxt_data *data)
* Discard any touch messages still in message buffer
* from before chip went to sleep
*/
- ret = mxt_process_messages_until_invalid(data);
- if (ret)
+
+ if (data->T44_address)
+ ret = mxt_process_messages_t44(data);
+ else
+ ret = mxt_process_messages_until_invalid(data);
+ if (ret < 0)
break;
ret = mxt_set_t7_power_cfg(data, MXT_POWER_CFG_RUN);