drivers/soundwire/irq.c
Source file repositories/reference/linux-study-clean/drivers/soundwire/irq.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/soundwire/irq.c- Extension
.c- Size
- 1452 bytes
- Lines
- 64
- Domain
- Driver Families
- Bucket
- drivers/soundwire
- 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.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/device.hlinux/fwnode.hlinux/irq.hlinux/irqdomain.hlinux/soundwire/sdw.hirq.h
Detected Declarations
function sdw_irq_mapfunction sdw_irq_createfunction sdw_irq_deletefunction sdw_irq_dispose_mappingfunction sdw_irq_create_mapping
Annotated Snippet
// SPDX-License-Identifier: GPL-2.0
// Copyright (C) 2023 Cirrus Logic, Inc. and
// Cirrus Logic International Semiconductor Ltd.
#include <linux/device.h>
#include <linux/fwnode.h>
#include <linux/irq.h>
#include <linux/irqdomain.h>
#include <linux/soundwire/sdw.h>
#include "irq.h"
static int sdw_irq_map(struct irq_domain *h, unsigned int virq,
irq_hw_number_t hw)
{
struct sdw_bus *bus = h->host_data;
irq_set_chip_data(virq, bus);
irq_set_chip(virq, &bus->irq_chip);
irq_set_nested_thread(virq, 1);
irq_set_noprobe(virq);
return 0;
}
static const struct irq_domain_ops sdw_domain_ops = {
.map = sdw_irq_map,
};
int sdw_irq_create(struct sdw_bus *bus,
struct fwnode_handle *fwnode)
{
bus->irq_chip.name = dev_name(bus->dev);
bus->domain = irq_domain_create_linear(fwnode, SDW_FW_MAX_DEVICES,
&sdw_domain_ops, bus);
if (!bus->domain) {
dev_err(bus->dev, "Failed to add IRQ domain\n");
return -EINVAL;
}
return 0;
}
void sdw_irq_delete(struct sdw_bus *bus)
{
irq_domain_remove(bus->domain);
}
static void sdw_irq_dispose_mapping(void *data)
{
struct sdw_slave *slave = data;
irq_dispose_mapping(slave->irq);
}
void sdw_irq_create_mapping(struct sdw_slave *slave)
{
slave->irq = irq_create_mapping(slave->bus->domain, slave->index);
if (!slave->irq)
dev_warn(&slave->dev, "Failed to map IRQ\n");
devm_add_action_or_reset(&slave->dev, sdw_irq_dispose_mapping, slave);
}
Annotation
- Immediate include surface: `linux/device.h`, `linux/fwnode.h`, `linux/irq.h`, `linux/irqdomain.h`, `linux/soundwire/sdw.h`, `irq.h`.
- Detected declarations: `function sdw_irq_map`, `function sdw_irq_create`, `function sdw_irq_delete`, `function sdw_irq_dispose_mapping`, `function sdw_irq_create_mapping`.
- Atlas domain: Driver Families / drivers/soundwire.
- 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.