From patchwork Fri Jun 18 07:52:02 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eizan Miyamoto X-Patchwork-Id: 12330445 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.9 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5B933C48BDF for ; Fri, 18 Jun 2021 07:54:59 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 2AF656120A for ; Fri, 18 Jun 2021 07:54:59 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 2AF656120A Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=chromium.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=SAeYQ/JFm4d7BRIwrSwyJVVQamKBYkQHVNNgZVctVrY=; b=zg1EW2yBkq6E09 yXNIuyAiTbwLuYn9D+Vs2cB4vMEzZrYDhjbRGSAU7rdr4jau1kX6cYNsvd8mEBfo0xyxdcOMm4WvC x79CQgoWKXd0ZuVsNMrlReISmq40IYthZwURnofI4O7/pyGhOWHm/eW2DsajAHTmADjbtaHLCWv4N LhaDOOWo5W1NGK7hAaTcLIotW3EAzp4O2e7CuxyAl6mAk4gdJb55XsVx1etbelG+qki8vYm16B9hk sKYl0osdUIJ3IoNLbDrfuZ39L9IubOf+nplyLsImvIJBUU5ZRO5u/wZh4qPC9iyWJU5Qe/ZnSTwTM VniPG6zh4xo51Odz6ihQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1lu9Iz-00D8iA-1W; Fri, 18 Jun 2021 07:52:45 +0000 Received: from mail-pj1-x1032.google.com ([2607:f8b0:4864:20::1032]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1lu9Im-00D8ee-PO for linux-arm-kernel@lists.infradead.org; Fri, 18 Jun 2021 07:52:36 +0000 Received: by mail-pj1-x1032.google.com with SMTP id o88-20020a17090a0a61b029016eeb2adf66so7420304pjo.4 for ; Fri, 18 Jun 2021 00:52:31 -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=i/gyE+IR6s56zY1lMMCNYWFeGkB2nP+SeR8/rb1tw+M=; b=S1IQatqBsnV4oGOTMjgQh4j4Gumxrj2bWW6CPJDweugo/4N2CoBc5BBe8fffURMWq4 OCVY8u7MHFMucpNz9HPWakEFNAPqJDnDZwUBKUSWPnhQGIeN+qF1kxyj3OjKQLUI4lEz 2vtzlZxOIICLncl8n3zLvrjtuqyiWT/4Z3ib8= 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=i/gyE+IR6s56zY1lMMCNYWFeGkB2nP+SeR8/rb1tw+M=; b=md6h9f6zq8LZeh3WFcFMDu5RFYtlvc9oRkOaRDt9Mto7ZgTbFW8aP/c67u92b8EEni 9toNjiwhktXp+UAKRKpw71zML+x1bwVNiwkxr9mleQFNUVMCRS9t4EOA+mu3jE8GPHxl 9UuMrdI1ZFmYdeftGvYlQtOOYBBcAQ8A7BugXtDdbvzWHQqCrJ+gvqEy/lyBZ5AJ9nYG jXEUk0jBUwek2iV1RSL06XqYGjScb9yFG1kvKWi2FiOsBiliOd5l3SvE5+r8dPi6KdlL zZzSONsaacJEe+rm12QNKAHE4GvZmbSlw5bx+jQpefOC+9qHmswOL+b9I+JYPb18bn55 ODBA== X-Gm-Message-State: AOAM531wzg+erX1/3NoTDX3DtV84qh1tfwsOztTBrW0XFcIYG2azvOPs LwUdlEmKmUQcM2LtlfdrqSop2Q== X-Google-Smtp-Source: ABdhPJy9BswdGM3uJgSvW03FnwKwbBv26/xc67EjixsjIv0FPSYh8pSMGG2WTfBtcqwKSHiI4+fd9w== X-Received: by 2002:a17:902:9f83:b029:f6:5c3c:db03 with SMTP id g3-20020a1709029f83b02900f65c3cdb03mr3587697plq.2.1624002750837; Fri, 18 Jun 2021 00:52:30 -0700 (PDT) Received: from localhost ([2401:fa00:9:14:3e8:19ca:3d8a:e112]) by smtp.gmail.com with UTF8SMTPSA id p26sm2904010pff.64.2021.06.18.00.52.26 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 18 Jun 2021 00:52:30 -0700 (PDT) From: Eizan Miyamoto To: linux-kernel@vger.kernel.org Cc: yong.wu@mediatek.com, houlong.wei@mediatek.com, enric.balletbo@collabora.com, chunkuang.hu@kernel.org, wenst@chromium.org, Eizan Miyamoto , Andrew-CT Chen , 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 v3 1/8] mtk-mdp: add driver to probe mdp components Date: Fri, 18 Jun 2021 17:52:02 +1000 Message-Id: <20210618175059.v3.1.Ie6d1e6e39cf9b5d6b2108ae1096af34c3d55880b@changeid> X-Mailer: git-send-email 2.32.0.288.g62a8d224e6-goog In-Reply-To: <20210618075209.1157766-1-eizan@chromium.org> References: <20210618075209.1157766-1-eizan@chromium.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210618_005232_859712_06D60655 X-CRM114-Status: GOOD ( 40.23 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Broadly, this patch (1) adds a driver for various MTK MDP components to go alongside the main MTK MDP driver, and (2) hooks them all together using the component framework. (1) Up until now, the MTK MDP driver controls 8 devices in the device tree on its own. When running tests for the hardware video decoder, we found that the iommus and LARBs were not being properly configured. To configure them, a driver for each be added to mtk_mdp_comp so that mtk_iommu_add_device() can (eventually) be called from dma_configure() inside really_probe(). (2) The integration into the component framework allows us to defer the registration with the v4l2 subsystem until all the MDP-related devices have been probed, so that the relevant device node does not become available until initialization of all the components is complete. Some notes about how the component framework has been integrated: - The driver for the rdma0 component serves double duty as the "master" (aggregate) driver as well as a component driver. This is a non-ideal compromise until a better solution is developed. This device is differentiated from the rest by checking for a "mediatek,vpu" property in the device node. - The list of mdp components remains hard-coded as mtk_mdp_comp_dt_ids[] in mtk_mdp_core.c, and as mtk_mdp_comp_driver_dt_match[] in mtk_mdp_comp.c. This unfortunate duplication of information is addressed in a following patch in this series. - The component driver calls component_add() for each device that is probed. - In mtk_mdp_probe (the "master" device), we scan the device tree for any matching nodes against mtk_mdp_comp_dt_ids, and add component matches for them. The match criteria is a matching device node pointer. - When the set of components devices that have been probed corresponds with the list that is generated by the "master", the callback to mtk_mdp_master_bind() is made, which then calls the component bind functions. - Inside mtk_mdp_master_bind(), once all the component bind functions have been called, we can then register our device to the v4l2 subsystem. - The call to pm_runtime_enable() in the master device is called after all the components have been registered by their bind() functions called by mtk_mtp_master_bind(). As a result, the list of components will not change while power management callbacks mtk_mdp_suspend()/ resume() are accessing the list of components. Signed-off-by: Eizan Miyamoto --- (no changes since v1) drivers/media/platform/mtk-mdp/mtk_mdp_comp.c | 139 ++++++++++++-- drivers/media/platform/mtk-mdp/mtk_mdp_comp.h | 26 +-- drivers/media/platform/mtk-mdp/mtk_mdp_core.c | 175 +++++++++++++----- drivers/media/platform/mtk-mdp/mtk_mdp_core.h | 1 + 4 files changed, 254 insertions(+), 87 deletions(-) diff --git a/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c b/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c index 1e3833f1c9ae..aced0029b7cd 100644 --- a/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c @@ -5,13 +5,51 @@ */ #include +#include #include -#include +#include #include +#include +#include +#include #include #include "mtk_mdp_comp.h" +#include "mtk_mdp_core.h" + +/** + * enum mtk_mdp_comp_type - the MDP component + * @MTK_MDP_RDMA: Read DMA + * @MTK_MDP_RSZ: Reszer + * @MTK_MDP_WDMA: Write DMA + * @MTK_MDP_WROT: Write DMA with rotation + * @MTK_MDP_COMP_TYPE_MAX: Placeholder for num elems in this enum + */ +enum mtk_mdp_comp_type { + MTK_MDP_RDMA, + MTK_MDP_RSZ, + MTK_MDP_WDMA, + MTK_MDP_WROT, + MTK_MDP_COMP_TYPE_MAX, +}; +static const struct of_device_id mtk_mdp_comp_driver_dt_match[] = { + { + .compatible = "mediatek,mt8173-mdp-rdma", + .data = (void *)MTK_MDP_RDMA + }, { + .compatible = "mediatek,mt8173-mdp-rsz", + .data = (void *)MTK_MDP_RSZ + }, { + .compatible = "mediatek,mt8173-mdp-wdma", + .data = (void *)MTK_MDP_WDMA + }, { + .compatible = "mediatek,mt8173-mdp-wrot", + .data = (void *)MTK_MDP_WROT + }, + { } +}; +MODULE_DEVICE_TABLE(of, mtk_mdp_comp_driver_dt_match); void mtk_mdp_comp_clock_on(struct device *dev, struct mtk_mdp_comp *comp) { @@ -23,8 +61,8 @@ void mtk_mdp_comp_clock_on(struct device *dev, struct mtk_mdp_comp *comp) err = clk_prepare_enable(comp->clk[i]); if (err) dev_err(dev, - "failed to enable clock, err %d. type:%d i:%d\n", - err, comp->type, i); + "failed to enable clock, err %d. i:%d\n", + err, i); } } @@ -39,15 +77,40 @@ void mtk_mdp_comp_clock_off(struct device *dev, struct mtk_mdp_comp *comp) } } -int mtk_mdp_comp_init(struct device *dev, struct device_node *node, - struct mtk_mdp_comp *comp, - enum mtk_mdp_comp_type comp_type) +static int mtk_mdp_comp_bind(struct device *dev, struct device *master, + void *data) +{ + struct mtk_mdp_comp *comp = dev_get_drvdata(dev); + struct mtk_mdp_dev *mdp = data; + + mtk_mdp_register_component(mdp, comp); + + return 0; +} + +static void mtk_mdp_comp_unbind(struct device *dev, struct device *master, + void *data) +{ + struct mtk_mdp_dev *mdp = data; + struct mtk_mdp_comp *comp = dev_get_drvdata(dev); + + mtk_mdp_unregister_component(mdp, comp); +} + +static const struct component_ops mtk_mdp_component_ops = { + .bind = mtk_mdp_comp_bind, + .unbind = mtk_mdp_comp_unbind, +}; + +int mtk_mdp_comp_init(struct mtk_mdp_comp *comp, struct device *dev) { int ret; int i; + struct device_node *node = dev->of_node; + enum mtk_mdp_comp_type comp_type = + (enum mtk_mdp_comp_type)of_device_get_match_data(dev); - comp->dev_node = of_node_get(node); - comp->type = comp_type; + INIT_LIST_HEAD(&comp->node); for (i = 0; i < ARRAY_SIZE(comp->clk); i++) { comp->clk[i] = of_clk_get(node, i); @@ -55,23 +118,69 @@ int mtk_mdp_comp_init(struct device *dev, struct device_node *node, if (PTR_ERR(comp->clk[i]) != -EPROBE_DEFER) dev_err(dev, "Failed to get clock\n"); ret = PTR_ERR(comp->clk[i]); - goto put_dev; + goto err; } /* Only RDMA needs two clocks */ - if (comp->type != MTK_MDP_RDMA) + if (comp_type != MTK_MDP_RDMA) break; } return 0; -put_dev: - of_node_put(comp->dev_node); - +err: return ret; } -void mtk_mdp_comp_deinit(struct device *dev, struct mtk_mdp_comp *comp) +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; + + status = mtk_mdp_comp_init(comp, dev); + if (status) { + dev_err(dev, "Failed to initialize component: %d\n", status); + return status; + } + + dev_set_drvdata(dev, comp); + + return component_add(dev, &mtk_mdp_component_ops); +} + +static int mtk_mdp_comp_remove(struct platform_device *pdev) { - of_node_put(comp->dev_node); + struct device *dev = &pdev->dev; + + component_del(dev, &mtk_mdp_component_ops); + return 0; } + +struct platform_driver mtk_mdp_component_driver = { + .probe = mtk_mdp_comp_probe, + .remove = mtk_mdp_comp_remove, + .driver = { + .name = "mediatek-mdp-comp", + .owner = THIS_MODULE, + .of_match_table = mtk_mdp_comp_driver_dt_match, + }, +}; diff --git a/drivers/media/platform/mtk-mdp/mtk_mdp_comp.h b/drivers/media/platform/mtk-mdp/mtk_mdp_comp.h index 36bc1b8f6222..956d20c01e34 100644 --- a/drivers/media/platform/mtk-mdp/mtk_mdp_comp.h +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_comp.h @@ -7,41 +7,21 @@ #ifndef __MTK_MDP_COMP_H__ #define __MTK_MDP_COMP_H__ -/** - * enum mtk_mdp_comp_type - the MDP component - * @MTK_MDP_RDMA: Read DMA - * @MTK_MDP_RSZ: Riszer - * @MTK_MDP_WDMA: Write DMA - * @MTK_MDP_WROT: Write DMA with rotation - */ -enum mtk_mdp_comp_type { - MTK_MDP_RDMA, - MTK_MDP_RSZ, - MTK_MDP_WDMA, - MTK_MDP_WROT, - MTK_MDP_COMP_TYPE_MAX, -}; - /** * struct mtk_mdp_comp - the MDP's function component data * @node: list node to track sibing MDP components - * @dev_node: component device node * @clk: clocks required for component - * @type: component type */ struct mtk_mdp_comp { struct list_head node; - struct device_node *dev_node; struct clk *clk[2]; - enum mtk_mdp_comp_type type; }; -int mtk_mdp_comp_init(struct device *dev, struct device_node *node, - struct mtk_mdp_comp *comp, - enum mtk_mdp_comp_type comp_type); -void mtk_mdp_comp_deinit(struct device *dev, struct mtk_mdp_comp *comp); +int mtk_mdp_comp_init(struct mtk_mdp_comp *comp, struct device *dev); + void mtk_mdp_comp_clock_on(struct device *dev, struct mtk_mdp_comp *comp); void mtk_mdp_comp_clock_off(struct device *dev, struct mtk_mdp_comp *comp); +extern struct platform_driver mtk_mdp_component_driver; #endif /* __MTK_MDP_COMP_H__ */ diff --git a/drivers/media/platform/mtk-mdp/mtk_mdp_core.c b/drivers/media/platform/mtk-mdp/mtk_mdp_core.c index 70a8eab16863..d79bf7f0031a 100644 --- a/drivers/media/platform/mtk-mdp/mtk_mdp_core.c +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_core.c @@ -6,6 +6,7 @@ */ #include +#include #include #include #include @@ -18,6 +19,7 @@ #include #include +#include "mtk_mdp_comp.h" #include "mtk_mdp_core.h" #include "mtk_mdp_m2m.h" #include "mtk_vpu.h" @@ -31,16 +33,12 @@ module_param(mtk_mdp_dbg_level, int, 0644); static const struct of_device_id mtk_mdp_comp_dt_ids[] = { { .compatible = "mediatek,mt8173-mdp-rdma", - .data = (void *)MTK_MDP_RDMA }, { .compatible = "mediatek,mt8173-mdp-rsz", - .data = (void *)MTK_MDP_RSZ }, { .compatible = "mediatek,mt8173-mdp-wdma", - .data = (void *)MTK_MDP_WDMA }, { .compatible = "mediatek,mt8173-mdp-wrot", - .data = (void *)MTK_MDP_WROT }, { }, }; @@ -90,6 +88,64 @@ static void mtk_mdp_reset_handler(void *priv) queue_work(mdp->wdt_wq, &mdp->wdt_work); } +static int compare_of(struct device *dev, void *data) +{ + return dev->of_node == data; +} + +static void release_of(struct device *dev, void *data) +{ + of_node_put(data); +} + +static int mtk_mdp_master_bind(struct device *dev) +{ + int status; + struct mtk_mdp_dev *mdp = dev_get_drvdata(dev); + + mtk_mdp_register_component(mdp, &mdp->comp_self); + + status = component_bind_all(dev, mdp); + if (status) { + dev_err(dev, "Failed to bind all components: %d\n", status); + goto err_component_bind_all; + } + + status = mtk_mdp_register_m2m_device(mdp); + if (status) { + dev_err(dev, "Failed to register m2m device: %d\n", status); + v4l2_err(&mdp->v4l2_dev, "Failed to init mem2mem device\n"); + goto err_mtk_mdp_register_m2m_device; + } + + pm_runtime_enable(dev); + + return 0; + +err_mtk_mdp_register_m2m_device: + component_unbind_all(dev, mdp); + +err_component_bind_all: + mtk_mdp_unregister_component(mdp, &mdp->comp_self); + + return status; +} + +static void mtk_mdp_master_unbind(struct device *dev) +{ + struct mtk_mdp_dev *mdp = dev_get_drvdata(dev); + + pm_runtime_disable(dev); + mtk_mdp_unregister_m2m_device(mdp); + component_unbind_all(dev, mdp); + mtk_mdp_unregister_component(mdp, &mdp->comp_self); +} + +static const struct component_master_ops mtk_mdp_com_ops = { + .bind = mtk_mdp_master_bind, + .unbind = mtk_mdp_master_unbind, +}; + void mtk_mdp_register_component(struct mtk_mdp_dev *mdp, struct mtk_mdp_comp *comp) { @@ -107,8 +163,8 @@ static int mtk_mdp_probe(struct platform_device *pdev) struct mtk_mdp_dev *mdp; struct device *dev = &pdev->dev; struct device_node *node, *parent; - struct mtk_mdp_comp *comp, *comp_temp; - int ret = 0; + int i, ret = 0; + struct component_match *match = NULL; mdp = devm_kzalloc(dev, sizeof(*mdp), GFP_KERNEL); if (!mdp) @@ -133,36 +189,43 @@ static int mtk_mdp_probe(struct platform_device *pdev) } /* Iterate over sibling MDP function blocks */ + i = 0; for_each_child_of_node(parent, node) { - const struct of_device_id *of_id; - enum mtk_mdp_comp_type comp_type; + struct platform_device *pdev; - of_id = of_match_node(mtk_mdp_comp_dt_ids, node); - if (!of_id) + if (!of_match_node(mtk_mdp_comp_dt_ids, node)) continue; - if (!of_device_is_available(node)) { - dev_err(dev, "Skipping disabled component %pOF\n", - node); + if (!of_device_is_available(node)) continue; - } - comp_type = (enum mtk_mdp_comp_type)of_id->data; - - comp = devm_kzalloc(dev, sizeof(*comp), GFP_KERNEL); - if (!comp) { - ret = -ENOMEM; - of_node_put(node); - goto err_comp; + pdev = of_find_device_by_node(node); + if (!pdev) { + dev_warn(dev, "Unable to find comp device %s\n", + node->full_name); + continue; } - ret = mtk_mdp_comp_init(dev, node, comp, comp_type); - if (ret) { - of_node_put(node); - goto err_comp; + /* + * Do not add a match for my own (rdma0) device node. + * I will be managing it directly instead using comp_self. + */ + if (&pdev->dev != dev) { + dev_dbg(dev, "adding match %d for: %pOF\n", i++, node); + component_match_add_release(dev, &match, release_of, + compare_of, + of_node_get(node)); } + } - mtk_mdp_register_component(mdp, comp); + /* + * 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); @@ -187,18 +250,12 @@ static int mtk_mdp_probe(struct platform_device *pdev) 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); 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_m2m_register; + goto err_wdt_reg; } platform_set_drvdata(pdev, mdp); @@ -206,15 +263,25 @@ static int mtk_mdp_probe(struct platform_device *pdev) 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_m2m_register; + 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"); + goto err_component_master_add; } - pm_runtime_enable(dev); dev_dbg(dev, "mdp-%d registered successfully\n", mdp->id); return 0; -err_m2m_register: +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: @@ -226,11 +293,6 @@ static int mtk_mdp_probe(struct platform_device *pdev) err_alloc_job_wq: err_comp: - list_for_each_entry_safe(comp, comp_temp, &mdp->comp_list, node) { - mtk_mdp_unregister_component(mdp, comp); - mtk_mdp_comp_deinit(dev, comp); - } - dev_dbg(dev, "err %d\n", ret); return ret; } @@ -238,11 +300,10 @@ static int mtk_mdp_probe(struct platform_device *pdev) static int mtk_mdp_remove(struct platform_device *pdev) { struct mtk_mdp_dev *mdp = platform_get_drvdata(pdev); - struct mtk_mdp_comp *comp, *comp_temp; - pm_runtime_disable(&pdev->dev); + component_master_del(&pdev->dev, &mtk_mdp_com_ops); + vb2_dma_contig_clear_max_seg_size(&pdev->dev); - mtk_mdp_unregister_m2m_device(mdp); v4l2_device_unregister(&mdp->v4l2_dev); flush_workqueue(mdp->wdt_wq); @@ -251,10 +312,8 @@ static int mtk_mdp_remove(struct platform_device *pdev) flush_workqueue(mdp->job_wq); destroy_workqueue(mdp->job_wq); - list_for_each_entry_safe(comp, comp_temp, &mdp->comp_list, node) { - mtk_mdp_unregister_component(mdp, comp); - mtk_mdp_comp_deinit(&pdev->dev, comp); - } + if (!list_empty(&mdp->comp_list)) + dev_err(&pdev->dev, "not all components removed\n"); dev_dbg(&pdev->dev, "%s driver unloaded\n", pdev->name); return 0; @@ -309,7 +368,25 @@ static struct platform_driver mtk_mdp_driver = { } }; -module_platform_driver(mtk_mdp_driver); +static struct platform_driver * const mtk_mdp_drivers[] = { + &mtk_mdp_driver, + &mtk_mdp_component_driver, +}; + +static int __init mtk_mdp_init(void) +{ + return platform_register_drivers(mtk_mdp_drivers, + ARRAY_SIZE(mtk_mdp_drivers)); +} + +static void __exit mtk_mdp_exit(void) +{ + platform_unregister_drivers(mtk_mdp_drivers, + ARRAY_SIZE(mtk_mdp_drivers)); +} + +module_init(mtk_mdp_init); +module_exit(mtk_mdp_exit); MODULE_AUTHOR("Houlong Wei "); MODULE_DESCRIPTION("Mediatek image processor driver"); diff --git a/drivers/media/platform/mtk-mdp/mtk_mdp_core.h b/drivers/media/platform/mtk-mdp/mtk_mdp_core.h index a7da14b97077..230f531400ca 100644 --- a/drivers/media/platform/mtk-mdp/mtk_mdp_core.h +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_core.h @@ -155,6 +155,7 @@ struct mtk_mdp_dev { struct mtk_mdp_variant *variant; u16 id; struct list_head comp_list; + struct mtk_mdp_comp comp_self; struct v4l2_m2m_dev *m2m_dev; struct list_head ctx_list; struct video_device *vdev; From patchwork Fri Jun 18 07:52:03 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eizan Miyamoto X-Patchwork-Id: 12330447 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.9 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id CB6BBC48BDF for ; Fri, 18 Jun 2021 07:55:22 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 9B5DD61396 for ; Fri, 18 Jun 2021 07:55:22 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 9B5DD61396 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=chromium.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=WCd1vwd9fmQnY4MlKlYZfs0fl+5nhen49137V0CpcPU=; b=XLRBP157wGro60 NdbulMkfQI4BfhMjzlE8d2ZnGLl45DEvxkCoiN8xBsLbi0U0Lly71Mw3CyZknDZuQWfB0ubM4QWSM aK/2IUfDtRWYtLTkIVctj+1r5Cs4DS/7auxfw/u1OgFjmhaD+jvPcKHmx0QNfHkxv8iZk/0BWFCFj oi1eqk77t8KX4t82xIKG1ruwS0mcJ4/AycWuzpPcoumgZ+5wuONMU3w3V5RcdH9Vl4XTNDSwvDNFv 5IhtIdts2PWxI2ZHuTwxD3HHaBC0QOW+/NgoXCMGY/4KS5PuVUm7674OFDilav6bHMWA9gvOE4Vln U73qSm3f92XFRIh+87vg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1lu9JR-00D8up-NT; Fri, 18 Jun 2021 07:53:14 +0000 Received: from mail-pj1-x102e.google.com ([2607:f8b0:4864:20::102e]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1lu9It-00D8gP-5W for linux-arm-kernel@lists.infradead.org; Fri, 18 Jun 2021 07:52:41 +0000 Received: by mail-pj1-x102e.google.com with SMTP id t19-20020a17090ae513b029016f66a73701so260914pjy.3 for ; Fri, 18 Jun 2021 00:52:38 -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=E2/XL5tq2Hcv7mIY83UW91knd3J3s5ZhjuCcYvSa7WQ=; b=Sy4VWbQBWyfAZD882ua7QB60gv52suGM5wA+MTdeyt8jrhoTmJV+OLD/EpaApD+9d0 UbDomOuvVqZbGGsvKBx7XP2V/mXe9Sx3XK0hP53Z0HRfr7c5HLRGz/ruVqquoqW1s1OO cs8l3zKbYVGoYBomU+EKESyzYknEVlVMLC7js= 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=E2/XL5tq2Hcv7mIY83UW91knd3J3s5ZhjuCcYvSa7WQ=; b=fsPLHMsQDtkIhfr2WkMg+07yxzg11ZAIyacxSXwiNhBa6k+ZsfiPKrPM28OCnZiufk lqYXLl/eHJYC4DMeSI8e6g+IWR5Dty16LyLkqSbDm1c7u0L/VsmAZOlOUcK0D4eXw4TJ SWOlW6gfZz7T4rmYb53N6Qqfwu1GERA8l93Whl8GYZ1uai9ULf7R+SxWCHnhPAmNqBD1 CHXIwsf68m9EFMMyOZ50Uo9opGuvdT9F4bRcUp7r7CYOUaIPhvoWYjzY5GjwcE2JVEgS MtFKvPQP1bW7uSM4zlilwoBJrBTmAjxpw4S3q9RJXpHLyIMEX2hd6brPi7jInTblc4FT vivA== X-Gm-Message-State: AOAM530cNHCDrhy/zyHnLFcnZk2B919Z3LqhM1CqVmRihBLDY5u0x9YT LQNrIpTEue7KhZJ0OBLRkqEyyg== X-Google-Smtp-Source: ABdhPJygzvW6ybvx4M9AYprO8tG1mLj+0bWTOj97Kfvpknqlnl6Vw5kgFu9iDCml0RlBSyYoPBLEuQ== X-Received: by 2002:a17:902:6847:b029:11e:b703:83f9 with SMTP id f7-20020a1709026847b029011eb70383f9mr3670198pln.47.1624002758035; Fri, 18 Jun 2021 00:52:38 -0700 (PDT) Received: from localhost ([2401:fa00:9:14:3e8:19ca:3d8a:e112]) by smtp.gmail.com with UTF8SMTPSA id t2sm4456065pjj.19.2021.06.18.00.52.33 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 18 Jun 2021 00:52:37 -0700 (PDT) From: Eizan Miyamoto To: linux-kernel@vger.kernel.org Cc: yong.wu@mediatek.com, houlong.wei@mediatek.com, enric.balletbo@collabora.com, chunkuang.hu@kernel.org, wenst@chromium.org, Eizan Miyamoto , Andrew-CT Chen , 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 v3 2/8] mtk-mdp: use pm_runtime in MDP component driver Date: Fri, 18 Jun 2021 17:52:03 +1000 Message-Id: <20210618175059.v3.2.I909f5375d930f5d0cc877128e30e2a67078b674c@changeid> X-Mailer: git-send-email 2.32.0.288.g62a8d224e6-goog In-Reply-To: <20210618075209.1157766-1-eizan@chromium.org> References: <20210618075209.1157766-1-eizan@chromium.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210618_005239_284125_BAD5536C X-CRM114-Status: GOOD ( 24.35 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Without this change, the MDP components are not fully integrated into the runtime power management subsystem, and the MDP driver does not work. For each of the component device drivers to be able to call pm_runtime_get/put_sync() a pointer to the component's device struct had to be added to struct mtk_mdp_comp, set by mtk_mdp_comp_init(). Note that the dev argument to mtk_mdp_comp_clock_on/off() has been removed. Those functions used to be called from the "master" mdp driver in mtk_mdp_core.c, but the component's device pointer no longer corresponds to the mdp master device pointer, which is not the right device to pass to pm_runtime_put/get_sync() which we had to add to get the driver to work properly. Signed-off-by: Eizan Miyamoto --- (no changes since v1) drivers/media/platform/mtk-mdp/mtk_mdp_comp.c | 21 ++++++++++++++----- drivers/media/platform/mtk-mdp/mtk_mdp_comp.h | 6 ++++-- drivers/media/platform/mtk-mdp/mtk_mdp_core.c | 6 ++---- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c b/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c index aced0029b7cd..8cebc3565826 100644 --- a/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c @@ -13,6 +13,8 @@ #include #include #include +#include +#include #include "mtk_mdp_comp.h" #include "mtk_mdp_core.h" @@ -51,22 +53,26 @@ static const struct of_device_id mtk_mdp_comp_driver_dt_match[] = { }; MODULE_DEVICE_TABLE(of, mtk_mdp_comp_driver_dt_match); -void mtk_mdp_comp_clock_on(struct device *dev, struct mtk_mdp_comp *comp) +void mtk_mdp_comp_clock_on(struct mtk_mdp_comp *comp) { int i, err; + err = pm_runtime_get_sync(comp->dev); + if (err < 0) + dev_err(comp->dev, + "failed to runtime get, err %d.\n", + err); + for (i = 0; i < ARRAY_SIZE(comp->clk); i++) { if (IS_ERR(comp->clk[i])) continue; err = clk_prepare_enable(comp->clk[i]); if (err) - dev_err(dev, - "failed to enable clock, err %d. i:%d\n", - err, i); + dev_err(comp->dev, "failed to enable clock, err %d. i:%d\n", err, i); } } -void mtk_mdp_comp_clock_off(struct device *dev, struct mtk_mdp_comp *comp) +void mtk_mdp_comp_clock_off(struct mtk_mdp_comp *comp) { int i; @@ -75,6 +81,8 @@ void mtk_mdp_comp_clock_off(struct device *dev, struct mtk_mdp_comp *comp) continue; clk_disable_unprepare(comp->clk[i]); } + + pm_runtime_put_sync(comp->dev); } static int mtk_mdp_comp_bind(struct device *dev, struct device *master, @@ -84,6 +92,7 @@ static int mtk_mdp_comp_bind(struct device *dev, struct device *master, struct mtk_mdp_dev *mdp = data; mtk_mdp_register_component(mdp, comp); + pm_runtime_enable(dev); return 0; } @@ -94,6 +103,7 @@ static void mtk_mdp_comp_unbind(struct device *dev, struct device *master, struct mtk_mdp_dev *mdp = data; struct mtk_mdp_comp *comp = dev_get_drvdata(dev); + pm_runtime_disable(dev); mtk_mdp_unregister_component(mdp, comp); } @@ -111,6 +121,7 @@ int mtk_mdp_comp_init(struct mtk_mdp_comp *comp, struct device *dev) (enum mtk_mdp_comp_type)of_device_get_match_data(dev); INIT_LIST_HEAD(&comp->node); + comp->dev = dev; for (i = 0; i < ARRAY_SIZE(comp->clk); i++) { comp->clk[i] = of_clk_get(node, i); diff --git a/drivers/media/platform/mtk-mdp/mtk_mdp_comp.h b/drivers/media/platform/mtk-mdp/mtk_mdp_comp.h index 956d20c01e34..355e226d74fe 100644 --- a/drivers/media/platform/mtk-mdp/mtk_mdp_comp.h +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_comp.h @@ -11,16 +11,18 @@ * struct mtk_mdp_comp - the MDP's function component data * @node: list node to track sibing MDP components * @clk: clocks required for component + * @dev: component's device */ struct mtk_mdp_comp { struct list_head node; struct clk *clk[2]; + struct device *dev; }; int mtk_mdp_comp_init(struct mtk_mdp_comp *comp, struct device *dev); -void mtk_mdp_comp_clock_on(struct device *dev, struct mtk_mdp_comp *comp); -void mtk_mdp_comp_clock_off(struct device *dev, struct mtk_mdp_comp *comp); +void mtk_mdp_comp_clock_on(struct mtk_mdp_comp *comp); +void mtk_mdp_comp_clock_off(struct mtk_mdp_comp *comp); extern struct platform_driver mtk_mdp_component_driver; diff --git a/drivers/media/platform/mtk-mdp/mtk_mdp_core.c b/drivers/media/platform/mtk-mdp/mtk_mdp_core.c index d79bf7f0031a..c55bcfe4cbb7 100644 --- a/drivers/media/platform/mtk-mdp/mtk_mdp_core.c +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_core.c @@ -51,20 +51,18 @@ MODULE_DEVICE_TABLE(of, mtk_mdp_of_ids); static void mtk_mdp_clock_on(struct mtk_mdp_dev *mdp) { - struct device *dev = &mdp->pdev->dev; struct mtk_mdp_comp *comp_node; list_for_each_entry(comp_node, &mdp->comp_list, node) - mtk_mdp_comp_clock_on(dev, comp_node); + mtk_mdp_comp_clock_on(comp_node); } static void mtk_mdp_clock_off(struct mtk_mdp_dev *mdp) { - struct device *dev = &mdp->pdev->dev; struct mtk_mdp_comp *comp_node; list_for_each_entry(comp_node, &mdp->comp_list, node) - mtk_mdp_comp_clock_off(dev, comp_node); + mtk_mdp_comp_clock_off(comp_node); } static void mtk_mdp_wdt_worker(struct work_struct *work) From patchwork Fri Jun 18 07:52:04 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eizan Miyamoto X-Patchwork-Id: 12330449 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.9 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2B2AFC48BE8 for ; Fri, 18 Jun 2021 07:55:42 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id E8BB16120A for ; Fri, 18 Jun 2021 07:55:41 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org E8BB16120A Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=chromium.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=xby0CeYYj2T0jMKo9Qo2cgvmtSkarNRtS86CDT9UkHE=; b=z7W+izyYonV1UL p5PzQXAU8oIPyEDbqUgFFvVpa+ivhCGcunXg7md/KReNZjDTHdor0CO8ARV374zod4HrXLZruG2wu pptwm8MBzUVUJOqaHdUCNtY/fSez6+gQNFSTfxBz31RJu/MnsuM0dfrN49mCoubxJ9h6MOlB8FmCc xkpYF8/JeeRlpuFOdi7seZdGOxZH1k41OSusySe1i8TuV+zblmpwUmGJe/j8uH6nFzewo3pcV4gej D+71RuXQi/NI7qPXX9QxdyC2E3YUgd22qjwUgfuwBgc4x2b5592BLIxQyIBWDZjeeHIB/p9vcaxcl hPmVqaIZ62971Ua4X38g==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1lu9Ju-00D9Bt-LC; Fri, 18 Jun 2021 07:53:42 +0000 Received: from mail-pg1-x530.google.com ([2607:f8b0:4864:20::530]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1lu9J0-00D8in-Q0 for linux-arm-kernel@lists.infradead.org; Fri, 18 Jun 2021 07:52:50 +0000 Received: by mail-pg1-x530.google.com with SMTP id t13so7109372pgu.11 for ; Fri, 18 Jun 2021 00:52:46 -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=I2TBvKyJlK7P3ijJk5dxGj1vYNvGN7FjI2WrlbeTQp8=; b=eMZu6wrUEM2H0nZIGcgrEyk1YXLO8EqaPDMOH9hJ3BXFw4Y9ljj22g0JfAFy8IHPB4 HStLkEWieoih66ftzSo94nVRSju4Kycdmf6FdblYVoUHNLWk0+hThoHj0LvxrTMHcY4n 06ZxxI1f4y382fa3AqLEkuZP4bGmyYIqk/BT8= 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=I2TBvKyJlK7P3ijJk5dxGj1vYNvGN7FjI2WrlbeTQp8=; b=XLZmcQC0qtcydBXI9kxc6572B9cZ4QU2KSFuNJCcrtXBmaQIeIGNgfoD/3+1U6qAnv R4AUbqOcDbfJGIioR6jkkNVr1yFS1nS94nO+W9iIbgzOWa3CgrIBbXWpCOUZekM0lpzt z9W3f3QtV2vsG9z5S9an4V9jEdBaw5Bd12vIejMHlNIJHTFQOhy3THLgQa9gbTePvzC4 axuWftQ9709IYnZ4gJ2k7qq5Xwhsj8wvfZH5JqoI8wu2VylwK2qosDT3gKSB3r8e+XhU WCrsPo0TYg3J94UtLc+ft4fbx+0D/J5eAdT+FELtvRxXDoCdeqZ1KcEK0z6PXipUiPxT 6JKQ== X-Gm-Message-State: AOAM530hlvAurykl+xvFMfcoIN1Nqb/oaBgtPf/kk45k4NLvI9NCh50z RVLoxOa2GCiBgtPXnHIwiPIBsg== X-Google-Smtp-Source: ABdhPJxx96d41sKjQw6hvoWs0E8mik5It2Ke92EOv9u55fbueLbCGo6bzy3/UVvH61VFdw04LT5SqQ== X-Received: by 2002:a63:ef04:: with SMTP id u4mr8673442pgh.429.1624002765670; Fri, 18 Jun 2021 00:52:45 -0700 (PDT) Received: from localhost ([2401:fa00:9:14:3e8:19ca:3d8a:e112]) by smtp.gmail.com with UTF8SMTPSA id o16sm6718083pfu.75.2021.06.18.00.52.41 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 18 Jun 2021 00:52:45 -0700 (PDT) From: Eizan Miyamoto To: linux-kernel@vger.kernel.org Cc: yong.wu@mediatek.com, houlong.wei@mediatek.com, enric.balletbo@collabora.com, chunkuang.hu@kernel.org, wenst@chromium.org, Eizan Miyamoto , Andrew-CT Chen , 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 v3 3/8] media: mtk-mdp: don't pm_run_time_get/put for master comp in clock_on Date: Fri, 18 Jun 2021 17:52:04 +1000 Message-Id: <20210618175059.v3.3.Ifd87681955689a08cce4c65e72ee5e8c6d09af95@changeid> X-Mailer: git-send-email 2.32.0.288.g62a8d224e6-goog In-Reply-To: <20210618075209.1157766-1-eizan@chromium.org> References: <20210618075209.1157766-1-eizan@chromium.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210618_005246_901345_762AED3C X-CRM114-Status: GOOD ( 24.64 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org The original intent of commit 86698b9505bbc ("media: mtk-mdp: convert mtk_mdp_dev.comp array to list") was to create a list to track all the MDP components that needed to have their clocks enabled/disabled when calling mtk_mdp_comp_clock_on/off. However, there was a bug inside mtk_mdp_register_component where the args to a call to list_add were swapped. The result is that only one component was added to mtk_mdp_dev.comp_list because comp_list was instead being repeatedly added to the single element lists headed by each mtk_mdp_comp. The order of the args to list_add in mtk_mdp_register_component was fixed in https://patchwork.kernel.org/patch/11742895/ (Fix Null pointer dereference when calling list_add). Then, as a result of https://patchwork.kernel.org/patch/11530769/ (mtk-mdp: use pm_runtime in MDP component driver) if all the components are added to the component list, the mdp "master" / rdma0 component ends up having pm_runtime_get_sync() called on it twice recursively: rpm_resume+0x694/0x8f8 __pm_runtime_resume+0x7c/0xa0 ***NOTE*** mtk_mdp_comp_clock_on+0x48/0x104 [mtk_mdp] mtk_mdp_pm_resume+0x2c/0x44 [mtk_mdp] pm_generic_runtime_resume+0x34/0x48 __genpd_runtime_resume+0x6c/0x80 genpd_runtime_resume+0x104/0x1ac __rpm_callback+0x120/0x238 rpm_callback+0x34/0x8c rpm_resume+0x7a0/0x8f8 __pm_runtime_resume+0x7c/0xa0 ***NOTE*** mtk_mdp_m2m_start_streaming+0x2c/0x3c [mtk_mdp] (The calls to pm_runtime_get_sync are inlined and correspond to the calls to __pm_runtime_resume). It is not correct to have pm_runtime_get_sync called recursively and the second call will block indefinitely. As a result of all that, this change factors mtk_mdp_comp_clock_on/off into mtk_mdp_comp_power_on/off and moves the calls to pm_runtime_get/put into the power_on/off functions. This change then special-cases the master/rdma0 MDP component and does these things: - the master/rdma0 component is not added to mtk_mdp_dev.comp_list - the master/rdma0 component has its clocks (*but not power*) toggled by mtk_mpd_comp_clock_on/off inside mtk_mdp_clock_on/off. - the other components have their clocks *and* power toggled with mtk_mdp_comp_power_on/off. This change introduces the assumption that mtk_mdp_pm_resume will always be called though a callback from pm_runtime_get_sync made on the master / rdma0 component. Signed-off-by: Eizan Miyamoto --- (no changes since v1) drivers/media/platform/mtk-mdp/mtk_mdp_comp.c | 28 ++++++++++++++----- drivers/media/platform/mtk-mdp/mtk_mdp_comp.h | 3 ++ drivers/media/platform/mtk-mdp/mtk_mdp_core.c | 23 ++++++++++----- 3 files changed, 40 insertions(+), 14 deletions(-) diff --git a/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c b/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c index 8cebc3565826..9a12717ce416 100644 --- a/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c @@ -53,15 +53,31 @@ static const struct of_device_id mtk_mdp_comp_driver_dt_match[] = { }; MODULE_DEVICE_TABLE(of, mtk_mdp_comp_driver_dt_match); -void mtk_mdp_comp_clock_on(struct mtk_mdp_comp *comp) +void mtk_mdp_comp_power_on(struct mtk_mdp_comp *comp) { - int i, err; + int err; err = pm_runtime_get_sync(comp->dev); if (err < 0) - dev_err(comp->dev, - "failed to runtime get, err %d.\n", - err); + dev_err(comp->dev, "failed to runtime get, err %d.\n", err); + + mtk_mdp_comp_clock_on(comp); +} + +void mtk_mdp_comp_power_off(struct mtk_mdp_comp *comp) +{ + int err; + + mtk_mdp_comp_clock_off(comp); + + err = pm_runtime_put_sync(comp->dev); + if (err < 0) + dev_err(comp->dev, "failed to runtime put, err %d.\n", err); +} + +void mtk_mdp_comp_clock_on(struct mtk_mdp_comp *comp) +{ + int i, err; for (i = 0; i < ARRAY_SIZE(comp->clk); i++) { if (IS_ERR(comp->clk[i])) @@ -81,8 +97,6 @@ void mtk_mdp_comp_clock_off(struct mtk_mdp_comp *comp) continue; clk_disable_unprepare(comp->clk[i]); } - - pm_runtime_put_sync(comp->dev); } static int mtk_mdp_comp_bind(struct device *dev, struct device *master, diff --git a/drivers/media/platform/mtk-mdp/mtk_mdp_comp.h b/drivers/media/platform/mtk-mdp/mtk_mdp_comp.h index 355e226d74fe..7ad9b06bb11b 100644 --- a/drivers/media/platform/mtk-mdp/mtk_mdp_comp.h +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_comp.h @@ -21,6 +21,9 @@ struct mtk_mdp_comp { int mtk_mdp_comp_init(struct mtk_mdp_comp *comp, struct device *dev); +void mtk_mdp_comp_power_on(struct mtk_mdp_comp *comp); +void mtk_mdp_comp_power_off(struct mtk_mdp_comp *comp); + void mtk_mdp_comp_clock_on(struct mtk_mdp_comp *comp); void mtk_mdp_comp_clock_off(struct mtk_mdp_comp *comp); diff --git a/drivers/media/platform/mtk-mdp/mtk_mdp_core.c b/drivers/media/platform/mtk-mdp/mtk_mdp_core.c index c55bcfe4cbb7..5e71496e2517 100644 --- a/drivers/media/platform/mtk-mdp/mtk_mdp_core.c +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_core.c @@ -53,8 +53,15 @@ static void mtk_mdp_clock_on(struct mtk_mdp_dev *mdp) { struct mtk_mdp_comp *comp_node; + /* + * The master / rdma0 component will have pm_runtime_get_sync called + * on it through mtk_mdp_m2m_start_streaming, making it unnecessary to + * have mtk_mdp_comp_power_on called on it. + */ + mtk_mdp_comp_clock_on(&mdp->comp_self); + list_for_each_entry(comp_node, &mdp->comp_list, node) - mtk_mdp_comp_clock_on(comp_node); + mtk_mdp_comp_power_on(comp_node); } static void mtk_mdp_clock_off(struct mtk_mdp_dev *mdp) @@ -62,7 +69,14 @@ static void mtk_mdp_clock_off(struct mtk_mdp_dev *mdp) struct mtk_mdp_comp *comp_node; list_for_each_entry(comp_node, &mdp->comp_list, node) - mtk_mdp_comp_clock_off(comp_node); + mtk_mdp_comp_power_off(comp_node); + + /* + * The master / rdma0 component will have pm_runtime_put called + * on it through mtk_mdp_m2m_stop_streaming, making it unnecessary to + * have mtk_mdp_comp_power_off called on it. + */ + mtk_mdp_comp_clock_off(&mdp->comp_self); } static void mtk_mdp_wdt_worker(struct work_struct *work) @@ -101,8 +115,6 @@ static int mtk_mdp_master_bind(struct device *dev) int status; struct mtk_mdp_dev *mdp = dev_get_drvdata(dev); - mtk_mdp_register_component(mdp, &mdp->comp_self); - status = component_bind_all(dev, mdp); if (status) { dev_err(dev, "Failed to bind all components: %d\n", status); @@ -124,8 +136,6 @@ static int mtk_mdp_master_bind(struct device *dev) component_unbind_all(dev, mdp); err_component_bind_all: - mtk_mdp_unregister_component(mdp, &mdp->comp_self); - return status; } @@ -136,7 +146,6 @@ static void mtk_mdp_master_unbind(struct device *dev) pm_runtime_disable(dev); mtk_mdp_unregister_m2m_device(mdp); component_unbind_all(dev, mdp); - mtk_mdp_unregister_component(mdp, &mdp->comp_self); } static const struct component_master_ops mtk_mdp_com_ops = { From patchwork Fri Jun 18 07:52:05 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eizan Miyamoto X-Patchwork-Id: 12330451 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.9 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 63A27C48BDF for ; Fri, 18 Jun 2021 07:56:19 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 2C8C561396 for ; Fri, 18 Jun 2021 07:56:19 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 2C8C561396 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=chromium.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=iKeBdwhKq8Hg462GBgkYqOdAWyDhmrC7v3WBeprySZU=; b=E/PzdjOTp9jxqK sbS5KLJl26l+pvEyUXppOgJY3kHc3kYamc5OyTaXo8RH+7zhbaVZHLh/C1Ufnofer2JUQrgRxv+yd f7QfoiOToJvLrruN849hoQEH2JMJqFqiKx+E266dQGfre4L/H2+s/+ACZmqAYhTkPjXS0Y55obpgS 6Ij8YMN53IkpSxI4+/ZdIoRdT5YYtHWcCAFawNozath9W5fErM1hFzJ63duv/ijl11S7heO8UHiw1 DrK7mPQQIkLmgnbBeU7kaixCCOH+/62kiDddlYGhNxRw8q6cuYJ+AKdN0JY5TuiV/jWx969ft5IZb cAWq1QT30c9GNKkX1Daw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1lu9KA-00D9K8-5C; Fri, 18 Jun 2021 07:53:58 +0000 Received: from mail-pg1-x52d.google.com ([2607:f8b0:4864:20::52d]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1lu9J7-00D8lg-Uf for linux-arm-kernel@lists.infradead.org; Fri, 18 Jun 2021 07:52:56 +0000 Received: by mail-pg1-x52d.google.com with SMTP id t13so7109627pgu.11 for ; Fri, 18 Jun 2021 00:52:53 -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=L8OKyprPY2rDRqkqLmM7d7WYdlS5t72c+nsxNHtoU2E=; b=iyzQ3QQwM0R7ZeqEnegewwLjDYcDYOEH2bXGWWM3zne3XkEYPfXtWFxCJmeBKxh+6F v5+QuZck+gF4q6rV5w+wuCKnQGDSmrKj5B8vSTV5Kr7/FO3DkGmG5T0WWYmmxPoXbIm1 RlHUUyoOn3sp10iUOhfSG0tZWNeM3k0FEDjww= 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=L8OKyprPY2rDRqkqLmM7d7WYdlS5t72c+nsxNHtoU2E=; b=jox8tr0S1c8isBTCbkLBcnqngrdHJLiKXQ4kB8LA6BN4j+FontUDhy9lJqmDQ4EqwW 904/uO9JwAW7ySB4cqzhcUsrgh0PWhhL9v5rbJiJrdnN3CGvUnvl71nXj1DFYt8xDPc6 6LN2suwEStX1fD2TieI6FeXblxuOV6yncsOz/lsxL3HvvyfCKRmSydJXBSyZciH4YFl7 YkL5D7k6sHZck+S1o9K+PQX9aQmR/zjDU9hlefl0jLVce8wf4hWCnwk5AYw62ucW5vMA cbiyoakjOZnMZ5YxP+RCI+kIek6VyAR9b2KAmVp5GZEvEJpv+tkH2MC4rXusDpRFG7c0 O/tw== X-Gm-Message-State: AOAM5308bq5gDsoE38bbouFcx++T8l/7U35CMl3zvEckN4E4zdoZVpBN kBklhVlwOnxYvQMzW+H6EcTnBQ== X-Google-Smtp-Source: ABdhPJx53XMVqGMgoUjueP0KEUl61V76I4GK2OfAUIShXER+0Jjv5ntmNXqfV26D6KRNE/rhqocVjA== X-Received: by 2002:a05:6a00:24c1:b029:300:5de4:5907 with SMTP id d1-20020a056a0024c1b02903005de45907mr917987pfv.56.1624002772810; Fri, 18 Jun 2021 00:52:52 -0700 (PDT) Received: from localhost ([2401:fa00:9:14:3e8:19ca:3d8a:e112]) by smtp.gmail.com with UTF8SMTPSA id t1sm6924233pfe.61.2021.06.18.00.52.48 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 18 Jun 2021 00:52:52 -0700 (PDT) From: Eizan Miyamoto To: linux-kernel@vger.kernel.org Cc: yong.wu@mediatek.com, houlong.wei@mediatek.com, enric.balletbo@collabora.com, chunkuang.hu@kernel.org, wenst@chromium.org, Eizan Miyamoto , Andrew-CT Chen , 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 v3 4/8] mtk-mdp: soc: mediatek: register mdp from mmsys Date: Fri, 18 Jun 2021 17:52:05 +1000 Message-Id: <20210618175059.v3.4.I1245257d5a940967f51caaaee30259bfc034c786@changeid> X-Mailer: git-send-email 2.32.0.288.g62a8d224e6-goog In-Reply-To: <20210618075209.1157766-1-eizan@chromium.org> References: <20210618075209.1157766-1-eizan@chromium.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210618_005254_020986_C2F26A37 X-CRM114-Status: GOOD ( 36.52 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.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. (am from https://patchwork.kernel.org/patch/12195523/) (also found at https://lore.kernel.org/r/20210410091128.31823-15-yong.wu@mediatek.com) Conflicts: drivers/memory/mtk-smi.c Signed-off-by: Eizan Miyamoto (am from https://patchwork.kernel.org/patch/12195507/) (also found at https://lore.kernel.org/r/20210410091128.31823-13-yong.wu@mediatek.com) (am from https://patchwork.kernel.org/patch/12195485/) (also found at https://lore.kernel.org/r/20210410091128.31823-5-yong.wu@mediatek.com) Conflicts: drivers/memory/mtk-smi.c (am from https://patchwork.kernel.org/patch/12195481/) (also found at https://lore.kernel.org/r/20210410091128.31823-3-yong.wu@mediatek.com) (am from https://patchwork.kernel.org/patch/12195479/) (also found at https://lore.kernel.org/r/20210410091128.31823-2-yong.wu@mediatek.com) (am from https://patchwork.kernel.org/patch/12195479/) (also found at https://lore.kernel.org/r/20210410091128.31823-2-yong.wu@mediatek.com) --- Changes in v3: - get mdp master from aliases instead of strcmp against of_node->name Changes in v2: - rebased onto Linux 5.12 - 100 char line length allowance was utilized in a few places - Removal of a redundant dev_err() print at the end of mtk_mdp_comp_init() - Instead of printing errors and ignoring them, I've added a patch to correctly propagate them. - Use of C style comments. - Three additional patches were added to eliminate dependency on the mediatek,vpu property inside the mdp_rdma0 device node. drivers/media/platform/mtk-mdp/mtk_mdp_comp.c | 51 ++++++++++----- 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, 79 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 9a12717ce416..fdbb46a5330a 100644 --- a/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c @@ -104,8 +104,45 @@ 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; @@ -160,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..267e4cb4bf32 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 93c9df15084a..a7051d48ea32 100644 --- a/drivers/media/platform/mtk-mdp/mtk_mdp_m2m.c +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_m2m.c @@ -929,7 +929,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); @@ -944,7 +944,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 79e55150210e..e518ea5d0694 100644 --- a/drivers/soc/mediatek/mtk-mmsys.c +++ b/drivers/soc/mediatek/mtk-mmsys.c @@ -90,6 +90,7 @@ static int mtk_mmsys_probe(struct platform_device *pdev) struct platform_device *clks; struct platform_device *drm; struct mtk_mmsys *mmsys; + struct platform_device *mdp; int ret; mmsys = devm_kzalloc(dev, sizeof(*mmsys), GFP_KERNEL); @@ -115,10 +116,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[] = { From patchwork Fri Jun 18 07:52:06 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eizan Miyamoto X-Patchwork-Id: 12330453 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.9 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 21394C48BDF for ; Fri, 18 Jun 2021 07:56:54 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id D62E46101A for ; Fri, 18 Jun 2021 07:56:53 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org D62E46101A Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=chromium.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=sr58y1biAntMXDeAdl5xq3TJqJrpfBl/G65iH43MZXU=; b=Ek69O10E/4CqQs SNjRchkAxVPtqvjzymVJGIQWiRAGMRZQaGslgv4hwcD9qFwqKtG1n9Zn4Rhu6+KmnN70rymSDUTcb kNkzhsi/qeX4vba/MYsOEzWV/YejhENNLyk6/tsPeeuBwgXGUyyVk8yUk3GtX1OC1Mylknmo3c8xe xoCwVLsTsxo5BjXt8GfyE4otTHALkGFucn1zRZIR1bAgJ7X4dKI1JgnZ0qkXg6fgZWtl/NFFbG1zM 5M+5S1IkCFpk/pELHNk0xP4ua9y55cFQ9q6eVMU/uA29TtGCO3012VeFcjIDCcgVaCpIRO5qN6HtL 7+wBLm6RtLZKqMC7Aoug==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1lu9Kg-00D9Zb-Ia; Fri, 18 Jun 2021 07:54:30 +0000 Received: from mail-pf1-x42a.google.com ([2607:f8b0:4864:20::42a]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1lu9JF-00D8qE-F7 for linux-arm-kernel@lists.infradead.org; Fri, 18 Jun 2021 07:53:03 +0000 Received: by mail-pf1-x42a.google.com with SMTP id x16so7043537pfa.13 for ; Fri, 18 Jun 2021 00:53:00 -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=Zi7IELJ4JOaUAbM1DjeUA9NzNlwKb+WJHoeuipTJh1o=; b=btun3AMrfxJb7yR0q11FW27P6OLfmnJTdE6FEJ/f7vf4QAzRSqgVq9YBsqGk3LsxAC Bdk376B3bKNBrW3bVAsxL9TlUyX6u8I7afAdAxb0lASCoBaj+uXQa2I8yZbVUZIOKuKr bjxB7Dz6DtX4UnCd+U/Thfo2RNRkYuOpEwn/g= 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=Zi7IELJ4JOaUAbM1DjeUA9NzNlwKb+WJHoeuipTJh1o=; b=IA0QAb9wlqX4NkuvE6E13QiSrycV4TSLttSDBwLtl5dQmmOeE9F1RmruxYaLQA+hmx TR53+GmjHhFZU7qgbpYBBIi6nCqW3Y4eYgxXpGX4Qbik+VALGJEQ9GKV4revHSV6BaD+ 80r8JBetp8yScVptsWp5TQUqMhpcGPlyf0yy615eEu0ilbSATiOZVnOo1cBPbjyVaZUm bqBry3LV1l5kKAB5bnTdanlYXY4A3gJWhAiuYVCGMjIglxfIJipPFaByJfaTbhIKhp4c pOIrExtnwnioOIkqfg5lHJMuVbkDi9/HWyUmbFJ2VX/6BDOf0gA9aFKhmBAqVBSu2H3S ptDw== X-Gm-Message-State: AOAM5322MCKA+jJaArhFzoQ5FwL17u6btjA7jEnrxW7cw7aGpmc1ktnN wMkSjVmkEzqdGQiquvSA/rTsnA== X-Google-Smtp-Source: ABdhPJxa7CNGQV+VGHu0qk8bwyODWGiB22Nh05T+9OsCTnJPABe3ZeRm9xUbIr969bdeqTnXDCO7RA== X-Received: by 2002:a05:6a00:1629:b029:2ef:f4de:244f with SMTP id e9-20020a056a001629b02902eff4de244fmr3894275pfc.6.1624002780347; Fri, 18 Jun 2021 00:53:00 -0700 (PDT) Received: from localhost ([2401:fa00:9:14:3e8:19ca:3d8a:e112]) by smtp.gmail.com with UTF8SMTPSA id 35sm6706429pjo.16.2021.06.18.00.52.55 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 18 Jun 2021 00:53:00 -0700 (PDT) From: Eizan Miyamoto To: linux-kernel@vger.kernel.org Cc: yong.wu@mediatek.com, houlong.wei@mediatek.com, enric.balletbo@collabora.com, chunkuang.hu@kernel.org, wenst@chromium.org, Eizan Miyamoto , Andrew-CT Chen , 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 v3 5/8] media: mtk-mdp: search for vpu node instead of linking it to a property Date: Fri, 18 Jun 2021 17:52:06 +1000 Message-Id: <20210618175059.v3.5.I0cbd6691d3edfa2757bd6f5de7acfce94b101480@changeid> X-Mailer: git-send-email 2.32.0.288.g62a8d224e6-goog In-Reply-To: <20210618075209.1157766-1-eizan@chromium.org> References: <20210618075209.1157766-1-eizan@chromium.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210618_005301_563568_AE15E971 X-CRM114-Status: GOOD ( 15.62 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Since there is only one vpu node, it suffices to search for it instead of having a link coded into the primary mdp device node. Signed-off-by: Eizan Miyamoto --- (no changes since v1) drivers/media/platform/mtk-mdp/mtk_mdp_comp.c | 6 ---- drivers/media/platform/mtk-mdp/mtk_mdp_core.c | 28 +++++++++++++------ 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c b/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c index fdbb46a5330a..3d9bb7265159 100644 --- a/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c @@ -117,12 +117,6 @@ static int mtk_mdp_comp_bind(struct device *dev, struct device *master, 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"); diff --git a/drivers/media/platform/mtk-mdp/mtk_mdp_core.c b/drivers/media/platform/mtk-mdp/mtk_mdp_core.c index 267e4cb4bf32..48e9a557c446 100644 --- a/drivers/media/platform/mtk-mdp/mtk_mdp_core.c +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_core.c @@ -113,6 +113,7 @@ static void release_of(struct device *dev, void *data) static int mtk_mdp_master_bind(struct device *dev) { int status; + struct device_node *vpu_node; struct mtk_mdp_dev *mdp = dev_get_drvdata(dev); status = component_bind_all(dev, mdp); @@ -121,15 +122,24 @@ 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"); + vpu_node = of_find_node_by_name(NULL, "vpu"); + if (!vpu_node) { + dev_err(dev, "unable to find vpu node"); + status = -ENODEV; + goto err_wdt_reg; + } + + mdp->vpu_dev = of_find_device_by_node(vpu_node); + if (!mdp->vpu_dev) { + dev_err(dev, "unable to find vpu device"); + status = -ENODEV; + goto err_wdt_reg; + } + + status = vpu_wdt_reg_handler(mdp->vpu_dev, mtk_mdp_reset_handler, mdp, VPU_RST_MDP); + if (status) { + dev_err(dev, "Failed to register reset handler\n"); + goto err_wdt_reg; } status = mtk_mdp_register_m2m_device(mdp); From patchwork Fri Jun 18 07:52:07 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eizan Miyamoto X-Patchwork-Id: 12330517 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.9 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id C8BFEC49EA3 for ; Fri, 18 Jun 2021 07:57:39 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 90123610EA for ; Fri, 18 Jun 2021 07:57:39 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 90123610EA Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=chromium.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=p20k6SxbAxr/30mscauEkspUpTQpdYJaQ2JEA9QJHTk=; b=CAIBZVtLTNsIGo 0XLsbF4oBGQvo4DYDuJ6GPkOKmBsgY9xOSgNK4bO9wI+RI8owH//o5JuWEwLCmR8eMt5J32AueOsB 2XePPjAD23o+t7567XlyJx1bjhZK5mcHkOZjknIUWJpksKSfzoF6DqMcIf/k/N+2D1Xp3s7Vfe8Mt CFtYQl0Gyd1a+xo4UbI5YOtJtQCuRc/KA2xb/c/MzUrhsM3FtrXhJUferwNi321OVxa4OULC1rY8T X2Z49HByiYlKR45S1jN26cb6kKzVQ6K91+x0ejn6MQRjon+E0I73yMG7BcJMuAyxOMvVodmVZUide aNfuaBaz8qCFUkjhcmPw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1lu9LQ-00DA0m-8O; Fri, 18 Jun 2021 07:55:16 +0000 Received: from mail-pg1-x52c.google.com ([2607:f8b0:4864:20::52c]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1lu9JM-00D8tz-NG for linux-arm-kernel@lists.infradead.org; Fri, 18 Jun 2021 07:53:11 +0000 Received: by mail-pg1-x52c.google.com with SMTP id e22so950746pgv.10 for ; Fri, 18 Jun 2021 00:53:08 -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=1WdNBOi2CRzcMwfkWOhSgCoOP3Vokmi/ubivKIIfWV4=; b=nPM/mSoLkOb7jxUW1U6aUEsxAvzYTAHcgaqqQUU4apMu2WUeaTHwmeg4gvb3KfKvOx oWxliSD/lUeB6I2UERNfWtOlmAhiLMfCyJ2y9crzA6o+scRziwFkuspOstZ28QGOxvfx mBYvfmhJ7Q0OAYfXsEehDfd7C+Wrx1MdSGdFo= 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=1WdNBOi2CRzcMwfkWOhSgCoOP3Vokmi/ubivKIIfWV4=; b=SOuXCGGHJZLopwdMsVpw9RckUsKnFA2lWc83u18oLwC4VqUn11NajoYzYQ0fZbPaz9 sMpd0fDId9PktvXSC/3RvSKlxpanSgrX5jtZku2xGrsxp8nT7E7ukQ6IAStOZ9cA8zTl j0TtVTpBVfUo0sI8R5Wyk3PysN81EGzPKMVBUCV7HM/3K6m5P/+a5V3mLFcEPPHwuudD jhdCiQjLR6qRQUePLlZ559mKI7kd4ZlsW95NEGeKxQbXkBN4RXBYtPvB0Br2GutRUKHW 6NfKuMnuh38y0Qnl/zj/IG8hdLhj/QOQJ137i8U4lxkVaNpwMTREdBZHNmY1Y3Iz41ba +0Nw== X-Gm-Message-State: AOAM533gMPCtEvji8fmXnMZCEoQa0SurQauX0ohVxgezPJgBWhY7MbOr x+V7sG4f5eY2Unv24ygeViBCMg== X-Google-Smtp-Source: ABdhPJz5w3n9T0DDlIwIibuX3J5tf5A0ASPaGhUurb8lFnwAGINIl6YWOcGgOTNdUVkLQWYxq69Zrg== X-Received: by 2002:a63:494:: with SMTP id 142mr5826039pge.146.1624002787654; Fri, 18 Jun 2021 00:53:07 -0700 (PDT) Received: from localhost ([2401:fa00:9:14:3e8:19ca:3d8a:e112]) by smtp.gmail.com with UTF8SMTPSA id r14sm2615450pgu.18.2021.06.18.00.53.02 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 18 Jun 2021 00:53:07 -0700 (PDT) From: Eizan Miyamoto To: linux-kernel@vger.kernel.org Cc: yong.wu@mediatek.com, houlong.wei@mediatek.com, enric.balletbo@collabora.com, chunkuang.hu@kernel.org, wenst@chromium.org, Eizan Miyamoto , Andrew-CT Chen , 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 v3 6/8] media: mtk-mdp: propagate errors better in pm_suspend/resume Date: Fri, 18 Jun 2021 17:52:07 +1000 Message-Id: <20210618175059.v3.6.If7d6a147afd8880940c42d7998e47ed3869e8805@changeid> X-Mailer: git-send-email 2.32.0.288.g62a8d224e6-goog In-Reply-To: <20210618075209.1157766-1-eizan@chromium.org> References: <20210618075209.1157766-1-eizan@chromium.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210618_005308_901607_2C1D3B36 X-CRM114-Status: GOOD ( 20.01 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Up until this change, many errors were logged but ignored when powering on clocks and calling pm_runtime_get/put() inside mtk_mdp_core. This change tries to do a better job at propagating errors back to the power management framework. Signed-off-by: Eizan Miyamoto --- (no changes since v1) drivers/media/platform/mtk-mdp/mtk_mdp_comp.c | 62 ++++++++++++++++--- drivers/media/platform/mtk-mdp/mtk_mdp_comp.h | 6 +- drivers/media/platform/mtk-mdp/mtk_mdp_core.c | 57 +++++++++++++---- 3 files changed, 99 insertions(+), 26 deletions(-) diff --git a/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c b/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c index 3d9bb7265159..59911ee063c1 100644 --- a/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c @@ -53,39 +53,81 @@ static const struct of_device_id mtk_mdp_comp_driver_dt_match[] = { }; MODULE_DEVICE_TABLE(of, mtk_mdp_comp_driver_dt_match); -void mtk_mdp_comp_power_on(struct mtk_mdp_comp *comp) +int mtk_mdp_comp_power_on(struct mtk_mdp_comp *comp) { - int err; + int status, err; err = pm_runtime_get_sync(comp->dev); - if (err < 0) + if (err < 0) { dev_err(comp->dev, "failed to runtime get, err %d.\n", err); + return err; + } + + err = mtk_mdp_comp_clock_on(comp); + if (err) { + dev_err(comp->dev, "failed to turn on clock. err=%d", err); + status = err; + goto err_mtk_mdp_comp_clock_on; + } + + return err; + +err_mtk_mdp_comp_clock_on: + err = pm_runtime_put_sync(comp->dev); + if (err) + dev_err(comp->dev, "failed to runtime put in cleanup. err=%d", err); - mtk_mdp_comp_clock_on(comp); + return status; } -void mtk_mdp_comp_power_off(struct mtk_mdp_comp *comp) +int mtk_mdp_comp_power_off(struct mtk_mdp_comp *comp) { - int err; + int status, err; mtk_mdp_comp_clock_off(comp); err = pm_runtime_put_sync(comp->dev); - if (err < 0) + if (err < 0) { dev_err(comp->dev, "failed to runtime put, err %d.\n", err); + status = err; + goto err_pm_runtime_put_sync; + } + + return 0; + +err_pm_runtime_put_sync: + err = mtk_mdp_comp_clock_on(comp); + if (err) + dev_err(comp->dev, "failed to turn on clock in cleanup. err=%d", err); + + return status; } -void mtk_mdp_comp_clock_on(struct mtk_mdp_comp *comp) +int mtk_mdp_comp_clock_on(struct mtk_mdp_comp *comp) { - int i, err; + int i, err, status; for (i = 0; i < ARRAY_SIZE(comp->clk); i++) { if (IS_ERR(comp->clk[i])) continue; err = clk_prepare_enable(comp->clk[i]); - if (err) + if (err) { + status = err; dev_err(comp->dev, "failed to enable clock, err %d. i:%d\n", err, i); + goto err_clk_prepare_enable; + } + } + + return 0; + +err_clk_prepare_enable: + for (--i; i >= 0; i--) { + if (IS_ERR(comp->clk[i])) + continue; + clk_disable_unprepare(comp->clk[i]); } + + return status; } void mtk_mdp_comp_clock_off(struct mtk_mdp_comp *comp) diff --git a/drivers/media/platform/mtk-mdp/mtk_mdp_comp.h b/drivers/media/platform/mtk-mdp/mtk_mdp_comp.h index 7ad9b06bb11b..2bd229cc7eae 100644 --- a/drivers/media/platform/mtk-mdp/mtk_mdp_comp.h +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_comp.h @@ -21,10 +21,10 @@ struct mtk_mdp_comp { int mtk_mdp_comp_init(struct mtk_mdp_comp *comp, struct device *dev); -void mtk_mdp_comp_power_on(struct mtk_mdp_comp *comp); -void mtk_mdp_comp_power_off(struct mtk_mdp_comp *comp); +int mtk_mdp_comp_power_on(struct mtk_mdp_comp *comp); +int mtk_mdp_comp_power_off(struct mtk_mdp_comp *comp); -void mtk_mdp_comp_clock_on(struct mtk_mdp_comp *comp); +int mtk_mdp_comp_clock_on(struct mtk_mdp_comp *comp); void mtk_mdp_comp_clock_off(struct mtk_mdp_comp *comp); extern struct platform_driver mtk_mdp_component_driver; diff --git a/drivers/media/platform/mtk-mdp/mtk_mdp_core.c b/drivers/media/platform/mtk-mdp/mtk_mdp_core.c index 48e9a557c446..523e3c2798e1 100644 --- a/drivers/media/platform/mtk-mdp/mtk_mdp_core.c +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_core.c @@ -49,8 +49,9 @@ static const struct of_device_id mtk_mdp_of_ids[] = { }; MODULE_DEVICE_TABLE(of, mtk_mdp_of_ids); -static void mtk_mdp_clock_on(struct mtk_mdp_dev *mdp) +static int mtk_mdp_clock_on(struct mtk_mdp_dev *mdp) { + int err, status; struct mtk_mdp_comp *comp_node; /* @@ -58,18 +59,41 @@ static void mtk_mdp_clock_on(struct mtk_mdp_dev *mdp) * on it through mtk_mdp_m2m_start_streaming, making it unnecessary to * have mtk_mdp_comp_power_on called on it. */ - mtk_mdp_comp_clock_on(&mdp->comp_self); + err = mtk_mdp_comp_clock_on(&mdp->comp_self); + if (err) + return err; + + list_for_each_entry(comp_node, &mdp->comp_list, node) { + err = mtk_mdp_comp_power_on(comp_node); + if (err) { + status = err; + goto err_mtk_mdp_comp_power_on; + } + } - list_for_each_entry(comp_node, &mdp->comp_list, node) - mtk_mdp_comp_power_on(comp_node); + return 0; + +err_mtk_mdp_comp_power_on: + list_for_each_entry_continue_reverse(comp_node, &mdp->comp_list, node) { + err = mtk_mdp_comp_power_off(comp_node); + if (err) + dev_err(&mdp->pdev->dev, "failed to power off after error. err=%d", err); + } + return status; } -static void mtk_mdp_clock_off(struct mtk_mdp_dev *mdp) +static int mtk_mdp_clock_off(struct mtk_mdp_dev *mdp) { + int status, err; struct mtk_mdp_comp *comp_node; - list_for_each_entry(comp_node, &mdp->comp_list, node) - mtk_mdp_comp_power_off(comp_node); + list_for_each_entry(comp_node, &mdp->comp_list, node) { + err = mtk_mdp_comp_power_off(comp_node); + if (err) { + status = err; + goto err_mtk_mdp_comp_power_off; + } + } /* * The master / rdma0 component will have pm_runtime_put called @@ -77,6 +101,17 @@ static void mtk_mdp_clock_off(struct mtk_mdp_dev *mdp) * have mtk_mdp_comp_power_off called on it. */ mtk_mdp_comp_clock_off(&mdp->comp_self); + + return 0; + +err_mtk_mdp_comp_power_off: + list_for_each_entry_continue_reverse(comp_node, &mdp->comp_list, node) { + err = mtk_mdp_comp_power_on(comp_node); + if (err) + dev_err(&mdp->pdev->dev, "failed to power on after error. err=%d", err); + } + + return status; } static void mtk_mdp_wdt_worker(struct work_struct *work) @@ -317,18 +352,14 @@ static int __maybe_unused mtk_mdp_pm_suspend(struct device *dev) { struct mtk_mdp_dev *mdp = dev_get_drvdata(dev); - mtk_mdp_clock_off(mdp); - - return 0; + return mtk_mdp_clock_off(mdp); } static int __maybe_unused mtk_mdp_pm_resume(struct device *dev) { struct mtk_mdp_dev *mdp = dev_get_drvdata(dev); - mtk_mdp_clock_on(mdp); - - return 0; + return mtk_mdp_clock_on(mdp); } static int __maybe_unused mtk_mdp_suspend(struct device *dev) From patchwork Fri Jun 18 07:52:08 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eizan Miyamoto X-Patchwork-Id: 12330519 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.9 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id AC30AC48BE8 for ; Fri, 18 Jun 2021 07:58:09 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 7EAF26101A for ; Fri, 18 Jun 2021 07:58:09 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 7EAF26101A Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=chromium.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=XccKKl7f/73sw3UqLSdkKl/sTJA2tSFf3Na9LNEltcw=; b=QdAmxW0X57lXFk Ikwjx32SAwg+V2qhh09pCSbcWa9ZrbypjunEOSYZThVKlwCZ/M0xI5go7VXdnrauOk84bLUwCLWMm MuMeHIqcQyhYbULQJY8XfSHP8mFQ5byZ3xGJKN8UrYa2xDTOKcTzuf3s7RTOnCmPQGgZb4jfIabUE WcIDfrTq/E5JDVfdmT42bHxtlMoRdyBf8zqTAxT4rS6pCxUjQgtScMhreMaG4Iux0Epm0XiuNSvto 7D/sncv7tx+VRjS5+qpipK4sx8a82a92C7ERY+ZX+Ohum50nO+bP6GKf+RjFBiRcxblecViUzs8NT rFtcL9B9FM+FFYHB5HyQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1lu9M2-00DAPx-LO; Fri, 18 Jun 2021 07:55:56 +0000 Received: from mail-pg1-x52a.google.com ([2607:f8b0:4864:20::52a]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1lu9JT-00D8yd-L4 for linux-arm-kernel@lists.infradead.org; Fri, 18 Jun 2021 07:53:17 +0000 Received: by mail-pg1-x52a.google.com with SMTP id t17so7133190pga.5 for ; Fri, 18 Jun 2021 00:53:15 -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=fuQHQTUFu0ITvsFzkeR6cqKiaBR9rEE8G0yVPHcvTZQ=; b=HYeWOMVAjk9vA6oXy4YeoHfzm9VgoY1EfBNkbUzeZ1bi+CcyhYhCdz5nch//gJ0AT5 ygxHHJ0SVJo9HH9vfAUjMTPEgel4viwiBhuGmWSanIzFyap7epHiin/riZFeFJpFxENn RjlWRYbNCwSFQgMHbQ6b32ddNzP4zp9KdqlxE= 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=fuQHQTUFu0ITvsFzkeR6cqKiaBR9rEE8G0yVPHcvTZQ=; b=kxjw9CAy20pEVp0YJVes0xqt8pK3IPs4l6zYxiHDRkKn8BJOdjIADl5LTdSEmOjIZU NQmTh1yGff7hZdeTns7WwdGlIHyb5l9ZIR2G8BL9NDyYS/OMitRiRhMo1s9JsMQnJOxx 0oTglIuGhQ6uDP0odHUuiWRKzg80mgmD0ZozpEKCNchC0aoVxBQ9OmT74F+XiaPidC3l hyQb5hF9C5wKRBNc53nJeN/TF6lnWByX9S4rDIYCJltVwcFUiDQ7ZEbjW9m2jNHL+vc0 xmGeXZbw47NQmfvLQ5f56Vy35gChPFbEELvqDXexv/bkrYVGaLTWpNF5AYKyA6ITcFxK zK1g== X-Gm-Message-State: AOAM532dvfbh4w7XGCRsDpgTxC2s/vRla76+e+e92rXYsgx8sc/SgM9v RuLdKmUlisicqQG41nyfCGaveQ== X-Google-Smtp-Source: ABdhPJyBeVVeweGBr4QQORF7SlgVzJMdMAcqnaFfn77opkCAqoRSj12QI9zWicniMiWzgqn0gNu/Og== X-Received: by 2002:a63:2151:: with SMTP id s17mr8686226pgm.432.1624002795102; Fri, 18 Jun 2021 00:53:15 -0700 (PDT) Received: from localhost ([2401:fa00:9:14:3e8:19ca:3d8a:e112]) by smtp.gmail.com with UTF8SMTPSA id 201sm2777642pfz.150.2021.06.18.00.53.10 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 18 Jun 2021 00:53:14 -0700 (PDT) From: Eizan Miyamoto To: linux-kernel@vger.kernel.org Cc: yong.wu@mediatek.com, houlong.wei@mediatek.com, enric.balletbo@collabora.com, chunkuang.hu@kernel.org, wenst@chromium.org, Eizan Miyamoto , Andrew-CT Chen , 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 v3 7/8] media: mtk-mdp: use mdp-rdma0 alias to point to MDP master Date: Fri, 18 Jun 2021 17:52:08 +1000 Message-Id: <20210618175059.v3.7.I2049e180dca12e0d1b3178bfc7292dcf9e05ac28@changeid> X-Mailer: git-send-email 2.32.0.288.g62a8d224e6-goog In-Reply-To: <20210618075209.1157766-1-eizan@chromium.org> References: <20210618075209.1157766-1-eizan@chromium.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210618_005315_780724_63AC79C2 X-CRM114-Status: GOOD ( 27.81 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org ... Instead of depending on the presence of a mediatek,vpu property in the device node. That property was originally added to link to the vpu node so that the mtk_mdp_core driver could pass the right device to vpu_wdt_reg_handler(). However in a previous patch in this series, the driver has been modified to search the device tree for that node instead. That property was also used to indicate the primary MDP device, so that it can be passed to the V4L2 subsystem as well as register it to be used when setting up queues in the open() callback for the filesystem device node that is created. In this case, assuming that the primary MDP device is the one with a specific alias seems useable because the alternative is to add a property to the device tree which doesn't actually represent any facet of hardware (i.e., this being the primary MDP device is a software decision). In other words, this solution is equally as arbitrary, but at least it doesn't add a property to a device node where said property is unrelated to the hardware present. Signed-off-by: Eizan Miyamoto --- (no changes since v1) drivers/media/platform/mtk-mdp/mtk_mdp_comp.c | 47 ++++++++++++++----- drivers/media/platform/mtk-mdp/mtk_mdp_core.c | 6 +++ 2 files changed, 42 insertions(+), 11 deletions(-) diff --git a/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c b/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c index 59911ee063c1..2a71c582d8b1 100644 --- a/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c @@ -141,22 +141,48 @@ void mtk_mdp_comp_clock_off(struct mtk_mdp_comp *comp) } } +/* + * The MDP master device node is identified by the device tree alias + * "mdp-rdma0". + */ +static int is_mdp_master(struct device *dev) +{ + struct device_node *aliases, *mdp_rdma0_node; + const char *mdp_rdma0_path; + + if (!dev->of_node) + return 0; + + aliases = of_find_node_by_path("/aliases"); + if (!aliases) { + dev_err(dev, "no aliases found for mdp-rdma0"); + return 0; + } + + mdp_rdma0_path = of_get_property(aliases, "mdp-rdma0", NULL); + if (!mdp_rdma0_path) { + dev_err(dev, "get mdp-rdma0 property of /aliases failed"); + return 0; + } + + mdp_rdma0_node = of_find_node_by_path(mdp_rdma0_path); + if (!mdp_rdma0_node) { + dev_err(dev, "path resolution failed for %s", mdp_rdma0_path); + return 0; + } + + return dev->of_node == mdp_rdma0_node; +} + static int mtk_mdp_comp_bind(struct device *dev, struct device *master, void *data) { 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) { + if (is_mdp_master(dev)) { int ret; ret = v4l2_device_register(dev, &mdp->v4l2_dev); @@ -172,9 +198,8 @@ static int mtk_mdp_comp_bind(struct device *dev, struct device *master, } /* - * 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 DMA ops will be handled by the DMA callbacks associated with this + * device; */ mdp->rdma_dev = dev; } diff --git a/drivers/media/platform/mtk-mdp/mtk_mdp_core.c b/drivers/media/platform/mtk-mdp/mtk_mdp_core.c index 523e3c2798e1..be7d35b3e3ff 100644 --- a/drivers/media/platform/mtk-mdp/mtk_mdp_core.c +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_core.c @@ -157,6 +157,12 @@ static int mtk_mdp_master_bind(struct device *dev) goto err_component_bind_all; } + if (mdp->rdma_dev == NULL) { + dev_err(dev, "Primary MDP device not found"); + status = -ENODEV; + goto err_component_bind_all; + } + vpu_node = of_find_node_by_name(NULL, "vpu"); if (!vpu_node) { dev_err(dev, "unable to find vpu node"); From patchwork Fri Jun 18 07:52:09 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eizan Miyamoto X-Patchwork-Id: 12330521 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.9 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 415FDC48BE8 for ; Fri, 18 Jun 2021 07:58:51 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 07A9B610EA for ; Fri, 18 Jun 2021 07:58:51 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 07A9B610EA Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=chromium.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=Vk7ORtnPGKmrvPRObwRujYyMRF+Z5E8rCawihTiWC58=; b=rUH4PwAZJxy1ux yuAzKpZgH0bOChypJ+Fr7LNqhWfOtGk1FPvRDFlLN9aHN0a2znF5tOTbpCHtNamiceuVBnq1oliPO 0WFB4mWybtHqi2OdqbrKQVuE9wlMr5kfqHn0U3uAEP0T9HZZYjKVwWvfImRlDIacjWyFEFCpDcrI8 IbT0sXlqfHP741PyXut8/cqAHjWgnm/SeA/CDOJE3Dra5nZcs+mUMz/FsV7y0VRFWhZj99J5Ax8XK RdRVtypeAPNn5gDVKso0I4rZZsVoLbI1TQPjDZ8FVklAHyO7pASIKeqbbXuXlP0g2txi8QgK6qiZQ b7CZ8VC+yd1lZyOkxXLg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1lu9Mj-00DAiy-Gq; Fri, 18 Jun 2021 07:56:38 +0000 Received: from mail-pf1-x42e.google.com ([2607:f8b0:4864:20::42e]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1lu9Ja-00D92j-QB for linux-arm-kernel@lists.infradead.org; Fri, 18 Jun 2021 07:53:24 +0000 Received: by mail-pf1-x42e.google.com with SMTP id k15so1894541pfp.6 for ; Fri, 18 Jun 2021 00:53:22 -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=Vi5aaeGs0Jp5TUhXs/yHmc/VtnCiG/O5q5AcK+a/X+o=; b=dPbJMCtAP92m+az9E2KUVJ5QmmcxaGWaLiEMzeY+A4KZdT7ri4OiyidJH5tVgfZ5sx ha7JMrMR7N2/+48vuq9CqITc9/jldqwYid2TkFLo/I4JTKmS2L5Qzgj1cbw7Gs4VgbvL sKs/pKLDshM2kQPpjQ2wheprYOAmm1dpmyclY= 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=Vi5aaeGs0Jp5TUhXs/yHmc/VtnCiG/O5q5AcK+a/X+o=; b=B6PdmHUA6JsXQDPcD5qOyKVyLhIQFSoNmiYrxeHw5I4R0IKp26xtrU5HsunEz5kToV 8IF9XqjUhogOiD+Ij0raRf2AuZUOm709PwChW8mWyMbxQRmOwi3dFr0oEJZbRNiqDBRs MMw2MPEXaaKGbG9uosjZSlbSWbSJC3I74O3uiq0nyN8Yg/RXSq8fBwxxmuZ+Zv/sLD2m 0Rn9kToeNlFtRdtodL37HG08zZwXuUiueBb3xUxT1IPEQuseX5s+19gunTLG73bUn7xW lyaDrEUs/cCohm8EChjISbFGUV4Nay9rnlh1hRkp824I4ctYj0fNKkkr8GpBeiSdhTja S3hQ== X-Gm-Message-State: AOAM532xB/myOWsiivfk5bNOXSnxEX+FhtlmTwQynLEWn+TNEetRu/eY DVK4bB5nc9I8B67613aOYHrz2w== X-Google-Smtp-Source: ABdhPJylBEPC3a908/Xh3ysKf3+CdjrNp9JtF2KZhy0pHzubG/04CCm511Z8TiYWqIK44tgtCAhc+w== X-Received: by 2002:a63:2f05:: with SMTP id v5mr8756251pgv.449.1624002801724; Fri, 18 Jun 2021 00:53:21 -0700 (PDT) Received: from localhost ([2401:fa00:9:14:3e8:19ca:3d8a:e112]) by smtp.gmail.com with UTF8SMTPSA id g8sm7761729pja.14.2021.06.18.00.53.17 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 18 Jun 2021 00:53:21 -0700 (PDT) From: Eizan Miyamoto To: linux-kernel@vger.kernel.org Cc: yong.wu@mediatek.com, houlong.wei@mediatek.com, enric.balletbo@collabora.com, chunkuang.hu@kernel.org, wenst@chromium.org, Eizan Miyamoto , Matthias Brugger , Rob Herring , devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org Subject: [PATCH v3 8/8] dts: mtk-mdp: remove mediatek, vpu property from primary MDP device Date: Fri, 18 Jun 2021 17:52:09 +1000 Message-Id: <20210618175059.v3.8.Ib681f06d5189351b7fda0e3dcd6b15f3863a0071@changeid> X-Mailer: git-send-email 2.32.0.288.g62a8d224e6-goog In-Reply-To: <20210618075209.1157766-1-eizan@chromium.org> References: <20210618075209.1157766-1-eizan@chromium.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210618_005322_903996_EA70DA47 X-CRM114-Status: GOOD ( 11.40 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org It is no longer used by the mediatek MDP driver. Signed-off-by: Eizan Miyamoto --- (no changes since v1) arch/arm64/boot/dts/mediatek/mt8173.dtsi | 1 - 1 file changed, 1 deletion(-) diff --git a/arch/arm64/boot/dts/mediatek/mt8173.dtsi b/arch/arm64/boot/dts/mediatek/mt8173.dtsi index 814f56d59e2f..4020748ae446 100644 --- a/arch/arm64/boot/dts/mediatek/mt8173.dtsi +++ b/arch/arm64/boot/dts/mediatek/mt8173.dtsi @@ -1055,7 +1055,6 @@ mdp_rdma0: rdma@14001000 { <&mmsys CLK_MM_MUTEX_32K>; power-domains = <&spm MT8173_POWER_DOMAIN_MM>; iommus = <&iommu M4U_PORT_MDP_RDMA0>; - mediatek,vpu = <&vpu>; }; mdp_rdma1: rdma@14002000 {