linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/2] media: ov6650: Add V4L2 asynchronous subdevice support
@ 2019-03-25  0:34 Janusz Krzysztofik
  2019-03-25  0:35 ` [PATCH 1/2] media: ov6650: Move v4l2_clk_get() to ov6650_video_probe() helper Janusz Krzysztofik
                   ` (2 more replies)
  0 siblings, 3 replies; 14+ messages in thread
From: Janusz Krzysztofik @ 2019-03-25  0:34 UTC (permalink / raw)
  To: Mauro Carvalho Chehab
  Cc: Hans Verkuil, Sakari Ailus, linux-media, linux-kernel,
	Janusz Krzysztofik

Janusz Krzysztofik (2):
      media: ov6650: Move v4l2_clk_get() to ov6650_video_probe() helper
      media: ov6650: Register with asynchronous subdevice framework

 ov6650.c |   45 +++++++++++++++++++++++++++++----------------
 1 file changed, 29 insertions(+), 16 deletions(-)



^ permalink raw reply	[flat|nested] 14+ messages in thread

* [PATCH 1/2] media: ov6650: Move v4l2_clk_get() to ov6650_video_probe() helper
  2019-03-25  0:34 [PATCH 0/2] media: ov6650: Add V4L2 asynchronous subdevice support Janusz Krzysztofik
@ 2019-03-25  0:35 ` Janusz Krzysztofik
  2019-03-29 18:39   ` Sakari Ailus
  2019-03-25  0:35 ` [PATCH 2/2] media: ov6650: Register with asynchronous subdevice framework Janusz Krzysztofik
  2019-03-29 20:29 ` [PATCH v2 0/2] media: ov6650: Add V4L2 asynchronous subdevice support Janusz Krzysztofik
  2 siblings, 1 reply; 14+ messages in thread
From: Janusz Krzysztofik @ 2019-03-25  0:35 UTC (permalink / raw)
  To: Mauro Carvalho Chehab
  Cc: Hans Verkuil, Sakari Ailus, linux-media, linux-kernel,
	Janusz Krzysztofik

In preparation for adding asynchronous subdevice support to the driver,
don't acquire v4l2_clk from the driver .probe() callback as that may
fail if the clock is provided by a bridge driver which may be not yet
initialized.  Move the v4l2_clk_get() to ov6650_video_probe() helper
which is going to be converted to v4l2_subdev_internal_ops.registered()
callback, executed only when the bridge driver is ready.

Signed-off-by: Janusz Krzysztofik <jmkrzyszt@gmail.com>
---
 drivers/media/i2c/ov6650.c | 25 ++++++++++++++-----------
 1 file changed, 14 insertions(+), 11 deletions(-)

diff --git a/drivers/media/i2c/ov6650.c b/drivers/media/i2c/ov6650.c
index c33fd584cb44..f10b8053ed73 100644
--- a/drivers/media/i2c/ov6650.c
+++ b/drivers/media/i2c/ov6650.c
@@ -810,9 +810,16 @@ static int ov6650_video_probe(struct i2c_client *client)
 	u8		pidh, pidl, midh, midl;
 	int		ret;
 
+	priv->clk = v4l2_clk_get(&client->dev, NULL);
+	if (IS_ERR(priv->clk)) {
+		ret = PTR_ERR(priv->clk);
+		dev_err(&client->dev, "v4l2_clk request err: %d\n", ret);
+		return ret;
+	}
+
 	ret = ov6650_s_power(&priv->subdev, 1);
 	if (ret < 0)
-		return ret;
+		goto eclkput;
 
 	/*
 	 * check and show product ID and manufacturer ID
@@ -847,6 +854,11 @@ static int ov6650_video_probe(struct i2c_client *client)
 
 done:
 	ov6650_s_power(&priv->subdev, 0);
+	if (ret) {
+eclkput:
+		v4l2_clk_put(priv->clk);
+	}
+
 	return ret;
 }
 
@@ -989,18 +1001,9 @@ static int ov6650_probe(struct i2c_client *client,
 	priv->code	  = MEDIA_BUS_FMT_YUYV8_2X8;
 	priv->colorspace  = V4L2_COLORSPACE_JPEG;
 
-	priv->clk = v4l2_clk_get(&client->dev, NULL);
-	if (IS_ERR(priv->clk)) {
-		ret = PTR_ERR(priv->clk);
-		goto eclkget;
-	}
-
 	ret = ov6650_video_probe(client);
-	if (ret) {
-		v4l2_clk_put(priv->clk);
-eclkget:
+	if (ret)
 		v4l2_ctrl_handler_free(&priv->hdl);
-	}
 
 	return ret;
 }
-- 
2.19.2


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH 2/2] media: ov6650: Register with asynchronous subdevice framework
  2019-03-25  0:34 [PATCH 0/2] media: ov6650: Add V4L2 asynchronous subdevice support Janusz Krzysztofik
  2019-03-25  0:35 ` [PATCH 1/2] media: ov6650: Move v4l2_clk_get() to ov6650_video_probe() helper Janusz Krzysztofik
@ 2019-03-25  0:35 ` Janusz Krzysztofik
  2019-03-29 20:29 ` [PATCH v2 0/2] media: ov6650: Add V4L2 asynchronous subdevice support Janusz Krzysztofik
  2 siblings, 0 replies; 14+ messages in thread
From: Janusz Krzysztofik @ 2019-03-25  0:35 UTC (permalink / raw)
  To: Mauro Carvalho Chehab
  Cc: Hans Verkuil, Sakari Ailus, linux-media, linux-kernel,
	Janusz Krzysztofik

Register V4L2 subdevice implemented by the driver to the V4L2
asynchronous subdevice framework.

Signed-off-by: Janusz Krzysztofik <jmkrzyszt@gmail.com>
---
 drivers/media/i2c/ov6650.c | 20 +++++++++++++++-----
 1 file changed, 15 insertions(+), 5 deletions(-)

diff --git a/drivers/media/i2c/ov6650.c b/drivers/media/i2c/ov6650.c
index f10b8053ed73..cc9e5388d5ec 100644
--- a/drivers/media/i2c/ov6650.c
+++ b/drivers/media/i2c/ov6650.c
@@ -804,8 +804,9 @@ static int ov6650_prog_dflt(struct i2c_client *client)
 	return ret;
 }
 
-static int ov6650_video_probe(struct i2c_client *client)
+static int ov6650_video_probe(struct v4l2_subdev *sd)
 {
+	struct i2c_client *client = v4l2_get_subdevdata(sd);
 	struct ov6650 *priv = to_ov6650(client);
 	u8		pidh, pidl, midh, midl;
 	int		ret;
@@ -817,7 +818,7 @@ static int ov6650_video_probe(struct i2c_client *client)
 		return ret;
 	}
 
-	ret = ov6650_s_power(&priv->subdev, 1);
+	ret = ov6650_s_power(sd, 1);
 	if (ret < 0)
 		goto eclkput;
 
@@ -853,7 +854,7 @@ static int ov6650_video_probe(struct i2c_client *client)
 		ret = v4l2_ctrl_handler_setup(&priv->hdl);
 
 done:
-	ov6650_s_power(&priv->subdev, 0);
+	ov6650_s_power(sd, 0);
 	if (ret) {
 eclkput:
 		v4l2_clk_put(priv->clk);
@@ -941,6 +942,10 @@ static const struct v4l2_subdev_ops ov6650_subdev_ops = {
 	.pad	= &ov6650_pad_ops,
 };
 
+static const struct v4l2_subdev_internal_ops ov6650_internal_ops = {
+	.registered = ov6650_video_probe,
+};
+
 /*
  * i2c_driver function
  */
