synaptics_mmi: enforced page selection

Driver contains performance improvement algorithm allowing to avoid
unnecessary page selection transactions by "remembering" the last
accessed page. However, mixed types of communications used in
factory "breaks" this algorithm and causes access to a wrong page.
This change allows to enforce page selection in certain functions
used by factory.

Change-Id: I72c0bf76a3428234645103404372455b42356ae1
Signed-off-by: Konstantin Makariev <hcv867@motorola.com>
Reviewed-on: https://gerrit.mot.com/1326865
SLTApproved: Slta Waiver
SME-Granted: SME Approvals Granted
Tested-by: Jira Key
Reviewed-by: Konstantin Makariev <kmakariev@motorola.com>
Submit-Approved: Jira Key
This commit is contained in:
Konstantin Makariev 2019-03-25 12:44:40 -05:00 • committed by Konstantin Makariev
commit ccfb048ca4
3 changed files with 11 additions and 3 deletions

View file

@ -4116,13 +4116,20 @@ static int synaptics_rmi4_set_page(struct synaptics_rmi4_data *rmi4_data,
unsigned int address)
{
int retval = 0;
bool enforce_page_select = false;
unsigned char retry;
unsigned char buf[PAGE_SELECT_LEN];
unsigned char page;
struct i2c_client *i2c = rmi4_data->i2c_client;
if (address & PAGE_SELECT_ENFORCE) {
enforce_page_select = true;
dev_dbg(&i2c->dev, "%s: Enforced page select\n", __func__);
address &= ~PAGE_SELECT_ENFORCE;
}
page = ((address >> 8) & MASK_8BIT);
if (page != rmi4_data->current_page) {
if (page != rmi4_data->current_page || enforce_page_select) {
buf[0] = MASK_8BIT;
buf[1] = page;
for (retry = 0; retry < SYN_I2C_RETRY_TIMES; retry++) {

View file

@ -64,6 +64,7 @@
#define PDT_ENTRY_SIZE (0x0006)
#define PAGES_TO_SERVICE (10)
#define PAGE_SELECT_LEN (2)
#define PAGE_SELECT_ENFORCE (0x8000)
#define SYNAPTICS_RMI4_F01 (0x01)
#define SYNAPTICS_RMI4_F11 (0x11)

View file

@ -518,7 +518,7 @@ show_store_replicated_func(rtype, rgrp, propname, "%u")
dev_dbg(&rmi4_data->i2c_client->dev,\
"%s: c%s addr = 0x%02x added (%d)\n",\
__func__, #reg, reg_addr, reg_num);\
control->reg_##reg->address = reg_addr;\
control->reg_##reg->address = reg_addr | PAGE_SELECT_ENFORCE;\
reg_addr += skip;\
} \
reg_num++;\
@ -538,7 +538,7 @@ show_store_replicated_func(rtype, rgrp, propname, "%u")
"%s: c%s addr = 0x%02x size = %zu added (%d)\n",\
__func__, #reg, reg_addr, size, reg_num);\
control->reg_##reg->length = size;\
control->reg_##reg->address = reg_addr;\
control->reg_##reg->address = reg_addr | PAGE_SELECT_ENFORCE;\
reg_addr += skip;\
} \
reg_num++;\