* [PATCH 1/8] qt2160: add slider support
@ 2010-11-09 2:15 jooaun
2010-11-09 2:15 ` [PATCH 2/8] qt2160: configurable key sensitivity jooaun
` (6 more replies)
0 siblings, 7 replies; 12+ messages in thread
From: jooaun @ 2010-11-09 2:15 UTC (permalink / raw)
To: dmitry.torokhov; +Cc: linux-input, raphaelpereira, jooaun
Supports keys only, slider only, slider & keys configurations.
Signed-off-by: Joo Aun Saw <jasaw81@gmail.com>
---
drivers/input/keyboard/qt2160.c | 180 +++++++++++++++++++++++++++++++++------
include/linux/input/qt2160.h | 26 ++++++
2 files changed, 181 insertions(+), 25 deletions(-)
mode change 100644 => 100755 drivers/input/keyboard/qt2160.c
create mode 100755 include/linux/input/qt2160.h
diff --git a/drivers/input/keyboard/qt2160.c b/drivers/input/keyboard/qt2160.c
old mode 100644
new mode 100755
index fac6951..7ec256c
--- a/drivers/input/keyboard/qt2160.c
+++ b/drivers/input/keyboard/qt2160.c
@@ -27,6 +27,9 @@
#include <linux/irq.h>
#include <linux/interrupt.h>
#include <linux/input.h>
+#include <linux/delay.h>
+
+#include <linux/input/qt2160.h>
#define QT2160_VALID_CHIPID 0x11
@@ -39,14 +42,32 @@
#define QT2160_CMD_GPIOS 6
#define QT2160_CMD_SUBVER 7
#define QT2160_CMD_CALIBRATE 10
+#define QT2160_CMD_RESET 11
+#define QT2160_CMD_SLIDE_CTRL 20
+#define QT2160_CMD_SLIDE_OPT 21
+#define QT2160_CMD_KEY0_AKS 22
#define QT2160_CYCLE_INTERVAL (2*HZ)
-static unsigned char qt2160_key2code[] = {
- KEY_0, KEY_1, KEY_2, KEY_3,
- KEY_4, KEY_5, KEY_6, KEY_7,
- KEY_8, KEY_9, KEY_A, KEY_B,
- KEY_C, KEY_D, KEY_E, KEY_F,
+#define QT2160_SLIDE_RESOLUTION (8)
+#define QT2160_SLIDE_HYSTERESIS (10)
+#define QT2160_SLIDE_MAX_VALUE (0xFF)
+
+static struct qt2160_info default_hw_info = {
+ .slider_length = 0,
+ .slider_axis = 0,
+ .keycodes = {
+ KEY_0, KEY_1, KEY_2, KEY_3,
+ KEY_4, KEY_5, KEY_6, KEY_7,
+ KEY_8, KEY_9, KEY_A, KEY_B,
+ KEY_C, KEY_D, KEY_E, KEY_F,
+ },
+ .key_aks = {
+ 0, 0, 0, 0,
+ 0, 0, 0, 0,
+ 0, 0, 0, 0,
+ 0, 0, 0, 0,
+ },
};
struct qt2160_data {
@@ -54,8 +75,10 @@ struct qt2160_data {
struct input_dev *input;
struct delayed_work dwork;
spinlock_t lock; /* Protects canceling/rescheduling of dwork */
- unsigned short keycodes[ARRAY_SIZE(qt2160_key2code)];
+ struct qt2160_info *hw_info;
u16 key_matrix;
+ u8 slide_val;
+ unsigned char num_keys;
};
static int qt2160_read_block(struct i2c_client *client,
@@ -113,8 +136,10 @@ static int qt2160_get_key_matrix(struct qt2160_data *qt2160)
{
struct i2c_client *client = qt2160->client;
struct input_dev *input = qt2160->input;
+ struct qt2160_info *hw_info = qt2160->hw_info;
u8 regs[6];
u16 old_matrix, new_matrix;
+ u8 old_slide;
int ret, i, mask;
dev_dbg(&client->dev, "requesting keys...\n");
@@ -130,17 +155,30 @@ static int qt2160_get_key_matrix(struct qt2160_data *qt2160)
return ret;
}
- old_matrix = qt2160->key_matrix;
- qt2160->key_matrix = new_matrix = (regs[2] << 8) | regs[1];
-
- mask = 0x01;
- for (i = 0; i < 16; ++i, mask <<= 1) {
- int keyval = new_matrix & mask;
+ if (hw_info->slider_length) {
+ old_slide = qt2160->slide_val;
+ if (old_slide != regs[3]) {
+ qt2160->slide_val = regs[3];
+ input_report_abs(input, hw_info->slider_axis, regs[3]);
+ }
+ }
- if ((old_matrix & mask) != keyval) {
- input_report_key(input, qt2160->keycodes[i], keyval);
- dev_dbg(&client->dev, "key %d %s\n",
- i, keyval ? "pressed" : "released");
+ if (qt2160->num_keys) {
+ old_matrix = qt2160->key_matrix;
+ qt2160->key_matrix = new_matrix = (regs[2] << 8) | regs[1];
+
+ mask = 0x01 << hw_info->slider_length;
+ for (i = hw_info->slider_length; i < QT2160_MAXKEYS;
+ ++i, mask <<= 1) {
+ int keyval = new_matrix & mask;
+
+ if (((old_matrix & mask) != keyval) &&
+ (hw_info->keycodes[i])) {
+ input_report_key(input, hw_info->keycodes[i],
+ keyval);
+ dev_dbg(&client->dev, "key %d %s\n",
+ i, keyval ? "pressed" : "released");
+ }
}
}
@@ -226,6 +264,52 @@ static int __devinit qt2160_write(struct i2c_client *client, u8 reg, u8 data)
return error;
}
+static int __devinit qt2160_configure_device(struct i2c_client *client,
+ struct qt2160_data *qt2160)
+{
+ struct qt2160_info *pdata = qt2160->hw_info;
+ int i;
+ int error = 0;
+
+ /* perform software reset and wait for at least 32ms */
+ i2c_smbus_write_byte_data(client, QT2160_CMD_RESET, 0xFF);
+ msleep(200);
+
+ /* perform dummy write to reset I2C state */
+ i2c_smbus_write_byte(client, QT2160_CMD_CHIPID);
+
+ /* setup slider control and slider options */
+ if (pdata->slider_length) {
+ error |= i2c_smbus_write_byte_data(
+ client,
+ QT2160_CMD_SLIDE_CTRL,
+ (QT2160_SLIDE_HYSTERESIS << 4) |
+ (pdata->slider_length & 0x0F));
+ error |= i2c_smbus_write_byte_data(client, QT2160_CMD_SLIDE_OPT,
+ 8 - QT2160_SLIDE_RESOLUTION);
+ } else {
+ error = i2c_smbus_write_byte_data(client,
+ QT2160_CMD_SLIDE_CTRL, 0);
+ }
+ if (error) {
+ dev_err(&client->dev, "could not write slider config\n");
+ goto config_fault;
+ }
+
+ for (i = 0; i < QT2160_MAXKEYS; i++) {
+ /* set AKS */
+ error |= i2c_smbus_write_byte_data(client,
+ QT2160_CMD_KEY0_AKS + i,
+ pdata->key_aks[i]);
+ }
+ if (error) {
+ dev_err(&client->dev, "could not write key config\n");
+ goto config_fault;
+ }
+
+config_fault:
+ return error;
+}
static bool __devinit qt2160_identify(struct i2c_client *client)
{
@@ -263,6 +347,8 @@ static int __devinit qt2160_probe(struct i2c_client *client,
{
struct qt2160_data *qt2160;
struct input_dev *input;
+ struct qt2160_info *pdata;
+ struct qt2160_info *hw_info;
int i;
int error;
@@ -275,6 +361,8 @@ static int __devinit qt2160_probe(struct i2c_client *client,
return -ENODEV;
}
+ pdata = client->dev.platform_data;
+
if (!qt2160_identify(client))
return -ENODEV;
@@ -287,6 +375,33 @@ static int __devinit qt2160_probe(struct i2c_client *client,
goto err_free_mem;
}
+ if (pdata)
+ qt2160->hw_info = pdata;
+ else
+ qt2160->hw_info = &default_hw_info;
+ hw_info = qt2160->hw_info;
+
+ qt2160->num_keys = 0;
+ for (i = hw_info->slider_length; i < QT2160_MAXKEYS; ++i) {
+ if (hw_info->keycodes[i])
+ qt2160->num_keys++;
+ }
+ if ((!qt2160->num_keys) &&
+ (hw_info->slider_length < QT2160_MIN_SLIDER_LENGTH)) {
+ dev_err(&client->dev, "No valid input device specified\n");
+ error = -EINVAL;
+ goto err_free_mem;
+ }
+ if (hw_info->slider_length != 0) {
+ if ((hw_info->slider_length > QT2160_MAX_SLIDER_LENGTH) ||
+ (hw_info->slider_length < QT2160_MIN_SLIDER_LENGTH)) {
+ dev_err(&client->dev, "%d keys slider not supported\n",
+ hw_info->slider_length);
+ error = -EINVAL;
+ goto err_free_mem;
+ }
+ }
+
qt2160->client = client;
qt2160->input = input;
INIT_DELAYED_WORK(&qt2160->dwork, qt2160_worker);
@@ -295,17 +410,32 @@ static int __devinit qt2160_probe(struct i2c_client *client,
input->name = "AT42QT2160 Touch Sense Keyboard";
input->id.bustype = BUS_I2C;
- input->keycode = qt2160->keycodes;
- input->keycodesize = sizeof(qt2160->keycodes[0]);
- input->keycodemax = ARRAY_SIZE(qt2160_key2code);
+ if (qt2160->num_keys) {
+ input->keycode = hw_info->keycodes;
+ input->keycodesize = sizeof(hw_info->keycodes[0]);
+ input->keycodemax = QT2160_MAXKEYS - hw_info->slider_length;
+
+ __set_bit(EV_KEY, input->evbit);
+ __clear_bit(EV_REP, input->evbit);
+ for (i = hw_info->slider_length; i < QT2160_MAXKEYS; i++) {
+ if (hw_info->keycodes[i])
+ __set_bit(hw_info->keycodes[i], input->keybit);
+ }
+ __clear_bit(KEY_RESERVED, input->keybit);
+ }
+ if (hw_info->slider_length) {
+ __set_bit(EV_ABS, input->evbit);
+ __set_bit(hw_info->slider_axis, input->absbit);
+ input_set_abs_params(input, hw_info->slider_axis, 0,
+ QT2160_SLIDE_MAX_VALUE, 0, 0);
+ }
- __set_bit(EV_KEY, input->evbit);
- __clear_bit(EV_REP, input->evbit);
- for (i = 0; i < ARRAY_SIZE(qt2160_key2code); i++) {
- qt2160->keycodes[i] = qt2160_key2code[i];
- __set_bit(qt2160_key2code[i], input->keybit);
+ /* Configure device */
+ error = qt2160_configure_device(client, qt2160);
+ if (error) {
+ dev_err(&client->dev, "failed to configure device\n");
+ goto err_free_mem;
}
- __clear_bit(KEY_RESERVED, input->keybit);
/* Calibrate device */
error = qt2160_write(client, QT2160_CMD_CALIBRATE, 1);
diff --git a/include/linux/input/qt2160.h b/include/linux/input/qt2160.h
new file mode 100755
index 0000000..9d1252e
--- /dev/null
+++ b/include/linux/input/qt2160.h
@@ -0,0 +1,26 @@
+#ifndef __QT2160_H__
+#define __QT2160_H__
+
+#define QT2160_MAXKEYS 16
+#define QT2160_MAX_SLIDER_LENGTH 8
+#define QT2160_MIN_SLIDER_LENGTH 2
+
+/**
+ * struct qt2160_info - defines the chip configuration
+ * @slider_length: number of keys to use as slider, max 8 keys, min 2 keys
+ * @slider_axis: absolute axis type, value 0 is ABS_X
+ * @keycodes: key codes for keys that are part of the slider are ignored; slider
+ * keys always start from key index 0 and end at key index (slider_length - 1);
+ * set to value 0 if key is not used;
+ * @key_aks: adjacent key suppression; keys that form a slider must be in the
+ * same aks group; keys in the same aks group will only report 1 active key at
+ * any time; value 0 disables aks group; valid aks groups are 1, 2, 3
+ */
+struct qt2160_info {
+ unsigned char slider_length;
+ unsigned int slider_axis;
+ unsigned short keycodes[QT2160_MAXKEYS];
+ unsigned char key_aks[QT2160_MAXKEYS];
+};
+
+#endif /* __QT2160_H__ */
--
1.7.0.4
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 2/8] qt2160: configurable key sensitivity
2010-11-09 2:15 [PATCH 1/8] qt2160: add slider support jooaun
@ 2010-11-09 2:15 ` jooaun
2010-11-09 2:43 ` jooaun
2010-11-09 2:15 ` [PATCH 3/8] qt2160: add PM support jooaun
` (5 subsequent siblings)
6 siblings, 1 reply; 12+ messages in thread
From: jooaun @ 2010-11-09 2:15 UTC (permalink / raw)
To: dmitry.torokhov; +Cc: linux-input, raphaelpereira, jooaun
Add configurable key sensitivity, disable unused keys.
Configurable key sensitivity to compensate for different touch sensor circuits.
Disable unused keys to reduce power consumption.
Signed-off-by: Joo Aun Saw <jasaw81@gmail.com>
Conflicts:
include/linux/input/qt2160.h
---
drivers/input/keyboard/qt2160.c | 38 ++++++++++++++++++++++++++++++++++++++
include/linux/input/qt2160.h | 2 ++
2 files changed, 40 insertions(+), 0 deletions(-)
diff --git a/drivers/input/keyboard/qt2160.c b/drivers/input/keyboard/qt2160.c
index 7ec256c..dcd05cd 100755
--- a/drivers/input/keyboard/qt2160.c
+++ b/drivers/input/keyboard/qt2160.c
@@ -43,9 +43,26 @@
#define QT2160_CMD_SUBVER 7
#define QT2160_CMD_CALIBRATE 10
#define QT2160_CMD_RESET 11
+#define QT2160_CMD_BURST_REP 13
+#define QT2160_CMD_NEG_DRIFT 15
+#define QT2160_CMD_POS_DRIFT 16
+#define QT2160_CMD_DI_LIMIT 17
+#define QT2160_CMD_NEG_RECAL 18
+#define QT2160_CMD_DHTA 19
#define QT2160_CMD_SLIDE_CTRL 20
#define QT2160_CMD_SLIDE_OPT 21
#define QT2160_CMD_KEY0_AKS 22
+#define QT2160_CMD_KEY0_NEGT 38
+#define QT2160_CMD_KEY0_BURST 54
+#define QT2160_CMD_GPIO_DRV1 70
+#define QT2160_CMD_GPIO_DRV2 71
+#define QT2160_CMD_GPIO_DIR 73
+#define QT2160_CMD_GPIO_PWM1 74
+#define QT2160_CMD_GPIO_PWM2 75
+#define QT2160_CMD_PWM_LEVEL 76
+#define QT2160_CMD_GPIO_WAKE 77
+#define QT2160_CMD_CC_KEYS1 78
+#define QT2160_CMD_CC_KEYS2 79
#define QT2160_CYCLE_INTERVAL (2*HZ)
@@ -297,6 +314,27 @@ static int __devinit qt2160_configure_device(struct i2c_client *client,
}
for (i = 0; i < QT2160_MAXKEYS; i++) {
+ /* setup burst length and disable unused keys */
+ if (i < pdata->slider_length) {
+ if (pdata->key_burst_length[i])
+ error |= i2c_smbus_write_byte_data(
+ client,
+ QT2160_CMD_KEY0_BURST + i,
+ pdata->key_burst_length[i]);
+ } else {
+ if (pdata->keycodes[i]) {
+ if (pdata->key_burst_length[i])
+ error |= i2c_smbus_write_byte_data(
+ client,
+ QT2160_CMD_KEY0_BURST + i,
+ pdata->key_burst_length[i]);
+ } else {
+ error |= i2c_smbus_write_byte_data(
+ client,
+ QT2160_CMD_KEY0_BURST + i,
+ 0);
+ }
+ }
/* set AKS */
error |= i2c_smbus_write_byte_data(client,
QT2160_CMD_KEY0_AKS + i,
diff --git a/include/linux/input/qt2160.h b/include/linux/input/qt2160.h
index 9d1252e..748c86e 100755
--- a/include/linux/input/qt2160.h
+++ b/include/linux/input/qt2160.h
@@ -15,12 +15,14 @@
* @key_aks: adjacent key suppression; keys that form a slider must be in the
* same aks group; keys in the same aks group will only report 1 active key at
* any time; value 0 disables aks group; valid aks groups are 1, 2, 3
+ * @key_burst_length: key sensitivity; 0 use default
*/
struct qt2160_info {
unsigned char slider_length;
unsigned int slider_axis;
unsigned short keycodes[QT2160_MAXKEYS];
unsigned char key_aks[QT2160_MAXKEYS];
+ unsigned char key_burst_length[QT2160_MAXKEYS];
};
#endif /* __QT2160_H__ */
--
1.7.0.4
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 3/8] qt2160: add PM support
2010-11-09 2:15 [PATCH 1/8] qt2160: add slider support jooaun
2010-11-09 2:15 ` [PATCH 2/8] qt2160: configurable key sensitivity jooaun
@ 2010-11-09 2:15 ` jooaun
2010-11-09 2:15 ` [PATCH 4/8] qt2160: add configurable power mode jooaun
` (4 subsequent siblings)
6 siblings, 0 replies; 12+ messages in thread
From: jooaun @ 2010-11-09 2:15 UTC (permalink / raw)
To: dmitry.torokhov; +Cc: linux-input, raphaelpereira, jooaun
Add power management support.
Signed-off-by: Joo Aun Saw <jasaw81@gmail.com>
---
drivers/input/keyboard/qt2160.c | 34 ++++++++++++++++++++++++++++++++++
1 files changed, 34 insertions(+), 0 deletions(-)
diff --git a/drivers/input/keyboard/qt2160.c b/drivers/input/keyboard/qt2160.c
index dcd05cd..6439e40 100755
--- a/drivers/input/keyboard/qt2160.c
+++ b/drivers/input/keyboard/qt2160.c
@@ -43,6 +43,7 @@
#define QT2160_CMD_SUBVER 7
#define QT2160_CMD_CALIBRATE 10
#define QT2160_CMD_RESET 11
+#define QT2160_CMD_LP_MODE 12
#define QT2160_CMD_BURST_REP 13
#define QT2160_CMD_NEG_DRIFT 15
#define QT2160_CMD_POS_DRIFT 16
@@ -66,6 +67,9 @@
#define QT2160_CYCLE_INTERVAL (2*HZ)
+#define QT2160_LP_MODE_DEFAULT_VALUE (1)
+#define QT2160_LP_MODE_SLEEP_VALUE (0)
+
#define QT2160_SLIDE_RESOLUTION (8)
#define QT2160_SLIDE_HYSTERESIS (10)
#define QT2160_SLIDE_MAX_VALUE (0xFF)
@@ -529,6 +533,34 @@ static int __devexit qt2160_remove(struct i2c_client *client)
return 0;
}
+#ifdef CONFIG_PM
+static int qt2160_suspend(struct i2c_client *client, pm_message_t message)
+{
+ int error;
+
+ error = i2c_smbus_write_byte_data(client, QT2160_CMD_LP_MODE,
+ QT2160_LP_MODE_SLEEP_VALUE);
+ if (error)
+ dev_err(&client->dev, "could not write power config\n");
+ return error;
+}
+
+static int qt2160_resume(struct i2c_client *client)
+{
+ int error;
+ u8 lp_mode_val = QT2160_LP_MODE_DEFAULT_VALUE;
+
+ error = i2c_smbus_write_byte_data(client, QT2160_CMD_LP_MODE,
+ lp_mode_val);
+ if (error)
+ dev_err(&client->dev, "could not write power config\n");
+ return error;
+}
+#else
+#define qt2160_suspend NULL
+#define qt2160_resume NULL
+#endif
+
static const struct i2c_device_id qt2160_idtable[] = {
{ "qt2160", 0, },
{ }
@@ -545,6 +577,8 @@ static struct i2c_driver qt2160_driver = {
.id_table = qt2160_idtable,
.probe = qt2160_probe,
.remove = __devexit_p(qt2160_remove),
+ .suspend = qt2160_suspend,
+ .resume = qt2160_resume,
};
static int __init qt2160_init(void)
--
1.7.0.4
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 4/8] qt2160: add configurable power mode
2010-11-09 2:15 [PATCH 1/8] qt2160: add slider support jooaun
2010-11-09 2:15 ` [PATCH 2/8] qt2160: configurable key sensitivity jooaun
2010-11-09 2:15 ` [PATCH 3/8] qt2160: add PM support jooaun
@ 2010-11-09 2:15 ` jooaun
2010-11-09 2:15 ` [PATCH 5/8] qt2160: fix starting of device calibration jooaun
` (3 subsequent siblings)
6 siblings, 0 replies; 12+ messages in thread
From: jooaun @ 2010-11-09 2:15 UTC (permalink / raw)
To: dmitry.torokhov; +Cc: linux-input, raphaelpereira, jooaun
Add configurable low power mode to reduce power consumption. We trade off responsiveness for lower power consumption. Each +1 increment in value causes the chip to sleep 16ms longer before detecting a touch.
Signed-off-by: Joo Aun Saw <jasaw81@gmail.com>
---
drivers/input/keyboard/qt2160.c | 13 +++++++++++++
include/linux/input/qt2160.h | 3 +++
2 files changed, 16 insertions(+), 0 deletions(-)
diff --git a/drivers/input/keyboard/qt2160.c b/drivers/input/keyboard/qt2160.c
index 6439e40..0d662e2 100755
--- a/drivers/input/keyboard/qt2160.c
+++ b/drivers/input/keyboard/qt2160.c
@@ -299,6 +299,15 @@ static int __devinit qt2160_configure_device(struct i2c_client *client,
/* perform dummy write to reset I2C state */
i2c_smbus_write_byte(client, QT2160_CMD_CHIPID);
+ /* setup LP mode */
+ if (pdata->low_power_mode) {
+ error = i2c_smbus_write_byte_data(client, QT2160_CMD_LP_MODE,
+ pdata->low_power_mode);
+ if (error) {
+ dev_err(&client->dev, "could not write power config\n");
+ goto config_fault;
+ }
+ }
/* setup slider control and slider options */
if (pdata->slider_length) {
error |= i2c_smbus_write_byte_data(
@@ -547,9 +556,13 @@ static int qt2160_suspend(struct i2c_client *client, pm_message_t message)
static int qt2160_resume(struct i2c_client *client)
{
+ struct qt2160_data *qt2160 = i2c_get_clientdata(client);
+ struct qt2160_info *hw_info = qt2160->hw_info;
int error;
u8 lp_mode_val = QT2160_LP_MODE_DEFAULT_VALUE;
+ if (hw_info->low_power_mode)
+ lp_mode_val = hw_info->low_power_mode;
error = i2c_smbus_write_byte_data(client, QT2160_CMD_LP_MODE,
lp_mode_val);
if (error)
diff --git a/include/linux/input/qt2160.h b/include/linux/input/qt2160.h
index 748c86e..8a1913f 100755
--- a/include/linux/input/qt2160.h
+++ b/include/linux/input/qt2160.h
@@ -16,6 +16,8 @@
* same aks group; keys in the same aks group will only report 1 active key at
* any time; value 0 disables aks group; valid aks groups are 1, 2, 3
* @key_burst_length: key sensitivity; 0 use default
+ * @low_power_mode: value 0 use default; each +1 increment causes the chip to
+ * sleep 16ms longer before detecting a touch (slower response); max 255
*/
struct qt2160_info {
unsigned char slider_length;
@@ -23,6 +25,7 @@ struct qt2160_info {
unsigned short keycodes[QT2160_MAXKEYS];
unsigned char key_aks[QT2160_MAXKEYS];
unsigned char key_burst_length[QT2160_MAXKEYS];
+ unsigned char low_power_mode;
};
#endif /* __QT2160_H__ */
--
1.7.0.4
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 5/8] qt2160: fix starting of device calibration
2010-11-09 2:15 [PATCH 1/8] qt2160: add slider support jooaun
` (2 preceding siblings ...)
2010-11-09 2:15 ` [PATCH 4/8] qt2160: add configurable power mode jooaun
@ 2010-11-09 2:15 ` jooaun
2010-11-09 2:15 ` [PATCH 6/8] qt2160: only read device when Change pin is active jooaun
` (2 subsequent siblings)
6 siblings, 0 replies; 12+ messages in thread
From: jooaun @ 2010-11-09 2:15 UTC (permalink / raw)
To: dmitry.torokhov; +Cc: linux-input, raphaelpereira, jooaun
Writing of calibration command and non-zero data value must be performed in one I2C transaction.
Signed-off-by: Joo Aun Saw <jasaw81@gmail.com>
---
drivers/input/keyboard/qt2160.c | 23 +----------------------
1 files changed, 1 insertions(+), 22 deletions(-)
diff --git a/drivers/input/keyboard/qt2160.c b/drivers/input/keyboard/qt2160.c
index 0d662e2..7647849 100755
--- a/drivers/input/keyboard/qt2160.c
+++ b/drivers/input/keyboard/qt2160.c
@@ -264,27 +264,6 @@ static int __devinit qt2160_read(struct i2c_client *client, u8 reg)
return ret;
}
-static int __devinit qt2160_write(struct i2c_client *client, u8 reg, u8 data)
-{
- int error;
-
- error = i2c_smbus_write_byte(client, reg);
- if (error) {
- dev_err(&client->dev,
- "couldn't send request. Returned %d\n", error);
- return error;
- }
-
- error = i2c_smbus_write_byte(client, data);
- if (error) {
- dev_err(&client->dev,
- "couldn't write data. Returned %d\n", error);
- return error;
- }
-
- return error;
-}
-
static int __devinit qt2160_configure_device(struct i2c_client *client,
struct qt2160_data *qt2160)
{
@@ -489,7 +468,7 @@ static int __devinit qt2160_probe(struct i2c_client *client,
}
/* Calibrate device */
- error = qt2160_write(client, QT2160_CMD_CALIBRATE, 1);
+ error = i2c_smbus_write_byte_data(client, QT2160_CMD_CALIBRATE, 1);
if (error) {
dev_err(&client->dev, "failed to calibrate device\n");
goto err_free_mem;
--
1.7.0.4
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 6/8] qt2160: only read device when Change pin is active
2010-11-09 2:15 [PATCH 1/8] qt2160: add slider support jooaun
` (3 preceding siblings ...)
2010-11-09 2:15 ` [PATCH 5/8] qt2160: fix starting of device calibration jooaun
@ 2010-11-09 2:15 ` jooaun
2010-11-09 2:45 ` jooaun
2010-11-09 2:15 ` [PATCH 7/8] qt2160: optional interrupt flag jooaun
2010-11-09 2:15 ` [PATCH 8/8] qt2160: add hardware reset jooaun
6 siblings, 1 reply; 12+ messages in thread
From: jooaun @ 2010-11-09 2:15 UTC (permalink / raw)
To: dmitry.torokhov; +Cc: linux-input, raphaelpereira, jooaun
Check Change state and only read device when required.
Signed-off-by: Joo Aun Saw <jasaw81@gmail.com>
Conflicts:
include/linux/input/qt2160.h
---
drivers/input/keyboard/qt2160.c | 12 ++++++++++++
include/linux/input/qt2160.h | 5 +++++
2 files changed, 17 insertions(+), 0 deletions(-)
diff --git a/drivers/input/keyboard/qt2160.c b/drivers/input/keyboard/qt2160.c
index 7647849..8316fde 100755
--- a/drivers/input/keyboard/qt2160.c
+++ b/drivers/input/keyboard/qt2160.c
@@ -213,6 +213,12 @@ static irqreturn_t qt2160_irq(int irq, void *_qt2160)
struct qt2160_data *qt2160 = _qt2160;
unsigned long flags;
+ if (qt2160->hw_info->getchange) {
+ /* if change is not active, no IRQ to service */
+ if (qt2160->hw_info->getchange(qt2160->hw_info->data) > 0)
+ return IRQ_HANDLED;
+ }
+
spin_lock_irqsave(&qt2160->lock, flags);
__cancel_delayed_work(&qt2160->dwork);
@@ -225,6 +231,12 @@ static irqreturn_t qt2160_irq(int irq, void *_qt2160)
static void qt2160_schedule_read(struct qt2160_data *qt2160)
{
+ if (qt2160->hw_info->getchange) {
+ /* if change is not active, no need to read device */
+ if (qt2160->hw_info->getchange(qt2160->hw_info->data) > 0)
+ return;
+ }
+
spin_lock_irq(&qt2160->lock);
schedule_delayed_work(&qt2160->dwork, QT2160_CYCLE_INTERVAL);
spin_unlock_irq(&qt2160->lock);
diff --git a/include/linux/input/qt2160.h b/include/linux/input/qt2160.h
index 8a1913f..4eb7e18 100755
--- a/include/linux/input/qt2160.h
+++ b/include/linux/input/qt2160.h
@@ -7,6 +7,9 @@
/**
* struct qt2160_info - defines the chip configuration
+ * @data: private data for lowlevel IO abstraction routines
+ * @getchange: return 0 when CHANGE pin is active/low; return 1 when CHANGE pin
+ * is deactivated/high
* @slider_length: number of keys to use as slider, max 8 keys, min 2 keys
* @slider_axis: absolute axis type, value 0 is ABS_X
* @keycodes: key codes for keys that are part of the slider are ignored; slider
@@ -20,6 +23,8 @@
* sleep 16ms longer before detecting a touch (slower response); max 255
*/
struct qt2160_info {
+ void *data;
+ int (*getchange) (void *data);
unsigned char slider_length;
unsigned int slider_axis;
unsigned short keycodes[QT2160_MAXKEYS];
--
1.7.0.4
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 7/8] qt2160: optional interrupt flag
2010-11-09 2:15 [PATCH 1/8] qt2160: add slider support jooaun
` (4 preceding siblings ...)
2010-11-09 2:15 ` [PATCH 6/8] qt2160: only read device when Change pin is active jooaun
@ 2010-11-09 2:15 ` jooaun
2010-11-09 2:46 ` jooaun
2010-11-09 2:15 ` [PATCH 8/8] qt2160: add hardware reset jooaun
6 siblings, 1 reply; 12+ messages in thread
From: jooaun @ 2010-11-09 2:15 UTC (permalink / raw)
To: dmitry.torokhov; +Cc: linux-input, raphaelpereira, jooaun
Some GPIOs do not support falling edge only interrupt, so make interrupt flag configurable.
Signed-off-by: Joo Aun Saw <jasaw81@gmail.com>
Conflicts:
include/linux/input/qt2160.h
---
drivers/input/keyboard/qt2160.c | 11 +++++++++--
include/linux/input/qt2160.h | 2 ++
2 files changed, 11 insertions(+), 2 deletions(-)
diff --git a/drivers/input/keyboard/qt2160.c b/drivers/input/keyboard/qt2160.c
index 8316fde..d2ce573 100755
--- a/drivers/input/keyboard/qt2160.c
+++ b/drivers/input/keyboard/qt2160.c
@@ -487,8 +487,15 @@ static int __devinit qt2160_probe(struct i2c_client *client,
}
if (client->irq) {
- error = request_irq(client->irq, qt2160_irq,
- IRQF_TRIGGER_FALLING, "qt2160", qt2160);
+ if (hw_info->irq_flags) {
+ error = request_irq(client->irq, qt2160_irq,
+ hw_info->irq_flags, "qt2160",
+ qt2160);
+ } else {
+ error = request_irq(client->irq, qt2160_irq,
+ IRQF_TRIGGER_FALLING, "qt2160",
+ qt2160);
+ }
if (error) {
dev_err(&client->dev,
"failed to allocate irq %d\n", client->irq);
diff --git a/include/linux/input/qt2160.h b/include/linux/input/qt2160.h
index 4eb7e18..dad11bb 100755
--- a/include/linux/input/qt2160.h
+++ b/include/linux/input/qt2160.h
@@ -21,6 +21,7 @@
* @key_burst_length: key sensitivity; 0 use default
* @low_power_mode: value 0 use default; each +1 increment causes the chip to
* sleep 16ms longer before detecting a touch (slower response); max 255
+ * @irq_flags: value 0 use default IRQF_TRIGGER_FALLING
*/
struct qt2160_info {
void *data;
@@ -31,6 +32,7 @@ struct qt2160_info {
unsigned char key_aks[QT2160_MAXKEYS];
unsigned char key_burst_length[QT2160_MAXKEYS];
unsigned char low_power_mode;
+ unsigned long irq_flags;
};
#endif /* __QT2160_H__ */
--
1.7.0.4
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 8/8] qt2160: add hardware reset
2010-11-09 2:15 [PATCH 1/8] qt2160: add slider support jooaun
` (5 preceding siblings ...)
2010-11-09 2:15 ` [PATCH 7/8] qt2160: optional interrupt flag jooaun
@ 2010-11-09 2:15 ` jooaun
2010-11-09 2:47 ` jooaun
6 siblings, 1 reply; 12+ messages in thread
From: jooaun @ 2010-11-09 2:15 UTC (permalink / raw)
To: dmitry.torokhov; +Cc: linux-input, raphaelpereira, jooaun
Use hardware reset if defined, fall back on soft reset.
Signed-off-by: Joo Aun Saw <jasaw81@gmail.com>
Conflicts:
include/linux/input/qt2160.h
---
drivers/input/keyboard/qt2160.c | 8 +++++++-
include/linux/input/qt2160.h | 2 ++
2 files changed, 9 insertions(+), 1 deletions(-)
diff --git a/drivers/input/keyboard/qt2160.c b/drivers/input/keyboard/qt2160.c
index d2ce573..d4a8033 100755
--- a/drivers/input/keyboard/qt2160.c
+++ b/drivers/input/keyboard/qt2160.c
@@ -284,7 +284,13 @@ static int __devinit qt2160_configure_device(struct i2c_client *client,
int error = 0;
/* perform software reset and wait for at least 32ms */
- i2c_smbus_write_byte_data(client, QT2160_CMD_RESET, 0xFF);
+ if (pdata->setrst) {
+ pdata->setrst(pdata->data, 0);
+ udelay(10);
+ pdata->setrst(pdata->data, 1);
+ } else {
+ i2c_smbus_write_byte_data(client, QT2160_CMD_RESET, 0xFF);
+ }
msleep(200);
/* perform dummy write to reset I2C state */
diff --git a/include/linux/input/qt2160.h b/include/linux/input/qt2160.h
index dad11bb..1b4b58d 100755
--- a/include/linux/input/qt2160.h
+++ b/include/linux/input/qt2160.h
@@ -10,6 +10,7 @@
* @data: private data for lowlevel IO abstraction routines
* @getchange: return 0 when CHANGE pin is active/low; return 1 when CHANGE pin
* is deactivated/high
+ * @setrst: 0 activates RESET pin; 1 deactivates RESET pin
* @slider_length: number of keys to use as slider, max 8 keys, min 2 keys
* @slider_axis: absolute axis type, value 0 is ABS_X
* @keycodes: key codes for keys that are part of the slider are ignored; slider
@@ -26,6 +27,7 @@
struct qt2160_info {
void *data;
int (*getchange) (void *data);
+ void (*setrst) (void *data, int state);
unsigned char slider_length;
unsigned int slider_axis;
unsigned short keycodes[QT2160_MAXKEYS];
--
1.7.0.4
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 2/8] qt2160: configurable key sensitivity
2010-11-09 2:15 ` [PATCH 2/8] qt2160: configurable key sensitivity jooaun
@ 2010-11-09 2:43 ` jooaun
0 siblings, 0 replies; 12+ messages in thread
From: jooaun @ 2010-11-09 2:43 UTC (permalink / raw)
To: dmitry.torokhov; +Cc: linux-input, raphaelpereira, jooaun
Add configurable key sensitivity, disable unused keys.
Configurable key sensitivity to compensate for different touch sensor circuits.
Disable unused keys to reduce power consumption.
Signed-off-by: Joo Aun Saw <jasaw81@gmail.com>
---
drivers/input/keyboard/qt2160.c | 38 ++++++++++++++++++++++++++++++++++++++
include/linux/input/qt2160.h | 2 ++
2 files changed, 40 insertions(+), 0 deletions(-)
diff --git a/drivers/input/keyboard/qt2160.c b/drivers/input/keyboard/qt2160.c
index 7ec256c..dcd05cd 100755
--- a/drivers/input/keyboard/qt2160.c
+++ b/drivers/input/keyboard/qt2160.c
@@ -43,9 +43,26 @@
#define QT2160_CMD_SUBVER 7
#define QT2160_CMD_CALIBRATE 10
#define QT2160_CMD_RESET 11
+#define QT2160_CMD_BURST_REP 13
+#define QT2160_CMD_NEG_DRIFT 15
+#define QT2160_CMD_POS_DRIFT 16
+#define QT2160_CMD_DI_LIMIT 17
+#define QT2160_CMD_NEG_RECAL 18
+#define QT2160_CMD_DHTA 19
#define QT2160_CMD_SLIDE_CTRL 20
#define QT2160_CMD_SLIDE_OPT 21
#define QT2160_CMD_KEY0_AKS 22
+#define QT2160_CMD_KEY0_NEGT 38
+#define QT2160_CMD_KEY0_BURST 54
+#define QT2160_CMD_GPIO_DRV1 70
+#define QT2160_CMD_GPIO_DRV2 71
+#define QT2160_CMD_GPIO_DIR 73
+#define QT2160_CMD_GPIO_PWM1 74
+#define QT2160_CMD_GPIO_PWM2 75
+#define QT2160_CMD_PWM_LEVEL 76
+#define QT2160_CMD_GPIO_WAKE 77
+#define QT2160_CMD_CC_KEYS1 78
+#define QT2160_CMD_CC_KEYS2 79
#define QT2160_CYCLE_INTERVAL (2*HZ)
@@ -297,6 +314,27 @@ static int __devinit qt2160_configure_device(struct i2c_client *client,
}
for (i = 0; i < QT2160_MAXKEYS; i++) {
+ /* setup burst length and disable unused keys */
+ if (i < pdata->slider_length) {
+ if (pdata->key_burst_length[i])
+ error |= i2c_smbus_write_byte_data(
+ client,
+ QT2160_CMD_KEY0_BURST + i,
+ pdata->key_burst_length[i]);
+ } else {
+ if (pdata->keycodes[i]) {
+ if (pdata->key_burst_length[i])
+ error |= i2c_smbus_write_byte_data(
+ client,
+ QT2160_CMD_KEY0_BURST + i,
+ pdata->key_burst_length[i]);
+ } else {
+ error |= i2c_smbus_write_byte_data(
+ client,
+ QT2160_CMD_KEY0_BURST + i,
+ 0);
+ }
+ }
/* set AKS */
error |= i2c_smbus_write_byte_data(client,
QT2160_CMD_KEY0_AKS + i,
diff --git a/include/linux/input/qt2160.h b/include/linux/input/qt2160.h
index 9d1252e..748c86e 100755
--- a/include/linux/input/qt2160.h
+++ b/include/linux/input/qt2160.h
@@ -15,12 +15,14 @@
* @key_aks: adjacent key suppression; keys that form a slider must be in the
* same aks group; keys in the same aks group will only report 1 active key at
* any time; value 0 disables aks group; valid aks groups are 1, 2, 3
+ * @key_burst_length: key sensitivity; 0 use default
*/
struct qt2160_info {
unsigned char slider_length;
unsigned int slider_axis;
unsigned short keycodes[QT2160_MAXKEYS];
unsigned char key_aks[QT2160_MAXKEYS];
+ unsigned char key_burst_length[QT2160_MAXKEYS];
};
#endif /* __QT2160_H__ */
--
1.7.0.4
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 6/8] qt2160: only read device when Change pin is active
2010-11-09 2:15 ` [PATCH 6/8] qt2160: only read device when Change pin is active jooaun
@ 2010-11-09 2:45 ` jooaun
0 siblings, 0 replies; 12+ messages in thread
From: jooaun @ 2010-11-09 2:45 UTC (permalink / raw)
To: dmitry.torokhov; +Cc: linux-input, raphaelpereira, jooaun
Check Change state and only read device when required.
Signed-off-by: Joo Aun Saw <jasaw81@gmail.com>
---
drivers/input/keyboard/qt2160.c | 12 ++++++++++++
include/linux/input/qt2160.h | 5 +++++
2 files changed, 17 insertions(+), 0 deletions(-)
diff --git a/drivers/input/keyboard/qt2160.c b/drivers/input/keyboard/qt2160.c
index 7647849..8316fde 100755
--- a/drivers/input/keyboard/qt2160.c
+++ b/drivers/input/keyboard/qt2160.c
@@ -213,6 +213,12 @@ static irqreturn_t qt2160_irq(int irq, void *_qt2160)
struct qt2160_data *qt2160 = _qt2160;
unsigned long flags;
+ if (qt2160->hw_info->getchange) {
+ /* if change is not active, no IRQ to service */
+ if (qt2160->hw_info->getchange(qt2160->hw_info->data) > 0)
+ return IRQ_HANDLED;
+ }
+
spin_lock_irqsave(&qt2160->lock, flags);
__cancel_delayed_work(&qt2160->dwork);
@@ -225,6 +231,12 @@ static irqreturn_t qt2160_irq(int irq, void *_qt2160)
static void qt2160_schedule_read(struct qt2160_data *qt2160)
{
+ if (qt2160->hw_info->getchange) {
+ /* if change is not active, no need to read device */
+ if (qt2160->hw_info->getchange(qt2160->hw_info->data) > 0)
+ return;
+ }
+
spin_lock_irq(&qt2160->lock);
schedule_delayed_work(&qt2160->dwork, QT2160_CYCLE_INTERVAL);
spin_unlock_irq(&qt2160->lock);
diff --git a/include/linux/input/qt2160.h b/include/linux/input/qt2160.h
index 8a1913f..4eb7e18 100755
--- a/include/linux/input/qt2160.h
+++ b/include/linux/input/qt2160.h
@@ -7,6 +7,9 @@
/**
* struct qt2160_info - defines the chip configuration
+ * @data: private data for lowlevel IO abstraction routines
+ * @getchange: return 0 when CHANGE pin is active/low; return 1 when CHANGE pin
+ * is deactivated/high
* @slider_length: number of keys to use as slider, max 8 keys, min 2 keys
* @slider_axis: absolute axis type, value 0 is ABS_X
* @keycodes: key codes for keys that are part of the slider are ignored; slider
@@ -20,6 +23,8 @@
* sleep 16ms longer before detecting a touch (slower response); max 255
*/
struct qt2160_info {
+ void *data;
+ int (*getchange) (void *data);
unsigned char slider_length;
unsigned int slider_axis;
unsigned short keycodes[QT2160_MAXKEYS];
--
1.7.0.4
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 7/8] qt2160: optional interrupt flag
2010-11-09 2:15 ` [PATCH 7/8] qt2160: optional interrupt flag jooaun
@ 2010-11-09 2:46 ` jooaun
0 siblings, 0 replies; 12+ messages in thread
From: jooaun @ 2010-11-09 2:46 UTC (permalink / raw)
To: dmitry.torokhov; +Cc: linux-input, raphaelpereira, jooaun
Some GPIOs do not support falling edge only interrupt, so make interrupt flag configurable.
Signed-off-by: Joo Aun Saw <jasaw81@gmail.com>
---
drivers/input/keyboard/qt2160.c | 11 +++++++++--
include/linux/input/qt2160.h | 2 ++
2 files changed, 11 insertions(+), 2 deletions(-)
diff --git a/drivers/input/keyboard/qt2160.c b/drivers/input/keyboard/qt2160.c
index 8316fde..d2ce573 100755
--- a/drivers/input/keyboard/qt2160.c
+++ b/drivers/input/keyboard/qt2160.c
@@ -487,8 +487,15 @@ static int __devinit qt2160_probe(struct i2c_client *client,
}
if (client->irq) {
- error = request_irq(client->irq, qt2160_irq,
- IRQF_TRIGGER_FALLING, "qt2160", qt2160);
+ if (hw_info->irq_flags) {
+ error = request_irq(client->irq, qt2160_irq,
+ hw_info->irq_flags, "qt2160",
+ qt2160);
+ } else {
+ error = request_irq(client->irq, qt2160_irq,
+ IRQF_TRIGGER_FALLING, "qt2160",
+ qt2160);
+ }
if (error) {
dev_err(&client->dev,
"failed to allocate irq %d\n", client->irq);
diff --git a/include/linux/input/qt2160.h b/include/linux/input/qt2160.h
index 4eb7e18..dad11bb 100755
--- a/include/linux/input/qt2160.h
+++ b/include/linux/input/qt2160.h
@@ -21,6 +21,7 @@
* @key_burst_length: key sensitivity; 0 use default
* @low_power_mode: value 0 use default; each +1 increment causes the chip to
* sleep 16ms longer before detecting a touch (slower response); max 255
+ * @irq_flags: value 0 use default IRQF_TRIGGER_FALLING
*/
struct qt2160_info {
void *data;
@@ -31,6 +32,7 @@ struct qt2160_info {
unsigned char key_aks[QT2160_MAXKEYS];
unsigned char key_burst_length[QT2160_MAXKEYS];
unsigned char low_power_mode;
+ unsigned long irq_flags;
};
#endif /* __QT2160_H__ */
--
1.7.0.4
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 8/8] qt2160: add hardware reset
2010-11-09 2:15 ` [PATCH 8/8] qt2160: add hardware reset jooaun
@ 2010-11-09 2:47 ` jooaun
0 siblings, 0 replies; 12+ messages in thread
From: jooaun @ 2010-11-09 2:47 UTC (permalink / raw)
To: dmitry.torokhov; +Cc: linux-input, raphaelpereira, jooaun
Use hardware reset if defined, fall back on soft reset.
Signed-off-by: Joo Aun Saw <jasaw81@gmail.com>
---
drivers/input/keyboard/qt2160.c | 8 +++++++-
include/linux/input/qt2160.h | 2 ++
2 files changed, 9 insertions(+), 1 deletions(-)
diff --git a/drivers/input/keyboard/qt2160.c b/drivers/input/keyboard/qt2160.c
index d2ce573..d4a8033 100755
--- a/drivers/input/keyboard/qt2160.c
+++ b/drivers/input/keyboard/qt2160.c
@@ -284,7 +284,13 @@ static int __devinit qt2160_configure_device(struct i2c_client *client,
int error = 0;
/* perform software reset and wait for at least 32ms */
- i2c_smbus_write_byte_data(client, QT2160_CMD_RESET, 0xFF);
+ if (pdata->setrst) {
+ pdata->setrst(pdata->data, 0);
+ udelay(10);
+ pdata->setrst(pdata->data, 1);
+ } else {
+ i2c_smbus_write_byte_data(client, QT2160_CMD_RESET, 0xFF);
+ }
msleep(200);
/* perform dummy write to reset I2C state */
diff --git a/include/linux/input/qt2160.h b/include/linux/input/qt2160.h
index dad11bb..1b4b58d 100755
--- a/include/linux/input/qt2160.h
+++ b/include/linux/input/qt2160.h
@@ -10,6 +10,7 @@
* @data: private data for lowlevel IO abstraction routines
* @getchange: return 0 when CHANGE pin is active/low; return 1 when CHANGE pin
* is deactivated/high
+ * @setrst: 0 activates RESET pin; 1 deactivates RESET pin
* @slider_length: number of keys to use as slider, max 8 keys, min 2 keys
* @slider_axis: absolute axis type, value 0 is ABS_X
* @keycodes: key codes for keys that are part of the slider are ignored; slider
@@ -26,6 +27,7 @@
struct qt2160_info {
void *data;
int (*getchange) (void *data);
+ void (*setrst) (void *data, int state);
unsigned char slider_length;
unsigned int slider_axis;
unsigned short keycodes[QT2160_MAXKEYS];
--
1.7.0.4
^ permalink raw reply related [flat|nested] 12+ messages in thread
end of thread, other threads:[~2010-11-09 2:47 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-11-09 2:15 [PATCH 1/8] qt2160: add slider support jooaun
2010-11-09 2:15 ` [PATCH 2/8] qt2160: configurable key sensitivity jooaun
2010-11-09 2:43 ` jooaun
2010-11-09 2:15 ` [PATCH 3/8] qt2160: add PM support jooaun
2010-11-09 2:15 ` [PATCH 4/8] qt2160: add configurable power mode jooaun
2010-11-09 2:15 ` [PATCH 5/8] qt2160: fix starting of device calibration jooaun
2010-11-09 2:15 ` [PATCH 6/8] qt2160: only read device when Change pin is active jooaun
2010-11-09 2:45 ` jooaun
2010-11-09 2:15 ` [PATCH 7/8] qt2160: optional interrupt flag jooaun
2010-11-09 2:46 ` jooaun
2010-11-09 2:15 ` [PATCH 8/8] qt2160: add hardware reset jooaun
2010-11-09 2:47 ` jooaun
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).