drivers/gpio/gpio-virtuser.c
Source file repositories/reference/linux-study-clean/drivers/gpio/gpio-virtuser.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/gpio/gpio-virtuser.c- Extension
.c- Size
- 44599 bytes
- Lines
- 1813
- Domain
- Driver Families
- Bucket
- drivers/gpio
- 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.
- 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.
- Defines an operation table; this is where Linux turns generic core objects into subsystem-specific behavior.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Touches IRQ or DMA behavior; this matters for the representative real-device path.
- 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/array_size.hlinux/atomic.hlinux/bitmap.hlinux/cleanup.hlinux/configfs.hlinux/debugfs.hlinux/device.hlinux/err.hlinux/gpio/consumer.hlinux/gpio/machine.hlinux/idr.hlinux/interrupt.hlinux/irq_work.hlinux/limits.hlinux/list.hlinux/lockdep.hlinux/mod_devicetable.hlinux/module.hlinux/mutex.hlinux/notifier.hlinux/of.hlinux/overflow.hlinux/platform_device.hlinux/printk.hlinux/property.hlinux/slab.hlinux/string_helpers.hlinux/types.h
Detected Declarations
struct gpio_virtuser_attr_datastruct gpio_virtuser_line_array_datastruct gpio_virtuser_line_datastruct gpio_virtuser_dbgfs_attr_descrstruct gpio_virtuser_irq_work_contextstruct gpio_virtuser_devicestruct gpio_virtuser_lookupstruct gpio_virtuser_lookup_entryfunction to_gpio_virtuser_irq_work_contextfunction gpio_virtuser_init_irq_work_contextfunction gpio_virtuser_irq_work_queue_syncfunction gpio_virtuser_dbgfs_emit_value_arrayfunction gpio_virtuser_get_value_array_atomicfunction gpio_virtuser_get_array_valuefunction gpio_virtuser_value_array_do_readfunction gpio_virtuser_dbgfs_parse_value_arrayfunction gpio_virtuser_set_value_array_atomicfunction gpio_virtuser_set_array_valuefunction gpio_virtuser_value_array_do_writefunction gpio_virtuser_value_array_readfunction gpio_virtuser_value_array_writefunction gpio_virtuser_value_array_atomic_readfunction gpio_virtuser_value_array_atomic_writefunction gpio_virtuser_do_get_direction_atomicfunction gpio_virtuser_get_direction_atomicfunction gpio_virtuser_direction_do_readfunction gpio_virtuser_set_directionfunction gpio_virtuser_do_set_direction_atomicfunction gpio_virtuser_set_direction_atomicfunction gpio_virtuser_direction_do_writefunction gpio_virtuser_direction_readfunction gpio_virtuser_direction_writefunction gpio_virtuser_direction_atomic_readfunction gpio_virtuser_direction_atomic_writefunction gpio_virtuser_value_getfunction gpio_virtuser_value_setfunction gpio_virtuser_get_value_atomicfunction gpio_virtuser_value_atomic_getfunction gpio_virtuser_set_value_atomicfunction gpio_virtuser_value_atomic_setfunction gpio_virtuser_debounce_getfunction gpio_virtuser_debounce_setfunction gpio_virtuser_consumer_readfunction gpio_virtuser_consumer_writefunction gpio_virtuser_interrupts_getfunction gpio_virtuser_irq_handlerfunction gpio_virtuser_interrupts_setfunction gpio_virtuser_create_debugfs_attrs
Annotated Snippet
const struct file_operations *fops;
};
struct gpio_virtuser_irq_work_context {
struct irq_work work;
struct completion work_completion;
union {
struct {
struct gpio_desc *desc;
int dir;
int val;
int ret;
};
struct {
struct gpio_descs *descs;
unsigned long *values;
};
};
};
static struct gpio_virtuser_irq_work_context *
to_gpio_virtuser_irq_work_context(struct irq_work *work)
{
return container_of(work, struct gpio_virtuser_irq_work_context, work);
}
static void
gpio_virtuser_init_irq_work_context(struct gpio_virtuser_irq_work_context *ctx)
{
memset(ctx, 0, sizeof(*ctx));
init_completion(&ctx->work_completion);
}
static void
gpio_virtuser_irq_work_queue_sync(struct gpio_virtuser_irq_work_context *ctx)
{
irq_work_queue(&ctx->work);
wait_for_completion(&ctx->work_completion);
}
static void gpio_virtuser_dbgfs_emit_value_array(char *buf,
unsigned long *values,
size_t num_values)
{
size_t i;
for (i = 0; i < num_values; i++)
buf[i] = test_bit(i, values) ? '1' : '0';
buf[i++] = '\n';
}
static void gpio_virtuser_get_value_array_atomic(struct irq_work *work)
{
struct gpio_virtuser_irq_work_context *ctx =
to_gpio_virtuser_irq_work_context(work);
struct gpio_descs *descs = ctx->descs;
ctx->ret = gpiod_get_array_value(descs->ndescs, descs->desc,
descs->info, ctx->values);
complete(&ctx->work_completion);
}
static int gpio_virtuser_get_array_value(struct gpio_descs *descs,
unsigned long *values, bool atomic)
{
struct gpio_virtuser_irq_work_context ctx;
if (!atomic)
return gpiod_get_array_value_cansleep(descs->ndescs,
descs->desc,
descs->info, values);
gpio_virtuser_init_irq_work_context(&ctx);
ctx.work = IRQ_WORK_INIT_HARD(gpio_virtuser_get_value_array_atomic);
ctx.descs = descs;
ctx.values = values;
gpio_virtuser_irq_work_queue_sync(&ctx);
return ctx.ret;
}
static ssize_t gpio_virtuser_value_array_do_read(struct file *file,
char __user *user_buf,
size_t size, loff_t *ppos,
bool atomic)
{
struct gpio_virtuser_line_data *data = file->private_data;
struct gpio_descs *descs = data->ad.descs;
Annotation
- Immediate include surface: `linux/array_size.h`, `linux/atomic.h`, `linux/bitmap.h`, `linux/cleanup.h`, `linux/configfs.h`, `linux/debugfs.h`, `linux/device.h`, `linux/err.h`.
- Detected declarations: `struct gpio_virtuser_attr_data`, `struct gpio_virtuser_line_array_data`, `struct gpio_virtuser_line_data`, `struct gpio_virtuser_dbgfs_attr_descr`, `struct gpio_virtuser_irq_work_context`, `struct gpio_virtuser_device`, `struct gpio_virtuser_lookup`, `struct gpio_virtuser_lookup_entry`, `function to_gpio_virtuser_irq_work_context`, `function gpio_virtuser_init_irq_work_context`.
- Atlas domain: Driver Families / drivers/gpio.
- Implementation status: pattern implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
- IRQ or DMA behavior appears here, which is relevant to the selected PCIe/NVMe device path.
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.