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.

Dependency Surface

Detected Declarations

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

Implementation Notes