2020-09-17 17:53:16

by Prabhakar Mahadev Lad

[permalink] [raw]
Subject: [PATCH v6 0/3] media: i2c: ov772x: Enable BT.656 mode and test pattern support

Hi All,

This patch series adds support for BT.656 mode in the ov772x sensor
and also enables color bar test pattern control.

Cheers,
Prabhakar

v5->v6
* Introduced new function ov772x_parse_dt()
* Moved the backward compatibility comment from 1/3 to 2/3

v4->v5:
* Put the ep instance back using fwnode_handle_put()
* Renamed BT656 to BT.656
* Correctly handled backward compatibility case falling
back to parallel mode.

v3->v4:
* New patch 1/3 to fallback in parallel mode.
* Switched to v4l2_fwnode_endpoint_alloc_parse() for parsing the ep.
* Dropped support for pdat for test pattern control.
* DT documentation patches [1].

v2->v3:
* Dropped DT binding documentation patch as this is handled by Jacopo.
* Fixed review comments pointed by Jacopo.

v2:
https://patchwork.kernel.org/project/linux-renesas-soc/
list/?series=328133

v1:
https://patchwork.kernel.org/project/linux-renesas-soc/
list/?series=323807

[1] https://patchwork.kernel.org/project/
linux-renesas-soc/list/?series=346809

Lad Prabhakar (3):
media: i2c: ov772x: Parse endpoint properties
media: i2c: ov772x: Add support for BT.656 mode
media: i2c: ov772x: Add test pattern control

drivers/media/i2c/ov772x.c | 70 +++++++++++++++++++++++++++++++++++++-
1 file changed, 69 insertions(+), 1 deletion(-)

--
2.17.1


2020-09-17 17:53:38

by Prabhakar Mahadev Lad

[permalink] [raw]
Subject: [PATCH v6 1/3] media: i2c: ov772x: Parse endpoint properties

Parse endpoint properties using v4l2_fwnode_endpoint_alloc_parse()
to determine the bus type and store it in the driver structure.

Set bus_type to V4L2_MBUS_PARALLEL as it's the only supported one

Signed-off-by: Lad Prabhakar <[email protected]>
---
drivers/media/i2c/ov772x.c | 34 ++++++++++++++++++++++++++++++++++
1 file changed, 34 insertions(+)

diff --git a/drivers/media/i2c/ov772x.c b/drivers/media/i2c/ov772x.c
index 2cc6a678069a..f61a3f09ad64 100644
--- a/drivers/media/i2c/ov772x.c
+++ b/drivers/media/i2c/ov772x.c
@@ -31,6 +31,7 @@
#include <media/v4l2-ctrls.h>
#include <media/v4l2-device.h>
#include <media/v4l2-event.h>
+#include <media/v4l2-fwnode.h>
#include <media/v4l2-image-sizes.h>
#include <media/v4l2-subdev.h>

@@ -434,6 +435,7 @@ struct ov772x_priv {
#ifdef CONFIG_MEDIA_CONTROLLER
struct media_pad pad;
#endif
+ enum v4l2_mbus_type bus_type;
};

/*
@@ -1348,6 +1350,34 @@ static const struct v4l2_subdev_ops ov772x_subdev_ops = {
.pad = &ov772x_subdev_pad_ops,
};

+static int ov772x_parse_dt(struct i2c_client *client,
+ struct ov772x_priv *priv)
+{
+ struct v4l2_fwnode_endpoint bus_cfg;
+ struct fwnode_handle *ep;
+ int ret;
+
+ ep = fwnode_graph_get_next_endpoint(dev_fwnode(&client->dev),
+ NULL);
+ if (!ep) {
+ dev_err(&client->dev, "Endpoint node not found\n");
+ return -EINVAL;
+ }
+
+ bus_cfg.bus_type = V4L2_MBUS_PARALLEL;
+ ret = v4l2_fwnode_endpoint_alloc_parse(ep, &bus_cfg);
+ if (ret)
+ goto error_fwnode_put;
+
+ priv->bus_type = bus_cfg.bus_type;
+ v4l2_fwnode_endpoint_free(&bus_cfg);
+
+error_fwnode_put:
+ fwnode_handle_put(ep);
+
+ return ret;
+}
+
/*
* i2c_driver function
*/
@@ -1415,6 +1445,10 @@ static int ov772x_probe(struct i2c_client *client)
goto error_clk_put;
}

+ ret = ov772x_parse_dt(client, priv);
+ if (ret)
+ goto error_clk_put;
+
ret = ov772x_video_probe(priv);
if (ret < 0)
goto error_gpio_put;
--
2.17.1

