#include <linux/delay.h>
#include <linux/sched.h>
#include <linux/slab.h>
#include <linux/module.h>
#include <linux/interrupt.h>
#include <linux/input.h>
#include <linux/serio.h>
#include <linux/workqueue.h>
#define DRIVER_DESC …
MODULE_AUTHOR(…) …;
MODULE_DESCRIPTION(…);
MODULE_LICENSE(…) …;
static unsigned char sunkbd_keycode[128] = …;
#define SUNKBD_CMD_RESET …
#define SUNKBD_CMD_BELLON …
#define SUNKBD_CMD_BELLOFF …
#define SUNKBD_CMD_CLICK …
#define SUNKBD_CMD_NOCLICK …
#define SUNKBD_CMD_SETLED …
#define SUNKBD_CMD_LAYOUT …
#define SUNKBD_RET_RESET …
#define SUNKBD_RET_ALLUP …
#define SUNKBD_RET_LAYOUT …
#define SUNKBD_LAYOUT_5_MASK …
#define SUNKBD_RELEASE …
#define SUNKBD_KEY …
struct sunkbd { … };
static irqreturn_t sunkbd_interrupt(struct serio *serio,
unsigned char data, unsigned int flags)
{ … }
static int sunkbd_event(struct input_dev *dev,
unsigned int type, unsigned int code, int value)
{ … }
static int sunkbd_initialize(struct sunkbd *sunkbd)
{ … }
static void sunkbd_set_leds_beeps(struct sunkbd *sunkbd)
{ … }
static void sunkbd_reinit(struct work_struct *work)
{ … }
static void sunkbd_enable(struct sunkbd *sunkbd, bool enable)
{ … }
static int sunkbd_connect(struct serio *serio, struct serio_driver *drv)
{ … }
static void sunkbd_disconnect(struct serio *serio)
{ … }
static const struct serio_device_id sunkbd_serio_ids[] = …;
MODULE_DEVICE_TABLE(serio, sunkbd_serio_ids);
static struct serio_driver sunkbd_drv = …;
module_serio_driver(…) …;