1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Goodix "Berlin" Touchscreen IC driver
4 * Copyright (C) 2020 - 2021 Goodix, Inc.
5 * Copyright (C) 2023 Linaro Ltd.
7 * Based on goodix_ts_berlin driver.
9 * This driver is distinct from goodix.c since hardware interface
10 * is different enough to require a new driver.
11 * None of the register address or data structure are close enough
12 * to the previous generations.
14 * Currently the driver only handles Multitouch events with already
15 * programmed firmware and "config" for "Revision D" Berlin IC.
17 * Support is missing for:
19 * - Firmware update/flashing
20 * - "Config" update/flashing
23 * - Support for older revisions (A & B)
26 #include <linux/bitfield.h>
27 #include <linux/gpio/consumer.h>
28 #include <linux/input.h>
29 #include <linux/input/mt.h>
30 #include <linux/input/touchscreen.h>
31 #include <linux/regmap.h>
32 #include <linux/regulator/consumer.h>
33 #include <linux/sizes.h>
34 #include <linux/unaligned.h>
36 #include "goodix_berlin.h"
38 #define GOODIX_BERLIN_MAX_TOUCH 10
40 #define GOODIX_BERLIN_NORMAL_RESET_DELAY_MS 100
42 #define GOODIX_BERLIN_TOUCH_EVENT BIT(7)
43 #define GOODIX_BERLIN_REQUEST_EVENT BIT(6)
44 #define GOODIX_BERLIN_TOUCH_COUNT_MASK GENMASK(3, 0)
46 #define GOODIX_BERLIN_REQUEST_CODE_RESET 3
48 #define GOODIX_BERLIN_POINT_TYPE_MASK GENMASK(3, 0)
49 #define GOODIX_BERLIN_POINT_TYPE_STYLUS_HOVER 1
50 #define GOODIX_BERLIN_POINT_TYPE_STYLUS 3
52 #define GOODIX_BERLIN_TOUCH_ID_MASK GENMASK(7, 4)
54 #define GOODIX_BERLIN_DEV_CONFIRM_VAL 0xAA
55 #define GOODIX_BERLIN_BOOTOPTION_ADDR 0x10000
56 #define GOODIX_BERLIN_FW_VERSION_INFO_ADDR 0x10014
58 #define GOODIX_BERLIN_IC_INFO_MAX_LEN SZ_1K
59 #define GOODIX_BERLIN_IC_INFO_ADDR 0x10070
61 #define GOODIX_BERLIN_CHECKSUM_SIZE sizeof(u16)
63 struct goodix_berlin_fw_version
{
69 u8 patch_vid_reserved
;
75 struct goodix_berlin_ic_info_version
{
82 u8 frame_data_customer_id
;
83 u8 frame_data_version_id
;
84 u8 touch_data_customer_id
;
85 u8 touch_data_version_id
;
89 struct goodix_berlin_ic_info_feature
{
90 __le16 freqhop_feature
;
91 __le16 calibration_feature
;
92 __le16 gesture_feature
;
93 __le16 side_touch_feature
;
94 __le16 stylus_feature
;
97 struct goodix_berlin_ic_info_misc
{
100 __le32 cmd_reply_addr
;
101 __le16 cmd_reply_len
;
102 __le32 fw_state_addr
;
104 __le32 fw_buffer_addr
;
105 __le16 fw_buffer_max_len
;
106 __le32 frame_data_addr
;
107 __le16 frame_data_head_len
;
111 u8 pack_compress_version
;
112 __le16 stylus_struct_len
;
113 __le16 mutual_struct_len
;
114 __le16 self_struct_len
;
115 __le16 noise_struct_len
;
116 __le32 touch_data_addr
;
117 __le16 touch_data_head_len
;
118 __le16 point_struct_len
;
121 __le32 mutual_rawdata_addr
;
122 __le32 mutual_diffdata_addr
;
123 __le32 mutual_refdata_addr
;
124 __le32 self_rawdata_addr
;
125 __le32 self_diffdata_addr
;
126 __le32 self_refdata_addr
;
127 __le32 iq_rawdata_addr
;
128 __le32 iq_refdata_addr
;
129 __le32 im_rawdata_addr
;
130 __le16 im_readata_len
;
131 __le32 noise_rawdata_addr
;
132 __le16 noise_rawdata_len
;
133 __le32 stylus_rawdata_addr
;
134 __le16 stylus_rawdata_len
;
135 __le32 noise_data_addr
;
139 struct goodix_berlin_touch
{
146 #define GOODIX_BERLIN_TOUCH_SIZE sizeof(struct goodix_berlin_touch)
148 struct goodix_berlin_header
{
155 #define GOODIX_BERLIN_HEADER_SIZE sizeof(struct goodix_berlin_header)
157 struct goodix_berlin_event
{
158 struct goodix_berlin_header hdr
;
159 /* The data below is u16/__le16 aligned */
160 u8 data
[GOODIX_BERLIN_TOUCH_SIZE
* GOODIX_BERLIN_MAX_TOUCH
+
161 GOODIX_BERLIN_CHECKSUM_SIZE
];
164 struct goodix_berlin_core
{
166 struct regmap
*regmap
;
167 struct regulator
*avdd
;
168 struct regulator
*iovdd
;
169 struct gpio_desc
*reset_gpio
;
170 struct touchscreen_properties props
;
171 struct goodix_berlin_fw_version fw_version
;
172 struct input_dev
*input_dev
;
175 /* Runtime parameters extracted from IC_INFO buffer */
178 struct goodix_berlin_event event
;
181 static bool goodix_berlin_checksum_valid(const u8
*data
, int size
)
183 u32 cal_checksum
= 0;
187 if (size
< GOODIX_BERLIN_CHECKSUM_SIZE
)
190 for (i
= 0; i
< size
- GOODIX_BERLIN_CHECKSUM_SIZE
; i
++)
191 cal_checksum
+= data
[i
];
193 r_checksum
= get_unaligned_le16(&data
[i
]);
195 return (u16
)cal_checksum
== r_checksum
;
198 static bool goodix_berlin_is_dummy_data(struct goodix_berlin_core
*cd
,
199 const u8
*data
, int size
)
204 * If the device is missing or doesn't respond the buffer
205 * could be filled with bus default line state, 0x00 or 0xff,
206 * so declare success the first time we encounter neither.
208 for (i
= 0; i
< size
; i
++)
209 if (data
[i
] > 0 && data
[i
] < 0xff)
215 static int goodix_berlin_dev_confirm(struct goodix_berlin_core
*cd
)
217 u8 tx_buf
[8], rx_buf
[8];
221 memset(tx_buf
, GOODIX_BERLIN_DEV_CONFIRM_VAL
, sizeof(tx_buf
));
223 error
= regmap_raw_write(cd
->regmap
,
224 GOODIX_BERLIN_BOOTOPTION_ADDR
,
225 tx_buf
, sizeof(tx_buf
));
229 error
= regmap_raw_read(cd
->regmap
,
230 GOODIX_BERLIN_BOOTOPTION_ADDR
,
231 rx_buf
, sizeof(rx_buf
));
235 if (!memcmp(tx_buf
, rx_buf
, sizeof(tx_buf
)))
238 usleep_range(5000, 5100);
241 dev_err(cd
->dev
, "device confirm failed, rx_buf: %*ph\n",
242 (int)sizeof(rx_buf
), rx_buf
);
247 static int goodix_berlin_power_on(struct goodix_berlin_core
*cd
)
251 error
= regulator_enable(cd
->iovdd
);
253 dev_err(cd
->dev
, "Failed to enable iovdd: %d\n", error
);
257 /* Vendor waits 3ms for IOVDD to settle */
258 usleep_range(3000, 3100);
260 error
= regulator_enable(cd
->avdd
);
262 dev_err(cd
->dev
, "Failed to enable avdd: %d\n", error
);
263 goto err_iovdd_disable
;
266 /* Vendor waits 15ms for IOVDD to settle */
267 usleep_range(15000, 15100);
269 gpiod_set_value_cansleep(cd
->reset_gpio
, 0);
271 /* Vendor waits 4ms for Firmware to initialize */
272 usleep_range(4000, 4100);
274 error
= goodix_berlin_dev_confirm(cd
);
278 /* Vendor waits 100ms for Firmware to fully boot */
279 msleep(GOODIX_BERLIN_NORMAL_RESET_DELAY_MS
);
284 gpiod_set_value_cansleep(cd
->reset_gpio
, 1);
285 regulator_disable(cd
->avdd
);
287 regulator_disable(cd
->iovdd
);
291 static void goodix_berlin_power_off(struct goodix_berlin_core
*cd
)
293 gpiod_set_value_cansleep(cd
->reset_gpio
, 1);
294 regulator_disable(cd
->avdd
);
295 regulator_disable(cd
->iovdd
);
298 static int goodix_berlin_read_version(struct goodix_berlin_core
*cd
)
302 error
= regmap_raw_read(cd
->regmap
, GOODIX_BERLIN_FW_VERSION_INFO_ADDR
,
303 &cd
->fw_version
, sizeof(cd
->fw_version
));
305 dev_err(cd
->dev
, "error reading fw version, %d\n", error
);
309 if (!goodix_berlin_checksum_valid((u8
*)&cd
->fw_version
,
310 sizeof(cd
->fw_version
))) {
311 dev_err(cd
->dev
, "invalid fw version: checksum error\n");
318 /* Only extract necessary data for runtime */
319 static int goodix_berlin_parse_ic_info(struct goodix_berlin_core
*cd
,
320 const u8
*data
, u16 length
)
322 struct goodix_berlin_ic_info_misc
*misc
;
323 unsigned int offset
= 0;
325 offset
+= sizeof(__le16
); /* length */
326 offset
+= sizeof(struct goodix_berlin_ic_info_version
);
327 offset
+= sizeof(struct goodix_berlin_ic_info_feature
);
329 /* IC_INFO Parameters, variable width structure */
330 offset
+= 4 * sizeof(u8
); /* drv_num, sen_num, button_num, force_num */
331 if (offset
>= length
)
334 #define ADVANCE_LE16_PARAMS() \
336 u8 param_num = data[offset++]; \
337 offset += param_num * sizeof(__le16); \
338 if (offset >= length) \
339 goto invalid_offset; \
341 ADVANCE_LE16_PARAMS(); /* active_scan_rate_num */
342 ADVANCE_LE16_PARAMS(); /* mutual_freq_num*/
343 ADVANCE_LE16_PARAMS(); /* self_tx_freq_num */
344 ADVANCE_LE16_PARAMS(); /* self_rx_freq_num */
345 ADVANCE_LE16_PARAMS(); /* stylus_freq_num */
346 #undef ADVANCE_LE16_PARAMS
348 misc
= (struct goodix_berlin_ic_info_misc
*)&data
[offset
];
349 cd
->touch_data_addr
= le32_to_cpu(misc
->touch_data_addr
);
354 dev_err(cd
->dev
, "ic_info length is invalid (offset %d length %d)\n",
359 static int goodix_berlin_get_ic_info(struct goodix_berlin_core
*cd
)
361 u8
*afe_data
__free(kfree
) = NULL
;
366 afe_data
= kzalloc(GOODIX_BERLIN_IC_INFO_MAX_LEN
, GFP_KERNEL
);
370 error
= regmap_raw_read(cd
->regmap
, GOODIX_BERLIN_IC_INFO_ADDR
,
371 &length_raw
, sizeof(length_raw
));
373 dev_err(cd
->dev
, "failed get ic info length, %d\n", error
);
377 length
= le16_to_cpu(length_raw
);
378 if (length
>= GOODIX_BERLIN_IC_INFO_MAX_LEN
) {
379 dev_err(cd
->dev
, "invalid ic info length %d\n", length
);
383 error
= regmap_raw_read(cd
->regmap
, GOODIX_BERLIN_IC_INFO_ADDR
,
386 dev_err(cd
->dev
, "failed get ic info data, %d\n", error
);
390 /* check whether the data is valid (ex. bus default values) */
391 if (goodix_berlin_is_dummy_data(cd
, afe_data
, length
)) {
392 dev_err(cd
->dev
, "fw info data invalid\n");
396 if (!goodix_berlin_checksum_valid(afe_data
, length
)) {
397 dev_err(cd
->dev
, "fw info checksum error\n");
401 error
= goodix_berlin_parse_ic_info(cd
, afe_data
, length
);
405 /* check some key info */
406 if (!cd
->touch_data_addr
) {
407 dev_err(cd
->dev
, "touch_data_addr is null\n");
414 static int goodix_berlin_get_remaining_contacts(struct goodix_berlin_core
*cd
,
417 size_t offset
= 2 * GOODIX_BERLIN_TOUCH_SIZE
+
418 GOODIX_BERLIN_CHECKSUM_SIZE
;
419 u32 addr
= cd
->touch_data_addr
+ GOODIX_BERLIN_HEADER_SIZE
+ offset
;
422 error
= regmap_raw_read(cd
->regmap
, addr
,
423 &cd
->event
.data
[offset
],
424 (n
- 2) * GOODIX_BERLIN_TOUCH_SIZE
);
426 dev_err_ratelimited(cd
->dev
, "failed to get touch data, %d\n",
434 static void goodix_berlin_report_state(struct goodix_berlin_core
*cd
, int n
)
436 struct goodix_berlin_touch
*touch_data
=
437 (struct goodix_berlin_touch
*)cd
->event
.data
;
438 struct goodix_berlin_touch
*t
;
442 for (i
= 0; i
< n
; i
++) {
445 type
= FIELD_GET(GOODIX_BERLIN_POINT_TYPE_MASK
, t
->status
);
446 if (type
== GOODIX_BERLIN_POINT_TYPE_STYLUS
||
447 type
== GOODIX_BERLIN_POINT_TYPE_STYLUS_HOVER
) {
448 dev_warn_once(cd
->dev
, "Stylus event type not handled\n");
452 id
= FIELD_GET(GOODIX_BERLIN_TOUCH_ID_MASK
, t
->status
);
453 if (id
>= GOODIX_BERLIN_MAX_TOUCH
) {
454 dev_warn_ratelimited(cd
->dev
, "invalid finger id %d\n", id
);
458 input_mt_slot(cd
->input_dev
, id
);
459 input_mt_report_slot_state(cd
->input_dev
, MT_TOOL_FINGER
, true);
461 touchscreen_report_pos(cd
->input_dev
, &cd
->props
,
462 __le16_to_cpu(t
->x
), __le16_to_cpu(t
->y
),
464 input_report_abs(cd
->input_dev
, ABS_MT_TOUCH_MAJOR
,
465 __le16_to_cpu(t
->w
));
468 input_mt_sync_frame(cd
->input_dev
);
469 input_sync(cd
->input_dev
);
472 static void goodix_berlin_touch_handler(struct goodix_berlin_core
*cd
)
477 touch_num
= FIELD_GET(GOODIX_BERLIN_TOUCH_COUNT_MASK
,
478 cd
->event
.hdr
.request_type
);
479 if (touch_num
> GOODIX_BERLIN_MAX_TOUCH
) {
480 dev_warn(cd
->dev
, "invalid touch num %d\n", touch_num
);
485 /* read additional contact data if more than 2 touch events */
486 error
= goodix_berlin_get_remaining_contacts(cd
, touch_num
);
492 int len
= touch_num
* GOODIX_BERLIN_TOUCH_SIZE
+
493 GOODIX_BERLIN_CHECKSUM_SIZE
;
494 if (!goodix_berlin_checksum_valid(cd
->event
.data
, len
)) {
495 dev_err(cd
->dev
, "touch data checksum error: %*ph\n",
496 len
, cd
->event
.data
);
501 goodix_berlin_report_state(cd
, touch_num
);
504 static int goodix_berlin_request_handle_reset(struct goodix_berlin_core
*cd
)
506 gpiod_set_value_cansleep(cd
->reset_gpio
, 1);
507 usleep_range(2000, 2100);
508 gpiod_set_value_cansleep(cd
->reset_gpio
, 0);
510 msleep(GOODIX_BERLIN_NORMAL_RESET_DELAY_MS
);
515 static irqreturn_t
goodix_berlin_irq(int irq
, void *data
)
517 struct goodix_berlin_core
*cd
= data
;
521 * First, read buffer with space for 2 touch events:
522 * - GOODIX_BERLIN_HEADER_SIZE = 8 bytes
523 * - GOODIX_BERLIN_TOUCH_SIZE * 2 = 16 bytes
524 * - GOODIX_BERLIN_CHECKLSUM_SIZE = 2 bytes
525 * For a total of 26 bytes.
527 * If only a single finger is reported, we will read 8 bytes more than
529 * - bytes 0-7: Header (GOODIX_BERLIN_HEADER_SIZE)
530 * - bytes 8-15: Finger 0 Data
531 * - bytes 24-25: Checksum
532 * - bytes 18-25: Unused 8 bytes
534 * If 2 fingers are reported, we would have read the exact needed
535 * amount of data and checksum would be at the end of the buffer:
536 * - bytes 0-7: Header (GOODIX_BERLIN_HEADER_SIZE)
537 * - bytes 8-15: Finger 0 Bytes 0-7
538 * - bytes 16-23: Finger 1 Bytes 0-7
539 * - bytes 24-25: Checksum
541 * If more than 2 fingers were reported, the "Checksum" bytes would
542 * in fact contain part of the next finger data, and then
543 * goodix_berlin_get_remaining_contacts() would complete the buffer
544 * with the missing bytes, including the trailing checksum.
545 * For example, if 3 fingers are reported, then we would do:
547 * - bytes 0-7: Header (GOODIX_BERLIN_HEADER_SIZE)
548 * - bytes 8-15: Finger 0 Bytes 0-7
549 * - bytes 16-23: Finger 1 Bytes 0-7
550 * - bytes 24-25: Finger 2 Bytes 0-1
551 * Read 2 (with length of (3 - 2) * 8 = 8 bytes):
552 * - bytes 26-31: Finger 2 Bytes 2-7
553 * - bytes 32-33: Checksum
555 error
= regmap_raw_read(cd
->regmap
, cd
->touch_data_addr
,
557 GOODIX_BERLIN_HEADER_SIZE
+
558 2 * GOODIX_BERLIN_TOUCH_SIZE
+
559 GOODIX_BERLIN_CHECKSUM_SIZE
);
561 dev_warn_ratelimited(cd
->dev
,
562 "failed get event head data: %d\n", error
);
566 if (cd
->event
.hdr
.status
== 0)
569 if (!goodix_berlin_checksum_valid((u8
*)&cd
->event
.hdr
,
570 GOODIX_BERLIN_HEADER_SIZE
)) {
571 dev_warn_ratelimited(cd
->dev
,
572 "touch head checksum error: %*ph\n",
573 (int)GOODIX_BERLIN_HEADER_SIZE
,
578 if (cd
->event
.hdr
.status
& GOODIX_BERLIN_TOUCH_EVENT
)
579 goodix_berlin_touch_handler(cd
);
581 if (cd
->event
.hdr
.status
& GOODIX_BERLIN_REQUEST_EVENT
) {
582 switch (cd
->event
.hdr
.request_type
) {
583 case GOODIX_BERLIN_REQUEST_CODE_RESET
:
585 goodix_berlin_request_handle_reset(cd
);
589 dev_warn(cd
->dev
, "unsupported request code 0x%x\n",
590 cd
->event
.hdr
.request_type
);
596 /* Clear up status field */
597 regmap_write(cd
->regmap
, cd
->touch_data_addr
, 0);
603 static int goodix_berlin_input_dev_config(struct goodix_berlin_core
*cd
,
604 const struct input_id
*id
)
606 struct input_dev
*input_dev
;
609 input_dev
= devm_input_allocate_device(cd
->dev
);
613 cd
->input_dev
= input_dev
;
614 input_set_drvdata(input_dev
, cd
);
616 input_dev
->name
= "Goodix Berlin Capacitive TouchScreen";
617 input_dev
->phys
= "input/ts";
621 input_set_abs_params(cd
->input_dev
, ABS_MT_POSITION_X
,
622 0, SZ_64K
- 1, 0, 0);
623 input_set_abs_params(cd
->input_dev
, ABS_MT_POSITION_Y
,
624 0, SZ_64K
- 1, 0, 0);
625 input_set_abs_params(cd
->input_dev
, ABS_MT_TOUCH_MAJOR
, 0, 255, 0, 0);
627 touchscreen_parse_properties(cd
->input_dev
, true, &cd
->props
);
629 error
= input_mt_init_slots(cd
->input_dev
, GOODIX_BERLIN_MAX_TOUCH
,
630 INPUT_MT_DIRECT
| INPUT_MT_DROP_UNUSED
);
634 error
= input_register_device(cd
->input_dev
);
641 static int goodix_berlin_suspend(struct device
*dev
)
643 struct goodix_berlin_core
*cd
= dev_get_drvdata(dev
);
645 disable_irq(cd
->irq
);
646 goodix_berlin_power_off(cd
);
651 static int goodix_berlin_resume(struct device
*dev
)
653 struct goodix_berlin_core
*cd
= dev_get_drvdata(dev
);
656 error
= goodix_berlin_power_on(cd
);
665 EXPORT_GPL_SIMPLE_DEV_PM_OPS(goodix_berlin_pm_ops
,
666 goodix_berlin_suspend
, goodix_berlin_resume
);
668 static void goodix_berlin_power_off_act(void *data
)
670 struct goodix_berlin_core
*cd
= data
;
672 goodix_berlin_power_off(cd
);
675 static ssize_t
registers_read(struct file
*filp
, struct kobject
*kobj
,
676 struct bin_attribute
*bin_attr
,
677 char *buf
, loff_t off
, size_t count
)
679 struct device
*dev
= kobj_to_dev(kobj
);
680 struct goodix_berlin_core
*cd
= dev_get_drvdata(dev
);
683 error
= regmap_raw_read(cd
->regmap
, off
, buf
, count
);
685 return error
? error
: count
;
688 static ssize_t
registers_write(struct file
*filp
, struct kobject
*kobj
,
689 struct bin_attribute
*bin_attr
,
690 char *buf
, loff_t off
, size_t count
)
692 struct device
*dev
= kobj_to_dev(kobj
);
693 struct goodix_berlin_core
*cd
= dev_get_drvdata(dev
);
696 error
= regmap_raw_write(cd
->regmap
, off
, buf
, count
);
698 return error
? error
: count
;
701 static BIN_ATTR_ADMIN_RW(registers
, 0);
703 static struct bin_attribute
*goodix_berlin_bin_attrs
[] = {
708 static const struct attribute_group goodix_berlin_attr_group
= {
709 .bin_attrs
= goodix_berlin_bin_attrs
,
712 const struct attribute_group
*goodix_berlin_groups
[] = {
713 &goodix_berlin_attr_group
,
716 EXPORT_SYMBOL_GPL(goodix_berlin_groups
);
718 int goodix_berlin_probe(struct device
*dev
, int irq
, const struct input_id
*id
,
719 struct regmap
*regmap
)
721 struct goodix_berlin_core
*cd
;
725 dev_err(dev
, "Missing interrupt number\n");
729 cd
= devm_kzalloc(dev
, sizeof(*cd
), GFP_KERNEL
);
737 cd
->reset_gpio
= devm_gpiod_get_optional(dev
, "reset", GPIOD_OUT_HIGH
);
738 if (IS_ERR(cd
->reset_gpio
))
739 return dev_err_probe(dev
, PTR_ERR(cd
->reset_gpio
),
740 "Failed to request reset gpio\n");
742 cd
->avdd
= devm_regulator_get(dev
, "avdd");
743 if (IS_ERR(cd
->avdd
))
744 return dev_err_probe(dev
, PTR_ERR(cd
->avdd
),
745 "Failed to request avdd regulator\n");
747 cd
->iovdd
= devm_regulator_get(dev
, "iovdd");
748 if (IS_ERR(cd
->iovdd
))
749 return dev_err_probe(dev
, PTR_ERR(cd
->iovdd
),
750 "Failed to request iovdd regulator\n");
752 error
= goodix_berlin_power_on(cd
);
754 dev_err(dev
, "failed power on");
758 error
= devm_add_action_or_reset(dev
, goodix_berlin_power_off_act
, cd
);
762 error
= goodix_berlin_read_version(cd
);
764 dev_err(dev
, "failed to get version info");
768 error
= goodix_berlin_get_ic_info(cd
);
770 dev_err(dev
, "invalid ic info, abort");
774 error
= goodix_berlin_input_dev_config(cd
, id
);
776 dev_err(dev
, "failed set input device");
780 error
= devm_request_threaded_irq(dev
, cd
->irq
, NULL
, goodix_berlin_irq
,
781 IRQF_ONESHOT
, "goodix-berlin", cd
);
783 dev_err(dev
, "request threaded irq failed: %d\n", error
);
787 dev_set_drvdata(dev
, cd
);
789 dev_dbg(dev
, "Goodix Berlin %s Touchscreen Controller",
790 cd
->fw_version
.patch_pid
);
794 EXPORT_SYMBOL_GPL(goodix_berlin_probe
);
796 MODULE_LICENSE("GPL");
797 MODULE_DESCRIPTION("Goodix Berlin Core Touchscreen driver");
798 MODULE_AUTHOR("Neil Armstrong <neil.armstrong@linaro.org>");