@@ -1001,7 +1006,12 @@ static int ov6650_probe(struct i2c_client *client,
 	priv->code	  = MEDIA_BUS_FMT_YUYV8_2X8;
 	priv->colorspace  = V4L2_COLORSPACE_JPEG;
 
-	ret = ov6650_video_probe(client);
+	priv->subdev.internal_ops = &ov6650_internal_ops;
+	priv->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
+	snprintf(priv->subdev.name, sizeof(priv->subdev.name), "%s %d-%04x",
+		 did->name, i2c_adapter_id(client->adapter), client->addr);
+
+	ret = v4l2_async_register_subdev(&priv->subdev);
 	if (ret)
 		v4l2_ctrl_handler_free(&priv->hdl);
 
@@ -1013,7 +1023,7 @@ static int ov6650_remove(struct i2c_client *client)
 	struct ov6650 *priv = to_ov6650(client);
 
 	v4l2_clk_put(priv->clk);
-	v4l2_device_unregister_subdev(&priv->subdev);
+	v4l2_async_unregister_subdev(&priv->subdev);
 	v4l2_ctrl_handler_free(&priv->hdl);
 	return 0;
 }
-- 
2.19.2


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/2] media: ov6650: Move v4l2_clk_get() to ov6650_video_probe() helper
  2019-03-25  0:35 ` [PATCH 1/2] media: ov6650: Move v4l2_clk_get() to ov6650_video_probe() helper Janusz Krzysztofik
@ 2019-03-29 18:39   ` Sakari Ailus
  2019-03-29 19:48     ` Janusz Krzysztofik
  0 siblings, 1 reply; 14+ messages in thread
From: Sakari Ailus @ 2019-03-29 18:39 UTC (permalink / raw)
  To: Janusz Krzysztofik
  Cc: Mauro Carvalho Chehab, Hans Verkuil, linux-media, linux-kernel

Hi Janus,

Thanks for the patchset.

On Mon, Mar 25, 2019 at 01:35:00AM +0100, Janusz Krzysztofik wrote:
> In preparation for adding asynchronous subdevice support to the driver,
> don't acquire v4l2_clk from the driver .probe() callback as that may
> fail if the clock is provided by a bridge driver which may be not yet
> initialized.  Move the v4l2_clk_get() to ov6650_video_probe() helper
> which is going to be converted to v4l2_subdev_internal_ops.registered()
> callback, executed only when the bridge driver is ready.
> 
> Signed-off-by: Janusz Krzysztofik <jmkrzyszt@gmail.com>
> ---
>  drivers/media/i2c/ov6650.c | 25 ++++++++++++++-----------
>  1 file changed, 14 insertions(+), 11 deletions(-)
> 
> diff --git a/drivers/media/i2c/ov6650.c b/drivers/media/i2c/ov6650.c
> index c33fd584cb44..f10b8053ed73 100644
> --- a/drivers/media/i2c/ov6650.c
> +++ b/drivers/media/i2c/ov6650.c
> @@ -810,9 +810,16 @@ static int ov6650_video_probe(struct i2c_client *client)
>  	u8		pidh, pidl, midh, midl;
>  	int		ret;
>  
> +	priv->clk = v4l2_clk_get(&client->dev, NULL);
> +	if (IS_ERR(priv->clk)) {
> +		ret = PTR_ERR(priv->clk);
> +		dev_err(&client->dev, "v4l2_clk request err: %d\n", ret);
> +		return ret;
> +	}
> +
>  	ret = ov6650_s_power(&priv->subdev, 1);
>  	if (ret < 0)
> -		return ret;
> +		goto eclkput;
>  
>  	/*
>  	 * check and show product ID and manufacturer ID
> @@ -847,6 +854,11 @@ static int ov6650_video_probe(struct i2c_client *client)
>  
>  done:
>  	ov6650_s_power(&priv->subdev, 0);
> +	if (ret) {
> +eclkput:
> +		v4l2_clk_put(priv->clk);

Could you rework the error handling, please? Labels should be outside
conditionals. See e.g. the smiapp driver
(drivers/media/i2c/smiapp/smiapp-core.c). I've pushed my master branch
here:

<URL:https://git.linuxtv.org/sailus/media_tree.git/log/>

The patch also does not apply on top of the media tree master + your
earlier patch cleanly.

> +	}
> +
>  	return ret;
>  }
>  
> @@ -989,18 +1001,9 @@ static int ov6650_probe(struct i2c_client *client,
>  	priv->code	  = MEDIA_BUS_FMT_YUYV8_2X8;
>  	priv->colorspace  = V4L2_COLORSPACE_JPEG;
>  
> -	priv->clk = v4l2_clk_get(&client->dev, NULL);
> -	if (IS_ERR(priv->clk)) {
> -		ret = PTR_ERR(priv->clk);
> -		goto eclkget;
> -	}
> -
>  	ret = ov6650_video_probe(client);
> -	if (ret) {
> -		v4l2_clk_put(priv->clk);
> -eclkget:
> +	if (ret)
>  		v4l2_ctrl_handler_free(&priv->hdl);
> -	}
>  
>  	return ret;
>  }

-- 
Kind regards,

Sakari Ailus
sakari.ailus@linux.intel.com

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/2] media: ov6650: Move v4l2_clk_get() to ov6650_video_probe() helper
  2019-03-29 18:39   ` Sakari Ailus
