lkml.org 
[lkml]   [2022]   [Apr]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v4 43/45] media: sun6i-csi: Detect the availability of the ISP
    Date
    Add a helper to detect whether the ISP is available and connected
    and store the indication in a driver-wide variable.

    Signed-off-by: Paul Kocialkowski <paul.kocialkowski@bootlin.com>
    ---
    .../platform/sunxi/sun6i-csi/sun6i_csi.c | 33 +++++++++++++++++++
    .../platform/sunxi/sun6i-csi/sun6i_csi.h | 3 ++
    2 files changed, 36 insertions(+)

    diff --git a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.c b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.c
    index a88deb8ba1e7..f185cbd113c7 100644
    --- a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.c
    +++ b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.c
    @@ -25,6 +25,35 @@
    #include "sun6i_csi_capture.h"
    #include "sun6i_csi_reg.h"

    +/* ISP */
    +
    +static bool sun6i_csi_isp_detect(struct sun6i_csi_device *csi_dev)
    +{
    + struct device *dev = csi_dev->dev;
    + struct fwnode_handle *handle = NULL;
    +
    + /* ISP is not available if disabled in kernel config. */
    + if (!IS_ENABLED(CONFIG_VIDEO_SUN6I_ISP))
    + return 0;
    +
    + /*
    + * ISP is not available if not connected via fwnode graph.
    + * This weill 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);
    +
    + dev_info(dev, "ISP link is available\n");
    + csi_dev->isp_available = true;
    +
    + return 0;
    +}
    +
    /* Media */

    static const struct media_device_ops sun6i_csi_media_ops = {
    @@ -306,6 +335,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 6aa83dd11684..9b105c341047 100644
    --- a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.h
    +++ b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.h
    @@ -22,6 +22,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 {
    @@ -46,6 +47,8 @@ struct sun6i_csi_device {
    struct clk *clock_mod;
    struct clk *clock_ram;
    struct reset_control *reset;
    +
    + bool isp_available;
    };

    struct sun6i_csi_variant {
    --
    2.35.2
    \
     
     \ /
      Last update: 2022-04-15 17:33    [W:4.418 / U:0.432 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site