* [PATCH v1 25/63] Input: atmel_mxt_ts - rename bl_completion to chg_completion
@ 2019-08-16 8:33 ` Jiada Wang
0 siblings, 0 replies; 10+ messages in thread
From: Jiada Wang @ 2019-08-16 8:33 UTC (permalink / raw)
To: nick, dmitry.torokhov; +Cc: linux-input, linux-kernel, jiada_wang, george_davis
From: Nick Dyer <nick.dyer@itdev.co.uk>
Signed-off-by: Nick Dyer <nick.dyer@itdev.co.uk>
(cherry picked from ndyer/linux/for-upstream commit dda8453bfb44216645ede798918a314d4fca2481)
[gdavis: Resolve forward port conflicts due to applying upstream
commit 96a938aa214e ("Input: atmel_mxt_ts - remove platform
data support").]
Signed-off-by: George G. Davis <george_davis@mentor.com>
Signed-off-by: Jiada Wang <jiada_wang@mentor.com>
---
drivers/input/touchscreen/atmel_mxt_ts.c | 27 ++++++++++++------------
1 file changed, 13 insertions(+), 14 deletions(-)
diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c
index a7805df83af2..6f185bc5128c 100644
--- a/drivers/input/touchscreen/atmel_mxt_ts.c
+++ b/drivers/input/touchscreen/atmel_mxt_ts.c
@@ -381,9 +381,6 @@ struct mxt_data {
u8 T100_reportid_max;
u16 T107_address;
- /* for fw update in bootloader */
- struct completion bl_completion;
-
/* for reset handling */
struct completion reset_completion;
@@ -395,6 +392,9 @@ struct mxt_data {
enum mxt_suspend_mode suspend_mode;
+ /* for power up handling */
+ struct completion chg_completion;
+
/* Indicates whether device is in suspend */
bool suspended;
@@ -611,7 +611,7 @@ static int mxt_check_bootloader(struct mxt_data *data, struct mxt_flash *f)
* CHG assertion before reading the status byte.
* Once the status byte has been read, the line is deasserted.
*/
- ret = mxt_wait_for_completion(data, &data->bl_completion,
+ ret = mxt_wait_for_completion(data, &data->chg_completion,
MXT_FW_CHG_TIMEOUT);
if (ret) {
/*
@@ -1400,11 +1400,10 @@ static irqreturn_t mxt_interrupt(int irq, void *dev_id)
{
struct mxt_data *data = dev_id;
- if (data->in_bootloader) {
- /* bootloader state transition completion */
- complete(&data->bl_completion);
+ complete(&data->chg_completion);
+
+ if (data->in_bootloader)
return IRQ_HANDLED;
- }
if (!data->object_table)
return IRQ_HANDLED;
@@ -2164,9 +2163,9 @@ static void mxt_regulator_enable(struct mxt_data *data)
msleep(MXT_CHG_DELAY);
retry_wait:
- reinit_completion(&data->bl_completion);
+ reinit_completion(&data->chg_completion);
data->in_bootloader = true;
- error = mxt_wait_for_completion(data, &data->bl_completion,
+ error = mxt_wait_for_completion(data, &data->chg_completion,
MXT_POWERON_DELAY);
if (error == -EINTR)
goto retry_wait;
@@ -3330,7 +3329,7 @@ static int mxt_enter_bootloader(struct mxt_data *data)
enable_irq(data->irq);
}
- reinit_completion(&data->bl_completion);
+ reinit_completion(&data->chg_completion);
return 0;
}
@@ -3366,7 +3365,7 @@ static int mxt_load_fw(struct device *dev)
}
/* Wait for flash. */
- ret = mxt_wait_for_completion(data, &data->bl_completion,
+ ret = mxt_wait_for_completion(data, &data->chg_completion,
MXT_FW_RESET_TIME);
if (ret)
goto disable_irq;
@@ -3377,7 +3376,7 @@ static int mxt_load_fw(struct device *dev)
* the CHG line after bootloading has finished, so ignore potential
* errors.
*/
- mxt_wait_for_completion(data, &data->bl_completion, MXT_FW_RESET_TIME);
+ mxt_wait_for_completion(data, &data->chg_completion, MXT_FW_RESET_TIME);
data->in_bootloader = false;
disable_irq:
@@ -3771,7 +3770,7 @@ static int mxt_probe(struct i2c_client *client, const struct i2c_device_id *id)
data->irq = client->irq;
i2c_set_clientdata(client, data);
- init_completion(&data->bl_completion);
+ init_completion(&data->chg_completion);
init_completion(&data->reset_completion);
init_completion(&data->crc_completion);
--
2.19.2
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v1 25/63] Input: atmel_mxt_ts - rename bl_completion to chg_completion
@ 2019-08-16 8:33 ` Jiada Wang
0 siblings, 0 replies; 10+ messages in thread
From: Jiada Wang @ 2019-08-16 8:33 UTC (permalink / raw)
To: nick, dmitry.torokhov; +Cc: linux-input, linux-kernel, jiada_wang, george_davis
From: Nick Dyer <nick.dyer@itdev.co.uk>
Signed-off-by: Nick Dyer <nick.dyer@itdev.co.uk>
(cherry picked from ndyer/linux/for-upstream commit dda8453bfb44216645ede798918a314d4fca2481)
[gdavis: Resolve forward port conflicts due to applying upstream
commit 96a938aa214e ("Input: atmel_mxt_ts - remove platform
data support").]
Signed-off-by: George G. Davis <george_davis@mentor.com>
Signed-off-by: Jiada Wang <jiada_wang@mentor.com>
---
drivers/input/touchscreen/atmel_mxt_ts.c | 27 ++++++++++++------------
1 file changed, 13 insertions(+), 14 deletions(-)
diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c
index a7805df83af2..6f185bc5128c 100644
--- a/drivers/input/touchscreen/atmel_mxt_ts.c
+++ b/drivers/input/touchscreen/atmel_mxt_ts.c
@@ -381,9 +381,6 @@ struct mxt_data {
u8 T100_reportid_max;
u16 T107_address;
- /* for fw update in bootloader */
- struct completion bl_completion;
-
/* for reset handling */
struct completion reset_completion;
@@ -395,6 +392,9 @@ struct mxt_data {
enum mxt_suspend_mode suspend_mode;
+ /* for power up handling */
+ struct completion chg_completion;
+
/* Indicates whether device is in suspend */
bool suspended;
@@ -611,7 +611,7 @@ static int mxt_check_bootloader(struct mxt_data *data, struct mxt_flash *f)
* CHG assertion before reading the status byte.
* Once the status byte has been read, the line is deasserted.
*/
- ret = mxt_wait_for_completion(data, &data->bl_completion,
+ ret = mxt_wait_for_completion(data, &data->chg_completion,
MXT_FW_CHG_TIMEOUT);
if (ret) {
/*
@@ -1400,11 +1400,10 @@ static irqreturn_t mxt_interrupt(int irq, void *dev_id)
{
struct mxt_data *data = dev_id;
- if (data->in_bootloader) {
- /* bootloader state transition completion */
- complete(&data->bl_completion);
+ complete(&data->chg_completion);
+
+ if (data->in_bootloader)
return IRQ_HANDLED;
- }
if (!data->object_table)
return IRQ_HANDLED;
@@ -2164,9 +2163,9 @@ static void mxt_regulator_enable(struct mxt_data *data)
msleep(MXT_CHG_DELAY);
retry_wait:
- reinit_completion(&data->bl_completion);
+ reinit_completion(&data->chg_completion);
data->in_bootloader = true;
- error = mxt_wait_for_completion(data, &data->bl_completion,
+ error = mxt_wait_for_completion(data, &data->chg_completion,
MXT_POWERON_DELAY);
if (error == -EINTR)
goto retry_wait;
@@ -3330,7 +3329,7 @@ static int mxt_enter_bootloader(struct mxt_data *data)
enable_irq(data->irq);
}
- reinit_completion(&data->bl_completion);
+ reinit_completion(&data->chg_completion);
return 0;
}
@@ -3366,7 +3365,7 @@ static int mxt_load_fw(struct device *dev)
}
/* Wait for flash. */
- ret = mxt_wait_for_completion(data, &data->bl_completion,
+ ret = mxt_wait_for_completion(data, &data->chg_completion,
MXT_FW_RESET_TIME);
if (ret)
goto disable_irq;
@@ -3377,7 +3376,7 @@ static int mxt_load_fw(struct device *dev)
* the CHG line after bootloading has finished, so ignore potential
* errors.
*/
- mxt_wait_for_completion(data, &data->bl_completion, MXT_FW_RESET_TIME);
+ mxt_wait_for_completion(data, &data->chg_completion, MXT_FW_RESET_TIME);
data->in_bootloader = false;
disable_irq:
@@ -3771,7 +3770,7 @@ static int mxt_probe(struct i2c_client *client, const struct i2c_device_id *id)
data->irq = client->irq;
i2c_set_clientdata(client, data);
- init_completion(&data->bl_completion);
+ init_completion(&data->chg_completion);
init_completion(&data->reset_completion);
init_completion(&data->crc_completion);
--
2.19.2
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v1 26/63] Input: atmel_mxt_ts - make bootloader interrupt driven
2019-08-16 8:33 ` Jiada Wang
@ 2019-08-16 8:33 ` Jiada Wang
-1 siblings, 0 replies; 10+ messages in thread
From: Jiada Wang @ 2019-08-16 8:33 UTC (permalink / raw)
To: nick, dmitry.torokhov; +Cc: linux-input, linux-kernel, jiada_wang, george_davis
From: Nick Dyer <nick.dyer@itdev.co.uk>
Signed-off-by: Nick Dyer <nick.dyer@itdev.co.uk>
(cherry picked from ndyer/linux/for-upstream commit 67a3eea0cfc724c3c2a7410ac064f74227c7c6ef)
[gdavis: Resolve forward port conflicts due to applying upstream
commit 96a938aa214e ("Input: atmel_mxt_ts - remove platform
data support").]
Signed-off-by: George G. Davis <george_davis@mentor.com>
Signed-off-by: Jiada Wang <jiada_wang@mentor.com>
---
drivers/input/touchscreen/atmel_mxt_ts.c | 120 ++++++++++++-----------
1 file changed, 61 insertions(+), 59 deletions(-)
diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c
index 6f185bc5128c..2bc80abcbd80 100644
--- a/drivers/input/touchscreen/atmel_mxt_ts.c
+++ b/drivers/input/touchscreen/atmel_mxt_ts.c
@@ -27,6 +27,7 @@
#include <linux/gpio/consumer.h>
#include <asm/unaligned.h>
#include <linux/regulator/consumer.h>
+#include <linux/workqueue.h>
#include <media/v4l2-device.h>
#include <media/v4l2-ioctl.h>
#include <media/videobuf2-v4l2.h>
@@ -218,6 +219,7 @@ enum t100_type {
#define MXT_REGULATOR_DELAY 150 /* msec */
#define MXT_CHG_DELAY 100 /* msec */
#define MXT_POWERON_DELAY 150 /* msec */
+#define MXT_BOOTLOADER_WAIT 36E5 /* 1 minute */
/* Command to unlock bootloader */
#define MXT_UNLOCK_CMD_MSB 0xaa
@@ -299,6 +301,7 @@ struct mxt_fw_frame {
/* Firmware update context */
struct mxt_flash {
+ struct mxt_data *data;
const struct firmware *fw;
struct mxt_fw_frame *frame;
loff_t pos;
@@ -306,7 +309,8 @@ struct mxt_flash {
unsigned int count;
unsigned int retry;
u8 previous;
- bool complete;
+ struct completion flash_completion;
+ struct delayed_work work;
};
/* Each client has this additional data */
@@ -355,6 +359,7 @@ struct mxt_data {
char *cfg_name;
const char *pcfg_name;
const char *input_name;
+ struct mxt_flash *flash;
/* Cached parameters from object table */
u16 T5_address;
@@ -599,28 +604,17 @@ static int mxt_write_firmware_frame(struct mxt_data *data, struct mxt_flash *f)
f->frame_size);
}
-static int mxt_check_bootloader(struct mxt_data *data, struct mxt_flash *f)
+static int mxt_check_bootloader(struct mxt_data *data)
{
struct device *dev = &data->client->dev;
+ struct mxt_flash *f = data->flash;
u8 state;
int ret;
- /*
- * In application update mode, the interrupt
- * line signals state transitions. We must wait for the
- * CHG assertion before reading the status byte.
- * Once the status byte has been read, the line is deasserted.
- */
- ret = mxt_wait_for_completion(data, &data->chg_completion,
- MXT_FW_CHG_TIMEOUT);
- if (ret) {
- /*
- * TODO: handle -ERESTARTSYS better by terminating
- * fw update process before returning to userspace
- * by writing length 0x000 to device (iff we are in
- * WAITING_FRAME_DATA state).
- */
- dev_warn(dev, "Update wait error %d\n", ret);
+ /* Handle interrupt after download/flash process */
+ if (f->pos >= f->fw->size) {
+ complete(&f->flash_completion);
+ return 0;
}
ret = mxt_bootloader_read(data, &state, 1);
@@ -666,14 +660,12 @@ static int mxt_check_bootloader(struct mxt_data *data, struct mxt_flash *f)
f->pos += f->frame_size;
f->count++;
- if (f->pos >= f->fw->size) {
- f->complete = true;
+ if (f->pos >= f->fw->size)
dev_info(dev, "Sent %u frames, %zu bytes\n",
f->count, f->fw->size);
- } else if (f->count % 50 == 0) {
+ else if (f->count % 50 == 0)
dev_dbg(dev, "Sent %u frames, %lld/%zu bytes\n",
f->count, f->pos, f->fw->size);
- }
break;
@@ -695,6 +687,9 @@ static int mxt_check_bootloader(struct mxt_data *data, struct mxt_flash *f)
f->previous = state;
+ /* Poll after 0.1s if no interrupt received */
+ schedule_delayed_work(&f->work, HZ / 10);
+
return 0;
unexpected:
@@ -1402,8 +1397,12 @@ static irqreturn_t mxt_interrupt(int irq, void *dev_id)
complete(&data->chg_completion);
- if (data->in_bootloader)
- return IRQ_HANDLED;
+ if (data->in_bootloader) {
+ if (data->flash && &data->flash->work)
+ cancel_delayed_work_sync(&data->flash->work);
+
+ return IRQ_RETVAL(mxt_check_bootloader(data));
+ }
if (!data->object_table)
return IRQ_HANDLED;
@@ -3300,16 +3299,13 @@ static int mxt_enter_bootloader(struct mxt_data *data)
if (data->suspend_mode == MXT_SUSPEND_REGULATOR)
mxt_regulator_enable(data);
- if (data->suspend_mode == MXT_SUSPEND_DEEP_SLEEP)
- enable_irq(data->irq);
-
data->suspended = false;
}
if (!data->in_bootloader) {
- /* Change to the bootloader mode */
- data->in_bootloader = true;
+ disable_irq(data->irq);
+ /* Change to the bootloader mode */
ret = mxt_t6_command(data, MXT_COMMAND_RESET,
MXT_BOOT_VALUE, false);
if (ret)
@@ -3322,67 +3318,73 @@ static int mxt_enter_bootloader(struct mxt_data *data)
if (ret)
return ret;
+ data->in_bootloader = true;
mxt_sysfs_remove(data);
mxt_free_input_device(data);
mxt_free_object_table(data);
- } else {
- enable_irq(data->irq);
}
- reinit_completion(&data->chg_completion);
+ dev_dbg(&data->client->dev, "Entered bootloader\n");
return 0;
}
+static void mxt_fw_work(struct work_struct *work)
+{
+ struct mxt_flash *f =
+ container_of(work, struct mxt_flash, work.work);
+
+ mxt_check_bootloader(f->data);
+}
+
static int mxt_load_fw(struct device *dev)
{
struct mxt_data *data = dev_get_drvdata(dev);
- struct mxt_flash f = { 0, };
int ret;
- ret = request_firmware(&f.fw, data->fw_name, dev);
+ data->flash = devm_kzalloc(dev, sizeof(struct mxt_flash), GFP_KERNEL);
+ if (!data->flash)
+ return -ENOMEM;
+
+ data->flash->data = data;
+
+ ret = request_firmware(&data->flash->fw, data->fw_name, dev);
if (ret) {
dev_err(dev, "Unable to open firmware %s\n", data->fw_name);
- return ret;
+ goto free;
}
/* Check for incorrect enc file */
- ret = mxt_check_firmware_format(dev, f.fw);
+ ret = mxt_check_firmware_format(dev, data->flash->fw);
if (ret)
goto release_firmware;
- ret = mxt_enter_bootloader(data);
- if (ret)
- goto release_firmware;
+ init_completion(&data->flash->flash_completion);
+ INIT_DELAYED_WORK(&data->flash->work, mxt_fw_work);
+ reinit_completion(&data->flash->flash_completion);
- while (true) {
- ret = mxt_check_bootloader(data, &f);
+ if (!data->in_bootloader) {
+ ret = mxt_enter_bootloader(data);
if (ret)
- return ret;
-
- if (f.complete)
- break;
+ goto release_firmware;
}
- /* Wait for flash. */
- ret = mxt_wait_for_completion(data, &data->chg_completion,
- MXT_FW_RESET_TIME);
- if (ret)
- goto disable_irq;
+ enable_irq(data->irq);
+ /* Poll after 0.1s if no interrupt received */
+ schedule_delayed_work(&data->flash->work, HZ / 10);
- /*
- * Wait for device to reset. Some bootloader versions do not assert
- * the CHG line after bootloading has finished, so ignore potential
- * errors.
- */
- mxt_wait_for_completion(data, &data->chg_completion, MXT_FW_RESET_TIME);
+ /* Wait for flash. */
+ ret = mxt_wait_for_completion(data, &data->flash->flash_completion,
+ MXT_BOOTLOADER_WAIT);
- data->in_bootloader = false;
-disable_irq:
disable_irq(data->irq);
+ cancel_delayed_work_sync(&data->flash->work);
+ data->in_bootloader = false;
release_firmware:
- release_firmware(f.fw);
+ release_firmware(data->flash->fw);
+free:
+ devm_kfree(dev, data->flash);
return ret;
}
--
2.19.2
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v1 26/63] Input: atmel_mxt_ts - make bootloader interrupt driven
@ 2019-08-16 8:33 ` Jiada Wang
0 siblings, 0 replies; 10+ messages in thread
From: Jiada Wang @ 2019-08-16 8:33 UTC (permalink / raw)
To: nick, dmitry.torokhov; +Cc: linux-input, linux-kernel, jiada_wang, george_davis
From: Nick Dyer <nick.dyer@itdev.co.uk>
Signed-off-by: Nick Dyer <nick.dyer@itdev.co.uk>
(cherry picked from ndyer/linux/for-upstream commit 67a3eea0cfc724c3c2a7410ac064f74227c7c6ef)
[gdavis: Resolve forward port conflicts due to applying upstream
commit 96a938aa214e ("Input: atmel_mxt_ts - remove platform
data support").]
Signed-off-by: George G. Davis <george_davis@mentor.com>
Signed-off-by: Jiada Wang <jiada_wang@mentor.com>
---
drivers/input/touchscreen/atmel_mxt_ts.c | 120 ++++++++++++-----------
1 file changed, 61 insertions(+), 59 deletions(-)
diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c
index 6f185bc5128c..2bc80abcbd80 100644
--- a/drivers/input/touchscreen/atmel_mxt_ts.c
+++ b/drivers/input/touchscreen/atmel_mxt_ts.c
@@ -27,6 +27,7 @@
#include <linux/gpio/consumer.h>
#include <asm/unaligned.h>
#include <linux/regulator/consumer.h>
+#include <linux/workqueue.h>
#include <media/v4l2-device.h>
#include <media/v4l2-ioctl.h>
#include <media/videobuf2-v4l2.h>
@@ -218,6 +219,7 @@ enum t100_type {
#define MXT_REGULATOR_DELAY 150 /* msec */
#define MXT_CHG_DELAY 100 /* msec */
#define MXT_POWERON_DELAY 150 /* msec */
+#define MXT_BOOTLOADER_WAIT 36E5 /* 1 minute */
/* Command to unlock bootloader */
#define MXT_UNLOCK_CMD_MSB 0xaa
@@ -299,6 +301,7 @@ struct mxt_fw_frame {
/* Firmware update context */
struct mxt_flash {
+ struct mxt_data *data;
const struct firmware *fw;
struct mxt_fw_frame *frame;
loff_t pos;
@@ -306,7 +309,8 @@ struct mxt_flash {
unsigned int count;
unsigned int retry;
u8 previous;
- bool complete;
+ struct completion flash_completion;
+ struct delayed_work work;
};
/* Each client has this additional data */
@@ -355,6 +359,7 @@ struct mxt_data {
char *cfg_name;
const char *pcfg_name;
const char *input_name;
+ struct mxt_flash *flash;
/* Cached parameters from object table */
u16 T5_address;
@@ -599,28 +604,17 @@ static int mxt_write_firmware_frame(struct mxt_data *data, struct mxt_flash *f)
f->frame_size);
}
-static int mxt_check_bootloader(struct mxt_data *data, struct mxt_flash *f)
+static int mxt_check_bootloader(struct mxt_data *data)
{
struct device *dev = &data->client->dev;
+ struct mxt_flash *f = data->flash;
u8 state;
int ret;
- /*
- * In application update mode, the interrupt
- * line signals state transitions. We must wait for the
- * CHG assertion before reading the status byte.
- * Once the status byte has been read, the line is deasserted.
- */
- ret = mxt_wait_for_completion(data, &data->chg_completion,
- MXT_FW_CHG_TIMEOUT);
- if (ret) {
- /*
- * TODO: handle -ERESTARTSYS better by terminating
- * fw update process before returning to userspace
- * by writing length 0x000 to device (iff we are in
- * WAITING_FRAME_DATA state).
- */
- dev_warn(dev, "Update wait error %d\n", ret);
+ /* Handle interrupt after download/flash process */
+ if (f->pos >= f->fw->size) {
+ complete(&f->flash_completion);
+ return 0;
}
ret = mxt_bootloader_read(data, &state, 1);
@@ -666,14 +660,12 @@ static int mxt_check_bootloader(struct mxt_data *data, struct mxt_flash *f)
f->pos += f->frame_size;
f->count++;
- if (f->pos >= f->fw->size) {
- f->complete = true;
+ if (f->pos >= f->fw->size)
dev_info(dev, "Sent %u frames, %zu bytes\n",
f->count, f->fw->size);
- } else if (f->count % 50 == 0) {
+ else if (f->count % 50 == 0)
dev_dbg(dev, "Sent %u frames, %lld/%zu bytes\n",
f->count, f->pos, f->fw->size);
- }
break;
@@ -695,6 +687,9 @@ static int mxt_check_bootloader(struct mxt_data *data, struct mxt_flash *f)
f->previous = state;
+ /* Poll after 0.1s if no interrupt received */
+ schedule_delayed_work(&f->work, HZ / 10);
+
return 0;
unexpected:
@@ -1402,8 +1397,12 @@ static irqreturn_t mxt_interrupt(int irq, void *dev_id)
complete(&data->chg_completion);
- if (data->in_bootloader)
- return IRQ_HANDLED;
+ if (data->in_bootloader) {
+ if (data->flash && &data->flash->work)
+ cancel_delayed_work_sync(&data->flash->work);
+
+ return IRQ_RETVAL(mxt_check_bootloader(data));
+ }
if (!data->object_table)
return IRQ_HANDLED;
@@ -3300,16 +3299,13 @@ static int mxt_enter_bootloader(struct mxt_data *data)
if (data->suspend_mode == MXT_SUSPEND_REGULATOR)
mxt_regulator_enable(data);
- if (data->suspend_mode == MXT_SUSPEND_DEEP_SLEEP)
- enable_irq(data->irq);
-
data->suspended = false;
}
if (!data->in_bootloader) {
- /* Change to the bootloader mode */
- data->in_bootloader = true;
+ disable_irq(data->irq);
+ /* Change to the bootloader mode */
ret = mxt_t6_command(data, MXT_COMMAND_RESET,
MXT_BOOT_VALUE, false);
if (ret)
@@ -3322,67 +3318,73 @@ static int mxt_enter_bootloader(struct mxt_data *data)
if (ret)
return ret;
+ data->in_bootloader = true;
mxt_sysfs_remove(data);
mxt_free_input_device(data);
mxt_free_object_table(data);
- } else {
- enable_irq(data->irq);
}
- reinit_completion(&data->chg_completion);
+ dev_dbg(&data->client->dev, "Entered bootloader\n");
return 0;
}
+static void mxt_fw_work(struct work_struct *work)
+{
+ struct mxt_flash *f =
+ container_of(work, struct mxt_flash, work.work);
+
+ mxt_check_bootloader(f->data);
+}
+
static int mxt_load_fw(struct device *dev)
{
struct mxt_data *data = dev_get_drvdata(dev);
- struct mxt_flash f = { 0, };
int ret;
- ret = request_firmware(&f.fw, data->fw_name, dev);
+ data->flash = devm_kzalloc(dev, sizeof(struct mxt_flash), GFP_KERNEL);
+ if (!data->flash)
+ return -ENOMEM;
+
+ data->flash->data = data;
+
+ ret = request_firmware(&data->flash->fw, data->fw_name, dev);
if (ret) {
dev_err(dev, "Unable to open firmware %s\n", data->fw_name);
- return ret;
+ goto free;
}
/* Check for incorrect enc file */
- ret = mxt_check_firmware_format(dev, f.fw);
+ ret = mxt_check_firmware_format(dev, data->flash->fw);
if (ret)
goto release_firmware;
- ret = mxt_enter_bootloader(data);
- if (ret)
- goto release_firmware;
+ init_completion(&data->flash->flash_completion);
+ INIT_DELAYED_WORK(&data->flash->work, mxt_fw_work);
+ reinit_completion(&data->flash->flash_completion);
- while (true) {
- ret = mxt_check_bootloader(data, &f);
+ if (!data->in_bootloader) {
+ ret = mxt_enter_bootloader(data);
if (ret)
- return ret;
-
- if (f.complete)
- break;
+ goto release_firmware;
}
- /* Wait for flash. */
- ret = mxt_wait_for_completion(data, &data->chg_completion,
- MXT_FW_RESET_TIME);
- if (ret)
- goto disable_irq;
+ enable_irq(data->irq);
+ /* Poll after 0.1s if no interrupt received */
+ schedule_delayed_work(&data->flash->work, HZ / 10);
- /*
- * Wait for device to reset. Some bootloader versions do not assert
- * the CHG line after bootloading has finished, so ignore potential
- * errors.
- */
- mxt_wait_for_completion(data, &data->chg_completion, MXT_FW_RESET_TIME);
+ /* Wait for flash. */
+ ret = mxt_wait_for_completion(data, &data->flash->flash_completion,
+ MXT_BOOTLOADER_WAIT);
- data->in_bootloader = false;
-disable_irq:
disable_irq(data->irq);
+ cancel_delayed_work_sync(&data->flash->work);
+ data->in_bootloader = false;
release_firmware:
- release_firmware(f.fw);
+ release_firmware(data->flash->fw);
+free:
+ devm_kfree(dev, data->flash);
return ret;
}
--
2.19.2
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v1 27/63] Input: atmel_mxt_ts - delay enabling IRQ when not using regulators
2019-08-16 8:33 ` Jiada Wang
@ 2019-08-16 8:33 ` Jiada Wang
-1 siblings, 0 replies; 10+ messages in thread
From: Jiada Wang @ 2019-08-16 8:33 UTC (permalink / raw)
To: nick, dmitry.torokhov; +Cc: linux-input, linux-kernel, jiada_wang, george_davis
From: Nick Dyer <nick.dyer@itdev.co.uk>
The path of enabling the IRQ in the probe function is not safe in level
triggered operation, if it was already powered up and there is a message
waiting on the device (eg finger down) because the object table has not yet
been read. This forces the ISR into a hard loop.
Delay enabling the interrupt until it is first needed.
Signed-off-by: Nick Dyer <nick.dyer@itdev.co.uk>
(cherry picked from ndyer/linux/for-upstream commit 64c9dadc4a3250a185baf06ab0f628be45d5d9a0)
[gdavis: Resolve forward port conflicts due to v4.14-rc1 commit
8cc8446b9b62 ("Input: atmel_mxt_ts - use more managed
resources") and applying upstream commit 96a938aa214e ("Input:
atmel_mxt_ts - remove platform data support").]
Signed-off-by: George G. Davis <george_davis@mentor.com>
Signed-off-by: Jiada Wang <jiada_wang@mentor.com>
---
drivers/input/touchscreen/atmel_mxt_ts.c | 40 +++++++++++++++---------
1 file changed, 26 insertions(+), 14 deletions(-)
diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c
index 2bc80abcbd80..d3e1cd677aa7 100644
--- a/drivers/input/touchscreen/atmel_mxt_ts.c
+++ b/drivers/input/touchscreen/atmel_mxt_ts.c
@@ -1450,9 +1450,24 @@ static int mxt_acquire_irq(struct mxt_data *data)
{
int error;
- enable_irq(data->irq);
+ if (!data->irq) {
+ error = devm_request_threaded_irq(&data->client->dev,
+ data->client->irq,
+ NULL, mxt_interrupt,
+ IRQF_ONESHOT,
+ data->client->name, data);
+ if (error) {
+ dev_err(&data->client->dev, "Error requesting irq\n");
+ return error;
+ }
+
+ /* Presence of data->irq means IRQ initialised */
+ data->irq = data->client->irq;
+ } else {
+ enable_irq(data->irq);
+ }
- if (data->use_retrigen_workaround) {
+ if (data->object_table && data->use_retrigen_workaround) {
error = mxt_process_messages_until_invalid(data);
if (error)
return error;
@@ -3369,7 +3384,9 @@ static int mxt_load_fw(struct device *dev)
goto release_firmware;
}
- enable_irq(data->irq);
+ ret = mxt_acquire_irq(data);
+ if (ret)
+ goto release_firmware;
/* Poll after 0.1s if no interrupt received */
schedule_delayed_work(&data->flash->work, HZ / 10);
@@ -3769,7 +3786,6 @@ static int mxt_probe(struct i2c_client *client, const struct i2c_device_id *id)
client->adapter->nr, client->addr);
data->client = client;
- data->irq = client->irq;
i2c_set_clientdata(client, data);
init_completion(&data->chg_completion);
@@ -3797,26 +3813,22 @@ static int mxt_probe(struct i2c_client *client, const struct i2c_device_id *id)
return error;
}
- error = devm_request_threaded_irq(&client->dev, client->irq,
- NULL, mxt_interrupt, IRQF_ONESHOT,
- client->name, data);
- if (error) {
- dev_err(&client->dev, "Failed to register interrupt\n");
- return error;
- }
-
if (data->suspend_mode == MXT_SUSPEND_REGULATOR) {
+ error = mxt_acquire_irq(data);
+ if (error)
+ return error;
+
error = mxt_probe_regulators(data);
if (error)
return error;
+
+ disable_irq(data->irq);
} else if (data->reset_gpio) {
msleep(MXT_RESET_GPIO_TIME);
gpiod_set_value(data->reset_gpio, 1);
msleep(MXT_RESET_INVALID_CHG);
}
- disable_irq(data->irq);
-
error = sysfs_create_group(&client->dev.kobj, &mxt_fw_attr_group);
if (error) {
dev_err(&client->dev, "Failure %d creating fw sysfs group\n",
--
2.19.2
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v1 27/63] Input: atmel_mxt_ts - delay enabling IRQ when not using regulators
@ 2019-08-16 8:33 ` Jiada Wang
0 siblings, 0 replies; 10+ messages in thread
From: Jiada Wang @ 2019-08-16 8:33 UTC (permalink / raw)
To: nick, dmitry.torokhov; +Cc: linux-input, linux-kernel, jiada_wang, george_davis
From: Nick Dyer <nick.dyer@itdev.co.uk>
The path of enabling the IRQ in the probe function is not safe in level
triggered operation, if it was already powered up and there is a message
waiting on the device (eg finger down) because the object table has not yet
been read. This forces the ISR into a hard loop.
Delay enabling the interrupt until it is first needed.
Signed-off-by: Nick Dyer <nick.dyer@itdev.co.uk>
(cherry picked from ndyer/linux/for-upstream commit 64c9dadc4a3250a185baf06ab0f628be45d5d9a0)
[gdavis: Resolve forward port conflicts due to v4.14-rc1 commit
8cc8446b9b62 ("Input: atmel_mxt_ts - use more managed
resources") and applying upstream commit 96a938aa214e ("Input:
atmel_mxt_ts - remove platform data support").]
Signed-off-by: George G. Davis <george_davis@mentor.com>
Signed-off-by: Jiada Wang <jiada_wang@mentor.com>
---
drivers/input/touchscreen/atmel_mxt_ts.c | 40 +++++++++++++++---------
1 file changed, 26 insertions(+), 14 deletions(-)
diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c
index 2bc80abcbd80..d3e1cd677aa7 100644
--- a/drivers/input/touchscreen/atmel_mxt_ts.c
+++ b/drivers/input/touchscreen/atmel_mxt_ts.c
@@ -1450,9 +1450,24 @@ static int mxt_acquire_irq(struct mxt_data *data)
{
int error;
- enable_irq(data->irq);
+ if (!data->irq) {
+ error = devm_request_threaded_irq(&data->client->dev,
+ data->client->irq,
+ NULL, mxt_interrupt,
+ IRQF_ONESHOT,
+ data->client->name, data);
+ if (error) {
+ dev_err(&data->client->dev, "Error requesting irq\n");
+ return error;
+ }
+
+ /* Presence of data->irq means IRQ initialised */
+ data->irq = data->client->irq;
+ } else {
+ enable_irq(data->irq);
+ }
- if (data->use_retrigen_workaround) {
+ if (data->object_table && data->use_retrigen_workaround) {
error = mxt_process_messages_until_invalid(data);
if (error)
return error;
@@ -3369,7 +3384,9 @@ static int mxt_load_fw(struct device *dev)
goto release_firmware;
}
- enable_irq(data->irq);
+ ret = mxt_acquire_irq(data);
+ if (ret)
+ goto release_firmware;
/* Poll after 0.1s if no interrupt received */
schedule_delayed_work(&data->flash->work, HZ / 10);
@@ -3769,7 +3786,6 @@ static int mxt_probe(struct i2c_client *client, const struct i2c_device_id *id)
client->adapter->nr, client->addr);
data->client = client;
- data->irq = client->irq;
i2c_set_clientdata(client, data);
init_completion(&data->chg_completion);
@@ -3797,26 +3813,22 @@ static int mxt_probe(struct i2c_client *client, const struct i2c_device_id *id)
return error;
}
- error = devm_request_threaded_irq(&client->dev, client->irq,
- NULL, mxt_interrupt, IRQF_ONESHOT,
- client->name, data);
- if (error) {
- dev_err(&client->dev, "Failed to register interrupt\n");
- return error;
- }
-
if (data->suspend_mode == MXT_SUSPEND_REGULATOR) {
+ error = mxt_acquire_irq(data);
+ if (error)
+ return error;
+
error = mxt_probe_regulators(data);
if (error)
return error;
+
+ disable_irq(data->irq);
} else if (data->reset_gpio) {
msleep(MXT_RESET_GPIO_TIME);
gpiod_set_value(data->reset_gpio, 1);
msleep(MXT_RESET_INVALID_CHG);
}
- disable_irq(data->irq);
-
error = sysfs_create_group(&client->dev.kobj, &mxt_fw_attr_group);
if (error) {
dev_err(&client->dev, "Failure %d creating fw sysfs group\n",
--
2.19.2
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v1 28/63] Input: atmel_mxt_ts - implement I2C retries
2019-08-16 8:33 ` Jiada Wang
@ 2019-08-16 8:33 ` Jiada Wang
-1 siblings, 0 replies; 10+ messages in thread
From: Jiada Wang @ 2019-08-16 8:33 UTC (permalink / raw)
To: nick, dmitry.torokhov; +Cc: linux-input, linux-kernel, jiada_wang, george_davis
From: Nick Dyer <nick.dyer@itdev.co.uk>
Some maXTouch chips (eg mXT1386) will not respond on the first I2C request
when they are in a sleep state. It must be retried after a delay for the
chip to wake up.
Signed-off-by: Nick Dyer <nick.dyer@itdev.co.uk>
Acked-by: Yufeng Shen <miletus@chromium.org>
(cherry picked from ndyer/linux/for-upstream commit 63fd7a2cd03c3a572a5db39c52f4856819e1835d)
[gdavis: Forward port and fix conflicts.]
Signed-off-by: George G. Davis <george_davis@mentor.com>
Signed-off-by: Jiada Wang <jiada_wang@mentor.com>
---
drivers/input/touchscreen/atmel_mxt_ts.c | 45 ++++++++++++++++--------
1 file changed, 30 insertions(+), 15 deletions(-)
diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c
index d3e1cd677aa7..86c016dbec0d 100644
--- a/drivers/input/touchscreen/atmel_mxt_ts.c
+++ b/drivers/input/touchscreen/atmel_mxt_ts.c
@@ -216,6 +216,7 @@ enum t100_type {
#define MXT_CRC_TIMEOUT 1000 /* msec */
#define MXT_FW_RESET_TIME 3000 /* msec */
#define MXT_FW_CHG_TIMEOUT 300 /* msec */
+#define MXT_WAKEUP_TIME 25 /* msec */
#define MXT_REGULATOR_DELAY 150 /* msec */
#define MXT_CHG_DELAY 100 /* msec */
#define MXT_POWERON_DELAY 150 /* msec */
@@ -723,6 +724,7 @@ static int __mxt_read_reg(struct i2c_client *client,
struct i2c_msg xfer[2];
u8 buf[2];
int ret;
+ bool retry = false;
buf[0] = reg & 0xff;
buf[1] = (reg >> 8) & 0xff;
@@ -739,17 +741,22 @@ static int __mxt_read_reg(struct i2c_client *client,
xfer[1].len = len;
xfer[1].buf = val;
- ret = i2c_transfer(client->adapter, xfer, 2);
- if (ret == 2) {
- ret = 0;
- } else {
- if (ret >= 0)
- ret = -EIO;
- dev_err(&client->dev, "%s: i2c transfer failed (%d)\n",
- __func__, ret);
+retry_read:
+ ret = i2c_transfer(client->adapter, xfer, ARRAY_SIZE(xfer));
+ if (ret != ARRAY_SIZE(xfer)) {
+ if (!retry) {
+ dev_dbg(&client->dev, "%s: i2c retry\n", __func__);
+ msleep(MXT_WAKEUP_TIME);
+ retry = true;
+ goto retry_read;
+ } else {
+ dev_err(&client->dev, "%s: i2c transfer failed (%d)\n",
+ __func__, ret);
+ return -EIO;
+ }
}
- return ret;
+ return 0;
}
static int mxt_read_blks(struct mxt_data *data, u16 start, u16 count, u8 *buf)
@@ -779,6 +786,7 @@ static int __mxt_write_reg(struct i2c_client *client, u16 reg, u16 len,
u8 *buf;
size_t count;
int ret;
+ bool retry = false;
count = len + 2;
buf = kmalloc(count, GFP_KERNEL);
@@ -789,14 +797,21 @@ static int __mxt_write_reg(struct i2c_client *client, u16 reg, u16 len,
buf[1] = (reg >> 8) & 0xff;
memcpy(&buf[2], val, len);
+retry_write:
ret = i2c_master_send(client, buf, count);
- if (ret == count) {
- ret = 0;
- } else {
- if (ret >= 0)
+ if (ret != count) {
+ if (!retry) {
+ dev_dbg(&client->dev, "%s: i2c retry\n", __func__);
+ msleep(MXT_WAKEUP_TIME);
+ retry = true;
+ goto retry_write;
+ } else {
+ dev_err(&client->dev, "%s: i2c send failed (%d)\n",
+ __func__, ret);
ret = -EIO;
- dev_err(&client->dev, "%s: i2c send failed (%d)\n",
- __func__, ret);
+ }
+ } else {
+ ret = 0;
}
kfree(buf);
--
2.19.2
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v1 28/63] Input: atmel_mxt_ts - implement I2C retries
@ 2019-08-16 8:33 ` Jiada Wang
0 siblings, 0 replies; 10+ messages in thread
From: Jiada Wang @ 2019-08-16 8:33 UTC (permalink / raw)
To: nick, dmitry.torokhov; +Cc: linux-input, linux-kernel, jiada_wang, george_davis
From: Nick Dyer <nick.dyer@itdev.co.uk>
Some maXTouch chips (eg mXT1386) will not respond on the first I2C request
when they are in a sleep state. It must be retried after a delay for the
chip to wake up.
Signed-off-by: Nick Dyer <nick.dyer@itdev.co.uk>
Acked-by: Yufeng Shen <miletus@chromium.org>
(cherry picked from ndyer/linux/for-upstream commit 63fd7a2cd03c3a572a5db39c52f4856819e1835d)
[gdavis: Forward port and fix conflicts.]
Signed-off-by: George G. Davis <george_davis@mentor.com>
Signed-off-by: Jiada Wang <jiada_wang@mentor.com>
---
drivers/input/touchscreen/atmel_mxt_ts.c | 45 ++++++++++++++++--------
1 file changed, 30 insertions(+), 15 deletions(-)
diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c
index d3e1cd677aa7..86c016dbec0d 100644
--- a/drivers/input/touchscreen/atmel_mxt_ts.c
+++ b/drivers/input/touchscreen/atmel_mxt_ts.c
@@ -216,6 +216,7 @@ enum t100_type {
#define MXT_CRC_TIMEOUT 1000 /* msec */
#define MXT_FW_RESET_TIME 3000 /* msec */
#define MXT_FW_CHG_TIMEOUT 300 /* msec */
+#define MXT_WAKEUP_TIME 25 /* msec */
#define MXT_REGULATOR_DELAY 150 /* msec */
#define MXT_CHG_DELAY 100 /* msec */
#define MXT_POWERON_DELAY 150 /* msec */
@@ -723,6 +724,7 @@ static int __mxt_read_reg(struct i2c_client *client,
struct i2c_msg xfer[2];
u8 buf[2];
int ret;
+ bool retry = false;
buf[0] = reg & 0xff;
buf[1] = (reg >> 8) & 0xff;
@@ -739,17 +741,22 @@ static int __mxt_read_reg(struct i2c_client *client,
xfer[1].len = len;
xfer[1].buf = val;
- ret = i2c_transfer(client->adapter, xfer, 2);
- if (ret == 2) {
- ret = 0;
- } else {
- if (ret >= 0)
- ret = -EIO;
- dev_err(&client->dev, "%s: i2c transfer failed (%d)\n",
- __func__, ret);
+retry_read:
+ ret = i2c_transfer(client->adapter, xfer, ARRAY_SIZE(xfer));
+ if (ret != ARRAY_SIZE(xfer)) {
+ if (!retry) {
+ dev_dbg(&client->dev, "%s: i2c retry\n", __func__);
+ msleep(MXT_WAKEUP_TIME);
+ retry = true;
+ goto retry_read;
+ } else {
+ dev_err(&client->dev, "%s: i2c transfer failed (%d)\n",
+ __func__, ret);
+ return -EIO;
+ }
}
- return ret;
+ return 0;
}
static int mxt_read_blks(struct mxt_data *data, u16 start, u16 count, u8 *buf)
@@ -779,6 +786,7 @@ static int __mxt_write_reg(struct i2c_client *client, u16 reg, u16 len,
u8 *buf;
size_t count;
int ret;
+ bool retry = false;
count = len + 2;
buf = kmalloc(count, GFP_KERNEL);
@@ -789,14 +797,21 @@ static int __mxt_write_reg(struct i2c_client *client, u16 reg, u16 len,
buf[1] = (reg >> 8) & 0xff;
memcpy(&buf[2], val, len);
+retry_write:
ret = i2c_master_send(client, buf, count);
- if (ret == count) {
- ret = 0;
- } else {
- if (ret >= 0)
+ if (ret != count) {
+ if (!retry) {
+ dev_dbg(&client->dev, "%s: i2c retry\n", __func__);
+ msleep(MXT_WAKEUP_TIME);
+ retry = true;
+ goto retry_write;
+ } else {
+ dev_err(&client->dev, "%s: i2c send failed (%d)\n",
+ __func__, ret);
ret = -EIO;
- dev_err(&client->dev, "%s: i2c send failed (%d)\n",
- __func__, ret);
+ }
+ } else {
+ ret = 0;
}
kfree(buf);
--
2.19.2
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v1 29/63] Input: atmel_mxt_ts - orientation is not present in hover
2019-08-16 8:33 ` Jiada Wang
@ 2019-08-16 8:33 ` Jiada Wang
-1 siblings, 0 replies; 10+ messages in thread
From: Jiada Wang @ 2019-08-16 8:33 UTC (permalink / raw)
To: nick, dmitry.torokhov; +Cc: linux-input, linux-kernel, jiada_wang, george_davis
From: Nick Dyer <nick.dyer@itdev.co.uk>
When in hover, the orientation information is not sent
Signed-off-by: Nick Dyer <nick.dyer@itdev.co.uk>
(cherry picked from ndyer/linux/for-upstream commit 0c885d5bd276bd9240c43aa046fc407cbe2ae864)
Signed-off-by: George G. Davis <george_davis@mentor.com>
Signed-off-by: Jiada Wang <jiada_wang@mentor.com>
---
drivers/input/touchscreen/atmel_mxt_ts.c | 4 ----
1 file changed, 4 deletions(-)
diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c
index 86c016dbec0d..ba608d04ee82 100644
--- a/drivers/input/touchscreen/atmel_mxt_ts.c
+++ b/drivers/input/touchscreen/atmel_mxt_ts.c
@@ -1028,10 +1028,6 @@ static void mxt_proc_t100_message(struct mxt_data *data, u8 *message)
distance = MXT_DISTANCE_HOVERING;
hover = true;
active = true;
-
- if (data->t100_aux_vect)
- orientation = message[data->t100_aux_vect];
-
break;
case MXT_T100_TYPE_FINGER:
--
2.19.2
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v1 29/63] Input: atmel_mxt_ts - orientation is not present in hover
@ 2019-08-16 8:33 ` Jiada Wang
0 siblings, 0 replies; 10+ messages in thread
From: Jiada Wang @ 2019-08-16 8:33 UTC (permalink / raw)
To: nick, dmitry.torokhov; +Cc: linux-input, linux-kernel, jiada_wang, george_davis
From: Nick Dyer <nick.dyer@itdev.co.uk>
When in hover, the orientation information is not sent
Signed-off-by: Nick Dyer <nick.dyer@itdev.co.uk>
(cherry picked from ndyer/linux/for-upstream commit 0c885d5bd276bd9240c43aa046fc407cbe2ae864)
Signed-off-by: George G. Davis <george_davis@mentor.com>
Signed-off-by: Jiada Wang <jiada_wang@mentor.com>
---
drivers/input/touchscreen/atmel_mxt_ts.c | 4 ----
1 file changed, 4 deletions(-)
diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c
index 86c016dbec0d..ba608d04ee82 100644
--- a/drivers/input/touchscreen/atmel_mxt_ts.c
+++ b/drivers/input/touchscreen/atmel_mxt_ts.c
@@ -1028,10 +1028,6 @@ static void mxt_proc_t100_message(struct mxt_data *data, u8 *message)
distance = MXT_DISTANCE_HOVERING;
hover = true;
active = true;
-
- if (data->t100_aux_vect)
- orientation = message[data->t100_aux_vect];
-
break;
case MXT_T100_TYPE_FINGER:
--
2.19.2
^ permalink raw reply related [flat|nested] 10+ messages in thread
end of thread, other threads:[~2019-08-16 8:34 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-08-16 8:33 [PATCH v1 25/63] Input: atmel_mxt_ts - rename bl_completion to chg_completion Jiada Wang
2019-08-16 8:33 ` Jiada Wang
2019-08-16 8:33 ` [PATCH v1 26/63] Input: atmel_mxt_ts - make bootloader interrupt driven Jiada Wang
2019-08-16 8:33 ` Jiada Wang
2019-08-16 8:33 ` [PATCH v1 27/63] Input: atmel_mxt_ts - delay enabling IRQ when not using regulators Jiada Wang
2019-08-16 8:33 ` Jiada Wang
2019-08-16 8:33 ` [PATCH v1 28/63] Input: atmel_mxt_ts - implement I2C retries Jiada Wang
2019-08-16 8:33 ` Jiada Wang
2019-08-16 8:33 ` [PATCH v1 29/63] Input: atmel_mxt_ts - orientation is not present in hover Jiada Wang
2019-08-16 8:33 ` Jiada Wang
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.