drivers/firmware/imx/imx-scu-irq.c
Source file repositories/reference/linux-study-clean/drivers/firmware/imx/imx-scu-irq.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/firmware/imx/imx-scu-irq.c- Extension
.c- Size
- 5868 bytes
- Lines
- 262
- Domain
- Driver Families
- Bucket
- drivers/firmware
- Inferred role
- Driver Families: exported/initcall integration point
- Status
- integration 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.
- Exports symbols or registers init work; inspect boot/module ordering and who consumes the exported contract.
- 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
dt-bindings/firmware/imx/rsrc.hlinux/firmware/imx/ipc.hlinux/firmware/imx/sci.hlinux/kobject.hlinux/mailbox_client.hlinux/of.hlinux/suspend.hlinux/sysfs.h
Detected Declarations
struct imx_sc_msg_irq_get_statusstruct imx_sc_msg_irq_enablestruct scu_wakeupfunction imx_scu_irq_register_notifierfunction imx_scu_irq_unregister_notifierfunction imx_scu_irq_notifier_call_chainfunction imx_scu_irq_work_handlerfunction imx_scu_irq_get_statusfunction imx_scu_irq_group_enablefunction imx_scu_irq_callbackfunction wakeup_source_showfunction imx_scu_enable_general_irq_channelexport imx_scu_irq_register_notifierexport imx_scu_irq_unregister_notifierexport imx_scu_irq_get_statusexport imx_scu_irq_group_enable
Annotated Snippet
struct imx_sc_msg_irq_get_status {
struct imx_sc_rpc_msg hdr;
union {
struct {
u16 resource;
u8 group;
u8 reserved;
} __packed req;
struct {
u32 status;
} resp;
} data;
};
struct imx_sc_msg_irq_enable {
struct imx_sc_rpc_msg hdr;
u32 mask;
u16 resource;
u8 group;
u8 enable;
} __packed;
struct scu_wakeup {
u32 mask;
u32 wakeup_src;
bool valid;
};
/* Sysfs functions */
static struct kobject *wakeup_obj;
static ssize_t wakeup_source_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf);
static struct kobj_attribute wakeup_source_attr =
__ATTR(wakeup_src, 0660, wakeup_source_show, NULL);
static struct scu_wakeup scu_irq_wakeup[IMX_SC_IRQ_NUM_GROUP];
static struct imx_sc_ipc *imx_sc_irq_ipc_handle;
static struct work_struct imx_sc_irq_work;
static BLOCKING_NOTIFIER_HEAD(imx_scu_irq_notifier_chain);
int imx_scu_irq_register_notifier(struct notifier_block *nb)
{
return blocking_notifier_chain_register(
&imx_scu_irq_notifier_chain, nb);
}
EXPORT_SYMBOL(imx_scu_irq_register_notifier);
int imx_scu_irq_unregister_notifier(struct notifier_block *nb)
{
return blocking_notifier_chain_unregister(
&imx_scu_irq_notifier_chain, nb);
}
EXPORT_SYMBOL(imx_scu_irq_unregister_notifier);
static int imx_scu_irq_notifier_call_chain(unsigned long status, u8 *group)
{
return blocking_notifier_call_chain(&imx_scu_irq_notifier_chain,
status, (void *)group);
}
static void imx_scu_irq_work_handler(struct work_struct *work)
{
u32 irq_status;
int ret;
u8 i;
for (i = 0; i < IMX_SC_IRQ_NUM_GROUP; i++) {
if (scu_irq_wakeup[i].mask) {
scu_irq_wakeup[i].valid = false;
scu_irq_wakeup[i].wakeup_src = 0;
}
ret = imx_scu_irq_get_status(i, &irq_status);
if (ret) {
pr_err("get irq group %d status failed, ret %d\n",
i, ret);
return;
}
if (!irq_status)
continue;
if (scu_irq_wakeup[i].mask & irq_status) {
scu_irq_wakeup[i].valid = true;
scu_irq_wakeup[i].wakeup_src = irq_status & scu_irq_wakeup[i].mask;
} else {
scu_irq_wakeup[i].wakeup_src = irq_status;
}
pm_system_wakeup();
imx_scu_irq_notifier_call_chain(irq_status, &i);
Annotation
- Immediate include surface: `dt-bindings/firmware/imx/rsrc.h`, `linux/firmware/imx/ipc.h`, `linux/firmware/imx/sci.h`, `linux/kobject.h`, `linux/mailbox_client.h`, `linux/of.h`, `linux/suspend.h`, `linux/sysfs.h`.
- Detected declarations: `struct imx_sc_msg_irq_get_status`, `struct imx_sc_msg_irq_enable`, `struct scu_wakeup`, `function imx_scu_irq_register_notifier`, `function imx_scu_irq_unregister_notifier`, `function imx_scu_irq_notifier_call_chain`, `function imx_scu_irq_work_handler`, `function imx_scu_irq_get_status`, `function imx_scu_irq_group_enable`, `function imx_scu_irq_callback`.
- Atlas domain: Driver Families / drivers/firmware.
- Implementation status: integration 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.