media: sun6i-csi: Detect the availability of the ISP
authorPaul Kocialkowski <paul.kocialkowski@bootlin.com>
Thu, 3 Nov 2022 16:37:16 +0000 (16:37 +0000)
committerMauro Carvalho Chehab <mchehab@kernel.org>
Fri, 25 Nov 2022 07:23:53 +0000 (07:23 +0000)
Add a helper to detect whether the ISP is available and connected
and store the indication in the driver-specific device structure.

Signed-off-by: Paul Kocialkowski <paul.kocialkowski@bootlin.com>
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.c
drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.h

index 6d3508ae6e872facb581ad4ef577c42ce17c26c8..0513b7b0c2a0457f42d5b6b5988132c2d56bfaae 100644 (file)
 #include "sun6i_csi_capture.h"
 #include "sun6i_csi_reg.h"
 
+/* ISP */
+
+static int sun6i_csi_isp_detect(struct sun6i_csi_device *csi_dev)
+{
+       struct device *dev = csi_dev->dev;
+       struct fwnode_handle *handle;
+
+       /*
+        * ISP is not available if not connected via fwnode graph.
+        * This will also check that the remote parent node is available.
+        */
+       handle = fwnode_graph_get_endpoint_by_id(dev_fwnode(dev),
+                                                SUN6I_CSI_PORT_ISP, 0,
+                                                FWNODE_GRAPH_ENDPOINT_NEXT);
+       if (!handle)
+               return 0;
+
+       fwnode_handle_put(handle);
+
+       if (!IS_ENABLED(CONFIG_VIDEO_SUN6I_ISP)) {
+               dev_warn(dev,
+                        "ISP link is detected but not enabled in kernel config!");
+               return 0;
+       }
+
+       csi_dev->isp_available = true;
+
+       return 0;
+}
+
 /* Media */
 
 static const struct media_device_ops sun6i_csi_media_ops = {
@@ -289,6 +319,10 @@ static int sun6i_csi_probe(struct platform_device *platform_dev)
        if (ret)
                return ret;
 
+       ret = sun6i_csi_isp_detect(csi_dev);
+       if (ret)
+               goto error_resources;
+
        ret = sun6i_csi_v4l2_setup(csi_dev);
        if (ret)
                goto error_resources;
index e611bdd6e9b21646a89f9ffbceddf1b309fcc052..8e232cd91ebe671c3d4ed8de37ea1a3757ef29f8 100644 (file)
@@ -21,6 +21,7 @@
 enum sun6i_csi_port {
        SUN6I_CSI_PORT_PARALLEL         = 0,
        SUN6I_CSI_PORT_MIPI_CSI2        = 1,
+       SUN6I_CSI_PORT_ISP              = 2,
 };
 
 struct sun6i_csi_buffer {
@@ -44,6 +45,8 @@ struct sun6i_csi_device {
        struct clk                      *clock_mod;
        struct clk                      *clock_ram;
        struct reset_control            *reset;
+
+       bool                            isp_available;
 };
 
 struct sun6i_csi_variant {