2020-09-30 10:29:55

by jacopo mondi

[permalink] [raw]
Subject: Re: [PATCH v6 1/3] media: i2c: ov772x: Parse endpoint properties

Hi

On Thu, Sep 17, 2020 at 06:42:22PM +0100, Lad Prabhakar wrote:
> Parse endpoint properties using v4l2_fwnode_endpoint_alloc_parse()
> to determine the bus type and store it in the driver structure.
>
> Set bus_type to V4L2_MBUS_PARALLEL as it's the only supported one
>
> Signed-off-by: Lad Prabhakar <[email protected]>

Looks good!

Reviewed-by: Jacopo Mondi <[email protected]>

Thanks
j

> ---
> drivers/media/i2c/ov772x.c | 34 ++++++++++++++++++++++++++++++++++
> 1 file changed, 34 insertions(+)
>
> diff --git a/drivers/media/i2c/ov772x.c b/drivers/media/i2c/ov772x.c
> index 2cc6a678069a..f61a3f09ad64 100644
> --- a/drivers/media/i2c/ov772x.c
> +++ b/drivers/media/i2c/ov772x.c
> @@ -31,6 +31,7 @@
> #include <media/v4l2-ctrls.h>
> #include <media/v4l2-device.h>
> #include <media/v4l2-event.h>
> +#include <media/v4l2-fwnode.h>
> #include <media/v4l2-image-sizes.h>
> #include <media/v4l2-subdev.h>
>
> @@ -434,6 +435,7 @@ struct ov772x_priv {
> #ifdef CONFIG_MEDIA_CONTROLLER
> struct media_pad pad;
> #endif
> + enum v4l2_mbus_type bus_type;
> };
>
> /*
> @@ -1348,6 +1350,34 @@ static const struct v4l2_subdev_ops ov772x_subdev_ops = {
> .pad = &ov772x_subdev_pad_ops,
> };
>
> +static int ov772x_parse_dt(struct i2c_client *client,
> + struct ov772x_priv *priv)
> +{
> + struct v4l2_fwnode_endpoint bus_cfg;
> + struct fwnode_handle *ep;
> + int ret;
> +
> + ep = fwnode_graph_get_next_endpoint(dev_fwnode(&client->dev),
> + NULL);
> + if (!ep) {
> + dev_err(&client->dev, "Endpoint node not found\n");
> + return -EINVAL;
> + }
> +
> + bus_cfg.bus_type = V4L2_MBUS_PARALLEL;
> + ret = v4l2_fwnode_endpoint_alloc_parse(ep, &bus_cfg);
> + if (ret)
> + goto error_fwnode_put;
> +
> + priv->bus_type = bus_cfg.bus_type;
> + v4l2_fwnode_endpoint_free(&bus_cfg);
> +
> +error_fwnode_put:
> + fwnode_handle_put(ep);
> +
> + return ret;
> +}
> +
> /*
> * i2c_driver function
> */
> @@ -1415,6 +1445,10 @@ static int ov772x_probe(struct i2c_client *client)
> goto error_clk_put;
> }
>
> + ret = ov772x_parse_dt(client, priv);
> + if (ret)
> + goto error_clk_put;
> +
> ret = ov772x_video_probe(priv);
> if (ret < 0)
> goto error_gpio_put;
> --
> 2.17.1
>

2020-09-30 11:47:40

by Sakari Ailus

[permalink] [raw]
Subject: Re: [PATCH v6 1/3] media: i2c: ov772x: Parse endpoint properties

Hi Prabhakar,

