diff mbox series

[v1] media: i2c: ov5640: Implement get_mbus_config

Message ID 20230127151245.46732-1-marcel@ziswiler.com
State New
Headers show
Series [v1] media: i2c: ov5640: Implement get_mbus_config | expand

Commit Message

Marcel Ziswiler Jan. 27, 2023, 3:12 p.m. UTC
From: Aishwarya Kothari <aishwarya.kothari@toradex.com>

Implement the introduced get_mbus_config operation to report the
number of used data lanes on the MIPI CSI-2 interface.

Signed-off-by: Aishwarya Kothari <aishwarya.kothari@toradex.com>
Signed-off-by: Marcel Ziswiler <marcel.ziswiler@toradex.com>

---

 drivers/media/i2c/ov5640.c | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

Comments

Laurent Pinchart Jan. 27, 2023, 6:34 p.m. UTC | #1
On Fri, Jan 27, 2023 at 06:50:03PM +0100, Jacopo Mondi wrote:
> On Fri, Jan 27, 2023 at 04:12:44PM +0100, Marcel Ziswiler wrote:
> > From: Aishwarya Kothari <aishwarya.kothari@toradex.com>
> >
> > Implement the introduced get_mbus_config operation to report the
> > number of used data lanes on the MIPI CSI-2 interface.
> >
> 
> OV5640 can operate in parallel mode too.
> 
> You can check how it currently configured with ov5640_is_csi2() and
> populate struct v4l2_mbus_config accordingly.

I'm also wondering which CSI-2 receiver needs .get_mbus_config() for the
ov5640. The number of lanes is usually specified in DT, on both sides of
the link. It's only when selecting a number of lanes dynamically at
runtime that .get_mbus_config() is needed.

