diff --git a/drivers/input/touchscreen/goodix_berlin_mmi/Kbuild b/drivers/input/touchscreen/goodix_berlin_mmi/Kbuild index e9af199877ce..b006b1470678 100644 --- a/drivers/input/touchscreen/goodix_berlin_mmi/Kbuild +++ b/drivers/input/touchscreen/goodix_berlin_mmi/Kbuild @@ -13,7 +13,8 @@ goodix_brl_mmi-objs := \ goodix_ts_utils.o \ goodix_brl_fwupdate.o \ goodix_ts_inspect.o \ - goodix_ts_tools.o + goodix_ts_tools.o \ + goodix_ts_config.o ifneq ($(filter m y, $(CONFIG_DRM_PANEL_EVENT_NOTIFICATIONS)),) EXTRA_CFLAGS += -DCONFIG_DRM_PANEL_EVENT_NOTIFICATIONS @@ -64,5 +65,24 @@ ifneq ($(filter m y,$(CONFIG_INPUT_TOUCHSCREEN_MMI)),) goodix_brl_mmi-objs += goodix_ts_mmi.o endif +ifneq ($(findstring _factory,$(TARGET_PRODUCT)),) +USE_TARGET_PRODUCT := $(strip $(subst _factory,, $(TARGET_PRODUCT))) +else +USE_TARGET_PRODUCT := $(TARGET_PRODUCT) +endif + +ifneq ($(filter oneli, $(USE_TARGET_PRODUCT)), ) + EXTRA_CFLAGS += -DPRODUCT_ONELI +else ifneq ($(filter hiphi, $(USE_TARGET_PRODUCT)), ) + EXTRA_CFLAGS += -DPRODUCT_HIPHI +else ifneq ($(filter hiphic, $(USE_TARGET_PRODUCT)), ) + EXTRA_CFLAGS += -DPRODUCT_HIPHIC +else ifneq ($(filter li, $(USE_TARGET_PRODUCT)), ) + EXTRA_CFLAGS += -DPRODUCT_LI +else ifneq ($(filter eqs, $(USE_TARGET_PRODUCT)), ) + EXTRA_CFLAGS += -DPRODUCT_EQS +endif +$(warning "william EXTRA_CFLAGS = $(EXTRA_CFLAGS)") + KBUILD_EXTRA_SYMBOLS += $(CURDIR)/$(KBUILD_EXTMOD)/../touchscreen_mmi/$(GKI_OBJ_MODULE_DIR)/Module.symvers KBUILD_EXTRA_SYMBOLS += $(CURDIR)/$(KBUILD_EXTMOD)/../../../mmi_info/$(GKI_OBJ_MODULE_DIR)/Module.symvers diff --git a/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_config.c b/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_config.c new file mode 100644 index 000000000000..9b8312094e07 --- /dev/null +++ b/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_config.c @@ -0,0 +1,128 @@ +/* + * Copyright (C) 2022 Motorola Mobility LLC + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ +#include "goodix_ts_config.h" + +struct goodix_ic_report_rate_config report_rate_config_info = { +#if defined(PRODUCT_LI) || defined(PRODUCT_ONELI) + .rate_config_count = 2, + .refresh_rate_ctrl = 0, + .interpolation_ctrl = 1, + { + { + .interpolation_flag = 0, + .report_rate = 240, + .command = 0x9D01, + }, + { + .interpolation_flag = 1, + .report_rate = 360, + .command = 0x9D02, + }, + } +#elif defined(PRODUCT_HIPHIC) + .rate_config_count = 3, + .refresh_rate_ctrl = 1, + .interpolation_ctrl = 1, + { + { + .interpolation_flag = 0, + .refresh_rate = {48, 144}, + .report_rate = 240, + .command = 0x9D01, + }, + { + .interpolation_flag = 1, + .refresh_rate = {144, 144}, + .report_rate = 576, + .command = 0xC103, + }, + { + .interpolation_flag = 1, + .refresh_rate = {48, 120}, + .report_rate = 480, + .command = 0xC102, + }, + } +#elif defined(PRODUCT_HIPHI) + .rate_config_count = 2, + .refresh_rate_ctrl = 0, + .interpolation_ctrl = 1, + { + { + .interpolation_flag = 0, + .report_rate = 360, + .command = 0x9D02, + }, + { + .interpolation_flag = 1, + .report_rate = 720, + .command = 0xC101, + }, + } +#endif +}; + +int goodix_ts_mmi_get_report_rate(struct goodix_ts_core *core_data) +{ + int refresh_rate_ctrl = 0; + int interpolation_ctrl = 0; + int interpolation_flag = 0; + int refresh_rate = 0; + int i = 0; + + refresh_rate_ctrl = core_data->board_data.report_rate_ctrl; + interpolation_ctrl = core_data->board_data.interpolation_ctrl; + + interpolation_flag = core_data->get_mode.interpolation; + refresh_rate = core_data->refresh_rate; + + ts_debug("refresh_rate_ctrl: %d, interpolation_ctrl: %d, interpolation_flag: %d, refresh_rate: %d", + refresh_rate_ctrl, interpolation_ctrl, interpolation_flag, refresh_rate); + + if (refresh_rate_ctrl == 0 && interpolation_ctrl == 1) { + for (i = 0; i < report_rate_config_info.rate_config_count; i++) { + if (interpolation_flag == report_rate_config_info.report_rate_info[i].interpolation_flag) { + break; + } + } + } else if (refresh_rate_ctrl == 1 && interpolation_ctrl == 1) { + for (i = 0; i < report_rate_config_info.rate_config_count; i++) { + if ((interpolation_flag == report_rate_config_info.report_rate_info[i].interpolation_flag) && + ((refresh_rate >= report_rate_config_info.report_rate_info[i].refresh_rate[0]) && + (refresh_rate <= report_rate_config_info.report_rate_info[i].refresh_rate[1]))) { + break; + } + } + } else if (refresh_rate_ctrl == 1 && interpolation_ctrl == 0) { + for (i = 0; i < report_rate_config_info.rate_config_count; i++) { + if ((refresh_rate >= report_rate_config_info.report_rate_info[i].refresh_rate[0]) && + (refresh_rate <= report_rate_config_info.report_rate_info[i].refresh_rate[1])) { + break; + } + } + } else { + //refresh_rate_ctrl = 0, interpolation_ctrl = 0 + i = 0; + } + + if (i == report_rate_config_info.rate_config_count) { + ts_err("Get config report rate fail"); + return -1; + } else { + ts_debug("Get config report rate %dHZ, command : 0x%02x ", + report_rate_config_info.report_rate_info[i].report_rate, + report_rate_config_info.report_rate_info[i].command); + return report_rate_config_info.report_rate_info[i].command; + } +} + diff --git a/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_config.h b/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_config.h new file mode 100644 index 000000000000..fea8c426e92e --- /dev/null +++ b/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_config.h @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2022 Motorola Mobility LLC + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ +#ifndef __GOODIX_TS_CONFIG_H__ +#define __GOODIX_TS_CONFIG_H__ + +#include +#include "goodix_ts_core.h" + +#define MAX_REPORT_RATE_CONFIG 12 +#define REPORT_RATE_CMD_180HZ 0x9D00 +#define REPORT_RATE_CMD_240HZ 0x9D01 +#define REPORT_RATE_CMD_360HZ 0x9D02 +#define REPORT_RATE_CMD_LOW 0x9D +#define REPORT_RATE_CMD_480HZ 0xC102 +#define REPORT_RATE_CMD_576HZ 0xC103 +#define REPORT_RATE_CMD_720HZ 0xC101 +#define REPORT_RATE_CMD_HIGH 0xC1 + +struct report_rate_config { + bool interpolation_flag; //if enable interpolation report rate + u16 refresh_rate[2]; //display refresh rate + u16 report_rate; //touch report rate + u16 command; //report rate switch command +}; + +struct goodix_ic_report_rate_config { + u8 rate_config_count; //the count of report rate combination + bool refresh_rate_ctrl; //if support report rate change according to refresh rate + bool interpolation_ctrl; //if support interpolation report rate + struct report_rate_config report_rate_info[MAX_REPORT_RATE_CONFIG]; +}; + +int goodix_ts_mmi_get_report_rate(struct goodix_ts_core *core_data); + +#endif diff --git a/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_mmi.c b/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_mmi.c index 04a91f640ce1..894694351791 100644 --- a/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_mmi.c +++ b/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_mmi.c @@ -15,6 +15,7 @@ #include "goodix_ts_core.h" #include #include +#include "goodix_ts_config.h" #define GET_GOODIX_DATA(dev) { \ pdev = dev_get_drvdata(dev); \ @@ -388,26 +389,16 @@ static ssize_t goodix_ts_stylus_mode_show(struct device *dev, return scnprintf(buf, PAGE_SIZE, "0x%02x", core_data->set_mode.stylus_mode); } -#define DSI_REFRESH_RATE_144 144 static int goodix_ts_mmi_set_report_rate(struct goodix_ts_core *core_data) { int ret = 0; int mode = 0; - if (core_data->get_mode.interpolation == 0x00) { - mode = REPORT_RATE_DEFAULT; - goto ts_send_cmd; + mode = goodix_ts_mmi_get_report_rate(core_data); + if (mode == -1) { + return -EINVAL; } - if (core_data->board_data.report_rate_ctrl) { - if (core_data->refresh_rate == DSI_REFRESH_RATE_144) - mode = REPORT_RATE_576HZ; - else - mode = REPORT_RATE_480HZ; - } else - mode = REPORT_RATE_720HZ; - -ts_send_cmd: core_data->get_mode.report_rate_mode = mode; if (core_data->set_mode.report_rate_mode == mode) { ts_debug("The value = %d is same, so not to write", mode); @@ -419,20 +410,36 @@ ts_send_cmd: return 0; } - ret = goodix_ts_send_cmd(core_data, INTERPOLATION_SWITCH_CMD, 5, - core_data->get_mode.report_rate_mode, 0x00); + //if now on high report rate and need switch to low report rate + if ((((core_data->set_mode.report_rate_mode >> 8) & 0xFF) == REPORT_RATE_CMD_HIGH) && + (((mode >> 8) & 0xFF) == REPORT_RATE_CMD_LOW)) { + ts_info("exit high report rate"); + ret = goodix_ts_send_cmd(core_data, EXIT_HIGH_REPORT_RATE_CMD >> 8, 5, + EXIT_HIGH_REPORT_RATE_CMD & 0xFF, 0x00); + if (ret < 0) { + ts_err("failed to exit high report rate"); + return -EINVAL; + } + msleep(20); + } + + //send switch command + ret = goodix_ts_send_cmd(core_data, mode >> 8, 5, + mode & 0xFF, 0x00); if (ret < 0) { ts_err("failed to set report rate, mode = %d", mode); return -EINVAL; } + msleep(20); core_data->set_mode.report_rate_mode = mode; - msleep(20); - ts_info("Success to set %s\n", mode == 0x00 ? "Default" : - (mode == 0x01 ? "REPORT_RATE_720HZ" : - (mode == 0x02 ? "REPORT_RATE_480HZ" : - (mode == 0x03 ? "REPORT_RATE_576HZ" : - "Unsupported")))); + + ts_info("Success to set %s\n", mode == REPORT_RATE_CMD_240HZ ? "REPORT_RATE_240HZ" : + (mode == REPORT_RATE_CMD_360HZ ? "REPORT_RATE_360HZ" : + (mode == REPORT_RATE_CMD_480HZ ? "REPORT_RATE_480HZ" : + (mode == REPORT_RATE_CMD_576HZ ? "REPORT_RATE_576HZ" : + (mode == REPORT_RATE_CMD_720HZ ? "REPORT_RATE_720HZ" : + "Unsupported"))))); return ret; } @@ -913,18 +920,21 @@ static int goodix_ts_mmi_post_resume(struct device *dev) { } if (core_data->board_data.interpolation_ctrl && core_data->get_mode.interpolation) { - ret = goodix_ts_send_cmd(core_data, INTERPOLATION_SWITCH_CMD, 5, - core_data->get_mode.report_rate_mode, 0x00); + //send switch command + ret = goodix_ts_send_cmd(core_data, (core_data->get_mode.report_rate_mode) >> 8, 5, + (core_data->get_mode.report_rate_mode) & 0xFF, 0x00); if (!ret) { core_data->set_mode.interpolation = core_data->get_mode.interpolation; core_data->set_mode.report_rate_mode = core_data->get_mode.report_rate_mode; msleep(20); + ts_info("Success to %s interpolation mode\n", - core_data->get_mode.report_rate_mode == 0x00 ? "Default" : - (core_data->get_mode.report_rate_mode == 0x01 ? "REPORT_RATE_720HZ" : - (core_data->get_mode.report_rate_mode == 0x02 ? "REPORT_RATE_480HZ" : - (core_data->get_mode.report_rate_mode == 0x03 ? "REPORT_RATE_576HZ" : - "Unsupported")))); + core_data->get_mode.report_rate_mode == REPORT_RATE_CMD_240HZ ? "REPORT_RATE_240HZ" : + (core_data->get_mode.report_rate_mode == REPORT_RATE_CMD_360HZ ? "REPORT_RATE_360HZ" : + (core_data->get_mode.report_rate_mode == REPORT_RATE_CMD_480HZ ? "REPORT_RATE_480HZ" : + (core_data->get_mode.report_rate_mode == REPORT_RATE_CMD_576HZ ? "REPORT_RATE_576HZ" : + (core_data->get_mode.report_rate_mode == REPORT_RATE_CMD_720HZ ? "REPORT_RATE_720HZ" : + "Unsupported"))))); } } diff --git a/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_mmi.h b/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_mmi.h index 6062d36a8a79..ebc6b61e5dcf 100644 --- a/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_mmi.h +++ b/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_mmi.h @@ -47,10 +47,5 @@ static int inline goodix_ts_mmi_dev_unregister(struct platform_device *ts_device #define STYLUS_MODE_SWITCH_CMD 0xA4 -#define INTERPOLATION_SWITCH_CMD 0xC1 -#define REPORT_RATE_DEFAULT 0x00 -#define REPORT_RATE_720HZ 0x01 -#define REPORT_RATE_480HZ 0x02 -#define REPORT_RATE_576HZ 0x03 - +#define EXIT_HIGH_REPORT_RATE_CMD 0xC100 #endif