aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/staging/dt3155v4l/Kconfig8
-rw-r--r--drivers/staging/dt3155v4l/dt3155v4l.c80
-rw-r--r--drivers/staging/dt3155v4l/dt3155v4l.h4
3 files changed, 69 insertions, 23 deletions
diff --git a/drivers/staging/dt3155v4l/Kconfig b/drivers/staging/dt3155v4l/Kconfig
index 5cef5420d288..f49f4ac035b0 100644
--- a/drivers/staging/dt3155v4l/Kconfig
+++ b/drivers/staging/dt3155v4l/Kconfig
@@ -18,11 +18,3 @@ config DT3155_CCIR
18 ---help--- 18 ---help---
19 Select it for CCIR/50Hz (European region), 19 Select it for CCIR/50Hz (European region),
20 or leave it unselected for RS-170/60Hz (North America). 20 or leave it unselected for RS-170/60Hz (North America).
21
22config DT3155_STREAMING
23 bool "Selects mmap streaming instead of read method"
24 depends on VIDEO_DT3155
25 default y
26 ---help---
27 Select it if you wish to try mmap streaming, or
28 or leave it unselected for using read method.
diff --git a/drivers/staging/dt3155v4l/dt3155v4l.c b/drivers/staging/dt3155v4l/dt3155v4l.c
index 49463611f4f3..308fb45965b3 100644
--- a/drivers/staging/dt3155v4l/dt3155v4l.c
+++ b/drivers/staging/dt3155v4l/dt3155v4l.c
@@ -930,6 +930,7 @@ dt3155_release(struct file *filp)
930 dt3155_stop_acq(pd); 930 dt3155_stop_acq(pd);
931 videobuf_stop(pd->vidq); 931 videobuf_stop(pd->vidq);
932 pd->acq_fp = NULL; 932 pd->acq_fp = NULL;
933 pd->streaming = 0;
933 } 934 }
934 if (!pd->users) { 935 if (!pd->users) {
935 kthread_stop(pd->thread); 936 kthread_stop(pd->thread);
@@ -949,11 +950,15 @@ dt3155_read(struct file *filp, char __user *user, size_t size, loff_t *loff)
949 950
950 if (mutex_lock_interruptible(&pd->mux) == -EINTR) 951 if (mutex_lock_interruptible(&pd->mux) == -EINTR)
951 return -ERESTARTSYS; 952 return -ERESTARTSYS;
952 if (!pd->acq_fp) 953 if (!pd->acq_fp) {
953 pd->acq_fp = filp; 954 pd->acq_fp = filp;
954 else if (pd->acq_fp != filp) { 955 pd->streaming = 0;
956 } else if (pd->acq_fp != filp) {
955 ret = -EBUSY; 957 ret = -EBUSY;
956 goto done; 958 goto done;
959 } else if (pd->streaming == 1) {
960 ret = -EINVAL;
961 goto done;
957 } 962 }
958 ret = videobuf_read_stream(pd->vidq, user, size, loff, 0, 963 ret = videobuf_read_stream(pd->vidq, user, size, loff, 0,
959 filp->f_flags & O_NONBLOCK); 964 filp->f_flags & O_NONBLOCK);
@@ -1001,8 +1006,10 @@ dt3155_ioc_streamon(struct file *filp, void *p, enum v4l2_buf_type type)
1001 if (ret) 1006 if (ret)
1002 goto unlock; 1007 goto unlock;
1003 pd->acq_fp = filp; 1008 pd->acq_fp = filp;
1009 pd->streaming = 1;
1004 wake_up_interruptible_sync(&pd->do_dma); 1010 wake_up_interruptible_sync(&pd->do_dma);
1005 } else if (pd->acq_fp == filp) { 1011 } else if (pd->acq_fp == filp) {
1012 pd->streaming = 1;
1006 ret = videobuf_streamon(pd->vidq); 1013 ret = videobuf_streamon(pd->vidq);
1007 if (!ret) 1014 if (!ret)
1008 wake_up_interruptible_sync(&pd->do_dma); 1015 wake_up_interruptible_sync(&pd->do_dma);
@@ -1043,11 +1050,8 @@ dt3155_ioc_querycap(struct file *filp, void *p, struct v4l2_capability *cap)
1043 cap->version = 1050 cap->version =
1044 KERNEL_VERSION(DT3155_VER_MAJ, DT3155_VER_MIN, DT3155_VER_EXT); 1051 KERNEL_VERSION(DT3155_VER_MAJ, DT3155_VER_MIN, DT3155_VER_EXT);
1045 cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | 1052 cap->capabilities = V4L2_CAP_VIDEO_CAPTURE |
1046#ifdef CONFIG_DT3155_STREAMING 1053 V4L2_CAP_STREAMING |
1047 V4L2_CAP_STREAMING;
1048#else
1049 V4L2_CAP_READWRITE; 1054 V4L2_CAP_READWRITE;
1050#endif
1051 return 0; 1055 return 0;
1052} 1056}
1053 1057
@@ -1095,7 +1099,28 @@ dt3155_ioc_try_fmt_vid_cap(struct file *filp, void *p, struct v4l2_format *f)
1095static int 1099static int
1096dt3155_ioc_s_fmt_vid_cap(struct file *filp, void *p, struct v4l2_format *f) 1100dt3155_ioc_s_fmt_vid_cap(struct file *filp, void *p, struct v4l2_format *f)
1097{ 1101{
1098 return dt3155_ioc_g_fmt_vid_cap(filp, p, f); 1102 struct dt3155_priv *pd = video_drvdata(filp);
1103 int ret = -ERESTARTSYS;
1104
1105 if (mutex_lock_interruptible(&pd->mux) == -EINTR)
1106 return ret;
1107 if (!pd->acq_fp) {
1108 pd->acq_fp = filp;
1109 pd->streaming = 0;
1110 } else if (pd->acq_fp != filp) {
1111 ret = -EBUSY;
1112 goto done;
1113 }
1114/* FIXME: we don't change the format for now
1115 if (pd->vidq->streaming || pd->vidq->reading || pd->curr_buff) {
1116 ret = -EBUSY;
1117 goto done;
1118 }
1119*/
1120 ret = dt3155_ioc_g_fmt_vid_cap(filp, p, f);
1121done:
1122 mutex_unlock(&pd->mux);
1123 return ret;
1099} 1124}
1100 1125
1101static int 1126static int
@@ -1103,15 +1128,33 @@ dt3155_ioc_reqbufs(struct file *filp, void *p, struct v4l2_requestbuffers *b)
1103{ 1128{
1104 struct dt3155_priv *pd = video_drvdata(filp); 1129 struct dt3155_priv *pd = video_drvdata(filp);
1105 struct videobuf_queue *q = pd->vidq; 1130 struct videobuf_queue *q = pd->vidq;
1131 int ret = -ERESTARTSYS;
1106 1132
1107 if (b->memory != V4L2_MEMORY_MMAP) 1133 if (b->memory != V4L2_MEMORY_MMAP)
1108 return -EINVAL; 1134 return -EINVAL;
1135 if (mutex_lock_interruptible(&pd->mux) == -EINTR)
1136 return ret;
1137 if (!pd->acq_fp)
1138 pd->acq_fp = filp;
1139 else if (pd->acq_fp != filp) {
1140 ret = -EBUSY;
1141 goto done;
1142 }
1143 pd->streaming = 1;
1144 ret = 0;
1145done:
1146 mutex_unlock(&pd->mux);
1147 if (ret)
1148 return ret;
1109 if (b->count) 1149 if (b->count)
1110 return videobuf_reqbufs(q, b); 1150 ret = videobuf_reqbufs(q, b);
1111 else { /* FIXME: is it necessary? */ 1151 else { /* FIXME: is it necessary? */
1112 printk(KERN_DEBUG "dt3155: request to free buffers\n"); 1152 printk(KERN_DEBUG "dt3155: request to free buffers\n");
1113 return videobuf_mmap_free(q); 1153 /* ret = videobuf_mmap_free(q); */
1154 ret = dt3155_ioc_streamoff(filp, p,
1155 V4L2_BUF_TYPE_VIDEO_CAPTURE);
1114 } 1156 }
1157 return ret;
1115} 1158}
1116 1159
1117static int 1160static int
@@ -1128,8 +1171,12 @@ dt3155_ioc_qbuf(struct file *filp, void *p, struct v4l2_buffer *b)
1128{ 1171{
1129 struct dt3155_priv *pd = video_drvdata(filp); 1172 struct dt3155_priv *pd = video_drvdata(filp);
1130 struct videobuf_queue *q = pd->vidq; 1173 struct videobuf_queue *q = pd->vidq;
1174 int ret;
1131 1175
1132 return videobuf_qbuf(q, b); 1176 ret = videobuf_qbuf(q, b);
1177 if (ret)
1178 return ret;
1179 return videobuf_querybuf(q, b);
1133} 1180}
1134 1181
1135static int 1182static int
@@ -1170,7 +1217,12 @@ dt3155_ioc_enum_input(struct file *filp, void *p, struct v4l2_input *input)
1170 return -EINVAL; 1217 return -EINVAL;
1171 strcpy(input->name, "Coax in"); 1218 strcpy(input->name, "Coax in");
1172 input->type = V4L2_INPUT_TYPE_CAMERA; 1219 input->type = V4L2_INPUT_TYPE_CAMERA;
1173 input->std = V4L2_STD_ALL; 1220 /*
1221 * FIXME: input->std = 0 according to v4l2 API
1222 * VIDIOC_G_STD, VIDIOC_S_STD, VIDIOC_QUERYSTD and VIDIOC_ENUMSTD
1223 * should return -EINVAL
1224 */
1225 input->std = DT3155_CURRENT_NORM;
1174 input->status = 0;/* FIXME: add sync detection & V4L2_IN_ST_NO_H_LOCK */ 1226 input->status = 0;/* FIXME: add sync detection & V4L2_IN_ST_NO_H_LOCK */
1175 return 0; 1227 return 0;
1176} 1228}
@@ -1200,7 +1252,7 @@ dt3155_ioc_g_parm(struct file *filp, void *p, struct v4l2_streamparm *parms)
1200 parms->parm.capture.timeperframe.numerator = 1001; 1252 parms->parm.capture.timeperframe.numerator = 1001;
1201 parms->parm.capture.timeperframe.denominator = frames_per_sec * 1000; 1253 parms->parm.capture.timeperframe.denominator = frames_per_sec * 1000;
1202 parms->parm.capture.extendedmode = 0; 1254 parms->parm.capture.extendedmode = 0;
1203 parms->parm.capture.readbuffers = 1; 1255 parms->parm.capture.readbuffers = 1; /* FIXME: 2 buffers? */
1204 return 0; 1256 return 0;
1205} 1257}
1206 1258
@@ -1214,7 +1266,7 @@ dt3155_ioc_s_parm(struct file *filp, void *p, struct v4l2_streamparm *parms)
1214 parms->parm.capture.timeperframe.numerator = 1001; 1266 parms->parm.capture.timeperframe.numerator = 1001;
1215 parms->parm.capture.timeperframe.denominator = frames_per_sec * 1000; 1267 parms->parm.capture.timeperframe.denominator = frames_per_sec * 1000;
1216 parms->parm.capture.extendedmode = 0; 1268 parms->parm.capture.extendedmode = 0;
1217 parms->parm.capture.readbuffers = 1; 1269 parms->parm.capture.readbuffers = 1; /* FIXME: 2 buffers? */
1218 return 0; 1270 return 0;
1219} 1271}
1220 1272
@@ -1377,7 +1429,7 @@ static struct video_device dt3155_vdev = {
1377 .ioctl_ops = &dt3155_ioctl_ops, 1429 .ioctl_ops = &dt3155_ioctl_ops,
1378 .minor = -1, 1430 .minor = -1,
1379 .release = video_device_release, 1431 .release = video_device_release,
1380 .tvnorms = V4L2_STD_ALL, 1432 .tvnorms = DT3155_CURRENT_NORM,
1381 .current_norm = DT3155_CURRENT_NORM, 1433 .current_norm = DT3155_CURRENT_NORM,
1382}; 1434};
1383 1435
diff --git a/drivers/staging/dt3155v4l/dt3155v4l.h b/drivers/staging/dt3155v4l/dt3155v4l.h
index 4c6a0ee08c0e..e65a81e198b9 100644
--- a/drivers/staging/dt3155v4l/dt3155v4l.h
+++ b/drivers/staging/dt3155v4l/dt3155v4l.h
@@ -30,7 +30,7 @@
30#define DT3155_NAME "dt3155" 30#define DT3155_NAME "dt3155"
31#define DT3155_VER_MAJ 1 31#define DT3155_VER_MAJ 1
32#define DT3155_VER_MIN 0 32#define DT3155_VER_MIN 0
33#define DT3155_VER_EXT 2 33#define DT3155_VER_EXT 3
34#define DT3155_VERSION __stringify(DT3155_VER_MAJ) "." \ 34#define DT3155_VERSION __stringify(DT3155_VER_MAJ) "." \
35 __stringify(DT3155_VER_MIN) "." \ 35 __stringify(DT3155_VER_MIN) "." \
36 __stringify(DT3155_VER_EXT) 36 __stringify(DT3155_VER_EXT)
@@ -180,6 +180,7 @@ struct dt3155_stats {
180 * 180 *
181 * @vdev: pointer to video_device structure 181 * @vdev: pointer to video_device structure
182 * @acq_fp pointer to filp that starts acquisition 182 * @acq_fp pointer to filp that starts acquisition
183 * @streaming streaming is negotiated
183 * @pdev: pointer to pci_dev structure 184 * @pdev: pointer to pci_dev structure
184 * @vidq pointer to videobuf_queue structure 185 * @vidq pointer to videobuf_queue structure
185 * @curr_buf: pointer to curren buffer 186 * @curr_buf: pointer to curren buffer
@@ -200,6 +201,7 @@ struct dt3155_stats {
200struct dt3155_priv { 201struct dt3155_priv {
201 struct video_device *vdev; 202 struct video_device *vdev;
202 struct file *acq_fp; 203 struct file *acq_fp;
204 int streaming;
203 struct pci_dev *pdev; 205 struct pci_dev *pdev;
204 struct videobuf_queue *vidq; 206 struct videobuf_queue *vidq;
205 struct videobuf_buffer *curr_buf; 207 struct videobuf_buffer *curr_buf;