RE: [PATCH - v2 4/6] V4L - vpfe_capture - bug fixes and enhancements

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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

[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux