Received: by 2002:a05:6a10:a841:0:0:0:0 with SMTP id d1csp1083869pxy; Thu, 22 Apr 2021 23:02:16 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzzzPqm3Y29p1ZWxvcp9Vf76rcfHZoeRk6UpYFybSxHH4JtA3WzTUo3KB6qWveTB40bZNP5 X-Received: by 2002:a62:528e:0:b029:1f5:c5ee:a487 with SMTP id g136-20020a62528e0000b02901f5c5eea487mr2241184pfb.7.1619157736165; Thu, 22 Apr 2021 23:02:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1619157736; cv=none; d=google.com; s=arc-20160816; b=Bk/I9HDZW87HO1HvwNqTyS0YKIiNinx3WUAibvKItBnbuMafH3YnpGuE8Zhi09fBTA 7XiAnwQ0zlruxMI700STs5P/rh80oewZDo4r4UEt0ub1bIlUAIsGU3sjU3uBF37UXUeI 3T3e+zF2eD5wk9GJC5bWCvzGMmeuQNxo22TLLYmeeiCRA+v2yerfvf0vLOHX9jM1VkRc gDP96QuNG5Jj5Lcnns+gQOzVIiDHSjReRzkTw9LBNCuORjYW1uyhFefPUsa6IvLbeWHG A5xjv9PlOj3Wq1CN3PntLms+UrTj6AC1XEnaCW5ZA2pnnUNEqEoM4JfJXVzbIzNgDPS4 yfrg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=U8O0cvQUeXVHDsm4HKRiMX7/KpnfTrHYMYGk9r4tAmc=; b=qTUEHjvAlD/JNqIdj4DU0AK2cMOmTK/DAByfug2zDnxoj34DRiubpBFqGRJpk5Hoa0 kxN3GMmn++uzEmODfFtp/3r7ZuQF7a6bmkJ1GYCYYSqb4kmhRqPYjLpVlLAhHJQ6oc3r RJ6VRZeokXzFYoX3dtmGYtrLxzgml6on+RQyr/Eemc8PGsSGkXBfCzbsS6uifdmnz4xd 5vqcMycpFRskiOwapnrfmZmbVkYfk3dp7v0D8WAMKbNLxn2n8mBcyLKwrrG4pduWr5S3 bbkJY5/23wVgrqEp0mMFm7qCXoH6GJilRQuJiJ6zWmuCDpdp92kJ56tIyzuhhpImJLLQ Th7w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=VurupPFH; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id w7si9252700pjv.86.2021.04.22.23.02.04; Thu, 22 Apr 2021 23:02:16 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=VurupPFH; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240693AbhDWF74 (ORCPT + 99 others); Fri, 23 Apr 2021 01:59:56 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42926 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240648AbhDWF7y (ORCPT ); Fri, 23 Apr 2021 01:59:54 -0400 Received: from mail-pf1-x430.google.com (mail-pf1-x430.google.com [IPv6:2607:f8b0:4864:20::430]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A8BDAC06174A for ; Thu, 22 Apr 2021 22:59:18 -0700 (PDT) Received: by mail-pf1-x430.google.com with SMTP id h15so15701803pfv.2 for ; Thu, 22 Apr 2021 22:59:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=U8O0cvQUeXVHDsm4HKRiMX7/KpnfTrHYMYGk9r4tAmc=; b=VurupPFHnMJqF4/7zVD76Ptavzt12CBMOodBk+GdauZvFCSxoWH6olW5znZeBxOPAk va0OFUqXp5puzpLUnHUEiHRAg00fbNSomhlN0kd7KA3B42bsGzdT9UZ1LmDb70aPuj3/ ukbCpyZ+ht9VTXQS/8h2I2WJtpfggrHr1Wgjk= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=U8O0cvQUeXVHDsm4HKRiMX7/KpnfTrHYMYGk9r4tAmc=; b=NB9KHrTgATe/ghT2rK53tvw9koP2SoGMHZcGuX2la9ahOi/c9AsOfF398KxVYbbgST /dF2CwylGfQaaISaT5NlisTHY+RjzYXwYzm5Vvvrn/hI6xAHh/Zp7IhkJYSyKGficzj9 9PLMgc8IDRtePkIynmqU41Y3u1vg9QEZdXTefgZjcrMmT7rf6cVo+0qI/yj9x1pZA7tc f26tA8dPCNiu4OpgVP3LUfeon+JyGeyzXrn45ay7k/SFbkU/bqPO/4+uJCXCuRO+S6Ms zag++3lsHOAcO4ydKKwUNndJVNfprNccd1E6mxmXTTuD6dE9ePEJHYAZfMC+hBaRp0ry rJhw== X-Gm-Message-State: AOAM531IPQooAlcNL6tigct0eoHcEFm7VDRVnrKklGHtvBrs1g0rK5mV BBuBsFU7+NohlyDyPsbdn9EEAA2/h/bpQl9v X-Received: by 2002:a62:8804:0:b029:253:6745:908c with SMTP id l4-20020a6288040000b02902536745908cmr2213868pfd.16.1619157557875; Thu, 22 Apr 2021 22:59:17 -0700 (PDT) Received: from localhost ([2401:fa00:9:14:308c:235d:f7a2:53a1]) by smtp.gmail.com with UTF8SMTPSA id y189sm3421808pfy.8.2021.04.22.22.59.13 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 22 Apr 2021 22:59:17 -0700 (PDT) From: Eizan Miyamoto To: linux-kernel@vger.kernel.org Cc: enric.balletbo@collabora.com, chunkuang.hu@kernel.org, yong.wu@mediatek.com, Eizan Miyamoto , Andrew-CT Chen , Houlong Wei , Matthias Brugger , Mauro Carvalho Chehab , Minghsiu Tsai , linux-arm-kernel@lists.infradead.org, linux-media@vger.kernel.org, linux-mediatek@lists.infradead.org Subject: [PATCH v1 4/4] mtk-mdp: soc: mediatek: register mdp from mmsys Date: Fri, 23 Apr 2021 15:58:41 +1000 Message-Id: <20210423155824.v1.4.I558dcbaa17bf00243951a8ceb6d0e98758aacfa4@changeid> X-Mailer: git-send-email 2.31.1.498.g6c1eba8ee3d-goog In-Reply-To: <20210423055842.2490679-1-eizan@chromium.org> References: <20210423055842.2490679-1-eizan@chromium.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Rather than hanging the MDP master component driver off of the rdma0 device, create a "virtual" device by the mmsys driver instead which is probed by the mtk_mdp_core driver. Broadly, four interdependent things are done by this change: - A virtual device that is probed by the mtk_mdp_core driver is instantiated by the mtk_mmsys driver. - Presence of a mediatek,vpu property in a child node to the mmsys device node is used to determine what device to use when dispatching dma ops from the relevant ioctl. - v4l-related setup is moved into from the mtk_mdp_core driver to the mtk_mdp_comp driver. Signed-off-by: Eizan Miyamoto --- drivers/media/platform/mtk-mdp/mtk_mdp_comp.c | 47 +++++++++----- drivers/media/platform/mtk-mdp/mtk_mdp_core.c | 62 ++++++------------- drivers/media/platform/mtk-mdp/mtk_mdp_core.h | 2 + drivers/media/platform/mtk-mdp/mtk_mdp_m2m.c | 4 +- drivers/soc/mediatek/mtk-mmsys.c | 20 +++++- 5 files changed, 75 insertions(+), 60 deletions(-) diff --git a/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c b/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c index d447bfaadef4..dc5231a1fcfd 100644 --- a/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c @@ -106,8 +106,41 @@ static int mtk_mdp_comp_bind(struct device *dev, struct device *master, { struct mtk_mdp_comp *comp = dev_get_drvdata(dev); struct mtk_mdp_dev *mdp = data; + struct device_node *vpu_node; mtk_mdp_register_component(mdp, comp); + + // If this component has a "mediatek-vpu" property, it is responsible for + // notifying the mdp master driver about it so it can be further initialized + // later. + vpu_node = of_parse_phandle(dev->of_node, "mediatek,vpu", 0); + if (vpu_node) { + int ret; + + mdp->vpu_dev = of_find_device_by_node(vpu_node); + if (WARN_ON(!mdp->vpu_dev)) { + dev_err(dev, "vpu pdev failed\n"); + of_node_put(vpu_node); + } + + ret = v4l2_device_register(dev, &mdp->v4l2_dev); + if (ret) { + dev_err(dev, "Failed to register v4l2 device\n"); + return -EINVAL; + } + + ret = vb2_dma_contig_set_max_seg_size(dev, DMA_BIT_MASK(32)); + if (ret) { + dev_err(dev, "Failed to set vb2 dma mag seg size\n"); + return -EINVAL; + } + + // presence of the "mediatek,vpu" property in a device node + // indicates that it is the primary MDP rdma device and MDP DMA + // ops should be handled by its DMA callbacks. + mdp->rdma_dev = dev; + } + pm_runtime_enable(dev); return 0; @@ -164,23 +197,9 @@ int mtk_mdp_comp_init(struct mtk_mdp_comp *comp, struct device *dev) static int mtk_mdp_comp_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; - struct device_node *vpu_node; int status; struct mtk_mdp_comp *comp; - vpu_node = of_parse_phandle(dev->of_node, "mediatek,vpu", 0); - if (vpu_node) { - of_node_put(vpu_node); - /* - * The device tree node with a mediatek,vpu property is deemed - * the MDP "master" device, we don't want to add a component - * for it in this function because the initialization for the - * master is done elsewhere. - */ - dev_info(dev, "vpu node found, not probing\n"); - return -ENODEV; - } - comp = devm_kzalloc(dev, sizeof(*comp), GFP_KERNEL); if (!comp) return -ENOMEM; diff --git a/drivers/media/platform/mtk-mdp/mtk_mdp_core.c b/drivers/media/platform/mtk-mdp/mtk_mdp_core.c index 5e71496e2517..4d7aa4e26be6 100644 --- a/drivers/media/platform/mtk-mdp/mtk_mdp_core.c +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_core.c @@ -121,6 +121,17 @@ static int mtk_mdp_master_bind(struct device *dev) goto err_component_bind_all; } + if (mdp->vpu_dev) { + int ret = vpu_wdt_reg_handler(mdp->vpu_dev, mtk_mdp_reset_handler, mdp, + VPU_RST_MDP); + if (ret) { + dev_err(dev, "Failed to register reset handler\n"); + goto err_wdt_reg; + } + } else { + dev_err(dev, "no vpu_dev found\n"); + } + status = mtk_mdp_register_m2m_device(mdp); if (status) { dev_err(dev, "Failed to register m2m device: %d\n", status); @@ -133,6 +144,8 @@ static int mtk_mdp_master_bind(struct device *dev) return 0; err_mtk_mdp_register_m2m_device: + +err_wdt_reg: component_unbind_all(dev, mdp); err_component_bind_all: @@ -191,8 +204,13 @@ static int mtk_mdp_probe(struct platform_device *pdev) of_node_put(node); parent = dev->of_node; dev_warn(dev, "device tree is out of date\n"); - } else { + } else if (dev->of_node) { parent = dev->of_node->parent; + } else if (dev->parent) { + // maybe we were created from a call to platform_device_register_data() + parent = dev->parent->parent->of_node; + } else { + return -ENODEV; } /* Iterate over sibling MDP function blocks */ @@ -225,16 +243,6 @@ static int mtk_mdp_probe(struct platform_device *pdev) } } - /* - * Create a component for myself so that clocks can be toggled in - * clock_on(). - */ - ret = mtk_mdp_comp_init(&mdp->comp_self, dev); - if (ret) { - dev_err(dev, "Failed to initialize component\n"); - goto err_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"); @@ -250,29 +258,8 @@ static int mtk_mdp_probe(struct platform_device *pdev) } 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; - } - - mdp->vpu_dev = vpu_get_plat_device(pdev); - 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_wdt_reg; - } - 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_set_max_seg_size; - } - ret = component_master_add_with_match(dev, &mtk_mdp_com_ops, match); if (ret) { dev_err(dev, "Component master add failed\n"); @@ -284,22 +271,12 @@ static int mtk_mdp_probe(struct platform_device *pdev) return 0; err_component_master_add: - vb2_dma_contig_clear_max_seg_size(&pdev->dev); - -err_set_max_seg_size: - -err_wdt_reg: - v4l2_device_unregister(&mdp->v4l2_dev); - -err_dev_register: destroy_workqueue(mdp->wdt_wq); err_alloc_wdt_wq: destroy_workqueue(mdp->job_wq); err_alloc_job_wq: - -err_comp: dev_dbg(dev, "err %d\n", ret); return ret; } @@ -371,7 +348,6 @@ static struct platform_driver mtk_mdp_driver = { .driver = { .name = MTK_MDP_MODULE_NAME, .pm = &mtk_mdp_pm_ops, - .of_match_table = mtk_mdp_of_ids, } }; diff --git a/drivers/media/platform/mtk-mdp/mtk_mdp_core.h b/drivers/media/platform/mtk-mdp/mtk_mdp_core.h index 230f531400ca..78c3c77cd226 100644 --- a/drivers/media/platform/mtk-mdp/mtk_mdp_core.h +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_core.h @@ -133,6 +133,7 @@ struct mtk_mdp_variant { * struct mtk_mdp_dev - abstraction for image processor entity * @lock: the mutex protecting this data structure * @vpulock: the mutex protecting the communication with VPU + * @rdma_dev: device pointer to rdma device for MDP * @pdev: pointer to the image processor platform device * @variant: the IP variant information * @id: image processor device index (0..MTK_MDP_MAX_DEVS) @@ -151,6 +152,7 @@ struct mtk_mdp_variant { struct mtk_mdp_dev { struct mutex lock; struct mutex vpulock; + struct device *rdma_dev; struct platform_device *pdev; struct mtk_mdp_variant *variant; u16 id; diff --git a/drivers/media/platform/mtk-mdp/mtk_mdp_m2m.c b/drivers/media/platform/mtk-mdp/mtk_mdp_m2m.c index d351e5a44768..c80ad8299c5e 100644 --- a/drivers/media/platform/mtk-mdp/mtk_mdp_m2m.c +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_m2m.c @@ -932,7 +932,7 @@ static int mtk_mdp_m2m_queue_init(void *priv, struct vb2_queue *src_vq, src_vq->mem_ops = &vb2_dma_contig_memops; src_vq->buf_struct_size = sizeof(struct v4l2_m2m_buffer); src_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY; - src_vq->dev = &ctx->mdp_dev->pdev->dev; + src_vq->dev = ctx->mdp_dev->rdma_dev; src_vq->lock = &ctx->mdp_dev->lock; ret = vb2_queue_init(src_vq); @@ -947,7 +947,7 @@ static int mtk_mdp_m2m_queue_init(void *priv, struct vb2_queue *src_vq, dst_vq->mem_ops = &vb2_dma_contig_memops; dst_vq->buf_struct_size = sizeof(struct v4l2_m2m_buffer); dst_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY; - dst_vq->dev = &ctx->mdp_dev->pdev->dev; + dst_vq->dev = ctx->mdp_dev->rdma_dev; dst_vq->lock = &ctx->mdp_dev->lock; return vb2_queue_init(dst_vq); diff --git a/drivers/soc/mediatek/mtk-mmsys.c b/drivers/soc/mediatek/mtk-mmsys.c index 18f93979e14a..6f9cf7725529 100644 --- a/drivers/soc/mediatek/mtk-mmsys.c +++ b/drivers/soc/mediatek/mtk-mmsys.c @@ -305,6 +305,7 @@ static int mtk_mmsys_probe(struct platform_device *pdev) struct device *dev = &pdev->dev; struct platform_device *clks; struct platform_device *drm; + struct platform_device *mdp; void __iomem *config_regs; int ret; @@ -328,10 +329,27 @@ static int mtk_mmsys_probe(struct platform_device *pdev) PLATFORM_DEVID_AUTO, NULL, 0); if (IS_ERR(drm)) { platform_device_unregister(clks); - return PTR_ERR(drm); + ret = PTR_ERR(drm); + goto err_drm; + } + + mdp = platform_device_register_data(&pdev->dev, "mtk-mdp", + PLATFORM_DEVID_AUTO, NULL, 0); + if (IS_ERR(mdp)) { + ret = PTR_ERR(mdp); + dev_err(dev, "Failed to register mdp: %d\n", ret); + goto err_mdp; } return 0; + +err_mdp: + platform_device_unregister(drm); + +err_drm: + platform_device_unregister(clks); + + return ret; } static const struct of_device_id of_match_mtk_mmsys[] = { -- 2.31.1.498.g6c1eba8ee3d-goog