drivers/input/serio/serio.c

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

File Facts

System
Linux kernel
Corpus path
drivers/input/serio/serio.c
Extension
.c
Size
23625 bytes
Lines
1018
Domain
Driver Families
Bucket
drivers/input
Inferred role
Driver Families: operation-table or driver-model contract
Status
pattern 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 device_driver *drv;
	int error;

	scoped_cond_guard(mutex_intr, return -EINTR, &serio_mutex) {
		if (!strncmp(buf, "none", count)) {
			serio_disconnect_port(serio);
		} else if (!strncmp(buf, "reconnect", count)) {
			serio_reconnect_subtree(serio);
		} else if (!strncmp(buf, "rescan", count)) {
			serio_disconnect_port(serio);
			serio_find_driver(serio);
			serio_remove_duplicate_events(serio, SERIO_RESCAN_PORT);
		} else if ((drv = driver_find(buf, &serio_bus)) != NULL) {
			serio_disconnect_port(serio);
			error = serio_bind_driver(serio, to_serio_driver(drv));
			serio_remove_duplicate_events(serio, SERIO_RESCAN_PORT);
			if (error)
				return error;
		} else {
			return -EINVAL;
		}
	}

	return count;
}

static ssize_t serio_show_bind_mode(struct device *dev, struct device_attribute *attr, char *buf)
{
	struct serio *serio = to_serio_port(dev);
	return sprintf(buf, "%s\n", serio->manual_bind ? "manual" : "auto");
}

static ssize_t serio_set_bind_mode(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{
	struct serio *serio = to_serio_port(dev);
	int retval;

	retval = count;
	if (!strncmp(buf, "manual", count)) {
		serio->manual_bind = true;
	} else if (!strncmp(buf, "auto", count)) {
		serio->manual_bind = false;
	} else {
		retval = -EINVAL;
	}

	return retval;
}

static ssize_t firmware_id_show(struct device *dev, struct device_attribute *attr, char *buf)
{
	struct serio *serio = to_serio_port(dev);

	return sprintf(buf, "%s\n", serio->firmware_id);
}

static DEVICE_ATTR_RO(type);
static DEVICE_ATTR_RO(proto);
static DEVICE_ATTR_RO(id);
static DEVICE_ATTR_RO(extra);

static struct attribute *serio_device_id_attrs[] = {
	&dev_attr_type.attr,
	&dev_attr_proto.attr,
	&dev_attr_id.attr,
	&dev_attr_extra.attr,
	NULL
};

static const struct attribute_group serio_id_attr_group = {
	.name	= "id",
	.attrs	= serio_device_id_attrs,
};

static DEVICE_ATTR_RO(modalias);
static DEVICE_ATTR_WO(drvctl);
static DEVICE_ATTR(description, S_IRUGO, serio_show_description, NULL);
static DEVICE_ATTR(bind_mode, S_IWUSR | S_IRUGO, serio_show_bind_mode, serio_set_bind_mode);
static DEVICE_ATTR_RO(firmware_id);

static struct attribute *serio_device_attrs[] = {
	&dev_attr_modalias.attr,
	&dev_attr_description.attr,
	&dev_attr_drvctl.attr,
	&dev_attr_bind_mode.attr,
	&dev_attr_firmware_id.attr,
	NULL
};

static const struct attribute_group serio_device_attr_group = {

Annotation

Implementation Notes