Skip to content

Commit

Permalink
touchscreen: avoid dynamic memory allocations
Browse files Browse the repository at this point in the history
Using stack memory is enough

Signed-off-by: Park Ju Hyung <qkrwngud825@gmail.com>
Change-Id: Id4ba249002c5630b5fc40b4f644b7559116bde7e
  • Loading branch information
arter97 authored and acuicultor committed Oct 25, 2020
1 parent 8d37b8f commit 26d14d5
Show file tree
Hide file tree
Showing 3 changed files with 10 additions and 101 deletions.
1 change: 0 additions & 1 deletion drivers/oneplus/input/touchscreen/touchpanel_common.h
Expand Up @@ -394,7 +394,6 @@ struct black_gesture_test {
struct debug_info_proc_operations;
struct earsense_proc_operations;
struct touchpanel_data {
bool register_is_16bit; /*register is 16bit*/
bool glove_mode_support; /*glove_mode support feature*/
bool black_gesture_support; /*black_gesture support feature*/
bool charger_pump_support; /*charger_pump support feature*/
Expand Down
4 changes: 0 additions & 4 deletions drivers/oneplus/input/touchscreen/touchpanel_common_driver.c
Expand Up @@ -4178,7 +4178,6 @@ static void init_parse_dts(struct device *dev, struct touchpanel_data *ts)

np = dev->of_node;

ts->register_is_16bit = of_property_read_bool(np, "register-is-16bit");
ts->edge_limit_support = of_property_read_bool(np, "edge_limit_support");
ts->glove_mode_support = of_property_read_bool(np, "glove_mode_support");
ts->esd_handle_support = of_property_read_bool(np, "esd_handle_support");
Expand Down Expand Up @@ -4878,9 +4877,6 @@ int register_common_touch_device(struct touchpanel_data *pdata)
//step1 : dts parse
init_parse_dts(ts->dev, ts);

//step2 : IIC interfaces init
init_touch_interfaces(ts->dev, ts->register_is_16bit);

//step3 : mutex init
mutex_init(&ts->mutex);
mutex_init(&ts->report_mutex);
Expand Down
106 changes: 10 additions & 96 deletions drivers/oneplus/input/touchscreen/util_interface/touch_interfaces.c
Expand Up @@ -15,8 +15,6 @@

#define TPD_DEVICE "touch_interface"
#define TPD_INFO(a, arg...) pr_err("[TP]"TPD_DEVICE ": " a, ##arg)
#define FIX_I2C_LENGTH 256
static bool register_is_16bit = 0;

/**
* touch_i2c_continue_read - Using for "read sequence bytes" through IIC
Expand Down Expand Up @@ -67,71 +65,19 @@ int touch_i2c_read_block(struct i2c_client* client, u16 addr, unsigned short len
{
int retval;
unsigned char retry;
static unsigned char *buffer = NULL;
static unsigned int read_buf_size = 0;
static unsigned char *read_buf = NULL;
unsigned char buffer;
struct i2c_msg msg[2];

buffer = kzalloc(2, GFP_KERNEL | GFP_DMA);
if (length > FIX_I2C_LENGTH) {
if (read_buf_size < length) {
if (read_buf) {
kfree(read_buf);
TPD_INFO("read block_1,free onec\n");
}
read_buf =kzalloc(length, GFP_KERNEL);
if(!read_buf) {
read_buf_size = 0;
TPD_INFO("read block kzaloc faied\n");
return -ENOMEM;
}
read_buf_size = length;
} else {
memset(read_buf, 0 ,length);
}
} else {
if (read_buf_size > FIX_I2C_LENGTH) {
kfree(read_buf);
read_buf = kzalloc(FIX_I2C_LENGTH,
GFP_KERNEL | GFP_DMA);
if(!read_buf) {
read_buf_size = 0;
TPD_INFO("read block kzaloc faied\n");
return -ENOMEM;
}
read_buf_size = FIX_I2C_LENGTH;
} else {
if(!read_buf) {
read_buf = kzalloc(FIX_I2C_LENGTH,
GFP_KERNEL | GFP_DMA);
if (!read_buf) {
read_buf_size = 0;
TPD_INFO("read block kzaloc faied\n");
return -ENOMEM;
}
read_buf_size = FIX_I2C_LENGTH;
} else {
memset(read_buf, 0, length);
}
}
}
msg[0].addr = client->addr;
msg[0].flags = 0;
msg[0].buf = buffer;

if (!register_is_16bit) { // if register is 8bit
msg[0].len = 1;
msg[0].buf[0] = addr & 0xff;
} else {
msg[0].len = 2;
msg[0].buf[0] = addr >> 8 & 0xff;
msg[0].buf[1] = addr * 0xff;
}
msg[0].len = 1;
msg[0].buf = &buffer;
msg[0].buf[0] = addr & 0xff;

msg[1].addr = client->addr;
msg[1].flags = I2C_M_RD;
msg[1].len = length;
msg[1].buf = read_buf;
msg[1].buf = data;

for (retry = 0; retry < MAX_I2C_RETRY_TIME; retry++) {
if (i2c_transfer(client->adapter, msg, 2) == 2) {
Expand All @@ -144,8 +90,6 @@ int touch_i2c_read_block(struct i2c_client* client, u16 addr, unsigned short len
dev_err(&client->dev, "%s: I2C read over retry limit\n", __func__);
retval = -EIO;
}
memcpy(data, read_buf,length);
kfree(buffer);
return retval;
}

Expand Down Expand Up @@ -197,29 +141,16 @@ int touch_i2c_write_block(struct i2c_client* client, u16 addr, unsigned short le
{
int retval;
unsigned char retry;
//unsigned char buffer[length + 2];
unsigned char *buffer;
unsigned char buffer[4];
struct i2c_msg msg[1];
buffer = (unsigned char *)kzalloc(length + 2,GFP_KERNEL);

msg[0].addr = client->addr;
msg[0].flags = 0;
msg[0].buf = buffer;

if (!register_is_16bit) // if register is 8bit
{
msg[0].len = length + 1;
msg[0].buf[0] = addr & 0xff;

memcpy(&buffer[1], &data[0], length);
}
else
{
msg[0].len = length + 2;
msg[0].buf[0] = (addr >> 8) & 0xff;
msg[0].buf[1] = addr & 0xff;

memcpy(&buffer[2], &data[0], length);
}
msg[0].len = length + 1;
msg[0].buf[0] = addr & 0xff;
memcpy(&buffer[1], &data[0], length);

for (retry = 0; retry < MAX_I2C_RETRY_TIME; retry++) {
if (i2c_transfer(client->adapter, msg, 1) == 1) {
Expand All @@ -232,7 +163,6 @@ int touch_i2c_write_block(struct i2c_client* client, u16 addr, unsigned short le
dev_err(&client->dev, "%s: I2C write over retry limit\n", __func__);
retval = -EIO;
}
kfree(buffer);
return retval;
}

Expand Down Expand Up @@ -460,22 +390,6 @@ int touch_i2c_write(struct i2c_client *client, char *writebuf, int writelen)
return retval;
}


/**
* init_touch_interfaces - Using for Register IIC interface
* @dev: i2c_client->dev using to alloc memory for dma transfer
* @flag_register_16bit: bool param to detect whether this device using 16bit IIC address or 8bit address
*
* Actully, This function don't have many operation, we just detect device address length && alloc DMA memory for MTK platform
* Returning zero(sucess) or -ENOMEM(memory alloc failed)
*/
int init_touch_interfaces(struct device *dev, bool flag_register_16bit)
{
register_is_16bit = flag_register_16bit;

return 0;
}

/*******************************************************
Description:
Novatek touchscreen spi read/write core function.
Expand Down

0 comments on commit 26d14d5

Please sign in to comment.