#include <linux/acpi.h>
#include <linux/delay.h>
#include <linux/dmi.h>
#include <linux/gpio/consumer.h>
#include <linux/gpio/machine.h>
#include <linux/hid.h>
#include <linux/i2c.h>
#include <linux/input.h>
#include <linux/irq.h>
#include <linux/irqdomain.h>
#include <linux/mod_devicetable.h>
#include <linux/moduleparam.h>
#include <linux/module.h>
#include <linux/pm.h>
#include <linux/workqueue.h>
#include <asm/unaligned.h>
static bool fnlock;
module_param(fnlock, bool, 0644);
MODULE_PARM_DESC(…) …;
#define TF103C_DOCK_DEV_NAME …
#define TF103C_DOCK_HPD_DEBOUNCE …
#define TF103C_DOCK_TP_ADDR …
#define TF103C_DOCK_KBD_ADDR …
#define TF103C_DOCK_KBD_DATA_REG …
#define TF103C_DOCK_KBD_DATA_MIN_LENGTH …
#define TF103C_DOCK_KBD_DATA_MAX_LENGTH …
#define TF103C_DOCK_KBD_DATA_MODIFIERS …
#define TF103C_DOCK_KBD_DATA_KEYS …
#define TF103C_DOCK_KBD_CMD_REG …
#define TF103C_DOCK_KBD_CMD_ENABLE …
#define TF103C_DOCK_INTR_ADDR …
#define TF103C_DOCK_INTR_DATA_REG …
#define TF103C_DOCK_INTR_DATA1_OBF_MASK …
#define TF103C_DOCK_INTR_DATA1_KEY_MASK …
#define TF103C_DOCK_INTR_DATA1_KBC_MASK …
#define TF103C_DOCK_INTR_DATA1_AUX_MASK …
#define TF103C_DOCK_INTR_DATA1_SCI_MASK …
#define TF103C_DOCK_INTR_DATA1_SMI_MASK …
#define TF103C_DOCK_INTR_DATA1_OOB_VALUE …
#define TF103C_DOCK_INTR_DATA2_OOB_VALUE …
#define TF103C_DOCK_SMI_AC_EVENT …
#define TF103C_DOCK_SMI_HANDSHAKING …
#define TF103C_DOCK_SMI_EC_WAKEUP …
#define TF103C_DOCK_SMI_BOOTBLOCK_RESET …
#define TF103C_DOCK_SMI_WATCHDOG_RESET …
#define TF103C_DOCK_SMI_ADAPTER_CHANGE …
#define TF103C_DOCK_SMI_DOCK_INSERT …
#define TF103C_DOCK_SMI_DOCK_REMOVE …
#define TF103C_DOCK_SMI_PAD_BL_CHANGE …
#define TF103C_DOCK_SMI_HID_STATUS_CHANGED …
#define TF103C_DOCK_SMI_HID_WAKEUP …
#define TF103C_DOCK_SMI_S3 …
#define TF103C_DOCK_SMI_S5 …
#define TF103C_DOCK_SMI_NOTIFY_SHUTDOWN …
#define TF103C_DOCK_SMI_RESUME …
#define TF103C_DOCK_EC_ADDR …
#define TF103C_DOCK_EC_CMD_REG …
#define TF103C_DOCK_EC_CMD_LEN …
enum { … };
struct tf103c_dock_data { … };
static struct gpiod_lookup_table tf103c_dock_gpios = …;
static const u8 tf103c_dock_enable_cmd[9] = …;
static const u8 tf103c_dock_usb_enable_cmd[9] = …;
static const u8 tf103c_dock_suspend_cmd[9] = …;
static u8 tf103c_dock_kbd_hid_desc[] = …;
static int tf103c_dock_kbd_read(struct tf103c_dock_data *dock)
{ … }
static void tf103c_dock_kbd_write(struct tf103c_dock_data *dock, u16 cmd)
{ … }
static int tf103c_dock_hid_parse(struct hid_device *hid)
{ … }
static int tf103c_dock_hid_start(struct hid_device *hid)
{ … }
static void tf103c_dock_hid_stop(struct hid_device *hid)
{ … }
static int tf103c_dock_hid_open(struct hid_device *hid)
{ … }
static void tf103c_dock_hid_close(struct hid_device *hid)
{ … }
static int tf103c_dock_hid_raw_request(struct hid_device *hid, u8 reportnum,
u8 *buf, size_t len, u8 rtype, int reqtype)
{ … }
static const struct hid_ll_driver tf103c_dock_hid_ll_driver = …;
static const int tf103c_dock_toprow_codes[13][2] = …;
static void tf103c_dock_report_toprow_kbd_hook(struct tf103c_dock_data *dock)
{ … }
static void tf103c_dock_toprow_press(struct tf103c_dock_data *dock, int key_code)
{ … }
static void tf103c_dock_toprow_release(struct tf103c_dock_data *dock, int key_code)
{ … }
static void tf103c_dock_toprow_event(struct tf103c_dock_data *dock,
int toprow_index, int *last_press)
{ … }
static void tf103c_dock_kbd_interrupt(struct tf103c_dock_data *dock)
{ … }
static const struct property_entry tf103c_dock_touchpad_props[] = …;
static const struct software_node tf103c_dock_touchpad_sw_node = …;
static void tf103c_dock_enable_touchpad(struct tf103c_dock_data *dock)
{ … }
static void tf103c_dock_disable_touchpad(struct tf103c_dock_data *dock)
{ … }
static void tf103c_dock_ec_cmd(struct tf103c_dock_data *dock, const u8 *cmd)
{ … }
static void tf103c_dock_sci(struct tf103c_dock_data *dock, u8 val)
{ … }
static void tf103c_dock_smi(struct tf103c_dock_data *dock, u8 val)
{ … }
static irqreturn_t tf103c_dock_irq(int irq, void *data)
{ … }
static void tf103c_dock_enable(struct tf103c_dock_data *dock)
{ … }
static void tf103c_dock_disable(struct tf103c_dock_data *dock)
{ … }
static void tf103c_dock_hpd_work(struct work_struct *work)
{ … }
static irqreturn_t tf103c_dock_hpd_irq(int irq, void *data)
{ … }
static void tf103c_dock_start_hpd(struct tf103c_dock_data *dock)
{ … }
static void tf103c_dock_stop_hpd(struct tf103c_dock_data *dock)
{ … }
static const struct dmi_system_id tf103c_dock_dmi_ids[] = …;
static void tf103c_dock_non_devm_cleanup(void *data)
{ … }
static int tf103c_dock_probe(struct i2c_client *client)
{ … }
static void tf103c_dock_remove(struct i2c_client *client)
{ … }
static int __maybe_unused tf103c_dock_suspend(struct device *dev)
{ … }
static int __maybe_unused tf103c_dock_resume(struct device *dev)
{ … }
static SIMPLE_DEV_PM_OPS(tf103c_dock_pm_ops, tf103c_dock_suspend, tf103c_dock_resume);
static const struct acpi_device_id tf103c_dock_acpi_match[] = …;
MODULE_DEVICE_TABLE(acpi, tf103c_dock_acpi_match);
static struct i2c_driver tf103c_dock_driver = …;
module_i2c_driver(…) …;
MODULE_AUTHOR(…) …;
MODULE_DESCRIPTION(…) …;
MODULE_LICENSE(…) …;