sound/soc/sof/sof-client-ipc-kernel-injector.c
Source file repositories/reference/linux-study-clean/sound/soc/sof/sof-client-ipc-kernel-injector.c
File Facts
- System
- Linux kernel
- Corpus path
sound/soc/sof/sof-client-ipc-kernel-injector.c- Extension
.c- Size
- 4233 bytes
- Lines
- 164
- Domain
- Driver Families
- Bucket
- sound/soc
- 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.
- 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/auxiliary_bus.hlinux/debugfs.hlinux/mod_devicetable.hlinux/module.hlinux/pm_runtime.hsound/sof/header.hsof-client.h
Detected Declarations
struct sof_msg_inject_privfunction sof_msg_inject_dfs_openfunction sof_kernel_msg_inject_dfs_writefunction sof_msg_inject_dfs_releasefunction sof_msg_inject_probefunction sof_msg_inject_remove
Annotated Snippet
static const struct file_operations sof_kernel_msg_inject_fops = {
.open = sof_msg_inject_dfs_open,
.write = sof_kernel_msg_inject_dfs_write,
.release = sof_msg_inject_dfs_release,
.owner = THIS_MODULE,
};
static int sof_msg_inject_probe(struct auxiliary_device *auxdev,
const struct auxiliary_device_id *id)
{
struct sof_client_dev *cdev = auxiliary_dev_to_sof_client_dev(auxdev);
struct dentry *debugfs_root = sof_client_get_debugfs_root(cdev);
struct device *dev = &auxdev->dev;
struct sof_msg_inject_priv *priv;
size_t alloc_size;
/* allocate memory for client data */
priv = devm_kzalloc(&auxdev->dev, sizeof(*priv), GFP_KERNEL);
if (!priv)
return -ENOMEM;
priv->max_msg_size = sof_client_get_ipc_max_payload_size(cdev);
alloc_size = priv->max_msg_size;
priv->kernel_buffer = devm_kmalloc(dev, alloc_size, GFP_KERNEL);
if (!priv->kernel_buffer)
return -ENOMEM;
cdev->data = priv;
priv->kernel_dfs_file = debugfs_create_file("kernel_ipc_msg_inject", 0644,
debugfs_root, cdev,
&sof_kernel_msg_inject_fops);
/* enable runtime PM */
pm_runtime_set_autosuspend_delay(dev, SOF_IPC_CLIENT_SUSPEND_DELAY_MS);
pm_runtime_use_autosuspend(dev);
pm_runtime_set_active(dev);
pm_runtime_enable(dev);
pm_runtime_mark_last_busy(dev);
pm_runtime_idle(dev);
return 0;
}
static void sof_msg_inject_remove(struct auxiliary_device *auxdev)
{
struct sof_client_dev *cdev = auxiliary_dev_to_sof_client_dev(auxdev);
struct sof_msg_inject_priv *priv = cdev->data;
pm_runtime_disable(&auxdev->dev);
debugfs_remove(priv->kernel_dfs_file);
}
static const struct auxiliary_device_id sof_msg_inject_client_id_table[] = {
{ .name = "snd_sof.kernel_injector" },
{},
};
MODULE_DEVICE_TABLE(auxiliary, sof_msg_inject_client_id_table);
/*
* No need for driver pm_ops as the generic pm callbacks in the auxiliary bus
* type are enough to ensure that the parent SOF device resumes to bring the DSP
* back to D0.
* Driver name will be set based on KBUILD_MODNAME.
*/
static struct auxiliary_driver sof_msg_inject_client_drv = {
.probe = sof_msg_inject_probe,
.remove = sof_msg_inject_remove,
.id_table = sof_msg_inject_client_id_table,
};
module_auxiliary_driver(sof_msg_inject_client_drv);
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("SOF IPC Kernel Injector Client Driver");
MODULE_IMPORT_NS("SND_SOC_SOF_CLIENT");
Annotation
- Immediate include surface: `linux/auxiliary_bus.h`, `linux/debugfs.h`, `linux/mod_devicetable.h`, `linux/module.h`, `linux/pm_runtime.h`, `sound/sof/header.h`, `sof-client.h`.
- Detected declarations: `struct sof_msg_inject_priv`, `function sof_msg_inject_dfs_open`, `function sof_kernel_msg_inject_dfs_write`, `function sof_msg_inject_dfs_release`, `function sof_msg_inject_probe`, `function sof_msg_inject_remove`.
- Atlas domain: Driver Families / sound/soc.
- Implementation status: pattern 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.