Documentation/driver-api/driver-model/device.rst

Source file repositories/reference/linux-study-clean/Documentation/driver-api/driver-model/device.rst

File Facts

System
Linux kernel
Corpus path
Documentation/driver-api/driver-model/device.rst
Extension
.rst
Size
3658 bytes
Lines
121
Domain
Support Tooling And Documentation
Bucket
Documentation
Inferred role
Support Tooling And Documentation: documentation
Status
atlas-only

Why This File Exists

Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.

Dependency Surface

Detected Declarations

Annotated Snippet

struct device_attribute {
	struct attribute	attr;
	ssize_t (*show)(struct device *dev, struct device_attribute *attr,
			char *buf);
	ssize_t (*store)(struct device *dev, struct device_attribute *attr,
			 const char *buf, size_t count);
  };

Attributes of devices can be exported by a device driver through sysfs.

Please see Documentation/filesystems/sysfs.rst for more information
on how sysfs works.

As explained in Documentation/core-api/kobject.rst, device attributes must be
created before the KOBJ_ADD uevent is generated. The only way to realize
that is by defining an attribute group.

Attributes are declared using a macro called DEVICE_ATTR::

  #define DEVICE_ATTR(name,mode,show,store)

Example:::

  static DEVICE_ATTR(type, 0444, type_show, NULL);
  static DEVICE_ATTR(power, 0644, power_show, power_store);

Helper macros are available for common values of mode, so the above examples
can be simplified to:::

  static DEVICE_ATTR_RO(type);
  static DEVICE_ATTR_RW(power);

This declares two structures of type struct device_attribute with respective
names 'dev_attr_type' and 'dev_attr_power'. These two attributes can be
organized as follows into a group::

  static struct attribute *dev_attrs[] = {
	&dev_attr_type.attr,
	&dev_attr_power.attr,
	NULL,
  };

  static struct attribute_group dev_group = {
	.attrs = dev_attrs,
  };

  static const struct attribute_group *dev_groups[] = {
	&dev_group,
	NULL,
  };

A helper macro is available for the common case of a single group, so the
above two structures can be declared using:::

  ATTRIBUTE_GROUPS(dev);

This array of groups can then be associated with a device by setting the
group pointer in struct device before device_register() is invoked::

        dev->groups = dev_groups;
        device_register(dev);

The device_register() function will use the 'groups' pointer to create the
device attributes and the device_unregister() function will use this pointer
to remove the device attributes.

Word of warning:  While the kernel allows device_create_file() and
device_remove_file() to be called on a device at any time, userspace has
strict expectations on when attributes get created.  When a new device is
registered in the kernel, a uevent is generated to notify userspace (like

Annotation

Implementation Notes