On Thu, Sep 17, 2020 at 06:42:22PM +0100, Lad Prabhakar wrote:
> Parse endpoint properties using v4l2_fwnode_endpoint_alloc_parse()
> to determine the bus type and store it in the driver structure.
>
> Set bus_type to V4L2_MBUS_PARALLEL as it's the only supported one
>
> Signed-off-by: Lad Prabhakar <[email protected]>
> ---
> drivers/media/i2c/ov772x.c | 34 ++++++++++++++++++++++++++++++++++
> 1 file changed, 34 insertions(+)
>
> diff --git a/drivers/media/i2c/ov772x.c b/drivers/media/i2c/ov772x.c
> index 2cc6a678069a..f61a3f09ad64 100644
> --- a/drivers/media/i2c/ov772x.c
> +++ b/drivers/media/i2c/ov772x.c
> @@ -31,6 +31,7 @@
> #include <media/v4l2-ctrls.h>
> #include <media/v4l2-device.h>
> #include <media/v4l2-event.h>
> +#include <media/v4l2-fwnode.h>
> #include <media/v4l2-image-sizes.h>
> #include <media/v4l2-subdev.h>
>
> @@ -434,6 +435,7 @@ struct ov772x_priv {
> #ifdef CONFIG_MEDIA_CONTROLLER
> struct media_pad pad;
> #endif
> + enum v4l2_mbus_type bus_type;
> };
>
> /*
> @@ -1348,6 +1350,34 @@ static const struct v4l2_subdev_ops ov772x_subdev_ops = {
> .pad = &ov772x_subdev_pad_ops,
> };
>
> +static int ov772x_parse_dt(struct i2c_client *client,
> + struct ov772x_priv *priv)
> +{
> + struct v4l2_fwnode_endpoint bus_cfg;
> + struct fwnode_handle *ep;
> + int ret;
> +
> + ep = fwnode_graph_get_next_endpoint(dev_fwnode(&client->dev),
> + NULL);
> + if (!ep) {
> + dev_err(&client->dev, "Endpoint node not found\n");
> + return -EINVAL;
> + }
> +
> + bus_cfg.bus_type = V4L2_MBUS_PARALLEL;

Please zero the entire struct, i.e. do this assignment in the declaration.

You can also use v4l2_fwnode_endpoint_parse() if you're not using the link
frequencies --- sensor drivers generally should but you could only add them
as optional at this point (out of scope of this patch).

> + ret = v4l2_fwnode_endpoint_alloc_parse(ep, &bus_cfg);
> + if (ret)
> + goto error_fwnode_put;
> +
> + priv->bus_type = bus_cfg.bus_type;
> + v4l2_fwnode_endpoint_free(&bus_cfg);
> +
> +error_fwnode_put:
> + fwnode_handle_put(ep);
> +
> + return ret;
> +}
> +
> /*
> * i2c_driver function
> */
> @@ -1415,6 +1445,10 @@ static int ov772x_probe(struct i2c_client *client)
> goto error_clk_put;
> }
>
> + ret = ov772x_parse_dt(client, priv);
> + if (ret)
> + goto error_clk_put;
> +
> ret = ov772x_video_probe(priv);
> if (ret < 0)
> goto error_gpio_put;
> --
> 2.17.1
>

--
Sakari Ailus

2020-09-30 12:21:31

by Lad, Prabhakar

[permalink] [raw]
Subject: Re: [PATCH v6 1/3] media: i2c: ov772x: Parse endpoint properties

HI Sakari,

Thank you for the review.

