From ccfb048ca4c4b74187e1b714bf9b4c56a7a8ee3d Mon Sep 17 00:00:00 2001 From: Konstantin Makariev Date: Mon, 25 Mar 2019 12:44:40 -0500 Subject: [PATCH] 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 Reviewed-on: https://gerrit.mot.com/1326865 SLTApproved: Slta Waiver SME-Granted: SME Approvals Granted Tested-by: Jira Key Reviewed-by: Konstantin Makariev Submit-Approved: Jira Key --- .../input/touchscreen/synaptics_mmi/synaptics_dsx_i2c.c | 9 ++++++++- .../input/touchscreen/synaptics_mmi/synaptics_dsx_i2c.h | 1 + .../synaptics_mmi/synaptics_dsx_test_reporting.c | 4 ++-- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/drivers/input/touchscreen/synaptics_mmi/synaptics_dsx_i2c.c b/drivers/input/touchscreen/synaptics_mmi/synaptics_dsx_i2c.c index f9734b1ceffe..466bfdd3f2a3 100644 --- a/drivers/input/touchscreen/synaptics_mmi/synaptics_dsx_i2c.c +++ b/drivers/input/touchscreen/synaptics_mmi/synaptics_dsx_i2c.c @@ -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++) { diff --git a/drivers/input/touchscreen/synaptics_mmi/synaptics_dsx_i2c.h b/drivers/input/touchscreen/synaptics_mmi/synaptics_dsx_i2c.h index b86fe6493eaa..1cf44a198171 100644 --- a/drivers/input/touchscreen/synaptics_mmi/synaptics_dsx_i2c.h +++ b/drivers/input/touchscreen/synaptics_mmi/synaptics_dsx_i2c.h @@ -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) diff --git a/drivers/input/touchscreen/synaptics_mmi/synaptics_dsx_test_reporting.c b/drivers/input/touchscreen/synaptics_mmi/synaptics_dsx_test_reporting.c index 77b5a6bc15c2..f37ddf99c1e7 100644 --- a/drivers/input/touchscreen/synaptics_mmi/synaptics_dsx_test_reporting.c +++ b/drivers/input/touchscreen/synaptics_mmi/synaptics_dsx_test_reporting.c @@ -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++;\