@ 2019-03-29 19:48     ` Janusz Krzysztofik
  2019-03-29 19:51       ` Sakari Ailus
  0 siblings, 1 reply; 14+ messages in thread
From: Janusz Krzysztofik @ 2019-03-29 19:48 UTC (permalink / raw)
  To: Sakari Ailus
  Cc: Mauro Carvalho Chehab, Hans Verkuil, linux-media, linux-kernel

Hi Sakari,

On Friday, March 29, 2019 7:39:24 PM CET Sakari Ailus wrote:
> Hi Janus,
> 
> Thanks for the patchset.
> 
> On Mon, Mar 25, 2019 at 01:35:00AM +0100, Janusz Krzysztofik wrote:
> > ...
> >  
> >  done:
> >  	ov6650_s_power(&priv->subdev, 0);
> > +	if (ret) {
> > +eclkput:
> > +		v4l2_clk_put(priv->clk);
> 
> Could you rework the error handling, please? Labels should be outside
> conditionals. 

OK.

> See e.g. the smiapp driver
> (drivers/media/i2c/smiapp/smiapp-core.c). I've pushed my master branch
> here:
> 
> <URL:https://git.linuxtv.org/sailus/media_tree.git/log/>

I'm currently syncing my linux-media remote tracking branches with 
git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media.git
Should I switch to a different repository, e.g. yours?

Thanks,
Janusz




^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/2] media: ov6650: Move v4l2_clk_get() to ov6650_video_probe() helper
  2019-03-29 19:48     ` Janusz Krzysztofik
@ 2019-03-29 19:51       ` Sakari Ailus
  0 siblings, 0 replies; 14+ messages in thread
From: Sakari Ailus @ 2019-03-29 19:51 UTC (permalink / raw)
  To: Janusz Krzysztofik
  Cc: Mauro Carvalho Chehab, Hans Verkuil, linux-media, linux-kernel

