From patchwork Fri Feb 12 02:00:46 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 8286971 X-Patchwork-Delegate: horms@verge.net.au Return-Path: X-Original-To: patchwork-linux-renesas-soc@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 9DF78BEEED for ; Fri, 12 Feb 2016 02:01:26 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id E506D20398 for ; Fri, 12 Feb 2016 02:01:25 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 209002039E for ; Fri, 12 Feb 2016 02:01:25 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751286AbcBLCBF (ORCPT ); Thu, 11 Feb 2016 21:01:05 -0500 Received: from galahad.ideasonboard.com ([185.26.127.97]:52570 "EHLO galahad.ideasonboard.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751307AbcBLCAh (ORCPT ); Thu, 11 Feb 2016 21:00:37 -0500 Received: from avalon.bb.dnainternet.fi (85-23-193-79.bb.dnainternet.fi [85.23.193.79]) by galahad.ideasonboard.com (Postfix) with ESMTPSA id 16B4821897; Fri, 12 Feb 2016 02:58:51 +0100 (CET) From: Laurent Pinchart To: linux-media@vger.kernel.org Cc: linux-renesas-soc@vger.kernel.org Subject: [PATCH/RFC 5/9] v4l: vsp1: Add FCP support Date: Fri, 12 Feb 2016 04:00:46 +0200 Message-Id: <1455242450-24493-6-git-send-email-laurent.pinchart+renesas@ideasonboard.com> X-Mailer: git-send-email 2.4.10 In-Reply-To: <1455242450-24493-1-git-send-email-laurent.pinchart+renesas@ideasonboard.com> References: <1455242450-24493-1-git-send-email-laurent.pinchart+renesas@ideasonboard.com> Sender: linux-renesas-soc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-renesas-soc@vger.kernel.org X-Spam-Status: No, score=-7.1 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP On some platforms the VSP performs memory accesses through an FCP. When that's the case get a reference to the FCP from the VSP DT node and enable/disable it at runtime as needed. Signed-off-by: Laurent Pinchart --- .../devicetree/bindings/media/renesas,vsp1.txt | 5 +++++ drivers/media/platform/Kconfig | 1 + drivers/media/platform/vsp1/vsp1.h | 2 ++ drivers/media/platform/vsp1/vsp1_drv.c | 24 +++++++++++++++++++++- 4 files changed, 31 insertions(+), 1 deletion(-) diff --git a/Documentation/devicetree/bindings/media/renesas,vsp1.txt b/Documentation/devicetree/bindings/media/renesas,vsp1.txt index 627405abd144..9b695bcbf219 100644 --- a/Documentation/devicetree/bindings/media/renesas,vsp1.txt +++ b/Documentation/devicetree/bindings/media/renesas,vsp1.txt @@ -14,6 +14,11 @@ Required properties: - interrupts: VSP interrupt specifier. - clocks: A phandle + clock-specifier pair for the VSP functional clock. +Optional properties: + + - renesas,fcp: A phandle referencing the FCP that handles memory accesses + for the VSP. Not needed on Gen2, mandatory on Gen3. + Example: R8A7790 (R-Car H2) VSP1-S node diff --git a/drivers/media/platform/Kconfig b/drivers/media/platform/Kconfig index cbb4e5735bf8..b12502555544 100644 --- a/drivers/media/platform/Kconfig +++ b/drivers/media/platform/Kconfig @@ -272,6 +272,7 @@ config VIDEO_RENESAS_VSP1 tristate "Renesas VSP1 Video Processing Engine" depends on VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API && HAS_DMA depends on (ARCH_SHMOBILE && OF) || COMPILE_TEST + depends on m || VIDEO_RENESAS_FCP != m select VIDEOBUF2_DMA_CONTIG ---help--- This is a V4L2 driver for the Renesas VSP1 video processing engine. diff --git a/drivers/media/platform/vsp1/vsp1.h b/drivers/media/platform/vsp1/vsp1.h index 910d6b8e8b50..4316766c6489 100644 --- a/drivers/media/platform/vsp1/vsp1.h +++ b/drivers/media/platform/vsp1/vsp1.h @@ -25,6 +25,7 @@ struct clk; struct device; +struct rcar_fcp_device; struct vsp1_dl; struct vsp1_drm; @@ -63,6 +64,7 @@ struct vsp1_device { void __iomem *mmio; struct clk *clock; + struct rcar_fcp_device *fcp; struct mutex lock; int ref_count; diff --git a/drivers/media/platform/vsp1/vsp1_drv.c b/drivers/media/platform/vsp1/vsp1_drv.c index da43e3f35610..f1b8343cc166 100644 --- a/drivers/media/platform/vsp1/vsp1_drv.c +++ b/drivers/media/platform/vsp1/vsp1_drv.c @@ -21,6 +21,7 @@ #include #include +#include #include #include "vsp1.h" @@ -491,8 +492,11 @@ int vsp1_device_get(struct vsp1_device *vsp1) if (ret < 0) goto done; + rcar_fcp_enable(vsp1->fcp); + ret = vsp1_device_init(vsp1); if (ret < 0) { + rcar_fcp_disable(vsp1->fcp); clk_disable_unprepare(vsp1->clock); goto done; } @@ -515,8 +519,10 @@ void vsp1_device_put(struct vsp1_device *vsp1) { mutex_lock(&vsp1->lock); - if (--vsp1->ref_count == 0) + if (--vsp1->ref_count == 0) { + rcar_fcp_disable(vsp1->fcp); clk_disable_unprepare(vsp1->clock); + } mutex_unlock(&vsp1->lock); } @@ -537,6 +543,7 @@ static int vsp1_pm_suspend(struct device *dev) vsp1_pipelines_suspend(vsp1); + rcar_fcp_disable(vsp1->fcp); clk_disable_unprepare(vsp1->clock); return 0; @@ -552,6 +559,7 @@ static int vsp1_pm_resume(struct device *dev) return 0; clk_prepare_enable(vsp1->clock); + rcar_fcp_enable(vsp1->fcp); vsp1_pipelines_resume(vsp1); @@ -633,6 +641,7 @@ static const struct vsp1_device_info vsp1_device_infos[] = { static int vsp1_probe(struct platform_device *pdev) { struct vsp1_device *vsp1; + struct device_node *fcp_node; struct resource *irq; struct resource *io; unsigned int i; @@ -673,6 +682,18 @@ static int vsp1_probe(struct platform_device *pdev) return ret; } + /* FCP (optional) */ + fcp_node = of_parse_phandle(pdev->dev.of_node, "renesas,fcp", 0); + if (fcp_node) { + vsp1->fcp = rcar_fcp_get(fcp_node); + of_node_put(fcp_node); + if (IS_ERR(vsp1->fcp)) { + dev_dbg(&pdev->dev, "FCP not found (%ld)\n", + PTR_ERR(vsp1->fcp)); + return PTR_ERR(vsp1->fcp); + } + } + /* Configure device parameters based on the version register. */ ret = clk_prepare_enable(vsp1->clock); if (ret < 0) @@ -713,6 +734,7 @@ static int vsp1_remove(struct platform_device *pdev) struct vsp1_device *vsp1 = platform_get_drvdata(pdev); vsp1_destroy_entities(vsp1); + rcar_fcp_put(vsp1->fcp); return 0; }