diff options
| author | Eric Tashakkor <w36098@motorola.com> | 2014-05-12 14:46:43 -0500 |
|---|---|---|
| committer | ERIC TASHAKKOR <w36098@motorola.com> | 2014-05-13 16:37:39 +0000 |
| commit | f002179303194a87804e89fc6912ced761e992b4 (patch) | |
| tree | 8f8cdd44e43c681a80bb7f8c6ba751f516cd24aa | |
| parent | d7ad201fa394f76b0c7a1d03f3f00c6fe41320ea (diff) | |
| download | olio-linux-3.10-f002179303194a87804e89fc6912ced761e992b4.tar.xz olio-linux-3.10-f002179303194a87804e89fc6912ced761e992b4.zip | |
IKXCLOCK-1132 Add AOT touch settings to main build
Added changing CTE settings to save current in device low power mode.
Change-Id: I76ad2877169bdac341603f022d95dd192da069f3
Signed-off-by: Eric Tashakkor <w36098@motorola.com>
| -rw-r--r-- | drivers/input/touchscreen/atmxt.c | 87 | ||||
| -rw-r--r-- | drivers/input/touchscreen/atmxt.h | 4 |
2 files changed, 74 insertions, 17 deletions
diff --git a/drivers/input/touchscreen/atmxt.c b/drivers/input/touchscreen/atmxt.c index 337bba65188..f5b4b3274e9 100644 --- a/drivers/input/touchscreen/atmxt.c +++ b/drivers/input/touchscreen/atmxt.c @@ -97,6 +97,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_data46(struct atmxt_driver_data *dd, + uint8_t *entry, uint8_t *reg); static void atmxt_compute_checksum(struct atmxt_driver_data *dd); static void atmxt_compute_partial_checksum(uint8_t *byte1, uint8_t *byte2, uint8_t *low, uint8_t *mid, uint8_t *high); @@ -2021,6 +2023,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_46 = false; for (i = 0; i < dd->info_blk->size; i += 6) { switch (dd->info_blk->data[i+0]) { @@ -2066,6 +2069,14 @@ static int atmxt_save_internal_data(struct atmxt_driver_data *dd) usr_start_seen = true; break; + case 46: + chk_46 = true; + err = atmxt_save_data46(dd, &(dd->info_blk->data[i+0]), + &(dd->nvm->data[nvm_iter])); + if (err < 0) + goto atmxt_save_internal_data_fail; + break; + default: break; } @@ -2101,6 +2112,11 @@ static int atmxt_save_internal_data(struct atmxt_driver_data *dd) err = -ENODATA; } + if (!chk_46) { + pr_err("%s: Object 46 is missing.\n", __func__); + err = -ENODATA; + } + atmxt_save_internal_data_fail: return err; } @@ -2131,12 +2147,12 @@ static int atmxt_save_data6(struct atmxt_driver_data *dd, uint8_t *entry) dd->addr->nvm[0] = entry[1] + 1; dd->addr->nvm[1] = entry[2]; - if (dd->addr->nvm[0] < entry[1]) + if (dd->addr->nvm[0] < entry[1]) /* Check for 16-bit addr overflow */ dd->addr->nvm[1]++; dd->addr->cal[0] = entry[1] + 2; dd->addr->cal[1] = entry[2]; - if (dd->addr->cal[0] < entry[1]) + if (dd->addr->cal[0] < entry[1]) /* Check for 16-bit addr overflow */ dd->addr->cal[1]++; atmxt_save_data6_fail: @@ -2148,7 +2164,7 @@ static int atmxt_save_data7(struct atmxt_driver_data *dd, { int err = 0; - if (entry[3] < 1) { + if (entry[3] < 3) { printk(KERN_ERR "%s: Power object is too small.\n", __func__); err = -ENODATA; goto atmxt_save_data7_fail; @@ -2158,6 +2174,8 @@ static int atmxt_save_data7(struct atmxt_driver_data *dd, dd->addr->pwr[1] = entry[2]; dd->data->pwr[0] = reg[0]; dd->data->pwr[1] = reg[1]; + dd->data->pwr[2] = reg[2]; + dd->data->pwr[3] = reg[3]; atmxt_save_data7_fail: return err; @@ -2177,7 +2195,7 @@ static int atmxt_save_data8(struct atmxt_driver_data *dd, dd->addr->acq[0] = entry[1] + 4; dd->addr->acq[1] = entry[2]; - if (dd->addr->acq[0] < entry[1]) + if (dd->addr->acq[0] < entry[1]) /* Check for 16-bit addr overflow */ dd->addr->acq[1]++; dd->data->acq[0] = reg[4]; @@ -2230,6 +2248,29 @@ atmxt_save_data9_fail: return err; } +static int atmxt_save_data46(struct atmxt_driver_data *dd, + uint8_t *entry, uint8_t *reg) +{ + int err = 0; + + if (entry[3] < 3) { + pr_err("%s: Power object is too small.\n", __func__); + err = -ENODATA; + goto atmxt_save_data46_fail; + } + + dd->addr->adx[0] = entry[1] + 2; + dd->addr->adx[1] = entry[2]; + if (dd->addr->adx[0] < entry[1]) /* Check for 16-bit addr overflow */ + dd->addr->adx[1]++; + + dd->data->adx[0] = reg[2]; + dd->data->adx[1] = reg[3]; + +atmxt_save_data46_fail: + return err; +} + static void atmxt_compute_checksum(struct atmxt_driver_data *dd) { uint8_t low = 0x00; @@ -3255,7 +3296,8 @@ static ssize_t atmxt_drv_interactivemode_store(struct device *dev, unsigned long value = 0; struct atmxt_driver_data *dd = dev_get_drvdata(dev); int err; - uint8_t sleep_cmd[2] = {0xFE, 0xFE}; + uint8_t sleep_cmd[4] = {0xFE, 0xFE, 0x19, 0x00}; + uint8_t adx_cmd[2] = {0x08, 0x08}; err = kstrtoul(buf, 10, &value); if (err < 0) { @@ -3268,17 +3310,24 @@ static ssize_t atmxt_drv_interactivemode_store(struct device *dev, if (!dd->data || !dd->addr) { pr_err("%s: failed, data/addr is NULL.\n", __func__); err = -ENODEV; - goto error; + goto atmxt_drv_interactivemode_store_fail; } if (value == 1) { /* interactive mode, lets bump up rate*/ err = atmxt_i2c_write(dd, dd->addr->pwr[0], dd->addr->pwr[1], - &(dd->data->pwr[0]), 2); + &(dd->data->pwr[0]), 4); if (err < 0) { - pr_err("%s: i2c write failed\n", __func__); - goto error; + pr_err("%s: Failed to wake IC.\n", __func__); + goto atmxt_drv_interactivemode_store_fail; + } + err = atmxt_i2c_write(dd, + dd->addr->adx[0], dd->addr->adx[1], + &(dd->data->adx[0]), 2); + if (err < 0) { + pr_err("%s: Failed to restore adx.\n", __func__); + goto atmxt_drv_interactivemode_store_fail; } atmxt_set_ic_state(dd, ATMXT_IC_ACTIVE); err = size; @@ -3286,11 +3335,17 @@ static ssize_t atmxt_drv_interactivemode_store(struct device *dev, /* Non interactive mode, lets lower scan rate*/ err = atmxt_i2c_write(dd, dd->addr->pwr[0], dd->addr->pwr[1], - &(sleep_cmd[0]), 2); - + &(sleep_cmd[0]), 4); + if (err < 0) { + pr_err("%s: Failed to reduce power.\n", __func__); + goto atmxt_drv_interactivemode_store_fail; + } + err = atmxt_i2c_write(dd, + dd->addr->adx[0], dd->addr->adx[1], + &(adx_cmd[0]), 2); if (err < 0) { - pr_err("%s: i2c write failed\n", __func__); - goto error; + pr_err("%s: Failed to reduce adx.\n", __func__); + goto atmxt_drv_interactivemode_store_fail; } atmxt_set_ic_state(dd, ATMXT_IC_SLEEP); err = size; @@ -3298,7 +3353,7 @@ static ssize_t atmxt_drv_interactivemode_store(struct device *dev, err = -EINVAL; } -error: +atmxt_drv_interactivemode_store_fail: mutex_unlock(dd->mutex); return err; } @@ -3516,7 +3571,7 @@ static ssize_t atmxt_debug_ic_grpdata_show(struct device *dev, addr_lo = entry[1] + dd->dbg->grp_off; addr_hi = entry[2]; - if (addr_lo < entry[1]) + if (addr_lo < entry[1]) /* Check for 16-bit addr overflow */ addr_hi++; err = atmxt_i2c_write(dd, addr_lo, addr_hi, NULL, 0); @@ -3672,7 +3727,7 @@ static ssize_t atmxt_debug_ic_grpdata_store(struct device *dev, addr_lo = entry[1] + dd->dbg->grp_off; addr_hi = entry[2]; - if (addr_lo < entry[1]) + if (addr_lo < entry[1]) /* Check for 16-bit addr overflow */ addr_hi++; err = atmxt_i2c_write(dd, addr_lo, addr_hi, data_out, data_size); diff --git a/drivers/input/touchscreen/atmxt.h b/drivers/input/touchscreen/atmxt.h index 43ed91f6342..9f593979756 100644 --- a/drivers/input/touchscreen/atmxt.h +++ b/drivers/input/touchscreen/atmxt.h @@ -130,14 +130,16 @@ struct atmxt_addr { uint8_t nvm[2]; uint8_t cal[2]; uint8_t acq[2]; + uint8_t adx[2]; } __packed; struct atmxt_data { - uint8_t pwr[2]; + uint8_t pwr[4]; uint8_t max_msg_size; uint8_t touch_id_offset; bool res[2]; uint8_t acq[6]; + uint8_t adx[2]; unsigned long timer; uint8_t last_stat; } __packed; |