#include <linux/errno.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/input/mt.h>
#include <linux/serio.h>
#include <linux/ctype.h>
#include <linux/delay.h>
#define DRIVER_DESC …
MODULE_AUTHOR(…) …;
MODULE_DESCRIPTION(…);
MODULE_LICENSE(…) …;
#define W8001_MAX_PHYS …
#define W8001_MAX_LENGTH …
#define W8001_LEAD_MASK …
#define W8001_LEAD_BYTE …
#define W8001_TAB_MASK …
#define W8001_TAB_BYTE …
#define W8001_TOUCH_MASK …
#define W8001_TOUCH_BYTE …
#define W8001_QUERY_PACKET …
#define W8001_CMD_STOP …
#define W8001_CMD_START …
#define W8001_CMD_QUERY …
#define W8001_CMD_TOUCHQUERY …
#define W8001_PKTLEN_TOUCH93 …
#define W8001_PKTLEN_TOUCH9A …
#define W8001_PKTLEN_TPCPEN …
#define W8001_PKTLEN_TPCCTL …
#define W8001_PKTLEN_TOUCH2FG …
#define W8001_PEN_RESOLUTION …
#define W8001_TOUCH_RESOLUTION …
struct w8001_coord { … };
struct w8001_touch_query { … };
struct w8001 { … };
static void parse_pen_data(u8 *data, struct w8001_coord *coord)
{ … }
static void parse_single_touch(u8 *data, struct w8001_coord *coord)
{ … }
static void scale_touch_coordinates(struct w8001 *w8001,
unsigned int *x, unsigned int *y)
{ … }
static void parse_multi_touch(struct w8001 *w8001)
{ … }
static void parse_touchquery(u8 *data, struct w8001_touch_query *query)
{ … }
static void report_pen_events(struct w8001 *w8001, struct w8001_coord *coord)
{ … }
static void report_single_touch(struct w8001 *w8001, struct w8001_coord *coord)
{ … }
static irqreturn_t w8001_interrupt(struct serio *serio,
unsigned char data, unsigned int flags)
{ … }
static int w8001_command(struct w8001 *w8001, unsigned char command,
bool wait_response)
{ … }
static int w8001_open(struct input_dev *dev)
{ … }
static void w8001_close(struct input_dev *dev)
{ … }
static int w8001_detect(struct w8001 *w8001)
{ … }
static int w8001_setup_pen(struct w8001 *w8001, char *basename,
size_t basename_sz)
{ … }
static int w8001_setup_touch(struct w8001 *w8001, char *basename,
size_t basename_sz)
{ … }
static void w8001_set_devdata(struct input_dev *dev, struct w8001 *w8001,
struct serio *serio)
{ … }
static void w8001_disconnect(struct serio *serio)
{ … }
static int w8001_connect(struct serio *serio, struct serio_driver *drv)
{ … }
static const struct serio_device_id w8001_serio_ids[] = …;
MODULE_DEVICE_TABLE(serio, w8001_serio_ids);
static struct serio_driver w8001_drv = …;
module_serio_driver(…) …;