On Wednesday, January 19, 2011 18:49:19 Guennadi Liakhovetski wrote:
> Hi Hans
> 
> This is not a complete review yet, but just something that occurred to me, 
> while looking at the result of applying all these your patches, maybe you 
> could just explain, why I'm wrong, or this will be something to change in 
> the next version:
> 
> On Wed, 12 Jan 2011, Hans Verkuil wrote:
> 
> > The soc_camera framework is switched over to use the control framework.
> > After this patch none of the controls in subdevs or host drivers are 
> > available,
> > until those drivers are also converted to the control framework.
> > 
> > Signed-off-by: Hans Verkuil <hverk...@xs4all.nl>
> > ---
> >  drivers/media/video/soc_camera.c          |  104 
> > +++++++----------------------
> >  drivers/media/video/soc_camera_platform.c |    8 ++-
> >  include/media/soc_camera.h                |    2 +
> >  3 files changed, 33 insertions(+), 81 deletions(-)
> > 
> > diff --git a/drivers/media/video/soc_camera.c 
> > b/drivers/media/video/soc_camera.c
> > index a66811b..7de3fe2 100644
> > --- a/drivers/media/video/soc_camera.c
> > +++ b/drivers/media/video/soc_camera.c
> 
> [snip]
> 
> > @@ -908,6 +840,8 @@ static int soc_camera_init_i2c(struct soc_camera_device 
> > *icd,
> >                             icl->board_info, NULL);
> >     if (!subdev)
> >             goto ei2cnd;
> > +   if (v4l2_ctrl_add_handler(&icd->ctrl_handler, subdev->ctrl_handler))
> > +           goto ei2cnd;
> >  
> >     client = v4l2_get_subdevdata(subdev);
> >  
> 
> Is this really i2c-specific? You added this to soc_camera_init_i2c(), 
> which is only even built if I2C is configured, and is only used with i2c 
> subdevs. It is called from soc_camera_probe(), if the respective subdev 
> has i2c board-information. Otherwise a generic initialisation will take 
> place, as is, e.g., the case with the soc-camera-platform driver. 
> Shouldn't this call to add_handler be moved directly to soc_camera_probe() 
> ot be used for all - not only i2c - subdevs? And one more nitpick below:

Good point, I completely missed the fact that you can have non-i2c subdevs.
I'll move it to probe.