On Fri, Mar 29, 2019 at 08:48:19PM +0100, Janusz Krzysztofik wrote:
> Hi Sakari,
> 
> On Friday, March 29, 2019 7:39:24 PM CET Sakari Ailus wrote:
> > Hi Janus,
> > 
> > Thanks for the patchset.
> > 
> > On Mon, Mar 25, 2019 at 01:35:00AM +0100, Janusz Krzysztofik wrote:
> > > ...
> > >  
> > >  done:
> > >  	ov6650_s_power(&priv->subdev, 0);
> > > +	if (ret) {
> > > +eclkput:
> > > +		v4l2_clk_put(priv->clk);
> > 
> > Could you rework the error handling, please? Labels should be outside
> > conditionals. 
> 
> OK.
> 
> > See e.g. the smiapp driver
> > (drivers/media/i2c/smiapp/smiapp-core.c). I've pushed my master branch
> > here:
> > 
> > <URL:https://git.linuxtv.org/sailus/media_tree.git/log/>
> 
> I'm currently syncing my linux-media remote tracking branches with 
> git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media.git
> Should I switch to a different repository, e.g. yours?

Usually Mauro's tree is the best choice. I sometimes forget to update mine.
In this case just make sure these patches apply on top of the one merged
previouly if there's a dependency.

-- 
Sakari Ailus
sakari.ailus@linux.intel.com

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [PATCH v2 0/2] media: ov6650: Add V4L2 asynchronous subdevice support
  2019-03-25  0:34 [PATCH 0/2] media: ov6650: Add V4L2 asynchronous subdevice support Janusz Krzysztofik
  2019-03-25  0:35 ` [PATCH 1/2] media: ov6650: Move v4l2_clk_get() to ov6650_video_probe() helper Janusz Krzysztofik
  2019-03-25  0:35 ` [PATCH 2/2] media: ov6650: Register with asynchronous subdevice framework Janusz Krzysztofik
@ 2019-03-29 20:29 ` Janusz Krzysztofik
  2019-03-29 20:29   ` [PATCH v2 1/2] media: ov6650: Move v4l2_clk_get() to ov6650_video_probe() helper Janusz Krzysztofik
                     ` (2 more replies)
  2 siblings, 3 replies; 14+ messages in thread
From: Janusz Krzysztofik @ 2019-03-29 20:29 UTC (permalink / raw)
  To: Sakari Ailus
  Cc: Mauro Carvalho Chehab, Hans Verkuil, linux-media, linux-kernel,
	Janusz Krzysztofik

Janusz Krzysztofik (2):
      media: ov6650: Move v4l2_clk_get() to ov6650_video_probe() helper
      media: ov6650: Register with asynchronous subdevice framework

 ov6650.c |   45 +++++++++++++++++++++++++++++----------------
 1 file changed, 29 insertions(+), 16 deletions(-)

Changelog:
v1->v2:
- labels should be outside conditionals - thanks Sakari
- rebased on my former fix so it applied cleanly


^ permalink raw reply	[flat|nested] 14+ messages in thread

* [PATCH v2 1/2] media: ov6650: Move v4l2_clk_get() to ov6650_video_probe() helper
  2019-03-29 20:29 ` [PATCH v2 0/2] media: ov6650: Add V4L2 asynchronous subdevice support Janusz Krzysztofik
@ 2019-03-29 20:29   ` Janusz Krzysztofik
  2019-03-29 20:29   ` [PATCH v2 2/2] media: ov6650: Register with asynchronous subdevice framework Janusz Krzysztofik
  2019-03-30  1:06   ` [PATCH v3 0/2] media: ov6650: Add V4L2 asynchronous subdevice support Janusz Krzysztofik
  2 siblings, 0 replies; 14+ messages in thread
From: Janusz Krzysztofik @ 2019-03-29 20:29 UTC (permalink / raw)
  To: Sakari Ailus
  Cc: Mauro Carvalho Chehab, Hans Verkuil, linux-media, linux-kernel,
	Janusz Krzysztofik

In preparation for adding asynchronous subdevice support to the driver,
don't acquire v4l2_clk from the driver .probe() callback as that may
fail if the clock is provided by a bridge driver which may be not yet
initialized.  Move the v4l2_clk_get() to ov6650_video_probe() helper
which is going to be converted to v4l2_subdev_internal_ops.registered()
callback, executed only when the bridge driver is ready.

Signed-off-by: Janusz Krzysztofik <jmkrzyszt@gmail.com>
---
 drivers/media/i2c/ov6650.c | 25 ++++++++++++++-----------
 1 file changed, 14 insertions(+), 11 deletions(-)

diff --git a/drivers/media/i2c/ov6650.c b/drivers/media/i2c/ov6650.c
index f9359b11fa5c..de7d9790f054 100644
--- a/drivers/media/i2c/ov6650.c
+++ b/drivers/media/i2c/ov6650.c
@@ -810,9 +810,16 @@ static int ov6650_video_probe(struct i2c_client *client)
 	u8		pidh, pidl, midh, midl;
 	int		ret;
 
+	priv->clk = v4l2_clk_get(&client->dev, NULL);
+	if (IS_ERR(priv->clk)) {
+		ret = PTR_ERR(priv->clk);
+		dev_err(&client->dev, "v4l2_clk request err: %d\n", ret);
+		return ret;
+	}
+
 	ret = ov6650_s_power(&priv->subdev, 1);
 	if (ret < 0)
-		return ret;
+		goto eclkput;
 
 	msleep(20);
 
@@ -849,6 +856,11 @@ static int ov6650_video_probe(struct i2c_client *client)
 
 done:
 	ov6650_s_power(&priv->subdev, 0);
+	if (!ret)
+		return 0;
+eclkput:
+	v4l2_clk_put(priv->clk);
+
 	return ret;
 }
 
@@ -991,18 +1003,9 @@ static int ov6650_probe(struct i2c_client *client,
 	priv->code	  = MEDIA_BUS_FMT_YUYV8_2X8;
 	priv->colorspace  = V4L2_COLORSPACE_JPEG;
 
-	priv->clk = v4l2_clk_get(&client->dev, NULL);
-	if (IS_ERR(priv->clk)) {
-		ret = PTR_ERR(priv->clk);
-		goto eclkget;
-	}
-
 	ret = ov6650_video_probe(client);
-	if (ret) {
-		v4l2_clk_put(priv->clk);
-eclkget:
+	if (ret)
 		v4l2_ctrl_handler_free(&priv->hdl);
-	}
 
 	return ret;
 }
-- 
2.19.2


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH v2 2/2] media: ov6650: Register with asynchronous subdevice framework
  2019-03-29 20:29 ` [PATCH v2 0/2] media: ov6650: Add V4L2 asynchronous subdevice support Janusz Krzysztofik
  2019-03-29 20:29   ` [PATCH v2 1/2] media: ov6650: Move v4l2_clk_get() to ov6650_video_probe() helper Janusz Krzysztofik
@ 2019-03-29 20:29   ` Janusz Krzysztofik
  2019-03-29 22:35     ` Sakari Ailus
  2019-03-30  1:06   ` [PATCH v3 0/2] media: ov6650: Add V4L2 asynchronous subdevice support Janusz Krzysztofik
  2 siblings, 1 reply; 14+ messages in thread
From: Janusz Krzysztofik @ 2019-03-29 20:29 UTC (permalink / raw)
  To: Sakari Ailus
  Cc: Mauro Carvalho Chehab, Hans Verkuil, linux-media, linux-kernel,
	Janusz Krzysztofik

Register V4L2 subdevice implemented by the driver to the V4L2
asynchronous subdevice framework.

Signed-off-by: Janusz Krzysztofik <jmkrzyszt@gmail.com>
---
 drivers/media/i2c/ov6650.c | 20 +++++++++++++++-----
 1 file changed, 15 insertions(+), 5 deletions(-)

diff --git a/drivers/media/i2c/ov6650.c b/drivers/media/i2c/ov6650.c
index de7d9790f054..50e60da73036 100644
--- a/drivers/media/i2c/ov6650.c
+++ b/drivers/media/i2c/ov6650.c
@@ -804,8 +804,9 @@ static int ov6650_prog_dflt(struct i2c_client *client)
 	return ret;
 }
 
