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-karicheri2@xxxxxx >-----Original Message----- >From: Hans Verkuil [mailto:hverkuil@xxxxxxxxx] >Sent: Wednesday, December 23, 2009 9:24 AM >To: Karicheri, Muralidharan >Cc: linux-media@xxxxxxxxxxxxxxx; khilman@xxxxxxxxxxxxxxxxxxx; Hiremath, >Vaibhav; Nori, Sekhar; davinci-linux-open-source@xxxxxxxxxxxxxxxxxxxx >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-karicheri2@xxxxxx wrote: >> From: Muralidharan Karicheri <m-karicheri2@xxxxxx> >> >> 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 <hverkuil@xxxxxxxxx> >> Signed-off-by: Muralidharan Karicheri <m-karicheri2@xxxxxx> >> --- >> 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 majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html