drivers/input/mouse/elan_i2c_core.c

Source file repositories/reference/linux-study-clean/drivers/input/mouse/elan_i2c_core.c

File Facts

System
Linux kernel
Corpus path
drivers/input/mouse/elan_i2c_core.c
Extension
.c
Size
36135 bytes
Lines
1446
Domain
Driver Families
Bucket
drivers/input
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

struct elan_tp_data {
	struct i2c_client	*client;
	struct input_dev	*input;
	struct input_dev	*tp_input; /* trackpoint input node */
	struct regulator	*vcc;

	const struct elan_transport_ops *ops;

	/* for fw update */
	struct completion	fw_completion;
	bool			in_fw_update;

	struct mutex		sysfs_mutex;

	unsigned int		max_x;
	unsigned int		max_y;
	unsigned int		width_x;
	unsigned int		width_y;
	unsigned int		x_res;
	unsigned int		y_res;

	u8			pattern;
	u16			product_id;
	u8			fw_version;
	u8			sm_version;
	u8			iap_version;
	u16			fw_checksum;
	unsigned int		report_features;
	unsigned int		report_len;
	int			pressure_adjustment;
	u8			mode;
	u16			ic_type;
	u16			fw_validpage_count;
	u16			fw_page_size;
	u32			fw_signature_address;

	u8			min_baseline;
	u8			max_baseline;
	bool			baseline_ready;
	u8			clickpad;
	bool			middle_button;

	u32			quirks;		/* Various quirks */
};

static u32 elan_i2c_lookup_quirks(u16 ic_type, u16 product_id)
{
	static const struct {
		u16 ic_type;
		u16 product_id;
		u32 quirks;
	} elan_i2c_quirks[] = {
		{ 0x0D, ETP_PRODUCT_ID_DELBIN, ETP_QUIRK_QUICK_WAKEUP },
		{ 0x0D, ETP_PRODUCT_ID_WHITEBOX, ETP_QUIRK_QUICK_WAKEUP },
		{ 0x10, ETP_PRODUCT_ID_VOXEL, ETP_QUIRK_QUICK_WAKEUP },
		{ 0x14, ETP_PRODUCT_ID_MAGPIE, ETP_QUIRK_QUICK_WAKEUP },
		{ 0x14, ETP_PRODUCT_ID_BOBBA, ETP_QUIRK_QUICK_WAKEUP },
	};
	u32 quirks = 0;
	int i;

	for (i = 0; i < ARRAY_SIZE(elan_i2c_quirks); i++) {
		if (elan_i2c_quirks[i].ic_type == ic_type &&
		    elan_i2c_quirks[i].product_id == product_id) {
			quirks = elan_i2c_quirks[i].quirks;
		}
	}

	if (ic_type >= 0x0D && product_id >= 0x123)
		quirks |= ETP_QUIRK_QUICK_WAKEUP;

	return quirks;
}

static int elan_get_fwinfo(u16 ic_type, u8 iap_version, u16 *validpage_count,
			   u32 *signature_address, u16 *page_size)
{
	switch (ic_type) {
	case 0x00:
	case 0x06:
	case 0x08:
		*validpage_count = 512;
		break;
	case 0x03:
	case 0x07:
	case 0x09:
	case 0x0A:
	case 0x0B:
	case 0x0C:
		*validpage_count = 768;

Annotation

Implementation Notes