From 70b3e448103c2b431aa10ded548df288c7e627f7 Mon Sep 17 00:00:00 2001 From: litong Date: Fri, 23 Apr 2021 18:57:42 +0800 Subject: [PATCH] Support TP report rate switching TP: Berlin need to support 240Hz and 480Hz report rate switching. Change-Id: I050da407a67e2976903d37900a7c05b938ad1190 Reviewed-on: https://gerrit.mot.com/1925619 SME-Granted: SME Approvals Granted SLTApproved: Slta Waiver Tested-by: Jira Key Reviewed-by: Jichao Zou Submit-Approved: Jira Key --- drivers/input/touchscreen/stmicro_mmi/fts.c | 6 ++ drivers/input/touchscreen/stmicro_mmi/fts.h | 4 + .../touchscreen/stmicro_mmi/fts_mmi_class.c | 87 +++++++++++++++++++ 3 files changed, 97 insertions(+) diff --git a/drivers/input/touchscreen/stmicro_mmi/fts.c b/drivers/input/touchscreen/stmicro_mmi/fts.c index be89fb3f0d5b..899ff9ad1363 100644 --- a/drivers/input/touchscreen/stmicro_mmi/fts.c +++ b/drivers/input/touchscreen/stmicro_mmi/fts.c @@ -3979,6 +3979,12 @@ static int parse_dt(struct device *dev, struct fts_hw_platform_data *bdata) logError(0, "%s flip X\n", tag); } + if (of_property_read_u8_array(np, "st,report_rate_cmd", + bdata->report_rate_cmd, 10) == 0) { + bdata->report_rate_ctrl = true; + logError(1, "%s Support set report rate.\n", tag); + } + return OK; } diff --git a/drivers/input/touchscreen/stmicro_mmi/fts.h b/drivers/input/touchscreen/stmicro_mmi/fts.h index f832b9604d98..ceb5329455e7 100644 --- a/drivers/input/touchscreen/stmicro_mmi/fts.h +++ b/drivers/input/touchscreen/stmicro_mmi/fts.h @@ -234,6 +234,8 @@ struct fts_hw_platform_data { unsigned int y_max; bool y_flip, x_flip; bool power_on_suspend; + u8 report_rate_cmd[10]; /* /< support report rate switching */ + bool report_rate_ctrl; /* /< support report rate switching */ }; /* @@ -359,6 +361,8 @@ struct fts_ts_info { char limit_path[MAX_LIMIT_FILE_NAME]; const char *fw_file; bool force_reflash; + + unsigned int report_rate; }; diff --git a/drivers/input/touchscreen/stmicro_mmi/fts_mmi_class.c b/drivers/input/touchscreen/stmicro_mmi/fts_mmi_class.c index b21d6b683242..515e29a56446 100644 --- a/drivers/input/touchscreen/stmicro_mmi/fts_mmi_class.c +++ b/drivers/input/touchscreen/stmicro_mmi/fts_mmi_class.c @@ -31,8 +31,14 @@ extern int fts_fw_update(struct fts_ts_info *info); static ssize_t fts_mmi_calibrate_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t size); +static ssize_t fts_mmi_report_rate_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t size); +static ssize_t fts_mmi_report_rate_show(struct device *dev, + struct device_attribute *attr, char *buf); static DEVICE_ATTR(calibrate, (S_IWUSR | S_IWGRP), NULL, fts_mmi_calibrate_store); +static DEVICE_ATTR(report_rate, (S_IRUGO | S_IWUSR | S_IWGRP), + fts_mmi_report_rate_show, fts_mmi_report_rate_store); #define MAX_ATTRS_ENTRIES 10 #define ADD_ATTR(name) { \ @@ -53,8 +59,13 @@ static struct attribute_group ext_attr_group = { static int fts_mmi_extend_attribute_group(struct device *dev, struct attribute_group **group) { + struct fts_ts_info *ts = dev_get_drvdata(dev); int idx = 0; + ASSERT_PTR(ts); + if (ts->board->report_rate_ctrl) + ADD_ATTR(report_rate); + if (strncmp(mmi_bl_bootmode(), "mot-factory", strlen("mot-factory")) == 0) { ADD_ATTR(calibrate); } @@ -66,6 +77,73 @@ static int fts_mmi_extend_attribute_group(struct device *dev, struct attribute_g return 0; } +/* Configure different reporting rates + * mode = 0x00, Set report rate 240Hz + * mode = 0x01, Set report rate 480Hz + * ... + */ +static int fts_mmi_set_report_rate(struct fts_ts_info *ts, unsigned int mode) +{ + int ret = 0; + + if (mode == 0x00 || mode == 0x01) { + ts->board->report_rate_cmd[2] = mode; + ret = fts_write(ts->board->report_rate_cmd, ARRAY_SIZE(ts->board->report_rate_cmd)); + pr_info("len=%d ", ARRAY_SIZE(ts->board->report_rate_cmd)); + } else { + pr_info("The report rate mode=%d is valid.\n", mode); + return -EINVAL; + } + + if (ret == OK) { + ts->report_rate = mode; + pr_info("Successfully to set report rate mode=%d!\n", ts->report_rate); + } else + pr_info("Failed to set report rate mode=%d!\n", ts->report_rate); + + return ret; +} + + +static ssize_t fts_mmi_report_rate_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t size) +{ + struct fts_ts_info *ts; + int ret = 0; + unsigned long mode = 0; + + dev = MMI_DEV_TO_TS_DEV(dev); + ts = dev_get_drvdata(dev); + ASSERT_PTR(ts); + + ret = kstrtoul(buf, 0, &mode); + if (ret < 0) { + pr_info("Failed to convert value.\n"); + return -EINVAL; + } + + if (ts->report_rate == mode) { + pr_info("value is same,so not write.\n"); + return size; + } + + ret = fts_mmi_set_report_rate(ts, mode); + + return size; +} + +static ssize_t fts_mmi_report_rate_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct fts_ts_info *ts; + + dev = MMI_DEV_TO_TS_DEV(dev); + ts = dev_get_drvdata(dev); + ASSERT_PTR(ts); + + pr_info("report_rate mode=%d.\n", ts->report_rate); + return scnprintf(buf, PAGE_SIZE, "0x%02x", ts->report_rate); +} static ssize_t fts_mmi_calibrate_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) @@ -259,6 +337,9 @@ static int fts_mmi_post_resume(struct device *dev) dev_dbg(dev, "%s\n", __func__); fts_resume_func(ts); pr_info("IRQ is %s\n", fts_is_InterruptEnabled() ? "EN" : "DIS"); + /* restore data */ + if (ts->board->report_rate_ctrl) + fts_mmi_set_report_rate(ts, ts->report_rate); return 0; } @@ -340,6 +421,12 @@ int fts_mmi_init(struct fts_ts_info *ts, bool enable) dev_err(ts->dev, "Failed chip init\n"); fts_init_sensing(ts); fts_enableInterrupt(); + + /* initialize value */ + /* The report rate defaults to 240Hz */ + if (ts->board->report_rate_ctrl) + ts->report_rate = 0x00; + } else ts_mmi_dev_unregister(ts->dev); return ret;