> > Signed-off-by: Aishwarya Kothari <aishwarya.kothari@toradex.com>
> > Signed-off-by: Marcel Ziswiler <marcel.ziswiler@toradex.com>
> >
> > ---
> >
> >  drivers/media/i2c/ov5640.c | 14 ++++++++++++++
> >  1 file changed, 14 insertions(+)
> >
> > diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c
> > index e0f908af581b..42d43f0d1e1c 100644
> > --- a/drivers/media/i2c/ov5640.c
> > +++ b/drivers/media/i2c/ov5640.c
> > @@ -3733,6 +3733,19 @@ static int ov5640_init_cfg(struct v4l2_subdev *sd,
> >  	return 0;
> >  }
> >
> > +static int ov5640_get_mbus_config(struct v4l2_subdev *sd,
> > +				   unsigned int pad,
> > +				   struct v4l2_mbus_config *cfg)
> > +{
> > +	struct ov5640_dev *sensor = to_ov5640_dev(sd);
> > +
> > +	cfg->type = V4L2_MBUS_CSI2_DPHY;
> > +	cfg->bus.mipi_csi2.num_data_lanes = sensor->ep.bus.mipi_csi2.num_data_lanes;
> > +	cfg->bus.mipi_csi2.flags = 0;
> > +
> > +	return 0;
> > +}
> > +
> >  static const struct v4l2_subdev_core_ops ov5640_core_ops = {
> >  	.log_status = v4l2_ctrl_subdev_log_status,
> >  	.subscribe_event = v4l2_ctrl_subdev_subscribe_event,
> > @@ -3753,6 +3766,7 @@ static const struct v4l2_subdev_pad_ops ov5640_pad_ops = {
> >  	.get_selection = ov5640_get_selection,
> >  	.enum_frame_size = ov5640_enum_frame_size,
> >  	.enum_frame_interval = ov5640_enum_frame_interval,
> > +	.get_mbus_config = ov5640_get_mbus_config,
> >  };
> >
> >  static const struct v4l2_subdev_ops ov5640_subdev_ops = {
Marcel Ziswiler Jan. 28, 2023, 8:31 a.m. UTC | #2
Hi Jacopo

On Fri, 2023-01-27 at 18:50 +0100, Jacopo Mondi wrote:
> Hi Marcel
> 
> On Fri, Jan 27, 2023 at 04:12:44PM +0100, Marcel Ziswiler wrote:
> > From: Aishwarya Kothari <aishwarya.kothari@toradex.com>
> > 
> > Implement the introduced get_mbus_config operation to report the
> > number of used data lanes on the MIPI CSI-2 interface.
> > 
> 
> OV5640 can operate in parallel mode too.

I admit, we totally neglected this.

> You can check how it currently configured with ov5640_is_csi2() and
> populate struct v4l2_mbus_config accordingly.

Makes sense. Let us incorporate this in a v2.

> Thanks
>    j

Thank you!

Cheers

Marcel

> > Signed-off-by: Aishwarya Kothari <aishwarya.kothari@toradex.com>
> > Signed-off-by: Marcel Ziswiler <marcel.ziswiler@toradex.com>
> > 
> > ---
> > 
> >  drivers/media/i2c/ov5640.c | 14 ++++++++++++++
> >  1 file changed, 14 insertions(+)
> > 
> > diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c
> > index e0f908af581b..42d43f0d1e1c 100644
> > --- a/drivers/media/i2c/ov5640.c
> > +++ b/drivers/media/i2c/ov5640.c
> > @@ -3733,6 +3733,19 @@ static int ov5640_init_cfg(struct v4l2_subdev *sd,
> >         return 0;
> >  }
> > 
> > +static int ov5640_get_mbus_config(struct v4l2_subdev *sd,
> > +                                  unsigned int pad,
> > +                                  struct v4l2_mbus_config *cfg)
> > +{
> > +       struct ov5640_dev *sensor = to_ov5640_dev(sd);
> > +
> > +       cfg->type = V4L2_MBUS_CSI2_DPHY;
> > +       cfg->bus.mipi_csi2.num_data_lanes = sensor->ep.bus.mipi_csi2.num_data_lanes;
> > +       cfg->bus.mipi_csi2.flags = 0;
> > +
> > +       return 0;
> > +}
> > +
> >  static const struct v4l2_subdev_core_ops ov5640_core_ops = {
> >         .log_status = v4l2_ctrl_subdev_log_status,
> >         .subscribe_event = v4l2_ctrl_subdev_subscribe_event,
> > @@ -3753,6 +3766,7 @@ static const struct v4l2_subdev_pad_ops ov5640_pad_ops = {
> >         .get_selection = ov5640_get_selection,
> >         .enum_frame_size = ov5640_enum_frame_size,
> >         .enum_frame_interval = ov5640_enum_frame_interval,
> > +       .get_mbus_config = ov5640_get_mbus_config,
> >  };
> > 
> >  static const struct v4l2_subdev_ops ov5640_subdev_ops = {
> > --
> > 2.36.1
Jacopo Mondi Jan. 28, 2023, 10:06 a.m. UTC | #3
Hi Laurent

On Fri, Jan 27, 2023 at 08:34:07PM +0200, Laurent Pinchart wrote:
> On Fri, Jan 27, 2023 at 06:50:03PM +0100, Jacopo Mondi wrote:
> > On Fri, Jan 27, 2023 at 04:12:44PM +0100, Marcel Ziswiler wrote:
> > > From: Aishwarya Kothari <aishwarya.kothari@toradex.com>
> > >
> > > Implement the introduced get_mbus_config operation to report the
> > > number of used data lanes on the MIPI CSI-2 interface.
> > >
> >
> > OV5640 can operate in parallel mode too.
> >
> > You can check how it currently configured with ov5640_is_csi2() and
> > populate struct v4l2_mbus_config accordingly.
>
> I'm also wondering which CSI-2 receiver needs .get_mbus_config() for the
> ov5640. The number of lanes is usually specified in DT, on both sides of
> the link. It's only when selecting a number of lanes dynamically at
> runtime that .get_mbus_config() is needed.
>

iirc Aishwarya and Marcel reported issues on i.MX6 so I presume they
need get_mbus_config as a drivers in staging/media/imx/ requires
that:

drivers/staging/media/imx/imx6-mipi-csi2.c
Fetches the remote mbus config to get the number of lanes and make
sure the bus type is CSI-2

drivers/staging/media/imx/imx-media-csi.c
Fetches the remote mbus config to deduce the bus type in use

In both cases I concur the callers can be fixed to parse their
endpoints but looking at commit 7318abface486d6a6389731810f5b60650daedb5
it seems that was not the plan (reason not clear to me)

> > > Signed-off-by: Aishwarya Kothari <aishwarya.kothari@toradex.com>
> > > Signed-off-by: Marcel Ziswiler <marcel.ziswiler@toradex.com>
> > >
> > > ---
> > >
> > >  drivers/media/i2c/ov5640.c | 14 ++++++++++++++
> > >  1 file changed, 14 insertions(+)
> > >
> > > diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c
> > > index e0f908af581b..42d43f0d1e1c 100644
> > > --- a/drivers/media/i2c/ov5640.c
> > > +++ b/drivers/media/i2c/ov5640.c
> > > @@ -3733,6 +3733,19 @@ static int ov5640_init_cfg(struct v4l2_subdev *sd,
> > >  	return 0;
> > >  }
> > >
> > > +static int ov5640_get_mbus_config(struct v4l2_subdev *sd,
> > > +				   unsigned int pad,
> > > +				   struct v4l2_mbus_config *cfg)
> > > +{
> > > +	struct ov5640_dev *sensor = to_ov5640_dev(sd);
> > > +
> > > +	cfg->type = V4L2_MBUS_CSI2_DPHY;
> > > +	cfg->bus.mipi_csi2.num_data_lanes = sensor->ep.bus.mipi_csi2.num_data_lanes;
> > > +	cfg->bus.mipi_csi2.flags = 0;
> > > +
> > > +	return 0;
> > > +}
> > > +
> > >  static const struct v4l2_subdev_core_ops ov5640_core_ops = {
> > >  	.log_status = v4l2_ctrl_subdev_log_status,
> > >  	.subscribe_event = v4l2_ctrl_subdev_subscribe_event,
> > > @@ -3753,6 +3766,7 @@ static const struct v4l2_subdev_pad_ops ov5640_pad_ops = {
> > >  	.get_selection = ov5640_get_selection,
> > >  	.enum_frame_size = ov5640_enum_frame_size,
> > >  	.enum_frame_interval = ov5640_enum_frame_interval,
> > > +	.get_mbus_config = ov5640_get_mbus_config,
> > >  };
> > >
> > >  static const struct v4l2_subdev_ops ov5640_subdev_ops = {
>
> --
> Regards,
>
> Laurent Pinchart
Marcel Ziswiler Jan. 28, 2023, 11:36 a.m. UTC | #4
Hi Laurent

On Fri, 2023-01-27 at 20:34 +0200, Laurent Pinchart wrote:
> On Fri, Jan 27, 2023 at 06:50:03PM +0100, Jacopo Mondi wrote:
> > On Fri, Jan 27, 2023 at 04:12:44PM +0100, Marcel Ziswiler wrote:
> > > From: Aishwarya Kothari <aishwarya.kothari@toradex.com>
> > > 
> > > Implement the introduced get_mbus_config operation to report the
> > > number of used data lanes on the MIPI CSI-2 interface.
> > > 
> > 
> > OV5640 can operate in parallel mode too.
> > 
> > You can check how it currently configured with ov5640_is_csi2() and
> > populate struct v4l2_mbus_config accordingly.
> 
> I'm also wondering which CSI-2 receiver needs .get_mbus_config() for the
> ov5640. The number of lanes is usually specified in DT, on both sides of
> the link. It's only when selecting a number of lanes dynamically at
> runtime that .get_mbus_config() is needed.

Remember, this is on Apalis iMX6 where we do and always did specify the lanes on both sides of the link ([1],
[2]) or are we missing anything else in that respect?

Fact is, that with this patch (and the two from Hans [3], [4]) all starts working again. So it really seems
required.

[1]
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/arm/boot/dts/imx6qdl-apalis.dtsi#n710
[2]
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/arm/boot/dts/imx6qdl-apalis.dtsi#n755
[3] https://lore.kernel.org/all/69624c54-7cbd-7362-c468-f8ffea9614be@xs4all.nl/
[4] https://lore.kernel.org/all/c12cfcc5-1d46-7b5f-4a27-f4cd52a1b885@xs4all.nl/

Cheers

Marcel

> > > Signed-off-by: Aishwarya Kothari <aishwarya.kothari@toradex.com>
> > > Signed-off-by: Marcel Ziswiler <marcel.ziswiler@toradex.com>
> > > 
> > > ---
> > > 
> > >  drivers/media/i2c/ov5640.c | 14 ++++++++++++++
> > >  1 file changed, 14 insertions(+)
> > > 
> > > diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c
> > > index e0f908af581b..42d43f0d1e1c 100644
> > > --- a/drivers/media/i2c/ov5640.c
> > > +++ b/drivers/media/i2c/ov5640.c
> > > @@ -3733,6 +3733,19 @@ static int ov5640_init_cfg(struct v4l2_subdev *sd,
> > >         return 0;
> > >  }
> > > 
> > > +static int ov5640_get_mbus_config(struct v4l2_subdev *sd,
> > > +                                  unsigned int pad,
> > > +                                  struct v4l2_mbus_config *cfg)
> > > +{
> > > +       struct ov5640_dev *sensor = to_ov5640_dev(sd);
> > > +
> > > +       cfg->type = V4L2_MBUS_CSI2_DPHY;
> > > +       cfg->bus.mipi_csi2.num_data_lanes = sensor->ep.bus.mipi_csi2.num_data_lanes;
> > > +       cfg->bus.mipi_csi2.flags = 0;
> > > +
> > > +       return 0;
> > > +}
> > > +
> > >  static const struct v4l2_subdev_core_ops ov5640_core_ops = {
> > >         .log_status = v4l2_ctrl_subdev_log_status,
> > >         .subscribe_event = v4l2_ctrl_subdev_subscribe_event,
> > > @@ -3753,6 +3766,7 @@ static const struct v4l2_subdev_pad_ops ov5640_pad_ops = {
> > >         .get_selection = ov5640_get_selection,
> > >         .enum_frame_size = ov5640_enum_frame_size,
> > >         .enum_frame_interval = ov5640_enum_frame_interval,
> > > +       .get_mbus_config = ov5640_get_mbus_config,
> > >  };
> > > 
> > >  static const struct v4l2_subdev_ops ov5640_subdev_ops = {
Philipp Zabel Jan. 30, 2023, 9:24 a.m. UTC | #5
Hi Jacopo,

On Sat, Jan 28, 2023 at 11:06:11AM +0100, Jacopo Mondi wrote:
> Hi Laurent
> 
> On Fri, Jan 27, 2023 at 08:34:07PM +0200, Laurent Pinchart wrote:
> > On Fri, Jan 27, 2023 at 06:50:03PM +0100, Jacopo Mondi wrote:
> > > On Fri, Jan 27, 2023 at 04:12:44PM +0100, Marcel Ziswiler wrote:
> > > > From: Aishwarya Kothari <aishwarya.kothari@toradex.com>
> > > >
> > > > Implement the introduced get_mbus_config operation to report the
> > > > number of used data lanes on the MIPI CSI-2 interface.
> > > >
> > >
> > > OV5640 can operate in parallel mode too.
> > >
> > > You can check how it currently configured with ov5640_is_csi2() and
> > > populate struct v4l2_mbus_config accordingly.
> >
> > I'm also wondering which CSI-2 receiver needs .get_mbus_config() for the
> > ov5640. The number of lanes is usually specified in DT, on both sides of
> > the link. It's only when selecting a number of lanes dynamically at
> > runtime that .get_mbus_config() is needed.
> >
> 
> iirc Aishwarya and Marcel reported issues on i.MX6 so I presume they
> need get_mbus_config as a drivers in staging/media/imx/ requires
> that:
> 
> drivers/staging/media/imx/imx6-mipi-csi2.c
> Fetches the remote mbus config to get the number of lanes and make
> sure the bus type is CSI-2
> 
> drivers/staging/media/imx/imx-media-csi.c
> Fetches the remote mbus config to deduce the bus type in use
> 
> In both cases I concur the callers can be fixed to parse their
> endpoints but looking at commit 7318abface486d6a6389731810f5b60650daedb5
> it seems that was not the plan (reason not clear to me)

The tc358743 driver dynamically changes the number of active lanes
depending on bandwidth requirements.

regards
Philipp
diff mbox series

Patch

diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c
index e0f908af581b..42d43f0d1e1c 100644
--- a/drivers/media/i2c/ov5640.c
+++ b/drivers/media/i2c/ov5640.c
@@ -3733,6 +3733,19 @@  static int ov5640_init_cfg(struct v4l2_subdev *sd,
 	return 0;
 }
 
+static int ov5640_get_mbus_config(struct v4l2_subdev *sd,
+				   unsigned int pad,
+				   struct v4l2_mbus_config *cfg)
+{
+	struct ov5640_dev *sensor = to_ov5640_dev(sd);
+
+	cfg->type = V4L2_MBUS_CSI2_DPHY;
+	cfg->bus.mipi_csi2.num_data_lanes = sensor->ep.bus.mipi_csi2.num_data_lanes;
+	cfg->bus.mipi_csi2.flags = 0;
+
+	return 0;
+}
+
 static const struct v4l2_subdev_core_ops ov5640_core_ops = {
 	.log_status = v4l2_ctrl_subdev_log_status,
 	.subscribe_event = v4l2_ctrl_subdev_subscribe_event,
@@ -3753,6 +3766,7 @@  static const struct v4l2_subdev_pad_ops ov5640_pad_ops = {
 	.get_selection = ov5640_get_selection,
 	.enum_frame_size = ov5640_enum_frame_size,
 	.enum_frame_interval = ov5640_enum_frame_interval,
+	.get_mbus_config = ov5640_get_mbus_config,
 };
 
 static const struct v4l2_subdev_ops ov5640_subdev_ops = {