From: Mathis Foerst <mathis.foerst@mt.com>
To: Sakari Ailus <sakari.ailus@iki.fi>
Cc: Dan Carpenter <dan.carpenter@linaro.org>,
linux-kernel@vger.kernel.org,
Steve Longerbeam <slongerbeam@gmail.com>,
Philipp Zabel <p.zabel@pengutronix.de>,
Mauro Carvalho Chehab <mchehab@kernel.org>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Shawn Guo <shawnguo@kernel.org>,
Sascha Hauer <s.hauer@pengutronix.de>,
Pengutronix Kernel Team <kernel@pengutronix.de>,
Fabio Estevam <festevam@gmail.com>,
linux-media@vger.kernel.org, linux-staging@lists.linux.dev,
imx@lists.linux.dev, linux-arm-kernel@lists.infradead.org,
manuel.traut@mt.com, mathis.foerst@zuehlke.com
Subject: Re: [PATCH v1 1/1] media: imx: csi: Parse link configuration from fw_node
Date: Fri, 21 Mar 2025 16:28:23 +0100 [thread overview]
Message-ID: <Z92Fl+85ZpJmRL0F@mt.com> (raw)
In-Reply-To: <Z9RP5K59sZwuphIc@valkosipuli.retiisi.eu>
Hi Sakari
On Fri, Mar 14, 2025 at 03:48:52PM +0000, Sakari Ailus wrote:
> Hi Mathis,
>
> On Fri, Mar 14, 2025 at 04:26:14PM +0100, Mathis Foerst wrote:
> > On Mon, Mar 10, 2025 at 10:25:04AM +0000, Sakari Ailus wrote:
> > Hi Sakari,
> >
> > > Hi Mathis,
> > >
> > > On Fri, Mar 07, 2025 at 02:38:29PM +0100, Mathis Foerst wrote:
> > > > Hi Sakari, Hi Dan,
> > > >
> > > > thanks a lot for your feedback.
> > > >
> > > > On Thu, Mar 06, 2025 at 09:13:46PM +0000, Sakari Ailus wrote:
> > > > > Hi Dan,
> > > > >
> > > > > On Thu, Mar 06, 2025 at 10:07:20PM +0300, Dan Carpenter wrote:
> > > > > > On Thu, Mar 06, 2025 at 04:33:18PM +0000, Sakari Ailus wrote:
> > > > > > > Hi Mathis,
> > > > > > >
> > > > > > > Thanks for the patch.
> > > > > > >
> > > > > > > On Wed, Mar 05, 2025 at 12:38:02PM +0100, Mathis Foerst wrote:
> > > > > > > > The imx-media-csi driver requires upstream camera drivers to implement
> > > > > > > > the subdev-pad-op "get_mbus_config" [0]. Camera drivers that don't
> > > > > > > > implement this function are not usable on the i.MX6.
> > > > > > > >
> > > > > > > > The docs for get_mbus_config [1] say:
> > > > > > > > @get_mbus_config: get the media bus configuration of a remote sub-device.
> > > > > > > > The media bus configuration is usually retrieved from the
> > > > > > > > firmware interface at sub-device probe time, immediately
> > > > > > > > applied to the hardware and eventually adjusted by the
> > > > > > > > driver.
> > > > > > > >
> > > > > > > > Currently, the imx-media-csi driver is not incorporating the information
> > > > > > > > from the firmware interface and therefore relies on the implementation of
> > > > > > > > get_mbus_config by the camera driver.
> > > > > > > >
> > > > > > > > To be compatible with camera drivers not implementing get_mbus_config
> > > > > > > > (which is the usual case), use the bus information from the fw interface:
> > > > > > > >
> > > > > > > > The camera does not necessarily has a direct media bus link to the CSI as
> > > > > > > > the video-mux and/or the MIPI CSI-2 receiver of the i.MX6 might be in
> > > > > > > > between them on the media pipeline.
> > > > > > > > The CSI driver already implements the functionality to find the connected
> > > > > > > > camera sub-device to call get_mbus_config on it.
> > > > > > > >
> > > > > > > > At this point the driver is modified as follows:
> > > > > > > > In the case that get_mbus_config is not implemented by the upstream
> > > > > > > > camera, try to get its endpoint configuration from the firmware interface
> > > > > > > > usign v4l2_fwnode_endpoint_parse.
> > > > > > > > For the supported mbus_types (V4L2_MBUS_PARALLEL, V4L2_MBUS_BT656 and
> > > > > > > > V4L2_MBUS_CSI2_DPHY), extract the mbus_config from the endpoint
> > > > > > > > configuration.
> > > > > > > > For all other mbus_types, return an error.
> > > > > > > >
> > > > > > > > Note that parsing the mbus_config from the fw interface is not done during
> > > > > > > > probing because the camera that's connected to the CSI can change based on
> > > > > > > > the selected input of the video-mux at runtime.
> > > > > > > >
> > > > > > > > [0] drivers/staging/media/imx/imx-media-csi.c - line 211..216
> > > > > > > > [1] include/media/v4l2-subdev.h - line 814
> > > > > > > >
> > > > > > > > Signed-off-by: Mathis Foerst <mathis.foerst@mt.com>
> > > > > > > > ---
> > > > > > > > drivers/staging/media/imx/imx-media-csi.c | 36 ++++++++++++++++++++---
> > > > > > > > 1 file changed, 32 insertions(+), 4 deletions(-)
> > > > > > > >
> > > > > > > > diff --git a/drivers/staging/media/imx/imx-media-csi.c b/drivers/staging/media/imx/imx-media-csi.c
> > > > > > > > index 3edbc57be2ca..394a9321a10b 100644
> > > > > > > > --- a/drivers/staging/media/imx/imx-media-csi.c
> > > > > > > > +++ b/drivers/staging/media/imx/imx-media-csi.c
> > > > > > > > @@ -169,6 +169,8 @@ static int csi_get_upstream_mbus_config(struct csi_priv *priv,
> > > > > > > > {
> > > > > > > > struct v4l2_subdev *sd, *remote_sd;
> > > > > > > > struct media_pad *remote_pad;
> > > > > > > > + struct fwnode_handle *ep_node;
> > > > > > > > + struct v4l2_fwnode_endpoint ep = { .bus_type = 0 };
> > > > > > >
> > > > > > > Are there any defaults in DT bindings (other than 0's)? Also initialising a
> > > > > > > field to zero this way is redundant, just use {}.
> > > > > > >
> > > > > >
> > > > > > I was going to respond in much the same way. This is equivalen to:
> > > > > >
> > > > > > struct v4l2_fwnode_endpoint ep = { .bus_type = V4L2_MBUS_UNKNOWN };
> > > > >
> > > > > Thinking about this in a context of parsing the endpoint, in fact the
> > > > > bus_type should be specified. Presumably the hardware is D-PHY, so the
> > > > > correct value would be V4L2_MBUS_CSI2_DPHY. This way
> > > > > v4l2_fwnode_endpoint_parse() doesn't need to guess.
> > > >
> > > > I think we must use "bus_type = V4L2_MBUS_UNKNOWN" here:
> > > >
> > > > The i.MX6 has two types of camera interfaces: Parallel and MIPI CSI-2.
> > > > They are connected either directly or via a video-mux to the CSIs
> > > > (See IMX6DQRM.pdf - Figure 9-3 for the connection diagram)
> > > >
> > > > Pre-defining V4L2_MBUS_CSI2_DPHY here would let
> > > > v4l2_fwnode_endpoint_parse() fail if the camera uses the parallel bus.
> > > >
> > > > We could distinguish between MIPI CSI-2 and Parallel input by checking
> > > > the grp_id of the upstream device like it's already done in
> > > > csi_get_upstream_mbus_config().
> > > > But for the Parallel case we still can't know if we should set bus_type
> > > > to V4L2_MBUS_PARALLEL or to V4L2_MBUS_BT656 - the i.MX6 supports both
> > > > formats on the parallel interface.
> > > >
> > > > That's why I would argue that v4l2_fwnode_endpoint_parse() must figure
> > > > out the bus_type from the fw node.
> > >
> > > Right, nowadays you can indeed do this -- it wasn't a long ago when you
> > > couldn't. I presume the bindings do specify the bus-type property is
> > > mandatory? Where are the bindings btw.?
> > >
> >
> > From my understanding, it's not even required to set the bus-type as
> > v4l2_fwnode_endpoint_parse() will try to parse the endpoint first as a
> > CSI-2 bus and in case of failure as a Parallel bus if the bus-type is
> > unknown (see drivers/media/v4l2-core/v4l2-fwnode.c#L493).
>
> It only exists for compatibility with old drivers. Do not add new users for
> this code.
>
> >
> > About the bindings:
> >
> > There are bindings for the MIPI CSI-2 receiver:
> > Documentation/devicetree/bindings/media/imx.txt
> > I think here it's not necessary to make the bus-type property mandatory
> > as the imx6-mipi-csi2 driver enforces V4L2_MBUS_CSI2_DPHY anyhow
> > (see drivers/staging/media/imx/imx6-mipi-csi2.c#L677).
>
> That seems to document a CSI-2 to parallel bridge, with support for four
> virtual channels. I'd suppose you parse the ports knowing which interface
> they use.
Yes, the video-mux has 5 input channels: 4 for the virtual MIPI channels
and one for the parallel port.
I now used this to determine the port type before parsing the endpoint.
If the parallel port is used, I must try to parse the endpoint as
V4L2_MBUS_PARALLEL and as V4L2_MBUS_BT656 because both formats are
possible on this port.
I submitted an updated version of the patch.
>
> >
> > For the case of a camera with parallel bus, the camera endpoint is
> > connected to a video-mux and not directly to the CSI. Therefore, we cannot
> > make the bus-type property mandatory on this endpoint as it this wouldn't
> > apply to other use-cases of video-mux.
> >
> > > >
> > > > >
> > > > > >
> > > > > > > > int ret;
> > > > > > > >
> > > > > > > > if (!priv->src_sd)
> > > > > > > > @@ -210,11 +212,37 @@ static int csi_get_upstream_mbus_config(struct csi_priv *priv,
> > > > > > > >
> > > > > > > > ret = v4l2_subdev_call(remote_sd, pad, get_mbus_config,
> > > > > > > > remote_pad->index, mbus_cfg);
> > > > > > > > - if (ret == -ENOIOCTLCMD)
> > > > > > > > - v4l2_err(&priv->sd,
> > > > > > > > - "entity %s does not implement get_mbus_config()\n",
> > > > > > > > - remote_pad->entity->name);
> > > > > > > > + if (ret == -ENOIOCTLCMD) {
> > > > > > >
> > > > > > > if (!ret)
> > > > > > > return 0;
> > > > > > >
> > > > > > > And you can unindent the rest.
> > > > > >
> > > > > > I was going to say this too but then I thought actually this needs to
> > > > > > be:
> > > > > >
> > > > > > if (ret != -ENOIOCTLCMD)
> > > > > > return ret;
> > > > > >
> > > > > > Which is weird. Better to break all the new code into a separate
> > > > > > helper function.
> > > > > >
> > > > > > if (ret == -ENOIOCTLCMD)
> > > > > > ret = parse_fw_link_config_stuff();
> > > > > >
> > > > > > return ret;
> > > >
> > > > Good point. I factored out a helper function as suggested.
> > > >
> > > > >
> > > > > Indeed. get_mbus_config() presumably wouldn't return an error but
> > > > > correctness is usually a good idea.
> > > > >
> > >
>
> --
> Regards,
>
> Sakari Ailus
Best regards,
Mathis Foerst
prev parent reply other threads:[~2025-03-21 15:28 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-03-05 11:38 [PATCH v1 0/1] media: imx: csi: Parse link configuration from fw_node Mathis Foerst
2025-03-05 11:38 ` [PATCH v1 1/1] " Mathis Foerst
2025-03-06 16:33 ` Sakari Ailus
2025-03-06 19:07 ` Dan Carpenter
2025-03-06 21:13 ` Sakari Ailus
2025-03-07 13:38 ` Mathis Foerst
2025-03-10 10:25 ` Sakari Ailus
2025-03-14 15:26 ` Mathis Foerst
2025-03-14 15:48 ` Sakari Ailus
2025-03-21 15:28 ` Mathis Foerst [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Z92Fl+85ZpJmRL0F@mt.com \
--to=mathis.foerst@mt.com \
--cc=dan.carpenter@linaro.org \
--cc=festevam@gmail.com \
--cc=gregkh@linuxfoundation.org \
--cc=imx@lists.linux.dev \
--cc=kernel@pengutronix.de \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=linux-staging@lists.linux.dev \
--cc=manuel.traut@mt.com \
--cc=mathis.foerst@zuehlke.com \
--cc=mchehab@kernel.org \
--cc=p.zabel@pengutronix.de \
--cc=s.hauer@pengutronix.de \
--cc=sakari.ailus@iki.fi \
--cc=shawnguo@kernel.org \
--cc=slongerbeam@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.