drivers/media/platform/mediatek/mdp/mtk_mdp_core.c
Source file repositories/reference/linux-study-clean/drivers/media/platform/mediatek/mdp/mtk_mdp_core.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/media/platform/mediatek/mdp/mtk_mdp_core.c- Extension
.c- Size
- 7620 bytes
- Lines
- 327
- Domain
- Driver Families
- Bucket
- drivers/media
- 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
linux/clk.hlinux/device.hlinux/errno.hlinux/interrupt.hlinux/kernel.hlinux/module.hlinux/of.hlinux/of_address.hlinux/of_platform.hlinux/platform_device.hlinux/pm_runtime.hlinux/workqueue.hmtk_mdp_core.hmtk_mdp_m2m.hmtk_vpu.h
Detected Declarations
function mtk_mdp_clock_onfunction mtk_mdp_clock_offfunction mtk_mdp_wdt_workerfunction list_for_each_entryfunction mtk_mdp_reset_handlerfunction mtk_mdp_register_componentfunction mtk_mdp_unregister_componentfunction mtk_mdp_probefunction mtk_mdp_removefunction list_for_each_entry_safefunction mtk_mdp_pm_suspendfunction mtk_mdp_pm_resumefunction mtk_mdp_suspendfunction mtk_mdp_resumeexport mtk_mdp_dbg_level
Annotated Snippet
if (!of_device_is_available(node)) {
dev_err(dev, "Skipping disabled component %pOF\n",
node);
continue;
}
comp_type = (uintptr_t)of_id->data;
comp = devm_kzalloc(dev, sizeof(*comp), GFP_KERNEL);
if (!comp) {
ret = -ENOMEM;
of_node_put(node);
goto err_comp;
}
ret = mtk_mdp_comp_init(dev, node, comp, comp_type);
if (ret) {
of_node_put(node);
goto err_comp;
}
mtk_mdp_register_component(mdp, comp);
}
mdp->job_wq = create_singlethread_workqueue(MTK_MDP_MODULE_NAME);
if (!mdp->job_wq) {
dev_err(&pdev->dev, "unable to alloc job workqueue\n");
ret = -ENOMEM;
goto err_alloc_job_wq;
}
mdp->wdt_wq = create_singlethread_workqueue("mdp_wdt_wq");
if (!mdp->wdt_wq) {
dev_err(&pdev->dev, "unable to alloc wdt workqueue\n");
ret = -ENOMEM;
goto err_alloc_wdt_wq;
}
INIT_WORK(&mdp->wdt_work, mtk_mdp_wdt_worker);
ret = v4l2_device_register(dev, &mdp->v4l2_dev);
if (ret) {
dev_err(&pdev->dev, "Failed to register v4l2 device\n");
ret = -EINVAL;
goto err_dev_register;
}
ret = mtk_mdp_register_m2m_device(mdp);
if (ret) {
v4l2_err(&mdp->v4l2_dev, "Failed to init mem2mem device\n");
goto err_m2m_register;
}
mdp->vpu_dev = vpu_get_plat_device(pdev);
if (!mdp->vpu_dev) {
dev_err(&pdev->dev, "Failed to get vpu device\n");
ret = -ENODEV;
goto err_vpu_get_dev;
}
ret = vpu_wdt_reg_handler(mdp->vpu_dev, mtk_mdp_reset_handler, mdp,
VPU_RST_MDP);
if (ret) {
dev_err(&pdev->dev, "Failed to register reset handler\n");
goto err_reg_handler;
}
platform_set_drvdata(pdev, mdp);
ret = vb2_dma_contig_set_max_seg_size(&pdev->dev, DMA_BIT_MASK(32));
if (ret) {
dev_err(&pdev->dev, "Failed to set vb2 dma mag seg size\n");
goto err_reg_handler;
}
pm_runtime_enable(dev);
dev_dbg(dev, "mdp-%d registered successfully\n", mdp->id);
return 0;
err_reg_handler:
platform_device_put(mdp->vpu_dev);
err_vpu_get_dev:
mtk_mdp_unregister_m2m_device(mdp);
err_m2m_register:
v4l2_device_unregister(&mdp->v4l2_dev);
err_dev_register:
destroy_workqueue(mdp->wdt_wq);
Annotation
- Immediate include surface: `linux/clk.h`, `linux/device.h`, `linux/errno.h`, `linux/interrupt.h`, `linux/kernel.h`, `linux/module.h`, `linux/of.h`, `linux/of_address.h`.
- Detected declarations: `function mtk_mdp_clock_on`, `function mtk_mdp_clock_off`, `function mtk_mdp_wdt_worker`, `function list_for_each_entry`, `function mtk_mdp_reset_handler`, `function mtk_mdp_register_component`, `function mtk_mdp_unregister_component`, `function mtk_mdp_probe`, `function mtk_mdp_remove`, `function list_for_each_entry_safe`.
- Atlas domain: Driver Families / drivers/media.
- 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.