[media] v4l: vsp1: Add FCP support
authorLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Fri, 12 Feb 2016 00:49:14 +0000 (22:49 -0200)
committerMauro Carvalho Chehab <mchehab@s-opensource.com>
Fri, 17 Jun 2016 11:11:45 +0000 (08:11 -0300)
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 <laurent.pinchart+renesas@ideasonboard.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Documentation/devicetree/bindings/media/renesas,vsp1.txt
drivers/media/platform/Kconfig
drivers/media/platform/vsp1/vsp1.h
drivers/media/platform/vsp1/vsp1_drv.c

index 627405abd144f8f6ee0a65e6f67d5961a4c6c89d..9b695bcbf2190bdd7a327579b3b0951a35524516 100644 (file)
@@ -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
 
index d6fe4fe924e7196cbd027c01a2c86cf85028ea37..9d0a3ffe36d2d36c7b0af06c86e0ad7eaf62d585 100644 (file)
@@ -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.
index 37cc05e34de01e59061dd3e523a09c963b38da81..7cb0f5e428df383a169ac405017ee10af24bf8b7 100644 (file)
@@ -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;
index 13907d4f08af0acc378a7db9700a355019796ed0..e655639af7e2ad7946de0339451ba6d6e913aa89 100644 (file)
@@ -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);