diff --git a/drivers/input/touchscreen/goodix_berlin_mmi/Kbuild b/drivers/input/touchscreen/goodix_berlin_mmi/Kbuild index cdbab7318e4f..c09e33c94b4c 100644 --- a/drivers/input/touchscreen/goodix_berlin_mmi/Kbuild +++ b/drivers/input/touchscreen/goodix_berlin_mmi/Kbuild @@ -63,6 +63,9 @@ endif ifneq ($(filter m y,$(CONFIG_INPUT_TOUCHSCREEN_MMI)),) EXTRA_CFLAGS += -DCONFIG_INPUT_TOUCHSCREEN_MMI goodix_brl_mmi-objs += goodix_ts_mmi.o +ifneq ($(filter felix, $(USE_TARGET_PRODUCT)), ) + EXTRA_CFLAGS += -CONFIG_GTP_DISP_MODE +endif endif ifneq ($(findstring _factory,$(TARGET_PRODUCT)),) diff --git a/drivers/input/touchscreen/goodix_berlin_mmi/goodix_brl_hw.c b/drivers/input/touchscreen/goodix_berlin_mmi/goodix_brl_hw.c index 97380020f740..814ad56669ce 100644 --- a/drivers/input/touchscreen/goodix_berlin_mmi/goodix_brl_hw.c +++ b/drivers/input/touchscreen/goodix_berlin_mmi/goodix_brl_hw.c @@ -395,6 +395,37 @@ static int brl_send_cmd(struct goodix_ts_core *cd, return -EINVAL; } +#ifdef CONFIG_GTP_DISP_MODE +#define DISP_MODE_CMD_LEN 5 +#define DISP_MODE_CMD 0xbb +#define DISP_MODE_MAX 4 + +static int brl_set_display_mode(struct goodix_ts_core *cd, int mode) +{ + struct goodix_ts_cmd temp_cmd; + int ret; + + if (mode < 0 || mode > DISP_MODE_MAX) { + ts_err("invalid mode: %d", mode); + return -EINVAL; + } + temp_cmd.len = DISP_MODE_CMD_LEN; + temp_cmd.cmd = DISP_MODE_CMD; + temp_cmd.data[0] = mode; + + ret = brl_send_cmd(cd, &temp_cmd); + if (ret < 0) { + ts_err("failed to set display mode"); + return -EIO; + } + ts_info("set display mode: %d", temp_cmd.data[0]); + + return 0; +} +#else +static int inline brl_set_display_mode(struct goodix_ts_core *cd, int mode) { return -EINVAL; } +#endif + #pragma pack(1) struct goodix_config_head { union { @@ -1465,6 +1496,7 @@ static struct goodix_ts_hw_ops brl_hw_ops = { .event_handler = brl_event_handler, .after_event_handler = brl_after_event_handler, .get_capacitance_data = brl_get_capacitance_data, + .display_mode = brl_set_display_mode, }; struct goodix_ts_hw_ops *goodix_get_hw_ops(void) diff --git a/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_core.h b/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_core.h index ccba070d185e..7433cded93e4 100644 --- a/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_core.h +++ b/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_core.h @@ -451,6 +451,7 @@ struct goodix_ts_hw_ops { int (*event_handler)(struct goodix_ts_core *cd, struct goodix_ts_event *ts_event); int (*after_event_handler)(struct goodix_ts_core *cd); /* clean sync flag */ int (*get_capacitance_data)(struct goodix_ts_core *cd, struct ts_rawdata_info *info); + int (*display_mode)(struct goodix_ts_core *cd, int mode); }; /* 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 9955fc6292d2..818ac7d2c341 100644 --- a/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_mmi.c +++ b/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_mmi.c @@ -1136,17 +1136,50 @@ static int goodix_ts_mmi_update_fps_mode(struct device *dev, int mode) { } #endif +#define Y_MIN_ID 2 +#define Y_MAX_ID 3 +#define SCREEN_X_MAX 1080 +#define SCREEN_Y_MAX 2992 +#define SCREEN_EXTENDED 2600 +#define SCREEN_PRIM_COMPACT 1980 +#define DISP_MODE_REAR 3 +#define DISP_MODE_FULL 4 +#define DISP_MODE_EXTENDED 0 +#define DISP_MODE_PRIM_COMPACT 1 +#define DISP_MODE_PRIM_PEEK 2 + static int rdArray[4]; static int goodix_ts_mmi_active_region(struct device *dev, int *reg_data) { struct goodix_ts_core *core_data; struct platform_device *pdev; + int ret, dmode = -1; GET_GOODIX_DATA(dev); memcpy(rdArray, reg_data, sizeof(rdArray)); - ts_info("set active region: %d %d %d %d\n", rdArray[0], rdArray[1], rdArray[2], rdArray[3]); + if (rdArray[Y_MIN_ID] > 0) { /* REAR */ + dmode = DISP_MODE_REAR; /* Mode4 */ + } else { /* FULL or PRIMARY */ + if (rdArray[Y_MAX_ID] == SCREEN_Y_MAX) + dmode = DISP_MODE_FULL; /* Mode5 */ + else if (rdArray[Y_MAX_ID] > SCREEN_EXTENDED) + dmode = DISP_MODE_EXTENDED; /* Mode1 */ + else if (rdArray[Y_MAX_ID] > SCREEN_PRIM_COMPACT) + dmode = DISP_MODE_PRIM_COMPACT; /* Mode2 */ + else + dmode = DISP_MODE_PRIM_PEEK; /* Mode3 */ + } + if (dmode >= 0 ) { + ret = core_data->hw_ops->display_mode(core_data, dmode); + if (!ret) + ts_info("set active region: %d %d %d %d; dmode=%d\n", + rdArray[0], rdArray[1], rdArray[Y_MIN_ID], rdArray[Y_MAX_ID], dmode); + } else + dev_err(&pdev->dev, "Invalid display mode; reqion %d %d %d %d\n", + rdArray[0], rdArray[1], rdArray[Y_MIN_ID], rdArray[Y_MAX_ID]); + return 0; } @@ -1158,7 +1191,7 @@ static int goodix_ts_mmi_methods_get_active_region(struct device *dev, void *uid GET_GOODIX_DATA(dev); memcpy((int *)uidata, rdArray, sizeof(rdArray)); - return 0; + return 0; } static struct ts_mmi_methods goodix_ts_mmi_methods = {