diff options
| -rw-r--r-- | drivers/input/touchscreen/atmxt.c | 60 | ||||
| -rw-r--r-- | drivers/input/touchscreen/atmxt.h | 2 | 
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;  |