> > @@ -963,15 +897,15 @@ static int soc_camera_probe(struct device *dev)
> >     if (icl->reset)
> >             icl->reset(icd->pdev);
> >  
> > -   ret = ici->ops->add(icd);
> > -   if (ret < 0)
> > -           goto eadd;
> > -
> >     /* Must have icd->vdev before registering the device */
> >     ret = video_dev_create(icd);
> >     if (ret < 0)
> >             goto evdc;
> >  
> > +   ret = ici->ops->add(icd);
> > +   if (ret < 0)
> > +           goto eadd;
> > +
> 
> Yes, this is something, I'll have to think about / have a look at / test.
> 
> >     /* Non-i2c cameras, e.g., soc_camera_platform, have no board_info */
> >     if (icl->board_info) {
> >             ret = soc_camera_init_i2c(icd, icl);
> > @@ -1054,10 +988,10 @@ eiufmt:
> >     }
> >  enodrv:
> >  eadddev:
> > -   video_device_release(icd->vdev);
> > -evdc:
> >     ici->ops->remove(icd);
> >  eadd:
> > +   video_device_release(icd->vdev);
> > +evdc:
> >     soc_camera_power_set(icd, icl, 0);
> >  epower:
> >     regulator_bulk_free(icl->num_regulators, icl->regulators);
> > @@ -1324,9 +1258,6 @@ static const struct v4l2_ioctl_ops 
> > soc_camera_ioctl_ops = {
> >     .vidioc_dqbuf            = soc_camera_dqbuf,
> >     .vidioc_streamon         = soc_camera_streamon,
> >     .vidioc_streamoff        = soc_camera_streamoff,
> > -   .vidioc_queryctrl        = soc_camera_queryctrl,
> > -   .vidioc_g_ctrl           = soc_camera_g_ctrl,
> > -   .vidioc_s_ctrl           = soc_camera_s_ctrl,
> >     .vidioc_cropcap          = soc_camera_cropcap,
> >     .vidioc_g_crop           = soc_camera_g_crop,
> >     .vidioc_s_crop           = soc_camera_s_crop,
> > @@ -1355,6 +1286,7 @@ static int video_dev_create(struct soc_camera_device 
> > *icd)
> >     vdev->ioctl_ops         = &soc_camera_ioctl_ops;
> >     vdev->release           = video_device_release;
> >     vdev->tvnorms           = V4L2_STD_UNKNOWN;
> > +   vdev->ctrl_handler      = &icd->ctrl_handler;
> >  
> >     icd->vdev = vdev;
> >  
> > @@ -1402,13 +1334,24 @@ static int __devinit soc_camera_pdrv_probe(struct 
> > platform_device *pdev)
> >     if (!icd)
> >             return -ENOMEM;
> >  
> > +   /*
> > +    * Currently the subdev with the largest number of controls (13) is
> > +    * ov6550. So let's pick 16 as a hint for the control handler. Note
> > +    * that this is a hint only: too large and you waste some memory, too
> > +    * small and there is a (very) small performance hit when looking up
> > +    * controls in the internal hash.
> > +    */
> > +   ret = v4l2_ctrl_handler_init(&icd->ctrl_handler, 16);
> > +   if (ret < 0)
> > +           goto escdevreg;
> > +
> >     icd->iface = icl->bus_id;
> >     icd->pdev = &pdev->dev;
> >     platform_set_drvdata(pdev, icd);
> >  
> >     ret = soc_camera_device_register(icd);
> >     if (ret < 0)
> > -           goto escdevreg;
> > +           goto eschdlinit;
> 
> hm, no, eXXX means in my notation XXX has failed. So, escdevreg means 
> "soc_camera_device_register() failed" and your eschdlinit should go to the 
> previous goto.

Agreed.

> 
> >  
> >     soc_camera_device_init(&icd->dev, icl);
> >  
> > @@ -1417,6 +1360,8 @@ static int __devinit soc_camera_pdrv_probe(struct 
> > platform_device *pdev)
> >  
> >     return 0;
> >  
> > +eschdlinit:
> > +   v4l2_ctrl_handler_free(&icd->ctrl_handler);
> 
> Then this will change too, of course.
> 
> >  escdevreg:
> >     kfree(icd);
> >  
> > @@ -1437,6 +1382,7 @@ static int __devexit soc_camera_pdrv_remove(struct 
> > platform_device *pdev)
> >  
> >     soc_camera_device_unregister(icd);
> >  
> > +   v4l2_ctrl_handler_free(&icd->ctrl_handler);
> >     kfree(icd);
> >  
> >     return 0;
> > diff --git a/drivers/media/video/soc_camera_platform.c 
> > b/drivers/media/video/soc_camera_platform.c
> > index bf406e8..e319dda 100644
> > --- a/drivers/media/video/soc_camera_platform.c
> > +++ b/drivers/media/video/soc_camera_platform.c
> > @@ -174,9 +174,13 @@ static int soc_camera_platform_probe(struct 
> > platform_device *pdev)
> >     ret = v4l2_device_register_subdev(&ici->v4l2_dev, &priv->subdev);
> >     if (ret)
> >             goto evdrs;
> > +   ret = v4l2_ctrl_add_handler(&icd->ctrl_handler, 
> > priv->subdev.ctrl_handler);
> > +   if (ret)
> > +           goto evunreg;
> 
> and this will get a different name

Yes.

> 
> > +   return 0;
> >  
> > -   return ret;
> > -
> > +evunreg:
> > +   v4l2_device_unregister_subdev(&priv->subdev);
> >  evdrs:
> >     icd->ops = NULL;
> >     platform_set_drvdata(pdev, NULL);
> > diff --git a/include/media/soc_camera.h b/include/media/soc_camera.h
> > index 9386db8..ee61ffb 100644
> > --- a/include/media/soc_camera.h
> > +++ b/include/media/soc_camera.h
> > @@ -18,6 +18,7 @@
> >  #include <linux/videodev2.h>
> >  #include <media/videobuf-core.h>
> >  #include <media/v4l2-device.h>
> > +#include <media/v4l2-ctrls.h>
> >  
> >  extern struct bus_type soc_camera_bus_type;
> >  
> > @@ -35,6 +36,7 @@ struct soc_camera_device {
> >     struct soc_camera_sense *sense; /* See comment in struct definition */
> >     struct soc_camera_ops *ops;
> >     struct video_device *vdev;
> > +   struct v4l2_ctrl_handler ctrl_handler;
> >     const struct soc_camera_format_xlate *current_fmt;
> >     struct soc_camera_format_xlate *user_formats;
> >     int num_user_formats;
> 
> Thanks
> Guennadi
> ---
> Guennadi Liakhovetski, Ph.D.
> Freelance Open-Source Software Developer
> http://www.open-technology.de/
> --
> To unsubscribe from this list: send the line "unsubscribe linux-media" in
> the body of a message to majord...@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 
> 

Regards,

        Hans

-- 
Hans Verkuil - video4linux developer - sponsored by Cisco
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to