Re: [PATCHv4 12/15] ov2640: add MC support

2017-03-10 Thread Hans Verkuil
On 10/03/17 12:15, Sakari Ailus wrote:
> Hi Hans,
> 
> On Fri, Mar 10, 2017 at 11:26:11AM +0100, Hans Verkuil wrote:
>> From: Hans Verkuil 
>>
>> The MC support is needed by the em28xx driver.
>>
>> Signed-off-by: Hans Verkuil 
>> ---
>>  drivers/media/i2c/ov2640.c | 21 +++--
>>  1 file changed, 19 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/media/i2c/ov2640.c b/drivers/media/i2c/ov2640.c
>> index 0445963c5fae..00df042fd6f1 100644
>> --- a/drivers/media/i2c/ov2640.c
>> +++ b/drivers/media/i2c/ov2640.c
>> @@ -282,6 +282,9 @@ struct ov2640_win_size {
>>  
>>  struct ov2640_priv {
>>  struct v4l2_subdev  subdev;
>> +#if defined(CONFIG_MEDIA_CONTROLLER)
>> +struct media_pad pad;
>> +#endif
>>  struct v4l2_ctrl_handlerhdl;
>>  u32 cfmt_code;
>>  struct clk  *clk;
>> @@ -1073,19 +1076,30 @@ static int ov2640_probe(struct i2c_client *client,
>>  ret = priv->hdl.error;
>>  goto err_hdl;
>>  }
> 
> As this is a sensor the format etc. should be accessible from the user
> space, shouldn't you have V4L2_SUBDEV_FL_HAS_DEVNODE flag for the
> sub-device as well?
> 
> The device node isn't exposed unless v4l2_device_register_subdev_nodes() is
> called anyway.

Can do this for both ov2640 and ov7670.

> 
>> +#if defined(CONFIG_MEDIA_CONTROLLER)
>> +priv->pad.flags = MEDIA_PAD_FL_SOURCE;
>> +priv->subdev.entity.function = MEDIA_ENT_F_CAM_SENSOR;
>> +ret = media_entity_pads_init(&priv->subdev.entity, 1, &priv->pad);
>> +if (ret < 0)
>> +goto err_hdl;
>> +#endif
>>  
>>  ret = ov2640_video_probe(client);
>>  if (ret < 0)
>> -goto err_hdl;
>> +goto err_videoprobe;
>>  
>>  ret = v4l2_async_register_subdev(&priv->subdev);
>>  if (ret < 0)
>> -goto err_hdl;
>> +goto err_videoprobe;
>>  
>>  dev_info(&adapter->dev, "OV2640 Probed\n");
>>  
>>  return 0;
>>  
>> +err_videoprobe:
>> +#if defined(CONFIG_MEDIA_CONTROLLER)
>> +media_entity_cleanup(&priv->subdev.entity);
> 
> I believe you can call media_entity_cleanup() as the function does nothing
> right now. In general, we should provide nop variants if MC is disabled.

You mean that I don't have to check CONFIG_MEDIA_CONTROLLER for this, right?

Makes sense.

> 
>> +#endif
>>  err_hdl:
>>  v4l2_ctrl_handler_free(&priv->hdl);
>>  err_clk:
>> @@ -1099,6 +1113,9 @@ static int ov2640_remove(struct i2c_client *client)
>>  
>>  v4l2_async_unregister_subdev(&priv->subdev);
>>  v4l2_ctrl_handler_free(&priv->hdl);
>> +#if defined(CONFIG_MEDIA_CONTROLLER)
>> +media_entity_cleanup(&priv->subdev.entity);
>> +#endif
>>  v4l2_device_unregister_subdev(&priv->subdev);
>>  clk_disable_unprepare(priv->clk);
>>  return 0;
> 

Regards,

Hans


Re: [PATCHv4 12/15] ov2640: add MC support

2017-03-10 Thread Sakari Ailus
Hi Hans,

On Fri, Mar 10, 2017 at 11:26:11AM +0100, Hans Verkuil wrote:
> From: Hans Verkuil 
> 
> The MC support is needed by the em28xx driver.
> 
> Signed-off-by: Hans Verkuil 
> ---
>  drivers/media/i2c/ov2640.c | 21 +++--
>  1 file changed, 19 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/media/i2c/ov2640.c b/drivers/media/i2c/ov2640.c
> index 0445963c5fae..00df042fd6f1 100644
> --- a/drivers/media/i2c/ov2640.c
> +++ b/drivers/media/i2c/ov2640.c
> @@ -282,6 +282,9 @@ struct ov2640_win_size {
>  
>  struct ov2640_priv {
>   struct v4l2_subdev  subdev;
> +#if defined(CONFIG_MEDIA_CONTROLLER)
> + struct media_pad pad;
> +#endif
>   struct v4l2_ctrl_handlerhdl;
>   u32 cfmt_code;
>   struct clk  *clk;
> @@ -1073,19 +1076,30 @@ static int ov2640_probe(struct i2c_client *client,
>   ret = priv->hdl.error;
>   goto err_hdl;
>   }

As this is a sensor the format etc. should be accessible from the user
space, shouldn't you have V4L2_SUBDEV_FL_HAS_DEVNODE flag for the
sub-device as well?

The device node isn't exposed unless v4l2_device_register_subdev_nodes() is
called anyway.

> +#if defined(CONFIG_MEDIA_CONTROLLER)
> + priv->pad.flags = MEDIA_PAD_FL_SOURCE;
> + priv->subdev.entity.function = MEDIA_ENT_F_CAM_SENSOR;
> + ret = media_entity_pads_init(&priv->subdev.entity, 1, &priv->pad);
> + if (ret < 0)
> + goto err_hdl;
> +#endif
>  
>   ret = ov2640_video_probe(client);
>   if (ret < 0)
> - goto err_hdl;
> + goto err_videoprobe;
>  
>   ret = v4l2_async_register_subdev(&priv->subdev);
>   if (ret < 0)
> - goto err_hdl;
> + goto err_videoprobe;
>  
>   dev_info(&adapter->dev, "OV2640 Probed\n");
>  
>   return 0;
>  
> +err_videoprobe:
> +#if defined(CONFIG_MEDIA_CONTROLLER)
> + media_entity_cleanup(&priv->subdev.entity);

I believe you can call media_entity_cleanup() as the function does nothing
right now. In general, we should provide nop variants if MC is disabled.

> +#endif
>  err_hdl:
>   v4l2_ctrl_handler_free(&priv->hdl);
>  err_clk:
> @@ -1099,6 +1113,9 @@ static int ov2640_remove(struct i2c_client *client)
>  
>   v4l2_async_unregister_subdev(&priv->subdev);
>   v4l2_ctrl_handler_free(&priv->hdl);
> +#if defined(CONFIG_MEDIA_CONTROLLER)
> + media_entity_cleanup(&priv->subdev.entity);
> +#endif
>   v4l2_device_unregister_subdev(&priv->subdev);
>   clk_disable_unprepare(priv->clk);
>   return 0;

-- 
Regards,

Sakari Ailus
e-mail: sakari.ai...@iki.fi XMPP: sai...@retiisi.org.uk


[PATCHv4 12/15] ov2640: add MC support

2017-03-10 Thread Hans Verkuil
From: Hans Verkuil 

The MC support is needed by the em28xx driver.

Signed-off-by: Hans Verkuil 
---
 drivers/media/i2c/ov2640.c | 21 +++--
 1 file changed, 19 insertions(+), 2 deletions(-)

diff --git a/drivers/media/i2c/ov2640.c b/drivers/media/i2c/ov2640.c
index 0445963c5fae..00df042fd6f1 100644
--- a/drivers/media/i2c/ov2640.c
+++ b/drivers/media/i2c/ov2640.c
@@ -282,6 +282,9 @@ struct ov2640_win_size {
 
 struct ov2640_priv {
struct v4l2_subdev  subdev;
+#if defined(CONFIG_MEDIA_CONTROLLER)
+   struct media_pad pad;
+#endif
struct v4l2_ctrl_handlerhdl;
u32 cfmt_code;
struct clk  *clk;
@@ -1073,19 +1076,30 @@ static int ov2640_probe(struct i2c_client *client,
ret = priv->hdl.error;
goto err_hdl;
}
+#if defined(CONFIG_MEDIA_CONTROLLER)
+   priv->pad.flags = MEDIA_PAD_FL_SOURCE;
+   priv->subdev.entity.function = MEDIA_ENT_F_CAM_SENSOR;
+   ret = media_entity_pads_init(&priv->subdev.entity, 1, &priv->pad);
+   if (ret < 0)
+   goto err_hdl;
+#endif
 
ret = ov2640_video_probe(client);
if (ret < 0)
-   goto err_hdl;
+   goto err_videoprobe;
 
ret = v4l2_async_register_subdev(&priv->subdev);
if (ret < 0)
-   goto err_hdl;
+   goto err_videoprobe;
 
dev_info(&adapter->dev, "OV2640 Probed\n");
 
return 0;
 
+err_videoprobe:
+#if defined(CONFIG_MEDIA_CONTROLLER)
+   media_entity_cleanup(&priv->subdev.entity);
+#endif
 err_hdl:
v4l2_ctrl_handler_free(&priv->hdl);
 err_clk:
@@ -1099,6 +1113,9 @@ static int ov2640_remove(struct i2c_client *client)
 
v4l2_async_unregister_subdev(&priv->subdev);
v4l2_ctrl_handler_free(&priv->hdl);
+#if defined(CONFIG_MEDIA_CONTROLLER)
+   media_entity_cleanup(&priv->subdev.entity);
+#endif
v4l2_device_unregister_subdev(&priv->subdev);
clk_disable_unprepare(priv->clk);
return 0;
-- 
2.11.0