From 78b1a4e5330da96cbb430a539a50b75644d8cc44 Mon Sep 17 00:00:00 2001 From: wangyq13 Date: Sat, 1 Oct 2022 17:14:18 +0800 Subject: [PATCH] input: ili9882_mmi: add pen notify and palm settings ili9882_mmi: - add pen notify for passive pen pull and plug - add palm settings node for canvas - add usb detection function Change-Id: Idec5779bf1ff7ddc5d27cae13052b85f84bd9c19 Signed-off-by: wangyq13 Reviewed-on: https://gerrit.mot.com/2396006 SME-Granted: SME Approvals Granted SLTApproved: Slta Waiver Tested-by: Jira Key Reviewed-by: Reviewed-by: Jing Hu Reviewed-by: Huosheng Liao Submit-Approved: Jira Key --- .../input/touchscreen/ili9882_mmi/Android.mk | 7 ++ drivers/input/touchscreen/ili9882_mmi/Kbuild | 5 ++ .../input/touchscreen/ili9882_mmi/Makefile | 2 +- .../input/touchscreen/ili9882_mmi/ili9882.h | 8 ++ .../touchscreen/ili9882_mmi/ili9882_node.c | 6 ++ .../touchscreen/ili9882_mmi/ili9882_spi.c | 19 +++++ .../touchscreen/ili9882_mmi/ili_mmi_class.c | 76 +++++++++++++++++++ 7 files changed, 122 insertions(+), 1 deletion(-) diff --git a/drivers/input/touchscreen/ili9882_mmi/Android.mk b/drivers/input/touchscreen/ili9882_mmi/Android.mk index cb7ddfb24ea6..74a327050d56 100644 --- a/drivers/input/touchscreen/ili9882_mmi/Android.mk +++ b/drivers/input/touchscreen/ili9882_mmi/Android.mk @@ -29,6 +29,10 @@ ifeq ($(ILITEK_SUSPEND_PWROFF),true) KERNEL_CFLAGS += CONFIG_ILITEK_SUSPEND_PWROFF=y endif +ifneq ($(BOARD_USES_PEN_NOTIFIER),) + KBUILD_OPTIONS += CONFIG_INPUT_ILITEK_MMI_PEN_NOTIFIER=y +endif + ifeq ($(ILITEK_CHARGER),true) KERNEL_CFLAGS += CONFIG_ILITEK_CHARGER=y endif @@ -55,6 +59,9 @@ include $(CLEAR_VARS) ifneq ($(BOARD_USES_DOUBLE_TAP),) LOCAL_ADDITIONAL_DEPENDENCIES += $(KERNEL_MODULES_OUT)/sensors_class.ko endif +ifneq ($(BOARD_USES_PEN_NOTIFIER),) +LOCAL_ADDITIONAL_DEPENDENCIES += $(KERNEL_MODULES_OUT)/bu520xx_pen.ko +endif LOCAL_MODULE := ili9882_mmi.ko LOCAL_MODULE_TAGS := optional LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) diff --git a/drivers/input/touchscreen/ili9882_mmi/Kbuild b/drivers/input/touchscreen/ili9882_mmi/Kbuild index 6b97be6491fb..30f158c2142e 100644 --- a/drivers/input/touchscreen/ili9882_mmi/Kbuild +++ b/drivers/input/touchscreen/ili9882_mmi/Kbuild @@ -39,6 +39,11 @@ ifneq ($(filter m y,$(CONFIG_ILITEK_GESTURE)),) EXTRA_CFLAGS += -DILI_CONFIG_GESTURE endif +ifneq ($(filter m y,$(CONFIG_INPUT_ILITEK_MMI_PEN_NOTIFIER)),) + KBUILD_EXTRA_SYMBOLS += $(CURDIR)/$(KBUILD_EXTMOD)/../../../misc/pen/$(GKI_OBJ_MODULE_DIR)/Module.symvers + EXTRA_CFLAGS += -DILITEK_PEN_NOTIFIER +endif + ifneq ($(filter m y,$(CONFIG_ILITEK_PANEL_GESTURE)),) EXTRA_CFLAGS += -DILI_CONFIG_PANEL_GESTURE endif diff --git a/drivers/input/touchscreen/ili9882_mmi/Makefile b/drivers/input/touchscreen/ili9882_mmi/Makefile index 490308fa312c..2e1be1574984 100644 --- a/drivers/input/touchscreen/ili9882_mmi/Makefile +++ b/drivers/input/touchscreen/ili9882_mmi/Makefile @@ -15,4 +15,4 @@ clean: KBUILD_EXTRA_SYMBOLS += $(M)/../../../mmi_info/$(GKI_OBJ_MODULE_DIR)/Module.symvers KBUILD_EXTRA_SYMBOLS += $(M)/../touchscreen_mmi/$(GKI_OBJ_MODULE_DIR)/Module.symvers - +KBUILD_EXTRA_SYMBOLS += $(M)/../../../misc/pen/$(GKI_OBJ_MODULE_DIR)/Module.symvers \ No newline at end of file diff --git a/drivers/input/touchscreen/ili9882_mmi/ili9882.h b/drivers/input/touchscreen/ili9882_mmi/ili9882.h index 70f4a1ab94e6..5442421a2583 100755 --- a/drivers/input/touchscreen/ili9882_mmi/ili9882.h +++ b/drivers/input/touchscreen/ili9882_mmi/ili9882.h @@ -119,6 +119,10 @@ #include #endif +#ifdef ILITEK_PEN_NOTIFIER +#include +#endif + #define DRIVER_VERSION "3.0.3.0.200610" /* Options */ @@ -935,6 +939,10 @@ struct ilitek_ts_data { int gesture_demo_ctrl; struct gesture_symbol ges_sym; struct report_info_block rib; + int canvas_value; +#ifdef ILITEK_PEN_NOTIFIER + struct notifier_block pen_notif; +#endif u16 flash_mid; u16 flash_devid; diff --git a/drivers/input/touchscreen/ili9882_mmi/ili9882_node.c b/drivers/input/touchscreen/ili9882_mmi/ili9882_node.c index 1aff8a7e1508..5cced0d431ad 100755 --- a/drivers/input/touchscreen/ili9882_mmi/ili9882_node.c +++ b/drivers/input/touchscreen/ili9882_mmi/ili9882_node.c @@ -111,8 +111,10 @@ static unsigned char g_user_buf[USER_STR_BUFF] = {0}; #define ILI_SPI_NAME_TM "ilitek_tm" #define ILI_SPI_NAME_CSOT "ilitek_csot" #define ILI_SPI_NAME_TXD "ilitek_txd" +#ifndef CONFIG_INPUT_TOUCHSCREEN_MMI static struct class *touchscreen_class; static struct device *touchscreen_class_dev; +#endif int ili_str2hex(char *str) { @@ -2705,6 +2707,7 @@ static int netlink_init(void) return ret; } +#ifndef CONFIG_INPUT_TOUCHSCREEN_MMI static ssize_t path_show(struct device *pDevice, struct device_attribute *pAttr, char *pBuf) { ssize_t blen; @@ -2802,6 +2805,7 @@ device_destroy: return -ENODEV; } +#endif void ili_node_init(void) { @@ -2822,5 +2826,7 @@ void ili_node_init(void) } } netlink_init(); +#ifndef CONFIG_INPUT_TOUCHSCREEN_MMI ilitek_sys_init(); +#endif } diff --git a/drivers/input/touchscreen/ili9882_mmi/ili9882_spi.c b/drivers/input/touchscreen/ili9882_mmi/ili9882_spi.c index 15c2d50b9b0e..4cdc8c0f1bc2 100755 --- a/drivers/input/touchscreen/ili9882_mmi/ili9882_spi.c +++ b/drivers/input/touchscreen/ili9882_mmi/ili9882_spi.c @@ -608,6 +608,20 @@ static int parse_dt(struct device_node *np) } #endif +#ifdef ILITEK_PEN_NOTIFIER +static int pen_notifier_callback(struct notifier_block *self, + unsigned long event, void *data) +{ + ILI_INFO("Received event(%lu) for pen detection\n", event); + + mutex_lock(&ilits->touch_mutex); + ili_ic_func_ctrl("passive_pen", event); + mutex_unlock(&ilits->touch_mutex); + + return 0; +} +#endif + static int ilitek_spi_probe(struct spi_device *spi) { struct touch_bus_info *info = @@ -782,6 +796,11 @@ static int ilitek_spi_probe(struct spi_device *spi) if (ili_core_spi_setup(SPI_CLK) < 0) return -EINVAL; +#ifdef ILITEK_PEN_NOTIFIER + ilits->pen_notif.notifier_call = pen_notifier_callback; + pen_detection_register_client(&ilits->pen_notif); +#endif + #ifdef CONFIG_INPUT_TOUCHSCREEN_MMI ili_mmi_init(ilits, true); #endif diff --git a/drivers/input/touchscreen/ili9882_mmi/ili_mmi_class.c b/drivers/input/touchscreen/ili9882_mmi/ili_mmi_class.c index 7b4402340b18..087d059a4ce4 100644 --- a/drivers/input/touchscreen/ili9882_mmi/ili_mmi_class.c +++ b/drivers/input/touchscreen/ili9882_mmi/ili_mmi_class.c @@ -71,9 +71,84 @@ static int ili_mmi_methods_drv_irq(struct device *dev, int state) static int ili_mmi_charger_mode(struct device *dev, int mode) { + int ret = 0; + mutex_lock(&ilits->touch_mutex); + ret = ili_ic_func_ctrl("plug", mode); + if(ret<0) { + ILI_ERR("Write plug in failed\n"); + } + ILI_INFO("%s: %d\n", __func__, mode); + mutex_unlock(&ilits->touch_mutex); + return 0; } +#define MAX_ATTRS_ENTRIES 10 +#define ADD_ATTR(name) { \ + if (idx < MAX_ATTRS_ENTRIES) { \ + dev_info(dev, "%s: [%d] adding %p\n", __func__, idx, &dev_attr_##name.attr); \ + ext_attributes[idx] = &dev_attr_##name.attr; \ + idx++; \ + } else { \ + dev_err(dev, "%s: cannot add attribute '%s'\n", __func__, #name); \ + } \ +} + +static struct attribute *ext_attributes[MAX_ATTRS_ENTRIES]; +static struct attribute_group ext_attr_group = { + .attrs = ext_attributes, +}; + +static ssize_t ili_palm_settings_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return scnprintf(buf, PAGE_SIZE, "%d", ilits->canvas_value); +} + +static ssize_t ili_palm_settings_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) + +{ + int value; + int err = 0; + + mutex_lock(&ilits->touch_mutex); + if (count > 2) + return -EINVAL; + + if (sscanf(buf, "%d", &value) != 1) + return -EINVAL; + + err = count; + + if (ili_ic_func_ctrl("canvas", value) < 0) + ILI_ERR("Write canvas enable fail\n"); + else + ilits->canvas_value = value; + ILI_INFO("%s: %d\n", __func__, ilits->canvas_value); + mutex_unlock(&ilits->touch_mutex); + + return err; +} + +static DEVICE_ATTR(palm_settings, S_IRUGO | S_IWUSR | S_IWGRP, ili_palm_settings_show, ili_palm_settings_store); + +static int ili_mmi_extend_attribute_group(struct device *dev, struct attribute_group **group) +{ + int idx = 0; + + ADD_ATTR(palm_settings); + + if (idx) { + ext_attributes[idx] = NULL; + *group = &ext_attr_group; + } else + *group = NULL; + + return 0; +} + + static int ili_mmi_methods_reset(struct device *dev, int type) { return 0; @@ -122,6 +197,7 @@ static struct ts_mmi_methods ili_mmi_methods = { .charger_mode = ili_mmi_charger_mode, /* Firmware */ .firmware_update = ili_mmi_firmware_update, + .extend_attribute_group = ili_mmi_extend_attribute_group, /* PM callback */ .pre_resume = ili_mmi_pre_resume, .post_resume = ili_mmi_post_resume,