summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/input/touchscreen/atmxt.c60
-rw-r--r--drivers/input/touchscreen/atmxt.h2
2 files changed, 62 insertions, 0 deletions
diff --git a/drivers/input/touchscreen/atmxt.c b/drivers/input/touchscreen/atmxt.c
index 282c0ae2330..becfa945fee 100644
--- a/drivers/input/touchscreen/atmxt.c
+++ b/drivers/input/touchscreen/atmxt.c
@@ -91,6 +91,8 @@ static int atmxt_save_data8(struct atmxt_driver_data *dd,
uint8_t *entry, uint8_t *reg);
static int atmxt_save_data9(struct atmxt_driver_data *dd,
uint8_t *entry, uint8_t *reg);
+static int atmxt_save_data42(struct atmxt_driver_data *dd,
+ uint8_t *entry, uint8_t *reg);
static int atmxt_save_data46(struct atmxt_driver_data *dd,
uint8_t *entry, uint8_t *reg);
static int atmxt_save_data62(struct atmxt_driver_data *dd,
@@ -498,6 +500,7 @@ static int atmxt_enter_aot(struct atmxt_driver_data *dd)
uint8_t sleep_cmd[4] = {0x64, 0x64, 0x19, 0x00};
uint8_t adx_cmd[2] = {0x08, 0x08};
uint8_t mxd_cmd = 0x08;
+ uint8_t sup_cmd[3] = {0x14, 0x14, 0x40};
atmxt_dbg(dd, ATMXT_DBG3, "%s: Entering AOT...\n", __func__);
@@ -536,6 +539,15 @@ static int atmxt_enter_aot(struct atmxt_driver_data *dd)
goto atmxt_enter_aot_fail;
}
+ err = atmxt_i2c_write(dd,
+ dd->addr->sup[0], dd->addr->sup[1],
+ &(sup_cmd[0]), 3);
+ if (err < 0) {
+ pr_err("%s: Failed to change sup.\n",
+ __func__);
+ goto atmxt_enter_aot_fail;
+ }
+
atmxt_set_ic_state(dd, ATMXT_IC_AOT);
break;
@@ -607,6 +619,15 @@ static int atmxt_exit_aot(struct atmxt_driver_data *dd)
goto atmxt_exit_aot_fail;
}
+ err = atmxt_i2c_write(dd,
+ dd->addr->sup[0], dd->addr->sup[1],
+ &(dd->data->sup[0]), 3);
+ if (err < 0) {
+ pr_err("%s: Failed to restore sup.\n",
+ __func__);
+ goto atmxt_exit_aot_fail;
+ }
+
atmxt_set_ic_state(dd, ATMXT_IC_ACTIVE);
break;
@@ -2065,6 +2086,7 @@ static int atmxt_save_internal_data(struct atmxt_driver_data *dd)
bool chk_7 = false;
bool chk_8 = false;
bool chk_9 = false;
+ bool chk_42 = false;
bool chk_46 = false;
bool chk_62 = false;
@@ -2112,6 +2134,14 @@ static int atmxt_save_internal_data(struct atmxt_driver_data *dd)
usr_start_seen = true;
break;
+ case 42:
+ chk_42 = true;
+ err = atmxt_save_data42(dd, &(dd->info_blk->data[i+0]),
+ &(dd->nvm->data[nvm_iter]));
+ if (err < 0)
+ goto atmxt_save_internal_data_fail;
+ break;
+
case 46:
chk_46 = true;
err = atmxt_save_data46(dd, &(dd->info_blk->data[i+0]),
@@ -2163,6 +2193,11 @@ static int atmxt_save_internal_data(struct atmxt_driver_data *dd)
err = -ENODATA;
}
+ if (!chk_42) {
+ pr_err("%s: Object 42 is missing.\n", __func__);
+ err = -ENODATA;
+ }
+
if (!chk_46) {
pr_err("%s: Object 46 is missing.\n", __func__);
err = -ENODATA;
@@ -2304,6 +2339,31 @@ atmxt_save_data9_fail:
return err;
}
+static int atmxt_save_data42(struct atmxt_driver_data *dd,
+ uint8_t *entry, uint8_t *reg)
+{
+ int err = 0;
+
+ if (entry[3] < 4) {
+ printk(KERN_ERR "%s: Suppression object is too small.\n",
+ __func__);
+ err = -ENODATA;
+ goto atmxt_save_data42_fail;
+ }
+
+ dd->addr->sup[0] = entry[1] + 2;
+ dd->addr->sup[1] = entry[2];
+ if (dd->addr->sup[0] < entry[1]) /* Check for 16-bit addr overflow */
+ dd->addr->sup[1]++;
+
+ dd->data->sup[0] = reg[2];
+ dd->data->sup[1] = reg[3];
+ dd->data->sup[2] = reg[4];
+
+atmxt_save_data42_fail:
+ return err;
+}
+
static int atmxt_save_data46(struct atmxt_driver_data *dd,
uint8_t *entry, uint8_t *reg)
{
diff --git a/drivers/input/touchscreen/atmxt.h b/drivers/input/touchscreen/atmxt.h
index 6933011e9ef..3c963bf3a01 100644
--- a/drivers/input/touchscreen/atmxt.h
+++ b/drivers/input/touchscreen/atmxt.h
@@ -134,6 +134,7 @@ struct atmxt_addr {
uint8_t gse[2];
uint8_t tse[2];
uint8_t mxd[2];
+ uint8_t sup[2];
} __packed;
struct atmxt_data {
@@ -144,6 +145,7 @@ struct atmxt_data {
uint8_t acq[6];
uint8_t adx[2];
uint8_t mxd;
+ uint8_t sup[3];
unsigned long timer;
uint8_t last_stat;
} __packed;