On Wed, Sep 30, 2020 at 12:45 PM Sakari Ailus
<[email protected]> wrote:
>
> Hi Prabhakar,
>
> On Thu, Sep 17, 2020 at 06:42:22PM +0100, Lad Prabhakar wrote:
> > Parse endpoint properties using v4l2_fwnode_endpoint_alloc_parse()
> > to determine the bus type and store it in the driver structure.
> >
> > Set bus_type to V4L2_MBUS_PARALLEL as it's the only supported one
> >
> > Signed-off-by: Lad Prabhakar <[email protected]>
> > ---
> > drivers/media/i2c/ov772x.c | 34 ++++++++++++++++++++++++++++++++++
> > 1 file changed, 34 insertions(+)
> >
> > diff --git a/drivers/media/i2c/ov772x.c b/drivers/media/i2c/ov772x.c
> > index 2cc6a678069a..f61a3f09ad64 100644
> > --- a/drivers/media/i2c/ov772x.c
> > +++ b/drivers/media/i2c/ov772x.c
> > @@ -31,6 +31,7 @@
> > #include <media/v4l2-ctrls.h>
> > #include <media/v4l2-device.h>
> > #include <media/v4l2-event.h>
> > +#include <media/v4l2-fwnode.h>
> > #include <media/v4l2-image-sizes.h>
> > #include <media/v4l2-subdev.h>
> >
> > @@ -434,6 +435,7 @@ struct ov772x_priv {
> > #ifdef CONFIG_MEDIA_CONTROLLER
> > struct media_pad pad;
> > #endif
> > + enum v4l2_mbus_type bus_type;
> > };
> >
> > /*
> > @@ -1348,6 +1350,34 @@ static const struct v4l2_subdev_ops ov772x_subdev_ops = {
> > .pad = &ov772x_subdev_pad_ops,
> > };
> >
> > +static int ov772x_parse_dt(struct i2c_client *client,
> > + struct ov772x_priv *priv)
> > +{
> > + struct v4l2_fwnode_endpoint bus_cfg;
> > + struct fwnode_handle *ep;
> > + int ret;
> > +
> > + ep = fwnode_graph_get_next_endpoint(dev_fwnode(&client->dev),
> > + NULL);
> > + if (!ep) {
> > + dev_err(&client->dev, "Endpoint node not found\n");
> > + return -EINVAL;
> > + }
> > +
> > + bus_cfg.bus_type = V4L2_MBUS_PARALLEL;
>
> Please zero the entire struct, i.e. do this assignment in the declaration.
>
Agreed, but instead at the declaration I would prefer here as below,
since patch 2/3 has a comment related to backward compatibility with
the bindings. Is this OK with you ?
bus_cfg = (struct v4l2_fwnode_endpoint)
{ .bus_type = V4L2_MBUS_PARALLEL };

> You can also use v4l2_fwnode_endpoint_parse() if you're not using the link
> frequencies --- sensor drivers generally should but you could only add them
> as optional at this point (out of scope of this patch).
>
will stick with this for now :)

Cheers,
Prabhakar

2020-10-01 19:35:51

by Sakari Ailus

[permalink] [raw]
Subject: Re: [PATCH v6 1/3] media: i2c: ov772x: Parse endpoint properties

On Wed, Sep 30, 2020 at 01:19:40PM +0100, Lad, Prabhakar wrote:
> HI Sakari,
>
> Thank you for the review.
>
> On Wed, Sep 30, 2020 at 12:45 PM Sakari Ailus
> <[email protected]> wrote:
> >
> > Hi Prabhakar,
> >
> > On Thu, Sep 17, 2020 at 06:42:22PM +0100, Lad Prabhakar wrote:
> > > Parse endpoint properties using v4l2_fwnode_endpoint_alloc_parse()
> > > to determine the bus type and store it in the driver structure.
> > >
> > > Set bus_type to V4L2_MBUS_PARALLEL as it's the only supported one
> > >
> > > Signed-off-by: Lad Prabhakar <[email protected]>
> > > ---
> > > drivers/media/i2c/ov772x.c | 34 ++++++++++++++++++++++++++++++++++
> > > 1 file changed, 34 insertions(+)
> > >
> > > diff --git a/drivers/media/i2c/ov772x.c b/drivers/media/i2c/ov772x.c
> > > index 2cc6a678069a..f61a3f09ad64 100644
> > > --- a/drivers/media/i2c/ov772x.c
> > > +++ b/drivers/media/i2c/ov772x.c
> > > @@ -31,6 +31,7 @@
> > > #include <media/v4l2-ctrls.h>
> > > #include <media/v4l2-device.h>
> > > #include <media/v4l2-event.h>
> > > +#include <media/v4l2-fwnode.h>
> > > #include <media/v4l2-image-sizes.h>
> > > #include <media/v4l2-subdev.h>
> > >
> > > @@ -434,6 +435,7 @@ struct ov772x_priv {
> > > #ifdef CONFIG_MEDIA_CONTROLLER
> > > struct media_pad pad;
> > > #endif
> > > + enum v4l2_mbus_type bus_type;
> > > };
> > >
> > > /*
> > > @@ -1348,6 +1350,34 @@ static const struct v4l2_subdev_ops ov772x_subdev_ops = {
> > > .pad = &ov772x_subdev_pad_ops,
> > > };
> > >
> > > +static int ov772x_parse_dt(struct i2c_client *client,
> > > + struct ov772x_priv *priv)
> > > +{
> > > + struct v4l2_fwnode_endpoint bus_cfg;
> > > + struct fwnode_handle *ep;
> > > + int ret;
> > > +
> > > + ep = fwnode_graph_get_next_endpoint(dev_fwnode(&client->dev),
> > > + NULL);
> > > + if (!ep) {
> > > + dev_err(&client->dev, "Endpoint node not found\n");
> > > + return -EINVAL;
> > > + }
> > > +
> > > + bus_cfg.bus_type = V4L2_MBUS_PARALLEL;
> >
> > Please zero the entire struct, i.e. do this assignment in the declaration.
> >
> Agreed, but instead at the declaration I would prefer here as below,
> since patch 2/3 has a comment related to backward compatibility with
> the bindings. Is this OK with you ?
> bus_cfg = (struct v4l2_fwnode_endpoint)
> { .bus_type = V4L2_MBUS_PARALLEL };

Why not in variable declaration?

--
Sakari Ailus