#include <linux/bitfield.h>
#include <linux/gpio/consumer.h>
#include <linux/input.h>
#include <linux/input/mt.h>
#include <linux/input/touchscreen.h>
#include <linux/regmap.h>
#include <linux/regulator/consumer.h>
#include <linux/sizes.h>
#include <linux/unaligned.h>
#include "goodix_berlin.h"
#define GOODIX_BERLIN_MAX_TOUCH …
#define GOODIX_BERLIN_NORMAL_RESET_DELAY_MS …
#define GOODIX_BERLIN_TOUCH_EVENT …
#define GOODIX_BERLIN_REQUEST_EVENT …
#define GOODIX_BERLIN_TOUCH_COUNT_MASK …
#define GOODIX_BERLIN_REQUEST_CODE_RESET …
#define GOODIX_BERLIN_POINT_TYPE_MASK …
#define GOODIX_BERLIN_POINT_TYPE_STYLUS_HOVER …
#define GOODIX_BERLIN_POINT_TYPE_STYLUS …
#define GOODIX_BERLIN_TOUCH_ID_MASK …
#define GOODIX_BERLIN_DEV_CONFIRM_VAL …
#define GOODIX_BERLIN_BOOTOPTION_ADDR …
#define GOODIX_BERLIN_FW_VERSION_INFO_ADDR …
#define GOODIX_BERLIN_IC_INFO_MAX_LEN …
#define GOODIX_BERLIN_IC_INFO_ADDR …
#define GOODIX_BERLIN_CHECKSUM_SIZE …
struct goodix_berlin_fw_version { … };
struct goodix_berlin_ic_info_version { … } __packed;
struct goodix_berlin_ic_info_feature { … } __packed;
struct goodix_berlin_ic_info_misc { … } __packed;
struct goodix_berlin_touch { … };
#define GOODIX_BERLIN_TOUCH_SIZE …
struct goodix_berlin_header { … };
#define GOODIX_BERLIN_HEADER_SIZE …
struct goodix_berlin_event { … };
struct goodix_berlin_core { … };
static bool goodix_berlin_checksum_valid(const u8 *data, int size)
{ … }
static bool goodix_berlin_is_dummy_data(struct goodix_berlin_core *cd,
const u8 *data, int size)
{ … }
static int goodix_berlin_dev_confirm(struct goodix_berlin_core *cd)
{ … }
static int goodix_berlin_power_on(struct goodix_berlin_core *cd)
{ … }
static void goodix_berlin_power_off(struct goodix_berlin_core *cd)
{ … }
static int goodix_berlin_read_version(struct goodix_berlin_core *cd)
{ … }
static int goodix_berlin_parse_ic_info(struct goodix_berlin_core *cd,
const u8 *data, u16 length)
{ … }
static int goodix_berlin_get_ic_info(struct goodix_berlin_core *cd)
{ … }
static int goodix_berlin_get_remaining_contacts(struct goodix_berlin_core *cd,
int n)
{ … }
static void goodix_berlin_report_state(struct goodix_berlin_core *cd, int n)
{ … }
static void goodix_berlin_touch_handler(struct goodix_berlin_core *cd)
{ … }
static int goodix_berlin_request_handle_reset(struct goodix_berlin_core *cd)
{ … }
static irqreturn_t goodix_berlin_irq(int irq, void *data)
{ … }
static int goodix_berlin_input_dev_config(struct goodix_berlin_core *cd,
const struct input_id *id)
{ … }
static int goodix_berlin_suspend(struct device *dev)
{ … }
static int goodix_berlin_resume(struct device *dev)
{ … }
EXPORT_GPL_SIMPLE_DEV_PM_OPS(…);
static void goodix_berlin_power_off_act(void *data)
{ … }
static ssize_t registers_read(struct file *filp, struct kobject *kobj,
struct bin_attribute *bin_attr,
char *buf, loff_t off, size_t count)
{ … }
static ssize_t registers_write(struct file *filp, struct kobject *kobj,
struct bin_attribute *bin_attr,
char *buf, loff_t off, size_t count)
{ … }
static BIN_ATTR_ADMIN_RW(registers, 0);
static struct bin_attribute *goodix_berlin_bin_attrs[] = …;
static const struct attribute_group goodix_berlin_attr_group = …;
const struct attribute_group *goodix_berlin_groups[] = …;
EXPORT_SYMBOL_GPL(…);
int goodix_berlin_probe(struct device *dev, int irq, const struct input_id *id,
struct regmap *regmap)
{ … }
EXPORT_SYMBOL_GPL(…);
MODULE_LICENSE(…) …;
MODULE_DESCRIPTION(…) …;
MODULE_AUTHOR(…) …;