Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 94fcdf82 authored by Laurent Pinchart's avatar Laurent Pinchart Committed by Mauro Carvalho Chehab
Browse files

[media] v4l: vsp1: Add FCP support



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: default avatarLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@s-opensource.com>
parent c7b12cfd
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -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

+1 −0
Original line number Diff line number Diff line
@@ -265,6 +265,7 @@ config VIDEO_RENESAS_VSP1
	tristate "Renesas VSP1 Video Processing Engine"
	depends on VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API && HAS_DMA
	depends on (ARCH_RENESAS && OF) || COMPILE_TEST
	depends on !ARM64 || VIDEO_RENESAS_FCP
	select VIDEOBUF2_DMA_CONTIG
	---help---
	  This is a V4L2 driver for the Renesas VSP1 video processing engine.
+2 −0
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@

struct clk;
struct device;
struct rcar_fcp_device;

struct vsp1_drm;
struct vsp1_entity;
@@ -62,6 +63,7 @@ struct vsp1_device {
	const struct vsp1_device_info *info;

	void __iomem *mmio;
	struct rcar_fcp_device *fcp;

	struct vsp1_bru *bru;
	struct vsp1_hsit *hsi;
+20 −1
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@
#include <linux/pm_runtime.h>
#include <linux/videodev2.h>

#include <media/rcar-fcp.h>
#include <media/v4l2-subdev.h>

#include "vsp1.h"
@@ -514,6 +515,10 @@ static int vsp1_pm_resume(struct device *dev)

static int vsp1_pm_runtime_suspend(struct device *dev)
{
	struct vsp1_device *vsp1 = dev_get_drvdata(dev);

	rcar_fcp_disable(vsp1->fcp);

	return 0;
}

@@ -528,7 +533,7 @@ static int vsp1_pm_runtime_resume(struct device *dev)
			return ret;
	}

	return 0;
	return rcar_fcp_enable(vsp1->fcp);
}

static const struct dev_pm_ops vsp1_pm_ops = {
@@ -614,6 +619,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;
@@ -649,6 +655,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. */
	pm_runtime_enable(&pdev->dev);

@@ -694,6 +712,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);

	pm_runtime_disable(&pdev->dev);