-static int ov6650_video_probe(struct i2c_client *client)
+static int ov6650_video_probe(struct v4l2_subdev *sd)
 {
+	struct i2c_client *client = v4l2_get_subdevdata(sd);
 	struct ov6650 *priv = to_ov6650(client);
 	u8		pidh, pidl, midh, midl;
 	int		ret;
@@ -817,7 +818,7 @@ static int ov6650_video_probe(struct i2c_client *client)
 		return ret;
 	}
 
-	ret = ov6650_s_power(&priv->subdev, 1);
+	ret = ov6650_s_power(sd, 1);
 	if (ret < 0)
 		goto eclkput;
 
@@ -855,7 +856,7 @@ static int ov6650_video_probe(struct i2c_client *client)
 		ret = v4l2_ctrl_handler_setup(&priv->hdl);
 
 done:
-	ov6650_s_power(&priv->subdev, 0);
+	ov6650_s_power(sd, 0);
 	if (!ret)
 		return 0;
 eclkput:
@@ -943,6 +944,10 @@ static const struct v4l2_subdev_ops ov6650_subdev_ops = {
 	.pad	= &ov6650_pad_ops,
 };
 
+static const struct v4l2_subdev_internal_ops ov6650_internal_ops = {
+	.registered = ov6650_video_probe,
+};
+
 /*
  * i2c_driver function
  */
@@ -1003,7 +1008,12 @@ static int ov6650_probe(struct i2c_client *client,
 	priv->code	  = MEDIA_BUS_FMT_YUYV8_2X8;
 	priv->colorspace  = V4L2_COLORSPACE_JPEG;
 
-	ret = ov6650_video_probe(client);
+	priv->subdev.internal_ops = &ov6650_internal_ops;
+	priv->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
+	snprintf(priv->subdev.name, sizeof(priv->subdev.name), "%s %d-%04x",
+		 did->name, i2c_adapter_id(client->adapter), client->addr);
+
+	ret = v4l2_async_register_subdev(&priv->subdev);
 	if (ret)
 		v4l2_ctrl_handler_free(&priv->hdl);
 
@@ -1015,7 +1025,7 @@ static int ov6650_remove(struct i2c_client *client)
 	struct ov6650 *priv = to_ov6650(client);
 
 	v4l2_clk_put(priv->clk);
-	v4l2_device_unregister_subdev(&priv->subdev);
+	v4l2_async_unregister_subdev(&priv->subdev);
 	v4l2_ctrl_handler_free(&priv->hdl);
 	return 0;
 }
-- 
2.19.2


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* Re: [PATCH v2 2/2] media: ov6650: Register with asynchronous subdevice framework
  2019-03-29 20:29   ` [PATCH v2 2/2] media: ov6650: Register with asynchronous subdevice framework Janusz Krzysztofik
@ 2019-03-29 22:35     ` Sakari Ailus
  0 siblings, 0 replies; 14+ messages in thread
From: Sakari Ailus @ 2019-03-29 22:35 UTC (permalink / raw)
  To: Janusz Krzysztofik
  Cc: Mauro Carvalho Chehab, Hans Verkuil, linux-media, linux-kernel

Hi Janusz,

