Hi, On 9/11/19 5:40 PM, Bibby Hsieh wrote:
From: daoyuan huang <daoyuan.huang@xxxxxxxxxxxx> This patch adds driver for Media Data Path 3 (MDP3). Each modules' related operation control is sited in mtk-mdp3-comp.c Each modules' register table is defined in file with "mdp_reg_" and "mmsys_" prefix GCE related API, operation control sited in mtk-mdp3-cmdq.c V4L2 m2m device functions are implemented in mtk-mdp3-m2m.c Probe, power, suspend/resume, system level functions are defined in mtk-mdp3-core.c Signed-off-by: Ping-Hsun Wu <ping-hsun.wu@xxxxxxxxxxxx> Signed-off-by: daoyuan huang <daoyuan.huang@xxxxxxxxxxxx> --- ... diff --git a/drivers/media/platform/mtk-mdp3/mtk-mdp3-core.c b/drivers/media/platform/mtk-mdp3/mtk-mdp3-core.c new file mode 100644 ... > +static int mdp_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct mdp_dev *mdp; + phandle rproc_phandle; + int ret; + + mdp = devm_kzalloc(dev, sizeof(*mdp), GFP_KERNEL); + if (!mdp) + return -ENOMEM; + + mdp->pdev = pdev; + ret = mdp_component_init(mdp); + if (ret) { + dev_err(dev, "Failed to initialize mdp components\n"); + goto err_return; + } + + mdp->job_wq = alloc_workqueue(MDP_MODULE_NAME, WQ_FREEZABLE, 0); + if (!mdp->job_wq) { + dev_err(dev, "Unable to create job workqueue\n"); + ret = -ENOMEM; + goto err_destroy_job_wq; + } + + mdp->clock_wq = alloc_workqueue(MDP_MODULE_NAME "-clock", WQ_FREEZABLE, + 0); + if (!mdp->clock_wq) { + dev_err(dev, "Unable to create clock workqueue\n"); + ret = -ENOMEM; + goto err_destroy_clock_wq; + } + + mdp->vpu_dev = scp_get_pdev(pdev); + + ret = of_property_read_u32(pdev->dev.of_node, "mediatek,scp", + &rproc_phandle); + if (ret) { + dev_err(&pdev->dev, "Could not get scp device\n"); + goto err_destroy_clock_wq; + } + + mdp->rproc_handle = rproc_get_by_phandle(rproc_phandle); + + dev_info(&pdev->dev, "MDP rproc_handle: %llx", + (unsigned long long)mdp->rproc_handle); + + if (!mdp->rproc_handle) { + dev_err(&pdev->dev, "Could not get MDP's rproc_handle\n");
"ret" is not set in this error path, ret = -ENODEV?
+ goto err_destroy_clock_wq; + } + + mutex_init(&mdp->vpu_lock); + mutex_init(&mdp->m2m_lock); + + mdp->cmdq_clt = cmdq_mbox_create(dev, 0, 1200); + if (IS_ERR(mdp->cmdq_clt))
Same here, ret = PTR_ERR(mdp->cmdq_clt)?
+ goto err_destroy_clock_wq; + + init_waitqueue_head(&mdp->callback_wq); + ida_init(&mdp->mdp_ida); + platform_set_drvdata(pdev, mdp); + + vb2_dma_contig_set_max_seg_size(&pdev->dev, DMA_BIT_MASK(32)); + pm_runtime_enable(dev); + + ret = v4l2_device_register(dev, &mdp->v4l2_dev); + if (ret) { + dev_err(dev, "Failed to register v4l2 device\n"); + ret = -EINVAL; + goto err_mbox_destroy; + } + + ret = mdp_m2m_device_register(mdp); + if (ret) { + v4l2_err(&mdp->v4l2_dev, "Failed to register m2m device\n"); + goto err_unregister_device; + } + + dev_dbg(dev, "mdp-%d registered successfully\n", pdev->id); + return 0; + +err_unregister_device: + v4l2_device_unregister(&mdp->v4l2_dev); +err_mbox_destroy: + cmdq_mbox_destroy(mdp->cmdq_clt); +err_destroy_clock_wq: + destroy_workqueue(mdp->clock_wq); +err_destroy_job_wq: + destroy_workqueue(mdp->job_wq); +err_return: + dev_dbg(dev, "Errno %d\n", ret); + return ret; +} ...