drivers/hwmon/vexpress-hwmon.c
Source file repositories/reference/linux-study-clean/drivers/hwmon/vexpress-hwmon.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/hwmon/vexpress-hwmon.c- Extension
.c- Size
- 6653 bytes
- Lines
- 245
- Domain
- Driver Families
- Bucket
- drivers/hwmon
- 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.
- 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.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/device.hlinux/err.hlinux/hwmon.hlinux/hwmon-sysfs.hlinux/module.hlinux/of.hlinux/platform_device.hlinux/vexpress.h
Detected Declarations
struct vexpress_hwmon_datastruct vexpress_hwmon_typefunction vexpress_hwmon_label_showfunction vexpress_hwmon_u32_showfunction vexpress_hwmon_u64_showfunction vexpress_hwmon_attr_is_visiblefunction vexpress_hwmon_probe
Annotated Snippet
struct vexpress_hwmon_data {
struct device *hwmon_dev;
struct regmap *reg;
};
static ssize_t vexpress_hwmon_label_show(struct device *dev,
struct device_attribute *dev_attr, char *buffer)
{
const char *label = of_get_property(dev->of_node, "label", NULL);
return sysfs_emit(buffer, "%s\n", label);
}
static ssize_t vexpress_hwmon_u32_show(struct device *dev,
struct device_attribute *dev_attr, char *buffer)
{
struct vexpress_hwmon_data *data = dev_get_drvdata(dev);
int err;
u32 value;
err = regmap_read(data->reg, 0, &value);
if (err)
return err;
return sysfs_emit(buffer, "%u\n", value /
to_sensor_dev_attr(dev_attr)->index);
}
static ssize_t vexpress_hwmon_u64_show(struct device *dev,
struct device_attribute *dev_attr, char *buffer)
{
struct vexpress_hwmon_data *data = dev_get_drvdata(dev);
int err;
u32 value_hi, value_lo;
err = regmap_read(data->reg, 0, &value_lo);
if (err)
return err;
err = regmap_read(data->reg, 1, &value_hi);
if (err)
return err;
return sysfs_emit(buffer, "%llu\n",
div_u64(((u64)value_hi << 32) | value_lo,
to_sensor_dev_attr(dev_attr)->index));
}
static umode_t vexpress_hwmon_attr_is_visible(struct kobject *kobj,
struct attribute *attr, int index)
{
struct device *dev = kobj_to_dev(kobj);
struct device_attribute *dev_attr = container_of(attr,
struct device_attribute, attr);
if (dev_attr->show == vexpress_hwmon_label_show &&
!of_property_present(dev->of_node, "label"))
return 0;
return attr->mode;
}
struct vexpress_hwmon_type {
const char *name;
const struct attribute_group **attr_groups;
};
#if !defined(CONFIG_REGULATOR_VEXPRESS)
static DEVICE_ATTR(in1_label, 0444, vexpress_hwmon_label_show, NULL);
static SENSOR_DEVICE_ATTR_RO(in1_input, vexpress_hwmon_u32, 1000);
static struct attribute *vexpress_hwmon_attrs_volt[] = {
&dev_attr_in1_label.attr,
&sensor_dev_attr_in1_input.dev_attr.attr,
NULL
};
static struct attribute_group vexpress_hwmon_group_volt = {
.is_visible = vexpress_hwmon_attr_is_visible,
.attrs = vexpress_hwmon_attrs_volt,
};
static struct vexpress_hwmon_type vexpress_hwmon_volt = {
.name = "vexpress_volt",
.attr_groups = (const struct attribute_group *[]) {
&vexpress_hwmon_group_volt,
NULL,
},
};
#endif
static DEVICE_ATTR(curr1_label, 0444, vexpress_hwmon_label_show, NULL);
static SENSOR_DEVICE_ATTR_RO(curr1_input, vexpress_hwmon_u32, 1000);
Annotation
- Immediate include surface: `linux/device.h`, `linux/err.h`, `linux/hwmon.h`, `linux/hwmon-sysfs.h`, `linux/module.h`, `linux/of.h`, `linux/platform_device.h`, `linux/vexpress.h`.
- Detected declarations: `struct vexpress_hwmon_data`, `struct vexpress_hwmon_type`, `function vexpress_hwmon_label_show`, `function vexpress_hwmon_u32_show`, `function vexpress_hwmon_u64_show`, `function vexpress_hwmon_attr_is_visible`, `function vexpress_hwmon_probe`.
- Atlas domain: Driver Families / drivers/hwmon.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.