From patchwork Fri Jul 9 02:23:18 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eizan Miyamoto X-Patchwork-Id: 472125 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=-19.4 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER, INCLUDES_PATCH, MAILING_LIST_MULTI, SPF_HELO_NONE, SPF_PASS, 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 AB200C07E96 for ; Fri, 9 Jul 2021 02:23:54 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 90EEE6145C for ; Fri, 9 Jul 2021 02:23:54 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230463AbhGIC0g (ORCPT ); Thu, 8 Jul 2021 22:26:36 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38456 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230412AbhGIC0f (ORCPT ); Thu, 8 Jul 2021 22:26:35 -0400 Received: from mail-pf1-x42e.google.com (mail-pf1-x42e.google.com [IPv6:2607:f8b0:4864:20::42e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 29DC3C061574 for ; Thu, 8 Jul 2021 19:23:52 -0700 (PDT) Received: by mail-pf1-x42e.google.com with SMTP id 21so7369940pfp.3 for ; Thu, 08 Jul 2021 19:23:52 -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=Y3PbmVcTpze3gwdTv7DQDH8U+vHuO9NjQ57GmGzSR5k=; b=fKISDI2CZvoPa9D7Tu7CBPZuMeyZFHBtoW2slWybkcwEHtyDLRM/zxOmr4TDlcvUmf 3k7RYvR/wl4+9i5yGop34x0oy9pXRzVf5Ahe0huT+oVyCbnDrmTs0vu3s51RHNlkmOPB JjztqCAYEz/EqYrxChDldCLYOmJUs271gVdhg= 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=Y3PbmVcTpze3gwdTv7DQDH8U+vHuO9NjQ57GmGzSR5k=; b=MoLfvbG9ZUIIf/nnaQPuqgk4MM7zz/4JulfSvtknoTA0DzeEd/Vl9uC0GKpjzrQMvo 255giKbqYOH7d6x7GqP1ULsL1gFV39D1UL+jXJaWCYN203SjjSvRgrZ65sbND6bs+TH+ TEkPApcjCDolS9PhgODKJaDU12jCm1assW+Pz6Y7b3F+ee9hkfmUytpgqsRG9upCx5zC wbGWqKk5fYO46jBYL30RIAl0pAp5QZafgcK+lkb1qkFOa/D0UfTcmJBYLJTxk+Wq9SS6 S7R26cX0dvRxH9YCIPVkir3nYJ62ncc8JVUkWYagbpLXwveCkLV0pUyolJUGBeD5ncln jwdg== X-Gm-Message-State: AOAM531qWCo4+w/GaTkTf6vJTeGbS7702ZgELO3ED89AXYWesss1TKsy 73a/Vy3xxD7tG7sRvrvQGBFdOw== X-Google-Smtp-Source: ABdhPJwYhF3W1z8oL2pREMtTo3eAZTmKvQs3c7w/YVWrPWhPxSeYu7ytQs8I3JtSAqyJlZM7zPjfpA== X-Received: by 2002:a63:e841:: with SMTP id a1mr35114724pgk.197.1625797431737; Thu, 08 Jul 2021 19:23:51 -0700 (PDT) Received: from localhost ([2401:fa00:9:14:d956:2966:7910:2bd2]) by smtp.gmail.com with UTF8SMTPSA id c7sm4747596pgq.22.2021.07.08.19.23.47 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 08 Jul 2021 19:23:51 -0700 (PDT) From: Eizan Miyamoto To: linux-kernel@vger.kernel.org Cc: wenst@chromium.org, chunkuang.hu@kernel.org, yong.wu@mediatek.com, enric.balletbo@collabora.com, houlong.wei@mediatek.com, 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 v5 2/8] mtk-mdp: use pm_runtime in MDP component driver Date: Fri, 9 Jul 2021 12:23:18 +1000 Message-Id: <20210709122040.v5.2.I909f5375d930f5d0cc877128e30e2a67078b674c@changeid> X-Mailer: git-send-email 2.32.0.93.g670b81a890-goog In-Reply-To: <20210709022324.1607884-1-eizan@chromium.org> References: <20210709022324.1607884-1-eizan@chromium.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.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 | 20 ++++++++++++++----- drivers/media/platform/mtk-mdp/mtk_mdp_comp.h | 8 +++++--- drivers/media/platform/mtk-mdp/mtk_mdp_core.c | 6 ++---- 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c b/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c index aec1cb5c4261..8b6158379f41 100644 --- a/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c @@ -14,6 +14,7 @@ #include #include #include +#include #include "mtk_mdp_comp.h" #include "mtk_mdp_core.h" @@ -52,7 +53,7 @@ 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; @@ -63,18 +64,22 @@ void mtk_mdp_comp_clock_on(struct device *dev, struct mtk_mdp_comp *comp) "failed to get larb, err %d.\n", 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; @@ -86,6 +91,8 @@ void mtk_mdp_comp_clock_off(struct device *dev, struct mtk_mdp_comp *comp) if (comp->larb_dev) mtk_smi_larb_put(comp->larb_dev); + + pm_runtime_put_sync(comp->dev); } static int mtk_mdp_comp_bind(struct device *dev, struct device *master, @@ -95,6 +102,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; } @@ -105,6 +113,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); } @@ -124,6 +133,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 b5a18fe567aa..5e2ee94a1b37 100644 --- a/drivers/media/platform/mtk-mdp/mtk_mdp_comp.h +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_comp.h @@ -12,17 +12,19 @@ * @node: list node to track sibing MDP components * @clk: clocks required for component * @larb_dev: SMI device required for component + * @dev: component's device */ struct mtk_mdp_comp { struct list_head node; struct clk *clk[2]; - struct device *larb_dev; + struct device *larb_dev; + 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 aca236dbd348..78c40a61df1d 100644 --- a/drivers/media/platform/mtk-mdp/mtk_mdp_core.c +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_core.c @@ -52,20 +52,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 Jul 9 02:23:20 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eizan Miyamoto X-Patchwork-Id: 472124 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=-19.4 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER, INCLUDES_PATCH, MAILING_LIST_MULTI, SPF_HELO_NONE, SPF_PASS, 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 9D848C07E9C for ; Fri, 9 Jul 2021 02:24:09 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 86FAD61477 for ; Fri, 9 Jul 2021 02:24:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231128AbhGIC0v (ORCPT ); Thu, 8 Jul 2021 22:26:51 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38540 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230517AbhGIC0u (ORCPT ); Thu, 8 Jul 2021 22:26:50 -0400 Received: from mail-pj1-x1029.google.com (mail-pj1-x1029.google.com [IPv6:2607:f8b0:4864:20::1029]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 70520C06175F for ; Thu, 8 Jul 2021 19:24:07 -0700 (PDT) Received: by mail-pj1-x1029.google.com with SMTP id fs7so4940747pjb.2 for ; Thu, 08 Jul 2021 19:24:07 -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=N+h6/ccJDvxLpVZKyQyVBVmozd4JstvD/pi6r5d+wGE=; b=b3BAl+2tcmoG+IvxmSiWInICuRUMAvhunobnCYyFRpx5Qd4/xWsQrbf7MfIumXS5L/ 5OAppKnowynBpSSdTltQtbPJ6CRO/gXw+Ac3QR7Tol+y/f1tHixfhLeHjLSJ53qE5MvV hPC5ahMtRVv9C0aivzfYPFKtSpTAVqksVvJoM= 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=N+h6/ccJDvxLpVZKyQyVBVmozd4JstvD/pi6r5d+wGE=; b=Vxopl0C2wi7pVLjkJItQ7b+Cm70uf3gZGFYRQHpY+TNzgJMrUMNinq5UAYTbKNHdhU gCvKWRIkU40RkFLUIPmtjh4kArdNxOod54ViHWKC41wj1x/E8q+EAeIG2eWlqSdROIFO 3lR+4UqjrbBvMLK2StPVJc3RyCDyQYY5jwH1c5vaQ+5sDhCzeRuvbVxblj8VziO5wTQf 44A5NkerrchSlVifOv7SCQ/hi/ixhTR0n1cY8f/Q6Iyf7L3aWqsfntOeCkqmU8Gdbdf4 8KtzVbwzW+pmtRDsryzGyoJ78N14LY/pvkwkWbmJLXQYY4yMBfmlt4RSw8H+hiJPJj8v xw+A== X-Gm-Message-State: AOAM533X340BylLbMBfQ9QaQBGT5kHdGViQnUi4VssgnjeFP1PIBu+tD 3bjohzCo+A5tZ3eQJuD0Rdhv5Q== X-Google-Smtp-Source: ABdhPJy7NF2Islzno9jnm6FyVOkJa6Hh7kRSVUtPiGyl8O+FkSh+G124OqxUX6kbGcTHcZCu6JB65w== X-Received: by 2002:a17:902:9007:b029:129:82a:f11 with SMTP id a7-20020a1709029007b0290129082a0f11mr28493134plp.76.1625797446570; Thu, 08 Jul 2021 19:24:06 -0700 (PDT) Received: from localhost ([2401:fa00:9:14:d956:2966:7910:2bd2]) by smtp.gmail.com with UTF8SMTPSA id j16sm4773173pgh.69.2021.07.08.19.24.02 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 08 Jul 2021 19:24:06 -0700 (PDT) From: Eizan Miyamoto To: linux-kernel@vger.kernel.org Cc: wenst@chromium.org, chunkuang.hu@kernel.org, yong.wu@mediatek.com, enric.balletbo@collabora.com, houlong.wei@mediatek.com, 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 v5 4/8] mtk-mdp: soc: mediatek: register mdp from mmsys Date: Fri, 9 Jul 2021 12:23:20 +1000 Message-Id: <20210709122040.v5.4.I1245257d5a940967f51caaaee30259bfc034c786@changeid> X-Mailer: git-send-email 2.32.0.93.g670b81a890-goog In-Reply-To: <20210709022324.1607884-1-eizan@chromium.org> References: <20210709022324.1607884-1-eizan@chromium.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org Rather than hanging the MDP master component driver off of the rdma0 device, create a "virtual" device by the mmsys driver instead which is probed by the mtk_mdp_core driver. Broadly, four interdependent things are done by this change: - A virtual device that is probed by the mtk_mdp_core driver is instantiated by the mtk_mmsys driver. - Presence of a mediatek,vpu property in a child node to the mmsys device node is used to determine what device to use when dispatching dma ops from the relevant ioctl. - v4l-related setup is moved into from the mtk_mdp_core driver to the mtk_mdp_comp driver. Signed-off-by: Eizan Miyamoto --- Changes in v5: - rebase and build-test on 5.13-next @ e2f74b13dbe6 Changes in v4: - rebase and test on 5.13 - don't depend on https://patchwork.kernel.org/project/linux-mediatek/list/?series=464873 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 ce54863c24ce..0ee6c7d65664 100644 --- a/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c @@ -114,8 +114,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; @@ -198,23 +235,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 3558a6587f51..9af3dc0e204a 100644 --- a/drivers/media/platform/mtk-mdp/mtk_mdp_core.c +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_core.c @@ -122,6 +122,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); @@ -134,6 +145,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: @@ -192,8 +205,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 */ @@ -226,16 +244,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"); @@ -251,29 +259,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"); @@ -285,22 +272,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; } @@ -372,7 +349,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 8a52539b15d4..9fcd8b8e7c25 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 f14779e7596e..9834d3bbe851 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 080660ef11bf..e681029fe804 100644 --- a/drivers/soc/mediatek/mtk-mmsys.c +++ b/drivers/soc/mediatek/mtk-mmsys.c @@ -97,6 +97,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); @@ -122,10 +123,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 Jul 9 02:23:22 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eizan Miyamoto X-Patchwork-Id: 472123 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=-19.4 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER, INCLUDES_PATCH, MAILING_LIST_MULTI, SPF_HELO_NONE, SPF_PASS, 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 B0CD9C07E96 for ; Fri, 9 Jul 2021 02:24:22 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 9711561457 for ; Fri, 9 Jul 2021 02:24:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230513AbhGIC1E (ORCPT ); Thu, 8 Jul 2021 22:27:04 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38618 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230262AbhGIC1E (ORCPT ); Thu, 8 Jul 2021 22:27:04 -0400 Received: from mail-pj1-x102e.google.com (mail-pj1-x102e.google.com [IPv6:2607:f8b0:4864:20::102e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 706B8C061574 for ; Thu, 8 Jul 2021 19:24:21 -0700 (PDT) Received: by mail-pj1-x102e.google.com with SMTP id oj11-20020a17090b4d8bb029017338c124dcso2526516pjb.0 for ; Thu, 08 Jul 2021 19:24:21 -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=hjFPIGSoMHpNul4BO6Tr5Qp0GpDDoCJp2zkjn1+wsBo=; b=d2fxoZbBqqTMwaZNhJeriW1/TriG5cxrOGUtPBhbJhPVTo73SJDiSVtePPgW2j2RfU tKdXTS6AArgd6yKsq7ORJnYD18TESJ55juDCbC9virBT30sX8Q2hgmOcUoVd02Y7dX0k LY+sCfUTMAQPluSbYnecT9XAuSm0DuX0/vFOE= 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=hjFPIGSoMHpNul4BO6Tr5Qp0GpDDoCJp2zkjn1+wsBo=; b=lGFTZEX09cW1v2kAAnkAa5zpZLKuvpULWvDGDtcefyX0XVyyqE8DcP1hdmTw/82m4z eXLnOmwV9P8+O0oYQ2cDjJBWbZvNKBd01ma3tzMDfhQYTPPeRTdjPK1fI0c15RmA1rcX PPrxDC1hTrg0sE0l4NzrtR8DJMjbyE42fnTh2iCk2+UJeSYgXlYbFnmHnsJxRZb75Vhg 4m6tqW2erbmPBWM3UZz1NCsSzCx0zrjTPiDmbJe9NfJVPGOVoD5wzn84sNl9Y2k2qSz1 EIg1RJszaa+6ZV3HRwbluZDu66Nd90CjN29sY+/CcqxKXMz24sflr+SRJHySHDSxpohn +N8w== X-Gm-Message-State: AOAM532hsETvhTiriNRF3SMCH/oTQ/JTZiaAzJvghttyTrnEwSXnLXbn qajofGM9+rpuScIK0Sa0yuVMUw== X-Google-Smtp-Source: ABdhPJxSKXmREBIm5buYZ1ygEBxNpjj0P7/SBGNJWMnot7OoYHhTxW5aJEWjfqDHbRnPKzlHtknnlA== X-Received: by 2002:a17:90b:4a90:: with SMTP id lp16mr35011298pjb.137.1625797461011; Thu, 08 Jul 2021 19:24:21 -0700 (PDT) Received: from localhost ([2401:fa00:9:14:d956:2966:7910:2bd2]) by smtp.gmail.com with UTF8SMTPSA id m18sm170914pfd.42.2021.07.08.19.24.16 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 08 Jul 2021 19:24:20 -0700 (PDT) From: Eizan Miyamoto To: linux-kernel@vger.kernel.org Cc: wenst@chromium.org, chunkuang.hu@kernel.org, yong.wu@mediatek.com, enric.balletbo@collabora.com, houlong.wei@mediatek.com, 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 v5 6/8] media: mtk-mdp: propagate errors better in pm_suspend/resume Date: Fri, 9 Jul 2021 12:23:22 +1000 Message-Id: <20210709122040.v5.6.If7d6a147afd8880940c42d7998e47ed3869e8805@changeid> X-Mailer: git-send-email 2.32.0.93.g670b81a890-goog In-Reply-To: <20210709022324.1607884-1-eizan@chromium.org> References: <20210709022324.1607884-1-eizan@chromium.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.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 8a9267d0da1e..87e3f72ff02b 100644 --- a/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c @@ -53,9 +53,9 @@ 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; if (comp->larb_dev) { err = mtk_smi_larb_get(comp->larb_dev); @@ -65,34 +65,76 @@ void mtk_mdp_comp_power_on(struct mtk_mdp_comp *comp) } 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 15ef9539a5a7..5201c47f7baa 100644 --- a/drivers/media/platform/mtk-mdp/mtk_mdp_comp.h +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_comp.h @@ -23,10 +23,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 74ef37eb50bd..b45d588d2659 100644 --- a/drivers/media/platform/mtk-mdp/mtk_mdp_core.c +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_core.c @@ -50,8 +50,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; /* @@ -59,18 +60,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 @@ -78,6 +102,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) @@ -318,18 +353,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)