summaryrefslogtreecommitdiff
path: root/drivers/media/platform/sunxi
diff options
context:
space:
mode:
authorPaul Kocialkowski <paul.kocialkowski@bootlin.com>2022-11-03 16:37:16 +0000
committerMauro Carvalho Chehab <mchehab@kernel.org>2022-11-25 07:23:53 +0000
commit0fbbb09c024dc65ac2616967caf09d48778c20b4 (patch)
treece95cee15d0becf5b6dfdd9c0ec854b10923a0f6 /drivers/media/platform/sunxi
parent24e6c88a07670e301758d3b131e6f1f2b093a8d1 (diff)
media: sun6i-csi: Detect the availability of the ISP
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>
Diffstat (limited to 'drivers/media/platform/sunxi')
-rw-r--r--drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.c34
-rw-r--r--drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.h3
2 files changed, 37 insertions, 0 deletions
diff --git a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.c b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.c
index 6d3508ae6e87..0513b7b0c2a0 100644
--- a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.c
+++ b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.c
@@ -24,6 +24,36 @@
#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;
diff --git a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.h b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.h
index e611bdd6e9b2..8e232cd91ebe 100644
--- a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.h
+++ b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.h
@@ -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 {