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,

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-karicheri2@xxxxxx

>-----Original Message-----
>From: Karicheri, Muralidharan
>Sent: Wednesday, December 23, 2009 10:26 AM
>To: 'Hans Verkuil'
>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
>
>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