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++;\