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>
This commit is contained in:
Paul Kocialkowski 2022-11-03 16:37:16 +00:00 committed by Mauro Carvalho Chehab
parent 24e6c88a07
commit 0fbbb09c02
2 changed files with 37 additions and 0 deletions

View file

@ -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;

View 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 {