Message ID | 20220415152811.636419-44-paul.kocialkowski@bootlin.com |
---|---|
State | Superseded |
Headers | show |
Series | Allwinner A31/A83T MIPI CSI-2 and A31 ISP / CSI Rework | expand |
On Thu, Apr 28, 2022 at 09:55:56AM +0200, Paul Kocialkowski wrote: > Hi Jernej, > > Thanks a lot for all your reviews! > > On Wed 27 Apr 22, 22:07, Jernej Škrabec wrote: > > Dne petek, 15. april 2022 ob 17:28:09 CEST je Paul Kocialkowski napisal(a): > > > 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)) > > > > Where is this symbol defined? > > That is defined through Kconfig's auto-generated header, from the associated > option for the ISP driver. It is defined in the ISP support series so this > will effectively always be false for now. Can the ISP be compiled as a module, but the CSI driver built-in? If so, that would create a dependency from the kernel image to a module, which won't compile. Maxime
On Thu, Apr 28, 2022 at 01:43:44PM +0200, Paul Kocialkowski wrote: > Hi Maxime, > > On Thu 28 Apr 22, 10:11, Maxime Ripard wrote: > > On Thu, Apr 28, 2022 at 09:55:56AM +0200, Paul Kocialkowski wrote: > > > Hi Jernej, > > > > > > Thanks a lot for all your reviews! > > > > > > On Wed 27 Apr 22, 22:07, Jernej Škrabec wrote: > > > > Dne petek, 15. april 2022 ob 17:28:09 CEST je Paul Kocialkowski napisal(a): > > > > > 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)) > > > > > > > > Where is this symbol defined? > > > > > > That is defined through Kconfig's auto-generated header, from the associated > > > option for the ISP driver. It is defined in the ISP support series so this > > > will effectively always be false for now. > > > > Can the ISP be compiled as a module, but the CSI driver built-in? > > I think so yes, I don't see any reason why not. > > > If so, > > that would create a dependency from the kernel image to a module, which > > won't compile. > > I think this would introduce a run-time dependency (sun6i-csi needing sun6i-isp > in order to register) but I don't understand why it wouldn't compile though. > Could you ellaborate a bit? Never mind, that was a brainfart, I was somehow thinking you wer calling a function there. Maxime
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 {
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(+)