Add initial support for the new Goodix "Berlin" touchscreen ICs
over the I2C interface.
This initial driver is derived from the Goodix goodix_ts_berlin
available at [1] and [2] and only supports the GT9916 IC
present on the Qualcomm SM8550 MTP & QRD touch panel.
The current implementation only supports BerlinD, aka GT9916.
[1] https://github.com/goodix/goodix_ts_berlin
[2] https://git.codelinaro.org/clo/la/platform/vendor/opensource/touch-drivers
Reviewed-by: Jeff LaBundy <jeff@labundy.com>
Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org>
---
drivers/input/touchscreen/Kconfig | 14 ++++++
drivers/input/touchscreen/Makefile | 1 +
drivers/input/touchscreen/goodix_berlin_i2c.c | 69 +++++++++++++++++++++++++++
3 files changed, 84 insertions(+)
diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig
index 950da599ae1a..cc7b88118158 100644
--- a/drivers/input/touchscreen/Kconfig
+++ b/drivers/input/touchscreen/Kconfig
@@ -419,6 +419,20 @@ config TOUCHSCREEN_GOODIX
config TOUCHSCREEN_GOODIX_BERLIN_CORE
tristate
+config TOUCHSCREEN_GOODIX_BERLIN_I2C
+ tristate "Goodix Berlin I2C touchscreen"
+ depends on I2C
+ select REGMAP_I2C
+ select TOUCHSCREEN_GOODIX_BERLIN_CORE
+ help
+ Say Y here if you have a Goodix Berlin IC connected to
+ your system via I2C.
+
+ If unsure, say N.
+
+ To compile this driver as a module, choose M here: the
+ module will be called goodix_berlin_i2c.
+
config TOUCHSCREEN_HIDEEP
tristate "HiDeep Touch IC"
depends on I2C
diff --git a/drivers/input/touchscreen/Makefile b/drivers/input/touchscreen/Makefile
index 2e2f3e70cd2c..7ef677cf7a10 100644
--- a/drivers/input/touchscreen/Makefile
+++ b/drivers/input/touchscreen/Makefile
@@ -48,6 +48,7 @@ obj-$(CONFIG_TOUCHSCREEN_EXC3000) += exc3000.o
obj-$(CONFIG_TOUCHSCREEN_FUJITSU) += fujitsu_ts.o
obj-$(CONFIG_TOUCHSCREEN_GOODIX) += goodix_ts.o
obj-$(CONFIG_TOUCHSCREEN_GOODIX_BERLIN_CORE) += goodix_berlin_core.o
+obj-$(CONFIG_TOUCHSCREEN_GOODIX_BERLIN_I2C) += goodix_berlin_i2c.o
obj-$(CONFIG_TOUCHSCREEN_HIDEEP) += hideep.o
obj-$(CONFIG_TOUCHSCREEN_HYNITRON_CSTXXX) += hynitron_cstxxx.o
obj-$(CONFIG_TOUCHSCREEN_ILI210X) += ili210x.o
diff --git a/drivers/input/touchscreen/goodix_berlin_i2c.c b/drivers/input/touchscreen/goodix_berlin_i2c.c
new file mode 100644
index 000000000000..6407b2258eb1
--- /dev/null
+++ b/drivers/input/touchscreen/goodix_berlin_i2c.c
@@ -0,0 +1,69 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Goodix Berlin Touchscreen Driver
+ *
+ * Copyright (C) 2020 - 2021 Goodix, Inc.
+ * Copyright (C) 2023 Linaro Ltd.
+ *
+ * Based on goodix_ts_berlin driver.
+ */
+#include <linux/i2c.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/regmap.h>
+
+#include "goodix_berlin.h"
+
+#define I2C_MAX_TRANSFER_SIZE 256
+
+static const struct regmap_config goodix_berlin_i2c_regmap_conf = {
+ .reg_bits = 32,
+ .val_bits = 8,
+ .max_raw_read = I2C_MAX_TRANSFER_SIZE,
+ .max_raw_write = I2C_MAX_TRANSFER_SIZE,
+};
+
+/* vendor & product left unassigned here, should probably be updated from fw info */
+static const struct input_id goodix_berlin_i2c_input_id = {
+ .bustype = BUS_I2C,
+};
+
+static int goodix_berlin_i2c_probe(struct i2c_client *client)
+{
+ struct regmap *regmap;
+
+ regmap = devm_regmap_init_i2c(client, &goodix_berlin_i2c_regmap_conf);
+ if (IS_ERR(regmap))
+ return PTR_ERR(regmap);
+
+ return goodix_berlin_probe(&client->dev, client->irq,
+ &goodix_berlin_i2c_input_id, regmap);
+}
+
+static const struct i2c_device_id goodix_berlin_i2c_id[] = {
+ { "gt9916", 0 },
+ { }
+};
+
+MODULE_DEVICE_TABLE(i2c, goodix_berlin_i2c_id);
+
+static const struct of_device_id goodix_berlin_i2c_of_match[] = {
+ { .compatible = "goodix,gt9916", },
+ { }
+};
+MODULE_DEVICE_TABLE(of, goodix_berlin_i2c_of_match);
+
+static struct i2c_driver goodix_berlin_i2c_driver = {
+ .driver = {
+ .name = "goodix-berlin-i2c",
+ .of_match_table = goodix_berlin_i2c_of_match,
+ .pm = pm_sleep_ptr(&goodix_berlin_pm_ops),
+ },
+ .probe = goodix_berlin_i2c_probe,
+ .id_table = goodix_berlin_i2c_id,
+};
+module_i2c_driver(goodix_berlin_i2c_driver);
+
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("Goodix Berlin I2C Touchscreen driver");
+MODULE_AUTHOR("Neil Armstrong <neil.armstrong@linaro.org>");
--
2.34.1
Hi Neil,
kernel test robot noticed the following build errors:
[auto build test ERROR on 6465e260f48790807eef06b583b38ca9789b6072]
url: https://github.com/intel-lab-lkp/linux/commits/Neil-Armstrong/dt-bindings-input-document-Goodix-Berlin-Touchscreen-IC/20231002-145648
base: 6465e260f48790807eef06b583b38ca9789b6072
patch link: https://lore.kernel.org/r/20231002-topic-goodix-berlin-upstream-initial-v7-3-792fb91f5e88%40linaro.org
patch subject: [PATCH v7 3/4] Input: goodix-berlin - add I2C support for Goodix Berlin Touchscreen IC
config: nios2-allmodconfig (https://download.01.org/0day-ci/archive/20231002/202310021730.epucKAC1-lkp@intel.com/config)
compiler: nios2-linux-gcc (GCC) 13.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231002/202310021730.epucKAC1-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202310021730.epucKAC1-lkp@intel.com/
All error/warnings (new ones prefixed by >>):
drivers/input/touchscreen/goodix_berlin_core.c: In function 'goodix_berlin_checksum_valid':
>> drivers/input/touchscreen/goodix_berlin_core.c:50:16: error: implicit declaration of function 'FIELD_GET' [-Werror=implicit-function-declaration]
50 | return FIELD_GET(GOODIX_BERLIN_COOR_DATA_CHECKSUM_MASK, cal_checksum) == r_checksum;
| ^~~~~~~~~
drivers/input/touchscreen/goodix_berlin_core.c: In function 'goodix_berlin_get_ic_info':
>> drivers/input/touchscreen/goodix_berlin_core.c:284:1: warning: the frame size of 1140 bytes is larger than 1024 bytes [-Wframe-larger-than=]
284 | }
| ^
cc1: some warnings being treated as errors
vim +/FIELD_GET +50 drivers/input/touchscreen/goodix_berlin_core.c
3fd649a6bbd95d Neil Armstrong 2023-10-02 15
3fd649a6bbd95d Neil Armstrong 2023-10-02 16 /*
3fd649a6bbd95d Neil Armstrong 2023-10-02 17 * Goodix "Berlin" Touchscreen ID driver
3fd649a6bbd95d Neil Armstrong 2023-10-02 18 *
3fd649a6bbd95d Neil Armstrong 2023-10-02 19 * This driver is distinct from goodix.c since hardware interface
3fd649a6bbd95d Neil Armstrong 2023-10-02 20 * is different enough to require a new driver.
3fd649a6bbd95d Neil Armstrong 2023-10-02 21 * None of the register address or data structure are close enough
3fd649a6bbd95d Neil Armstrong 2023-10-02 22 * to the previous generations.
3fd649a6bbd95d Neil Armstrong 2023-10-02 23 *
3fd649a6bbd95d Neil Armstrong 2023-10-02 24 * Currently only handles Multitouch events with already
3fd649a6bbd95d Neil Armstrong 2023-10-02 25 * programmed firmware and "config" for "Revision D" Berlin IC.
3fd649a6bbd95d Neil Armstrong 2023-10-02 26 *
3fd649a6bbd95d Neil Armstrong 2023-10-02 27 * Support is missing for:
3fd649a6bbd95d Neil Armstrong 2023-10-02 28 * - ESD Management
3fd649a6bbd95d Neil Armstrong 2023-10-02 29 * - Firmware update/flashing
3fd649a6bbd95d Neil Armstrong 2023-10-02 30 * - "Config" update/flashing
3fd649a6bbd95d Neil Armstrong 2023-10-02 31 * - Stylus Events
3fd649a6bbd95d Neil Armstrong 2023-10-02 32 * - Gesture Events
3fd649a6bbd95d Neil Armstrong 2023-10-02 33 * - Support for older revisions (A & B)
3fd649a6bbd95d Neil Armstrong 2023-10-02 34 */
3fd649a6bbd95d Neil Armstrong 2023-10-02 35
3fd649a6bbd95d Neil Armstrong 2023-10-02 36 static bool goodix_berlin_checksum_valid(const u8 *data, int size)
3fd649a6bbd95d Neil Armstrong 2023-10-02 37 {
3fd649a6bbd95d Neil Armstrong 2023-10-02 38 u32 cal_checksum = 0;
3fd649a6bbd95d Neil Armstrong 2023-10-02 39 u16 r_checksum;
3fd649a6bbd95d Neil Armstrong 2023-10-02 40 u32 i;
3fd649a6bbd95d Neil Armstrong 2023-10-02 41
3fd649a6bbd95d Neil Armstrong 2023-10-02 42 if (size < GOODIX_BERLIN_COOR_DATA_CHECKSUM_SIZE)
3fd649a6bbd95d Neil Armstrong 2023-10-02 43 return false;
3fd649a6bbd95d Neil Armstrong 2023-10-02 44
3fd649a6bbd95d Neil Armstrong 2023-10-02 45 for (i = 0; i < size - GOODIX_BERLIN_COOR_DATA_CHECKSUM_SIZE; i++)
3fd649a6bbd95d Neil Armstrong 2023-10-02 46 cal_checksum += data[i];
3fd649a6bbd95d Neil Armstrong 2023-10-02 47
3fd649a6bbd95d Neil Armstrong 2023-10-02 48 r_checksum = get_unaligned_le16(&data[i]);
3fd649a6bbd95d Neil Armstrong 2023-10-02 49
3fd649a6bbd95d Neil Armstrong 2023-10-02 @50 return FIELD_GET(GOODIX_BERLIN_COOR_DATA_CHECKSUM_MASK, cal_checksum) == r_checksum;
3fd649a6bbd95d Neil Armstrong 2023-10-02 51 }
3fd649a6bbd95d Neil Armstrong 2023-10-02 52
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
© 2016 - 2026 Red Hat, Inc.