Hans,

If you are okay with this patch, could you please merge this to
your -hg tree and send a pull request to Mauro to merge to the
linux-next tree? This depends on the previous patch set which is
waiting for Mauro's merge.

Murali Karicheri
Software Design Engineer
Texas Instruments Inc.
Germantown, MD 20874
phone: 301-407-9583
email: m-kariche...@ti.com

>-----Original Message-----
>From: Karicheri, Muralidharan
>Sent: Wednesday, December 23, 2009 10:26 AM
>To: 'Hans Verkuil'
>Cc: linux-media@vger.kernel.org; khil...@deeprootsystems.com; Hiremath,
>Vaibhav; Nori, Sekhar; davinci-linux-open-sou...@linux.davincidsp.com
>Subject: RE: [PATCH - v2 4/6] V4L - vpfe_capture - bug fixes and
>enhancements
>
>Hans,
>
>The change is because of the void * type that we use. Since ccdc parameter
>structures are different for different IPs, a constant type for this arg
>is not possible. The ccdc driver needs the pointer to structure. But the
>v4l2 core tries to copies 4 bytes of data from the void * pointed location
>which is not what we want. I am sure this code will change once we have a
>device node available for ccdc on which case, this ioctl will be handled by
>the ccdc sub device node. The long term goal is to convert ccdc/isif
>drivers
>to sub device and pass this user ioctl to that sub device node. But
>currently we don't have support for device nodes for sub devices. I think
>that is needed for this conversion to be complete.
>
>>BTW, does this patch series rely on the patches in my v4l-dvb-davinci
>tree?
>>Or are these independent patches?
>
>Yes, this is dependent on my earlier patch. I had asked Mauro to merge that
>patch to linux-next, but still waiting....
>
>Murali Karicheri
>Software Design Engineer
>Texas Instruments Inc.
>Germantown, MD 20874
>phone: 301-407-9583
>email: m-kariche...@ti.com
>
>>-----Original Message-----
>>From: Hans Verkuil [mailto:hverk...@xs4all.nl]
>>Sent: Wednesday, December 23, 2009 9:24 AM
>>To: Karicheri, Muralidharan
>>Cc: linux-media@vger.kernel.org; khil...@deeprootsystems.com; Hiremath,
>>Vaibhav; Nori, Sekhar; davinci-linux-open-sou...@linux.davincidsp.com
>>Subject: Re: [PATCH - v2 4/6] V4L - vpfe_capture - bug fixes and
>>enhancements
>>
>>Hi Murali,
>>
>>Sorry for the long delay in reviewing this patch series. I've been very
>>busy,
>>first at work, and now for Christmas preparations (and occasionally I'd
>>like
>>to relax as well :-) ).
>>
>>I'm OK with the other patches in this series, but I do have a few comments
>>on this one: I noticed that you added a wrapper function for video_ioctl2.
>>I don't quite understand why.
>>
>>BTW, does this patch series rely on the patches in my v4l-dvb-davinci
>tree?
>>Or are these independent patches? Is it because the experimental
>>VPFE_CMD_S/G_CCDC_RAW_PARAMS ioctls are used with different argument
>>pointers?
>>I mean, currently the arg is a void * instead of a properly typed argument.
>>
>>However, if it always uses the same type, then you should use that type in
>>_IOR/_IOW and use video_ioctl2 directly so that the core framework will do
>>the
>>user-to-kernelspace conversion (and vv) for you.
>>
>>Regards,
>>
>>      Hans
>>
>>On Saturday 19 December 2009 00:58:25 m-kariche...@ti.com wrote:
>>> From: Muralidharan Karicheri <m-kariche...@ti.com>
>>>
>>> Updated based on comments against v1 of the patch
>>>
>>> Added a experimental IOCTL, to read the CCDC parameters.
>>> Default handler was not getting the original pointer from the core.
>>> So a wrapper function added to handle the default handler properly.
>>> Also fixed a bug in the probe() in the linux-next tree
>>>
>>> Reviewed-by: Hans Verkuil <hverk...@xs4all.nl>
>>> Signed-off-by: Muralidharan Karicheri <m-kariche...@ti.com>
>>> ---
>>> Applies to linux-next of v4l-dvb
>>>  drivers/media/video/davinci/vpfe_capture.c |  120 +++++++++++++++++----
>-
>>------
>>>  include/media/davinci/vpfe_capture.h       |   12 ++-
>>>  2 files changed, 81 insertions(+), 51 deletions(-)
>>>
>>> diff --git a/drivers/media/video/davinci/vpfe_capture.c
>>b/drivers/media/video/davinci/vpfe_capture.c
>>> index 9e3a531..99ffc62 100644
>>> --- a/drivers/media/video/davinci/vpfe_capture.c
>>> +++ b/drivers/media/video/davinci/vpfe_capture.c
>>> @@ -758,12 +758,83 @@ static unsigned int vpfe_poll(struct file *file,
>>poll_table *wait)
>>>     return 0;
>>>  }
>>>
>>> +static long vpfe_param_handler(struct file *file, void *priv,
>>> +           int cmd, void *param)
>>> +{
>>> +   struct vpfe_device *vpfe_dev = video_drvdata(file);
>>> +   int ret = 0;
>>> +
>>> +   v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_param_handler\n");
>>> +
>>> +   if (NULL == param) {
>>> +           v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev,
>>> +                   "Invalid user ptr\n");
>>> +           return -EINVAL;
>>> +   }
>>> +
>>> +   if (vpfe_dev->started) {
>>> +           /* only allowed if streaming is not started */
>>> +           v4l2_err(&vpfe_dev->v4l2_dev, "device already started\n");
>>> +           return -EBUSY;
>>> +   }
>>> +
>>> +   switch (cmd) {
>>> +   case VPFE_CMD_S_CCDC_RAW_PARAMS:
>>> +           v4l2_warn(&vpfe_dev->v4l2_dev,
>>> +                     "VPFE_CMD_S_CCDC_RAW_PARAMS: experimental ioctl\n");
>>> +           ret = mutex_lock_interruptible(&vpfe_dev->lock);
>>> +           if (ret)
>>> +                   return ret;
>>> +           ret = ccdc_dev->hw_ops.set_params(param);
>>> +           if (ret) {
>>> +                   v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev,
>>> +                           "Error in setting parameters in CCDC\n");
>>> +                   goto unlock_out;
>>> +           }
>>> +
>>> +           if (vpfe_get_ccdc_image_format(vpfe_dev, &vpfe_dev->fmt) < 0) {
>>> +                   v4l2_err(&vpfe_dev->v4l2_dev,
>>> +                           "Invalid image format at CCDC\n");
>>> +                   ret = -EINVAL;
>>> +           }
>>> +unlock_out:
>>> +           mutex_unlock(&vpfe_dev->lock);
>>> +           break;
>>> +   case VPFE_CMD_G_CCDC_RAW_PARAMS:
>>> +           v4l2_warn(&vpfe_dev->v4l2_dev,
>>> +                     "VPFE_CMD_G_CCDC_RAW_PARAMS: experimental ioctl\n");
>>> +           if (!ccdc_dev->hw_ops.get_params) {
>>> +                   ret = -EINVAL;
>>> +                   break;
>>> +           }
>>> +           ret = ccdc_dev->hw_ops.get_params(param);
>>> +           if (ret) {
>>> +                   v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev,
>>> +                           "Error in getting parameters from CCDC\n");
>>> +           }
>>> +           break;
>>> +   default:
>>> +           ret = -EINVAL;
>>> +           break;
>>> +   }
>>> +   return ret;
>>> +}
>>> +
>>> +static long vpfe_ioctl(struct file *file, unsigned int cmd, unsigned
>>long arg)
>>> +{
>>> +   if (cmd == VPFE_CMD_S_CCDC_RAW_PARAMS ||
>>> +       cmd == VPFE_CMD_G_CCDC_RAW_PARAMS)
>>> +           return vpfe_param_handler(file, file->private_data, cmd,
>>> +                                    (void *)arg);
>>> +   return video_ioctl2(file, cmd, arg);
>>> +}
>>> +
>>>  /* vpfe capture driver file operations */
>>>  static const struct v4l2_file_operations vpfe_fops = {
>>>     .owner = THIS_MODULE,
>>>     .open = vpfe_open,
>>>     .release = vpfe_release,
>>> -   .unlocked_ioctl = video_ioctl2,
>>> +   .unlocked_ioctl = vpfe_ioctl,
>>>     .mmap = vpfe_mmap,
>>>     .poll = vpfe_poll
>>>  };
>>> @@ -1681,50 +1752,6 @@ unlock_out:
>>>     return ret;
>>>  }
>>>
>>> -
>>> -static long vpfe_param_handler(struct file *file, void *priv,
>>> -           int cmd, void *param)
>>> -{
>>> -   struct vpfe_device *vpfe_dev = video_drvdata(file);
>>> -   int ret = 0;
>>> -
>>> -   v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_param_handler\n");
>>> -
>>> -   if (vpfe_dev->started) {
>>> -           /* only allowed if streaming is not started */
>>> -           v4l2_err(&vpfe_dev->v4l2_dev, "device already started\n");
>>> -           return -EBUSY;
>>> -   }
>>> -
>>> -   ret = mutex_lock_interruptible(&vpfe_dev->lock);
>>> -   if (ret)
>>> -           return ret;
>>> -
>>> -   switch (cmd) {
>>> -   case VPFE_CMD_S_CCDC_RAW_PARAMS:
>>> -           v4l2_warn(&vpfe_dev->v4l2_dev,
>>> -                     "VPFE_CMD_S_CCDC_RAW_PARAMS: experimental ioctl\n");
>>> -           ret = ccdc_dev->hw_ops.set_params(param);
>>> -           if (ret) {
>>> -                   v4l2_err(&vpfe_dev->v4l2_dev,
>>> -                           "Error in setting parameters in CCDC\n");
>>> -                   goto unlock_out;
>>> -           }
>>> -           if (vpfe_get_ccdc_image_format(vpfe_dev, &vpfe_dev->fmt) < 0) {
>>> -                   v4l2_err(&vpfe_dev->v4l2_dev,
>>> -                           "Invalid image format at CCDC\n");
>>> -                   goto unlock_out;
>>> -           }
>>> -           break;
>>> -   default:
>>> -           ret = -EINVAL;
>>> -   }
>>> -unlock_out:
>>> -   mutex_unlock(&vpfe_dev->lock);
>>> -   return ret;
>>> -}
>>> -
>>> -
>>>  /* vpfe capture ioctl operations */
>>>  static const struct v4l2_ioctl_ops vpfe_ioctl_ops = {
>>>     .vidioc_querycap         = vpfe_querycap,
>>> @@ -1750,7 +1777,6 @@ static const struct v4l2_ioctl_ops vpfe_ioctl_ops
>=
>>{
>>>     .vidioc_cropcap          = vpfe_cropcap,
>>>     .vidioc_g_crop           = vpfe_g_crop,
>>>     .vidioc_s_crop           = vpfe_s_crop,
>>> -   .vidioc_default          = vpfe_param_handler,
>>>  };
>>>
>>>  static struct vpfe_device *vpfe_initialize(void)
>>> @@ -1921,8 +1947,8 @@ static __init int vpfe_probe(struct
>platform_device
>>*pdev)
>>>     platform_set_drvdata(pdev, vpfe_dev);
>>>     /* set driver private data */
>>>     video_set_drvdata(vpfe_dev->video_dev, vpfe_dev);
>>> -   i2c_adap = i2c_get_adapter(vpfe_cfg->i2c_adapter_id);
>>>     vpfe_cfg = pdev->dev.platform_data;
>>> +   i2c_adap = i2c_get_adapter(vpfe_cfg->i2c_adapter_id);
>>>     num_subdevs = vpfe_cfg->num_subdevs;
>>>     vpfe_dev->sd = kmalloc(sizeof(struct v4l2_subdev *) * num_subdevs,
>>>                             GFP_KERNEL);
>>> diff --git a/include/media/davinci/vpfe_capture.h
>>b/include/media/davinci/vpfe_capture.h
>>> index d863e5e..23043bd 100644
>>> --- a/include/media/davinci/vpfe_capture.h
>>> +++ b/include/media/davinci/vpfe_capture.h
>>> @@ -31,8 +31,6 @@
>>>  #include <media/videobuf-dma-contig.h>
>>>  #include <media/davinci/vpfe_types.h>
>>>
>>> -#define VPFE_CAPTURE_NUM_DECODERS        5
>>> -
>>>  /* Macros */
>>>  #define VPFE_MAJOR_RELEASE              0
>>>  #define VPFE_MINOR_RELEASE              0
>>> @@ -91,8 +89,9 @@ struct vpfe_config {
>>>     char *card_name;
>>>     /* ccdc name */
>>>     char *ccdc;
>>> -   /* vpfe clock */
>>> +   /* vpfe clock. Obsolete! Will be removed in next patch */
>>>     struct clk *vpssclk;
>>> +   /* Obsolete! Will be removed in next patch */
>>>     struct clk *slaveclk;
>>>  };
>>>
>>> @@ -193,8 +192,13 @@ struct vpfe_config_params {
>>>   * color space conversion, culling etc. This is an experimental ioctl
>>that
>>>   * will change in future kernels. So use this ioctl with care !
>>>   * TODO: This is to be split into multiple ioctls and also explore the
>>> - * possibility of extending the v4l2 api to include this
>>> + * possibility of extending the v4l2 api to include this.
>>> + * VPFE_CMD_G_CCDC_RAW_PARAMS - EXPERIMENTAL IOCTL to get the current
>>raw
>>> + * capture parameters
>>>   **/
>>>  #define VPFE_CMD_S_CCDC_RAW_PARAMS _IOW('V', BASE_VIDIOC_PRIVATE + 1, \
>>>                                     void *)
>>> +#define VPFE_CMD_G_CCDC_RAW_PARAMS _IOR('V', BASE_VIDIOC_PRIVATE + 2, \
>>> +                                   void *)
>>> +
>>>  #endif                             /* _DAVINCI_VPFE_H */
>>
>>
>>
>>--
>>Hans Verkuil - video4linux developer - sponsored by TANDBERG
--
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