drivers/pnp/interface.c
Source file repositories/reference/linux-study-clean/drivers/pnp/interface.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/pnp/interface.c- Extension
.c- Size
- 11227 bytes
- Lines
- 471
- Domain
- Driver Families
- Bucket
- drivers/pnp
- 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.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- 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/pnp.hlinux/string.hlinux/errno.hlinux/list.hlinux/types.hlinux/stat.hlinux/ctype.hlinux/slab.hlinux/mutex.hlinux/uaccess.hbase.h
Detected Declarations
struct pnp_info_bufferfunction pnp_printffunction pnp_print_portfunction pnp_print_irqfunction pnp_print_dmafunction pnp_print_memfunction pnp_print_optionfunction options_showfunction list_for_each_entryfunction resources_showfunction list_for_each_entryfunction resources_storefunction id_show
Annotated Snippet
struct pnp_info_buffer {
char *buffer; /* pointer to begin of buffer */
char *curr; /* current position in buffer */
unsigned long size; /* current size */
unsigned long len; /* total length of buffer */
int stop; /* stop flag */
int error; /* error code */
};
typedef struct pnp_info_buffer pnp_info_buffer_t;
__printf(2, 3)
static int pnp_printf(pnp_info_buffer_t * buffer, char *fmt, ...)
{
va_list args;
int res;
if (buffer->stop || buffer->error)
return 0;
va_start(args, fmt);
res = vsnprintf(buffer->curr, buffer->len - buffer->size, fmt, args);
va_end(args);
if (buffer->size + res >= buffer->len) {
buffer->stop = 1;
return 0;
}
buffer->curr += res;
buffer->size += res;
return res;
}
static void pnp_print_port(pnp_info_buffer_t * buffer, char *space,
struct pnp_port *port)
{
pnp_printf(buffer, "%sport %#llx-%#llx, align %#llx, size %#llx, "
"%i-bit address decoding\n", space,
(unsigned long long) port->min,
(unsigned long long) port->max,
port->align ? ((unsigned long long) port->align - 1) : 0,
(unsigned long long) port->size,
port->flags & IORESOURCE_IO_16BIT_ADDR ? 16 : 10);
}
static void pnp_print_irq(pnp_info_buffer_t * buffer, char *space,
struct pnp_irq *irq)
{
int first = 1, i;
pnp_printf(buffer, "%sirq ", space);
for (i = 0; i < PNP_IRQ_NR; i++)
if (test_bit(i, irq->map.bits)) {
if (!first) {
pnp_printf(buffer, ",");
} else {
first = 0;
}
if (i == 2 || i == 9)
pnp_printf(buffer, "2/9");
else
pnp_printf(buffer, "%i", i);
}
if (bitmap_empty(irq->map.bits, PNP_IRQ_NR))
pnp_printf(buffer, "<none>");
if (irq->flags & IORESOURCE_IRQ_HIGHEDGE)
pnp_printf(buffer, " High-Edge");
if (irq->flags & IORESOURCE_IRQ_LOWEDGE)
pnp_printf(buffer, " Low-Edge");
if (irq->flags & IORESOURCE_IRQ_HIGHLEVEL)
pnp_printf(buffer, " High-Level");
if (irq->flags & IORESOURCE_IRQ_LOWLEVEL)
pnp_printf(buffer, " Low-Level");
if (irq->flags & IORESOURCE_IRQ_OPTIONAL)
pnp_printf(buffer, " (optional)");
pnp_printf(buffer, "\n");
}
static void pnp_print_dma(pnp_info_buffer_t * buffer, char *space,
struct pnp_dma *dma)
{
int first = 1, i;
char *s;
pnp_printf(buffer, "%sdma ", space);
for (i = 0; i < 8; i++)
if (dma->map & (1 << i)) {
if (!first) {
pnp_printf(buffer, ",");
} else {
first = 0;
}
Annotation
- Immediate include surface: `linux/pnp.h`, `linux/string.h`, `linux/errno.h`, `linux/list.h`, `linux/types.h`, `linux/stat.h`, `linux/ctype.h`, `linux/slab.h`.
- Detected declarations: `struct pnp_info_buffer`, `function pnp_printf`, `function pnp_print_port`, `function pnp_print_irq`, `function pnp_print_dma`, `function pnp_print_mem`, `function pnp_print_option`, `function options_show`, `function list_for_each_entry`, `function resources_show`.
- Atlas domain: Driver Families / drivers/pnp.
- Implementation status: source implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
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.