drivers/input/mouse/elan_i2c_i2c.c

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

File Facts

System
Linux kernel
Corpus path
drivers/input/mouse/elan_i2c_i2c.c
Extension
.c
Size
18024 bytes
Lines
778
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

if (error) {
			dev_err(&client->dev, "failed to get ic type: %d\n",
				error);
			return error;
		}
		*ic_type = be16_to_cpup((__be16 *)val);

		error = elan_i2c_read_cmd(client, ETP_I2C_NSM_VERSION_CMD,
					  val);
		if (error) {
			dev_err(&client->dev, "failed to get SM version: %d\n",
				error);
			return error;
		}
		*version = val[1];
		*clickpad = val[0] & 0x10;
	} else {
		error = elan_i2c_read_cmd(client, ETP_I2C_OSM_VERSION_CMD, val);
		if (error) {
			dev_err(&client->dev, "failed to get SM version: %d\n",
				error);
			return error;
		}
		*version = val[0];

		error = elan_i2c_read_cmd(client, ETP_I2C_IC_TYPE_P0_CMD, val);
		if (error) {
			dev_err(&client->dev, "failed to get ic type: %d\n",
				error);
			return error;
		}
		*ic_type = val[0];

		error = elan_i2c_read_cmd(client, ETP_I2C_NSM_VERSION_CMD,
					  val);
		if (error) {
			dev_err(&client->dev, "failed to get SM version: %d\n",
				error);
			return error;
		}
		*clickpad = val[0] & 0x10;
	}

	return 0;
}

static int elan_i2c_get_product_id(struct i2c_client *client, u16 *id)
{
	int error;
	u8 val[3];

	error = elan_i2c_read_cmd(client, ETP_I2C_UNIQUEID_CMD, val);
	if (error) {
		dev_err(&client->dev, "failed to get product ID: %d\n", error);
		return error;
	}

	*id = le16_to_cpup((__le16 *)val);
	return 0;
}

static int elan_i2c_get_checksum(struct i2c_client *client,
				 bool iap, u16 *csum)
{
	int error;
	u8 val[3];

	error = elan_i2c_read_cmd(client,
				  iap ? ETP_I2C_IAP_CHECKSUM_CMD :
					ETP_I2C_FW_CHECKSUM_CMD,
				  val);
	if (error) {
		dev_err(&client->dev, "failed to get %s checksum: %d\n",
			iap ? "IAP" : "FW", error);
		return error;
	}

	*csum = le16_to_cpup((__le16 *)val);
	return 0;
}

static int elan_i2c_get_max(struct i2c_client *client,
			    unsigned int *max_x, unsigned int *max_y)
{
	int error;
	u8 val[3];

	error = elan_i2c_read_cmd(client, ETP_I2C_MAX_X_AXIS_CMD, val);
	if (error) {
		dev_err(&client->dev, "failed to get X dimension: %d\n", error);

Annotation

Implementation Notes