drivers/irqchip/irq-atmel-aic-common.c
Source file repositories/reference/linux-study-clean/drivers/irqchip/irq-atmel-aic-common.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/irqchip/irq-atmel-aic-common.c- Extension
.c- Size
- 5966 bytes
- Lines
- 265
- Domain
- Driver Families
- Bucket
- drivers/irqchip
- 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/errno.hlinux/io.hlinux/irq.hlinux/irqdomain.hlinux/of.hlinux/of_address.hlinux/slab.hirq-atmel-aic-common.h
Detected Declarations
struct aic_chip_datafunction aic_common_shutdownfunction aic_common_set_typefunction aic_common_set_priorityfunction aic_common_irq_domain_xlatefunction aic_common_ext_irq_of_initfunction of_property_for_each_u32function aic_common_rtc_irq_fixupfunction aic_common_rtt_irq_fixupfunction aic_common_irq_fixupfunction aic_common_of_init
Annotated Snippet
struct aic_chip_data {
u32 ext_irqs;
};
static void aic_common_shutdown(struct irq_data *d)
{
struct irq_chip_type *ct = irq_data_get_chip_type(d);
ct->chip.irq_mask(d);
}
int aic_common_set_type(struct irq_data *d, unsigned type, unsigned *val)
{
struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
struct aic_chip_data *aic = gc->private;
unsigned aic_type;
switch (type) {
case IRQ_TYPE_LEVEL_HIGH:
aic_type = AT91_AIC_SRCTYPE_HIGH;
break;
case IRQ_TYPE_EDGE_RISING:
aic_type = AT91_AIC_SRCTYPE_RISING;
break;
case IRQ_TYPE_LEVEL_LOW:
if (!(d->mask & aic->ext_irqs))
return -EINVAL;
aic_type = AT91_AIC_SRCTYPE_LOW;
break;
case IRQ_TYPE_EDGE_FALLING:
if (!(d->mask & aic->ext_irqs))
return -EINVAL;
aic_type = AT91_AIC_SRCTYPE_FALLING;
break;
default:
return -EINVAL;
}
*val &= ~AT91_AIC_SRCTYPE;
*val |= aic_type;
return 0;
}
void aic_common_set_priority(int priority, unsigned *val)
{
*val &= ~AT91_AIC_PRIOR;
*val |= priority;
}
int aic_common_irq_domain_xlate(struct irq_domain *d,
struct device_node *ctrlr,
const u32 *intspec,
unsigned int intsize,
irq_hw_number_t *out_hwirq,
unsigned int *out_type)
{
if (WARN_ON(intsize < 3))
return -EINVAL;
if (WARN_ON((intspec[2] < AT91_AIC_IRQ_MIN_PRIORITY) ||
(intspec[2] > AT91_AIC_IRQ_MAX_PRIORITY)))
return -EINVAL;
*out_hwirq = intspec[0];
*out_type = intspec[1] & IRQ_TYPE_SENSE_MASK;
return 0;
}
static void __init aic_common_ext_irq_of_init(struct irq_domain *domain)
{
struct device_node *node = irq_domain_get_of_node(domain);
struct irq_chip_generic *gc;
struct aic_chip_data *aic;
u32 hwirq;
gc = irq_get_domain_generic_chip(domain, 0);
aic = gc->private;
aic->ext_irqs |= 1;
of_property_for_each_u32(node, "atmel,external-irqs", hwirq) {
gc = irq_get_domain_generic_chip(domain, hwirq);
if (!gc) {
pr_warn("AIC: external irq %d >= %d skip it\n",
hwirq, domain->revmap_size);
continue;
Annotation
- Immediate include surface: `linux/errno.h`, `linux/io.h`, `linux/irq.h`, `linux/irqdomain.h`, `linux/of.h`, `linux/of_address.h`, `linux/slab.h`, `irq-atmel-aic-common.h`.
- Detected declarations: `struct aic_chip_data`, `function aic_common_shutdown`, `function aic_common_set_type`, `function aic_common_set_priority`, `function aic_common_irq_domain_xlate`, `function aic_common_ext_irq_of_init`, `function of_property_for_each_u32`, `function aic_common_rtc_irq_fixup`, `function aic_common_rtt_irq_fixup`, `function aic_common_irq_fixup`.
- Atlas domain: Driver Families / drivers/irqchip.
- 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.