On Fri, Mar 29, 2019 at 09:29:03PM +0100, Janusz Krzysztofik wrote:
> Register V4L2 subdevice implemented by the driver to the V4L2
> asynchronous subdevice framework.
> 
> Signed-off-by: Janusz Krzysztofik <jmkrzyszt@gmail.com>
> ---
>  drivers/media/i2c/ov6650.c | 20 +++++++++++++++-----
>  1 file changed, 15 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/media/i2c/ov6650.c b/drivers/media/i2c/ov6650.c
> index de7d9790f054..50e60da73036 100644
> --- a/drivers/media/i2c/ov6650.c
> +++ b/drivers/media/i2c/ov6650.c
> @@ -804,8 +804,9 @@ static int ov6650_prog_dflt(struct i2c_client *client)
>  	return ret;
>  }
>  
> -static int ov6650_video_probe(struct i2c_client *client)
> +static int ov6650_video_probe(struct v4l2_subdev *sd)
>  {
> +	struct i2c_client *client = v4l2_get_subdevdata(sd);
>  	struct ov6650 *priv = to_ov6650(client);
>  	u8		pidh, pidl, midh, midl;
>  	int		ret;
> @@ -817,7 +818,7 @@ static int ov6650_video_probe(struct i2c_client *client)
>  		return ret;
>  	}
>  
> -	ret = ov6650_s_power(&priv->subdev, 1);
> +	ret = ov6650_s_power(sd, 1);
>  	if (ret < 0)
>  		goto eclkput;
>  
> @@ -855,7 +856,7 @@ static int ov6650_video_probe(struct i2c_client *client)
>  		ret = v4l2_ctrl_handler_setup(&priv->hdl);
>  
>  done:
> -	ov6650_s_power(&priv->subdev, 0);
> +	ov6650_s_power(sd, 0);
>  	if (!ret)
>  		return 0;
>  eclkput:
> @@ -943,6 +944,10 @@ static const struct v4l2_subdev_ops ov6650_subdev_ops = {
>  	.pad	= &ov6650_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops ov6650_internal_ops = {
> +	.registered = ov6650_video_probe,
> +};
> +
>  /*
>   * i2c_driver function
>   */
> @@ -1003,7 +1008,12 @@ static int ov6650_probe(struct i2c_client *client,
>  	priv->code	  = MEDIA_BUS_FMT_YUYV8_2X8;
>  	priv->colorspace  = V4L2_COLORSPACE_JPEG;
>  
> -	ret = ov6650_video_probe(client);
> +	priv->subdev.internal_ops = &ov6650_internal_ops;
> +	priv->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
> +	snprintf(priv->subdev.name, sizeof(priv->subdev.name), "%s %d-%04x",
> +		 did->name, i2c_adapter_id(client->adapter), client->addr);

Could you use v4l2_i2c_subdev_set_name()?

> +
> +	ret = v4l2_async_register_subdev(&priv->subdev);
>  	if (ret)
>  		v4l2_ctrl_handler_free(&priv->hdl);
>  
> @@ -1015,7 +1025,7 @@ static int ov6650_remove(struct i2c_client *client)
>  	struct ov6650 *priv = to_ov6650(client);
>  
>  	v4l2_clk_put(priv->clk);
> -	v4l2_device_unregister_subdev(&priv->subdev);
> +	v4l2_async_unregister_subdev(&priv->subdev);
>  	v4l2_ctrl_handler_free(&priv->hdl);
>  	return 0;
>  }
> -- 
> 2.19.2
> 

-- 
Sakari Ailus
sakari.ailus@linux.intel.com

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [PATCH v3 0/2] media: ov6650: Add V4L2 asynchronous subdevice support
  2019-03-29 20:29 ` [PATCH v2 0/2] media: ov6650: Add V4L2 asynchronous subdevice support Janusz Krzysztofik
  2019-03-29 20:29   ` [PATCH v2 1/2] media: ov6650: Move v4l2_clk_get() to ov6650_video_probe() helper Janusz Krzysztofik
  2019-03-29 20:29   ` [PATCH v2 2/2] media: ov6650: Register with asynchronous subdevice framework Janusz Krzysztofik
@ 2019-03-30  1:06   ` Janusz Krzysztofik
  2019-03-30  1:06     ` [PATCH v3 1/2] media: ov6650: Move v4l2_clk_get() to ov6650_video_probe() helper Janusz Krzysztofik
  2019-03-30  1:06     ` [PATCH v3 2/2] media: ov6650: Register with asynchronous subdevice framework Janusz Krzysztofik
  2 siblings, 2 replies; 14+ messages in thread
From: Janusz Krzysztofik @ 2019-03-30  1:06 UTC (permalink / raw)
  To: Sakari Ailus
  Cc: Mauro Carvalho Chehab, Hans Verkuil, linux-media, linux-kernel,
	Janusz Krzysztofik

Janusz Krzysztofik (2):
      media: ov6650: Move v4l2_clk_get() to ov6650_video_probe() helper
      media: ov6650: Register with asynchronous subdevice framework

 ov6650.c |   44 ++++++++++++++++++++++++++++----------------
 1 file changed, 28 insertions(+), 16 deletions(-)

Changelog:
v2->v3:
- use v4l2_i2c_subdev_set_name() - thanks Sakari

v1->v2:
- labels should be outside conditionals - thanks Sakari
- rebased on my former fix so it applied cleanly


^ permalink raw reply	[flat|nested] 14+ messages in thread

* [PATCH v3 1/2] media: ov6650: Move v4l2_clk_get() to ov6650_video_probe() helper
  2019-03-30  1:06   ` [PATCH v3 0/2] media: ov6650: Add V4L2 asynchronous subdevice support Janusz Krzysztofik
@ 2019-03-30  1:06     ` Janusz Krzysztofik
  2019-03-30  1:06     ` [PATCH v3 2/2] media: ov6650: Register with asynchronous subdevice framework Janusz Krzysztofik
  1 sibling, 0 replies; 14+ messages in thread
From: Janusz Krzysztofik @ 2019-03-30  1:06 UTC (permalink / raw)
  To: Sakari Ailus
  Cc: Mauro Carvalho Chehab, Hans Verkuil, linux-media, linux-kernel,
	Janusz Krzysztofik

In preparation for adding asynchronous subdevice support to the driver,
don't acquire v4l2_clk from the driver .probe() callback as that may
fail if the clock is provided by a bridge driver which may be not yet
initialized.  Move the v4l2_clk_get() to ov6650_video_probe() helper
which is going to be converted to v4l2_subdev_internal_ops.registered()
callback, executed only when the bridge driver is ready.

Signed-off-by: Janusz Krzysztofik <jmkrzyszt@gmail.com>
---
 drivers/media/i2c/ov6650.c | 25 ++++++++++++++-----------
 1 file changed, 14 insertions(+), 11 deletions(-)

diff --git a/drivers/media/i2c/ov6650.c b/drivers/media/i2c/ov6650.c
index f9359b11fa5c..de7d9790f054 100644
--- a/drivers/media/i2c/ov6650.c
+++ b/drivers/media/i2c/ov6650.c
@@ -810,9 +810,16 @@ static int ov6650_video_probe(struct i2c_client *client)
 	u8		pidh, pidl, midh, midl;
 	int		ret;
 
+	priv->clk = v4l2_clk_get(&client->dev, NULL);
+	if (IS_ERR(priv->clk)) {
+		ret = PTR_ERR(priv->clk);
+		dev_err(&client->dev, "v4l2_clk request err: %d\n", ret);
+		return ret;
+	}
+
 	ret = ov6650_s_power(&priv->subdev, 1);
 	if (ret < 0)
-		return ret;
+		goto eclkput;
 
 	msleep(20);
 
@@ -849,6 +856,11 @@ static int ov6650_video_probe(struct i2c_client *client)
 
 done:
 	ov6650_s_power(&priv->subdev, 0);
+	if (!ret)
+		return 0;
+eclkput:
+	v4l2_clk_put(priv->clk);
+
 	return ret;
 }
 
@@ -991,18 +1003,9 @@ static int ov6650_probe(struct i2c_client *client,
 	priv->code	  = MEDIA_BUS_FMT_YUYV8_2X8;
 	priv->colorspace  = V4L2_COLORSPACE_JPEG;
 
-	priv->clk = v4l2_clk_get(&client->dev, NULL);
-	if (IS_ERR(priv->clk)) {
-		ret = PTR_ERR(priv->clk);
-		goto eclkget;
-	}
-
 	ret = ov6650_video_probe(client);
-	if (ret) {
-		v4l2_clk_put(priv->clk);
-eclkget:
+	if (ret)
 		v4l2_ctrl_handler_free(&priv->hdl);
-	}
 
 	return ret;
 }
-- 
2.19.2


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH v3 2/2] media: ov6650: Register with asynchronous subdevice framework
  2019-03-30  1:06   ` [PATCH v3 0/2] media: ov6650: Add V4L2 asynchronous subdevice support Janusz Krzysztofik
  2019-03-30  1:06     ` [PATCH v3 1/2] media: ov6650: Move v4l2_clk_get() to ov6650_video_probe() helper Janusz Krzysztofik
@ 2019-03-30  1:06     ` Janusz Krzysztofik
  2019-04-02  8:24       ` Sakari Ailus
  1 sibling, 1 reply; 14+ messages in thread
From: Janusz Krzysztofik @ 2019-03-30  1:06 UTC (permalink / raw)
  To: Sakari Ailus
  Cc: Mauro Carvalho Chehab, Hans Verkuil, linux-media, linux-kernel,
	Janusz Krzysztofik

Register V4L2 subdevice implemented by the driver to the V4L2
asynchronous subdevice framework.

Signed-off-by: Janusz Krzysztofik <jmkrzyszt@gmail.com>
---
 drivers/media/i2c/ov6650.c | 19 ++++++++++++++-----
 1 file changed, 14 insertions(+), 5 deletions(-)

diff --git a/drivers/media/i2c/ov6650.c b/drivers/media/i2c/ov6650.c
index de7d9790f054..7145bb68a9e1 100644
--- a/drivers/media/i2c/ov6650.c
+++ b/drivers/media/i2c/ov6650.c
@@ -804,8 +804,9 @@ static int ov6650_prog_dflt(struct i2c_client *client)
 	return ret;
 }
 
-static int ov6650_video_probe(struct i2c_client *client)
+static int ov6650_video_probe(struct v4l2_subdev *sd)
 {
+	struct i2c_client *client = v4l2_get_subdevdata(sd);
 	struct ov6650 *priv = to_ov6650(client);
 	u8		pidh, pidl, midh, midl;
 	int		ret;
@@ -817,7 +818,7 @@ static int ov6650_video_probe(struct i2c_client *client)
 		return ret;
 	}
 
-	ret = ov6650_s_power(&priv->subdev, 1);
+	ret = ov6650_s_power(sd, 1);
 	if (ret < 0)
 		goto eclkput;
 
@@ -855,7 +856,7 @@ static int ov6650_video_probe(struct i2c_client *client)
 		ret = v4l2_ctrl_handler_setup(&priv->hdl);
 
 done:
-	ov6650_s_power(&priv->subdev, 0);
+	ov6650_s_power(sd, 0);
 	if (!ret)
 		return 0;
 eclkput:
@@ -943,6 +944,10 @@ static const struct v4l2_subdev_ops ov6650_subdev_ops = {
 	.pad	= &ov6650_pad_ops,
 };
 
+static const struct v4l2_subdev_internal_ops ov6650_internal_ops = {
+	.registered = ov6650_video_probe,
+};
+
 /*
  * i2c_driver function
  */
@@ -1003,7 +1008,11 @@ static int ov6650_probe(struct i2c_client *client,
 	priv->code	  = MEDIA_BUS_FMT_YUYV8_2X8;
 	priv->colorspace  = V4L2_COLORSPACE_JPEG;
 
-	ret = ov6650_video_probe(client);
+	priv->subdev.internal_ops = &ov6650_internal_ops;
+	priv->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
+	v4l2_i2c_subdev_set_name(&priv->subdev, client, NULL, NULL);
+
+	ret = v4l2_async_register_subdev(&priv->subdev);
 	if (ret)
 		v4l2_ctrl_handler_free(&priv->hdl);
 
@@ -1015,7 +1024,7 @@ static int ov6650_remove(struct i2c_client *client)
 	struct ov6650 *priv = to_ov6650(client);
 
 	v4l2_clk_put(priv->clk);
-	v4l2_device_unregister_subdev(&priv->subdev);
+	v4l2_async_unregister_subdev(&priv->subdev);
 	v4l2_ctrl_handler_free(&priv->hdl);
 	return 0;
 }
-- 
2.19.2


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* Re: [PATCH v3 2/2] media: ov6650: Register with asynchronous subdevice framework
  2019-03-30  1:06     ` [PATCH v3 2/2] media: ov6650: Register with asynchronous subdevice framework Janusz Krzysztofik
@ 2019-04-02  8:24       ` Sakari Ailus
  0 siblings, 0 replies; 14+ messages in thread
From: Sakari Ailus @ 2019-04-02  8:24 UTC (permalink / raw)
  To: Janusz Krzysztofik
  Cc: Mauro Carvalho Chehab, Hans Verkuil, linux-media, linux-kernel

Hi Janusz,

On Sat, Mar 30, 2019 at 02:06:10AM +0100, Janusz Krzysztofik wrote:
> Register V4L2 subdevice implemented by the driver to the V4L2
> asynchronous subdevice framework.
> 
> Signed-off-by: Janusz Krzysztofik <jmkrzyszt@gmail.com>
> ---
>  drivers/media/i2c/ov6650.c | 19 ++++++++++++++-----
>  1 file changed, 14 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/media/i2c/ov6650.c b/drivers/media/i2c/ov6650.c
> index de7d9790f054..7145bb68a9e1 100644
> --- a/drivers/media/i2c/ov6650.c
> +++ b/drivers/media/i2c/ov6650.c
> @@ -804,8 +804,9 @@ static int ov6650_prog_dflt(struct i2c_client *client)
>  	return ret;
>  }
>  
> -static int ov6650_video_probe(struct i2c_client *client)
> +static int ov6650_video_probe(struct v4l2_subdev *sd)
>  {
> +	struct i2c_client *client = v4l2_get_subdevdata(sd);
>  	struct ov6650 *priv = to_ov6650(client);
>  	u8		pidh, pidl, midh, midl;
>  	int		ret;
> @@ -817,7 +818,7 @@ static int ov6650_video_probe(struct i2c_client *client)
>  		return ret;
>  	}
>  
> -	ret = ov6650_s_power(&priv->subdev, 1);
> +	ret = ov6650_s_power(sd, 1);
>  	if (ret < 0)
>  		goto eclkput;
>  
> @@ -855,7 +856,7 @@ static int ov6650_video_probe(struct i2c_client *client)
>  		ret = v4l2_ctrl_handler_setup(&priv->hdl);
>  
>  done:
> -	ov6650_s_power(&priv->subdev, 0);
> +	ov6650_s_power(sd, 0);
>  	if (!ret)
>  		return 0;
>  eclkput:
> @@ -943,6 +944,10 @@ static const struct v4l2_subdev_ops ov6650_subdev_ops = {
>  	.pad	= &ov6650_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops ov6650_internal_ops = {
> +	.registered = ov6650_video_probe,
> +};
> +
>  /*
>   * i2c_driver function
>   */
> @@ -1003,7 +1008,11 @@ static int ov6650_probe(struct i2c_client *client,
>  	priv->code	  = MEDIA_BUS_FMT_YUYV8_2X8;
>  	priv->colorspace  = V4L2_COLORSPACE_JPEG;
>  
> -	ret = ov6650_video_probe(client);
> +	priv->subdev.internal_ops = &ov6650_internal_ops;
> +	priv->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
> +	v4l2_i2c_subdev_set_name(&priv->subdev, client, NULL, NULL);

I missed that v4l2_i2c_subdev_init() already calls
v4l2_i2c_subdev_set_name(), so it can be removed from the driver. I've made
the change to the applied patch:

diff --git a/drivers/media/i2c/ov6650.c b/drivers/media/i2c/ov6650.c
index 7145bb68a9e1..1b972e591b48 100644
--- a/drivers/media/i2c/ov6650.c
+++ b/drivers/media/i2c/ov6650.c
@@ -1010,7 +1010,6 @@ static int ov6650_probe(struct i2c_client *client,
 
 	priv->subdev.internal_ops = &ov6650_internal_ops;
 	priv->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
-	v4l2_i2c_subdev_set_name(&priv->subdev, client, NULL, NULL);
 
 	ret = v4l2_async_register_subdev(&priv->subdev);
 	if (ret)


> +
> +	ret = v4l2_async_register_subdev(&priv->subdev);
>  	if (ret)
>  		v4l2_ctrl_handler_free(&priv->hdl);
>  
> @@ -1015,7 +1024,7 @@ static int ov6650_remove(struct i2c_client *client)
>  	struct ov6650 *priv = to_ov6650(client);
>  
>  	v4l2_clk_put(priv->clk);
> -	v4l2_device_unregister_subdev(&priv->subdev);
> +	v4l2_async_unregister_subdev(&priv->subdev);
>  	v4l2_ctrl_handler_free(&priv->hdl);
>  	return 0;
>  }

-- 
Regards,

Sakari Ailus
sakari.ailus@linux.intel.com

^ permalink raw reply related	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2019-04-02  8:24 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-03-25  0:34 [PATCH 0/2] media: ov6650: Add V4L2 asynchronous subdevice support Janusz Krzysztofik
2019-03-25  0:35 ` [PATCH 1/2] media: ov6650: Move v4l2_clk_get() to ov6650_video_probe() helper Janusz Krzysztofik
2019-03-29 18:39   ` Sakari Ailus
2019-03-29 19:48     ` Janusz Krzysztofik
2019-03-29 19:51       ` Sakari Ailus
2019-03-25  0:35 ` [PATCH 2/2] media: ov6650: Register with asynchronous subdevice framework Janusz Krzysztofik
2019-03-29 20:29 ` [PATCH v2 0/2] media: ov6650: Add V4L2 asynchronous subdevice support Janusz Krzysztofik
2019-03-29 20:29   ` [PATCH v2 1/2] media: ov6650: Move v4l2_clk_get() to ov6650_video_probe() helper Janusz Krzysztofik
2019-03-29 20:29   ` [PATCH v2 2/2] media: ov6650: Register with asynchronous subdevice framework Janusz Krzysztofik
2019-03-29 22:35     ` Sakari Ailus
2019-03-30  1:06   ` [PATCH v3 0/2] media: ov6650: Add V4L2 asynchronous subdevice support Janusz Krzysztofik
2019-03-30  1:06     ` [PATCH v3 1/2] media: ov6650: Move v4l2_clk_get() to ov6650_video_probe() helper Janusz Krzysztofik
2019-03-30  1:06     ` [PATCH v3 2/2] media: ov6650: Register with asynchronous subdevice framework Janusz Krzysztofik
2019-04-02  8:24       ` Sakari Ailus

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).